From cb2c6c2c4bf0f85825bf171fbbf34b1bf4e34871 Mon Sep 17 00:00:00 2001 From: Matt McCormick Date: Tue, 28 Mar 2023 22:05:51 -0400 Subject: [PATCH] ENH: Test TypeScript bindings generation Bump itk-wasm CLI to add required array fixes, add typescript bindings generation to `npm run build` script. --- package.json | 12 ++++++------ wasm/ITKCleaverWasm.cxx | 3 ++- .../dist/pipelines/itk-cleaver.wasm | Bin 957353 -> 957469 bytes wasm/typescript/src/itk-cleaver-node.ts | 18 ++++++++++-------- wasm/typescript/src/itk-cleaver.ts | 18 ++++++++++-------- 5 files changed, 28 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 385910c..1241366 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,11 @@ "description": "npm scripts to generate itk-wasm artifacts.", "type": "module", "scripts": { - "build": "npm run build:emscripten && npm run build:wasi", - "build:emscripten": "itk-wasm -i itkwasm/emscripten:20230315-07caf9ca build", - "build:emscripten:debug": "itk-wasm -i itkwasm/emscripten:20230315-07caf9ca-debug build -- -DCMAKE_BUILD_TYPE:STRING=Debug", - "build:wasi": "itk-wasm -i itkwasm/wasi:20230315-07caf9ca build", - "build:wasi:debug": "itk-wasm -i itkwasm/wasi:20230315-07caf9ca-debug build -- -DCMAKE_BUILD_TYPE:STRING=Debug", + "build": "npm run build:emscripten && npm run build:wasi && npm run bindgen:typescript", + "build:emscripten": "itk-wasm -i itkwasm/emscripten:20230328-71e6501e build", + "build:emscripten:debug": "itk-wasm -i itkwasm/emscripten:20230328-71e6501e-debug build -- -DCMAKE_BUILD_TYPE:STRING=Debug", + "build:wasi": "itk-wasm -i itkwasm/wasi:20230328-71e6501e build", + "build:wasi:debug": "itk-wasm -i itkwasm/wasi:20230328-71e6501e-debug build -- -DCMAKE_BUILD_TYPE:STRING=Debug", "bindgen:typescript": "itk-wasm -b emscripten-build bindgen --output-dir wasm/typescript --package-name @itk-wasm/cleaver --package-description \"The Cleaver multimaterial tetrahedral meshing tool.\" --repository 'https://github.com/SCIInstitute/Cleaver2'", "test": "npm run test:wasi", "test:wasi": "itk-wasm test --test-dir wasm", @@ -16,6 +16,6 @@ }, "license": "Apache-2.0", "devDependencies": { - "itk-wasm": "^1.0.0-b.87" + "itk-wasm": "^1.0.0-b.91" } } diff --git a/wasm/ITKCleaverWasm.cxx b/wasm/ITKCleaverWasm.cxx index 111f383..e826c78 100644 --- a/wasm/ITKCleaverWasm.cxx +++ b/wasm/ITKCleaverWasm.cxx @@ -83,7 +83,7 @@ class PipelineFunctor using InputImageType = itk::wasm::InputImage; std::vector inputImages; - pipeline.add_option("-i,--input", inputImages, "Input label image or multiple indicator function images")->type_name("INPUT_IMAGE"); + auto inputImagesOption = pipeline.add_option("-i,--input", inputImages, "Input label image or multiple indicator function images")->type_name("INPUT_IMAGE"); ITK_WASM_PRE_PARSE(pipeline); @@ -94,6 +94,7 @@ class PipelineFunctor loadedInputImages[ii] = inputImages[ii].Get(); } + inputImagesOption->required(); int result = Mesher(pipeline, loadedInputImages); return result; } diff --git a/wasm/typescript/dist/pipelines/itk-cleaver.wasm b/wasm/typescript/dist/pipelines/itk-cleaver.wasm index 666395c74614651dd1afa82ebbabf9b1d2d1a08b..9079da3f26ce6983d81551f0b13058f8cba330e5 100755 GIT binary patch delta 8295 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 delta 7875 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 0') + if (typeof options.input !== "undefined") { + if(options.input.length < 1) { + throw new Error('"input" option must have a length > 1') + } + args.push('--input') + options.input.forEach((value) => { + const inputCountString = inputs.length.toString() + inputs.push({ type: InterfaceTypes.Image, data: value as Image}) + args.push(inputCountString) + }) } - args.push('--input') - options.input.forEach((inputImage, index) => { - args.push((index+0).toString()) - inputs.push({ type: InterfaceTypes.Image, data: inputImage as Image}) - - }) if (typeof options.sigma !== "undefined") { args.push('--sigma', options.sigma.toString()) } diff --git a/wasm/typescript/src/itk-cleaver.ts b/wasm/typescript/src/itk-cleaver.ts index e44f7fa..51b74d9 100644 --- a/wasm/typescript/src/itk-cleaver.ts +++ b/wasm/typescript/src/itk-cleaver.ts @@ -39,15 +39,17 @@ async function itkCleaver( args.push('0') // Options args.push('--memory-io') - if (options.input.length < 1) { - throw new Error('"input" option must have a length > 0') + if (typeof options.input !== "undefined") { + if(options.input.length < 1) { + throw new Error('"input" option must have a length > 1') + } + args.push('--input') + options.input.forEach((value) => { + const inputCountString = inputs.length.toString() + inputs.push({ type: InterfaceTypes.Image, data: value as Image}) + args.push(inputCountString) + }) } - args.push('--input') - options.input.forEach((inputImage, index) => { - args.push((index+0).toString()) - inputs.push({ type: InterfaceTypes.Image, data: inputImage as Image}) - - }) if (typeof options.sigma !== "undefined") { args.push('--sigma', options.sigma.toString()) }