From 8dd16259287f58f9273002717ec4d27e97127719 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 12 Jun 2024 07:43:14 +0200 Subject: Merging upstream version 127.0. Signed-off-by: Daniel Baumann --- dom/webgpu/Adapter.h | 1 + dom/webgpu/CanvasContext.cpp | 4 + dom/webgpu/ComputePassEncoder.cpp | 60 +- dom/webgpu/ComputePassEncoder.h | 2 +- dom/webgpu/ComputePipeline.cpp | 7 +- dom/webgpu/Device.cpp | 49 + dom/webgpu/RenderBundleEncoder.cpp | 103 +- dom/webgpu/RenderBundleEncoder.h | 4 +- dom/webgpu/RenderPassEncoder.cpp | 148 +- dom/webgpu/RenderPassEncoder.h | 2 +- dom/webgpu/RenderPipeline.cpp | 1 + .../cts/checkout/.github/pull_request_template.md | 1 + .../tests/cts/checkout/.github/workflows/pr.yml | 11 +- .../tests/cts/checkout/.github/workflows/push.yml | 5 + dom/webgpu/tests/cts/checkout/.gitignore | 1 + dom/webgpu/tests/cts/checkout/Gruntfile.js | 210 +- dom/webgpu/tests/cts/checkout/cts.code-workspace | 5 + .../cts/checkout/docs/adding_timing_metadata.md | 95 +- dom/webgpu/tests/cts/checkout/docs/build.md | 55 +- dom/webgpu/tests/cts/checkout/docs/case_cache.md | 81 + dom/webgpu/tests/cts/checkout/docs/fp_primer.md | 102 +- .../tests/cts/checkout/docs/intro/developing.md | 23 +- dom/webgpu/tests/cts/checkout/docs/terms.md | 2 +- dom/webgpu/tests/cts/checkout/package-lock.json | 3503 ++------------------ dom/webgpu/tests/cts/checkout/package.json | 15 +- .../cts/checkout/src/common/framework/fixture.ts | 17 +- .../checkout/src/common/framework/test_config.ts | 18 + .../checkout/src/common/internal/file_loader.ts | 4 +- .../src/common/internal/logging/log_message.ts | 51 +- .../checkout/src/common/internal/logging/logger.ts | 5 +- .../checkout/src/common/internal/logging/result.ts | 22 +- .../common/internal/logging/test_case_recorder.ts | 8 +- .../checkout/src/common/internal/query/compare.ts | 5 +- .../src/common/internal/query/parseQuery.ts | 43 +- .../checkout/src/common/internal/query/query.ts | 6 +- .../cts/checkout/src/common/internal/test_group.ts | 10 +- .../src/common/internal/test_suite_listing.ts | 2 +- .../tests/cts/checkout/src/common/internal/tree.ts | 7 +- .../src/common/internal/websocket_logger.ts | 13 +- .../cts/checkout/src/common/runtime/cmdline.ts | 52 +- .../checkout/src/common/runtime/helper/options.ts | 61 +- .../common/runtime/helper/test_worker-worker.ts | 49 +- .../src/common/runtime/helper/test_worker.ts | 202 +- .../src/common/runtime/helper/utils_worker.ts | 35 + .../src/common/runtime/helper/wrap_for_worker.ts | 54 + .../cts/checkout/src/common/runtime/server.ts | 62 +- .../cts/checkout/src/common/runtime/standalone.ts | 53 +- .../tests/cts/checkout/src/common/runtime/wpt.ts | 18 +- .../tests/cts/checkout/src/common/tools/crawl.ts | 56 +- .../cts/checkout/src/common/tools/dev_server.ts | 13 + .../cts/checkout/src/common/tools/gen_cache.ts | 278 +- .../cts/checkout/src/common/tools/gen_listings.ts | 11 +- .../common/tools/gen_listings_and_webworkers.ts | 89 + .../checkout/src/common/tools/gen_wpt_cts_html.ts | 135 +- .../src/common/tools/merge_listing_times.ts | 12 +- .../cts/checkout/src/common/tools/validate.ts | 29 +- .../tests/cts/checkout/src/common/util/crc32.ts | 57 + .../cts/checkout/src/common/util/parse_imports.ts | 36 + .../tests/cts/checkout/src/common/util/util.ts | 5 +- .../tests/cts/checkout/src/external/README.md | 2 +- .../src/external/petamoriken/float16/LICENSE.txt | 2 +- .../src/external/petamoriken/float16/float16.d.ts | 27 + .../src/external/petamoriken/float16/float16.js | 181 +- .../tests/cts/checkout/src/resources/README.md | 100 +- .../cts/checkout/src/resources/cache/hashes.json | 111 + .../cache/webgpu/shader/execution/abs.bin | Bin 0 -> 17976 bytes .../cache/webgpu/shader/execution/acos.bin | Bin 0 -> 26440 bytes .../cache/webgpu/shader/execution/acosh.bin | Bin 0 -> 30248 bytes .../cache/webgpu/shader/execution/asin.bin | Bin 0 -> 26440 bytes .../cache/webgpu/shader/execution/asinh.bin | Bin 0 -> 11664 bytes .../cache/webgpu/shader/execution/atan.bin | Bin 0 -> 20128 bytes .../cache/webgpu/shader/execution/atan2.bin | Bin 0 -> 51608 bytes .../cache/webgpu/shader/execution/atanh.bin | Bin 0 -> 21104 bytes .../webgpu/shader/execution/binary/af_addition.bin | Bin 0 -> 237960 bytes .../webgpu/shader/execution/binary/af_division.bin | Bin 0 -> 77496 bytes .../webgpu/shader/execution/binary/af_logical.bin | Bin 0 -> 12456 bytes .../shader/execution/binary/af_matrix_addition.bin | Bin 0 -> 175672 bytes .../binary/af_matrix_matrix_multiplication.bin | Bin 0 -> 82608 bytes .../binary/af_matrix_scalar_multiplication.bin | Bin 0 -> 291528 bytes .../execution/binary/af_matrix_subtraction.bin | Bin 0 -> 181112 bytes .../binary/af_matrix_vector_multiplication.bin | Bin 0 -> 152528 bytes .../shader/execution/binary/af_multiplication.bin | Bin 0 -> 207864 bytes .../shader/execution/binary/af_remainder.bin | Bin 0 -> 77496 bytes .../shader/execution/binary/af_subtraction.bin | Bin 0 -> 237960 bytes .../shader/execution/binary/ai_arithmetic.bin | Bin 0 -> 831992 bytes .../shader/execution/binary/f16_addition.bin | Bin 0 -> 169680 bytes .../shader/execution/binary/f16_division.bin | Bin 0 -> 120856 bytes .../webgpu/shader/execution/binary/f16_logical.bin | Bin 0 -> 15912 bytes .../execution/binary/f16_matrix_addition.bin | Bin 0 -> 557464 bytes .../binary/f16_matrix_matrix_multiplication.bin | Bin 0 -> 1481368 bytes .../binary/f16_matrix_scalar_multiplication.bin | Bin 0 -> 906440 bytes .../execution/binary/f16_matrix_subtraction.bin | Bin 0 -> 534232 bytes .../binary/f16_matrix_vector_multiplication.bin | Bin 0 -> 601680 bytes .../shader/execution/binary/f16_multiplication.bin | Bin 0 -> 171072 bytes .../shader/execution/binary/f16_remainder.bin | Bin 0 -> 118944 bytes .../shader/execution/binary/f16_subtraction.bin | Bin 0 -> 169680 bytes .../shader/execution/binary/f32_addition.bin | Bin 0 -> 279984 bytes .../shader/execution/binary/f32_division.bin | Bin 0 -> 174960 bytes .../webgpu/shader/execution/binary/f32_logical.bin | Bin 0 -> 18984 bytes .../execution/binary/f32_matrix_addition.bin | Bin 0 -> 991896 bytes .../binary/f32_matrix_matrix_multiplication.bin | Bin 0 -> 2510560 bytes .../binary/f32_matrix_scalar_multiplication.bin | Bin 0 -> 1534768 bytes .../execution/binary/f32_matrix_subtraction.bin | Bin 0 -> 995984 bytes .../binary/f32_matrix_vector_multiplication.bin | Bin 0 -> 950336 bytes .../shader/execution/binary/f32_multiplication.bin | Bin 0 -> 257976 bytes .../shader/execution/binary/f32_remainder.bin | Bin 0 -> 171384 bytes .../shader/execution/binary/f32_subtraction.bin | Bin 0 -> 279968 bytes .../shader/execution/binary/i32_arithmetic.bin | Bin 0 -> 727864 bytes .../shader/execution/binary/i32_comparison.bin | Bin 0 -> 3872 bytes .../shader/execution/binary/u32_arithmetic.bin | Bin 0 -> 225816 bytes .../shader/execution/binary/u32_comparison.bin | Bin 0 -> 2192 bytes .../cache/webgpu/shader/execution/bitcast.bin | Bin 0 -> 2240896 bytes .../cache/webgpu/shader/execution/ceil.bin | Bin 0 -> 16016 bytes .../cache/webgpu/shader/execution/clamp.bin | Bin 0 -> 1048136 bytes .../cache/webgpu/shader/execution/cos.bin | Bin 0 -> 20176 bytes .../cache/webgpu/shader/execution/cosh.bin | Bin 0 -> 14904 bytes .../cache/webgpu/shader/execution/cross.bin | Bin 0 -> 829096 bytes .../cache/webgpu/shader/execution/degrees.bin | Bin 0 -> 18048 bytes .../cache/webgpu/shader/execution/derivatives.bin | Bin 0 -> 11264 bytes .../cache/webgpu/shader/execution/determinant.bin | Bin 0 -> 9944 bytes .../cache/webgpu/shader/execution/distance.bin | Bin 0 -> 1731496 bytes .../cache/webgpu/shader/execution/dot.bin | Bin 0 -> 469272 bytes .../cache/webgpu/shader/execution/exp.bin | Bin 0 -> 34592 bytes .../cache/webgpu/shader/execution/exp2.bin | Bin 0 -> 34592 bytes .../cache/webgpu/shader/execution/faceForward.bin | Bin 0 -> 4214688 bytes .../cache/webgpu/shader/execution/floor.bin | Bin 0 -> 16016 bytes .../cache/webgpu/shader/execution/fma.bin | Bin 0 -> 886720 bytes .../cache/webgpu/shader/execution/fract.bin | Bin 0 -> 16408 bytes .../cache/webgpu/shader/execution/frexp.bin | Bin 0 -> 47072 bytes .../cache/webgpu/shader/execution/inverseSqrt.bin | Bin 0 -> 78424 bytes .../cache/webgpu/shader/execution/ldexp.bin | Bin 0 -> 33096 bytes .../cache/webgpu/shader/execution/length.bin | Bin 0 -> 35696 bytes .../cache/webgpu/shader/execution/log.bin | Bin 0 -> 148848 bytes .../cache/webgpu/shader/execution/log2.bin | Bin 0 -> 148848 bytes .../cache/webgpu/shader/execution/max.bin | Bin 0 -> 37944 bytes .../cache/webgpu/shader/execution/min.bin | Bin 0 -> 37944 bytes .../cache/webgpu/shader/execution/mix.bin | Bin 0 -> 5817432 bytes .../cache/webgpu/shader/execution/modf.bin | Bin 0 -> 82448 bytes .../cache/webgpu/shader/execution/normalize.bin | Bin 0 -> 47608 bytes .../webgpu/shader/execution/pack2x16float.bin | Bin 0 -> 1791400 bytes .../cache/webgpu/shader/execution/pow.bin | Bin 0 -> 1308224 bytes .../webgpu/shader/execution/quantizeToF16.bin | Bin 0 -> 8904 bytes .../cache/webgpu/shader/execution/radians.bin | Bin 0 -> 10992 bytes .../cache/webgpu/shader/execution/reflect.bin | Bin 0 -> 277720 bytes .../cache/webgpu/shader/execution/refract.bin | Bin 0 -> 2828888 bytes .../cache/webgpu/shader/execution/round.bin | Bin 0 -> 14816 bytes .../cache/webgpu/shader/execution/saturate.bin | Bin 0 -> 17096 bytes .../cache/webgpu/shader/execution/sign.bin | Bin 0 -> 21224 bytes .../cache/webgpu/shader/execution/sin.bin | Bin 0 -> 20176 bytes .../cache/webgpu/shader/execution/sinh.bin | Bin 0 -> 14904 bytes .../cache/webgpu/shader/execution/smoothstep.bin | Bin 0 -> 629408 bytes .../cache/webgpu/shader/execution/sqrt.bin | Bin 0 -> 10024 bytes .../cache/webgpu/shader/execution/step.bin | Bin 0 -> 33160 bytes .../cache/webgpu/shader/execution/tan.bin | Bin 0 -> 21776 bytes .../cache/webgpu/shader/execution/tanh.bin | Bin 0 -> 11448 bytes .../cache/webgpu/shader/execution/transpose.bin | Bin 0 -> 129192 bytes .../cache/webgpu/shader/execution/trunc.bin | Bin 0 -> 14696 bytes .../shader/execution/unary/af_arithmetic.bin | Bin 0 -> 30376 bytes .../shader/execution/unary/af_assignment.bin | Bin 0 -> 10296 bytes .../shader/execution/unary/ai_arithmetic.bin | Bin 0 -> 3256 bytes .../shader/execution/unary/ai_assignment.bin | Bin 0 -> 6936 bytes .../shader/execution/unary/bool_conversion.bin | Bin 0 -> 6480 bytes .../shader/execution/unary/f16_arithmetic.bin | Bin 0 -> 15208 bytes .../shader/execution/unary/f16_conversion.bin | Bin 0 -> 97912 bytes .../shader/execution/unary/f32_arithmetic.bin | Bin 0 -> 19544 bytes .../shader/execution/unary/f32_conversion.bin | Bin 0 -> 105744 bytes .../shader/execution/unary/i32_arithmetic.bin | Bin 0 -> 1648 bytes .../shader/execution/unary/i32_conversion.bin | Bin 0 -> 11856 bytes .../shader/execution/unary/u32_conversion.bin | Bin 0 -> 10680 bytes .../webgpu/shader/execution/unpack2x16float.bin | Bin 0 -> 4832 bytes .../webgpu/shader/execution/unpack2x16snorm.bin | Bin 0 -> 4968 bytes .../webgpu/shader/execution/unpack2x16unorm.bin | Bin 0 -> 4968 bytes .../webgpu/shader/execution/unpack4x8snorm.bin | Bin 0 -> 7416 bytes .../webgpu/shader/execution/unpack4x8unorm.bin | Bin 0 -> 7416 bytes .../src/resources/four-colors-h264-bt601-hflip.mp4 | Bin 0 -> 3174 bytes .../four-colors-h264-bt601-rotate-180.mp4 | Bin 16261 -> 3113 bytes .../four-colors-h264-bt601-rotate-270.mp4 | Bin 16261 -> 3211 bytes .../resources/four-colors-h264-bt601-rotate-90.mp4 | Bin 16261 -> 3204 bytes .../src/resources/four-colors-h264-bt601-vflip.mp4 | Bin 0 -> 3174 bytes .../src/resources/four-colors-h264-bt601.mp4 | Bin 16261 -> 3174 bytes .../src/resources/four-colors-theora-bt601.ogv | Bin 44488 -> 0 bytes .../src/resources/four-colors-vp8-bt601.webm | Bin 17910 -> 2421 bytes .../src/resources/four-colors-vp9-bt601-hflip.mp4 | Bin 0 -> 2077 bytes .../resources/four-colors-vp9-bt601-rotate-180.mp4 | Bin 0 -> 2079 bytes .../resources/four-colors-vp9-bt601-rotate-270.mp4 | Bin 0 -> 2016 bytes .../resources/four-colors-vp9-bt601-rotate-90.mp4 | Bin 0 -> 2079 bytes .../src/resources/four-colors-vp9-bt601-vflip.mp4 | Bin 0 -> 2077 bytes .../src/resources/four-colors-vp9-bt601.mp4 | Bin 0 -> 2077 bytes .../src/resources/four-colors-vp9-bt601.webm | Bin 13116 -> 1847 bytes .../src/resources/four-colors-vp9-bt709.webm | Bin 12584 -> 1789 bytes .../cts/checkout/src/unittests/conversion.spec.ts | 14 +- .../tests/cts/checkout/src/unittests/crc32.spec.ts | 28 + .../checkout/src/unittests/floating_point.spec.ts | 2289 +++++++------ .../tests/cts/checkout/src/unittests/maths.spec.ts | 44 +- .../checkout/src/unittests/parse_imports.spec.ts | 79 + .../checkout/src/unittests/serialization.spec.ts | 69 + .../cts/checkout/src/unittests/texture_ok.spec.ts | 31 +- .../api/operation/adapter/requestDevice.spec.ts | 59 + .../command_buffer/copyTextureToTexture.spec.ts | 113 +- .../operation/command_buffer/image_copy.spec.ts | 94 +- .../command_buffer/queries/occlusionQuery.spec.ts | 8 +- .../texture/readonly_depth_stencil.spec.ts | 329 ++ .../src/webgpu/api/operation/reflection.spec.ts | 293 +- .../operation/render_pipeline/sample_mask.spec.ts | 24 +- .../operation/rendering/3d_texture_slices.spec.ts | 363 ++ .../operation/rendering/color_target_state.spec.ts | 8 +- .../webgpu/api/operation/rendering/depth.spec.ts | 9 +- .../api/operation/rendering/depth_bias.spec.ts | 12 + .../operation/rendering/depth_clip_clamp.spec.ts | 20 +- .../resource_init/check_texture/by_copy.ts | 3 +- .../resource_init/check_texture/by_ds_test.ts | 3 +- .../resource_init/check_texture/by_sampling.ts | 38 +- .../check_texture/texture_zero_init_test.ts | 548 +++ .../operation/resource_init/texture_zero.spec.ts | 554 +--- .../shader_module/compilation_info.spec.ts | 39 +- .../operation/storage_texture/read_only.spec.ts | 626 ++++ .../operation/storage_texture/read_write.spec.ts | 385 +++ .../texture_view/format_reinterpretation.spec.ts | 10 +- .../api/operation/texture_view/write.spec.ts | 347 +- .../webgpu/api/validation/buffer/mapping.spec.ts | 39 +- .../capability_checks/features/query_types.spec.ts | 56 +- .../capability_checks/limits/limit_utils.ts | 119 +- .../capability_checks/limits/maxBindGroups.spec.ts | 156 +- .../limits/maxBindGroupsPlusVertexBuffers.spec.ts | 301 ++ .../limits/maxComputeWorkgroupStorageSize.spec.ts | 9 +- .../limits/maxInterStageShaderComponents.spec.ts | 8 +- .../maxSampledTexturesPerShaderStage.spec.ts | 50 +- .../limits/maxSamplersPerShaderStage.spec.ts | 54 +- .../limits/maxStorageBuffersPerShaderStage.spec.ts | 85 +- .../maxStorageTexturesPerShaderStage.spec.ts | 46 +- .../limits/maxUniformBuffersPerShaderStage.spec.ts | 46 +- .../limits/maxVertexBuffers.spec.ts | 68 +- .../webgpu/api/validation/compute_pipeline.spec.ts | 50 + .../webgpu/api/validation/createBindGroup.spec.ts | 49 +- .../api/validation/createBindGroupLayout.spec.ts | 47 +- .../webgpu/api/validation/createTexture.spec.ts | 43 +- .../src/webgpu/api/validation/createView.spec.ts | 11 +- .../encoding/cmds/copyTextureToTexture.spec.ts | 15 +- .../encoding/createRenderBundleEncoder.spec.ts | 44 +- .../validation/encoding/encoder_open_state.spec.ts | 14 +- .../pipeline_bind_group_compat.spec.ts | 343 +- .../validation/encoding/queries/general.spec.ts | 42 +- .../api/validation/encoding/render_bundle.spec.ts | 14 +- .../src/webgpu/api/validation/error_scope.spec.ts | 18 +- .../gpu_external_texture_expiration.spec.ts | 35 +- .../webgpu/api/validation/image_copy/image_copy.ts | 4 +- .../validation/image_copy/texture_related.spec.ts | 2 +- .../api/validation/layout_shader_compat.spec.ts | 287 +- .../CopyExternalImageToTexture.spec.ts | 4 +- .../validation/queue/destroyed/query_set.spec.ts | 53 +- .../api/validation/queue/destroyed/texture.spec.ts | 9 +- .../render_pass/attachment_compatibility.spec.ts | 7 - .../render_pass/render_pass_descriptor.spec.ts | 190 +- .../api/validation/render_pipeline/common.ts | 11 +- .../render_pipeline/depth_stencil_state.spec.ts | 12 +- .../render_pipeline/fragment_state.spec.ts | 77 +- .../validation/render_pipeline/inter_stage.spec.ts | 72 +- .../api/validation/render_pipeline/misc.spec.ts | 34 + .../render_pipeline/resource_compatibility.spec.ts | 95 + .../texture/in_pass_encoder.spec.ts | 269 +- .../texture/in_render_common.spec.ts | 101 +- .../resource_usages/texture/in_render_misc.spec.ts | 307 +- .../validation/shader_module/entry_point.spec.ts | 226 +- .../validation/state/device_lost/destroy.spec.ts | 12 +- .../validation/texture/bgra8unorm_storage.spec.ts | 31 - .../checkout/src/webgpu/api/validation/utils.ts | 275 ++ .../src/webgpu/api/validation/validation_test.ts | 25 +- .../cts/checkout/src/webgpu/capability_info.ts | 125 +- .../compat/api/validation/createBindGroup.spec.ts | 178 + .../api/validation/createBindGroupLayout.spec.ts | 34 + .../encoding/cmds/copyTextureToBuffer.spec.ts | 9 +- .../encoding/cmds/copyTextureToTexture.spec.ts | 94 + .../render_pipeline/depth_stencil_state.spec.ts | 53 + .../render_pipeline/shader_module.spec.ts | 207 ++ .../api/validation/texture/createTexture.spec.ts | 131 + .../tests/cts/checkout/src/webgpu/constants.ts | 5 + .../tests/cts/checkout/src/webgpu/format_info.ts | 1147 +++++-- .../tests/cts/checkout/src/webgpu/gpu_test.ts | 232 +- .../checkout/src/webgpu/idl/constructable.spec.ts | 54 + .../cts/checkout/src/webgpu/listing_meta.json | 724 +++- .../cts/checkout/src/webgpu/multisample_info.ts | 75 + .../checkout/src/webgpu/print_environment.spec.ts | 70 + .../expression/access/array/index.spec.ts | 354 ++ .../expression/access/matrix/index.spec.ts | 200 ++ .../expression/access/structure/index.spec.ts | 508 +++ .../expression/access/vector/components.spec.ts | 118 + .../expression/access/vector/index.spec.ts | 87 + .../expression/binary/af_addition.cache.ts | 54 + .../expression/binary/af_addition.spec.ts | 85 +- .../expression/binary/af_comparison.cache.ts | 90 + .../expression/binary/af_comparison.spec.ts | 141 +- .../expression/binary/af_division.cache.ts | 57 + .../expression/binary/af_division.spec.ts | 85 +- .../expression/binary/af_matrix_addition.cache.ts | 26 + .../expression/binary/af_matrix_addition.spec.ts | 34 +- .../af_matrix_matrix_multiplication.cache.ts | 29 + .../binary/af_matrix_matrix_multiplication.spec.ts | 45 + .../af_matrix_scalar_multiplication.cache.ts | 49 + .../binary/af_matrix_scalar_multiplication.spec.ts | 69 + .../binary/af_matrix_subtraction.cache.ts | 26 + .../binary/af_matrix_subtraction.spec.ts | 34 +- .../af_matrix_vector_multiplication.cache.ts | 51 + .../binary/af_matrix_vector_multiplication.spec.ts | 69 + .../expression/binary/af_multiplication.cache.ts | 54 + .../expression/binary/af_multiplication.spec.ts | 85 +- .../expression/binary/af_remainder.cache.ts | 57 + .../expression/binary/af_remainder.spec.ts | 83 +- .../expression/binary/af_subtraction.cache.ts | 54 + .../expression/binary/af_subtraction.spec.ts | 85 +- .../expression/binary/ai_arithmetic.cache.ts | 145 + .../expression/binary/ai_arithmetic.spec.ts | 303 ++ .../expression/binary/ai_comparison.spec.ts | 124 + .../shader/execution/expression/binary/binary.ts | 8 +- .../execution/expression/binary/bitwise.spec.ts | 505 ++- .../expression/binary/bitwise_shift.spec.ts | 25 +- .../expression/binary/bool_logical.spec.ts | 18 +- .../expression/binary/f16_addition.cache.ts | 60 + .../expression/binary/f16_addition.spec.ts | 81 +- .../expression/binary/f16_comparison.cache.ts | 144 + .../expression/binary/f16_comparison.spec.ts | 159 +- .../expression/binary/f16_division.cache.ts | 60 + .../expression/binary/f16_division.spec.ts | 81 +- .../expression/binary/f16_matrix_addition.cache.ts | 23 + .../expression/binary/f16_matrix_addition.spec.ts | 34 +- .../f16_matrix_matrix_multiplication.cache.ts | 25 + .../f16_matrix_matrix_multiplication.spec.ts | 36 +- .../f16_matrix_scalar_multiplication.cache.ts | 44 + .../f16_matrix_scalar_multiplication.spec.ts | 59 +- .../binary/f16_matrix_subtraction.cache.ts | 23 + .../binary/f16_matrix_subtraction.spec.ts | 34 +- .../f16_matrix_vector_multiplication.cache.ts | 44 + .../f16_matrix_vector_multiplication.spec.ts | 59 +- .../expression/binary/f16_multiplication.cache.ts | 60 + .../expression/binary/f16_multiplication.spec.ts | 81 +- .../expression/binary/f16_remainder.cache.ts | 60 + .../expression/binary/f16_remainder.spec.ts | 81 +- .../expression/binary/f16_subtraction.cache.ts | 60 + .../expression/binary/f16_subtraction.spec.ts | 81 +- .../expression/binary/f32_addition.cache.ts | 60 + .../expression/binary/f32_addition.spec.ts | 81 +- .../expression/binary/f32_comparison.cache.ts | 144 + .../expression/binary/f32_comparison.spec.ts | 159 +- .../expression/binary/f32_division.cache.ts | 60 + .../expression/binary/f32_division.spec.ts | 81 +- .../expression/binary/f32_matrix_addition.cache.ts | 23 + .../expression/binary/f32_matrix_addition.spec.ts | 34 +- .../f32_matrix_matrix_multiplication.cache.ts | 25 + .../f32_matrix_matrix_multiplication.spec.ts | 36 +- .../f32_matrix_scalar_multiplication.cache.ts | 44 + .../f32_matrix_scalar_multiplication.spec.ts | 59 +- .../binary/f32_matrix_subtraction.cache.ts | 23 + .../binary/f32_matrix_subtraction.spec.ts | 34 +- .../f32_matrix_vector_multiplication.cache.ts | 44 + .../f32_matrix_vector_multiplication.spec.ts | 59 +- .../expression/binary/f32_multiplication.cache.ts | 60 + .../expression/binary/f32_multiplication.spec.ts | 81 +- .../expression/binary/f32_remainder.cache.ts | 64 + .../expression/binary/f32_remainder.spec.ts | 81 +- .../expression/binary/f32_subtraction.cache.ts | 60 + .../expression/binary/f32_subtraction.spec.ts | 81 +- .../expression/binary/i32_arithmetic.cache.ts | 306 ++ .../expression/binary/i32_arithmetic.spec.ts | 392 +-- .../expression/binary/i32_comparison.cache.ts | 21 + .../expression/binary/i32_comparison.spec.ts | 36 +- .../expression/binary/u32_arithmetic.cache.ts | 293 ++ .../expression/binary/u32_arithmetic.spec.ts | 379 +-- .../expression/binary/u32_comparison.cache.ts | 21 + .../expression/binary/u32_comparison.spec.ts | 36 +- .../execution/expression/call/builtin/abs.cache.ts | 26 + .../execution/expression/call/builtin/abs.spec.ts | 64 +- .../expression/call/builtin/acos.cache.ts | 24 + .../execution/expression/call/builtin/acos.spec.ts | 57 +- .../expression/call/builtin/acosh.cache.ts | 24 + .../expression/call/builtin/acosh.spec.ts | 56 +- .../execution/expression/call/builtin/all.spec.ts | 20 +- .../execution/expression/call/builtin/any.spec.ts | 20 +- .../expression/call/builtin/asin.cache.ts | 24 + .../execution/expression/call/builtin/asin.spec.ts | 57 +- .../expression/call/builtin/asinh.cache.ts | 18 + .../expression/call/builtin/asinh.spec.ts | 41 +- .../expression/call/builtin/atan.cache.ts | 25 + .../execution/expression/call/builtin/atan.spec.ts | 52 +- .../expression/call/builtin/atan2.cache.ts | 35 + .../expression/call/builtin/atan2.spec.ts | 56 +- .../expression/call/builtin/atanh.cache.ts | 32 + .../expression/call/builtin/atanh.spec.ts | 63 +- .../call/builtin/atomics/atomicAdd.spec.ts | 4 +- .../call/builtin/atomics/atomicAnd.spec.ts | 4 +- .../atomics/atomicCompareExchangeWeak.spec.ts | 18 +- .../call/builtin/atomics/atomicExchange.spec.ts | 8 +- .../call/builtin/atomics/atomicLoad.spec.ts | 4 +- .../call/builtin/atomics/atomicMax.spec.ts | 4 +- .../call/builtin/atomics/atomicMin.spec.ts | 4 +- .../call/builtin/atomics/atomicOr.spec.ts | 4 +- .../call/builtin/atomics/atomicStore.spec.ts | 8 +- .../call/builtin/atomics/atomicSub.spec.ts | 4 +- .../call/builtin/atomics/atomicXor.spec.ts | 4 +- .../expression/call/builtin/atomics/harness.ts | 7 +- .../expression/call/builtin/bitcast.cache.ts | 837 +++++ .../expression/call/builtin/bitcast.spec.ts | 1142 ++----- .../execution/expression/call/builtin/builtin.ts | 8 +- .../expression/call/builtin/ceil.cache.ts | 26 + .../execution/expression/call/builtin/ceil.spec.ts | 79 +- .../expression/call/builtin/clamp.cache.ts | 131 + .../expression/call/builtin/clamp.spec.ts | 140 +- .../execution/expression/call/builtin/cos.cache.ts | 23 + .../execution/expression/call/builtin/cos.spec.ts | 57 +- .../expression/call/builtin/cosh.cache.ts | 23 + .../execution/expression/call/builtin/cosh.spec.ts | 47 +- .../call/builtin/countLeadingZeros.spec.ts | 6 +- .../expression/call/builtin/countOneBits.spec.ts | 6 +- .../call/builtin/countTrailingZeros.spec.ts | 6 +- .../expression/call/builtin/cross.cache.ts | 25 + .../expression/call/builtin/cross.spec.ts | 79 +- .../expression/call/builtin/degrees.cache.ts | 24 + .../expression/call/builtin/degrees.spec.ts | 52 +- .../expression/call/builtin/derivatives.cache.ts | 14 + .../expression/call/builtin/derivatives.ts | 215 ++ .../expression/call/builtin/determinant.cache.ts | 99 + .../expression/call/builtin/determinant.spec.ts | 112 +- .../expression/call/builtin/distance.cache.ts | 49 + .../expression/call/builtin/distance.spec.ts | 208 +- .../execution/expression/call/builtin/dot.cache.ts | 118 + .../execution/expression/call/builtin/dot.spec.ts | 238 +- .../expression/call/builtin/dot4I8Packed.spec.ts | 74 + .../expression/call/builtin/dot4U8Packed.spec.ts | 59 + .../execution/expression/call/builtin/dpdx.spec.ts | 16 +- .../expression/call/builtin/dpdxCoarse.spec.ts | 16 +- .../expression/call/builtin/dpdxFine.spec.ts | 16 +- .../execution/expression/call/builtin/dpdy.spec.ts | 16 +- .../expression/call/builtin/dpdyCoarse.spec.ts | 16 +- .../expression/call/builtin/dpdyFine.spec.ts | 16 +- .../execution/expression/call/builtin/exp.cache.ts | 44 + .../execution/expression/call/builtin/exp.spec.ts | 69 +- .../expression/call/builtin/exp2.cache.ts | 44 + .../execution/expression/call/builtin/exp2.spec.ts | 69 +- .../expression/call/builtin/extractBits.spec.ts | 20 +- .../expression/call/builtin/faceForward.cache.ts | 125 + .../expression/call/builtin/faceForward.spec.ts | 198 +- .../call/builtin/firstLeadingBit.spec.ts | 6 +- .../call/builtin/firstTrailingBit.spec.ts | 6 +- .../expression/call/builtin/floor.cache.ts | 26 + .../expression/call/builtin/floor.spec.ts | 61 +- .../execution/expression/call/builtin/fma.cache.ts | 26 + .../execution/expression/call/builtin/fma.spec.ts | 70 +- .../expression/call/builtin/fract.cache.ts | 50 + .../expression/call/builtin/fract.spec.ts | 81 +- .../expression/call/builtin/frexp.cache.ts | 103 + .../expression/call/builtin/frexp.spec.ts | 304 +- .../expression/call/builtin/insertBits.spec.ts | 18 +- .../expression/call/builtin/inversesqrt.cache.ts | 44 + .../expression/call/builtin/inversesqrt.spec.ts | 60 +- .../expression/call/builtin/ldexp.cache.ts | 61 + .../expression/call/builtin/ldexp.spec.ts | 94 +- .../expression/call/builtin/length.cache.ts | 42 + .../expression/call/builtin/length.spec.ts | 146 +- .../execution/expression/call/builtin/log.cache.ts | 30 + .../execution/expression/call/builtin/log.spec.ts | 62 +- .../expression/call/builtin/log2.cache.ts | 30 + .../execution/expression/call/builtin/log2.spec.ts | 62 +- .../execution/expression/call/builtin/max.cache.ts | 18 + .../execution/expression/call/builtin/max.spec.ts | 106 +- .../execution/expression/call/builtin/min.cache.ts | 18 + .../execution/expression/call/builtin/min.spec.ts | 106 +- .../execution/expression/call/builtin/mix.cache.ts | 56 + .../execution/expression/call/builtin/mix.spec.ts | 210 +- .../expression/call/builtin/modf.cache.ts | 75 + .../execution/expression/call/builtin/modf.spec.ts | 192 +- .../expression/call/builtin/normalize.cache.ts | 25 + .../expression/call/builtin/normalize.spec.ts | 88 +- .../expression/call/builtin/pack2x16float.cache.ts | 55 + .../expression/call/builtin/pack2x16float.spec.ts | 68 +- .../expression/call/builtin/pack2x16snorm.spec.ts | 15 +- .../expression/call/builtin/pack2x16unorm.spec.ts | 15 +- .../expression/call/builtin/pack4x8snorm.spec.ts | 23 +- .../expression/call/builtin/pack4x8unorm.spec.ts | 23 +- .../expression/call/builtin/pack4xI8.spec.ts | 69 + .../expression/call/builtin/pack4xI8Clamp.spec.ts | 73 + .../expression/call/builtin/pack4xU8.spec.ts | 54 + .../expression/call/builtin/pack4xU8Clamp.spec.ts | 57 + .../execution/expression/call/builtin/pow.cache.ts | 24 + .../execution/expression/call/builtin/pow.spec.ts | 67 +- .../expression/call/builtin/quantizeToF16.cache.ts | 41 + .../expression/call/builtin/quantizeToF16.spec.ts | 46 +- .../expression/call/builtin/radians.cache.ts | 18 + .../expression/call/builtin/radians.spec.ts | 44 +- .../expression/call/builtin/reflect.cache.ts | 26 + .../expression/call/builtin/reflect.spec.ts | 151 +- .../expression/call/builtin/refract.cache.ts | 116 + .../expression/call/builtin/refract.spec.ts | 191 +- .../expression/call/builtin/reverseBits.spec.ts | 6 +- .../expression/call/builtin/round.cache.ts | 24 + .../expression/call/builtin/round.spec.ts | 55 +- .../expression/call/builtin/saturate.cache.ts | 18 + .../expression/call/builtin/saturate.spec.ts | 56 +- .../expression/call/builtin/select.spec.ts | 129 +- .../expression/call/builtin/sign.cache.ts | 31 + .../execution/expression/call/builtin/sign.spec.ts | 66 +- .../execution/expression/call/builtin/sin.cache.ts | 23 + .../execution/expression/call/builtin/sin.spec.ts | 57 +- .../expression/call/builtin/sinh.cache.ts | 23 + .../execution/expression/call/builtin/sinh.spec.ts | 47 +- .../expression/call/builtin/smoothstep.cache.ts | 25 + .../expression/call/builtin/smoothstep.spec.ts | 71 +- .../expression/call/builtin/sqrt.cache.ts | 23 + .../execution/expression/call/builtin/sqrt.spec.ts | 47 +- .../expression/call/builtin/step.cache.ts | 41 + .../execution/expression/call/builtin/step.spec.ts | 66 +- .../execution/expression/call/builtin/tan.cache.ts | 23 + .../execution/expression/call/builtin/tan.spec.ts | 57 +- .../expression/call/builtin/tanh.cache.ts | 18 + .../execution/expression/call/builtin/tanh.spec.ts | 41 +- .../call/builtin/textureDimension.spec.ts | 160 - .../call/builtin/textureDimensions.spec.ts | 518 +++ .../expression/call/builtin/textureSample.spec.ts | 99 +- .../call/builtin/textureSampleBias.spec.ts | 22 - .../call/builtin/textureSampleCompare.spec.ts | 23 - .../expression/call/builtin/texture_utils.ts | 809 +++++ .../expression/call/builtin/transpose.cache.ts | 27 + .../expression/call/builtin/transpose.spec.ts | 85 +- .../expression/call/builtin/trunc.cache.ts | 17 + .../expression/call/builtin/trunc.spec.ts | 39 +- .../call/builtin/unpack2x16float.cache.ts | 20 + .../call/builtin/unpack2x16float.spec.ts | 25 +- .../call/builtin/unpack2x16snorm.cache.ts | 20 + .../call/builtin/unpack2x16snorm.spec.ts | 25 +- .../call/builtin/unpack2x16unorm.cache.ts | 20 + .../call/builtin/unpack2x16unorm.spec.ts | 25 +- .../call/builtin/unpack4x8snorm.cache.ts | 20 + .../expression/call/builtin/unpack4x8snorm.spec.ts | 25 +- .../call/builtin/unpack4x8unorm.cache.ts | 20 + .../expression/call/builtin/unpack4x8unorm.spec.ts | 25 +- .../expression/call/builtin/unpack4xI8.spec.ts | 56 + .../expression/call/builtin/unpack4xU8.spec.ts | 48 + .../call/builtin/workgroupUniformLoad.spec.ts | 182 + .../expression/call/user/ptr_params.spec.ts | 849 +++++ .../src/webgpu/shader/execution/expression/case.ts | 440 +++ .../shader/execution/expression/case_cache.ts | 39 +- .../expression/constructor/non_zero.spec.ts | 797 +++++ .../expression/constructor/zero_value.spec.ts | 162 + .../shader/execution/expression/expectation.ts | 38 + .../shader/execution/expression/expression.ts | 800 ++--- .../shader/execution/expression/interval_filter.ts | 8 + .../shader/execution/expression/precedence.spec.ts | 113 + .../unary/address_of_and_indirection.spec.ts | 171 + .../expression/unary/af_arithmetic.cache.ts | 13 + .../expression/unary/af_arithmetic.spec.ts | 30 +- .../expression/unary/af_assignment.cache.ts | 51 + .../expression/unary/af_assignment.spec.ts | 66 +- .../expression/unary/ai_arithmetic.cache.ts | 11 + .../expression/unary/ai_arithmetic.spec.ts | 30 + .../expression/unary/ai_assignment.cache.ts | 21 + .../expression/unary/ai_assignment.spec.ts | 65 + .../expression/unary/ai_complement.spec.ts | 32 + .../expression/unary/bool_conversion.cache.ts | 54 + .../expression/unary/bool_conversion.spec.ts | 87 +- .../expression/unary/bool_logical.spec.ts | 4 +- .../expression/unary/f16_arithmetic.cache.ts | 13 + .../expression/unary/f16_arithmetic.spec.ts | 18 +- .../expression/unary/f16_conversion.cache.ts | 135 + .../expression/unary/f16_conversion.spec.ts | 226 +- .../expression/unary/f32_arithmetic.cache.ts | 13 + .../expression/unary/f32_arithmetic.spec.ts | 18 +- .../expression/unary/f32_conversion.cache.ts | 79 + .../expression/unary/f32_conversion.spec.ts | 113 +- .../expression/unary/i32_arithmetic.cache.ts | 11 + .../expression/unary/i32_arithmetic.spec.ts | 15 +- .../expression/unary/i32_complement.spec.ts | 17 +- .../expression/unary/i32_conversion.cache.ts | 116 + .../expression/unary/i32_conversion.spec.ts | 158 +- .../expression/unary/u32_complement.spec.ts | 17 +- .../expression/unary/u32_conversion.cache.ts | 107 + .../expression/unary/u32_conversion.spec.ts | 144 +- .../shader/execution/expression/unary/unary.ts | 8 +- .../shader/execution/flow_control/call.spec.ts | 113 + .../shader/execution/flow_control/for.spec.ts | 50 + .../shader/execution/flow_control/loop.spec.ts | 60 + .../shader/execution/flow_control/switch.spec.ts | 33 + .../shader/execution/flow_control/while.spec.ts | 54 + .../webgpu/shader/execution/memory_layout.spec.ts | 1059 ++++++ .../shader/execution/memory_model/barrier.spec.ts | 179 +- .../execution/memory_model/memory_model_setup.ts | 341 +- .../texture_intra_invocation_coherence.spec.ts | 333 ++ .../webgpu/shader/execution/robust_access.spec.ts | 30 +- .../shader/execution/robust_access_vertex.spec.ts | 1 + .../execution/shader_io/compute_builtins.spec.ts | 175 +- .../execution/shader_io/fragment_builtins.spec.ts | 1410 ++++++++ .../shader/execution/shader_io/user_io.spec.ts | 213 ++ .../execution/shader_io/workgroup_size.spec.ts | 150 + .../src/webgpu/shader/execution/stage.spec.ts | 133 + .../shader/execution/statement/compound.spec.ts | 137 + .../shader/execution/statement/discard.spec.ts | 645 ++++ .../src/webgpu/shader/execution/zero_init.spec.ts | 4 + .../tests/cts/checkout/src/webgpu/shader/types.ts | 206 +- .../validation/const_assert/const_assert.spec.ts | 20 +- .../validation/decl/compound_statement.spec.ts | 98 + .../webgpu/shader/validation/decl/const.spec.ts | 158 + .../decl/context_dependent_resolution.spec.ts | 338 ++ .../src/webgpu/shader/validation/decl/let.spec.ts | 180 + .../webgpu/shader/validation/decl/override.spec.ts | 178 + .../src/webgpu/shader/validation/decl/var.spec.ts | 529 +++ .../validation/expression/access/vector.spec.ts | 3 +- .../expression/binary/add_sub_mul.spec.ts | 320 ++ .../expression/binary/and_or_xor.spec.ts | 182 + .../expression/binary/bitwise_shift.spec.ts | 182 +- .../expression/binary/comparison.spec.ts | 186 ++ .../validation/expression/binary/div_rem.spec.ts | 279 ++ .../validation/expression/call/builtin/abs.spec.ts | 114 +- .../expression/call/builtin/acos.spec.ts | 162 +- .../expression/call/builtin/acosh.spec.ts | 158 +- .../validation/expression/call/builtin/all.spec.ts | 191 ++ .../validation/expression/call/builtin/any.spec.ts | 191 ++ .../expression/call/builtin/arrayLength.spec.ts | 109 + .../expression/call/builtin/asin.spec.ts | 161 +- .../expression/call/builtin/asinh.spec.ts | 153 +- .../expression/call/builtin/atan.spec.ts | 146 +- .../expression/call/builtin/atan2.spec.ts | 293 +- .../expression/call/builtin/atanh.spec.ts | 169 +- .../expression/call/builtin/atomics.spec.ts | 235 +- .../expression/call/builtin/barriers.spec.ts | 109 + .../expression/call/builtin/ceil.spec.ts | 18 +- .../expression/call/builtin/clamp.spec.ts | 14 +- .../call/builtin/const_override_validation.ts | 292 +- .../validation/expression/call/builtin/cos.spec.ts | 59 +- .../expression/call/builtin/cosh.spec.ts | 66 +- .../call/builtin/countLeadingZeros.spec.ts | 198 ++ .../expression/call/builtin/countOneBits.spec.ts | 198 ++ .../call/builtin/countTrailingZeros.spec.ts | 198 ++ .../expression/call/builtin/cross.spec.ts | 122 + .../expression/call/builtin/degrees.spec.ts | 56 +- .../expression/call/builtin/derivatives.spec.ts | 129 + .../expression/call/builtin/determinant.spec.ts | 95 + .../expression/call/builtin/distance.spec.ts | 149 + .../expression/call/builtin/dot4I8Packed.spec.ts | 66 + .../expression/call/builtin/dot4U8Packed.spec.ts | 66 + .../validation/expression/call/builtin/exp.spec.ts | 122 +- .../expression/call/builtin/exp2.spec.ts | 122 +- .../expression/call/builtin/extractBits.spec.ts | 218 ++ .../expression/call/builtin/faceForward.spec.ts | 152 + .../call/builtin/firstLeadingBit.spec.ts | 198 ++ .../call/builtin/firstTrailingBit.spec.ts | 198 ++ .../expression/call/builtin/floor.spec.ts | 108 + .../expression/call/builtin/fract.spec.ts | 94 + .../expression/call/builtin/frexp.spec.ts | 94 + .../expression/call/builtin/insertBits.spec.ts | 241 ++ .../expression/call/builtin/inverseSqrt.spec.ts | 76 +- .../expression/call/builtin/length.spec.ts | 58 +- .../validation/expression/call/builtin/log.spec.ts | 50 +- .../expression/call/builtin/log2.spec.ts | 50 +- .../validation/expression/call/builtin/max.spec.ts | 91 + .../validation/expression/call/builtin/min.spec.ts | 91 + .../expression/call/builtin/modf.spec.ts | 17 +- .../expression/call/builtin/normalize.spec.ts | 146 + .../expression/call/builtin/pack2x16snorm.spec.ts | 58 + .../expression/call/builtin/pack2x16unorm.spec.ts | 58 + .../expression/call/builtin/pack4x8snorm.spec.ts | 58 + .../expression/call/builtin/pack4x8unorm.spec.ts | 58 + .../expression/call/builtin/pack4xI8.spec.ts | 62 + .../expression/call/builtin/pack4xI8Clamp.spec.ts | 62 + .../expression/call/builtin/pack4xU8.spec.ts | 62 + .../expression/call/builtin/pack4xU8Clamp.spec.ts | 62 + .../expression/call/builtin/quantizeToF16.spec.ts | 113 + .../expression/call/builtin/radians.spec.ts | 50 +- .../expression/call/builtin/reflect.spec.ts | 131 + .../expression/call/builtin/reverseBits.spec.ts | 198 ++ .../expression/call/builtin/round.spec.ts | 31 +- .../expression/call/builtin/saturate.spec.ts | 17 +- .../expression/call/builtin/select.spec.ts | 250 ++ .../expression/call/builtin/shader_stage_utils.ts | 64 + .../expression/call/builtin/sign.spec.ts | 63 +- .../validation/expression/call/builtin/sin.spec.ts | 60 +- .../expression/call/builtin/sinh.spec.ts | 66 +- .../expression/call/builtin/smoothstep.spec.ts | 241 ++ .../expression/call/builtin/sqrt.spec.ts | 66 +- .../expression/call/builtin/step.spec.ts | 108 + .../validation/expression/call/builtin/tan.spec.ts | 76 +- .../expression/call/builtin/tanh.spec.ts | 98 + .../expression/call/builtin/textureGather.spec.ts | 335 ++ .../call/builtin/textureGatherCompare.spec.ts | 264 ++ .../expression/call/builtin/textureLoad.spec.ts | 370 +++ .../expression/call/builtin/textureSample.spec.ts | 267 ++ .../builtin/textureSampleBaseClampToEdge.spec.ts | 54 + .../call/builtin/textureSampleBias.spec.ts | 309 ++ .../call/builtin/textureSampleCompare.spec.ts | 308 ++ .../call/builtin/textureSampleCompareLevel.spec.ts | 268 ++ .../call/builtin/textureSampleGrad.spec.ts | 317 ++ .../call/builtin/textureSampleLevel.spec.ts | 282 ++ .../expression/call/builtin/textureStore.spec.ts | 168 + .../expression/call/builtin/trunc.spec.ts | 94 + .../call/builtin/unpack2x16float.spec.ts | 62 + .../call/builtin/unpack2x16snorm.spec.ts | 62 + .../call/builtin/unpack2x16unorm.spec.ts | 62 + .../expression/call/builtin/unpack4x8snorm.spec.ts | 62 + .../expression/call/builtin/unpack4x8unorm.spec.ts | 62 + .../expression/call/builtin/unpack4xI8.spec.ts | 61 + .../expression/call/builtin/unpack4xU8.spec.ts | 61 + .../call/builtin/workgroupUniformLoad.spec.ts | 122 + .../expression/overload_resolution.spec.ts | 268 ++ .../validation/expression/precedence.spec.ts | 188 ++ .../unary/address_of_and_indirection.spec.ts | 243 ++ .../expression/unary/arithmetic_negation.spec.ts | 114 + .../expression/unary/bitwise_complement.spec.ts | 114 + .../expression/unary/logical_negation.spec.ts | 114 + .../extension/pointer_composite_access.spec.ts | 130 + ...readonly_and_readwrite_storage_textures.spec.ts | 48 + .../validation/functions/alias_analysis.spec.ts | 545 ++- .../validation/functions/restrictions.spec.ts | 313 +- .../webgpu/shader/validation/parse/break.spec.ts | 4 - .../shader/validation/parse/break_if.spec.ts | 141 + .../shader/validation/parse/compound.spec.ts | 52 + .../shader/validation/parse/continuing.spec.ts | 185 ++ .../shader/validation/parse/diagnostic.spec.ts | 260 ++ .../webgpu/shader/validation/parse/enable.spec.ts | 18 +- .../shader/validation/parse/must_use.spec.ts | 63 +- .../shader/validation/parse/pipeline_stage.spec.ts | 42 +- .../shader/validation/parse/requires.spec.ts | 103 + .../shader/validation/parse/semicolon.spec.ts | 15 + .../validation/parse/shadow_builtins.spec.ts | 995 ++++++ .../validation/parse/statement_behavior.spec.ts | 143 + .../shader/validation/shader_io/binding.spec.ts | 14 - .../shader/validation/shader_io/builtins.spec.ts | 4 +- .../shader/validation/shader_io/group.spec.ts | 14 - .../validation/shader_io/group_and_binding.spec.ts | 4 +- .../shader_io/layout_constraints.spec.ts | 543 +++ .../shader/validation/shader_io/locations.spec.ts | 149 + .../shader/validation/shader_io/size.spec.ts | 20 +- .../webgpu/shader/validation/types/alias.spec.ts | 122 + .../webgpu/shader/validation/types/array.spec.ts | 122 + .../webgpu/shader/validation/types/atomics.spec.ts | 145 + .../webgpu/shader/validation/types/matrix.spec.ts | 152 + .../shader/validation/types/textures.spec.ts | 170 + .../validation/uniformity/uniformity.spec.ts | 209 +- .../cts/checkout/src/webgpu/util/binary_stream.ts | 10 + .../cts/checkout/src/webgpu/util/check_contents.ts | 38 +- .../src/webgpu/util/color_space_conversion.ts | 32 +- .../tests/cts/checkout/src/webgpu/util/compare.ts | 32 +- .../cts/checkout/src/webgpu/util/constants.ts | 15 + .../cts/checkout/src/webgpu/util/conversion.ts | 1752 +++++++--- .../cts/checkout/src/webgpu/util/device_pool.ts | 12 +- .../cts/checkout/src/webgpu/util/floating_point.ts | 601 ++-- .../tests/cts/checkout/src/webgpu/util/math.ts | 465 ++- .../checkout/src/webgpu/util/pretty_diff_tables.ts | 37 +- .../tests/cts/checkout/src/webgpu/util/shader.ts | 25 +- .../cts/checkout/src/webgpu/util/texture/base.ts | 44 +- .../util/texture/color_space_conversions.spec.ts | 108 + .../src/webgpu/util/texture/texel_data.spec.ts | 16 +- .../checkout/src/webgpu/util/texture/texel_data.ts | 50 +- .../checkout/src/webgpu/util/texture/texel_view.ts | 17 +- .../checkout/src/webgpu/util/texture/texture_ok.ts | 20 +- .../webgpu/web_platform/canvas/configure.spec.ts | 5 +- .../web_platform/canvas/getCurrentTexture.spec.ts | 75 +- .../canvas/readbackFromWebGPUCanvas.spec.ts | 155 +- .../web_platform/copyToTexture/canvas.spec.ts | 6 +- .../web_platform/copyToTexture/video.spec.ts | 86 +- .../web_platform/external_texture/video.spec.ts | 349 +- .../canvas_colorspace_bgra8unorm.https.html | 1 + .../canvas_colorspace_rgba16float.https.html | 2 +- .../canvas_colorspace_rgba8unorm.https.html | 1 + ..._alpha_bgra8unorm_premultiplied_copy.https.html | 2 +- ..._alpha_bgra8unorm_premultiplied_draw.https.html | 2 +- ...alpha_rgba16float_premultiplied_copy.https.html | 2 +- ...alpha_rgba16float_premultiplied_draw.https.html | 2 +- ..._alpha_rgba8unorm_premultiplied_copy.https.html | 2 +- ..._alpha_rgba8unorm_premultiplied_draw.https.html | 2 +- .../reftests/canvas_image_rendering.https.html | 12 +- .../reftests/delay_get_texture.html.ts | 46 + .../reftests/delay_get_texture.https.html | 10 + .../reftests/ref/canvas_image_rendering-ref.html | 12 +- .../reftests/ref/delay_get_texture-ref.html | 17 + .../cts/checkout/src/webgpu/web_platform/util.ts | 430 ++- .../src/webgpu/web_platform/worker/worker.spec.ts | 72 +- .../src/webgpu/web_platform/worker/worker.ts | 20 +- .../webgpu/web_platform/worker/worker_launcher.ts | 59 +- dom/webgpu/tests/cts/checkout/tools/gen_listings | 7 - .../cts/checkout/tools/gen_listings_and_webworkers | 8 + dom/webgpu/tests/cts/checkout/tools/gen_version | 13 +- .../checkout/tools/gen_wpt_cfg_chunked2sec.json | 1 + .../cts/checkout/tools/gen_wpt_cfg_unchunked.json | 1 + dom/webgpu/tests/cts/checkout/tools/server | 6 + dom/webgpu/tests/cts/checkout_commit.txt | 2 +- dom/webgpu/tests/cts/vendor/Cargo.lock | 106 +- dom/webgpu/tests/cts/vendor/Cargo.toml | 2 + dom/webgpu/tests/cts/vendor/src/fs.rs | 33 +- dom/webgpu/tests/cts/vendor/src/main.rs | 49 +- 784 files changed, 57765 insertions(+), 17620 deletions(-) create mode 100644 dom/webgpu/tests/cts/checkout/docs/case_cache.md create mode 100644 dom/webgpu/tests/cts/checkout/src/common/runtime/helper/utils_worker.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/common/runtime/helper/wrap_for_worker.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/common/tools/gen_listings_and_webworkers.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/common/util/crc32.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/common/util/parse_imports.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/hashes.json create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/abs.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/acos.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/acosh.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/asin.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/asinh.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/atan.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/atan2.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/atanh.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_addition.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_division.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_logical.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_matrix_addition.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_matrix_matrix_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_matrix_scalar_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_matrix_subtraction.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_matrix_vector_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_remainder.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/af_subtraction.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/ai_arithmetic.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_addition.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_division.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_logical.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_matrix_addition.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_matrix_matrix_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_matrix_scalar_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_matrix_subtraction.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_matrix_vector_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_remainder.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f16_subtraction.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_addition.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_division.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_logical.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_matrix_addition.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_matrix_matrix_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_matrix_scalar_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_matrix_subtraction.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_matrix_vector_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_multiplication.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_remainder.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/f32_subtraction.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/i32_arithmetic.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/i32_comparison.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/u32_arithmetic.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/binary/u32_comparison.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/bitcast.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/ceil.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/clamp.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/cos.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/cosh.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/cross.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/degrees.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/derivatives.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/determinant.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/distance.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/dot.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/exp.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/exp2.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/faceForward.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/floor.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/fma.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/fract.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/frexp.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/inverseSqrt.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/ldexp.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/length.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/log.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/log2.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/max.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/min.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/mix.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/modf.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/normalize.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/pack2x16float.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/pow.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/quantizeToF16.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/radians.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/reflect.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/refract.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/round.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/saturate.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/sign.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/sin.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/sinh.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/smoothstep.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/sqrt.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/step.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/tan.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/tanh.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/transpose.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/trunc.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/af_arithmetic.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/af_assignment.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/ai_arithmetic.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/ai_assignment.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/bool_conversion.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/f16_arithmetic.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/f16_conversion.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/f32_arithmetic.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/f32_conversion.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/i32_arithmetic.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/i32_conversion.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unary/u32_conversion.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unpack2x16float.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unpack2x16snorm.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unpack2x16unorm.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unpack4x8snorm.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/cache/webgpu/shader/execution/unpack4x8unorm.bin create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-h264-bt601-hflip.mp4 create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-h264-bt601-vflip.mp4 delete mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-theora-bt601.ogv create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-vp9-bt601-hflip.mp4 create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-vp9-bt601-rotate-180.mp4 create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-vp9-bt601-rotate-270.mp4 create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-vp9-bt601-rotate-90.mp4 create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-vp9-bt601-vflip.mp4 create mode 100644 dom/webgpu/tests/cts/checkout/src/resources/four-colors-vp9-bt601.mp4 create mode 100644 dom/webgpu/tests/cts/checkout/src/unittests/crc32.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/unittests/parse_imports.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/api/operation/memory_sync/texture/readonly_depth_stencil.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/api/operation/rendering/3d_texture_slices.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/api/operation/resource_init/check_texture/texture_zero_init_test.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/api/operation/storage_texture/read_only.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/api/operation/storage_texture/read_write.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/capability_checks/limits/maxBindGroupsPlusVertexBuffers.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/render_pipeline/resource_compatibility.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/api/validation/utils.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/createBindGroup.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/createBindGroupLayout.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/encoding/cmds/copyTextureToTexture.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/compat/api/validation/render_pipeline/depth_stencil_state.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/idl/constructable.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/multisample_info.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/print_environment.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/access/array/index.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/access/matrix/index.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/access/structure/index.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/access/vector/components.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/access/vector/index.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_addition.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_comparison.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_division.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_matrix_addition.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_matrix_matrix_multiplication.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_matrix_scalar_multiplication.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_matrix_subtraction.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_matrix_vector_multiplication.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_remainder.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/af_subtraction.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/ai_arithmetic.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/ai_arithmetic.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/ai_comparison.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_addition.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_comparison.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_division.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_matrix_addition.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_matrix_matrix_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_matrix_scalar_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_matrix_subtraction.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_matrix_vector_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_remainder.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f16_subtraction.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_addition.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_comparison.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_division.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_matrix_addition.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_matrix_matrix_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_matrix_scalar_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_matrix_subtraction.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_matrix_vector_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_multiplication.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_remainder.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/f32_subtraction.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/i32_arithmetic.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/i32_comparison.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/u32_arithmetic.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/binary/u32_comparison.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/abs.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/acos.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/acosh.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/asin.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/asinh.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/atan.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/atan2.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/atanh.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/bitcast.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/ceil.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/clamp.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/cos.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/cosh.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/cross.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/degrees.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/derivatives.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/derivatives.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/determinant.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/distance.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/dot.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/dot4I8Packed.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/dot4U8Packed.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/exp.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/exp2.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/faceForward.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/floor.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/fma.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/fract.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/frexp.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/inversesqrt.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/ldexp.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/length.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/log.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/log2.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/max.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/min.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/mix.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/modf.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/normalize.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/pack2x16float.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/pack4xI8.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/pack4xI8Clamp.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/pack4xU8.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/pack4xU8Clamp.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/pow.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/quantizeToF16.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/radians.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/reflect.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/refract.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/round.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/saturate.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/sign.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/sin.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/sinh.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/smoothstep.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/sqrt.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/step.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/tan.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/tanh.cache.ts delete mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/textureDimension.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/textureDimensions.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/texture_utils.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/transpose.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/trunc.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/unpack2x16float.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/unpack2x16snorm.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/unpack2x16unorm.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/unpack4x8snorm.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/unpack4x8unorm.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/unpack4xI8.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/unpack4xU8.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/builtin/workgroupUniformLoad.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/call/user/ptr_params.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/case.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/constructor/non_zero.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/constructor/zero_value.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/expectation.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/interval_filter.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/precedence.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/address_of_and_indirection.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/af_arithmetic.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/af_assignment.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/ai_arithmetic.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/ai_arithmetic.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/ai_assignment.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/ai_assignment.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/ai_complement.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/bool_conversion.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/f16_arithmetic.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/f16_conversion.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/f32_arithmetic.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/f32_conversion.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/i32_arithmetic.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/i32_conversion.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/expression/unary/u32_conversion.cache.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/memory_layout.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/memory_model/texture_intra_invocation_coherence.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/shader_io/fragment_builtins.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/shader_io/user_io.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/shader_io/workgroup_size.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/stage.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/statement/compound.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/execution/statement/discard.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/compound_statement.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/context_dependent_resolution.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/let.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/decl/var.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/binary/add_sub_mul.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/binary/and_or_xor.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/binary/comparison.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/binary/div_rem.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/all.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/any.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/arrayLength.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/barriers.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/countLeadingZeros.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/countOneBits.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/countTrailingZeros.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/cross.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/derivatives.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/determinant.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/distance.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/dot4I8Packed.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/dot4U8Packed.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/extractBits.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/faceForward.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/firstLeadingBit.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/firstTrailingBit.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/floor.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/fract.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/frexp.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/insertBits.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/max.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/min.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/normalize.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/pack2x16snorm.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/pack2x16unorm.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/pack4x8snorm.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/pack4x8unorm.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/pack4xI8.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/pack4xI8Clamp.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/pack4xU8.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/pack4xU8Clamp.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/quantizeToF16.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/reflect.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/reverseBits.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/select.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/shader_stage_utils.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/smoothstep.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/step.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/tanh.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureGather.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureGatherCompare.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureLoad.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureSample.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureSampleBaseClampToEdge.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureSampleBias.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompare.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureSampleCompareLevel.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureSampleGrad.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureSampleLevel.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/textureStore.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/trunc.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/unpack2x16float.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/unpack2x16snorm.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/unpack2x16unorm.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/unpack4x8snorm.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/unpack4x8unorm.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/unpack4xI8.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/unpack4xU8.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/call/builtin/workgroupUniformLoad.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/overload_resolution.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/precedence.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/unary/address_of_and_indirection.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/unary/arithmetic_negation.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/unary/bitwise_complement.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/expression/unary/logical_negation.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/extension/pointer_composite_access.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/extension/readonly_and_readwrite_storage_textures.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/break_if.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/compound.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/continuing.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/requires.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/shadow_builtins.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/parse/statement_behavior.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/shader_io/layout_constraints.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/array.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/atomics.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/matrix.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/shader/validation/types/textures.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/util/texture/color_space_conversions.spec.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/web_platform/reftests/delay_get_texture.html.ts create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/web_platform/reftests/delay_get_texture.https.html create mode 100644 dom/webgpu/tests/cts/checkout/src/webgpu/web_platform/reftests/ref/delay_get_texture-ref.html delete mode 100755 dom/webgpu/tests/cts/checkout/tools/gen_listings create mode 100644 dom/webgpu/tests/cts/checkout/tools/gen_listings_and_webworkers create mode 100644 dom/webgpu/tests/cts/checkout/tools/server (limited to 'dom/webgpu') diff --git a/dom/webgpu/Adapter.h b/dom/webgpu/Adapter.h index 4156588e8e..1daede6119 100644 --- a/dom/webgpu/Adapter.h +++ b/dom/webgpu/Adapter.h @@ -11,6 +11,7 @@ #include "mozilla/AlreadyAddRefed.h" #include "mozilla/dom/NonRefcountedDOMObject.h" #include "mozilla/webgpu/WebGPUTypes.h" +#include "mozilla/IntegerPrintfMacros.h" #include "nsPrintfCString.h" #include "nsString.h" #include "ObjectModel.h" diff --git a/dom/webgpu/CanvasContext.cpp b/dom/webgpu/CanvasContext.cpp index 46633d9160..62735d1af5 100644 --- a/dom/webgpu/CanvasContext.cpp +++ b/dom/webgpu/CanvasContext.cpp @@ -204,6 +204,10 @@ RefPtr CanvasContext::GetCurrentTexture(ErrorResult& aRv) { } void CanvasContext::MaybeQueueSwapChainPresent() { + if (!mConfig) { + return; + } + MOZ_ASSERT(mTexture); if (mTexture) { diff --git a/dom/webgpu/ComputePassEncoder.cpp b/dom/webgpu/ComputePassEncoder.cpp index 190bbf00a7..f7b177c77a 100644 --- a/dom/webgpu/ComputePassEncoder.cpp +++ b/dom/webgpu/ComputePassEncoder.cpp @@ -38,65 +38,73 @@ ComputePassEncoder::ComputePassEncoder( CommandEncoder* const aParent, const dom::GPUComputePassDescriptor& aDesc) : ChildOf(aParent), mPass(BeginComputePass(aParent->mId, aDesc)) {} -ComputePassEncoder::~ComputePassEncoder() { +ComputePassEncoder::~ComputePassEncoder() { Cleanup(); } + +void ComputePassEncoder::Cleanup() { if (mValid) { - mValid = false; + End(); } } void ComputePassEncoder::SetBindGroup( uint32_t aSlot, const BindGroup& aBindGroup, const dom::Sequence& aDynamicOffsets) { - if (mValid) { - mUsedBindGroups.AppendElement(&aBindGroup); - ffi::wgpu_recorded_compute_pass_set_bind_group( - mPass.get(), aSlot, aBindGroup.mId, aDynamicOffsets.Elements(), - aDynamicOffsets.Length()); + if (!mValid) { + return; } + mUsedBindGroups.AppendElement(&aBindGroup); + ffi::wgpu_recorded_compute_pass_set_bind_group( + mPass.get(), aSlot, aBindGroup.mId, aDynamicOffsets.Elements(), + aDynamicOffsets.Length()); } void ComputePassEncoder::SetPipeline(const ComputePipeline& aPipeline) { - if (mValid) { - mUsedPipelines.AppendElement(&aPipeline); - ffi::wgpu_recorded_compute_pass_set_pipeline(mPass.get(), aPipeline.mId); + if (!mValid) { + return; } + mUsedPipelines.AppendElement(&aPipeline); + ffi::wgpu_recorded_compute_pass_set_pipeline(mPass.get(), aPipeline.mId); } void ComputePassEncoder::DispatchWorkgroups(uint32_t workgroupCountX, uint32_t workgroupCountY, uint32_t workgroupCountZ) { - if (mValid) { - ffi::wgpu_recorded_compute_pass_dispatch_workgroups( - mPass.get(), workgroupCountX, workgroupCountY, workgroupCountZ); + if (!mValid) { + return; } + ffi::wgpu_recorded_compute_pass_dispatch_workgroups( + mPass.get(), workgroupCountX, workgroupCountY, workgroupCountZ); } void ComputePassEncoder::DispatchWorkgroupsIndirect( const Buffer& aIndirectBuffer, uint64_t aIndirectOffset) { - if (mValid) { - ffi::wgpu_recorded_compute_pass_dispatch_workgroups_indirect( - mPass.get(), aIndirectBuffer.mId, aIndirectOffset); + if (!mValid) { + return; } + ffi::wgpu_recorded_compute_pass_dispatch_workgroups_indirect( + mPass.get(), aIndirectBuffer.mId, aIndirectOffset); } void ComputePassEncoder::PushDebugGroup(const nsAString& aString) { - if (mValid) { - const NS_ConvertUTF16toUTF8 utf8(aString); - ffi::wgpu_recorded_compute_pass_push_debug_group(mPass.get(), utf8.get(), - 0); + if (!mValid) { + return; } + const NS_ConvertUTF16toUTF8 utf8(aString); + ffi::wgpu_recorded_compute_pass_push_debug_group(mPass.get(), utf8.get(), 0); } void ComputePassEncoder::PopDebugGroup() { - if (mValid) { - ffi::wgpu_recorded_compute_pass_pop_debug_group(mPass.get()); + if (!mValid) { + return; } + ffi::wgpu_recorded_compute_pass_pop_debug_group(mPass.get()); } void ComputePassEncoder::InsertDebugMarker(const nsAString& aString) { - if (mValid) { - const NS_ConvertUTF16toUTF8 utf8(aString); - ffi::wgpu_recorded_compute_pass_insert_debug_marker(mPass.get(), utf8.get(), - 0); + if (!mValid) { + return; } + const NS_ConvertUTF16toUTF8 utf8(aString); + ffi::wgpu_recorded_compute_pass_insert_debug_marker(mPass.get(), utf8.get(), + 0); } void ComputePassEncoder::End() { diff --git a/dom/webgpu/ComputePassEncoder.h b/dom/webgpu/ComputePassEncoder.h index 2455822f79..8096b4e07e 100644 --- a/dom/webgpu/ComputePassEncoder.h +++ b/dom/webgpu/ComputePassEncoder.h @@ -41,7 +41,7 @@ class ComputePassEncoder final : public ObjectBase, private: virtual ~ComputePassEncoder(); - void Cleanup() {} + void Cleanup(); std::unique_ptr mPass; diff --git a/dom/webgpu/ComputePipeline.cpp b/dom/webgpu/ComputePipeline.cpp index ecd43289f3..759d8e16db 100644 --- a/dom/webgpu/ComputePipeline.cpp +++ b/dom/webgpu/ComputePipeline.cpp @@ -27,12 +27,16 @@ ComputePipeline::ComputePipeline(Device* const aParent, RawId aId, ComputePipeline::~ComputePipeline() { Cleanup(); } void ComputePipeline::Cleanup() { - if (mValid) { + if (!mValid) { return; } mValid = false; auto bridge = mParent->GetBridge(); + if (!bridge) { + return; + } + if (bridge->CanSend()) { bridge->SendComputePipelineDrop(mId); if (mImplicitPipelineLayoutId) { @@ -54,6 +58,7 @@ void ComputePipeline::Cleanup() { already_AddRefed ComputePipeline::GetBindGroupLayout( uint32_t aIndex) const { auto bridge = mParent->GetBridge(); + MOZ_ASSERT(bridge && bridge->CanSend()); auto* client = bridge->GetClient(); ipc::ByteBuf bb; diff --git a/dom/webgpu/Device.cpp b/dom/webgpu/Device.cpp index a9fd5ee44c..62d302c4d8 100644 --- a/dom/webgpu/Device.cpp +++ b/dom/webgpu/Device.cpp @@ -667,6 +667,8 @@ RawId CreateComputePipelineImpl(PipelineCreationContext* const aContext, ipc::ByteBuf* const aByteBuf) { ffi::WGPUComputePipelineDescriptor desc = {}; nsCString entryPoint; + nsTArray constantKeys; + nsTArray constants; webgpu::StringHelper label(aDesc.mLabel); desc.label = label.Get(); @@ -685,6 +687,21 @@ RawId CreateComputePipelineImpl(PipelineCreationContext* const aContext, } else { desc.stage.entry_point = nullptr; } + if (aDesc.mCompute.mConstants.WasPassed()) { + const auto& descConstants = aDesc.mCompute.mConstants.Value().Entries(); + constantKeys.SetCapacity(descConstants.Length()); + constants.SetCapacity(descConstants.Length()); + for (const auto& entry : descConstants) { + ffi::WGPUConstantEntry constantEntry = {}; + nsCString key = NS_ConvertUTF16toUTF8(entry.mKey); + constantKeys.AppendElement(key); + constantEntry.key = key.get(); + constantEntry.value = entry.mValue; + constants.AppendElement(constantEntry); + } + desc.stage.constants = constants.Elements(); + desc.stage.constants_length = constants.Length(); + } RawId implicit_bgl_ids[WGPUMAX_BIND_GROUPS] = {}; RawId id = ffi::wgpu_client_create_compute_pipeline( @@ -708,6 +725,8 @@ RawId CreateRenderPipelineImpl(PipelineCreationContext* const aContext, nsTArray vertexAttributes; ffi::WGPURenderPipelineDescriptor desc = {}; nsCString vsEntry, fsEntry; + nsTArray vsConstantKeys, fsConstantKeys; + nsTArray vsConstants, fsConstants; ffi::WGPUIndexFormat stripIndexFormat = ffi::WGPUIndexFormat_Uint16; ffi::WGPUFace cullFace = ffi::WGPUFace_Front; ffi::WGPUVertexState vertexState = {}; @@ -735,6 +754,21 @@ RawId CreateRenderPipelineImpl(PipelineCreationContext* const aContext, } else { vertexState.stage.entry_point = nullptr; } + if (stage.mConstants.WasPassed()) { + const auto& descConstants = stage.mConstants.Value().Entries(); + vsConstantKeys.SetCapacity(descConstants.Length()); + vsConstants.SetCapacity(descConstants.Length()); + for (const auto& entry : descConstants) { + ffi::WGPUConstantEntry constantEntry = {}; + nsCString key = NS_ConvertUTF16toUTF8(entry.mKey); + vsConstantKeys.AppendElement(key); + constantEntry.key = key.get(); + constantEntry.value = entry.mValue; + vsConstants.AppendElement(constantEntry); + } + vertexState.stage.constants = vsConstants.Elements(); + vertexState.stage.constants_length = vsConstants.Length(); + } for (const auto& vertex_desc : stage.mBuffers) { ffi::WGPUVertexBufferLayout vb_desc = {}; @@ -775,6 +809,21 @@ RawId CreateRenderPipelineImpl(PipelineCreationContext* const aContext, } else { fragmentState.stage.entry_point = nullptr; } + if (stage.mConstants.WasPassed()) { + const auto& descConstants = stage.mConstants.Value().Entries(); + fsConstantKeys.SetCapacity(descConstants.Length()); + fsConstants.SetCapacity(descConstants.Length()); + for (const auto& entry : descConstants) { + ffi::WGPUConstantEntry constantEntry = {}; + nsCString key = NS_ConvertUTF16toUTF8(entry.mKey); + fsConstantKeys.AppendElement(key); + constantEntry.key = key.get(); + constantEntry.value = entry.mValue; + fsConstants.AppendElement(constantEntry); + } + fragmentState.stage.constants = fsConstants.Elements(); + fragmentState.stage.constants_length = fsConstants.Length(); + } // Note: we pre-collect the blend states into a different array // so that we can have non-stale pointers into it. diff --git a/dom/webgpu/RenderBundleEncoder.cpp b/dom/webgpu/RenderBundleEncoder.cpp index 54ebf12d64..b3b64c01e2 100644 --- a/dom/webgpu/RenderBundleEncoder.cpp +++ b/dom/webgpu/RenderBundleEncoder.cpp @@ -72,7 +72,7 @@ RenderBundleEncoder::RenderBundleEncoder( const dom::GPURenderBundleEncoderDescriptor& aDesc) : ChildOf(aParent), mEncoder(CreateRenderBundleEncoder(aParent->mId, aDesc, aBridge)) { - mValid = mEncoder.get() != nullptr; + mValid = !!mEncoder; } RenderBundleEncoder::~RenderBundleEncoder() { Cleanup(); } @@ -80,100 +80,112 @@ RenderBundleEncoder::~RenderBundleEncoder() { Cleanup(); } void RenderBundleEncoder::Cleanup() { if (mValid) { mValid = false; + mEncoder.release(); } } void RenderBundleEncoder::SetBindGroup( uint32_t aSlot, const BindGroup& aBindGroup, const dom::Sequence& aDynamicOffsets) { - if (mValid) { - mUsedBindGroups.AppendElement(&aBindGroup); - ffi::wgpu_render_bundle_set_bind_group( - mEncoder.get(), aSlot, aBindGroup.mId, aDynamicOffsets.Elements(), - aDynamicOffsets.Length()); + if (!mValid) { + return; } + mUsedBindGroups.AppendElement(&aBindGroup); + ffi::wgpu_render_bundle_set_bind_group(mEncoder.get(), aSlot, aBindGroup.mId, + aDynamicOffsets.Elements(), + aDynamicOffsets.Length()); } void RenderBundleEncoder::SetPipeline(const RenderPipeline& aPipeline) { - if (mValid) { - mUsedPipelines.AppendElement(&aPipeline); - ffi::wgpu_render_bundle_set_pipeline(mEncoder.get(), aPipeline.mId); + if (!mValid) { + return; } + mUsedPipelines.AppendElement(&aPipeline); + ffi::wgpu_render_bundle_set_pipeline(mEncoder.get(), aPipeline.mId); } void RenderBundleEncoder::SetIndexBuffer( const Buffer& aBuffer, const dom::GPUIndexFormat& aIndexFormat, uint64_t aOffset, uint64_t aSize) { - if (mValid) { - mUsedBuffers.AppendElement(&aBuffer); - const auto iformat = aIndexFormat == dom::GPUIndexFormat::Uint32 - ? ffi::WGPUIndexFormat_Uint32 - : ffi::WGPUIndexFormat_Uint16; - ffi::wgpu_render_bundle_set_index_buffer(mEncoder.get(), aBuffer.mId, - iformat, aOffset, aSize); + if (!mValid) { + return; } + mUsedBuffers.AppendElement(&aBuffer); + const auto iformat = aIndexFormat == dom::GPUIndexFormat::Uint32 + ? ffi::WGPUIndexFormat_Uint32 + : ffi::WGPUIndexFormat_Uint16; + ffi::wgpu_render_bundle_set_index_buffer(mEncoder.get(), aBuffer.mId, iformat, + aOffset, aSize); } void RenderBundleEncoder::SetVertexBuffer(uint32_t aSlot, const Buffer& aBuffer, uint64_t aOffset, uint64_t aSize) { - if (mValid) { - mUsedBuffers.AppendElement(&aBuffer); - ffi::wgpu_render_bundle_set_vertex_buffer(mEncoder.get(), aSlot, - aBuffer.mId, aOffset, aSize); + if (!mValid) { + return; } + mUsedBuffers.AppendElement(&aBuffer); + ffi::wgpu_render_bundle_set_vertex_buffer(mEncoder.get(), aSlot, aBuffer.mId, + aOffset, aSize); } void RenderBundleEncoder::Draw(uint32_t aVertexCount, uint32_t aInstanceCount, uint32_t aFirstVertex, uint32_t aFirstInstance) { - if (mValid) { - ffi::wgpu_render_bundle_draw(mEncoder.get(), aVertexCount, aInstanceCount, - aFirstVertex, aFirstInstance); + if (!mValid) { + return; } + ffi::wgpu_render_bundle_draw(mEncoder.get(), aVertexCount, aInstanceCount, + aFirstVertex, aFirstInstance); } void RenderBundleEncoder::DrawIndexed(uint32_t aIndexCount, uint32_t aInstanceCount, uint32_t aFirstIndex, int32_t aBaseVertex, uint32_t aFirstInstance) { - if (mValid) { - ffi::wgpu_render_bundle_draw_indexed(mEncoder.get(), aIndexCount, - aInstanceCount, aFirstIndex, - aBaseVertex, aFirstInstance); + if (!mValid) { + return; } + ffi::wgpu_render_bundle_draw_indexed(mEncoder.get(), aIndexCount, + aInstanceCount, aFirstIndex, aBaseVertex, + aFirstInstance); } void RenderBundleEncoder::DrawIndirect(const Buffer& aIndirectBuffer, uint64_t aIndirectOffset) { - if (mValid) { - ffi::wgpu_render_bundle_draw_indirect(mEncoder.get(), aIndirectBuffer.mId, - aIndirectOffset); + if (!mValid) { + return; } + ffi::wgpu_render_bundle_draw_indirect(mEncoder.get(), aIndirectBuffer.mId, + aIndirectOffset); } void RenderBundleEncoder::DrawIndexedIndirect(const Buffer& aIndirectBuffer, uint64_t aIndirectOffset) { - if (mValid) { - ffi::wgpu_render_bundle_draw_indexed_indirect( - mEncoder.get(), aIndirectBuffer.mId, aIndirectOffset); + if (!mValid) { + return; } + ffi::wgpu_render_bundle_draw_indexed_indirect( + mEncoder.get(), aIndirectBuffer.mId, aIndirectOffset); } void RenderBundleEncoder::PushDebugGroup(const nsAString& aString) { - if (mValid) { - const NS_ConvertUTF16toUTF8 utf8(aString); - ffi::wgpu_render_bundle_push_debug_group(mEncoder.get(), utf8.get()); + if (!mValid) { + return; } + const NS_ConvertUTF16toUTF8 utf8(aString); + ffi::wgpu_render_bundle_push_debug_group(mEncoder.get(), utf8.get()); } void RenderBundleEncoder::PopDebugGroup() { - if (mValid) { - ffi::wgpu_render_bundle_pop_debug_group(mEncoder.get()); + if (!mValid) { + return; } + ffi::wgpu_render_bundle_pop_debug_group(mEncoder.get()); } void RenderBundleEncoder::InsertDebugMarker(const nsAString& aString) { - if (mValid) { - const NS_ConvertUTF16toUTF8 utf8(aString); - ffi::wgpu_render_bundle_insert_debug_marker(mEncoder.get(), utf8.get()); + if (!mValid) { + return; } + const NS_ConvertUTF16toUTF8 utf8(aString); + ffi::wgpu_render_bundle_insert_debug_marker(mEncoder.get(), utf8.get()); } already_AddRefed RenderBundleEncoder::Finish( @@ -189,11 +201,8 @@ already_AddRefed RenderBundleEncoder::Finish( ipc::ByteBuf bb; RawId id; if (mValid) { - mValid = false; - - auto* encoder = mEncoder.release(); - id = ffi::wgpu_client_create_render_bundle(bridge->GetClient(), encoder, - deviceId, &desc, ToFFI(&bb)); + id = ffi::wgpu_client_create_render_bundle( + bridge->GetClient(), mEncoder.get(), deviceId, &desc, ToFFI(&bb)); } else { id = ffi::wgpu_client_create_render_bundle_error( @@ -204,6 +213,8 @@ already_AddRefed RenderBundleEncoder::Finish( bridge->SendDeviceAction(deviceId, std::move(bb)); } + Cleanup(); + RefPtr bundle = new RenderBundle(mParent, id); return bundle.forget(); } diff --git a/dom/webgpu/RenderBundleEncoder.h b/dom/webgpu/RenderBundleEncoder.h index d21a26b833..f8619953b8 100644 --- a/dom/webgpu/RenderBundleEncoder.h +++ b/dom/webgpu/RenderBundleEncoder.h @@ -33,7 +33,9 @@ class RenderBundleEncoder final : public ObjectBase, public ChildOf { ~RenderBundleEncoder(); void Cleanup(); - std::unique_ptr mEncoder; + std::unique_ptr + mEncoder; // keep all the used objects alive while the encoder is finished nsTArray> mUsedBindGroups; nsTArray> mUsedBuffers; diff --git a/dom/webgpu/RenderPassEncoder.cpp b/dom/webgpu/RenderPassEncoder.cpp index 03c16ea3a4..f658df1b8b 100644 --- a/dom/webgpu/RenderPassEncoder.cpp +++ b/dom/webgpu/RenderPassEncoder.cpp @@ -157,8 +157,8 @@ ffi::WGPURecordedRenderPass* BeginRenderPass( RenderPassEncoder::RenderPassEncoder(CommandEncoder* const aParent, const dom::GPURenderPassDescriptor& aDesc) : ChildOf(aParent), mPass(BeginRenderPass(aParent, aDesc)) { - if (!mPass) { - mValid = false; + mValid = !!mPass; + if (!mValid) { return; } @@ -171,149 +171,165 @@ RenderPassEncoder::RenderPassEncoder(CommandEncoder* const aParent, } } -RenderPassEncoder::~RenderPassEncoder() { +RenderPassEncoder::~RenderPassEncoder() { Cleanup(); } + +void RenderPassEncoder::Cleanup() { if (mValid) { - mValid = false; + End(); } } void RenderPassEncoder::SetBindGroup( uint32_t aSlot, const BindGroup& aBindGroup, const dom::Sequence& aDynamicOffsets) { - if (mValid) { - mUsedBindGroups.AppendElement(&aBindGroup); - ffi::wgpu_recorded_render_pass_set_bind_group( - mPass.get(), aSlot, aBindGroup.mId, aDynamicOffsets.Elements(), - aDynamicOffsets.Length()); + if (!mValid) { + return; } + mUsedBindGroups.AppendElement(&aBindGroup); + ffi::wgpu_recorded_render_pass_set_bind_group( + mPass.get(), aSlot, aBindGroup.mId, aDynamicOffsets.Elements(), + aDynamicOffsets.Length()); } void RenderPassEncoder::SetPipeline(const RenderPipeline& aPipeline) { - if (mValid) { - mUsedPipelines.AppendElement(&aPipeline); - ffi::wgpu_recorded_render_pass_set_pipeline(mPass.get(), aPipeline.mId); + if (!mValid) { + return; } + mUsedPipelines.AppendElement(&aPipeline); + ffi::wgpu_recorded_render_pass_set_pipeline(mPass.get(), aPipeline.mId); } void RenderPassEncoder::SetIndexBuffer(const Buffer& aBuffer, const dom::GPUIndexFormat& aIndexFormat, uint64_t aOffset, uint64_t aSize) { - if (mValid) { - mUsedBuffers.AppendElement(&aBuffer); - const auto iformat = aIndexFormat == dom::GPUIndexFormat::Uint32 - ? ffi::WGPUIndexFormat_Uint32 - : ffi::WGPUIndexFormat_Uint16; - ffi::wgpu_recorded_render_pass_set_index_buffer(mPass.get(), aBuffer.mId, - iformat, aOffset, aSize); + if (!mValid) { + return; } + mUsedBuffers.AppendElement(&aBuffer); + const auto iformat = aIndexFormat == dom::GPUIndexFormat::Uint32 + ? ffi::WGPUIndexFormat_Uint32 + : ffi::WGPUIndexFormat_Uint16; + ffi::wgpu_recorded_render_pass_set_index_buffer(mPass.get(), aBuffer.mId, + iformat, aOffset, aSize); } void RenderPassEncoder::SetVertexBuffer(uint32_t aSlot, const Buffer& aBuffer, uint64_t aOffset, uint64_t aSize) { - if (mValid) { - mUsedBuffers.AppendElement(&aBuffer); - ffi::wgpu_recorded_render_pass_set_vertex_buffer( - mPass.get(), aSlot, aBuffer.mId, aOffset, aSize); + if (!mValid) { + return; } + mUsedBuffers.AppendElement(&aBuffer); + ffi::wgpu_recorded_render_pass_set_vertex_buffer(mPass.get(), aSlot, + aBuffer.mId, aOffset, aSize); } void RenderPassEncoder::Draw(uint32_t aVertexCount, uint32_t aInstanceCount, uint32_t aFirstVertex, uint32_t aFirstInstance) { - if (mValid) { - ffi::wgpu_recorded_render_pass_draw(mPass.get(), aVertexCount, - aInstanceCount, aFirstVertex, - aFirstInstance); + if (!mValid) { + return; } + ffi::wgpu_recorded_render_pass_draw(mPass.get(), aVertexCount, aInstanceCount, + aFirstVertex, aFirstInstance); } void RenderPassEncoder::DrawIndexed(uint32_t aIndexCount, uint32_t aInstanceCount, uint32_t aFirstIndex, int32_t aBaseVertex, uint32_t aFirstInstance) { - if (mValid) { - ffi::wgpu_recorded_render_pass_draw_indexed(mPass.get(), aIndexCount, - aInstanceCount, aFirstIndex, - aBaseVertex, aFirstInstance); + if (!mValid) { + return; } + ffi::wgpu_recorded_render_pass_draw_indexed(mPass.get(), aIndexCount, + aInstanceCount, aFirstIndex, + aBaseVertex, aFirstInstance); } void RenderPassEncoder::DrawIndirect(const Buffer& aIndirectBuffer, uint64_t aIndirectOffset) { - if (mValid) { - ffi::wgpu_recorded_render_pass_draw_indirect( - mPass.get(), aIndirectBuffer.mId, aIndirectOffset); + if (!mValid) { + return; } + ffi::wgpu_recorded_render_pass_draw_indirect(mPass.get(), aIndirectBuffer.mId, + aIndirectOffset); } void RenderPassEncoder::DrawIndexedIndirect(const Buffer& aIndirectBuffer, uint64_t aIndirectOffset) { - if (mValid) { - ffi::wgpu_recorded_render_pass_draw_indexed_indirect( - mPass.get(), aIndirectBuffer.mId, aIndirectOffset); + if (!mValid) { + return; } + ffi::wgpu_recorded_render_pass_draw_indexed_indirect( + mPass.get(), aIndirectBuffer.mId, aIndirectOffset); } void RenderPassEncoder::SetViewport(float x, float y, float width, float height, float minDepth, float maxDepth) { - if (mValid) { - ffi::wgpu_recorded_render_pass_set_viewport(mPass.get(), x, y, width, - height, minDepth, maxDepth); + if (!mValid) { + return; } + ffi::wgpu_recorded_render_pass_set_viewport(mPass.get(), x, y, width, height, + minDepth, maxDepth); } void RenderPassEncoder::SetScissorRect(uint32_t x, uint32_t y, uint32_t width, uint32_t height) { - if (mValid) { - ffi::wgpu_recorded_render_pass_set_scissor_rect(mPass.get(), x, y, width, - height); + if (!mValid) { + return; } + ffi::wgpu_recorded_render_pass_set_scissor_rect(mPass.get(), x, y, width, + height); } void RenderPassEncoder::SetBlendConstant( const dom::DoubleSequenceOrGPUColorDict& color) { - if (mValid) { - ffi::WGPUColor aColor = ConvertColor(color); - ffi::wgpu_recorded_render_pass_set_blend_constant(mPass.get(), &aColor); + if (!mValid) { + return; } + ffi::WGPUColor aColor = ConvertColor(color); + ffi::wgpu_recorded_render_pass_set_blend_constant(mPass.get(), &aColor); } void RenderPassEncoder::SetStencilReference(uint32_t reference) { - if (mValid) { - ffi::wgpu_recorded_render_pass_set_stencil_reference(mPass.get(), - reference); + if (!mValid) { + return; } + ffi::wgpu_recorded_render_pass_set_stencil_reference(mPass.get(), reference); } void RenderPassEncoder::ExecuteBundles( const dom::Sequence>& aBundles) { - if (mValid) { - nsTArray renderBundles(aBundles.Length()); - for (const auto& bundle : aBundles) { - mUsedRenderBundles.AppendElement(bundle); - renderBundles.AppendElement(bundle->mId); - } - ffi::wgpu_recorded_render_pass_execute_bundles( - mPass.get(), renderBundles.Elements(), renderBundles.Length()); + if (!mValid) { + return; + } + nsTArray renderBundles(aBundles.Length()); + for (const auto& bundle : aBundles) { + mUsedRenderBundles.AppendElement(bundle); + renderBundles.AppendElement(bundle->mId); } + ffi::wgpu_recorded_render_pass_execute_bundles( + mPass.get(), renderBundles.Elements(), renderBundles.Length()); } void RenderPassEncoder::PushDebugGroup(const nsAString& aString) { - if (mValid) { - const NS_ConvertUTF16toUTF8 utf8(aString); - ffi::wgpu_recorded_render_pass_push_debug_group(mPass.get(), utf8.get(), 0); + if (!mValid) { + return; } + const NS_ConvertUTF16toUTF8 utf8(aString); + ffi::wgpu_recorded_render_pass_push_debug_group(mPass.get(), utf8.get(), 0); } void RenderPassEncoder::PopDebugGroup() { - if (mValid) { - ffi::wgpu_recorded_render_pass_pop_debug_group(mPass.get()); + if (!mValid) { + return; } + ffi::wgpu_recorded_render_pass_pop_debug_group(mPass.get()); } void RenderPassEncoder::InsertDebugMarker(const nsAString& aString) { - if (mValid) { - const NS_ConvertUTF16toUTF8 utf8(aString); - ffi::wgpu_recorded_render_pass_insert_debug_marker(mPass.get(), utf8.get(), - 0); + if (!mValid) { + return; } + const NS_ConvertUTF16toUTF8 utf8(aString); + ffi::wgpu_recorded_render_pass_insert_debug_marker(mPass.get(), utf8.get(), + 0); } void RenderPassEncoder::End() { diff --git a/dom/webgpu/RenderPassEncoder.h b/dom/webgpu/RenderPassEncoder.h index b6008bd013..eb96abdcd4 100644 --- a/dom/webgpu/RenderPassEncoder.h +++ b/dom/webgpu/RenderPassEncoder.h @@ -49,7 +49,7 @@ class RenderPassEncoder final : public ObjectBase, protected: virtual ~RenderPassEncoder(); - void Cleanup() {} + void Cleanup(); std::unique_ptr mPass; // keep all the used objects alive while the pass is recorded diff --git a/dom/webgpu/RenderPipeline.cpp b/dom/webgpu/RenderPipeline.cpp index aa9ffcdf9a..a8a0348f9d 100644 --- a/dom/webgpu/RenderPipeline.cpp +++ b/dom/webgpu/RenderPipeline.cpp @@ -58,6 +58,7 @@ void RenderPipeline::Cleanup() { already_AddRefed RenderPipeline::GetBindGroupLayout( uint32_t aIndex) const { auto bridge = mParent->GetBridge(); + MOZ_ASSERT(bridge && bridge->CanSend()); auto* client = bridge->GetClient(); ipc::ByteBuf bb; diff --git a/dom/webgpu/tests/cts/checkout/.github/pull_request_template.md b/dom/webgpu/tests/cts/checkout/.github/pull_request_template.md index 7fadba0fc3..0ee7f37372 100644 --- a/dom/webgpu/tests/cts/checkout/.github/pull_request_template.md +++ b/dom/webgpu/tests/cts/checkout/.github/pull_request_template.md @@ -10,6 +10,7 @@ Issue: # - [ ] All missing test coverage is tracked with "TODO" or `.unimplemented()`. - [ ] New helpers are `/** documented */` and new helper files are found in `helper_index.txt`. - [ ] Test behaves as expected in a WebGPU implementation. (If not passing, explain above.) +- [ ] Test have be tested with compatibility mode validation enabled and behave as expected. (If not passing, explain above.) **Requirements for [reviewer sign-off](https://github.com/gpuweb/cts/blob/main/docs/reviews.md):** diff --git a/dom/webgpu/tests/cts/checkout/.github/workflows/pr.yml b/dom/webgpu/tests/cts/checkout/.github/workflows/pr.yml index a398bf13ac..53144304bb 100644 --- a/dom/webgpu/tests/cts/checkout/.github/workflows/pr.yml +++ b/dom/webgpu/tests/cts/checkout/.github/workflows/pr.yml @@ -4,22 +4,31 @@ on: pull_request: branches: [main] +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - uses: actions/checkout@v3 with: persist-credentials: false - uses: actions/setup-node@v3 with: - node-version: "16.x" + node-version: '16.x' - run: npm ci + - name: validating cache + run: npx grunt run:validate-cache - run: npm test - name: copy out-wpt to wpt tree run: | git clone --depth 2 https://github.com/web-platform-tests/wpt.git rsync -av out-wpt/ wpt/webgpu + - name: adding wpt lint ignore rule for *.bin + run: 'echo "TRAILING WHITESPACE, INDENT TABS, CR AT EOL: *.bin" >> wpt/lint.ignore' - name: test wpt lint run: ./wpt lint working-directory: ./wpt diff --git a/dom/webgpu/tests/cts/checkout/.github/workflows/push.yml b/dom/webgpu/tests/cts/checkout/.github/workflows/push.yml index 6aa7a34e04..f1645e120a 100644 --- a/dom/webgpu/tests/cts/checkout/.github/workflows/push.yml +++ b/dom/webgpu/tests/cts/checkout/.github/workflows/push.yml @@ -4,9 +4,14 @@ on: push: branches: [main] +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest + timeout-minutes: 15 steps: - uses: actions/checkout@v2.3.1 with: diff --git a/dom/webgpu/tests/cts/checkout/.gitignore b/dom/webgpu/tests/cts/checkout/.gitignore index f115ad4f69..6a7a4a913a 100644 --- a/dom/webgpu/tests/cts/checkout/.gitignore +++ b/dom/webgpu/tests/cts/checkout/.gitignore @@ -2,6 +2,7 @@ .vscode/ # Build files +/gen/ /out/ /out-wpt/ /out-node/ diff --git a/dom/webgpu/tests/cts/checkout/Gruntfile.js b/dom/webgpu/tests/cts/checkout/Gruntfile.js index cf2207fcff..eba38704f3 100644 --- a/dom/webgpu/tests/cts/checkout/Gruntfile.js +++ b/dom/webgpu/tests/cts/checkout/Gruntfile.js @@ -3,6 +3,10 @@ /* eslint-disable no-console */ const timer = require('grunt-timer'); +const { spawnSync } = require('child_process'); +const path = require('path'); + +const kAllSuites = ['webgpu', 'stress', 'manual', 'unittests', 'demo']; module.exports = function (grunt) { timer.init(grunt); @@ -12,7 +16,7 @@ module.exports = function (grunt) { pkg: grunt.file.readJSON('package.json'), clean: { - out: ['out/', 'out-wpt/', 'out-node/'], + out: ['gen/', 'out/', 'out-wpt/', 'out-node/'], }, run: { @@ -20,38 +24,38 @@ module.exports = function (grunt) { cmd: 'node', args: ['tools/gen_version'], }, - 'generate-listings': { - // Overwrites the listings.js files in out/. Must run before copy:out-wpt-generated; - // must not run before run:build-out (if it is run). + 'generate-listings-and-webworkers': { cmd: 'node', - args: ['tools/gen_listings', 'out/', 'src/webgpu', 'src/stress', 'src/manual', 'src/unittests', 'src/demo'], + args: ['tools/gen_listings_and_webworkers', 'gen/', ...kAllSuites.map(s => 'src/' + s)], }, validate: { cmd: 'node', - args: ['tools/validate', 'src/webgpu', 'src/stress', 'src/manual', 'src/unittests', 'src/demo'], + args: ['tools/validate', ...kAllSuites.map(s => 'src/' + s)], + }, + 'generate-cache': { + // Note this generates files into the src/ directory (not the gen/ directory). + cmd: 'node', + args: ['tools/gen_cache', 'src/webgpu'], }, 'validate-cache': { cmd: 'node', - args: ['tools/gen_cache', 'out', 'src/webgpu', '--validate'], + args: ['tools/gen_cache', 'src/webgpu', '--validate'], }, - 'generate-wpt-cts-html': { + 'write-out-wpt-cts-html': { + // Note this generates directly into the out-wpt/ directory rather than the gen/ directory. cmd: 'node', args: ['tools/gen_wpt_cts_html', 'tools/gen_wpt_cfg_unchunked.json'], }, - 'generate-wpt-cts-html-chunked2sec': { + 'write-out-wpt-cts-html-chunked2sec': { + // Note this generates directly into the out-wpt/ directory rather than the gen/ directory. cmd: 'node', args: ['tools/gen_wpt_cts_html', 'tools/gen_wpt_cfg_chunked2sec.json'], }, - 'generate-cache': { - cmd: 'node', - args: ['tools/gen_cache', 'out', 'src/webgpu'], - }, unittest: { cmd: 'node', args: ['tools/run_node', 'unittests:*'], }, 'build-out': { - // Must run before run:generate-listings, which will overwrite some files. cmd: 'node', args: [ 'node_modules/@babel/cli/bin/babel', @@ -59,6 +63,9 @@ module.exports = function (grunt) { '--source-maps=true', '--out-dir=out/', 'src/', + // These files will be generated, instead of compiled from TypeScript. + '--ignore=src/common/internal/version.ts', + '--ignore=src/*/listing.ts', ], }, 'build-out-wpt': { @@ -75,7 +82,7 @@ module.exports = function (grunt) { '--only=src/webgpu/', // These files will be generated, instead of compiled from TypeScript. '--ignore=src/common/internal/version.ts', - '--ignore=src/webgpu/listing.ts', + '--ignore=src/*/listing.ts', // These files are only used by non-WPT builds. '--ignore=src/common/runtime/cmdline.ts', '--ignore=src/common/runtime/server.ts', @@ -110,6 +117,15 @@ module.exports = function (grunt) { '--copy-files' ], }, + 'copy-assets-node': { + cmd: 'node', + args: [ + 'node_modules/@babel/cli/bin/babel', + 'src/resources/', + '--out-dir=out-node/resources/', + '--copy-files' + ], + }, lint: { cmd: 'node', args: ['node_modules/eslint/bin/eslint', 'src/**/*.ts', '--max-warnings=0'], @@ -139,34 +155,71 @@ module.exports = function (grunt) { }, copy: { - 'out-wpt-generated': { + 'gen-to-out': { + // Must run after generate-common and run:build-out. + files: [ + { expand: true, dest: 'out/', cwd: 'gen', src: 'common/internal/version.js' }, + { expand: true, dest: 'out/', cwd: 'gen', src: '*/**/*.js' }, + ], + }, + 'gen-to-out-wpt': { + // Must run after generate-common and run:build-out-wpt. files: [ - // Must run after run:generate-version and run:generate-listings. - { expand: true, cwd: 'out', src: 'common/internal/version.js', dest: 'out-wpt/' }, - { expand: true, cwd: 'out', src: 'webgpu/listing.js', dest: 'out-wpt/' }, + { expand: true, dest: 'out-wpt/', cwd: 'gen', src: 'common/internal/version.js' }, + { expand: true, dest: 'out-wpt/', cwd: 'gen', src: 'webgpu/**/*.js' }, ], }, - 'out-wpt-htmlfiles': { + 'htmlfiles-to-out': { + // Must run after run:build-out. files: [ - { expand: true, cwd: 'src', src: 'webgpu/**/*.html', dest: 'out-wpt/' }, + { expand: true, dest: 'out/', cwd: 'src', src: 'webgpu/**/*.html' }, + ], + }, + 'htmlfiles-to-out-wpt': { + // Must run after run:build-out-wpt. + files: [ + { expand: true, dest: 'out-wpt/', cwd: 'src', src: 'webgpu/**/*.html' }, ], }, }, - ts: { - check: { - tsconfig: { - tsconfig: 'tsconfig.json', - passThrough: true, - }, + concurrent: { + 'write-out-wpt-cts-html-all': { + tasks: [ + 'run:write-out-wpt-cts-html', + 'run:write-out-wpt-cts-html-chunked2sec', + ], + }, + 'all-builds': { + tasks: [ + 'build-standalone', + 'build-wpt', + 'run:build-out-node', + ], + }, + 'all-checks': { + tasks: [ + 'ts-check', + 'run:validate', + 'run:validate-cache', + 'run:unittest', + 'run:lint', + 'run:tsdoc-treatWarningsAsErrors', + ], + }, + 'all-builds-and-checks': { + tasks: [ + 'build-all', // Internally concurrent + 'concurrent:all-checks', + ], }, }, }); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-copy'); + grunt.loadNpmTasks('grunt-concurrent'); grunt.loadNpmTasks('grunt-run'); - grunt.loadNpmTasks('grunt-ts'); const helpMessageTasks = []; function registerTaskAndAddToHelp(name, desc, deps) { @@ -177,71 +230,96 @@ module.exports = function (grunt) { helpMessageTasks.push({ name, desc }); } - grunt.registerTask('build-standalone', 'Build out/ (no listings, no checks, no WPT)', [ + grunt.registerTask('ts-check', function() { + spawnSync(path.join('node_modules', '.bin', 'tsc'), [ + '--project', + 'tsconfig.json', + '--noEmit', + ], { + shell: true, + stdio: 'inherit', + }); + }); + + grunt.registerTask('generate-common', 'Generate files into gen/ and src/', [ + 'run:generate-version', + 'run:generate-listings-and-webworkers', + 'run:generate-cache', + ]); + grunt.registerTask('build-standalone', 'Build out/ (no checks; run after generate-common)', [ 'run:build-out', 'run:copy-assets', - 'run:generate-version', + 'copy:gen-to-out', + 'copy:htmlfiles-to-out', ]); - grunt.registerTask('build-wpt', 'Build out-wpt/ (no checks; run after generate-listings)', [ + grunt.registerTask('build-wpt', 'Build out-wpt/ (no checks; run after generate-common)', [ 'run:build-out-wpt', 'run:copy-assets-wpt', + 'copy:gen-to-out-wpt', + 'copy:htmlfiles-to-out-wpt', + 'concurrent:write-out-wpt-cts-html-all', 'run:autoformat-out-wpt', - 'run:generate-version', - 'copy:out-wpt-generated', - 'copy:out-wpt-htmlfiles', - 'run:generate-wpt-cts-html', - 'run:generate-wpt-cts-html-chunked2sec', + ]); + grunt.registerTask('build-node', 'Build out-node/ (no checks; run after generate-common)', [ + 'run:build-out-node', + 'run:copy-assets-node', + ]); + grunt.registerTask('build-all', 'Build out*/ (no checks; run after generate-common)', [ + 'concurrent:all-builds', + 'build-done-message', ]); grunt.registerTask('build-done-message', () => { - process.stderr.write('\nBuild completed! Running checks/tests'); + grunt.log.writeln(`\ +===================================================== +==== Build completed! Continuing checks/tests... ==== +=====================================================`); }); - registerTaskAndAddToHelp('pre', 'Run all presubmit checks: standalone+wpt+typecheck+unittest+lint', [ + grunt.registerTask('pre', ['all']); + + registerTaskAndAddToHelp('all', 'Run all builds and checks', [ 'clean', - 'run:validate', - 'run:validate-cache', - 'build-standalone', - 'run:generate-listings', - 'build-wpt', - 'run:build-out-node', - 'build-done-message', - 'ts:check', - 'run:unittest', - 'run:lint', - 'run:tsdoc-treatWarningsAsErrors', + 'generate-common', + 'concurrent:all-builds-and-checks', ]); - registerTaskAndAddToHelp('standalone', 'Build standalone and typecheck', [ + registerTaskAndAddToHelp('standalone', 'Build standalone (out/) (no checks)', [ + 'generate-common', 'build-standalone', - 'run:generate-listings', 'build-done-message', - 'run:validate', - 'ts:check', ]); - registerTaskAndAddToHelp('wpt', 'Build for WPT and typecheck', [ - 'run:generate-listings', + registerTaskAndAddToHelp('wpt', 'Build for WPT (out-wpt/) (no checks)', [ + 'generate-common', 'build-wpt', 'build-done-message', - 'run:validate', - 'ts:check', ]); - registerTaskAndAddToHelp('unittest', 'Build standalone, typecheck, and unittest', [ - 'standalone', + registerTaskAndAddToHelp('node', 'Build node (out-node/) (no checks)', [ + 'generate-common', + 'build-node', + 'build-done-message', + ]); + registerTaskAndAddToHelp('checks', 'Run all checks (and build tsdoc)', [ + 'concurrent:all-checks', + ]); + registerTaskAndAddToHelp('unittest', 'Just run unittests', [ 'run:unittest', ]); - registerTaskAndAddToHelp('check', 'Just typecheck', [ - 'ts:check', + registerTaskAndAddToHelp('typecheck', 'Just typecheck', [ + 'ts-check', + ]); + registerTaskAndAddToHelp('tsdoc', 'Just build tsdoc', [ + 'run:tsdoc', ]); - registerTaskAndAddToHelp('serve', 'Serve out/ on 127.0.0.1:8080 (does NOT compile source)', ['run:serve']); + registerTaskAndAddToHelp('serve', 'Serve out/ (without building anything)', ['run:serve']); registerTaskAndAddToHelp('fix', 'Fix lint and formatting', ['run:fix']); - addExistingTaskToHelp('clean', 'Clean out/ and out-wpt/'); + addExistingTaskToHelp('clean', 'Delete built and generated files'); grunt.registerTask('default', '', () => { - console.error('\nAvailable tasks (see grunt --help for info):'); + console.error('\nRecommended tasks:'); + let nameColumnSize = Math.max(...helpMessageTasks.map(({ name }) => name.length)); for (const { name, desc } of helpMessageTasks) { - console.error(`$ grunt ${name}`); - console.error(` ${desc}`); + console.error(`$ grunt ${name.padEnd(nameColumnSize)} # ${desc}`); } }); }; diff --git a/dom/webgpu/tests/cts/checkout/cts.code-workspace b/dom/webgpu/tests/cts/checkout/cts.code-workspace index 9c7320ce4b..d27f9ccc83 100644 --- a/dom/webgpu/tests/cts/checkout/cts.code-workspace +++ b/dom/webgpu/tests/cts/checkout/cts.code-workspace @@ -10,6 +10,11 @@ "path": "src/webgpu" } ], + "extensions": { + "recommendations": [ + "esbenp.prettier-vscode" + ] + }, "settings": { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.detectIndentation": false, diff --git a/dom/webgpu/tests/cts/checkout/docs/adding_timing_metadata.md b/dom/webgpu/tests/cts/checkout/docs/adding_timing_metadata.md index fe32cead20..e251524177 100644 --- a/dom/webgpu/tests/cts/checkout/docs/adding_timing_metadata.md +++ b/dom/webgpu/tests/cts/checkout/docs/adding_timing_metadata.md @@ -6,14 +6,22 @@ The raw data may be edited manually, to add entries or change timing values. -The **list** of tests must stay up to date, so it can be used by external -tools. This is verified by presubmit checks. +The list of tests in this file is **not** guaranteed to stay up to date. +Use the generated `gen/*_variant_list*.json` if you need a complete list. -The `subcaseMS` values are estimates. They can be set to 0 if for some reason +The `subcaseMS` values are estimates. They can be set to 0 or omitted if for some reason you can't estimate the time (or there's an existing test with a long name and -slow subcases that would result in query strings that are too long), but this -will produce a non-fatal warning. Avoid creating new warnings whenever -possible. Any existing failures should be fixed (eventually). +slow subcases that would result in query strings that are too long). +It's OK if the number is estimated too high. + +These entries are estimates for the amount of time that subcases take to run, +and are used as inputs into the WPT tooling to attempt to portion out tests into +approximately same-sized chunks. High estimates are OK, they just may generate +more chunks than necessary. + +To check for missing or 0 entries, run +`tools/validate --print-metadata-warnings src/webgpu` +and look at the resulting warnings. ### Performance @@ -25,46 +33,25 @@ should still execute in under 5 seconds on lower-end computers. ## Problem -When adding new tests to the CTS you may occasionally see an error like this +When renaming or removing tests from the CTS you will see an error like this when running `npm test` or `npm run standalone`: ``` -ERROR: Tests missing from listing_meta.json. Please add the new tests (set subcaseMS to 0 if you cannot estimate it): - webgpu:shader,execution,expression,binary,af_matrix_addition:matrix:* - -/home/runner/work/cts/cts/src/common/util/util.ts:38 - throw new Error(msg && (typeof msg === 'string' ? msg : msg())); - ^ -Error: - at assert (/home/runner/work/cts/cts/src/common/util/util.ts:38:11) - at crawl (/home/runner/work/cts/cts/src/common/tools/crawl.ts:155:11) -Warning: non-zero exit code 1 - Use --force to continue. - -Aborted due to warnings. +ERROR: Non-existent tests found in listing_meta.json. Please update: + webgpu:api,operation,adapter,requestAdapter:old_test_that_got_renamed:* ``` -What this error message is trying to tell us, is that there is no entry for -`webgpu:shader,execution,expression,binary,af_matrix_addition:matrix:*` in -`src/webgpu/listing_meta.json`. +## Solution -These entries are estimates for the amount of time that subcases take to run, -and are used as inputs into the WPT tooling to attempt to portion out tests into -approximately same-sized chunks. +This means there is a stale line in `src/webgpu/listing_meta.json` that needs +to be deleted, or updated to match the rename that you did. -If a value has been defaulted to 0 by someone, you will see warnings like this: - -``` -... -WARNING: subcaseMS≤0 found in listing_meta.json (allowed, but try to avoid): - webgpu:shader,execution,expression,binary,af_matrix_addition:matrix:* -... -``` +## Problem -These messages should be resolved by adding appropriate entries to the JSON -file. +You run `tools/validate --print-metadata-warnings src/webgpu` +and want to fix the warnings. -## Solution 1 (manual, best for simple tests) +## Solution 1 (manual, best for one-off updates of simple tests) If you're developing new tests and need to update this file, it is sometimes easiest to do so manually. Run your tests under your usual development workflow @@ -82,30 +69,18 @@ these values, though they do require some manual intervention. The rest of this doc will be a walkthrough of running these tools. Timing data can be captured in bulk and "merged" into this file using -the `merge_listing_times` tool. This is useful when a large number of tests +the `merge_listing_times` tool. This is +This is useful when a large number of tests change or otherwise a lot of tests need to be updated, but it also automates the manual steps above. The tool can also be used without any inputs to reformat `listing_meta.json`. Please read the help message of `merge_listing_times` for more information. -### Placeholder Value - -If your development workflow requires a clean build, the first step is to add a -placeholder value for entry to `src/webgpu/listing_meta.json`, since there is a -chicken-and-egg problem for updating these values. - -``` - "webgpu:shader,execution,expression,binary,af_matrix_addition:matrix:*": { "subcaseMS": 0 }, -``` - -(It should have a value of 0, since later tooling updates the value if the newer -value is higher.) - ### Websocket Logger The first tool that needs to be run is `websocket-logger`, which receives data -on a WebSocket channel to capture timing data when CTS is run. This +on a WebSocket channel at `localhost:59497` to capture timing data when CTS is run. This should be run in a separate process/terminal, since it needs to stay running throughout the following steps. @@ -125,10 +100,19 @@ Writing to wslog-2023-09-12T18-57-34.txt ... ``` +See also [tools/websocket-logger/README.md](../tools/websocket-logger/README.md). + ### Running CTS Now we need to run the specific cases in CTS that we need to time. -This should be possible under any development workflow (as long as its runtime environment, like Node, supports WebSockets), but the most well-tested way is using the standalone web runner. + +This should be possible under any development workflow by logging through a +side-channel (as long as its runtime environment, like Node, supports WebSockets). +Regardless of development workflow, you need to enable logToWebSocket flag +(`?log_to_web_socket=1` in browser, `--log-to-web-socket` on command line, or +just hack it in by switching the default in `options.ts`). + +The most well-tested way to do this is using the standalone web runner. This requires serving the CTS locally. In the project root: @@ -141,7 +125,7 @@ Once this is started you can then direct a WebGPU enabled browser to the specific CTS entry and run the tests, for example: ``` -http://localhost:8080/standalone/?q=webgpu:shader,execution,expression,binary,af_matrix_addition:matrix:* +http://localhost:8080/standalone/?log_to_web_socket=1&q=webgpu:* ``` If the tests have a high variance in runtime, you can run them multiple times. @@ -156,8 +140,9 @@ This can be done using the following command: ``` tools/merge_listing_times webgpu -- tools/websocket-logger/wslog-2023-09-12T18-57-34.txt +tools/merge_listing_times webgpu -- tools/websocket-logger/wslog-*.txt ``` -where the text file is the result file from websocket-logger. +Or, you can point it to one of the log files from a specific invocation of websocket-logger. Now you just need to commit the pending diff in your repo. diff --git a/dom/webgpu/tests/cts/checkout/docs/build.md b/dom/webgpu/tests/cts/checkout/docs/build.md index 2d7b2f968c..d786bbc18c 100644 --- a/dom/webgpu/tests/cts/checkout/docs/build.md +++ b/dom/webgpu/tests/cts/checkout/docs/build.md @@ -1,16 +1,48 @@ # Building Building the project is not usually needed for local development. -However, for exports to WPT, or deployment (https://gpuweb.github.io/cts/), +However, for exports to WPT, NodeJS, [or deployment](https://gpuweb.github.io/cts/), files can be pre-generated. -The project builds into two directories: +## Build types -- `out/`: Built framework and test files, needed to run standalone or command line. -- `out-wpt/`: Build directory for export into WPT. Contains: - - An adapter for running WebGPU CTS tests under WPT - - A copy of the needed files from `out/` - - A copy of any `.html` test cases from `src/` +The project can be built several different ways, each with a different output directory: + +### 0. on-the-fly builds (no output directory) + +Use `npm run start` to launch a server that live-compiles everything as needed. +Use `tools/run_node` and other tools to run under `ts-node` which compiles at runtime. + +### 1. `out` directory + +**Built with**: `npm run standalone` + +**Serve locally with**: `npx grunt serve` + +**Used for**: Static deployment of the CTS, primarily for [gpuweb.github.io/cts](https://gpuweb.github.io/cts/). + +### 2. `out-wpt` directory + +**Built with**: `npm run wpt` + +**Used for**: Deploying into [Web Platform Tests](https://web-platform-tests.org/). See [below](#export-to-wpt) for more information. + +Contains: + +- An adapter for running WebGPU CTS tests under WPT +- A copy of the needed files from `out/` +- A copy of any `.html` test cases from `src/` + +### 3. `out-node` directory + +**Built with**: `npm run node` + +**Used for**: Running NodeJS tools, if you want to specifically avoid the live-compilation overhead of the `tools/` versions, or are running on a deployment which no longer has access to `ts-node` (which is a build-time dependency). For example: + +- `node out-node/common/runtime/cmdline.js` ([source](../src/common/runtime/cmdline.ts)) - A command line interface test runner +- `node out-node/common/runtime/server.js` ([source](../src/common/runtime/server.ts)) - An HTTP server for executing CTS tests with a REST interface + +## Testing To build and run all pre-submit checks (including type and lint checks and unittests), use: @@ -25,15 +57,6 @@ For checks only: npm run check ``` -For a quicker iterative build: - -```sh -npm run standalone -``` - -## Run - -To serve the built files (rather than using the dev server), run `npx grunt serve`. ## Export to WPT diff --git a/dom/webgpu/tests/cts/checkout/docs/case_cache.md b/dom/webgpu/tests/cts/checkout/docs/case_cache.md new file mode 100644 index 0000000000..c3ba8718b5 --- /dev/null +++ b/dom/webgpu/tests/cts/checkout/docs/case_cache.md @@ -0,0 +1,81 @@ +# Case Cache + +The WebGPU CTS contains many tests that check that the results of an operation +fall within limits defined by the WebGPU and WGSL specifications. The +computation of these allowed limits can be very expensive to calculate, however +the values do not vary by platform or device, and can be precomputed and reused +for multiple CTS runs. + +## File cache + +To speed up execution of the CTS, the CTS git repo holds holds pre-computed +test cases, generated from `*.cache.ts` files and serialized in a set of binary +files under [`src/resources/cache`](../src/resources/cache). + +These files are regenerated by [`src/common/tools/gen_cache.ts`](../src/common/tools/gen_cache.ts) +which can be run with `npx grunt run:generate-cache`. +This tool is automatically run by the various Grunt build commands. + +As generating the cache is expensive (hence why we build it ahead of time!) the +cache generation tool will only re-build the cache files it believes may be out +of date. To determine which files it needs to rebuild, the tool calculates a +hash of all the transitive source TypeScript files that are used to build the +output, and compares this hash to the hash stored in +[`src/resources/cache/hashes.json`](`../src/resources/cache/hashes.json`). Only +those cache files with differing hashes are rebuilt. + +Transitive imports easily grow, and these can cause unnecessary rebuilds of the cache. +To help avoid unnecessary rebuilds, files that are known to not be used by the cache can be +annotated with a `MUST_NOT_BE_IMPORTED_BY_DATA_CACHE` comment anywhere in the file. If a file with +this comment is transitively imported by a `.cache.ts` file, then the cache generation tool will +error with a trace of the imports from the `.cache.ts` file to the file with this comment. + +The cache files are copied from [`src/resources/cache`](../src/resources/cache) +to the `resources/cache` subdirectory of the +[`out` and `out-node` build directories](build.md#build-types), so the runner +can load these cache files. + +The GitHub presubmit checks will error if the cache files or +[`hashes.json`](`../src/resources/cache/hashes.json`) need updating. + +## In memory cache + +If a cache file cannot be found, then the [`CaseCache`](../src/webgpu/shader/execution/expression/case_cache.ts) +will build the cases during CTS execution and store the results in an in-memory LRU cache. + +## Using the cache + +To add test cases to the cache: + +1. Create a new my_file.cache.ts file. + +2. In that file, import `makeCaseCache` from [`'case_cache.js'`](../src/webgpu/shader/execution/expression/case_cache.ts); + +```ts +import { makeCaseCache } from '../case_cache.js'; // your relative path may vary +``` + +3. Declare an exported global variable with the name `d`, assigned with the return value of `makeCaseCache()`: + +```ts +export const d = makeCaseCache('unique/path/of/your/cache/file', { + // Declare any number of fields that build the test cases + name_of_your_case: () => { + return fullI32Range().map(e => { // example case builder + return { input: i32(e), expected: i32(-e) }; + }); + }, +}); +``` + +4. To use the cached cases in a my_file.spec.ts file, import `d` from my_file.cache.js, and use `d.get();` + +```ts +import { d } from './my_file.cache.js'; + +const cases = await d.get('name_of_your_case'); +// cases will either be loaded from the cache file, loaded from the in-memory +// LRU, or built on the fly. +``` + +5. Run `npx grunt run generate-cache` to generate the new cache file. diff --git a/dom/webgpu/tests/cts/checkout/docs/fp_primer.md b/dom/webgpu/tests/cts/checkout/docs/fp_primer.md index a8302fb461..769657c8f8 100644 --- a/dom/webgpu/tests/cts/checkout/docs/fp_primer.md +++ b/dom/webgpu/tests/cts/checkout/docs/fp_primer.md @@ -39,7 +39,8 @@ A floating point number system defines - Arithmetic operations on those representatives, trying to approximate the ideal operations on real numbers. -The cardinality mismatch alone implies that any floating point number system necessarily loses information. +The cardinality mismatch alone implies that any floating point number system +necessarily loses information. This means that not all numbers in the bounds can be exactly represented as a floating point value. @@ -114,7 +115,7 @@ Implementations may assume that infinities are not present. When an evaluation at runtime would produce an infinity, an indeterminate value is produced instead. -When a value goes out of bounds for a specific precision there are special +When a value goes out-of-bounds for a specific precision there are special rounding rules that apply. If it is 'near' the edge of finite values for that precision, it is considered to be near-overflowing, and the implementation may choose to round it to the edge value or the appropriate infinity. If it is not @@ -163,7 +164,7 @@ the rules for compile time execution will be discussed below.) Signaling NaNs are treated as quiet NaNs in the WGSL spec. And quiet NaNs have the same "may-convert-to-indeterminate-value" behaviour that infinities have, so -for the purpose of the CTS they are handled by the infinite/out of bounds logic +for the purpose of the CTS they are handled by the infinite/out-of-bounds logic normally. ## Notation/Terminology @@ -231,14 +232,20 @@ referred to as the beginning of the interval and `b` as the end of the interval. When talking about intervals, this doc and the code endeavours to avoid using the term **range** to refer to the span of values that an interval covers, -instead using the term bounds to avoid confusion of terminology around output of -operations. +instead using the term **endpoints** to avoid confusion of terminology around +output of operations. + +The term **endpoints** is generally used to refer to the conceptual numeric +spaces, i.e. f32 or abstract float. + +Thus a specific interval can have **endpoints** that are either in or out of +bounds for a specific floating point precision. ## Accuracy As mentioned above floating point numbers are not able to represent all the -possible values over their bounds, but instead represent discrete values in that -interval, and approximate the remainder. +possible values over their range, but instead represent discrete values in that +space, and approximate the remainder. Additionally, floating point numbers are not evenly distributed over the real number line, but instead are more densely clustered around zero, with the space @@ -398,7 +405,7 @@ That would be very inefficient though and make your reviewer sad to read. For mapping intervals to intervals the key insight is that we only need to be concerned with the extrema of the operation in the interval, since the -acceptance interval is the bounds of the possible outputs. +acceptance interval is defined by largest and smallest of the possible outputs. In more precise terms: ``` @@ -538,6 +545,65 @@ This algorithmically looks something like this: Return division result ``` +### Out of Bounds +When calculating inherited intervals, if a intermediate calculation goes out of +bounds this will flow through to later calculations, even if a later calculation +would pull the result back inbounds. + +For example, `fp.positive.max + fp.positive.max - fp.positive.max` could be +simplified to just `fp.positive.max` before execution, but it would also be +valid for an implementation to naively perform left to right evaluation. Thus +the addition would produce an intermediate value of `2 * fp.positive.max`. Again +the implementation may hoist intermediate calculation to a higher precision to +avoid overflow here, but is not required to. So a conforming implementation at +this point may just return any value since the calculation when out of bounds. +Thus the execution tests in the CTS should accept any value returned, so the +case is just effectively confirming the computation completes. + +When looking at validation tests there is some subtleties about out of bounds +behaviour, specifically how far out of bounds the value went that will influence +the expected results, which will be discussed in more detail below. + +#### Vectors and Matrices +The above discussion about inheritance of out of bounds intervals assumed scalar +calculations, so all the result intervals were dependent on the input intervals, +so if an out-of-bounds input occurred naturally all the output values were +effectively out of bounds. + +For vector and matrix operations, this is not always true. Operations on these +data structures can either define an element-wise mapping, where for each output +element the result is calculated by executing a scalar operation on a input +element (sometimes referred to as component-wise), or where the operation is +defined such the output elements are dependent on the entire input. + +For concrete examples, constant scaling (`c * vec` of `c * mat`) is an +element-wise operation, because one can define a simple mapping +`o[i]` = `c * i[i]`, where the ith output only depends on the ith input. + +A non-element-wise operation would be something like cross product of vectors +or the determinant of a matrix, where each output element is dependent on +multiple input elements. + +For component-wise operations, out of bounds-ness flows through per element, +i.e. if the ith input element was considered to be have gone out of bounds, then +the ith output is considered to have too also regardless of the operation +performed. Thus an input may be a mixture of out of bounds elements & inbounds +elements, and produce another mixture, assuming the operation being performed +itself does not push elements out of bounds. + +For non-component-wise operations, out of bounds-ness flows through the entire +operation, i.e. if any of the input elements is out of bounds, then all the +output elements are considered to be out of bounds. Additionally, if the +calculation for any of the elements in output goes out of bounds, then the +entire output is considered to have gone out of bounds, even if other individual +elements stayed inbounds. + +For some non-element-wise operations one could define mappings for individual +output elements that do not depend on all the input elements and consider only +if those inputs that are used, but for the purposes of WGSL and the CTS, OOB +inheritance is not so finely defined as to consider the difference between using +some and all the input elements for non-element-wise operations. + ## Compile vs Run Time Evaluation The above discussions have been primarily agnostic to when and where a @@ -553,14 +619,14 @@ These are compile vs run time, and CPU vs GPU. Broadly speaking compile time execution happens on the host CPU, and run time evaluation occurs on a dedicated GPU. -(Software graphics implementations like WARP and SwiftShader technically break this by -being a software emulation of a GPU that runs on the CPU, but conceptually one can -think of these implementations being a type of GPU in this context, since it has -similar constraints when it comes to precision, etc.) +(Software graphics implementations like WARP and SwiftShader technically break +this by being a software emulation of a GPU that runs on the CPU, but +conceptually one can think of these implementations being a type of GPU in this +context, since it has similar constraints when it comes to precision, etc.) Compile time evaluation is execution that occurs when setting up a shader module, i.e. when compiling WGSL to a platform specific shading language. It is -part of resolving values for things like constants, and occurs once before the +part of resolving values for things like constants, and occurs once, before the shader is run by the caller. It includes constant evaluation and override evaluation. All AbstractFloat operations are compile time evaluated. @@ -623,7 +689,7 @@ near-overflow vs far-overflow behaviour. Thankfully this can be broken down into a case by case basis based on where an interval falls. Assuming `X`, is the well-defined result of an operation, i.e. not indeterminate -due to the operation isn't defined for the inputs: +due to the operation not being defined for the inputs: | Region | | Result | |------------------------------|------------------------------------------------------|--------------------------------| @@ -643,7 +709,9 @@ behaviour in this region as rigorously defined nor tested, so fully testing here would likely find lots of issues that would just need to be mitigated in the CTS. -Currently, we choose to avoid testing validation of near-overflow scenarios. +Currently, we have chosen to not test validation of near-overflow scenarios to +avoid this complexity. If this becomes a significant source of bugs and/or +incompatibility between implementations this can be revisited in the future. ### Additional Technical Limitations @@ -652,7 +720,7 @@ the theoretical world that the intervals being used for testing are infinitely precise, when in actuality they are implemented by the ECMAScript `number` type, which is implemented as a f64 value. -For the vast majority of cases, even out of bounds and overflow, this is +For the vast majority of cases, even out-of-bounds and overflow, this is sufficient. There is one small slice where this breaks down. Specifically if the result just outside the finite range by less than 1 f64 ULP of the edge value. An example of this is `2 ** -11 + f32.max`. This will be between `f32.max` @@ -752,7 +820,7 @@ const_assert upper > foo(x) // Result was above the acceptance interval ``` where lower and upper would actually be string replaced with literals for the -bounds of the acceptance interval when generating the shader text. +endpoints of the acceptance interval when generating the shader text. This approach has a number of limitations that made it unacceptable for the CTS. First, how errors are reported is a pain to debug. Someone working with the CTS diff --git a/dom/webgpu/tests/cts/checkout/docs/intro/developing.md b/dom/webgpu/tests/cts/checkout/docs/intro/developing.md index 5b1aeed36d..0016c2c048 100644 --- a/dom/webgpu/tests/cts/checkout/docs/intro/developing.md +++ b/dom/webgpu/tests/cts/checkout/docs/intro/developing.md @@ -34,6 +34,11 @@ the standalone runner.) Note: The first load of a test suite may take some time as generating the test suite listing can take a few seconds. +## Documentation + +In addition to the documentation pages you're reading, there is TSDoc documentation. +Start at the [helper index](https://gpuweb.github.io/cts/docs/tsdoc/). + ## Standalone Test Runner / Test Plan Viewer **The standalone test runner also serves as a test plan viewer.** @@ -43,7 +48,7 @@ You can use this to preview how your test plan will appear. You can view different suites (webgpu, unittests, stress, etc.) or different subtrees of the test suite. -- `http://localhost:8080/standalone/` (defaults to `?runnow=0&worker=0&debug=0&q=webgpu:*`) +- `http://localhost:8080/standalone/` (defaults to `?runnow=0&debug=0&q=webgpu:*`) - `http://localhost:8080/standalone/?q=unittests:*` - `http://localhost:8080/standalone/?q=unittests:basic:*` @@ -51,7 +56,9 @@ The following url parameters change how the harness runs: - `runnow=1` runs all matching tests on page load. - `debug=1` enables verbose debug logging from tests. -- `worker=1` runs the tests on a Web Worker instead of the main thread. +- `worker=dedicated` (or `worker` or `worker=1`) runs the tests on a dedicated worker instead of the main thread. +- `worker=shared` runs the tests on a shared worker instead of the main thread. +- `worker=service` runs the tests on a service worker instead of the main thread. - `power_preference=low-power` runs most tests passing `powerPreference: low-power` to `requestAdapter` - `power_preference=high-performance` runs most tests passing `powerPreference: high-performance` to `requestAdapter` @@ -112,15 +119,17 @@ Opening a pull request will automatically notify reviewers. To make the review process smoother, once a reviewer has started looking at your change: - Avoid major additions or changes that would be best done in a follow-up PR. -- Avoid rebases (`git rebase`) and force pushes (`git push -f`). These can make - it difficult for reviewers to review incremental changes as GitHub often cannot +- Avoid deleting commits that have already been reviewed, which occurs when using + rebases (`git rebase`) and force pushes (`git push -f`). These can make + it difficult for reviewers to review incremental changes as GitHub usually cannot view a useful diff across a rebase. If it's necessary to resolve conflicts with upstream changes, use a merge commit (`git merge`) and don't include any - consequential changes in the merge, so a reviewer can skip over merge commits + unnecessary changes in the merge, so that a reviewer can skip over merge commits when working through the individual commits in the PR. -- When you address a review comment, mark the thread as "Resolved". -Pull requests will (usually) be landed with the "Squash and merge" option. + The "Create a merge commit" merge option is disabled, so `main` history always + remains linear (no merge commits). PRs are usually landed using "Squash and merge". +- When you address a review comment, mark the thread as "Resolved". ### TODOs diff --git a/dom/webgpu/tests/cts/checkout/docs/terms.md b/dom/webgpu/tests/cts/checkout/docs/terms.md index 032639be57..0dc6f0ca17 100644 --- a/dom/webgpu/tests/cts/checkout/docs/terms.md +++ b/dom/webgpu/tests/cts/checkout/docs/terms.md @@ -111,7 +111,7 @@ Each Suite has one Listing File (`suite/listing.[tj]s`), containing a list of th in the suite. In `src/suite/listing.ts`, this is computed dynamically. -In `out/suite/listing.js`, the listing has been pre-baked (by `tools/gen_listings`). +In `out/suite/listing.js`, the listing has been pre-baked (by `tools/gen_listings_and_webworkers`). **Type:** Once `import`ed, `ListingFile` diff --git a/dom/webgpu/tests/cts/checkout/package-lock.json b/dom/webgpu/tests/cts/checkout/package-lock.json index 361ee369cd..83dbb0a58e 100644 --- a/dom/webgpu/tests/cts/checkout/package-lock.json +++ b/dom/webgpu/tests/cts/checkout/package-lock.json @@ -24,7 +24,7 @@ "@types/serve-index": "^1.9.3", "@typescript-eslint/eslint-plugin": "^6.9.1", "@typescript-eslint/parser": "^6.9.1", - "@webgpu/types": "^0.1.38", + "@webgpu/types": "^0.1.40", "ansi-colors": "4.1.3", "babel-plugin-add-header-comment": "^1.0.3", "babel-plugin-const-enum": "^1.2.0", @@ -37,11 +37,11 @@ "express": "^4.18.2", "grunt": "^1.6.1", "grunt-cli": "^1.4.3", + "grunt-concurrent": "^3.0.0", "grunt-contrib-clean": "^2.0.1", "grunt-contrib-copy": "^1.0.0", "grunt-run": "^0.8.1", "grunt-timer": "^0.6.0", - "grunt-ts": "^6.0.0-beta.22", "gts": "^5.2.0", "http-server": "^14.1.1", "morgan": "^1.10.0", @@ -1523,9 +1523,9 @@ "dev": true }, "node_modules/@webgpu/types": { - "version": "0.1.38", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.38.tgz", - "integrity": "sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==", + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.40.tgz", + "integrity": "sha512-/BBkHLS6/eQjyWhY2H7Dx5DHcVrS2ICj9owvSRdgtQT6KcafLZA86tPze0xAOsd4FbsYKCUBUQyNi87q7gV7kw==", "dev": true }, "node_modules/abbrev": { @@ -1672,33 +1672,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", @@ -1764,15 +1737,6 @@ "node": ">=8" } }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array.prototype.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", @@ -1858,39 +1822,12 @@ "node": ">=0.10.0" } }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -1929,74 +1866,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/bash-color": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/bash-color/-/bash-color-0.0.3.tgz", @@ -2039,16 +1908,6 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -2199,26 +2058,6 @@ "node": ">= 0.8" } }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/call-bind": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", @@ -2335,21 +2174,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -2371,19 +2195,6 @@ "node": ">= 10" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2408,12 +2219,6 @@ "node": ">=0.1.90" } }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2482,15 +2287,6 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -2526,33 +2322,6 @@ "node": ">= 8" } }, - "node_modules/csproj2ts": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/csproj2ts/-/csproj2ts-1.1.0.tgz", - "integrity": "sha512-sk0RTT51t4lUNQ7UfZrqjQx7q4g0m3iwNA6mvyh7gLsgQYvwKzfdyoAgicC9GqJvkoIkU0UmndV9c7VZ8pJ45Q==", - "dev": true, - "dependencies": { - "es6-promise": "^4.1.1", - "lodash": "^4.17.4", - "semver": "^5.4.1", - "xml2js": "^0.4.19" - } - }, - "node_modules/csproj2ts/node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "node_modules/csproj2ts/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -2620,15 +2389,6 @@ "node": ">=0.10.0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2822,18 +2582,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2862,27 +2610,6 @@ "node": ">=0.10.0" } }, - "node_modules/detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "dependencies": { - "repeating": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -2916,6 +2643,18 @@ "node": ">=6.0.0" } }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, "node_modules/duration": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", @@ -2953,6 +2692,15 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3081,12 +2829,6 @@ "es6-symbol": "^3.1.1" } }, - "node_modules/es6-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-0.1.2.tgz", - "integrity": "sha1-8RLCn+paCZhTn8tqL9IUQ9KPBfc=", - "dev": true - }, "node_modules/es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -3701,39 +3443,6 @@ "node": ">= 0.8.0" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -3874,18 +3583,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -3900,75 +3597,6 @@ "node": ">=4" } }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -4051,13 +3679,6 @@ "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", "dev": true }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4258,18 +3879,6 @@ "node": ">= 0.6" } }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "dependencies": { - "map-cache": "^0.2.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -4402,15 +4011,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/getobject": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", @@ -4565,12 +4165,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -4636,6 +4230,33 @@ "nopt": "bin/nopt.js" } }, + "node_modules/grunt-concurrent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-3.0.0.tgz", + "integrity": "sha512-AgXtjUJESHEGeGX8neL3nmXBTHSj1QC48ABQ3ng2/vjuSBpDD8gKcVHSlXP71pFkIR8TQHf+eomOx6OSYSgfrA==", + "dev": true, + "dependencies": { + "arrify": "^2.0.1", + "async": "^3.1.0", + "indent-string": "^4.0.0", + "pad-stream": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "grunt": ">=1" + } + }, + "node_modules/grunt-concurrent/node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/grunt-contrib-clean": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.1.tgz", @@ -4908,344 +4529,6 @@ "node": ">= 0.8.x" } }, - "node_modules/grunt-ts": { - "version": "6.0.0-beta.22", - "resolved": "https://registry.npmjs.org/grunt-ts/-/grunt-ts-6.0.0-beta.22.tgz", - "integrity": "sha512-g9e+ZImQ7W38dfpwhp0+GUltXWidy3YGPfIA/IyGL5HMv6wmVmMMoSgscI5swhs2HSPf8yAvXAAJbwrouijoRg==", - "dev": true, - "dependencies": { - "chokidar": "^2.0.4", - "csproj2ts": "^1.1.0", - "detect-indent": "^4.0.0", - "detect-newline": "^2.1.0", - "es6-promise": "~0.1.1", - "jsmin2": "^1.2.1", - "lodash": "~4.17.10", - "ncp": "0.5.1", - "rimraf": "2.2.6", - "semver": "^5.3.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">= 0.8.0" - }, - "peerDependencies": { - "grunt": "^1.0.0 || ^0.4.0", - "typescript": ">=1" - } - }, - "node_modules/grunt-ts/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/grunt-ts/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "dev": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - }, - "optionalDependencies": { - "fsevents": "^1.2.7" - } - }, - "node_modules/grunt-ts/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/grunt-ts/node_modules/glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "dependencies": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "node_modules/grunt-ts/node_modules/glob-parent/node_modules/is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-ts/node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/grunt-ts/node_modules/rimraf": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w=", - "dev": true, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/grunt-ts/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/grunt-ts/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/grunt/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -5830,69 +5113,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -6320,39 +5540,15 @@ "node": ">=0.10.0" } }, - "node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6404,12 +5600,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -6434,30 +5624,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -6473,29 +5639,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -6511,15 +5654,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -6529,18 +5663,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -6755,12 +5877,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -6861,12 +5977,6 @@ "node": ">=4" } }, - "node_modules/jsmin2": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jsmin2/-/jsmin2-1.2.1.tgz", - "integrity": "sha1-iPvi+/dfCpH2YCD9mBzWk/S/5X4=", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -7071,18 +6181,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -7271,31 +6369,6 @@ "node": ">= 6" } }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -7348,111 +6421,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -7465,15 +6433,6 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, - "node_modules/ncp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz", - "integrity": "sha1-dDmFMW49tFkoG1hxaehFc1oFQ58=", - "dev": true, - "bin": { - "ncp": "bin/ncp" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -7558,32 +6517,6 @@ "node": ">=8" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -7602,18 +6535,6 @@ "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", @@ -7865,6 +6786,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/pad-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pad-stream/-/pad-stream-2.0.0.tgz", + "integrity": "sha512-3QeQw19K48BQzUGZ9dEf/slX5Jbfy5ZeBTma2XICketO7kFNK7omF00riVcecOKN+DSiJZcK2em1eYKaVOeXKg==", + "dev": true, + "dependencies": { + "pumpify": "^1.3.3", + "split2": "^2.1.1", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7927,21 +6862,6 @@ "node": ">= 0.8" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8103,15 +7023,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8167,6 +7078,27 @@ "node": ">= 0.10" } }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -8434,44 +7366,6 @@ "node": ">=8" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", @@ -8501,49 +7395,13 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "engines": { - "node": ">=0.10.5" + "node": ">=0.10.5" } }, "node_modules/requires-port": { @@ -8591,13 +7449,6 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -8611,15 +7462,6 @@ "node": ">=8" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8740,15 +7582,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -8769,12 +7602,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "node_modules/screenshot-ftw": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/screenshot-ftw/-/screenshot-ftw-1.0.5.tgz", @@ -8975,21 +7802,6 @@ "node": ">= 0.4" } }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -9058,158 +7870,6 @@ "node": ">=6" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -9242,41 +7902,13 @@ "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "node_modules/split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" + "through2": "^2.0.2" } }, "node_modules/sprintf-js": { @@ -9285,19 +7917,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -9307,6 +7926,12 @@ "node": ">= 0.6" } }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -9387,18 +8012,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -9484,6 +8097,16 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -9517,45 +8140,6 @@ "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -9568,82 +8152,6 @@ "node": ">=8.0" } }, - "node_modules/to-regex/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -10004,21 +8512,6 @@ "node": ">= 0.8.0" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -10028,54 +8521,6 @@ "node": ">= 0.8" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -10085,16 +8530,6 @@ "node": ">=8" } }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -10134,28 +8569,12 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, "node_modules/url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10313,26 +8732,13 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, "engines": { - "node": ">=4.0" + "node": ">=0.4" } }, "node_modules/yallist": { @@ -11464,9 +9870,9 @@ "dev": true }, "@webgpu/types": { - "version": "0.1.38", - "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.38.tgz", - "integrity": "sha512-7LrhVKz2PRh+DD7+S+PVaFd5HxaWQvoMqBbsV9fNJO1pjUs1P8bM2vQVNfk+3URTqbuTI7gkXi0rfsN0IadoBA==", + "version": "0.1.40", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.40.tgz", + "integrity": "sha512-/BBkHLS6/eQjyWhY2H7Dx5DHcVrS2ICj9owvSRdgtQT6KcafLZA86tPze0xAOsd4FbsYKCUBUQyNi87q7gV7kw==", "dev": true }, "abbrev": { @@ -11577,24 +9983,6 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, "array-buffer-byte-length": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", @@ -11642,12 +10030,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, "array.prototype.findlastindex": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", @@ -11706,30 +10088,12 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, "async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -11759,61 +10123,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "bash-color": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/bash-color/-/bash-color-0.0.3.tgz", @@ -11847,16 +10156,6 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "body-parser": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", @@ -11964,23 +10263,6 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "call-bind": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", @@ -12054,18 +10336,6 @@ "readdirp": "~3.6.0" } }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - } - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -12081,16 +10351,6 @@ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -12112,12 +10372,6 @@ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -12165,12 +10419,6 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -12200,32 +10448,6 @@ "which": "^2.0.1" } }, - "csproj2ts": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/csproj2ts/-/csproj2ts-1.1.0.tgz", - "integrity": "sha512-sk0RTT51t4lUNQ7UfZrqjQx7q4g0m3iwNA6mvyh7gLsgQYvwKzfdyoAgicC9GqJvkoIkU0UmndV9c7VZ8pJ45Q==", - "dev": true, - "requires": { - "es6-promise": "^4.1.1", - "lodash": "^4.17.4", - "semver": "^5.4.1", - "xml2js": "^0.4.19" - }, - "dependencies": { - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -12275,12 +10497,6 @@ } } }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -12404,15 +10620,6 @@ "object-keys": "^1.1.1" } }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -12425,25 +10632,10 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, "diff": { @@ -12470,6 +10662,18 @@ "esutils": "^2.0.2" } }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, "duration": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", @@ -12504,6 +10708,15 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -12613,12 +10826,6 @@ "es6-symbol": "^3.1.1" } }, - "es6-promise": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-0.1.2.tgz", - "integrity": "sha1-8RLCn+paCZhTn8tqL9IUQ9KPBfc=", - "dev": true - }, "es6-symbol": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", @@ -13061,38 +11268,6 @@ "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -13208,15 +11383,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", @@ -13228,62 +11394,6 @@ "tmp": "^0.0.33" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -13354,13 +11464,6 @@ "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", "dev": true }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -13510,15 +11613,6 @@ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -13608,12 +11702,6 @@ "get-intrinsic": "^1.1.1" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, "getobject": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", @@ -13730,12 +11818,6 @@ "get-intrinsic": "^1.1.3" } }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, "graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -13822,6 +11904,26 @@ } } }, + "grunt-concurrent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-3.0.0.tgz", + "integrity": "sha512-AgXtjUJESHEGeGX8neL3nmXBTHSj1QC48ABQ3ng2/vjuSBpDD8gKcVHSlXP71pFkIR8TQHf+eomOx6OSYSgfrA==", + "dev": true, + "requires": { + "arrify": "^2.0.1", + "async": "^3.1.0", + "indent-string": "^4.0.0", + "pad-stream": "^2.0.0" + }, + "dependencies": { + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + } + } + }, "grunt-contrib-clean": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.1.tgz", @@ -13921,385 +12023,112 @@ "requires": { "chalk": "~4.1.0", "lodash": "~4.17.19" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "grunt-legacy-util": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", - "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", - "dev": true, - "requires": { - "async": "~3.2.0", - "exit": "~0.1.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.21", - "underscore.string": "~3.3.5", - "which": "~2.0.2" - } - }, - "grunt-run": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/grunt-run/-/grunt-run-0.8.1.tgz", - "integrity": "sha512-+wvoOJevugcjMLldbVCyspRHHntwVIJiTGjx0HFq+UwXhVPe7AaAiUdY4135CS68pAoRLhd7pAILpL2ITe1tmA==", - "dev": true, - "requires": { - "strip-ansi": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "grunt-timer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/grunt-timer/-/grunt-timer-0.6.0.tgz", - "integrity": "sha512-CZc6NsOGr/HMo70RLXTBCPJm8seJok/lQL2VFygXEvrhj6fYJEvyDIEdSUTSNiXSyC4eNoN8zUNrzMXGwinjdQ==", - "dev": true, - "requires": { - "bash-color": "^0.0.3", - "duration": "^0.2.0", - "functional.js": "^0.6.10", - "hooker": "^0.2.3" - } - }, - "grunt-ts": { - "version": "6.0.0-beta.22", - "resolved": "https://registry.npmjs.org/grunt-ts/-/grunt-ts-6.0.0-beta.22.tgz", - "integrity": "sha512-g9e+ZImQ7W38dfpwhp0+GUltXWidy3YGPfIA/IyGL5HMv6wmVmMMoSgscI5swhs2HSPf8yAvXAAJbwrouijoRg==", - "dev": true, - "requires": { - "chokidar": "^2.0.4", - "csproj2ts": "^1.1.0", - "detect-indent": "^4.0.0", - "detect-newline": "^2.1.0", - "es6-promise": "~0.1.1", - "jsmin2": "^1.2.1", - "lodash": "~4.17.10", - "ncp": "0.5.1", - "rimraf": "2.2.6", - "semver": "^5.3.0", - "strip-bom": "^2.0.0" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "color-convert": "^2.0.1" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "color-name": "~1.1.4" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - } - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "has-flag": "^4.0.0" } - }, - "rimraf": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.6.tgz", - "integrity": "sha1-xZWXVpsU2VatKcrMQr3d9fDqT0w=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + } + } + }, + "grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "requires": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + } + }, + "grunt-run": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/grunt-run/-/grunt-run-0.8.1.tgz", + "integrity": "sha512-+wvoOJevugcjMLldbVCyspRHHntwVIJiTGjx0HFq+UwXhVPe7AaAiUdY4135CS68pAoRLhd7pAILpL2ITe1tmA==", + "dev": true, + "requires": { + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "ansi-regex": "^2.0.0" } } } }, + "grunt-timer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/grunt-timer/-/grunt-timer-0.6.0.tgz", + "integrity": "sha512-CZc6NsOGr/HMo70RLXTBCPJm8seJok/lQL2VFygXEvrhj6fYJEvyDIEdSUTSNiXSyC4eNoN8zUNrzMXGwinjdQ==", + "dev": true, + "requires": { + "bash-color": "^0.0.3", + "duration": "^0.2.0", + "functional.js": "^0.6.10", + "hooker": "^0.2.3" + } + }, "gts": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/gts/-/gts-5.2.0.tgz", @@ -14655,58 +12484,6 @@ "has-symbols": "^1.0.2" } }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "hasown": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", @@ -15029,26 +12806,6 @@ "is-windows": "^1.0.1" } }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -15094,12 +12851,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -15115,26 +12866,6 @@ "hasown": "^2.0.0" } }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -15144,49 +12875,18 @@ "has-tostringtag": "^1.0.0" } }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, "is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "dev": true - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -15323,12 +13023,6 @@ "unc-path-regex": "^0.1.2" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -15401,12 +13095,6 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "jsmin2": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/jsmin2/-/jsmin2-1.2.1.tgz", - "integrity": "sha1-iPvi+/dfCpH2YCD9mBzWk/S/5X4=", - "dev": true - }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -15570,15 +13258,6 @@ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "marked": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", @@ -15712,27 +13391,6 @@ "kind-of": "^6.0.3" } }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "morgan": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", @@ -15781,92 +13439,6 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -15879,12 +13451,6 @@ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, - "ncp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz", - "integrity": "sha1-dDmFMW49tFkoG1hxaehFc1oFQ58=", - "dev": true - }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -15950,28 +13516,6 @@ "path-key": "^3.0.0" } }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -15980,18 +13524,9 @@ }, "object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true }, "object.assign": { "version": "4.1.4", @@ -16175,6 +13710,17 @@ "p-limit": "^3.0.2" } }, + "pad-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pad-stream/-/pad-stream-2.0.0.tgz", + "integrity": "sha512-3QeQw19K48BQzUGZ9dEf/slX5Jbfy5ZeBTma2XICketO7kFNK7omF00riVcecOKN+DSiJZcK2em1eYKaVOeXKg==", + "dev": true, + "requires": { + "pumpify": "^1.3.3", + "split2": "^2.1.1", + "through2": "^2.0.0" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -16219,18 +13765,6 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -16352,12 +13886,6 @@ } } }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -16395,6 +13923,27 @@ "ipaddr.js": "1.9.1" } }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, "punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -16589,37 +14138,6 @@ "strip-indent": "^3.0.0" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "regexp.prototype.flags": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", @@ -16637,33 +14155,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "^1.0.0" - } - }, "requireindex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", @@ -16703,12 +14194,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -16719,12 +14204,6 @@ "signal-exit": "^3.0.2" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -16807,15 +14286,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -16833,12 +14303,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "screenshot-ftw": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/screenshot-ftw/-/screenshot-ftw-1.0.5.tgz", @@ -17015,18 +14479,6 @@ "has-property-descriptors": "^1.0.0" } }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -17083,135 +14535,6 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true - }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -17244,34 +14567,13 @@ "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "through2": "^2.0.2" } }, "sprintf-js": { @@ -17280,22 +14582,18 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -17358,15 +14656,6 @@ "ansi-regex": "^5.0.1" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -17425,6 +14714,16 @@ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -17446,98 +14745,6 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17806,76 +15013,18 @@ "qs": "^6.4.0" } }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, "update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -17895,24 +15044,12 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url-join": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", "dev": true }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -18039,20 +15176,10 @@ "signal-exit": "^3.0.7" } }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "yallist": { diff --git a/dom/webgpu/tests/cts/checkout/package.json b/dom/webgpu/tests/cts/checkout/package.json index 21f74065af..8f2718ab37 100644 --- a/dom/webgpu/tests/cts/checkout/package.json +++ b/dom/webgpu/tests/cts/checkout/package.json @@ -3,15 +3,18 @@ "version": "0.1.0", "description": "WebGPU Conformance Test Suite", "scripts": { - "test": "grunt pre", - "check": "grunt check", + "test": "grunt all", + "all": "grunt all", "standalone": "grunt standalone", "wpt": "grunt wpt", - "fix": "grunt fix", + "node": "grunt node", + "checks": "grunt checks", "unittest": "grunt unittest", + "typecheck": "grunt typecheck", + "fix": "grunt fix", "gen_wpt_cts_html": "node tools/gen_wpt_cts_html", "gen_cache": "node tools/gen_cache", - "tsdoc": "grunt run:tsdoc", + "tsdoc": "grunt tsdoc", "start": "node tools/dev_server", "dev": "node tools/dev_server" }, @@ -46,7 +49,7 @@ "@types/serve-index": "^1.9.3", "@typescript-eslint/eslint-plugin": "^6.9.1", "@typescript-eslint/parser": "^6.9.1", - "@webgpu/types": "^0.1.38", + "@webgpu/types": "^0.1.40", "ansi-colors": "4.1.3", "babel-plugin-add-header-comment": "^1.0.3", "babel-plugin-const-enum": "^1.2.0", @@ -59,11 +62,11 @@ "express": "^4.18.2", "grunt": "^1.6.1", "grunt-cli": "^1.4.3", + "grunt-concurrent": "^3.0.0", "grunt-contrib-clean": "^2.0.1", "grunt-contrib-copy": "^1.0.0", "grunt-run": "^0.8.1", "grunt-timer": "^0.6.0", - "grunt-ts": "^6.0.0-beta.22", "gts": "^5.2.0", "http-server": "^14.1.1", "morgan": "^1.10.0", diff --git a/dom/webgpu/tests/cts/checkout/src/common/framework/fixture.ts b/dom/webgpu/tests/cts/checkout/src/common/framework/fixture.ts index 77875e047d..616023e20c 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/framework/fixture.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/framework/fixture.ts @@ -15,7 +15,8 @@ export type TestParams = { type DestroyableObject = | { destroy(): void } | { close(): void } - | { getExtension(extensionName: 'WEBGL_lose_context'): WEBGL_lose_context }; + | { getExtension(extensionName: 'WEBGL_lose_context'): WEBGL_lose_context } + | HTMLVideoElement; export class SubcaseBatchState { constructor( @@ -124,8 +125,12 @@ export class Fixture { if (WEBGL_lose_context) WEBGL_lose_context.loseContext(); } else if ('destroy' in o) { o.destroy(); - } else { + } else if ('close' in o) { o.close(); + } else { + // HTMLVideoElement + o.src = ''; + o.srcObject = null; } } } @@ -161,6 +166,14 @@ export class Fixture { this.rec.debug(new Error(msg)); } + /** + * Log an info message. + * **Use sparingly. Use `debug()` instead if logs are only needed with debug logging enabled.** + */ + info(msg: string): void { + this.rec.info(new Error(msg)); + } + /** Throws an exception marking the subcase as skipped. */ skip(msg: string): never { throw new SkipTestCase(msg); diff --git a/dom/webgpu/tests/cts/checkout/src/common/framework/test_config.ts b/dom/webgpu/tests/cts/checkout/src/common/framework/test_config.ts index 2575418299..e6624ae120 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/framework/test_config.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/framework/test_config.ts @@ -1,4 +1,9 @@ export type TestConfig = { + /** + * Enable debug-level logs (normally logged via `Fixture.debug()`). + */ + enableDebugLogs: boolean; + maxSubcasesInFlight: number; testHeartbeatCallback: () => void; noRaceWithRejectOnTimeout: boolean; @@ -21,12 +26,25 @@ export type TestConfig = { * Whether or not we're running in compatibility mode. */ compatibility: boolean; + + /** + * Whether or not to request a fallback adapter. + */ + forceFallbackAdapter: boolean; + + /** + * Whether to enable the `logToWebSocket` function used for out-of-band test logging. + */ + logToWebSocket: boolean; }; export const globalTestConfig: TestConfig = { + enableDebugLogs: false, maxSubcasesInFlight: 500, testHeartbeatCallback: () => {}, noRaceWithRejectOnTimeout: false, unrollConstEvalLoops: false, compatibility: false, + forceFallbackAdapter: false, + logToWebSocket: false, }; diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/file_loader.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/file_loader.ts index b5e1b1a446..aae4b87995 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/file_loader.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/file_loader.ts @@ -73,8 +73,9 @@ export abstract class TestFileLoader extends EventTarget { query: TestQuery, { subqueriesToExpand = [], + fullyExpandSubtrees = [], maxChunkTime = Infinity, - }: { subqueriesToExpand?: string[]; maxChunkTime?: number } = {} + }: { subqueriesToExpand?: string[]; fullyExpandSubtrees?: string[]; maxChunkTime?: number } = {} ): Promise { const tree = await loadTreeForQuery(this, query, { subqueriesToExpand: subqueriesToExpand.map(s => { @@ -82,6 +83,7 @@ export abstract class TestFileLoader extends EventTarget { assert(q.level >= 2, () => `subqueriesToExpand entries should not be multi-file:\n ${q}`); return q; }), + fullyExpandSubtrees: fullyExpandSubtrees.map(s => parseQuery(s)), maxChunkTime, }); this.dispatchEvent(new MessageEvent('finish')); diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/logging/log_message.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/logging/log_message.ts index ee006cdeb3..b01c08b56e 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/logging/log_message.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/logging/log_message.ts @@ -1,19 +1,36 @@ import { ErrorWithExtra } from '../../util/util.js'; import { extractImportantStackTrace } from '../stack.js'; +import { LogMessageRawData } from './result.js'; + export class LogMessageWithStack extends Error { readonly extra: unknown; private stackHiddenMessage: string | undefined = undefined; - constructor(name: string, ex: Error | ErrorWithExtra) { - super(ex.message); + /** + * Wrap an Error (which was created to capture the stack at that point) into a + * LogMessageWithStack (which has extra stuff for good log messages). + * + * The original `ex.name` is ignored. Inclued it in the `name` parameter if it + * needs to be preserved. + */ + static wrapError(name: string, ex: Error | ErrorWithExtra) { + return new LogMessageWithStack({ + name, + message: ex.message, + stackHiddenMessage: undefined, + stack: ex.stack, + extra: 'extra' in ex ? ex.extra : undefined, + }); + } - this.name = name; - this.stack = ex.stack; - if ('extra' in ex) { - this.extra = ex.extra; - } + constructor(o: LogMessageRawData) { + super(o.message); + this.name = o.name; + this.stackHiddenMessage = o.stackHiddenMessage; + this.stack = o.stack; + this.extra = o.extra; } /** Set a flag so the stack is not printed in toJSON(). */ @@ -21,6 +38,11 @@ export class LogMessageWithStack extends Error { this.stackHiddenMessage ??= stackHiddenMessage; } + /** + * Print the message for display. + * + * Note: This is toJSON instead of toString to make it easy to save logs using JSON.stringify. + */ toJSON(): string { let m = this.name; if (this.message) m += ': ' + this.message; @@ -33,6 +55,21 @@ export class LogMessageWithStack extends Error { } return m; } + + /** + * Flatten the message for sending over a message channel. + * + * Note `extra` may get mangled by postMessage. + */ + toRawData(): LogMessageRawData { + return { + name: this.name, + message: this.message, + stackHiddenMessage: this.stackHiddenMessage, + stack: this.stack, + extra: this.extra, + }; + } } /** diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/logging/logger.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/logging/logger.ts index e4526cff54..6b95f48b74 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/logging/logger.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/logging/logger.ts @@ -1,3 +1,4 @@ +import { globalTestConfig } from '../../framework/test_config.js'; import { version } from '../version.js'; import { LiveTestCaseResult } from './result.js'; @@ -6,8 +7,6 @@ import { TestCaseRecorder } from './test_case_recorder.js'; export type LogResults = Map; export class Logger { - static globalDebugMode: boolean = false; - readonly overriddenDebugMode: boolean | undefined; readonly results: LogResults = new Map(); @@ -19,7 +18,7 @@ export class Logger { const result: LiveTestCaseResult = { status: 'running', timems: -1 }; this.results.set(name, result); return [ - new TestCaseRecorder(result, this.overriddenDebugMode ?? Logger.globalDebugMode), + new TestCaseRecorder(result, this.overriddenDebugMode ?? globalTestConfig.enableDebugLogs), result, ]; } diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/logging/result.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/logging/result.ts index 3318e8c937..9968f3d359 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/logging/result.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/logging/result.ts @@ -14,8 +14,24 @@ export interface LiveTestCaseResult extends TestCaseResult { logs?: LogMessageWithStack[]; } +/** + * Raw data for a test log message. + * + * This form is sendable over a message channel, except `extra` may get mangled. + */ +export interface LogMessageRawData { + name: string; + message: string; + stackHiddenMessage: string | undefined; + stack: string | undefined; + extra: unknown; +} + +/** + * Test case results in a form sendable over a message channel. + * + * Note `extra` may get mangled by postMessage. + */ export interface TransferredTestCaseResult extends TestCaseResult { - // When transferred from a worker, a LogMessageWithStack turns into a generic Error - // (its prototype gets lost and replaced with Error). - logs?: Error[]; + logs?: LogMessageRawData[]; } diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/logging/test_case_recorder.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/logging/test_case_recorder.ts index f5c3252b5c..78f625269e 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/logging/test_case_recorder.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/logging/test_case_recorder.ts @@ -45,8 +45,6 @@ export class TestCaseRecorder { private logs: LogMessageWithStack[] = []; private logLinesAtCurrentSeverity = 0; private debugging = false; - /** Used to dedup log messages which have identical stacks. */ - private messagesForPreviouslySeenStacks = new Map(); constructor(result: LiveTestCaseResult, debugging: boolean) { this.result = result; @@ -143,13 +141,15 @@ export class TestCaseRecorder { this.skipped(ex); return; } - this.logImpl(LogSeverity.ThrewException, 'EXCEPTION', ex); + // logImpl will discard the original error's ex.name. Preserve it here. + const name = ex instanceof Error ? `EXCEPTION: ${ex.name}` : 'EXCEPTION'; + this.logImpl(LogSeverity.ThrewException, name, ex); } private logImpl(level: LogSeverity, name: string, baseException: unknown): void { assert(baseException instanceof Error, 'test threw a non-Error object'); globalTestConfig.testHeartbeatCallback(); - const logMessage = new LogMessageWithStack(name, baseException); + const logMessage = LogMessageWithStack.wrapError(name, baseException); // Final case status should be the "worst" of all log entries. if (this.inSubCase) { diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/query/compare.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/query/compare.ts index a9419b87c1..f49833f5a2 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/query/compare.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/query/compare.ts @@ -58,7 +58,10 @@ function compareOneLevel(ordering: Ordering, aIsBig: boolean, bIsBig: boolean): return Ordering.Unordered; } -function comparePaths(a: readonly string[], b: readonly string[]): Ordering { +/** + * Compare two file paths, or file-local test paths, returning an Ordering between the two. + */ +export function comparePaths(a: readonly string[], b: readonly string[]): Ordering { const shorter = Math.min(a.length, b.length); for (let i = 0; i < shorter; ++i) { diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/query/parseQuery.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/query/parseQuery.ts index 996835b0ec..0a9b355804 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/query/parseQuery.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/query/parseQuery.ts @@ -17,12 +17,49 @@ import { import { kBigSeparator, kWildcard, kPathSeparator, kParamSeparator } from './separators.js'; import { validQueryPart } from './validQueryPart.js'; -export function parseQuery(s: string): TestQuery { +/** + * converts foo/bar/src/webgpu/this/that/file.spec.ts to webgpu:this,that,file,* + */ +function convertPathToQuery(path: string) { + // removes .spec.ts and splits by directory separators. + const parts = path.substring(0, path.length - 8).split(/\/|\\/g); + // Gets parts only after the last `src`. Example: returns ['webgpu', 'foo', 'bar', 'test'] + // for ['Users', 'me', 'src', 'cts', 'src', 'webgpu', 'foo', 'bar', 'test'] + const partsAfterSrc = parts.slice(parts.lastIndexOf('src') + 1); + const suite = partsAfterSrc.shift(); + return `${suite}:${partsAfterSrc.join(',')},*`; +} + +/** + * If a query looks like a path (ends in .spec.ts and has directory separators) + * then convert try to convert it to a query. + */ +function convertPathLikeToQuery(queryOrPath: string) { + return queryOrPath.endsWith('.spec.ts') && + (queryOrPath.includes('/') || queryOrPath.includes('\\')) + ? convertPathToQuery(queryOrPath) + : queryOrPath; +} + +/** + * Convert long suite names (the part before the first colon) to the + * shortest last word + * foo.bar.moo:test,subtest,foo -> moo:test,subtest,foo + */ +function shortenSuiteName(query: string) { + const parts = query.split(':'); + // converts foo.bar.moo to moo + const suite = parts.shift()?.replace(/.*\.(\w+)$/, '$1'); + return [suite, ...parts].join(':'); +} + +export function parseQuery(queryLike: string): TestQuery { try { - return parseQueryImpl(s); + const query = shortenSuiteName(convertPathLikeToQuery(queryLike)); + return parseQueryImpl(query); } catch (ex) { if (ex instanceof Error) { - ex.message += '\n on: ' + s; + ex.message += `\n on: ${queryLike}`; } throw ex; } diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/query/query.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/query/query.ts index 7c72a62f88..676ac46d38 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/query/query.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/query/query.ts @@ -1,5 +1,5 @@ import { TestParams } from '../../framework/fixture.js'; -import { optionEnabled } from '../../runtime/helper/options.js'; +import { optionWorkerMode } from '../../runtime/helper/options.js'; import { assert, unreachable } from '../../util/util.js'; import { Expectation } from '../logging/result.js'; @@ -188,12 +188,12 @@ export function parseExpectationsForTestQuery( assert( expectationURL.pathname === wptURL.pathname, `Invalid expectation path ${expectationURL.pathname} -Expectation should be of the form path/to/cts.https.html?worker=0&q=suite:test_path:test_name:foo=1;bar=2;... +Expectation should be of the form path/to/cts.https.html?debug=0&q=suite:test_path:test_name:foo=1;bar=2;... ` ); const params = expectationURL.searchParams; - if (optionEnabled('worker', params) !== optionEnabled('worker', wptURL.searchParams)) { + if (optionWorkerMode('worker', params) !== optionWorkerMode('worker', wptURL.searchParams)) { continue; } diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/test_group.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/test_group.ts index 632a822ef1..e1d0cde12d 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/test_group.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/test_group.ts @@ -34,7 +34,7 @@ import { validQueryPart } from '../internal/query/validQueryPart.js'; import { DeepReadonly } from '../util/types.js'; import { assert, unreachable } from '../util/util.js'; -import { logToWebsocket } from './websocket_logger.js'; +import { logToWebSocket } from './websocket_logger.js'; export type RunFn = ( rec: TestCaseRecorder, @@ -294,9 +294,11 @@ class TestBuilder { (this.description ? this.description + '\n\n' : '') + 'TODO: .unimplemented()'; this.isUnimplemented = true; - this.testFn = () => { + // Use the beforeFn to skip the test, so we don't have to iterate the subcases. + this.beforeFn = () => { throw new SkipTestCase('test unimplemented'); }; + this.testFn = () => {}; } /** Perform various validation/"lint" chenks. */ @@ -350,7 +352,7 @@ class TestBuilder { const testcaseStringUnique = stringifyPublicParamsUniquely(params); assert( !seen.has(testcaseStringUnique), - `Duplicate public test case+subcase params for test ${testPathString}: ${testcaseString}` + `Duplicate public test case+subcase params for test ${testPathString}: ${testcaseString} (${caseQuery})` ); seen.add(testcaseStringUnique); } @@ -737,7 +739,7 @@ class RunCaseSpecific implements RunCase { timems: rec.result.timems, nonskippedSubcaseCount: rec.nonskippedSubcaseCount, }; - logToWebsocket(JSON.stringify(msg)); + logToWebSocket(JSON.stringify(msg)); } } } diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/test_suite_listing.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/test_suite_listing.ts index 2d2b555366..c5a0e11448 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/test_suite_listing.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/test_suite_listing.ts @@ -1,6 +1,6 @@ // A listing of all specs within a single suite. This is the (awaited) type of // `groups` in '{cts,unittests}/listing.ts' and `listing` in the auto-generated -// 'out/{cts,unittests}/listing.js' files (see tools/gen_listings). +// 'out/{cts,unittests}/listing.js' files (see tools/gen_listings_and_webworkers). export type TestSuiteListing = TestSuiteListingEntry[]; export type TestSuiteListingEntry = TestSuiteListingEntrySpec | TestSuiteListingEntryReadme; diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/tree.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/tree.ts index 594837059c..f2fad59037 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/tree.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/tree.ts @@ -286,8 +286,9 @@ export async function loadTreeForQuery( queryToLoad: TestQuery, { subqueriesToExpand, + fullyExpandSubtrees = [], maxChunkTime = Infinity, - }: { subqueriesToExpand: TestQuery[]; maxChunkTime?: number } + }: { subqueriesToExpand: TestQuery[]; fullyExpandSubtrees?: TestQuery[]; maxChunkTime?: number } ): Promise { const suite = queryToLoad.suite; const specs = await loader.listing(suite); @@ -303,6 +304,10 @@ export async function loadTreeForQuery( // If toExpand == subquery, no expansion is needed (but it's still "seen"). if (ordering === Ordering.Equal) seenSubqueriesToExpand[i] = true; return ordering !== Ordering.StrictSubset; + }) && + fullyExpandSubtrees.every(toExpand => { + const ordering = compareQueries(toExpand, subquery); + return ordering === Ordering.Unordered; }); // L0 = suite-level, e.g. suite:* diff --git a/dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts b/dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts index 30246df843..373378e7c2 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/internal/websocket_logger.ts @@ -1,3 +1,5 @@ +import { globalTestConfig } from '../framework/test_config.js'; + /** * - 'uninitialized' means we haven't tried to connect yet * - Promise means it's pending @@ -8,12 +10,15 @@ let connection: Promise | WebSocket | 'failed' | 'uninitia 'uninitialized'; /** - * Log a string to a websocket at `localhost:59497`. See `tools/websocket-logger`. + * If the logToWebSocket option is enabled (?log_to_web_socket=1 in browser, + * --log-to-web-socket on command line, or enable it by default in options.ts), + * log a string to a websocket at `localhost:59497`. See `tools/websocket-logger`. * - * This does nothing if a connection couldn't be established on the first call. + * This does nothing if a logToWebSocket is not enabled, or if a connection + * couldn't be established on the first call. */ -export function logToWebsocket(msg: string) { - if (connection === 'failed') { +export function logToWebSocket(msg: string) { + if (!globalTestConfig.logToWebSocket || connection === 'failed') { return; } diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/cmdline.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/cmdline.ts index 44a73fb38b..2a00640f0e 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/runtime/cmdline.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/cmdline.ts @@ -3,6 +3,7 @@ import * as fs from 'fs'; import { dataCache } from '../framework/data_cache.js'; +import { getResourcePath, setBaseResourcePath } from '../framework/resources.js'; import { globalTestConfig } from '../framework/test_config.js'; import { DefaultTestFileLoader } from '../internal/file_loader.js'; import { prettyPrintLog } from '../internal/logging/log_message.js'; @@ -37,6 +38,12 @@ Options: return sys.exit(rc); } +if (!sys.existsSync('src/common/runtime/cmdline.ts')) { + console.log('Must be run from repository root'); + usage(1); +} +setBaseResourcePath('out-node/resources'); + // The interface that exposes creation of the GPU, and optional interface to code coverage. interface GPUProviderModule { // @returns a GPU with the given flags @@ -60,12 +67,10 @@ Colors.enabled = false; let verbose = false; let emitCoverage = false; let listMode: listModes = 'none'; -let debug = false; let printJSON = false; let quiet = false; let loadWebGPUExpectations: Promise | undefined = undefined; let gpuProviderModule: GPUProviderModule | undefined = undefined; -let dataPath: string | undefined = undefined; const queries: string[] = []; const gpuProviderFlags: string[] = []; @@ -83,9 +88,7 @@ for (let i = 0; i < sys.args.length; ++i) { } else if (a === '--list-unimplemented') { listMode = 'unimplemented'; } else if (a === '--debug') { - debug = true; - } else if (a === '--data') { - dataPath = sys.args[++i]; + globalTestConfig.enableDebugLogs = true; } else if (a === '--print-json') { printJSON = true; } else if (a === '--expectations') { @@ -102,6 +105,10 @@ for (let i = 0; i < sys.args.length; ++i) { globalTestConfig.unrollConstEvalLoops = true; } else if (a === '--compat') { globalTestConfig.compatibility = true; + } else if (a === '--force-fallback-adapter') { + globalTestConfig.forceFallbackAdapter = true; + } else if (a === '--log-to-websocket') { + globalTestConfig.logToWebSocket = true; } else { console.log('unrecognized flag: ', a); usage(1); @@ -113,9 +120,12 @@ for (let i = 0; i < sys.args.length; ++i) { let codeCoverage: CodeCoverageProvider | undefined = undefined; -if (globalTestConfig.compatibility) { +if (globalTestConfig.compatibility || globalTestConfig.forceFallbackAdapter) { // MAINTENANCE_TODO: remove the cast once compatibilityMode is officially added - setDefaultRequestAdapterOptions({ compatibilityMode: true } as GPURequestAdapterOptions); + setDefaultRequestAdapterOptions({ + compatibilityMode: globalTestConfig.compatibility, + forceFallbackAdapter: globalTestConfig.forceFallbackAdapter, + } as GPURequestAdapterOptions); } if (gpuProviderModule) { @@ -132,21 +142,20 @@ Did you remember to build with code coverage instrumentation enabled?` } } -if (dataPath !== undefined) { - dataCache.setStore({ - load: (path: string) => { - return new Promise((resolve, reject) => { - fs.readFile(`${dataPath}/${path}`, (err, data) => { - if (err !== null) { - reject(err.message); - } else { - resolve(data); - } - }); +dataCache.setStore({ + load: (path: string) => { + return new Promise((resolve, reject) => { + fs.readFile(getResourcePath(`cache/${path}`), (err, data) => { + if (err !== null) { + reject(err.message); + } else { + resolve(data); + } }); - }, - }); -} + }); + }, +}); + if (verbose) { dataCache.setDebugLogger(console.log); } @@ -166,7 +175,6 @@ if (queries.length === 0) { filterQuery ); - Logger.globalDebugMode = debug; const log = new Logger(); const failed: Array<[string, LiveTestCaseResult]> = []; diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts index 38974b803f..4a82c7d292 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/options.ts @@ -1,3 +1,5 @@ +import { unreachable } from '../../util/util.js'; + let windowURL: URL | undefined = undefined; function getWindowURL() { if (windowURL === undefined) { @@ -6,6 +8,7 @@ function getWindowURL() { return windowURL; } +/** Parse a runner option that is always boolean-typed. False if missing or '0'. */ export function optionEnabled( opt: string, searchParams: URLSearchParams = getWindowURL().searchParams @@ -14,30 +17,55 @@ export function optionEnabled( return val !== null && val !== '0'; } +/** Parse a runner option that is string-typed. If the option is missing, returns `null`. */ export function optionString( opt: string, searchParams: URLSearchParams = getWindowURL().searchParams -): string { - return searchParams.get(opt) || ''; +): string | null { + return searchParams.get(opt); +} + +/** Runtime modes for running tests in different types of workers. */ +export type WorkerMode = 'dedicated' | 'service' | 'shared'; +/** Parse a runner option for different worker modes (as in `?worker=shared`). Null if no worker. */ +export function optionWorkerMode( + opt: string, + searchParams: URLSearchParams = getWindowURL().searchParams +): WorkerMode | null { + const value = searchParams.get(opt); + if (value === null || value === '0') { + return null; + } else if (value === 'service') { + return 'service'; + } else if (value === 'shared') { + return 'shared'; + } else if (value === '' || value === '1' || value === 'dedicated') { + return 'dedicated'; + } + unreachable('invalid worker= option value'); } /** * The possible options for the tests. */ export interface CTSOptions { - worker: boolean; + worker: WorkerMode | null; debug: boolean; compatibility: boolean; + forceFallbackAdapter: boolean; unrollConstEvalLoops: boolean; - powerPreference?: GPUPowerPreference | ''; + powerPreference: GPUPowerPreference | null; + logToWebSocket: boolean; } export const kDefaultCTSOptions: CTSOptions = { - worker: false, + worker: null, debug: true, compatibility: false, + forceFallbackAdapter: false, unrollConstEvalLoops: false, - powerPreference: '', + powerPreference: null, + logToWebSocket: false, }; /** @@ -45,8 +73,8 @@ export const kDefaultCTSOptions: CTSOptions = { */ export interface OptionInfo { description: string; - parser?: (key: string, searchParams?: URLSearchParams) => boolean | string; - selectValueDescriptions?: { value: string; description: string }[]; + parser?: (key: string, searchParams?: URLSearchParams) => boolean | string | null; + selectValueDescriptions?: { value: string | null; description: string }[]; } /** @@ -59,19 +87,30 @@ export type OptionsInfos = Record; * Options to the CTS. */ export const kCTSOptionsInfo: OptionsInfos = { - worker: { description: 'run in a worker' }, + worker: { + description: 'run in a worker', + parser: optionWorkerMode, + selectValueDescriptions: [ + { value: null, description: 'no worker' }, + { value: 'dedicated', description: 'dedicated worker' }, + { value: 'shared', description: 'shared worker' }, + { value: 'service', description: 'service worker' }, + ], + }, debug: { description: 'show more info' }, compatibility: { description: 'run in compatibility mode' }, + forceFallbackAdapter: { description: 'pass forceFallbackAdapter: true to requestAdapter' }, unrollConstEvalLoops: { description: 'unroll const eval loops in WGSL' }, powerPreference: { description: 'set default powerPreference for some tests', parser: optionString, selectValueDescriptions: [ - { value: '', description: 'default' }, + { value: null, description: 'default' }, { value: 'low-power', description: 'low-power' }, { value: 'high-performance', description: 'high-performance' }, ], }, + logToWebSocket: { description: 'send some logs to ws://localhost:59497/' }, }; /** @@ -95,7 +134,7 @@ function getOptionsInfoFromSearchString( searchString: string ): Type { const searchParams = new URLSearchParams(searchString); - const optionValues: Record = {}; + const optionValues: Record = {}; for (const [optionName, info] of Object.entries(optionsInfos)) { const parser = info.parser || optionEnabled; optionValues[optionName] = parser(camelCaseToSnakeCase(optionName), searchParams); diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/test_worker-worker.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/test_worker-worker.ts index e8d187ea7e..ebc206c3b2 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/test_worker-worker.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/test_worker-worker.ts @@ -1,15 +1,11 @@ import { setBaseResourcePath } from '../../framework/resources.js'; -import { globalTestConfig } from '../../framework/test_config.js'; import { DefaultTestFileLoader } from '../../internal/file_loader.js'; -import { Logger } from '../../internal/logging/logger.js'; import { parseQuery } from '../../internal/query/parseQuery.js'; -import { TestQueryWithExpectation } from '../../internal/query/query.js'; -import { setDefaultRequestAdapterOptions } from '../../util/navigator_gpu.js'; import { assert } from '../../util/util.js'; -import { CTSOptions } from './options.js'; +import { setupWorkerEnvironment, WorkerTestRunRequest } from './utils_worker.js'; -// Should be DedicatedWorkerGlobalScope, but importing lib "webworker" conflicts with lib "dom". +// Should be WorkerGlobalScope, but importing lib "webworker" conflicts with lib "dom". /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ declare const self: any; @@ -17,25 +13,10 @@ const loader = new DefaultTestFileLoader(); setBaseResourcePath('../../../resources'); -self.onmessage = async (ev: MessageEvent) => { - const query: string = ev.data.query; - const expectations: TestQueryWithExpectation[] = ev.data.expectations; - const ctsOptions: CTSOptions = ev.data.ctsOptions; +async function reportTestResults(this: MessagePort | Worker, ev: MessageEvent) { + const { query, expectations, ctsOptions } = ev.data as WorkerTestRunRequest; - const { debug, unrollConstEvalLoops, powerPreference, compatibility } = ctsOptions; - globalTestConfig.unrollConstEvalLoops = unrollConstEvalLoops; - globalTestConfig.compatibility = compatibility; - - Logger.globalDebugMode = debug; - const log = new Logger(); - - if (powerPreference || compatibility) { - setDefaultRequestAdapterOptions({ - ...(powerPreference && { powerPreference }), - // MAINTENANCE_TODO: Change this to whatever the option ends up being - ...(compatibility && { compatibilityMode: true }), - }); - } + const log = setupWorkerEnvironment(ctsOptions); const testcases = Array.from(await loader.loadCases(parseQuery(query))); assert(testcases.length === 1, 'worker query resulted in != 1 cases'); @@ -44,5 +25,23 @@ self.onmessage = async (ev: MessageEvent) => { const [rec, result] = log.record(testcase.query.toString()); await testcase.run(rec, expectations); - self.postMessage({ query, result }); + this.postMessage({ + query, + result: { + ...result, + logs: result.logs?.map(l => l.toRawData()), + }, + }); +} + +self.onmessage = (ev: MessageEvent) => { + void reportTestResults.call(ev.source || self, ev); +}; + +self.onconnect = (event: MessageEvent) => { + const port = event.ports[0]; + + port.onmessage = (ev: MessageEvent) => { + void reportTestResults.call(port, ev); + }; }; diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/test_worker.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/test_worker.ts index 9bbcab0946..f9a44bb7bc 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/test_worker.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/test_worker.ts @@ -2,48 +2,190 @@ import { LogMessageWithStack } from '../../internal/logging/log_message.js'; import { TransferredTestCaseResult, LiveTestCaseResult } from '../../internal/logging/result.js'; import { TestCaseRecorder } from '../../internal/logging/test_case_recorder.js'; import { TestQueryWithExpectation } from '../../internal/query/query.js'; +import { timeout } from '../../util/timeout.js'; +import { assert } from '../../util/util.js'; -import { CTSOptions, kDefaultCTSOptions } from './options.js'; +import { CTSOptions, WorkerMode, kDefaultCTSOptions } from './options.js'; +import { WorkerTestRunRequest } from './utils_worker.js'; -export class TestWorker { - private readonly ctsOptions: CTSOptions; - private readonly worker: Worker; - private readonly resolvers = new Map void>(); +/** Query all currently-registered service workers, and unregister them. */ +function unregisterAllServiceWorkers() { + void navigator.serviceWorker.getRegistrations().then(registrations => { + for (const registration of registrations) { + void registration.unregister(); + } + }); +} - constructor(ctsOptions?: CTSOptions) { - this.ctsOptions = { ...(ctsOptions || kDefaultCTSOptions), ...{ worker: true } }; - const selfPath = import.meta.url; - const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); - const workerPath = selfPathDir + '/test_worker-worker.js'; - this.worker = new Worker(workerPath, { type: 'module' }); - this.worker.onmessage = ev => { - const query: string = ev.data.query; - const result: TransferredTestCaseResult = ev.data.result; - if (result.logs) { - for (const l of result.logs) { - Object.setPrototypeOf(l, LogMessageWithStack.prototype); - } - } - this.resolvers.get(query)!(result as LiveTestCaseResult); +// NOTE: This code runs on startup for any runtime with worker support. Here, we use that chance to +// delete any leaked service workers, and register to clean up after ourselves at shutdown. +unregisterAllServiceWorkers(); +window.addEventListener('beforeunload', () => { + unregisterAllServiceWorkers(); +}); + +abstract class TestBaseWorker { + protected readonly ctsOptions: CTSOptions; + protected readonly resolvers = new Map void>(); + + constructor(worker: WorkerMode, ctsOptions?: CTSOptions) { + this.ctsOptions = { ...(ctsOptions || kDefaultCTSOptions), ...{ worker } }; + } - // MAINTENANCE_TODO(kainino0x): update the Logger with this result (or don't have a logger and - // update the entire results JSON somehow at some point). + onmessage(ev: MessageEvent) { + const query: string = ev.data.query; + const transferredResult: TransferredTestCaseResult = ev.data.result; + + const result: LiveTestCaseResult = { + status: transferredResult.status, + timems: transferredResult.timems, + logs: transferredResult.logs?.map(l => new LogMessageWithStack(l)), }; + + this.resolvers.get(query)!(result); + this.resolvers.delete(query); + + // MAINTENANCE_TODO(kainino0x): update the Logger with this result (or don't have a logger and + // update the entire results JSON somehow at some point). } - async run( - rec: TestCaseRecorder, + makeRequestAndRecordResult( + target: MessagePort | Worker | ServiceWorker, query: string, - expectations: TestQueryWithExpectation[] = [] - ): Promise { - this.worker.postMessage({ + expectations: TestQueryWithExpectation[] + ): Promise { + const request: WorkerTestRunRequest = { query, expectations, ctsOptions: this.ctsOptions, - }); - const workerResult = await new Promise(resolve => { + }; + target.postMessage(request); + + return new Promise(resolve => { + assert(!this.resolvers.has(query), "can't request same query twice simultaneously"); this.resolvers.set(query, resolve); }); - rec.injectResult(workerResult); + } + + async run( + rec: TestCaseRecorder, + query: string, + expectations: TestQueryWithExpectation[] = [] + ): Promise { + try { + rec.injectResult(await this.runImpl(query, expectations)); + } catch (ex) { + rec.start(); + rec.threw(ex); + rec.finish(); + } + } + + protected abstract runImpl( + query: string, + expectations: TestQueryWithExpectation[] + ): Promise; +} + +export class TestDedicatedWorker extends TestBaseWorker { + private readonly worker: Worker | Error; + + constructor(ctsOptions?: CTSOptions) { + super('dedicated', ctsOptions); + try { + if (typeof Worker === 'undefined') { + throw new Error('Dedicated Workers not available'); + } + + const selfPath = import.meta.url; + const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); + const workerPath = selfPathDir + '/test_worker-worker.js'; + this.worker = new Worker(workerPath, { type: 'module' }); + this.worker.onmessage = ev => this.onmessage(ev); + } catch (ex) { + assert(ex instanceof Error); + // Save the exception to re-throw in runImpl(). + this.worker = ex; + } + } + + override runImpl(query: string, expectations: TestQueryWithExpectation[] = []) { + if (this.worker instanceof Worker) { + return this.makeRequestAndRecordResult(this.worker, query, expectations); + } else { + throw this.worker; + } + } +} + +/** @deprecated Use TestDedicatedWorker instead. */ +export class TestWorker extends TestDedicatedWorker {} + +export class TestSharedWorker extends TestBaseWorker { + /** MessagePort to the SharedWorker, or an Error if it couldn't be initialized. */ + private readonly port: MessagePort | Error; + + constructor(ctsOptions?: CTSOptions) { + super('shared', ctsOptions); + try { + if (typeof SharedWorker === 'undefined') { + throw new Error('Shared Workers not available'); + } + + const selfPath = import.meta.url; + const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); + const workerPath = selfPathDir + '/test_worker-worker.js'; + const worker = new SharedWorker(workerPath, { type: 'module' }); + this.port = worker.port; + this.port.start(); + this.port.onmessage = ev => this.onmessage(ev); + } catch (ex) { + assert(ex instanceof Error); + // Save the exception to re-throw in runImpl(). + this.port = ex; + } + } + + override runImpl(query: string, expectations: TestQueryWithExpectation[] = []) { + if (this.port instanceof MessagePort) { + return this.makeRequestAndRecordResult(this.port, query, expectations); + } else { + throw this.port; + } + } +} + +export class TestServiceWorker extends TestBaseWorker { + constructor(ctsOptions?: CTSOptions) { + super('service', ctsOptions); + } + + override async runImpl(query: string, expectations: TestQueryWithExpectation[] = []) { + if (!('serviceWorker' in navigator)) { + throw new Error('Service Workers not available'); + } + const [suite, name] = query.split(':', 2); + const fileName = name.split(',').join('/'); + + const selfPath = import.meta.url; + const selfPathDir = selfPath.substring(0, selfPath.lastIndexOf('/')); + // Construct the path to the worker file, then use URL to resolve the `../` components. + const serviceWorkerURL = new URL( + `${selfPathDir}/../../../${suite}/webworker/${fileName}.worker.js` + ).toString(); + + // If a registration already exists for this path, it will be ignored. + const registration = await navigator.serviceWorker.register(serviceWorkerURL, { + type: 'module', + }); + // Make sure the registration we just requested is active. (We don't worry about it being + // outdated from a previous page load, because we wipe all service workers on shutdown/startup.) + while (!registration.active || registration.active.scriptURL !== serviceWorkerURL) { + await new Promise(resolve => timeout(resolve, 0)); + } + const serviceWorker = registration.active; + + navigator.serviceWorker.onmessage = ev => this.onmessage(ev); + return this.makeRequestAndRecordResult(serviceWorker, query, expectations); } } diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/utils_worker.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/utils_worker.ts new file mode 100644 index 0000000000..13880635bc --- /dev/null +++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/utils_worker.ts @@ -0,0 +1,35 @@ +import { globalTestConfig } from '../../framework/test_config.js'; +import { Logger } from '../../internal/logging/logger.js'; +import { TestQueryWithExpectation } from '../../internal/query/query.js'; +import { setDefaultRequestAdapterOptions } from '../../util/navigator_gpu.js'; + +import { CTSOptions } from './options.js'; + +export interface WorkerTestRunRequest { + query: string; + expectations: TestQueryWithExpectation[]; + ctsOptions: CTSOptions; +} + +/** + * Set config environment for workers with ctsOptions and return a Logger. + */ +export function setupWorkerEnvironment(ctsOptions: CTSOptions): Logger { + const { powerPreference, compatibility } = ctsOptions; + globalTestConfig.enableDebugLogs = ctsOptions.debug; + globalTestConfig.unrollConstEvalLoops = ctsOptions.unrollConstEvalLoops; + globalTestConfig.compatibility = compatibility; + globalTestConfig.logToWebSocket = ctsOptions.logToWebSocket; + + const log = new Logger(); + + if (powerPreference || compatibility) { + setDefaultRequestAdapterOptions({ + ...(powerPreference && { powerPreference }), + // MAINTENANCE_TODO: Change this to whatever the option ends up being + ...(compatibility && { compatibilityMode: true }), + }); + } + + return log; +} diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/wrap_for_worker.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/wrap_for_worker.ts new file mode 100644 index 0000000000..5f600fe89d --- /dev/null +++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/helper/wrap_for_worker.ts @@ -0,0 +1,54 @@ +import { Fixture } from '../../framework/fixture'; +import { LogMessageWithStack } from '../../internal/logging/log_message.js'; +import { comparePaths, comparePublicParamsPaths, Ordering } from '../../internal/query/compare.js'; +import { parseQuery } from '../../internal/query/parseQuery.js'; +import { TestQuerySingleCase } from '../../internal/query/query.js'; +import { TestGroup } from '../../internal/test_group.js'; +import { assert } from '../../util/util.js'; + +import { setupWorkerEnvironment, WorkerTestRunRequest } from './utils_worker.js'; + +/** + * Sets up the currently running Web Worker to wrap the TestGroup object `g`. + * `g` is the `g` exported from a `.spec.ts` file: a TestGroupBuilder interface, + * which underneath is actually a TestGroup object. + * + * This is used in the generated `.worker.js` files that are generated to use as service workers. + */ +export function wrapTestGroupForWorker(g: TestGroup) { + self.onmessage = async (ev: MessageEvent) => { + const { query, expectations, ctsOptions } = ev.data as WorkerTestRunRequest; + try { + const log = setupWorkerEnvironment(ctsOptions); + + const testQuery = parseQuery(query); + assert(testQuery instanceof TestQuerySingleCase); + let testcase = null; + for (const t of g.iterate()) { + if (comparePaths(t.testPath, testQuery.testPathParts) !== Ordering.Equal) { + continue; + } + for (const c of t.iterate(testQuery.params)) { + if (comparePublicParamsPaths(c.id.params, testQuery.params) === Ordering.Equal) { + testcase = c; + } + } + } + assert(!!testcase, 'testcase not found'); + const [rec, result] = log.record(query); + await testcase.run(rec, testQuery, expectations); + + ev.source?.postMessage({ query, result }); + } catch (thrown) { + const ex = thrown instanceof Error ? thrown : new Error(`${thrown}`); + ev.source?.postMessage({ + query, + result: { + status: 'fail', + timems: 0, + logs: [LogMessageWithStack.wrapError('INTERNAL', ex)], + }, + }); + } + }; +} diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/server.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/server.ts index 8310784e3a..3999b285ba 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/runtime/server.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/server.ts @@ -5,6 +5,7 @@ import * as http from 'http'; import { AddressInfo } from 'net'; import { dataCache } from '../framework/data_cache.js'; +import { getResourcePath, setBaseResourcePath } from '../framework/resources.js'; import { globalTestConfig } from '../framework/test_config.js'; import { DefaultTestFileLoader } from '../internal/file_loader.js'; import { prettyPrintLog } from '../internal/logging/log_message.js'; @@ -20,21 +21,23 @@ import sys from './helper/sys.js'; function usage(rc: number): never { console.log(`Usage: - tools/run_${sys.type} [OPTIONS...] + tools/server [OPTIONS...] Options: --colors Enable ANSI colors in output. --compat Run tests in compatibility mode. --coverage Add coverage data to each result. - --data Path to the data cache directory. --verbose Print result/log of every test as it runs. + --debug Include debug messages in logging. --gpu-provider Path to node module that provides the GPU implementation. --gpu-provider-flag Flag to set on the gpu-provider as = --unroll-const-eval-loops Unrolls loops in constant-evaluation shader execution tests --u Flag to set on the gpu-provider as = Provides an HTTP server used for running tests via an HTTP RPC interface -To run a test, perform an HTTP GET or POST at the URL: - http://localhost:port/run? +First, load some tree or subtree of tests: + http://localhost:port/load?unittests:basic:* +To run a single test case, perform an HTTP GET or POST at the URL: + http://localhost:port/run?unittests:basic:test,sync To shutdown the server perform an HTTP GET or POST at the URL: http://localhost:port/terminate `); @@ -46,6 +49,8 @@ interface RunResult { status: Status; // Any additional messages printed message: string; + // The time it took to execute the test + durationMS: number; // Code coverage data, if the server was started with `--coverage` // This data is opaque (implementation defined). coverageData?: string; @@ -71,13 +76,13 @@ if (!sys.existsSync('src/common/runtime/cmdline.ts')) { console.log('Must be run from repository root'); usage(1); } +setBaseResourcePath('out-node/resources'); Colors.enabled = false; let emitCoverage = false; let verbose = false; let gpuProviderModule: GPUProviderModule | undefined = undefined; -let dataPath: string | undefined = undefined; const gpuProviderFlags: string[] = []; for (let i = 0; i < sys.args.length; ++i) { @@ -89,13 +94,17 @@ for (let i = 0; i < sys.args.length; ++i) { globalTestConfig.compatibility = true; } else if (a === '--coverage') { emitCoverage = true; - } else if (a === '--data') { - dataPath = sys.args[++i]; + } else if (a === '--force-fallback-adapter') { + globalTestConfig.forceFallbackAdapter = true; + } else if (a === '--log-to-websocket') { + globalTestConfig.logToWebSocket = true; } else if (a === '--gpu-provider') { const modulePath = sys.args[++i]; gpuProviderModule = require(modulePath); } else if (a === '--gpu-provider-flag') { gpuProviderFlags.push(sys.args[++i]); + } else if (a === '--debug') { + globalTestConfig.enableDebugLogs = true; } else if (a === '--unroll-const-eval-loops') { globalTestConfig.unrollConstEvalLoops = true; } else if (a === '--help') { @@ -110,9 +119,12 @@ for (let i = 0; i < sys.args.length; ++i) { let codeCoverage: CodeCoverageProvider | undefined = undefined; -if (globalTestConfig.compatibility) { +if (globalTestConfig.compatibility || globalTestConfig.forceFallbackAdapter) { // MAINTENANCE_TODO: remove the cast once compatibilityMode is officially added - setDefaultRequestAdapterOptions({ compatibilityMode: true } as GPURequestAdapterOptions); + setDefaultRequestAdapterOptions({ + compatibilityMode: globalTestConfig.compatibility, + forceFallbackAdapter: globalTestConfig.forceFallbackAdapter, + } as GPURequestAdapterOptions); } if (gpuProviderModule) { @@ -130,28 +142,26 @@ Did you remember to build with code coverage instrumentation enabled?` } } -if (dataPath !== undefined) { - dataCache.setStore({ - load: (path: string) => { - return new Promise((resolve, reject) => { - fs.readFile(`${dataPath}/${path}`, (err, data) => { - if (err !== null) { - reject(err.message); - } else { - resolve(data); - } - }); +dataCache.setStore({ + load: (path: string) => { + return new Promise((resolve, reject) => { + fs.readFile(getResourcePath(`cache/${path}`), (err, data) => { + if (err !== null) { + reject(err.message); + } else { + resolve(data); + } }); - }, - }); -} + }); + }, +}); + if (verbose) { dataCache.setDebugLogger(console.log); } // eslint-disable-next-line @typescript-eslint/require-await (async () => { - Logger.globalDebugMode = verbose; const log = new Logger(); const testcases = new Map(); @@ -198,14 +208,16 @@ if (verbose) { if (codeCoverage !== undefined) { codeCoverage.begin(); } + const start = performance.now(); const result = await runTestcase(testcase); + const durationMS = performance.now() - start; const coverageData = codeCoverage !== undefined ? codeCoverage.end() : undefined; let message = ''; if (result.logs !== undefined) { message = result.logs.map(log => prettyPrintLog(log)).join('\n'); } const status = result.status; - const res: RunResult = { status, message, coverageData }; + const res: RunResult = { status, message, durationMS, coverageData }; response.statusCode = 200; response.end(JSON.stringify(res)); } else { diff --git a/dom/webgpu/tests/cts/checkout/src/common/runtime/standalone.ts b/dom/webgpu/tests/cts/checkout/src/common/runtime/standalone.ts index 0376f92dda..dc75e6fd01 100644 --- a/dom/webgpu/tests/cts/checkout/src/common/runtime/standalone.ts +++ b/dom/webgpu/tests/cts/checkout/src/common/runtime/standalone.ts @@ -2,7 +2,7 @@ /* eslint no-console: "off" */ import { dataCache } from '../framework/data_cache.js'; -import { setBaseResourcePath } from '../framework/resources.js'; +import { getResourcePath, setBaseResourcePath } from '../framework/resources.js'; import { globalTestConfig } from '../framework/test_config.js'; import { DefaultTestFileLoader } from '../internal/file_loader.js'; import { Logger } from '../internal/logging/logger.js'; @@ -21,7 +21,7 @@ import { OptionsInfos, camelCaseToSnakeCase, } from './helper/options.js'; -import { TestWorker } from './helper/test_worker.js'; +import { TestDedicatedWorker, TestSharedWorker, TestServiceWorker } from './helper/test_worker.js'; const rootQuerySpec = 'webgpu:*'; let promptBeforeReload = false; @@ -47,16 +47,26 @@ const { queries: qs, options } = parseSearchParamLikeWithOptions( kStandaloneOptionsInfos, window.location.search || rootQuerySpec ); -const { runnow, debug, unrollConstEvalLoops, powerPreference, compatibility } = options; -globalTestConfig.unrollConstEvalLoops = unrollConstEvalLoops; +const { runnow, powerPreference, compatibility, forceFallbackAdapter } = options; +globalTestConfig.enableDebugLogs = options.debug; +globalTestConfig.unrollConstEvalLoops = options.unrollConstEvalLoops; globalTestConfig.compatibility = compatibility; +globalTestConfig.logToWebSocket = options.logToWebSocket; -Logger.globalDebugMode = debug; const logger = new Logger(); setBaseResourcePath('../out/resources'); -const worker = options.worker ? new TestWorker(options) : undefined; +const testWorker = + options.worker === null + ? null + : options.worker === 'dedicated' + ? new TestDedicatedWorker(options) + : options.worker === 'shared' + ? new TestSharedWorker(options) + : options.worker === 'service' + ? new TestServiceWorker(options) + : unreachable(); const autoCloseOnPass = document.getElementById('autoCloseOnPass') as HTMLInputElement; const resultsVis = document.getElementById('resultsVis')!; @@ -70,17 +80,18 @@ stopButtonElem.addEventListener('click', () => { stopRequested = true; }); -if (powerPreference || compatibility) { +if (powerPreference || compatibility || forceFallbackAdapter) { setDefaultRequestAdapterOptions({ ...(powerPreference && { powerPreference }), // MAINTENANCE_TODO: Change this to whatever the option ends up being ...(compatibility && { compatibilityMode: true }), + ...(forceFallbackAdapter && { forceFallbackAdapter: true }), }); } dataCache.setStore({ load: async (path: string) => { - const response = await fetch(`data/${path}`); + const response = await fetch(getResourcePath(`cache/${path}`)); if (!response.ok) { return Promise.reject(response.statusText); } @@ -168,8 +179,8 @@ function makeCaseHTML(t: TestTreeLeaf): VisualizedSubtree { const [rec, res] = logger.record(name); caseResult = res; - if (worker) { - await worker.run(rec, name); + if (testWorker) { + await testWorker.run(rec, name); } else { await t.run(rec); } @@ -223,6 +234,12 @@ function makeCaseHTML(t: TestTreeLeaf): VisualizedSubtree { if (caseResult.logs) { caselogs.empty(); + // Show exceptions at the top since they are often unexpected can point out an error in the test itself vs the WebGPU implementation. + caseResult.logs + .filter(l => l.name === 'EXCEPTION') + .forEach(l => { + $('
').addClass('testcaselogtext').text(l.toJSON()).appendTo(caselogs);
+            });
           for (const l of caseResult.logs) {
             const caselog = $('
').addClass('testcaselog').appendTo(caselogs); $('