diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml
index 41c912048..15c2a2813 100644
--- a/.github/workflows/cypress.yml
+++ b/.github/workflows/cypress.yml
@@ -20,7 +20,7 @@ jobs:
strategy:
max-parallel: 3
matrix:
- package: [mesh-io, image-io, transform-io, downsample]
+ package: [mesh-io, transform-io]
steps:
- name: Checkout
diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml
index 051b1e73a..373bde360 100644
--- a/.github/workflows/playwright.yml
+++ b/.github/workflows/playwright.yml
@@ -147,7 +147,7 @@ jobs:
strategy:
max-parallel: 3
matrix:
- package: [compare-images, compare-meshes, compress-stringify, dicom]
+ package: [compare-images, compare-meshes, compress-stringify, dicom, downsample, image-io]
steps:
- name: Checkout
diff --git a/package.json b/package.json
index 0aec1cf3f..677798730 100644
--- a/package.json
+++ b/package.json
@@ -45,7 +45,7 @@
"esbuild": "^0.25.1",
"start-server-and-test": "^2.0.12",
"ava": "^6.1.3",
- "cypress": "^14.5.0",
+ "cypress": "^14.5.1",
"shx": "^0.4.0",
"typescript": "^5.8.3",
"vite": "^6.2.3"
diff --git a/packages/downsample/typescript/.gitignore b/packages/downsample/typescript/.gitignore
new file mode 100644
index 000000000..5c4ffa21f
--- /dev/null
+++ b/packages/downsample/typescript/.gitignore
@@ -0,0 +1,2 @@
+playwright-report/
+test-results/
diff --git a/packages/downsample/typescript/cypress.config.ts b/packages/downsample/typescript/cypress.config.ts
deleted file mode 100644
index 0262a38ed..000000000
--- a/packages/downsample/typescript/cypress.config.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { defineConfig } from "cypress";
-
-export default defineConfig({
- e2e: {
- defaultCommandTimeout: 8000,
- setupNodeEvents(on, config) {
- // implement node event listeners here
- },
- includeShadowDom: true, // to query into itk-image-detail
- },
-});
diff --git a/packages/downsample/typescript/cypress/e2e/common.ts b/packages/downsample/typescript/cypress/e2e/common.ts
deleted file mode 100644
index 905f2db37..000000000
--- a/packages/downsample/typescript/cypress/e2e/common.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const demoServer = 'http://localhost:5179'
\ No newline at end of file
diff --git a/packages/downsample/typescript/cypress/e2e/downsample-bin-shrink.cy.ts b/packages/downsample/typescript/cypress/e2e/downsample-bin-shrink.cy.ts
deleted file mode 100644
index d044c0b03..000000000
--- a/packages/downsample/typescript/cypress/e2e/downsample-bin-shrink.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('downsampleBinShrink', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'cthead1.png'
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Downsamples an image', function () {
- cy.get('sl-tab[panel="downsampleBinShrink-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.png']), fileName: 'cthead1.png' }
- cy.get('#downsampleBinShrinkInputs input[name="input-file"]').selectFile([testFile,], { force: true })
- cy.get('#downsampleBinShrink-input-details').contains('imageType')
- cy.get('#downsampleBinShrinkInputs sl-input[name="shrink-factors"]').find('input', { includeShadowDom: true }).clear().type('[2, 2]', { force: true })
-
- cy.get('#downsampleBinShrinkInputs sl-button[name="run"]').click()
-
- cy.get('#downsampleBinShrink-downsampled-details').contains('imageType')
- })
-})
diff --git a/packages/downsample/typescript/cypress/e2e/downsample.cy.ts b/packages/downsample/typescript/cypress/e2e/downsample.cy.ts
deleted file mode 100644
index c0ae66b74..000000000
--- a/packages/downsample/typescript/cypress/e2e/downsample.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('downsample', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'cthead1.png'
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Downsamples an image', function () {
- cy.get('sl-tab[panel="downsample-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.png']), fileName: 'cthead1.png' }
- cy.get('#downsampleInputs input[name="input-file"]').selectFile([testFile,], { force: true })
- cy.get('#downsample-input-details').contains('imageType')
- cy.get('#downsampleInputs sl-input[name="shrink-factors"]').find('input', { includeShadowDom: true }).clear().type('[2, 2]', { force: true })
-
- cy.get('#downsampleInputs sl-button[name="run"]').click()
-
- cy.get('#downsample-downsampled-details').contains('imageType')
- })
-})
diff --git a/packages/downsample/typescript/cypress/fixtures/example.json b/packages/downsample/typescript/cypress/fixtures/example.json
deleted file mode 100644
index 02e425437..000000000
--- a/packages/downsample/typescript/cypress/fixtures/example.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "name": "Using fixtures to represent data",
- "email": "hello@cypress.io",
- "body": "Fixtures are a great way to mock data for responses to routes"
-}
diff --git a/packages/downsample/typescript/cypress/support/commands.ts b/packages/downsample/typescript/cypress/support/commands.ts
deleted file mode 100644
index 698b01a42..000000000
--- a/packages/downsample/typescript/cypress/support/commands.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-///
-// ***********************************************
-// This example commands.ts shows you how to
-// create various custom commands and overwrite
-// existing commands.
-//
-// For more comprehensive examples of custom
-// commands please read more here:
-// https://on.cypress.io/custom-commands
-// ***********************************************
-//
-//
-// -- This is a parent command --
-// Cypress.Commands.add('login', (email, password) => { ... })
-//
-//
-// -- This is a child command --
-// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
-//
-//
-// -- This is a dual command --
-// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
-//
-//
-// -- This will overwrite an existing command --
-// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
-//
-// declare global {
-// namespace Cypress {
-// interface Chainable {
-// login(email: string, password: string): Chainable
-// drag(subject: string, options?: Partial): Chainable
-// dismiss(subject: string, options?: Partial): Chainable
-// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
-// }
-// }
-// }
\ No newline at end of file
diff --git a/packages/downsample/typescript/cypress/support/e2e.ts b/packages/downsample/typescript/cypress/support/e2e.ts
deleted file mode 100644
index ca171c17d..000000000
--- a/packages/downsample/typescript/cypress/support/e2e.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-// ***********************************************************
-// This example support/e2e.ts is processed and
-// loaded automatically before your test files.
-//
-// This is a great place to put global configuration and
-// behavior that modifies Cypress.
-//
-// You can change the location of this file or turn off
-// automatically serving support files with the
-// 'supportFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/configuration
-// ***********************************************************
-
-// Import commands.js using ES2015 syntax:
-import './commands'
-
-// Alternatively you can use CommonJS syntax:
-// require('./commands')
-
-Cypress.on('uncaught:exception', (err, runnable) => {
- // we expect a 3rd party library error with message 'list not defined'
- // and don't want to fail the test so we return false
- if (err.message.includes('ResizeObserver loop completed with undelivered notifications')) {
- return false
- }
- // we still want to ensure there are no other unexpected
- // errors, so we let them fail the test
-})
-
diff --git a/packages/downsample/typescript/cypress/tsconfig.json b/packages/downsample/typescript/cypress/tsconfig.json
deleted file mode 100644
index 212405809..000000000
--- a/packages/downsample/typescript/cypress/tsconfig.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "extends": "../tsconfig.json",
- "include": [
- "**/*.ts"
- ],
- "compilerOptions": {
- "noEmit": false,
- "sourceMap": false,
- "inlineSourceMap": true,
- "types": ["cypress"]
- },
-}
diff --git a/packages/downsample/typescript/package.json b/packages/downsample/typescript/package.json
index b099e8c1f..e618bc0b6 100644
--- a/packages/downsample/typescript/package.json
+++ b/packages/downsample/typescript/package.json
@@ -17,13 +17,8 @@
"start": "pnpm copyDemoAppAssets && vite",
"test": "pnpm test:node && pnpm test:browser",
"test:node": "ava",
- "test:browser": "pnpm test:browser:chrome && pnpm test:browser:firefox",
- "test:browser:firefox": "start-server-and-test start http-get://localhost:5179 cypress:runFirefox",
- "test:browser:chrome": "start-server-and-test start http-get://localhost:5179 cypress:runChrome",
- "test:browser:debug": "start-server-and-test start http-get://localhost:5179 cypress:open",
- "cypress:open": "pnpm exec cypress open",
- "cypress:runChrome": "pnpm exec cypress run --browser chrome",
- "cypress:runFirefox": "pnpm exec cypress run --browser firefox",
+ "test:browser": "playwright test",
+ "test:browser:debug": "playwright test --debug",
"build": "pnpm build:tsc && pnpm build:browser:workerEmbedded && pnpm build:browser:workerEmbeddedMin && pnpm build:demo",
"build:browser:workerEmbedded": "esbuild --loader:.worker.js=dataurl --bundle --format=esm --outfile=./dist/bundle/index-worker-embedded.js ./src/index-worker-embedded.ts",
"build:browser:workerEmbeddedMin": "esbuild --minify --loader:.worker.js=dataurl --bundle --format=esm --outfile=./dist/bundle/index-worker-embedded.min.js ./src/index-worker-embedded.min.ts",
@@ -49,12 +44,11 @@
"@itk-wasm/image-io": "workspace:^",
"@itk-wasm/mesh-io": "workspace:^",
"@itk-wasm/demo-app": "workspace:*",
+ "@playwright/test": "^1.48.2",
"@types/node": "^20.2.5",
"ava": "^6.1.0",
- "cypress": "^13.6.3",
"esbuild": "^0.25.0",
"shx": "^0.3.4",
- "start-server-and-test": "^2.0.3",
"typescript": "^5.3.2",
"vite": "^6.2.7",
"vite-plugin-static-copy": "^0.17.0"
diff --git a/packages/downsample/typescript/playwright.config.ts b/packages/downsample/typescript/playwright.config.ts
new file mode 100644
index 000000000..f33a8ff40
--- /dev/null
+++ b/packages/downsample/typescript/playwright.config.ts
@@ -0,0 +1,41 @@
+import { defineConfig, devices } from "@playwright/test";
+
+/**
+ * See https://playwright.dev/docs/test-configuration.
+ */
+export default defineConfig({
+ testDir: "./test/browser",
+ /* Run tests in files in parallel */
+ fullyParallel: true,
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
+ forbidOnly: !!process.env.CI,
+ /* Retry on CI only */
+ retries: process.env.CI ? 2 : 0,
+ /* Opt out of parallel tests on CI. */
+ workers: process.env.CI ? 1 : undefined,
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+ reporter: "html",
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+ use: {
+ /* Base URL to use in actions like `await page.goto('/')`. */
+ baseURL: "http://localhost:5179",
+
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+ trace: "on-first-retry",
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ {
+ name: "chromium",
+ use: { ...devices["Desktop Chrome"] },
+ },
+ ],
+
+ /* Run your local dev server before starting the tests */
+ webServer: {
+ command: "pnpm start",
+ url: "http://localhost:5179",
+ reuseExistingServer: !process.env.CI,
+ },
+});
diff --git a/packages/downsample/typescript/test/browser/downsample-bin-shrink.spec.ts b/packages/downsample/typescript/test/browser/downsample-bin-shrink.spec.ts
new file mode 100644
index 000000000..48de9fd17
--- /dev/null
+++ b/packages/downsample/typescript/test/browser/downsample-bin-shrink.spec.ts
@@ -0,0 +1,41 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test("downsampleBinShrink", async ({ page }) => {
+ await page.goto("/");
+
+ const testFile = readFileSync("../test/data/input/cthead1.png");
+
+ // Navigate to downsampleBinShrink tab
+ await page.click('sl-tab[panel="downsampleBinShrink-panel"]');
+
+ // Upload file
+ await page.setInputFiles(
+ '#downsampleBinShrinkInputs input[name="input-file"]',
+ {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: testFile,
+ }
+ );
+
+ // Wait for input details to appear
+ await expect(
+ page.locator("#downsampleBinShrink-input-details")
+ ).toContainText("imageType");
+
+ // Set shrink factors
+ const shrinkFactorsInput = page.locator(
+ '#downsampleBinShrinkInputs sl-input[name="shrink-factors"] input'
+ );
+ await shrinkFactorsInput.clear();
+ await shrinkFactorsInput.fill("[2, 2]");
+
+ // Run the pipeline
+ await page.click('#downsampleBinShrinkInputs sl-button[name="run"]');
+
+ // Wait for results
+ await expect(
+ page.locator("#downsampleBinShrink-downsampled-details")
+ ).toContainText("imageType");
+});
diff --git a/packages/downsample/typescript/test/browser/downsample.spec.ts b/packages/downsample/typescript/test/browser/downsample.spec.ts
new file mode 100644
index 000000000..d51c0d08d
--- /dev/null
+++ b/packages/downsample/typescript/test/browser/downsample.spec.ts
@@ -0,0 +1,38 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test("downsample", async ({ page }) => {
+ await page.goto("/");
+
+ const testFile = readFileSync("../test/data/input/cthead1.png");
+
+ // Navigate to downsample tab
+ await page.click('sl-tab[panel="downsample-panel"]');
+
+ // Upload file
+ await page.setInputFiles('#downsampleInputs input[name="input-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: testFile,
+ });
+
+ // Wait for input details to appear
+ await expect(page.locator("#downsample-input-details")).toContainText(
+ "imageType"
+ );
+
+ // Set shrink factors
+ const shrinkFactorsInput = page.locator(
+ '#downsampleInputs sl-input[name="shrink-factors"] input'
+ );
+ await shrinkFactorsInput.clear();
+ await shrinkFactorsInput.fill("[2, 2]");
+
+ // Run the pipeline
+ await page.click('#downsampleInputs sl-button[name="run"]');
+
+ // Wait for results
+ await expect(page.locator("#downsample-downsampled-details")).toContainText(
+ "imageType"
+ );
+});
diff --git a/packages/downsample/typescript/test/browser/global.d.ts b/packages/downsample/typescript/test/browser/global.d.ts
new file mode 100644
index 000000000..dd2f8d814
--- /dev/null
+++ b/packages/downsample/typescript/test/browser/global.d.ts
@@ -0,0 +1,8 @@
+export {};
+
+declare global {
+ interface Window {
+ downsampleDownsampledFile: any;
+ downsampleBinShrinkDownsampledFile: any;
+ }
+}
diff --git a/packages/image-io/typescript/.gitignore b/packages/image-io/typescript/.gitignore
index 12a93d96f..e9b829293 100644
--- a/packages/image-io/typescript/.gitignore
+++ b/packages/image-io/typescript/.gitignore
@@ -1,3 +1,5 @@
test/browser/demo-app/public
/demo-app/
vite.config.js
+playwright-report/
+test-results/
diff --git a/packages/image-io/typescript/cypress.config.ts b/packages/image-io/typescript/cypress.config.ts
deleted file mode 100644
index 0ed2da7ff..000000000
--- a/packages/image-io/typescript/cypress.config.ts
+++ /dev/null
@@ -1,10 +0,0 @@
-import { defineConfig } from "cypress";
-
-export default defineConfig({
- e2e: {
- defaultCommandTimeout: 40000,
- setupNodeEvents(on, config) {
- },
- includeShadowDom: true, // to query into itk-image-details
- },
-});
diff --git a/packages/image-io/typescript/cypress/e2e/bio-rad.cy.ts b/packages/image-io/typescript/cypress/e2e/bio-rad.cy.ts
deleted file mode 100644
index a507a36db..000000000
--- a/packages/image-io/typescript/cypress/e2e/bio-rad.cy.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('bio-rad', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'biorad.pic',
- 'biorad.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a BioRad image', function () {
- cy.get('sl-tab[panel="bioRadReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['biorad.pic']), fileName: 'biorad.pic' }
- cy.get('#bioRadReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#bioRadReadImage-serialized-image-details').should('contain', '0,3')
-
- cy.get('#bioRadReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#bioRadReadImage-could-read-details').should('contain', 'true')
- cy.get('#bioRadReadImage-image-details').contains('imageType')
- })
-
- it('Writes a BioRad image', function () {
- cy.get('sl-tab[panel="bioRadWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['biorad.iwi.cbor']), fileName: 'biorad.iwi.cbor' }
- cy.get('#bioRadWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#bioRadWriteImage-image-details').contains('imageType')
- cy.get('#bioRadWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('biorad.pic', { force: true })
-
- cy.get('#bioRadWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#bioRadWriteImage-could-write-details').should('contain', 'true')
- cy.get('#bioRadWriteImage-serialized-image-details').should('contain', '0,3')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/bmp.cy.ts b/packages/image-io/typescript/cypress/e2e/bmp.cy.ts
deleted file mode 100644
index ccd8e6f7c..000000000
--- a/packages/image-io/typescript/cypress/e2e/bmp.cy.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('bmp', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'image_color.bmp',
- 'image_color.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a BMP image', function () {
- cy.get('sl-tab[panel="bmpReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['image_color.bmp']), fileName: 'image_color.bmp' }
- cy.get('#bmpReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#bmpReadImage-serialized-image-details').should('contain', '0,3')
-
- cy.get('#bmpReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#bmpReadImage-could-read-details').should('contain', 'true')
- cy.get('#bmpReadImage-image-details').contains('imageType')
- })
-
- it('Writes a BioRad image', function () {
- cy.get('sl-tab[panel="bmpWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['image_color.iwi.cbor']), fileName: 'image_color.iwi.cbor' }
- cy.get('#bmpWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#bmpWriteImage-image-details').contains('imageType')
- cy.get('#bmpWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('image_color.bmp', { force: true })
-
- cy.get('#bmpWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#bmpWriteImage-could-write-details').should('contain', 'true')
- cy.get('#bmpWriteImage-serialized-image-details').should('contain', '0,3')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/common.ts b/packages/image-io/typescript/cypress/e2e/common.ts
deleted file mode 100644
index 76c8849d9..000000000
--- a/packages/image-io/typescript/cypress/e2e/common.ts
+++ /dev/null
@@ -1 +0,0 @@
-export const demoServer = 'http://localhost:5004'
diff --git a/packages/image-io/typescript/cypress/e2e/fdf.cy.ts b/packages/image-io/typescript/cypress/e2e/fdf.cy.ts
deleted file mode 100644
index 8186803a6..000000000
--- a/packages/image-io/typescript/cypress/e2e/fdf.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('fdf', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'test.fdf',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a FDF image', function () {
- cy.get('sl-tab[panel="fdfReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['test.fdf']), fileName: 'test.fdf' }
- cy.get('#fdfReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#fdfReadImage-serialized-image-details').should('contain', '35,33')
-
- cy.get('#fdfReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#fdfReadImage-could-read-details').should('contain', 'true')
- cy.get('#fdfReadImage-image-details').contains('imageType')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/hdf5.cy.ts b/packages/image-io/typescript/cypress/e2e/hdf5.cy.ts
deleted file mode 100644
index b12aab149..000000000
--- a/packages/image-io/typescript/cypress/e2e/hdf5.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('hdf5', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'ITKImage.hdf5',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a HDF5 image', function () {
- cy.get('sl-tab[panel="hdf5ReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['ITKImage.hdf5']), fileName: 'ITKImage.hdf5' }
- cy.get('#hdf5ReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#hdf5ReadImage-serialized-image-details').should('contain', '137,72')
-
- cy.get('#hdf5ReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#hdf5ReadImage-could-read-details').should('contain', 'true')
- cy.get('#hdf5ReadImage-image-details').contains('imageType')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/jpeg.cy.ts b/packages/image-io/typescript/cypress/e2e/jpeg.cy.ts
deleted file mode 100644
index af785c5a9..000000000
--- a/packages/image-io/typescript/cypress/e2e/jpeg.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('jpeg', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'apple.jpg',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a JPEG image', function () {
- cy.get('sl-tab[panel="jpegReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['apple.jpg']), fileName: 'apple.jpg' }
- cy.get('#jpegReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#jpegReadImage-serialized-image-details').should('contain', '255,216')
-
- cy.get('#jpegReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#jpegReadImage-could-read-details').should('contain', 'true')
- cy.get('#jpegReadImage-image-details').contains('imageType')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/lsm.cy.ts b/packages/image-io/typescript/cypress/e2e/lsm.cy.ts
deleted file mode 100644
index 00be65c4d..000000000
--- a/packages/image-io/typescript/cypress/e2e/lsm.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('lsm', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'cthead1.lsm',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a lsm image', function () {
- cy.get('sl-tab[panel="lsmReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.lsm']), fileName: 'cthead1.lsm' }
- cy.get('#lsmReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#lsmReadImage-serialized-image-details').should('contain', '73,73')
-
- cy.get('#lsmReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#lsmReadImage-could-read-details').should('contain', 'true')
- cy.get('#lsmReadImage-image-details').contains('imageType')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/meta-image.cy.ts b/packages/image-io/typescript/cypress/e2e/meta-image.cy.ts
deleted file mode 100644
index 86ebe065c..000000000
--- a/packages/image-io/typescript/cypress/e2e/meta-image.cy.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('meta-image', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'brainweb165a10f17.mha',
- 'brainweb165a10f17.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a MetaImage image', function () {
- cy.get('sl-tab[panel="metaReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['brainweb165a10f17.mha']), fileName: 'brainweb165a10f17.mha' }
- cy.get('#metaReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#metaReadImage-serialized-image-details').should('contain', '79,98')
-
- cy.get('#metaReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#metaReadImage-could-read-details').should('contain', 'true')
- cy.get('#metaReadImage-image-details').contains('imageType')
- })
-
- it('Writes a MetaImage image', function () {
- cy.get('sl-tab[panel="metaWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['brainweb165a10f17.iwi.cbor']), fileName: 'brainweb165a10f17.iwi.cbor' }
- cy.get('#metaWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#metaWriteImage-image-details').contains('imageType')
- cy.get('#metaWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('brainweb165a10f17.mha', { force: true })
-
- cy.get('#metaWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#metaWriteImage-could-write-details').should('contain', 'true')
- cy.get('#metaWriteImage-serialized-image-details').should('contain', '79,98')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/mgh.cy.ts b/packages/image-io/typescript/cypress/e2e/mgh.cy.ts
deleted file mode 100644
index 2f80537ff..000000000
--- a/packages/image-io/typescript/cypress/e2e/mgh.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('mgh', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'T1.mgz',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a MGH image', function () {
- cy.get('sl-tab[panel="mghReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['T1.mgz']), fileName: 'image_color.mgh' }
- cy.get('#mghReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#mghReadImage-serialized-image-details').should('contain', '31,139')
-
- cy.get('#mghReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#mghReadImage-could-read-details').should('contain', 'true')
- cy.get('#mghReadImage-image-details').contains('imageType')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/minc.cy.ts b/packages/image-io/typescript/cypress/e2e/minc.cy.ts
deleted file mode 100644
index 5ee53f795..000000000
--- a/packages/image-io/typescript/cypress/e2e/minc.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('minc', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 't1_z+_short_cor.mnc',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a MINC image', function () {
- cy.get('sl-tab[panel="mincReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['t1_z+_short_cor.mnc']), fileName: 't1_z+_short_cor.mnc' }
- cy.get('#mincReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#mincReadImage-serialized-image-details').should('contain', '137,72')
-
- cy.get('#mincReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#mincReadImage-could-read-details').should('contain', 'true')
- cy.get('#mincReadImage-image-details').contains('imageType')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/mrc.cy.ts b/packages/image-io/typescript/cypress/e2e/mrc.cy.ts
deleted file mode 100644
index 00859b6d6..000000000
--- a/packages/image-io/typescript/cypress/e2e/mrc.cy.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('mrc', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'tilt_series_little.mrc',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a MRC image', function () {
- cy.get('sl-tab[panel="mrcReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['tilt_series_little.mrc']), fileName: 'tilt_series_little.mrc' }
- cy.get('#mrcReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#mrcReadImage-serialized-image-details').should('contain', '34,0')
-
- cy.get('#mrcReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#mrcReadImage-could-read-details').should('contain', 'true')
- cy.get('#mrcReadImage-image-details').contains('imageType')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/nifti.cy.ts b/packages/image-io/typescript/cypress/e2e/nifti.cy.ts
deleted file mode 100644
index 46927af06..000000000
--- a/packages/image-io/typescript/cypress/e2e/nifti.cy.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('nifti', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'r16slice.nii.gz',
- 'r16slice.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a Nifti image', function () {
- cy.get('sl-tab[panel="niftiReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['r16slice.nii.gz']), fileName: 'r16slice.nii.gz' }
- cy.get('#niftiReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#niftiReadImage-serialized-image-details').should('contain', '31,139')
-
- cy.get('#niftiReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#niftiReadImage-could-read-details').should('contain', 'true')
- cy.get('#niftiReadImage-image-details').contains('imageType')
- })
-
- it('Writes a Nifti image', function () {
- cy.get('sl-tab[panel="niftiWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['r16slice.iwi.cbor']), fileName: 'image_color.iwi.cbor' }
- cy.get('#niftiWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#niftiWriteImage-image-details').contains('imageType')
- cy.get('#niftiWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('r16slice.nii.gz', { force: true })
-
- cy.get('#niftiWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#niftiWriteImage-could-write-details').should('contain', 'true')
- cy.get('#niftiWriteImage-serialized-image-details').should('contain', '31,139')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/nrrd.cy.ts b/packages/image-io/typescript/cypress/e2e/nrrd.cy.ts
deleted file mode 100644
index 811cd1355..000000000
--- a/packages/image-io/typescript/cypress/e2e/nrrd.cy.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('nrrd', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'vol-raw-little.nrrd',
- 'vol-raw-little.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a nrrd image', function () {
- cy.get('sl-tab[panel="nrrdReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['vol-raw-little.nrrd']), fileName: 'vol-raw-little.nrrd' }
- cy.get('#nrrdReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#nrrdReadImage-serialized-image-details').should('contain', '78,82')
-
- cy.get('#nrrdReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#nrrdReadImage-could-read-details').should('contain', 'true')
- cy.get('#nrrdReadImage-image-details').contains('imageType')
- })
-
- it('Writes a BioRad image', function () {
- cy.get('sl-tab[panel="nrrdWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['vol-raw-little.iwi.cbor']), fileName: 'vol-raw-little.iwi.cbor' }
- cy.get('#nrrdWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#nrrdWriteImage-image-details').contains('imageType')
- cy.get('#nrrdWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('vol-raw-little.nrrd', { force: true })
-
- cy.get('#nrrdWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#nrrdWriteImage-could-write-details').should('contain', 'true')
- cy.get('#nrrdWriteImage-serialized-image-details').should('contain', '78,82')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/png.cy.ts b/packages/image-io/typescript/cypress/e2e/png.cy.ts
deleted file mode 100644
index 2cb0fa5a6..000000000
--- a/packages/image-io/typescript/cypress/e2e/png.cy.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('png', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'cthead1.png',
- 'cthead1.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a PNG image', function () {
- cy.get('sl-tab[panel="pngReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.png']), fileName: 'cthead1.png' }
- cy.get('#pngReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#pngReadImage-serialized-image-details').should('contain', '137,80')
-
- cy.get('#pngReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#pngReadImage-could-read-details').should('contain', 'true')
- cy.get('#pngReadImage-image-details').contains('imageType')
- })
-
- it('Writes a PNG image', function () {
- cy.get('sl-tab[panel="pngWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.iwi.cbor']), fileName: 'cthead1.iwi.cbor' }
- cy.get('#pngWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#pngWriteImage-image-details').contains('imageType')
- cy.get('#pngWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('cthead1.png', { force: true })
-
- cy.get('#pngWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#pngWriteImage-could-write-details').should('contain', 'true')
- cy.get('#pngWriteImage-serialized-image-details').should('contain', '137,80')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/read-image-file-series.cy.ts b/packages/image-io/typescript/cypress/e2e/read-image-file-series.cy.ts
deleted file mode 100644
index ca15b6387..000000000
--- a/packages/image-io/typescript/cypress/e2e/read-image-file-series.cy.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-import { demoServer } from './common.ts'
-
-function verifyImage (image) {
- cy.expect(image.imageType.dimension).to.equal(3)
- cy.expect(image.imageType.componentType).to.equal('uint16')
- cy.expect(image.imageType.pixelType).to.equal('Scalar')
- cy.expect(image.imageType.components).to.equal(1)
- cy.expect(image.origin[0]).to.equal(0.0)
- cy.expect(image.origin[1]).to.equal(0.0)
- cy.expect(image.origin[2]).to.equal(2.0)
- cy.expect(image.spacing[0]).to.equal(0.85935)
- cy.expect(image.spacing[1]).to.equal(0.85935)
- cy.expect(image.spacing[2]).to.equal(3.0)
- cy.expect(image.size[0]).to.equal(256)
- cy.expect(image.size[1]).to.equal(256)
- cy.expect(image.size[2]).to.equal(3)
- cy.expect(image.data.length).to.equal(3 * 65536)
- cy.expect(image.data[1000]).to.equal(0)
-}
-
-const zSpacing = 3.0
-const zOrigin = 2.0
-const testImageFiles = [
- 'mri3D_01.png',
- 'mri3D_02.png',
- 'mri3D_03.png',
-]
-
-describe('meta-image', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/PNGSeries/'
-
- cy.window().then((win) => {
- win.testImageFiles = {}
- })
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- cy.window().then((win) => {
- win.testImageFiles[fileName] = this[fileName]
- })
- })
- })
-
- it('Reads a sorted PNG file series', function () {
- cy.window().then(async (win) => {
- const files = testImageFiles.map((fileName) => {
- return { data: new Uint8Array(win.testImageFiles[fileName]), path: fileName }
- })
- const sortedSeries = true
-
- const { image, webWorkerPool } = await win.imageIo.readImageFileSeries(files, { zSpacing, zOrigin, sortedSeries })
- webWorkerPool.terminateWorkers()
- verifyImage(image)
- })
- })
-
- it('Reads sorted PNG file series, specify componentType, pixelType', function () {
- cy.window().then(async (win) => {
- const files = testImageFiles.map((fileName) => {
- return { data: new Uint8Array(win.testImageFiles[fileName]), path: fileName }
- })
- const sortedSeries = true
- const componentType = win.itk.IntTypes.Int32
- const pixelType = win.itk.PixelTypes.Vector
-
- const { image, webWorkerPool } = await win.imageIo.readImageFileSeries(files, { zSpacing, zOrigin, sortedSeries, componentType, pixelType })
- webWorkerPool.terminateWorkers()
- cy.expect(image.imageType.componentType).to.equal('int32')
- cy.expect(image.imageType.pixelType).to.equal('Vector')
- })
- })
-
- it('Reads an unsorted PNG file series', function () {
- cy.window().then(async (win) => {
- const files = testImageFiles.map((fileName) => {
- return { data: new Uint8Array(win.testImageFiles[fileName]), path: fileName }
- })
- files.reverse()
-
- const { image, webWorkerPool } = await win.imageIo.readImageFileSeries(files, { zSpacing, zOrigin })
- webWorkerPool.terminateWorkers()
- verifyImage(image)
- })
- })
-
- it('Reads an unsorted PNG file series, specifying componentType, pixelType', function () {
- cy.window().then(async (win) => {
- const files = testImageFiles.map((fileName) => {
- return { data: new Uint8Array(win.testImageFiles[fileName]), path: fileName }
- })
- files.reverse()
- const componentType = win.itk.IntTypes.Int32
- const pixelType = win.itk.PixelTypes.Vector
-
- const { image, webWorkerPool } = await win.imageIo.readImageFileSeries(files, { zSpacing, zOrigin, componentType, pixelType })
- webWorkerPool.terminateWorkers()
- cy.expect(image.imageType.componentType).to.equal('int32')
- cy.expect(image.imageType.pixelType).to.equal('Vector')
- })
- })
-})
\ No newline at end of file
diff --git a/packages/image-io/typescript/cypress/e2e/read-image.cy.ts b/packages/image-io/typescript/cypress/e2e/read-image.cy.ts
deleted file mode 100644
index c3060f1fb..000000000
--- a/packages/image-io/typescript/cypress/e2e/read-image.cy.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-import { demoServer } from './common.ts'
-
-import { IntTypes, PixelTypes } from 'itk-wasm'
-
-const cthead1SmallBase64DataURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAAAAABWESUoAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfhBQYVKw8AZTNIAAADdklEQVQ4y2WTa2wUVRiGp6W7O3POnLmc2VrstokJlrBIUBJigjfSICVCCAo/QKM/FFNRIESJQKAws3M7M2f20t3GthRKQQq0kkoXMIq9oFwCXkg0UpMakGLgR9EmJF4TNOvZhRBb31+TvM955/vO+T6Ou69pAgSwKCCAEPc/lYUhFEUkMgH2ESmbYocEEUmKLIQqBKmEgUlERQhAPhyJiDMXPFZZDmRGoP8Q5TwC4ciMpatfXE9zmT2NVRVIQiLi76cDUVRDT/m72zLUc/Srv+gNCi8jhCrupvMAQIWf1zJx58pRj7g7h/sduunhiIIkUAJ4AUBZ0LZev3TondmeS42TuaYms6kOapJUalYQAAKxt+j4qD3yxvMZ0z47NLi/ydhWA7GMinWyAH6G1Wwe/OdUz6dz33T35dPdIxdIYrPGK0qxTnYrobVtjm+3pNvPxGu9/dTRgw8/e89et0AKF1uFItS2u7ZP7fr4K3H19VbP94me/T6fXRifM6+a/QKC6N5+PWGYZhVeNn9pzvUoTVnt3/QEz81dUTONgwjis4UzvS2Z5JbY9JlPdxmEuFZzX9va0yu5WlXmRAlWd3Tmjg980vXBprJZbYPtza0dXw40ZleeP1ZbrWKOXXpsu7Grb3gnsY/27B46+e3ElVuF3w+sm7Pki2VAUxkAo1t0a7TL8YnVPZxy6KG9fX/+2qu/+9DARoAVBiDYaHjnfc/3nHOdicA1Em6WpnOdG/I6zwCA5PCzrn6uw6VO99gBnRBKGUyIMfz3BgmrHHta8cEdu04dN6wjPwy6FinaTNT8emKNzGrgBEmJLLf7T6Tf/60wpFP2oKToB/bNr+pVTWHjghQxZuTzW51C4aIZENdj8gMv+1f3I7iYwPEqrFu+z1/zzI3vHN/ziEd9P0haV39aXxXFRaBMRrCu9Vjj5o/S5C4QBCnjws+pJ9SoqpZmRlqyeNWlPa922El22PMCl5if38q9FGV+CeAaFuK4OZY5nLRoksnsPX19nL5do2GsREoAlCtr68lo4VoXNROWdXD8j7GUNV96AMPye5MtYgU/ujF/887tHy+PXLt9o9/asUipvDfWpc1QNFWKPfla8PHI5Ysnsua2l2dH1Un7WS6rKlamxx9f/MKKhkX1syoxmLqcUMVRDTNMlZGkilPsUrOsJ6wxRSel/wuAkzbenLRf4gAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0wNS0wNlQxNzoyNjozNC0wNDowMORO/MMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDUtMDZUMTc6MjY6MzQtMDQ6MDCVE0R/AAAAAElFTkSuQmCC'
-const byteString = window.atob(cthead1SmallBase64DataURI.split(',')[1])
-const mimeString = cthead1SmallBase64DataURI.split(',')[0].split(':')[1].split(';')[0]
-const intArray = new Uint8Array(byteString.length)
-for (let ii = 0; ii < byteString.length; ++ii) {
- intArray[ii] = byteString.charCodeAt(ii)
-}
-const cthead1SmallBlob = new window.Blob([intArray], { type: mimeString })
-
-function verifyImage (image, componentType, pixelType) {
- cy.expect(image.imageType.dimension).to.equal(2)
- cy.expect(image.imageType.componentType).to.equal(componentType)
- cy.expect(image.imageType.pixelType).to.equal(pixelType)
- cy.expect(image.imageType.components).to.equal(1)
- cy.expect(image.origin[0]).to.equal(0.0)
- cy.expect(image.origin[1]).to.equal(0.0)
- cy.expect(image.spacing[0]).to.equal(1.0)
- cy.expect(image.spacing[1]).to.equal(1.0)
- cy.expect(image.size[0]).to.equal(32)
- cy.expect(image.size[1]).to.equal(32)
- cy.expect(image.data.length).to.equal(1024)
- cy.expect(image.data[512]).to.equal(12)
-}
-
-describe('read-image', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'cthead1.png'
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads an image File in the demo', function () {
- cy.get('sl-tab[panel="readImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.png']), fileName: 'cthead1.png' }
- cy.get('#readImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#readImage-serialized-image-details').should('contain', '137,80')
-
- cy.get('#readImageInputs sl-button[name="run"]').click()
-
- cy.get('#readImage-image-details').contains('imageType')
- })
-
- it('Reads an image BinaryFile', function () {
- cy.window().then(async (win) => {
- const arrayBuffer = await cthead1SmallBlob.arrayBuffer()
- const { image, webWorker } = await win.imageIo.readImage({ data: new Uint8Array(arrayBuffer), path: 'cthead1Small.png' })
- webWorker.terminate()
- const componentType = IntTypes.UInt8
- const pixelType = PixelTypes.Scalar
- verifyImage(image, componentType, pixelType)
- })
- })
-
- it('Reads an image cast to the specified pixelType and componentType', function () {
- cy.window().then(async (win) => {
- const arrayBuffer = await cthead1SmallBlob.arrayBuffer()
- const componentType = IntTypes.UInt16
- const pixelType = PixelTypes.Vector
- const { image, webWorker } = await win.imageIo.readImage({ data: new Uint8Array(arrayBuffer), path: 'cthead1Small.png' }, { pixelType, componentType})
- webWorker.terminate()
- verifyImage(image, componentType, pixelType)
- })
- })
-
- it('Reads an image File', function () {
- cy.window().then(async (win) => {
- const cthead1SmallFile = new win.File([cthead1SmallBlob], 'cthead1Small.png')
- const { image, webWorker } = await win.imageIo.readImage(cthead1SmallFile)
- webWorker.terminate()
- const componentType = IntTypes.UInt8
- const pixelType = PixelTypes.Scalar
- verifyImage(image, componentType, pixelType)
- })
- })
-
- it('Reads re-uses a WebWorker', function () {
- cy.window().then(async (win) => {
- const cthead1SmallFile = new win.File([cthead1SmallBlob], 'cthead1Small.png')
- const { webWorker } = await win.imageIo.readImage(cthead1SmallFile)
- const { image } = await win.imageIo.readImage(cthead1SmallFile, { webWorker })
- webWorker.terminate()
- const componentType = IntTypes.UInt8
- const pixelType = PixelTypes.Scalar
- verifyImage(image, componentType, pixelType)
- })
- })
-
- it('Throws a catchable error for an invalid file', { defaultCommandTimeout: 120000 }, function () {
- cy.window().then(async (win) => {
- const invalidArray = new Uint8Array([21, 4, 4, 4, 4, 9, 5, 0, 82, 42])
- const invalidBlob = new win.Blob([invalidArray])
- const invalidFile = new win.File([invalidBlob], 'invalid.file')
- try {
- const { webWorker, image } = await win.imageIo.readImage(invalidFile)
- webWorker.terminate()
- } catch (error) {
- cy.expect(error.message).to.equal('Could not find IO for: invalid.file')
- }
- })
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/tiff.cy.ts b/packages/image-io/typescript/cypress/e2e/tiff.cy.ts
deleted file mode 100644
index cbf352188..000000000
--- a/packages/image-io/typescript/cypress/e2e/tiff.cy.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('tiff', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'ShortTestImage.tiff',
- 'ShortTestImage.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a TIFF image', function () {
- cy.get('sl-tab[panel="tiffReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['ShortTestImage.tiff']), fileName: 'ShortTestImage.tiff' }
- cy.get('#tiffReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#tiffReadImage-serialized-image-details').should('contain', '73,73')
-
- cy.get('#tiffReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#tiffReadImage-could-read-details').should('contain', 'true')
- cy.get('#tiffReadImage-image-details').contains('imageType')
- })
-
- it('Writes a TIFF image', function () {
- cy.get('sl-tab[panel="tiffWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['ShortTestImage.iwi.cbor']), fileName: 'ShortTestImage.iwi.cbor' }
- cy.get('#tiffWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#tiffWriteImage-image-details').contains('imageType')
- cy.get('#tiffWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('ShortTestImage.tiff', { force: true })
-
- cy.get('#tiffWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#tiffWriteImage-could-write-details').should('contain', 'true')
- cy.get('#tiffWriteImage-serialized-image-details').should('contain', '73,73')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/vtk.cy.ts b/packages/image-io/typescript/cypress/e2e/vtk.cy.ts
deleted file mode 100644
index 84bd59702..000000000
--- a/packages/image-io/typescript/cypress/e2e/vtk.cy.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('vtk', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'ironProt.vtk',
- 'ironProt.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads a VTK image', function () {
- cy.get('sl-tab[panel="vtkReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['ironProt.vtk']), fileName: 'ironProt.vtk' }
- cy.get('#vtkReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#vtkReadImage-serialized-image-details').should('contain', '35,32')
-
- cy.get('#vtkReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#vtkReadImage-could-read-details').should('contain', 'true')
- cy.get('#vtkReadImage-image-details').contains('imageType')
- })
-
- it('Writes a VTK image', function () {
- cy.get('sl-tab[panel="vtkWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['ironProt.iwi.cbor']), fileName: 'image_color.iwi.cbor' }
- cy.get('#vtkWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#vtkWriteImage-image-details').contains('imageType')
- cy.get('#vtkWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('ironProt.vtk', { force: true })
-
- cy.get('#vtkWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#vtkWriteImage-could-write-details').should('contain', 'true')
- cy.get('#vtkWriteImage-serialized-image-details').should('contain', '35,32')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/wasm.cy.ts b/packages/image-io/typescript/cypress/e2e/wasm.cy.ts
deleted file mode 100644
index b1da75efa..000000000
--- a/packages/image-io/typescript/cypress/e2e/wasm.cy.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import { demoServer } from './common.ts'
-
-describe('wasm', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'cthead1.iwi.cbor',
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Reads an ITK Wasm image', function () {
- cy.get('sl-tab[panel="wasmReadImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.iwi.cbor']), fileName: 'cthead1.iwi.cbor' }
- cy.get('#wasmReadImageInputs input[name="serialized-image-file"]').selectFile([testFile,], { force: true })
- cy.get('#wasmReadImage-serialized-image-details').should('contain', '167,105')
-
- cy.get('#wasmReadImageInputs sl-button[name="run"]').click()
-
- cy.get('#wasmReadImage-could-read-details').should('contain', 'true')
- cy.get('#wasmReadImage-image-details').contains('imageType')
- })
-
- it('Writes an ITK Wasm image', function () {
- cy.get('sl-tab[panel="wasmWriteImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.iwi.cbor']), fileName: 'cthead1.iwi.cbor' }
- cy.get('#wasmWriteImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#wasmWriteImage-image-details').contains('imageType')
- cy.get('#wasmWriteImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('cthead1-new.iwi.cbor', { force: true })
-
- cy.get('#wasmWriteImageInputs sl-button[name="run"]').click()
-
- cy.get('#wasmWriteImage-could-write-details').should('contain', 'true')
- cy.get('#wasmWriteImage-serialized-image-details').should('contain', '167,105')
- })
-})
diff --git a/packages/image-io/typescript/cypress/e2e/write-image.cy.ts b/packages/image-io/typescript/cypress/e2e/write-image.cy.ts
deleted file mode 100644
index 690e6f474..000000000
--- a/packages/image-io/typescript/cypress/e2e/write-image.cy.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { demoServer } from './common.ts'
-
-import { IntTypes, PixelTypes } from 'itk-wasm'
-
-const cthead1SmallBase64DataURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAAAAABWESUoAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfhBQYVKw8AZTNIAAADdklEQVQ4y2WTa2wUVRiGp6W7O3POnLmc2VrstokJlrBIUBJigjfSICVCCAo/QKM/FFNRIESJQKAws3M7M2f20t3GthRKQQq0kkoXMIq9oFwCXkg0UpMakGLgR9EmJF4TNOvZhRBb31+TvM955/vO+T6Ou69pAgSwKCCAEPc/lYUhFEUkMgH2ESmbYocEEUmKLIQqBKmEgUlERQhAPhyJiDMXPFZZDmRGoP8Q5TwC4ciMpatfXE9zmT2NVRVIQiLi76cDUVRDT/m72zLUc/Srv+gNCi8jhCrupvMAQIWf1zJx58pRj7g7h/sduunhiIIkUAJ4AUBZ0LZev3TondmeS42TuaYms6kOapJUalYQAAKxt+j4qD3yxvMZ0z47NLi/ydhWA7GMinWyAH6G1Wwe/OdUz6dz33T35dPdIxdIYrPGK0qxTnYrobVtjm+3pNvPxGu9/dTRgw8/e89et0AKF1uFItS2u7ZP7fr4K3H19VbP94me/T6fXRifM6+a/QKC6N5+PWGYZhVeNn9pzvUoTVnt3/QEz81dUTONgwjis4UzvS2Z5JbY9JlPdxmEuFZzX9va0yu5WlXmRAlWd3Tmjg980vXBprJZbYPtza0dXw40ZleeP1ZbrWKOXXpsu7Grb3gnsY/27B46+e3ElVuF3w+sm7Pki2VAUxkAo1t0a7TL8YnVPZxy6KG9fX/+2qu/+9DARoAVBiDYaHjnfc/3nHOdicA1Em6WpnOdG/I6zwCA5PCzrn6uw6VO99gBnRBKGUyIMfz3BgmrHHta8cEdu04dN6wjPwy6FinaTNT8emKNzGrgBEmJLLf7T6Tf/60wpFP2oKToB/bNr+pVTWHjghQxZuTzW51C4aIZENdj8gMv+1f3I7iYwPEqrFu+z1/zzI3vHN/ziEd9P0haV39aXxXFRaBMRrCu9Vjj5o/S5C4QBCnjws+pJ9SoqpZmRlqyeNWlPa922El22PMCl5if38q9FGV+CeAaFuK4OZY5nLRoksnsPX19nL5do2GsREoAlCtr68lo4VoXNROWdXD8j7GUNV96AMPye5MtYgU/ujF/887tHy+PXLt9o9/asUipvDfWpc1QNFWKPfla8PHI5Ysnsua2l2dH1Un7WS6rKlamxx9f/MKKhkX1syoxmLqcUMVRDTNMlZGkilPsUrOsJ6wxRSel/wuAkzbenLRf4gAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0wNS0wNlQxNzoyNjozNC0wNDowMORO/MMAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDUtMDZUMTc6MjY6MzQtMDQ6MDCVE0R/AAAAAElFTkSuQmCC'
-const byteString = window.atob(cthead1SmallBase64DataURI.split(',')[1])
-const mimeString = cthead1SmallBase64DataURI.split(',')[0].split(':')[1].split(';')[0]
-const intArray = new Uint8Array(byteString.length)
-for (let ii = 0; ii < byteString.length; ++ii) {
- intArray[ii] = byteString.charCodeAt(ii)
-}
-const cthead1SmallBlob = new window.Blob([intArray], { type: mimeString })
-
-function verifyImage (image, componentType, pixelType) {
- cy.expect(image.imageType.dimension).to.equal(2)
- cy.expect(image.imageType.componentType).to.equal(componentType)
- cy.expect(image.imageType.pixelType).to.equal(pixelType)
- cy.expect(image.imageType.components).to.equal(1)
- cy.expect(image.origin[0]).to.equal(0.0)
- cy.expect(image.origin[1]).to.equal(0.0)
- cy.expect(image.spacing[0]).to.equal(1.0)
- cy.expect(image.spacing[1]).to.equal(1.0)
- cy.expect(image.size[0]).to.equal(32)
- cy.expect(image.size[1]).to.equal(32)
- cy.expect(image.data.length).to.equal(1024)
- cy.expect(image.data[512]).to.equal(12)
-}
-
-describe('write-image', () => {
- beforeEach(function() {
- cy.visit(demoServer)
-
- const testPathPrefix = '../test/data/input/'
-
- const testImageFiles = [
- 'cthead1.iwi.cbor'
- ]
- testImageFiles.forEach((fileName) => {
- cy.readFile(`${testPathPrefix}${fileName}`, null).as(fileName)
- })
- })
-
- it('Writes an image in the demo', function () {
- cy.get('sl-tab[panel="writeImage-panel"]').click()
-
- const testFile = { contents: new Uint8Array(this['cthead1.iwi.cbor']), fileName: 'cthead1.iwi.cbor' }
- cy.get('#writeImageInputs input[name="image-file"]').selectFile([testFile,], { force: true })
- cy.get('#writeImage-image-details').contains('imageType')
- cy.get('#writeImageInputs sl-input[name="serialized-image"]').find('input', { includeShadowDom: true }).type('cthead1.png', { force: true })
-
- cy.get('#writeImageInputs sl-button[name="run"]').click()
-
- cy.get('#writeImage-serialized-image-details').should('contain', '0,3')
- })
-
- it('Writes an image to an ArrayBuffer', function () {
- cy.window().then(async (win) => {
- const arrayBuffer = await cthead1SmallBlob.arrayBuffer()
- const { image, webWorker } = await win.imageIo.readImage({ data: new Uint8Array(arrayBuffer), path: 'cthead1Small.png' })
- const { serializedImage } = await win.imageIo.writeImage(image, 'cthead1.mha', { webWorker })
- const { image: imageBack } = await win.imageIo.readImage(serializedImage, { webWorker })
- webWorker.terminate()
- const componentType = IntTypes.UInt8
- const pixelType = PixelTypes.Scalar
- verifyImage(imageBack, componentType, pixelType)
- })
- })
-
- it('Writes an image to an ArrayBuffer, given componentType, pixelType', function () {
- cy.window().then(async (win) => {
- const componentType = IntTypes.UInt16
- const pixelType = PixelTypes.Vector
- const arrayBuffer = await cthead1SmallBlob.arrayBuffer()
- const { image, webWorker } = await win.imageIo.readImage({ data: new Uint8Array(arrayBuffer), path: 'cthead1Small.png' })
- const { serializedImage } = await win.imageIo.writeImage(image, 'cthead1.mha', { pixelType, componentType, webWorker })
- // Reading back, the pixelType is always Scalar (reader behavior). Is this a bug?
- const { image: imageBack } = await win.imageIo.readImage(serializedImage, { pixelType, webWorker })
- webWorker.terminate()
- verifyImage(imageBack, componentType, pixelType)
- })
- })
-
- it('Writes an image to an ArrayBuffer, uses compression', function () {
- cy.window().then(async (win) => {
- const arrayBuffer = await cthead1SmallBlob.arrayBuffer()
- const { image, webWorker } = await win.imageIo.readImage({ data: new Uint8Array(arrayBuffer), path: 'cthead1Small.png' })
- const options = { useCompression: false, webWorker }
- const { serializedImage } = await win.imageIo.writeImage(image, 'cthead1.mha', options)
- const { image: imageBack } = await win.imageIo.readImage(serializedImage, { webWorker })
- webWorker.terminate()
- const componentType = IntTypes.UInt8
- const pixelType = PixelTypes.Scalar
- verifyImage(imageBack, componentType, pixelType)
- })
- })
-})
diff --git a/packages/image-io/typescript/cypress/support/commands.ts b/packages/image-io/typescript/cypress/support/commands.ts
deleted file mode 100644
index 698b01a42..000000000
--- a/packages/image-io/typescript/cypress/support/commands.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-///
-// ***********************************************
-// This example commands.ts shows you how to
-// create various custom commands and overwrite
-// existing commands.
-//
-// For more comprehensive examples of custom
-// commands please read more here:
-// https://on.cypress.io/custom-commands
-// ***********************************************
-//
-//
-// -- This is a parent command --
-// Cypress.Commands.add('login', (email, password) => { ... })
-//
-//
-// -- This is a child command --
-// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
-//
-//
-// -- This is a dual command --
-// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
-//
-//
-// -- This will overwrite an existing command --
-// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
-//
-// declare global {
-// namespace Cypress {
-// interface Chainable {
-// login(email: string, password: string): Chainable
-// drag(subject: string, options?: Partial): Chainable
-// dismiss(subject: string, options?: Partial): Chainable
-// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable
-// }
-// }
-// }
\ No newline at end of file
diff --git a/packages/image-io/typescript/cypress/support/e2e.ts b/packages/image-io/typescript/cypress/support/e2e.ts
deleted file mode 100644
index ca171c17d..000000000
--- a/packages/image-io/typescript/cypress/support/e2e.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-// ***********************************************************
-// This example support/e2e.ts is processed and
-// loaded automatically before your test files.
-//
-// This is a great place to put global configuration and
-// behavior that modifies Cypress.
-//
-// You can change the location of this file or turn off
-// automatically serving support files with the
-// 'supportFile' configuration option.
-//
-// You can read more here:
-// https://on.cypress.io/configuration
-// ***********************************************************
-
-// Import commands.js using ES2015 syntax:
-import './commands'
-
-// Alternatively you can use CommonJS syntax:
-// require('./commands')
-
-Cypress.on('uncaught:exception', (err, runnable) => {
- // we expect a 3rd party library error with message 'list not defined'
- // and don't want to fail the test so we return false
- if (err.message.includes('ResizeObserver loop completed with undelivered notifications')) {
- return false
- }
- // we still want to ensure there are no other unexpected
- // errors, so we let them fail the test
-})
-
diff --git a/packages/image-io/typescript/cypress/tsconfig.json b/packages/image-io/typescript/cypress/tsconfig.json
deleted file mode 100644
index 212405809..000000000
--- a/packages/image-io/typescript/cypress/tsconfig.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "extends": "../tsconfig.json",
- "include": [
- "**/*.ts"
- ],
- "compilerOptions": {
- "noEmit": false,
- "sourceMap": false,
- "inlineSourceMap": true,
- "types": ["cypress"]
- },
-}
diff --git a/packages/image-io/typescript/package.json b/packages/image-io/typescript/package.json
index 56361051c..e8a56ac28 100644
--- a/packages/image-io/typescript/package.json
+++ b/packages/image-io/typescript/package.json
@@ -17,13 +17,8 @@
"start": "pnpm copyDemoAppAssets && vite -c build/vite.config.js",
"test": "pnpm test:node && pnpm test:browser",
"test:node": "ava",
- "test:browser": "pnpm test:browser:chrome && pnpm test:browser:firefox",
- "test:browser:firefox": "start-server-and-test vite:start http-get://localhost:5004 cypress:runFirefox",
- "test:browser:chrome": "start-server-and-test vite:start http-get://localhost:5004 cypress:runChrome",
- "test:browser:debug": "start-server-and-test rollup:start http-get://localhost:5004 cypress:open",
- "cypress:open": "pnpm exec cypress open",
- "cypress:runChrome": "pnpm exec cypress run --browser chrome",
- "cypress:runFirefox": "pnpm exec cypress run --browser firefox",
+ "test:browser": "playwright test",
+ "test:browser:debug": "playwright test --debug",
"build": "pnpm build:tsc && pnpm build:browser:workerEmbedded && pnpm build:browser:workerEmbeddedMin && pnpm build:demo",
"build:browser:workerEmbedded": "esbuild --loader:.worker.js=dataurl --bundle --format=esm --outfile=./dist/bundle/index-worker-embedded.js ./src/index-worker-embedded.ts",
"build:browser:workerEmbeddedMin": "esbuild --minify --loader:.worker.js=dataurl --bundle --format=esm --outfile=./dist/bundle/index-worker-embedded.min.js ./src/index-worker-embedded.min.ts",
@@ -52,14 +47,13 @@
"devDependencies": {
"@itk-wasm/image-io-build": "workspace:*",
"@itk-wasm/demo-app": "workspace:*",
+ "@playwright/test": "^1.48.2",
"@types/mime-types": "^2.1.4",
"@types/node": "^20.10.4",
"ava": "^5.3.1",
"concurrently": "^8.2.2",
- "cypress": "^13.6.1",
"esbuild": "^0.25.0",
"shx": "^0.3.4",
- "start-server-and-test": "^2.0.3",
"typescript": "^5.3.3",
"vite": "^6.2.7",
"vite-plugin-static-copy": "^1.0.0"
diff --git a/packages/image-io/typescript/playwright.config.ts b/packages/image-io/typescript/playwright.config.ts
new file mode 100644
index 000000000..bc155a019
--- /dev/null
+++ b/packages/image-io/typescript/playwright.config.ts
@@ -0,0 +1,41 @@
+import { defineConfig, devices } from "@playwright/test";
+
+/**
+ * See https://playwright.dev/docs/test-configuration.
+ */
+export default defineConfig({
+ testDir: "./test/browser",
+ /* Run tests in files in parallel */
+ fullyParallel: true,
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
+ forbidOnly: !!process.env.CI,
+ /* Retry on CI only */
+ retries: process.env.CI ? 2 : 0,
+ /* Opt out of parallel tests on CI. */
+ workers: process.env.CI ? 1 : undefined,
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+ reporter: "html",
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+ use: {
+ /* Base URL to use in actions like `await page.goto('/')`. */
+ baseURL: "http://localhost:5004",
+
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+ trace: "on-first-retry",
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ {
+ name: "chromium",
+ use: { ...devices["Desktop Chrome"] },
+ },
+ ],
+
+ /* Run your local dev server before starting the tests */
+ webServer: {
+ command: "pnpm vite:start",
+ url: "http://localhost:5004",
+ reuseExistingServer: !process.env.CI,
+ },
+});
diff --git a/packages/image-io/typescript/test/browser/bio-rad.spec.ts b/packages/image-io/typescript/test/browser/bio-rad.spec.ts
new file mode 100644
index 000000000..37dbaf1cb
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/bio-rad.spec.ts
@@ -0,0 +1,73 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("bio-rad", () => {
+ test("Reads a Bio-Rad image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to bioRadReadImage tab
+ await page.click('sl-tab[panel="bioRadReadImage-panel"]');
+
+ // Upload test Bio-Rad file
+ await page.setInputFiles(
+ '#bioRadReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "biorad.pic",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/biorad.pic"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#bioRadReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#bioRadReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#bioRadReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#bioRadReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a Bio-Rad image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to bioRadWriteImage tab
+ await page.click('sl-tab[panel="bioRadWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles(
+ '#bioRadWriteImageInputs input[name="image-file"]',
+ {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(page.locator("#bioRadWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#bioRadWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.pic"
+ );
+
+ // Run the test
+ await page.click('#bioRadWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#bioRadWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/bmp.spec.ts b/packages/image-io/typescript/test/browser/bmp.spec.ts
new file mode 100644
index 000000000..858be8f2d
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/bmp.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("bmp", () => {
+ test("Reads a BMP image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to bmpReadImage tab
+ await page.click('sl-tab[panel="bmpReadImage-panel"]');
+
+ // Upload test BMP file
+ await page.setInputFiles(
+ '#bmpReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "image_color.bmp",
+ mimeType: "image/bmp",
+ buffer: readFileSync("../test/data/input/image_color.bmp"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#bmpReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#bmpReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#bmpReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#bmpReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a BMP image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to bmpWriteImage tab
+ await page.click('sl-tab[panel="bmpWriteImage-panel"]');
+
+ // Upload a test image file (using a different format to test conversion)
+ await page.setInputFiles('#bmpWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#bmpWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#bmpWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.bmp"
+ );
+
+ // Run the test
+ await page.click('#bmpWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#bmpWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/fdf.spec.ts b/packages/image-io/typescript/test/browser/fdf.spec.ts
new file mode 100644
index 000000000..64c7e872f
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/fdf.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("fdf", () => {
+ test("Reads an FDF image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to fdfReadImage tab
+ await page.click('sl-tab[panel="fdfReadImage-panel"]');
+
+ // Upload test FDF file
+ await page.setInputFiles(
+ '#fdfReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "test.fdf",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/test.fdf"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#fdfReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#fdfReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#fdfReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#fdfReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes an FDF image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to fdfWriteImage tab
+ await page.click('sl-tab[panel="fdfWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#fdfWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#fdfWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#fdfWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.fdf"
+ );
+
+ // Run the test
+ await page.click('#fdfWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#fdfWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/gipl.spec.ts b/packages/image-io/typescript/test/browser/gipl.spec.ts
new file mode 100644
index 000000000..62a7106ee
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/gipl.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("gipl", () => {
+ test("Reads a GIPL image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to giplReadImage tab
+ await page.click('sl-tab[panel="giplReadImage-panel"]');
+
+ // Upload test GIPL file
+ await page.setInputFiles(
+ '#giplReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "ramp.gipl",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/ramp.gipl"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#giplReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#giplReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#giplReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#giplReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a GIPL image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to giplWriteImage tab
+ await page.click('sl-tab[panel="giplWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#giplWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#giplWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#giplWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.gipl"
+ );
+
+ // Run the test
+ await page.click('#giplWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#giplWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/global.d.ts b/packages/image-io/typescript/test/browser/global.d.ts
new file mode 100644
index 000000000..55948e6fb
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/global.d.ts
@@ -0,0 +1,12 @@
+export {};
+
+declare global {
+ interface Window {
+ readImageCouldReadFile: any;
+ readImageImageFile: any;
+ pngReadImageCouldReadFile: any;
+ pngReadImageImageFile: any;
+ writeImageSerializedImageFile: any;
+ // Add other global window properties as needed
+ }
+}
diff --git a/packages/image-io/typescript/test/browser/hdf5.spec.ts b/packages/image-io/typescript/test/browser/hdf5.spec.ts
new file mode 100644
index 000000000..c09588e2c
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/hdf5.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("hdf5", () => {
+ test("Reads an HDF5 image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to hdf5ReadImage tab
+ await page.click('sl-tab[panel="hdf5ReadImage-panel"]');
+
+ // Upload test HDF5 file
+ await page.setInputFiles(
+ '#hdf5ReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "ITKImage.hdf5",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/ITKImage.hdf5"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#hdf5ReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#hdf5ReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#hdf5ReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#hdf5ReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes an HDF5 image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to hdf5WriteImage tab
+ await page.click('sl-tab[panel="hdf5WriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#hdf5WriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#hdf5WriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#hdf5WriteImageInputs sl-input[name="serialized-image"] input',
+ "output.hdf5"
+ );
+
+ // Run the test
+ await page.click('#hdf5WriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#hdf5WriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/jpeg.spec.ts b/packages/image-io/typescript/test/browser/jpeg.spec.ts
new file mode 100644
index 000000000..e29a2e5b3
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/jpeg.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("jpeg", () => {
+ test("Reads a JPEG image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to jpegReadImage tab
+ await page.click('sl-tab[panel="jpegReadImage-panel"]');
+
+ // Upload test JPEG file
+ await page.setInputFiles(
+ '#jpegReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "apple.jpg",
+ mimeType: "image/jpeg",
+ buffer: readFileSync("../test/data/input/apple.jpg"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#jpegReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#jpegReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#jpegReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#jpegReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a JPEG image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to jpegWriteImage tab
+ await page.click('sl-tab[panel="jpegWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#jpegWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#jpegWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#jpegWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.jpg"
+ );
+
+ // Run the test
+ await page.click('#jpegWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#jpegWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/lsm.spec.ts b/packages/image-io/typescript/test/browser/lsm.spec.ts
new file mode 100644
index 000000000..96dc567e2
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/lsm.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("lsm", () => {
+ test("Reads an LSM image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to lsmReadImage tab
+ await page.click('sl-tab[panel="lsmReadImage-panel"]');
+
+ // Upload test LSM file
+ await page.setInputFiles(
+ '#lsmReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "cthead1.lsm",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/cthead1.lsm"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#lsmReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#lsmReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#lsmReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#lsmReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes an LSM image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to lsmWriteImage tab
+ await page.click('sl-tab[panel="lsmWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#lsmWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#lsmWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#lsmWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.lsm"
+ );
+
+ // Run the test
+ await page.click('#lsmWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#lsmWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/meta-image.spec.ts b/packages/image-io/typescript/test/browser/meta-image.spec.ts
new file mode 100644
index 000000000..03a1ab93a
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/meta-image.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("meta-image", () => {
+ test("Reads a Meta image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to metaReadImage tab
+ await page.click('sl-tab[panel="metaReadImage-panel"]');
+
+ // Upload test MHA file
+ await page.setInputFiles(
+ '#metaReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "brainweb165a10f17.mha",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/brainweb165a10f17.mha"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#metaReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#metaReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#metaReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#metaReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a Meta image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to metaWriteImage tab
+ await page.click('sl-tab[panel="metaWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#metaWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#metaWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#metaWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.mha"
+ );
+
+ // Run the test
+ await page.click('#metaWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#metaWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/mgh.spec.ts b/packages/image-io/typescript/test/browser/mgh.spec.ts
new file mode 100644
index 000000000..ae453b5e3
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/mgh.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("mgh", () => {
+ test("Reads an MGH image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to mghReadImage tab
+ await page.click('sl-tab[panel="mghReadImage-panel"]');
+
+ // Upload test MGH file
+ await page.setInputFiles(
+ '#mghReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "T1.mgz",
+ mimeType: "application/gzip",
+ buffer: readFileSync("../test/data/input/T1.mgz"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#mghReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#mghReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#mghReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#mghReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes an MGH image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to mghWriteImage tab
+ await page.click('sl-tab[panel="mghWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#mghWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#mghWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#mghWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.mgz"
+ );
+
+ // Run the test
+ await page.click('#mghWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#mghWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/minc.spec.ts b/packages/image-io/typescript/test/browser/minc.spec.ts
new file mode 100644
index 000000000..93f37cd47
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/minc.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("minc", () => {
+ test("Reads a MINC image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to mincReadImage tab
+ await page.click('sl-tab[panel="mincReadImage-panel"]');
+
+ // Upload test MINC file
+ await page.setInputFiles(
+ '#mincReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "t1_z+_short_cor.mnc",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/t1_z+_short_cor.mnc"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#mincReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#mincReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#mincReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#mincReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a MINC image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to mincWriteImage tab
+ await page.click('sl-tab[panel="mincWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#mincWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#mincWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#mincWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.mnc"
+ );
+
+ // Run the test
+ await page.click('#mincWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#mincWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/mrc.spec.ts b/packages/image-io/typescript/test/browser/mrc.spec.ts
new file mode 100644
index 000000000..672987dec
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/mrc.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("mrc", () => {
+ test("Reads an MRC image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to mrcReadImage tab
+ await page.click('sl-tab[panel="mrcReadImage-panel"]');
+
+ // Upload test MRC file
+ await page.setInputFiles(
+ '#mrcReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "tilt_series_little.mrc",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/tilt_series_little.mrc"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#mrcReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#mrcReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#mrcReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#mrcReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes an MRC image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to mrcWriteImage tab
+ await page.click('sl-tab[panel="mrcWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#mrcWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#mrcWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#mrcWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.mrc"
+ );
+
+ // Run the test
+ await page.click('#mrcWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#mrcWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/nifti.spec.ts b/packages/image-io/typescript/test/browser/nifti.spec.ts
new file mode 100644
index 000000000..3d891ae5d
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/nifti.spec.ts
@@ -0,0 +1,73 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("nifti", () => {
+ test("Reads a NIfTI image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to niftiReadImage tab
+ await page.click('sl-tab[panel="niftiReadImage-panel"]');
+
+ // Upload test NIfTI file
+ await page.setInputFiles(
+ '#niftiReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "r16slice.nii.gz",
+ mimeType: "application/gzip",
+ buffer: readFileSync("../test/data/input/r16slice.nii.gz"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#niftiReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#niftiReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#niftiReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#niftiReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a NIfTI image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to niftiWriteImage tab
+ await page.click('sl-tab[panel="niftiWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles(
+ '#niftiWriteImageInputs input[name="image-file"]',
+ {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(page.locator("#niftiWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#niftiWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.nii.gz"
+ );
+
+ // Run the test
+ await page.click('#niftiWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#niftiWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/nrrd.spec.ts b/packages/image-io/typescript/test/browser/nrrd.spec.ts
new file mode 100644
index 000000000..624e190fd
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/nrrd.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("nrrd", () => {
+ test("Reads an NRRD image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to nrrdReadImage tab
+ await page.click('sl-tab[panel="nrrdReadImage-panel"]');
+
+ // Upload test NRRD file
+ await page.setInputFiles(
+ '#nrrdReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "vol-raw-little.nrrd",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/vol-raw-little.nrrd"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#nrrdReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#nrrdReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#nrrdReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#nrrdReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes an NRRD image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to nrrdWriteImage tab
+ await page.click('sl-tab[panel="nrrdWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#nrrdWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#nrrdWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#nrrdWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.nrrd"
+ );
+
+ // Run the test
+ await page.click('#nrrdWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#nrrdWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/png.spec.ts b/packages/image-io/typescript/test/browser/png.spec.ts
new file mode 100644
index 000000000..165ab0d62
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/png.spec.ts
@@ -0,0 +1,65 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("png", () => {
+ test("Reads a PNG image", async ({ page }) => {
+ await page.goto("/");
+
+ const testFile = readFileSync("../test/data/input/cthead1.png");
+
+ // Navigate to pngReadImage tab
+ await page.click('sl-tab[panel="pngReadImage-panel"]');
+
+ // Upload file
+ await page.setInputFiles(
+ '#pngReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: testFile,
+ }
+ );
+
+ // Wait for input details to appear
+ await expect(
+ page.locator("#pngReadImage-serialized-image-details")
+ ).toContainText("137,80");
+
+ // Run the pipeline
+ await page.click('#pngReadImageInputs sl-button[name="run"]');
+
+ // Wait for results - simplified to just check for imageType
+ await expect(page.locator("#pngReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ });
+
+ test("Writes a PNG image", async ({ page }) => {
+ await page.goto("/");
+
+ const testFile = readFileSync("../test/data/input/cthead1.iwi.cbor");
+
+ // Navigate to pngWriteImage tab
+ await page.click('sl-tab[panel="pngWriteImage-panel"]');
+
+ // Upload file
+ await page.setInputFiles('#pngWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.iwi.cbor",
+ mimeType: "application/octet-stream",
+ buffer: testFile,
+ });
+
+ // Wait for input details to appear
+ await expect(page.locator("#pngWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Run the pipeline
+ await page.click('#pngWriteImageInputs sl-button[name="run"]');
+
+ // Wait for results - just check that some output appears
+ await expect(
+ page.locator("#pngWriteImage-serialized-image-details")
+ ).toBeVisible();
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/read-image.spec.ts b/packages/image-io/typescript/test/browser/read-image.spec.ts
new file mode 100644
index 000000000..1ea5219c1
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/read-image.spec.ts
@@ -0,0 +1,68 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("read-image", () => {
+ test("Reads an image File in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ const testFile = readFileSync("../test/data/input/cthead1.png");
+
+ // Navigate to readImage tab
+ await page.click('sl-tab[panel="readImage-panel"]');
+
+ // Upload file
+ await page.setInputFiles(
+ '#readImageInputs input[name="serialized-image-file"]',
+ {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: testFile,
+ }
+ );
+
+ // Wait for input details to appear
+ await expect(
+ page.locator("#readImage-serialized-image-details")
+ ).toContainText("137,80");
+
+ // Run the pipeline
+ await page.click('#readImageInputs sl-button[name="run"]');
+
+ // Wait for results - just check that some output appears
+ await expect(page.locator("#readImage-image-details")).toContainText(
+ "imageType"
+ );
+ });
+
+ test("Reads a serialized image", async ({ page }) => {
+ await page.goto("/");
+
+ const testFile = readFileSync("../test/data/input/cthead1.iwi.cbor");
+
+ // Navigate to readImage tab
+ await page.click('sl-tab[panel="readImage-panel"]');
+
+ // Upload file
+ await page.setInputFiles(
+ '#readImageInputs input[name="serialized-image-file"]',
+ {
+ name: "cthead1.iwi.cbor",
+ mimeType: "application/octet-stream",
+ buffer: testFile,
+ }
+ );
+
+ // Wait for input details to appear - be more flexible with content check
+ await expect(
+ page.locator("#readImage-serialized-image-details")
+ ).toBeVisible();
+
+ // Run the pipeline
+ await page.click('#readImageInputs sl-button[name="run"]');
+
+ // Wait for results
+ await expect(page.locator("#readImage-image-details")).toContainText(
+ "imageType"
+ );
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/tiff.spec.ts b/packages/image-io/typescript/test/browser/tiff.spec.ts
new file mode 100644
index 000000000..429ea6567
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/tiff.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("tiff", () => {
+ test("Reads a TIFF image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to tiffReadImage tab
+ await page.click('sl-tab[panel="tiffReadImage-panel"]');
+
+ // Upload test TIFF file
+ await page.setInputFiles(
+ '#tiffReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "ShortTestImage.tiff",
+ mimeType: "image/tiff",
+ buffer: readFileSync("../test/data/input/ShortTestImage.tiff"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#tiffReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#tiffReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#tiffReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#tiffReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a TIFF image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to tiffWriteImage tab
+ await page.click('sl-tab[panel="tiffWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#tiffWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#tiffWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#tiffWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.tiff"
+ );
+
+ // Run the test
+ await page.click('#tiffWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#tiffWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/vtk.spec.ts b/packages/image-io/typescript/test/browser/vtk.spec.ts
new file mode 100644
index 000000000..307e49d4e
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/vtk.spec.ts
@@ -0,0 +1,70 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("vtk", () => {
+ test("Reads a VTK image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to vtkReadImage tab
+ await page.click('sl-tab[panel="vtkReadImage-panel"]');
+
+ // Upload test VTK file
+ await page.setInputFiles(
+ '#vtkReadImageInputs input[name="serialized-image-file"]',
+ {
+ name: "ironProt.vtk",
+ mimeType: "application/octet-stream",
+ buffer: readFileSync("../test/data/input/ironProt.vtk"),
+ }
+ );
+
+ // Verify file was uploaded
+ await expect(
+ page.locator("#vtkReadImage-serialized-image-details")
+ ).toContainText("serializedImage");
+
+ // Run the test
+ await page.click('#vtkReadImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(page.locator("#vtkReadImage-image-details")).toContainText(
+ "imageType"
+ );
+ await expect(
+ page.locator("#vtkReadImage-could-read-details")
+ ).toContainText("couldRead");
+ });
+
+ test("Writes a VTK image in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ // Navigate to vtkWriteImage tab
+ await page.click('sl-tab[panel="vtkWriteImage-panel"]');
+
+ // Upload a test image file
+ await page.setInputFiles('#vtkWriteImageInputs input[name="image-file"]', {
+ name: "cthead1.png",
+ mimeType: "image/png",
+ buffer: readFileSync("../test/data/input/cthead1.png"),
+ });
+
+ // Verify file was uploaded
+ await expect(page.locator("#vtkWriteImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set output filename
+ await page.fill(
+ '#vtkWriteImageInputs sl-input[name="serialized-image"] input',
+ "output.vtk"
+ );
+
+ // Run the test
+ await page.click('#vtkWriteImageInputs sl-button[name="run"]');
+
+ // Wait for and verify output
+ await expect(
+ page.locator("#vtkWriteImage-serialized-image-details")
+ ).toContainText("serializedImage");
+ });
+});
diff --git a/packages/image-io/typescript/test/browser/write-image.spec.ts b/packages/image-io/typescript/test/browser/write-image.spec.ts
new file mode 100644
index 000000000..f5aad807d
--- /dev/null
+++ b/packages/image-io/typescript/test/browser/write-image.spec.ts
@@ -0,0 +1,40 @@
+import { test, expect } from "@playwright/test";
+import { readFileSync } from "fs";
+
+test.describe("write-image", () => {
+ test("Writes an image File in the demo", async ({ page }) => {
+ await page.goto("/");
+
+ const testFile = readFileSync("../test/data/input/cthead1.iwi.cbor");
+
+ // Navigate to writeImage tab
+ await page.click('sl-tab[panel="writeImage-panel"]');
+
+ // Upload file
+ await page.setInputFiles('#writeImageInputs input[name="image-file"]', {
+ name: "cthead1.iwi.cbor",
+ mimeType: "application/octet-stream",
+ buffer: testFile,
+ });
+
+ // Wait for input details to appear
+ await expect(page.locator("#writeImage-image-details")).toContainText(
+ "imageType"
+ );
+
+ // Set filename
+ const filenameInput = page.locator(
+ '#writeImageInputs sl-input[name="serialized-image"] input'
+ );
+ await filenameInput.clear();
+ await filenameInput.fill("written.png");
+
+ // Run the pipeline
+ await page.click('#writeImageInputs sl-button[name="run"]');
+
+ // Wait for results - just check that output appears
+ await expect(
+ page.locator("#writeImage-serialized-image-details")
+ ).toBeVisible();
+ });
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index b59b64572..1d47aacb3 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -10,7 +10,7 @@ overrides:
esbuild: ^0.25.1
start-server-and-test: ^2.0.12
ava: ^6.1.3
- cypress: ^14.5.0
+ cypress: ^14.5.1
shx: ^0.4.0
typescript: ^5.8.3
vite: ^6.2.3
@@ -57,8 +57,8 @@ importers:
version: link:../../packages/core/typescript/itk-wasm
devDependencies:
cypress:
- specifier: ^14.5.0
- version: 14.5.0
+ specifier: ^14.5.1
+ version: 14.5.1
http-server:
specifier: ^14.1.1
version: 14.1.1
@@ -640,24 +640,21 @@ importers:
'@itk-wasm/mesh-io':
specifier: workspace:^
version: link:../../mesh-io/typescript
+ '@playwright/test':
+ specifier: ^1.48.2
+ version: 1.53.1
'@types/node':
specifier: ^24.0.3
version: 24.0.3
ava:
specifier: ^6.1.3
version: 6.1.3
- cypress:
- specifier: ^14.5.0
- version: 14.5.0
esbuild:
specifier: ^0.25.1
version: 0.25.2
shx:
specifier: ^0.4.0
version: 0.4.0
- start-server-and-test:
- specifier: ^2.0.12
- version: 2.0.12
typescript:
specifier: ^5.8.3
version: 5.8.3
@@ -695,6 +692,9 @@ importers:
'@itk-wasm/image-io-build':
specifier: workspace:*
version: link:..
+ '@playwright/test':
+ specifier: ^1.48.2
+ version: 1.53.1
'@types/mime-types':
specifier: ^2.1.4
version: 2.1.4
@@ -707,18 +707,12 @@ importers:
concurrently:
specifier: ^8.2.2
version: 8.2.2
- cypress:
- specifier: ^14.5.0
- version: 14.5.0
esbuild:
specifier: ^0.25.1
version: 0.25.2
shx:
specifier: ^0.4.0
version: 0.4.0
- start-server-and-test:
- specifier: ^2.0.12
- version: 2.0.12
typescript:
specifier: ^5.8.3
version: 5.8.3
@@ -821,8 +815,8 @@ importers:
specifier: ^6.1.3
version: 6.1.3
cypress:
- specifier: ^14.5.0
- version: 14.5.0
+ specifier: ^14.5.1
+ version: 14.5.1
esbuild:
specifier: ^0.25.1
version: 0.25.2
@@ -891,8 +885,8 @@ importers:
specifier: ^6.1.3
version: 6.1.3
cypress:
- specifier: ^14.5.0
- version: 14.5.0
+ specifier: ^14.5.1
+ version: 14.5.1
esbuild:
specifier: ^0.25.1
version: 0.25.2
@@ -3151,8 +3145,8 @@ packages:
resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==}
engines: {node: '>=0.10.0'}
- cypress@14.5.0:
- resolution: {integrity: sha512-1HOnKvWep0LkWuFwPeWkZ0TDl7ivi2/Mz+WNU4dfkeLJaFndS3Ow6TXT7YjuTqLFI2peJKzPKljVUFdymI2K5g==}
+ cypress@14.5.1:
+ resolution: {integrity: sha512-vYBeZKW3UAtxwv5mFuSlOBCYhyO0H86TeDKRJ7TgARyHiREIaiDjeHtqjzrXRFrdz9KnNavqlm+z+hklC7v8XQ==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
@@ -9088,7 +9082,7 @@ snapshots:
dependencies:
array-find-index: 1.0.2
- cypress@14.5.0:
+ cypress@14.5.1:
dependencies:
'@cypress/request': 3.0.8
'@cypress/xvfb': 1.2.4(supports-color@8.1.1)