@matter/tools 0.11.0-alpha.0-20241005-e3e4e4a7a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +100 -0
- package/bin/build.js +10 -0
- package/bin/prepare-chip.js +5 -0
- package/bin/run.js +7 -0
- package/bin/test.js +7 -0
- package/bin/version.js +7 -0
- package/chip/Dockerfile +23 -0
- package/dist/cjs/building/builder.d.ts +35 -0
- package/dist/cjs/building/builder.d.ts.map +1 -0
- package/dist/cjs/building/builder.js +210 -0
- package/dist/cjs/building/builder.js.map +6 -0
- package/dist/cjs/building/cli.d.ts +7 -0
- package/dist/cjs/building/cli.d.ts.map +1 -0
- package/dist/cjs/building/cli.js +100 -0
- package/dist/cjs/building/cli.js.map +6 -0
- package/dist/cjs/building/error.d.ts +16 -0
- package/dist/cjs/building/error.d.ts.map +1 -0
- package/dist/cjs/building/error.js +50 -0
- package/dist/cjs/building/error.js.map +6 -0
- package/dist/cjs/building/graph.d.ts +37 -0
- package/dist/cjs/building/graph.d.ts.map +1 -0
- package/dist/cjs/building/graph.js +222 -0
- package/dist/cjs/building/graph.js.map +6 -0
- package/dist/cjs/building/project.d.ts +56 -0
- package/dist/cjs/building/project.d.ts.map +1 -0
- package/dist/cjs/building/project.js +239 -0
- package/dist/cjs/building/project.js.map +6 -0
- package/dist/cjs/building/tsconfig.d.ts +16 -0
- package/dist/cjs/building/tsconfig.d.ts.map +1 -0
- package/dist/cjs/building/tsconfig.js +70 -0
- package/dist/cjs/building/tsconfig.js.map +6 -0
- package/dist/cjs/building/typescript/context.d.ts +16 -0
- package/dist/cjs/building/typescript/context.d.ts.map +1 -0
- package/dist/cjs/building/typescript/context.js +82 -0
- package/dist/cjs/building/typescript/context.js.map +6 -0
- package/dist/cjs/building/typescript/incremental-compiler.d.ts +10 -0
- package/dist/cjs/building/typescript/incremental-compiler.d.ts.map +1 -0
- package/dist/cjs/building/typescript/incremental-compiler.js +119 -0
- package/dist/cjs/building/typescript/incremental-compiler.js.map +6 -0
- package/dist/cjs/building/typescript/language-service.d.ts +13 -0
- package/dist/cjs/building/typescript/language-service.d.ts.map +1 -0
- package/dist/cjs/building/typescript/language-service.js +109 -0
- package/dist/cjs/building/typescript/language-service.js.map +6 -0
- package/dist/cjs/building/typescript/solution-builder.d.ts +10 -0
- package/dist/cjs/building/typescript/solution-builder.d.ts.map +1 -0
- package/dist/cjs/building/typescript/solution-builder.js +72 -0
- package/dist/cjs/building/typescript/solution-builder.js.map +6 -0
- package/dist/cjs/building/typescript.d.ts +13 -0
- package/dist/cjs/building/typescript.d.ts.map +1 -0
- package/dist/cjs/building/typescript.js +31 -0
- package/dist/cjs/building/typescript.js.map +6 -0
- package/dist/cjs/index.d.ts +15 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +32 -0
- package/dist/cjs/index.js.map +6 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/running/cli.d.ts +19 -0
- package/dist/cjs/running/cli.d.ts.map +1 -0
- package/dist/cjs/running/cli.js +82 -0
- package/dist/cjs/running/cli.js.map +6 -0
- package/dist/cjs/running/execute.d.ts +8 -0
- package/dist/cjs/running/execute.d.ts.map +1 -0
- package/dist/cjs/running/execute.js +82 -0
- package/dist/cjs/running/execute.js.map +6 -0
- package/dist/cjs/testing/chip/pics-file.d.ts +20 -0
- package/dist/cjs/testing/chip/pics-file.d.ts.map +1 -0
- package/dist/cjs/testing/chip/pics-file.js +79 -0
- package/dist/cjs/testing/chip/pics-file.js.map +6 -0
- package/dist/cjs/testing/chip.d.ts +60 -0
- package/dist/cjs/testing/chip.d.ts.map +1 -0
- package/dist/cjs/testing/chip.js +306 -0
- package/dist/cjs/testing/chip.js.map +6 -0
- package/dist/cjs/testing/cli.d.ts +9 -0
- package/dist/cjs/testing/cli.d.ts.map +1 -0
- package/dist/cjs/testing/cli.js +117 -0
- package/dist/cjs/testing/cli.js.map +6 -0
- package/dist/cjs/testing/failure-detail.d.ts +19 -0
- package/dist/cjs/testing/failure-detail.d.ts.map +1 -0
- package/dist/cjs/testing/failure-detail.js +143 -0
- package/dist/cjs/testing/failure-detail.js.map +6 -0
- package/dist/cjs/testing/files.d.ts +8 -0
- package/dist/cjs/testing/files.d.ts.map +1 -0
- package/dist/cjs/testing/files.js +52 -0
- package/dist/cjs/testing/files.js.map +6 -0
- package/dist/cjs/testing/global-declarations.d.ts +38 -0
- package/dist/cjs/testing/global-declarations.d.ts.map +1 -0
- package/dist/cjs/testing/global-declarations.js +8 -0
- package/dist/cjs/testing/global-declarations.js.map +6 -0
- package/dist/cjs/testing/global-definitions.d.ts +7 -0
- package/dist/cjs/testing/global-definitions.d.ts.map +1 -0
- package/dist/cjs/testing/global-definitions.js +50 -0
- package/dist/cjs/testing/global-definitions.js.map +6 -0
- package/dist/cjs/testing/mocha.d.ts +36 -0
- package/dist/cjs/testing/mocha.d.ts.map +1 -0
- package/dist/cjs/testing/mocha.js +155 -0
- package/dist/cjs/testing/mocha.js.map +6 -0
- package/dist/cjs/testing/mocharc.cjs +68 -0
- package/dist/cjs/testing/mocharc.d.cts +7 -0
- package/dist/cjs/testing/mocks/crypto.d.ts +7 -0
- package/dist/cjs/testing/mocks/crypto.d.ts.map +1 -0
- package/dist/cjs/testing/mocks/crypto.js +79 -0
- package/dist/cjs/testing/mocks/crypto.js.map +6 -0
- package/dist/cjs/testing/mocks/environment.d.ts +7 -0
- package/dist/cjs/testing/mocks/environment.d.ts.map +1 -0
- package/dist/cjs/testing/mocks/environment.js +7 -0
- package/dist/cjs/testing/mocks/environment.js.map +6 -0
- package/dist/cjs/testing/mocks/index.d.ts +10 -0
- package/dist/cjs/testing/mocks/index.d.ts.map +1 -0
- package/dist/cjs/testing/mocks/index.js +27 -0
- package/dist/cjs/testing/mocks/index.js.map +6 -0
- package/dist/cjs/testing/mocks/logging.d.ts +28 -0
- package/dist/cjs/testing/mocks/logging.d.ts.map +1 -0
- package/dist/cjs/testing/mocks/logging.js +93 -0
- package/dist/cjs/testing/mocks/logging.js.map +6 -0
- package/dist/cjs/testing/mocks/time.d.ts +88 -0
- package/dist/cjs/testing/mocks/time.d.ts.map +1 -0
- package/dist/cjs/testing/mocks/time.js +250 -0
- package/dist/cjs/testing/mocks/time.js.map +6 -0
- package/dist/cjs/testing/node.d.ts +16 -0
- package/dist/cjs/testing/node.d.ts.map +1 -0
- package/dist/cjs/testing/node.js +108 -0
- package/dist/cjs/testing/node.js.map +6 -0
- package/dist/cjs/testing/options.d.ts +19 -0
- package/dist/cjs/testing/options.d.ts.map +1 -0
- package/dist/cjs/testing/options.js +62 -0
- package/dist/cjs/testing/options.js.map +6 -0
- package/dist/cjs/testing/reporter.d.ts +50 -0
- package/dist/cjs/testing/reporter.d.ts.map +1 -0
- package/dist/cjs/testing/reporter.js +137 -0
- package/dist/cjs/testing/reporter.js.map +6 -0
- package/dist/cjs/testing/runner.d.ts +22 -0
- package/dist/cjs/testing/runner.d.ts.map +1 -0
- package/dist/cjs/testing/runner.js +116 -0
- package/dist/cjs/testing/runner.js.map +6 -0
- package/dist/cjs/testing/web.d.ts +8 -0
- package/dist/cjs/testing/web.d.ts.map +1 -0
- package/dist/cjs/testing/web.js +165 -0
- package/dist/cjs/testing/web.js.map +6 -0
- package/dist/cjs/util/bootstrap.mjs +105 -0
- package/dist/cjs/util/docker.d.ts +27 -0
- package/dist/cjs/util/docker.d.ts.map +1 -0
- package/dist/cjs/util/docker.js +163 -0
- package/dist/cjs/util/docker.js.map +6 -0
- package/dist/cjs/util/errors.d.ts +8 -0
- package/dist/cjs/util/errors.d.ts.map +1 -0
- package/dist/cjs/util/errors.js +55 -0
- package/dist/cjs/util/errors.js.map +6 -0
- package/dist/cjs/util/index.d.ts +8 -0
- package/dist/cjs/util/index.d.ts.map +1 -0
- package/dist/cjs/util/index.js +25 -0
- package/dist/cjs/util/index.js.map +6 -0
- package/dist/cjs/util/node-shims.d.ts +7 -0
- package/dist/cjs/util/node-shims.d.ts.map +1 -0
- package/dist/cjs/util/node-shims.js +12 -0
- package/dist/cjs/util/node-shims.js.map +6 -0
- package/dist/cjs/util/package.d.ts +61 -0
- package/dist/cjs/util/package.d.ts.map +1 -0
- package/dist/cjs/util/package.js +324 -0
- package/dist/cjs/util/package.js.map +6 -0
- package/dist/cjs/util/progress.d.ts +31 -0
- package/dist/cjs/util/progress.d.ts.map +1 -0
- package/dist/cjs/util/progress.js +232 -0
- package/dist/cjs/util/progress.js.map +6 -0
- package/dist/cjs/util/tools-path.cjs +13 -0
- package/dist/cjs/util/tools-path.d.cts +7 -0
- package/dist/cjs/util/trace-unhandled.d.ts +9 -0
- package/dist/cjs/util/trace-unhandled.d.ts.map +1 -0
- package/dist/cjs/util/trace-unhandled.js +48 -0
- package/dist/cjs/util/trace-unhandled.js.map +6 -0
- package/dist/cjs/util/wtf.d.ts +10 -0
- package/dist/cjs/util/wtf.d.ts.map +1 -0
- package/dist/cjs/util/wtf.js +53 -0
- package/dist/cjs/util/wtf.js.map +6 -0
- package/dist/cjs/versioning/cli.d.ts +7 -0
- package/dist/cjs/versioning/cli.d.ts.map +1 -0
- package/dist/cjs/versioning/cli.js +62 -0
- package/dist/cjs/versioning/cli.js.map +6 -0
- package/dist/cjs/versioning/versioner.d.ts +18 -0
- package/dist/cjs/versioning/versioner.d.ts.map +1 -0
- package/dist/cjs/versioning/versioner.js +145 -0
- package/dist/cjs/versioning/versioner.js.map +6 -0
- package/dist/esm/building/builder.d.ts +35 -0
- package/dist/esm/building/builder.d.ts.map +1 -0
- package/dist/esm/building/builder.js +180 -0
- package/dist/esm/building/builder.js.map +6 -0
- package/dist/esm/building/cli.d.ts +7 -0
- package/dist/esm/building/cli.d.ts.map +1 -0
- package/dist/esm/building/cli.js +70 -0
- package/dist/esm/building/cli.js.map +6 -0
- package/dist/esm/building/error.d.ts +16 -0
- package/dist/esm/building/error.d.ts.map +1 -0
- package/dist/esm/building/error.js +30 -0
- package/dist/esm/building/error.js.map +6 -0
- package/dist/esm/building/graph.d.ts +37 -0
- package/dist/esm/building/graph.d.ts.map +1 -0
- package/dist/esm/building/graph.js +192 -0
- package/dist/esm/building/graph.js.map +6 -0
- package/dist/esm/building/project.d.ts +56 -0
- package/dist/esm/building/project.d.ts.map +1 -0
- package/dist/esm/building/project.js +219 -0
- package/dist/esm/building/project.js.map +6 -0
- package/dist/esm/building/tsconfig.d.ts +16 -0
- package/dist/esm/building/tsconfig.d.ts.map +1 -0
- package/dist/esm/building/tsconfig.js +50 -0
- package/dist/esm/building/tsconfig.js.map +6 -0
- package/dist/esm/building/typescript/context.d.ts +16 -0
- package/dist/esm/building/typescript/context.d.ts.map +1 -0
- package/dist/esm/building/typescript/context.js +68 -0
- package/dist/esm/building/typescript/context.js.map +6 -0
- package/dist/esm/building/typescript/incremental-compiler.d.ts +10 -0
- package/dist/esm/building/typescript/incremental-compiler.d.ts.map +1 -0
- package/dist/esm/building/typescript/incremental-compiler.js +99 -0
- package/dist/esm/building/typescript/incremental-compiler.js.map +6 -0
- package/dist/esm/building/typescript/language-service.d.ts +13 -0
- package/dist/esm/building/typescript/language-service.d.ts.map +1 -0
- package/dist/esm/building/typescript/language-service.js +99 -0
- package/dist/esm/building/typescript/language-service.js.map +6 -0
- package/dist/esm/building/typescript/solution-builder.d.ts +10 -0
- package/dist/esm/building/typescript/solution-builder.d.ts.map +1 -0
- package/dist/esm/building/typescript/solution-builder.js +52 -0
- package/dist/esm/building/typescript/solution-builder.js.map +6 -0
- package/dist/esm/building/typescript.d.ts +13 -0
- package/dist/esm/building/typescript.d.ts.map +1 -0
- package/dist/esm/building/typescript.js +11 -0
- package/dist/esm/building/typescript.js.map +6 -0
- package/dist/esm/index.d.ts +15 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/running/cli.d.ts +19 -0
- package/dist/esm/running/cli.d.ts.map +1 -0
- package/dist/esm/running/cli.js +62 -0
- package/dist/esm/running/cli.js.map +6 -0
- package/dist/esm/running/execute.d.ts +8 -0
- package/dist/esm/running/execute.d.ts.map +1 -0
- package/dist/esm/running/execute.js +52 -0
- package/dist/esm/running/execute.js.map +6 -0
- package/dist/esm/testing/chip/pics-file.d.ts +20 -0
- package/dist/esm/testing/chip/pics-file.d.ts.map +1 -0
- package/dist/esm/testing/chip/pics-file.js +59 -0
- package/dist/esm/testing/chip/pics-file.js.map +6 -0
- package/dist/esm/testing/chip.d.ts +60 -0
- package/dist/esm/testing/chip.d.ts.map +1 -0
- package/dist/esm/testing/chip.js +286 -0
- package/dist/esm/testing/chip.js.map +6 -0
- package/dist/esm/testing/cli.d.ts +9 -0
- package/dist/esm/testing/cli.d.ts.map +1 -0
- package/dist/esm/testing/cli.js +87 -0
- package/dist/esm/testing/cli.js.map +6 -0
- package/dist/esm/testing/failure-detail.d.ts +19 -0
- package/dist/esm/testing/failure-detail.d.ts.map +1 -0
- package/dist/esm/testing/failure-detail.js +113 -0
- package/dist/esm/testing/failure-detail.js.map +6 -0
- package/dist/esm/testing/files.d.ts +8 -0
- package/dist/esm/testing/files.d.ts.map +1 -0
- package/dist/esm/testing/files.js +32 -0
- package/dist/esm/testing/files.js.map +6 -0
- package/dist/esm/testing/global-declarations.d.ts +38 -0
- package/dist/esm/testing/global-declarations.d.ts.map +1 -0
- package/dist/esm/testing/global-declarations.js +7 -0
- package/dist/esm/testing/global-declarations.js.map +6 -0
- package/dist/esm/testing/global-definitions.d.ts +7 -0
- package/dist/esm/testing/global-definitions.d.ts.map +1 -0
- package/dist/esm/testing/global-definitions.js +27 -0
- package/dist/esm/testing/global-definitions.js.map +6 -0
- package/dist/esm/testing/mocha.d.ts +36 -0
- package/dist/esm/testing/mocha.d.ts.map +1 -0
- package/dist/esm/testing/mocha.js +135 -0
- package/dist/esm/testing/mocha.js.map +6 -0
- package/dist/esm/testing/mocharc.cjs +68 -0
- package/dist/esm/testing/mocharc.d.cts +7 -0
- package/dist/esm/testing/mocks/crypto.d.ts +7 -0
- package/dist/esm/testing/mocks/crypto.d.ts.map +1 -0
- package/dist/esm/testing/mocks/crypto.js +59 -0
- package/dist/esm/testing/mocks/crypto.js.map +6 -0
- package/dist/esm/testing/mocks/environment.d.ts +7 -0
- package/dist/esm/testing/mocks/environment.d.ts.map +1 -0
- package/dist/esm/testing/mocks/environment.js +6 -0
- package/dist/esm/testing/mocks/environment.js.map +6 -0
- package/dist/esm/testing/mocks/index.d.ts +10 -0
- package/dist/esm/testing/mocks/index.d.ts.map +1 -0
- package/dist/esm/testing/mocks/index.js +10 -0
- package/dist/esm/testing/mocks/index.js.map +6 -0
- package/dist/esm/testing/mocks/logging.d.ts +28 -0
- package/dist/esm/testing/mocks/logging.d.ts.map +1 -0
- package/dist/esm/testing/mocks/logging.js +63 -0
- package/dist/esm/testing/mocks/logging.js.map +6 -0
- package/dist/esm/testing/mocks/time.d.ts +88 -0
- package/dist/esm/testing/mocks/time.d.ts.map +1 -0
- package/dist/esm/testing/mocks/time.js +230 -0
- package/dist/esm/testing/mocks/time.js.map +6 -0
- package/dist/esm/testing/node.d.ts +16 -0
- package/dist/esm/testing/node.d.ts.map +1 -0
- package/dist/esm/testing/node.js +78 -0
- package/dist/esm/testing/node.js.map +6 -0
- package/dist/esm/testing/options.d.ts +19 -0
- package/dist/esm/testing/options.d.ts.map +1 -0
- package/dist/esm/testing/options.js +42 -0
- package/dist/esm/testing/options.js.map +6 -0
- package/dist/esm/testing/reporter.d.ts +50 -0
- package/dist/esm/testing/reporter.d.ts.map +1 -0
- package/dist/esm/testing/reporter.js +107 -0
- package/dist/esm/testing/reporter.js.map +6 -0
- package/dist/esm/testing/runner.d.ts +22 -0
- package/dist/esm/testing/runner.d.ts.map +1 -0
- package/dist/esm/testing/runner.js +86 -0
- package/dist/esm/testing/runner.js.map +6 -0
- package/dist/esm/testing/web.d.ts +8 -0
- package/dist/esm/testing/web.d.ts.map +1 -0
- package/dist/esm/testing/web.js +135 -0
- package/dist/esm/testing/web.js.map +6 -0
- package/dist/esm/util/bootstrap.mjs +105 -0
- package/dist/esm/util/docker.d.ts +27 -0
- package/dist/esm/util/docker.d.ts.map +1 -0
- package/dist/esm/util/docker.js +133 -0
- package/dist/esm/util/docker.js.map +6 -0
- package/dist/esm/util/errors.d.ts +8 -0
- package/dist/esm/util/errors.d.ts.map +1 -0
- package/dist/esm/util/errors.js +35 -0
- package/dist/esm/util/errors.js.map +6 -0
- package/dist/esm/util/index.d.ts +8 -0
- package/dist/esm/util/index.d.ts.map +1 -0
- package/dist/esm/util/index.js +8 -0
- package/dist/esm/util/index.js.map +6 -0
- package/dist/esm/util/node-shims.d.ts +7 -0
- package/dist/esm/util/node-shims.d.ts.map +1 -0
- package/dist/esm/util/node-shims.js +11 -0
- package/dist/esm/util/node-shims.js.map +6 -0
- package/dist/esm/util/package.d.ts +61 -0
- package/dist/esm/util/package.d.ts.map +1 -0
- package/dist/esm/util/package.js +304 -0
- package/dist/esm/util/package.js.map +6 -0
- package/dist/esm/util/progress.d.ts +31 -0
- package/dist/esm/util/progress.d.ts.map +1 -0
- package/dist/esm/util/progress.js +202 -0
- package/dist/esm/util/progress.js.map +6 -0
- package/dist/esm/util/tools-path.cjs +13 -0
- package/dist/esm/util/tools-path.d.cts +7 -0
- package/dist/esm/util/trace-unhandled.d.ts +9 -0
- package/dist/esm/util/trace-unhandled.d.ts.map +1 -0
- package/dist/esm/util/trace-unhandled.js +18 -0
- package/dist/esm/util/trace-unhandled.js.map +6 -0
- package/dist/esm/util/wtf.d.ts +10 -0
- package/dist/esm/util/wtf.d.ts.map +1 -0
- package/dist/esm/util/wtf.js +23 -0
- package/dist/esm/util/wtf.js.map +6 -0
- package/dist/esm/versioning/cli.d.ts +7 -0
- package/dist/esm/versioning/cli.d.ts.map +1 -0
- package/dist/esm/versioning/cli.js +32 -0
- package/dist/esm/versioning/cli.js.map +6 -0
- package/dist/esm/versioning/versioner.d.ts +18 -0
- package/dist/esm/versioning/versioner.d.ts.map +1 -0
- package/dist/esm/versioning/versioner.js +115 -0
- package/dist/esm/versioning/versioner.js.map +6 -0
- package/package.json +82 -0
- package/src/building/builder.ts +216 -0
- package/src/building/cli.ts +89 -0
- package/src/building/error.ts +29 -0
- package/src/building/graph.ts +251 -0
- package/src/building/project.ts +313 -0
- package/src/building/tsconfig.ts +69 -0
- package/src/building/typescript/context.ts +85 -0
- package/src/building/typescript/incremental-compiler.ts +126 -0
- package/src/building/typescript/language-service.ts +132 -0
- package/src/building/typescript/solution-builder.ts +67 -0
- package/src/building/typescript.ts +15 -0
- package/src/index.ts +15 -0
- package/src/running/cli.ts +95 -0
- package/src/running/execute.ts +63 -0
- package/src/testing/chip/pics-file.ts +71 -0
- package/src/testing/chip/pics.properties +53 -0
- package/src/testing/chip.ts +420 -0
- package/src/testing/cli.ts +122 -0
- package/src/testing/failure-detail.ts +126 -0
- package/src/testing/files.ts +35 -0
- package/src/testing/global-declarations.ts +50 -0
- package/src/testing/global-definitions.ts +35 -0
- package/src/testing/index.html +16 -0
- package/src/testing/mocha.ts +162 -0
- package/src/testing/mocharc.cjs +68 -0
- package/src/testing/mocharc.d.cts +7 -0
- package/src/testing/mocks/crypto.ts +70 -0
- package/src/testing/mocks/environment.ts +7 -0
- package/src/testing/mocks/index.ts +10 -0
- package/src/testing/mocks/logging.ts +99 -0
- package/src/testing/mocks/time.ts +294 -0
- package/src/testing/node.ts +114 -0
- package/src/testing/options.ts +58 -0
- package/src/testing/reporter.ts +144 -0
- package/src/testing/runner.ts +98 -0
- package/src/testing/web.ts +174 -0
- package/src/tsconfig.json +14 -0
- package/src/util/bootstrap.mjs +105 -0
- package/src/util/docker.ts +176 -0
- package/src/util/errors.ts +33 -0
- package/src/util/index.ts +8 -0
- package/src/util/node-shims.ts +13 -0
- package/src/util/package.ts +369 -0
- package/src/util/progress.ts +252 -0
- package/src/util/tools-path.cjs +13 -0
- package/src/util/tools-path.d.cts +7 -0
- package/src/util/trace-unhandled.ts +17 -0
- package/src/util/wtf.ts +25 -0
- package/src/versioning/cli.ts +43 -0
- package/src/versioning/versioner.ts +139 -0
- package/test/testing/mocks/MockTimeTest.ts +113 -0
- package/test/tsconfig.json +15 -0
- package/tsc/tsconfig.app.json +7 -0
- package/tsc/tsconfig.base.json +41 -0
- package/tsc/tsconfig.lib.json +12 -0
- package/tsc/tsconfig.test.json +7 -0
- package/tsconfig.json +5 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
type TimerCallback = () => any;
|
|
8
|
+
|
|
9
|
+
type MockTimeLike = typeof MockTime;
|
|
10
|
+
export interface MockTime extends MockTimeLike {}
|
|
11
|
+
|
|
12
|
+
// Must match matter.js Timer interface
|
|
13
|
+
class MockTimer {
|
|
14
|
+
name = "Test";
|
|
15
|
+
systemId = 0;
|
|
16
|
+
intervalMs = 0;
|
|
17
|
+
isPeriodic = false;
|
|
18
|
+
|
|
19
|
+
isRunning = false;
|
|
20
|
+
private readonly callback: TimerCallback;
|
|
21
|
+
|
|
22
|
+
constructor(
|
|
23
|
+
private readonly mockTime: MockTime,
|
|
24
|
+
private readonly durationMs: number,
|
|
25
|
+
callback: TimerCallback,
|
|
26
|
+
) {
|
|
27
|
+
if (this instanceof MockInterval) {
|
|
28
|
+
this.callback = callback;
|
|
29
|
+
} else {
|
|
30
|
+
this.callback = () => {
|
|
31
|
+
this.isRunning = false;
|
|
32
|
+
callback();
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
start() {
|
|
38
|
+
this.mockTime.callbackAtTime(this.mockTime.nowMs() + this.durationMs, this.callback);
|
|
39
|
+
this.isRunning = true;
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
stop() {
|
|
44
|
+
this.mockTime.removeCallback(this.callback);
|
|
45
|
+
this.isRunning = false;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
class MockInterval extends MockTimer {
|
|
51
|
+
constructor(mockTime: MockTime, durationMs: number, callback: TimerCallback) {
|
|
52
|
+
const intervalCallback = async () => {
|
|
53
|
+
mockTime.callbackAtTime(mockTime.nowMs() + durationMs, intervalCallback);
|
|
54
|
+
await callback();
|
|
55
|
+
};
|
|
56
|
+
super(mockTime, durationMs, intervalCallback);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
type InterceptResult<T> =
|
|
61
|
+
T extends Promise<T>
|
|
62
|
+
? { resolve: Awaited<T>; reject?: undefined } | { resolve?: undefined; reject: {} }
|
|
63
|
+
: { resolve: T; reject?: undefined } | { resolve?: void; reject: {} };
|
|
64
|
+
|
|
65
|
+
function isAsync(fn: (...args: any) => any): fn is (...args: any) => Promise<any> {
|
|
66
|
+
return fn.constructor.name === "AsyncFunction";
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
let callbacks = new Array<{ atMs: number; callback: TimerCallback }>();
|
|
70
|
+
let nowMs = 0;
|
|
71
|
+
let real = undefined as unknown;
|
|
72
|
+
let enabled = true;
|
|
73
|
+
|
|
74
|
+
// Must match matter.js Time interface
|
|
75
|
+
export const MockTime = {
|
|
76
|
+
get activeImplementation(): unknown {
|
|
77
|
+
return enabled ? this : (real ?? this);
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
disable() {
|
|
81
|
+
enabled = false;
|
|
82
|
+
reinstallTime?.();
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
enable() {
|
|
86
|
+
enabled = true;
|
|
87
|
+
reinstallTime?.();
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
reset(time = 0) {
|
|
91
|
+
callbacks = [];
|
|
92
|
+
nowMs = time;
|
|
93
|
+
|
|
94
|
+
// Ensure time reverts to correct implementation across suites
|
|
95
|
+
reinstallTime?.();
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
now(): Date {
|
|
99
|
+
return new Date(nowMs);
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
nowMs() {
|
|
103
|
+
return nowMs;
|
|
104
|
+
},
|
|
105
|
+
|
|
106
|
+
getTimer(_name: string, durationMs: number, callback: TimerCallback): MockTimer {
|
|
107
|
+
return new MockTimer(this, durationMs, callback);
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
getPeriodicTimer(_name: string, intervalMs: number, callback: TimerCallback): MockTimer {
|
|
111
|
+
return new MockInterval(this, intervalMs, callback);
|
|
112
|
+
},
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Resolve a promise with time dependency.
|
|
116
|
+
*
|
|
117
|
+
* Moves time forward until the promise resolves.
|
|
118
|
+
*/
|
|
119
|
+
async resolve<T>(promise: PromiseLike<T>) {
|
|
120
|
+
let resolved = false;
|
|
121
|
+
let result: T | undefined;
|
|
122
|
+
let error: any;
|
|
123
|
+
|
|
124
|
+
promise.then(
|
|
125
|
+
r => {
|
|
126
|
+
resolved = true;
|
|
127
|
+
result = r;
|
|
128
|
+
},
|
|
129
|
+
e => {
|
|
130
|
+
resolved = true;
|
|
131
|
+
error = e;
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
let timeAdvanced = 0;
|
|
136
|
+
while (!resolved) {
|
|
137
|
+
// Interestingly, a Time.yield() works in almost every case. However, on Node SubtleCrypto.deriveBits hangs
|
|
138
|
+
// if you only yield via microtask. It seems to require yielding via macrotask. So we use setTimeout here.
|
|
139
|
+
// Probably related to entropy collection but I think it's safe to classify as a Node bug. Tested on
|
|
140
|
+
// version 20.11.0
|
|
141
|
+
await new Promise<void>(resolve => setTimeout(() => resolve(), 0));
|
|
142
|
+
|
|
143
|
+
if (resolved) {
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// If we've advanced more than one hour, assume we've hung
|
|
148
|
+
if (timeAdvanced > 60 * 60 * 1000) {
|
|
149
|
+
throw new Error(
|
|
150
|
+
"Mock timeout: Promise did not resolve within one (virtual) hour, probably not going to happen",
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Advance time exponentially, trying for granularity but also OK performance. Note that we are not only
|
|
155
|
+
// advancing time but also yielding event loop. So it's possible if we run out of time it's just because
|
|
156
|
+
// there were too few yields in one virtual hour. As designed currently it's 360 macrotasks and 360
|
|
157
|
+
// microtasks (360 loops w/ 1 macro- and 1 micro-yield)
|
|
158
|
+
await this.advance(1000);
|
|
159
|
+
timeAdvanced += 1000;
|
|
160
|
+
|
|
161
|
+
if (resolved) {
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
await this.yield();
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if (error !== undefined) {
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return result as T;
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Move time forward. Runs tasks scheduled during this interval.
|
|
177
|
+
*/
|
|
178
|
+
async advance(ms: number) {
|
|
179
|
+
const newTimeMs = nowMs + ms;
|
|
180
|
+
|
|
181
|
+
while (true) {
|
|
182
|
+
if (callbacks.length === 0) break;
|
|
183
|
+
const { atMs, callback } = callbacks[0];
|
|
184
|
+
if (atMs > newTimeMs) break;
|
|
185
|
+
callbacks.shift();
|
|
186
|
+
nowMs = atMs;
|
|
187
|
+
await callback();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
nowMs = newTimeMs;
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Yield to scheduled microtasks. This means that all code paths waiting
|
|
195
|
+
* on resolved promises (including await) will proceed before this method
|
|
196
|
+
* returns.
|
|
197
|
+
*/
|
|
198
|
+
async yield() {
|
|
199
|
+
await Promise.resolve();
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Due to its implementation, an older version of yield() would actually
|
|
204
|
+
* yield to microtasks three times. Our tests then depended on this
|
|
205
|
+
* functionality -- one yield could trigger up to three nested awaits.
|
|
206
|
+
*
|
|
207
|
+
* To make this clear, the version of yield() that emulates old behavior
|
|
208
|
+
* is called "yield3".
|
|
209
|
+
*/
|
|
210
|
+
async yield3() {
|
|
211
|
+
await Promise.resolve();
|
|
212
|
+
await Promise.resolve();
|
|
213
|
+
await Promise.resolve();
|
|
214
|
+
},
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Hook a method and invoke a callback just before the method completes.
|
|
218
|
+
* Unhooks after completion.
|
|
219
|
+
*
|
|
220
|
+
* Handles both synchronous and asynchronous methods. The interceptor
|
|
221
|
+
* should match the async-ness of the intercepted method.
|
|
222
|
+
*
|
|
223
|
+
* The interceptor can optionally access and/or replace the resolve/reject
|
|
224
|
+
* value.
|
|
225
|
+
*/
|
|
226
|
+
interceptOnce<NameT extends string, ReturnT, ObjT extends { [N in NameT]: (...args: any) => ReturnT }>(
|
|
227
|
+
obj: ObjT,
|
|
228
|
+
method: NameT,
|
|
229
|
+
interceptor: (
|
|
230
|
+
result: InterceptResult<ReturnT>,
|
|
231
|
+
) => void | InterceptResult<ReturnT> | Promise<void> | Promise<InterceptResult<ReturnT>>,
|
|
232
|
+
) {
|
|
233
|
+
const original = obj[method];
|
|
234
|
+
if (!original) {
|
|
235
|
+
throw new Error(`Interception method ${method} is not present`);
|
|
236
|
+
}
|
|
237
|
+
let result: InterceptResult<ReturnT>;
|
|
238
|
+
if (isAsync(interceptor)) {
|
|
239
|
+
obj[method] = async function (this: any, ...args: any): Promise<any> {
|
|
240
|
+
try {
|
|
241
|
+
// eslint-disable-next-line @typescript-eslint/await-thenable
|
|
242
|
+
const resolve = await original.apply(this, args);
|
|
243
|
+
result = { resolve } as any;
|
|
244
|
+
} catch (reject) {
|
|
245
|
+
result = { reject } as any;
|
|
246
|
+
} finally {
|
|
247
|
+
obj[method] = original;
|
|
248
|
+
}
|
|
249
|
+
result = (await interceptor(result)) ?? result;
|
|
250
|
+
if (result.reject) {
|
|
251
|
+
throw result.reject;
|
|
252
|
+
}
|
|
253
|
+
return result.resolve;
|
|
254
|
+
} as any;
|
|
255
|
+
} else {
|
|
256
|
+
obj[method] = function (this: any, ...args: any): any {
|
|
257
|
+
try {
|
|
258
|
+
const resolve = original.apply(this, args);
|
|
259
|
+
result = { resolve } as any;
|
|
260
|
+
} catch (reject) {
|
|
261
|
+
result = { reject } as any;
|
|
262
|
+
} finally {
|
|
263
|
+
obj[method] = original;
|
|
264
|
+
}
|
|
265
|
+
result = (interceptor(result) as any) ?? result;
|
|
266
|
+
if (result.reject) {
|
|
267
|
+
throw result.reject;
|
|
268
|
+
}
|
|
269
|
+
return result.resolve;
|
|
270
|
+
} as any;
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
|
|
274
|
+
callbackAtTime(atMs: number, callback: TimerCallback) {
|
|
275
|
+
callbacks.push({ atMs, callback });
|
|
276
|
+
callbacks.sort(({ atMs: atMsA }, { atMs: atMsB }) => atMsA - atMsB);
|
|
277
|
+
},
|
|
278
|
+
|
|
279
|
+
removeCallback(callbackToRemove: TimerCallback) {
|
|
280
|
+
const index = callbacks.findIndex(({ callback }) => callbackToRemove === callback);
|
|
281
|
+
if (index === -1) return;
|
|
282
|
+
callbacks.splice(index, 1);
|
|
283
|
+
},
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
let reinstallTime: undefined | (() => void);
|
|
287
|
+
|
|
288
|
+
export function timeSetup(Time: { get(): unknown }) {
|
|
289
|
+
real = Time.get();
|
|
290
|
+
reinstallTime = () => (Time.get = () => MockTime.activeImplementation);
|
|
291
|
+
reinstallTime();
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
Object.assign(globalThis, { MockTime });
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { mkdir, writeFile } from "fs/promises";
|
|
8
|
+
import Mocha from "mocha";
|
|
9
|
+
import { relative } from "path";
|
|
10
|
+
import { adaptReporter, generalSetup } from "./mocha.js";
|
|
11
|
+
import { TestOptions } from "./options.js";
|
|
12
|
+
import type { TestRunner } from "./runner.js";
|
|
13
|
+
|
|
14
|
+
// Load globals so settings get applied
|
|
15
|
+
import { FailureDetail } from "./failure-detail.js";
|
|
16
|
+
import "./global-definitions.js";
|
|
17
|
+
|
|
18
|
+
export async function testNode(runner: TestRunner, format: "cjs" | "esm") {
|
|
19
|
+
// Grr Mocha (as of 10.2.0) classifies certain unhandled rejections as "mocha". For others, it uninstalls its
|
|
20
|
+
// unhandled rejection handler and re-emits the "unhandledRejection" event. But since it already handled the event,
|
|
21
|
+
// Node knows nothing about this and the event disappears silently.
|
|
22
|
+
//
|
|
23
|
+
// So we must add our own unhandledRejection handler, but only process exceptions if Mocha's handler is not
|
|
24
|
+
// installed, because the code that Mocha uses to determine if an error is a "mocha" error is not exported.
|
|
25
|
+
process.on("unhandledRejection", e => {
|
|
26
|
+
if (process.listenerCount("unhandledRejection") === 1) {
|
|
27
|
+
const error = new Error("Unhandled rejection (ignored by mocha)");
|
|
28
|
+
error.cause = e;
|
|
29
|
+
runner.reporter.failRun(FailureDetail(error));
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const mocha = new Mocha({
|
|
34
|
+
inlineDiffs: true,
|
|
35
|
+
reporter: adaptReporter(Mocha, format.toUpperCase(), runner.reporter),
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
generalSetup(mocha);
|
|
39
|
+
|
|
40
|
+
TestOptions.apply(mocha, runner.options);
|
|
41
|
+
|
|
42
|
+
const files = runner.loadFiles(format);
|
|
43
|
+
files.forEach(path => {
|
|
44
|
+
path = relative(process.cwd(), path);
|
|
45
|
+
if (path[0] !== ".") {
|
|
46
|
+
path = `./${path}`;
|
|
47
|
+
}
|
|
48
|
+
mocha.addFile(path);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
await mocha.loadFilesAsync();
|
|
52
|
+
|
|
53
|
+
const profiler = new Profiler();
|
|
54
|
+
if (runner.options.profile) {
|
|
55
|
+
await profiler.start();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
await new Promise<Mocha.Runner>(resolve => {
|
|
59
|
+
const runner = mocha.run(() => resolve(runner));
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
if (runner.options.profile) {
|
|
63
|
+
await profiler.stop(runner.pkg.resolve("build/profiles"));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// We use string concatenation to prevent TS from trying to find profiler library types. It doesn't build on all
|
|
68
|
+
// platforms we support and doesn't provide type declarations when it doesn't build
|
|
69
|
+
//
|
|
70
|
+
// This interface acts as a replacement for proper types
|
|
71
|
+
export interface Profilerish {
|
|
72
|
+
setGenerateType(value: number): void;
|
|
73
|
+
startProfiling(): void;
|
|
74
|
+
stopProfiling(): {
|
|
75
|
+
export(callback: (error: any, result: string) => any): void;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// v8-profiler-next doesn't manage switching node versions well. Load dynamically so it doesn't interfere if it's not
|
|
80
|
+
// built and we're not profiling
|
|
81
|
+
class Profiler {
|
|
82
|
+
#profiler?: Profilerish;
|
|
83
|
+
|
|
84
|
+
async start() {
|
|
85
|
+
this.#profiler = (await import("" + "v8-profiler-next")).default as Profilerish;
|
|
86
|
+
this.#profiler.setGenerateType(1);
|
|
87
|
+
this.#profiler.startProfiling();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async stop(outputDir: string) {
|
|
91
|
+
if (!this.#profiler) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const profile = this.#profiler.stopProfiling();
|
|
96
|
+
|
|
97
|
+
const result = await new Promise<string>((accept, reject) =>
|
|
98
|
+
profile.export((error, result) => {
|
|
99
|
+
if (error) {
|
|
100
|
+
reject(error);
|
|
101
|
+
} else if (!result) {
|
|
102
|
+
reject(new Error("No profile error or result"));
|
|
103
|
+
} else {
|
|
104
|
+
accept(result);
|
|
105
|
+
}
|
|
106
|
+
}),
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
await mkdir(outputDir, { recursive: true });
|
|
110
|
+
await writeFile(`${outputDir}/test-${new Date().toISOString().slice(0, 19)}.cpuprofile`, result);
|
|
111
|
+
|
|
112
|
+
this.#profiler = undefined;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export type TestOptions = {
|
|
8
|
+
spec?: string | string[];
|
|
9
|
+
profile?: boolean;
|
|
10
|
+
grep?: string;
|
|
11
|
+
fgrep?: string;
|
|
12
|
+
invert?: boolean;
|
|
13
|
+
allLogs?: boolean;
|
|
14
|
+
wtf?: boolean;
|
|
15
|
+
debug?: boolean;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
function option<T extends keyof TestOptions>(options: TestOptions, name: T) {
|
|
19
|
+
if (options[name] !== undefined && options[name] !== null) {
|
|
20
|
+
return options[name];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Support both node and browser
|
|
24
|
+
if (typeof process === "undefined") {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return process.env?.[
|
|
29
|
+
"MATTER_" +
|
|
30
|
+
name
|
|
31
|
+
.match(/(.[^A-Z]+)/g)
|
|
32
|
+
?.map(s => s.toUpperCase())
|
|
33
|
+
.join("_")
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export namespace TestOptions {
|
|
38
|
+
export function apply(mocha: Mocha, options: TestOptions) {
|
|
39
|
+
const grep = option(options, "grep");
|
|
40
|
+
if (grep) {
|
|
41
|
+
mocha.grep(grep);
|
|
42
|
+
}
|
|
43
|
+
const fgrep = option(options, "fgrep");
|
|
44
|
+
if (fgrep) {
|
|
45
|
+
mocha.fgrep(fgrep);
|
|
46
|
+
}
|
|
47
|
+
const invert = option(options, "invert");
|
|
48
|
+
if (invert) {
|
|
49
|
+
mocha.invert();
|
|
50
|
+
}
|
|
51
|
+
const allLogs = option(options, "allLogs");
|
|
52
|
+
if (allLogs) {
|
|
53
|
+
if (typeof MockLogger !== "undefined") {
|
|
54
|
+
MockLogger.emitAll = true;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import colors from "ansi-colors";
|
|
8
|
+
import { Progress } from "../util/progress.js";
|
|
9
|
+
import { FailureDetail } from "./failure-detail.js";
|
|
10
|
+
|
|
11
|
+
export type Stats = {
|
|
12
|
+
total: number;
|
|
13
|
+
complete: number;
|
|
14
|
+
failures: number;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export interface Reporter {
|
|
18
|
+
beginRun(name: string, stats?: Stats, supportsSuites?: boolean): void;
|
|
19
|
+
beginSuite(name: string[], stats?: Stats): void;
|
|
20
|
+
beginTest(name: string, stats?: Stats): void;
|
|
21
|
+
failTest(name: string, detail: FailureDetail): void;
|
|
22
|
+
endRun(stats?: Stats): void;
|
|
23
|
+
failRun(detail: FailureDetail): void;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface Failure {
|
|
27
|
+
suite: string[];
|
|
28
|
+
test: string;
|
|
29
|
+
detail: FailureDetail;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export abstract class ProgressReporter implements Reporter {
|
|
33
|
+
private run = "";
|
|
34
|
+
private suite = Array<string>();
|
|
35
|
+
private failures = Array<Failure>();
|
|
36
|
+
private lastTitle?: string;
|
|
37
|
+
|
|
38
|
+
constructor(private progress: Progress) {}
|
|
39
|
+
|
|
40
|
+
beginRun(name: string, stats: Stats | undefined, supportsSuites = true): void {
|
|
41
|
+
this.run = name;
|
|
42
|
+
this.suite = [];
|
|
43
|
+
this.failures = [];
|
|
44
|
+
if (!supportsSuites) {
|
|
45
|
+
this.progress.update(this.#summarize(stats));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
beginSuite(name: string[]): void {
|
|
50
|
+
this.suite = name;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
beginTest(name: string, stats?: Stats): void {
|
|
54
|
+
// If not a TTY, only update once per suite to keep the line count down for e.g. GH action logs
|
|
55
|
+
const title = process.stdout.isTTY ? this.#formatName(this.suite, name) : this.suite[0];
|
|
56
|
+
if (this.lastTitle !== title) {
|
|
57
|
+
this.lastTitle = title;
|
|
58
|
+
this.progress.update(this.#summarize(stats), title);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
failTest(name: string, detail: FailureDetail) {
|
|
63
|
+
this.failures.push({
|
|
64
|
+
suite: this.suite,
|
|
65
|
+
test: name,
|
|
66
|
+
detail,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
abstract failRun(detail: FailureDetail): void;
|
|
71
|
+
|
|
72
|
+
endRun(stats?: Stats): void {
|
|
73
|
+
if (this.failures.length) {
|
|
74
|
+
this.progress.failure(this.#summarize(stats));
|
|
75
|
+
this.#dumpFailures();
|
|
76
|
+
} else if (stats && !stats.complete) {
|
|
77
|
+
this.progress.failure("No tests found");
|
|
78
|
+
} else {
|
|
79
|
+
this.progress.success(this.#summarize(stats));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
#summarize(stats?: Stats) {
|
|
84
|
+
let statStr;
|
|
85
|
+
if (stats) {
|
|
86
|
+
const complete = colors.dim(`${stats.complete}/${stats.total}`);
|
|
87
|
+
const failures = stats.failures ? colors.redBright(` ${stats.failures.toString()} failed`) : "";
|
|
88
|
+
statStr = ` ${complete}${failures}`;
|
|
89
|
+
} else {
|
|
90
|
+
statStr = "";
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return `${colors.bold(this.run)}${statStr}`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
#dumpFailures() {
|
|
97
|
+
for (let i = 0; i < this.failures.length; i++) {
|
|
98
|
+
const failure = this.failures[i];
|
|
99
|
+
const index = `Failure ${colors.bold((i + 1).toString())} of ${this.failures.length}`;
|
|
100
|
+
process.stdout.write(`\n${index} ${this.#formatName(failure.suite, failure.test)}\n\n`);
|
|
101
|
+
|
|
102
|
+
FailureDetail.dump(failure.detail, " ");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
#formatName(suite: string[], test: string) {
|
|
107
|
+
return `${suite.join(" ➡ ")} ➡ ${colors.bold(test)}`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const actualConsole = console;
|
|
112
|
+
const actualLog = actualConsole.log;
|
|
113
|
+
|
|
114
|
+
function proxy(...args: any[]) {
|
|
115
|
+
actualLog.call(actualConsole, `${ConsoleProxyReporter.FLAG}${JSON.stringify(args)}`);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export class ConsoleProxyReporter implements Reporter {
|
|
119
|
+
static FLAG = "<<REPORT>> ";
|
|
120
|
+
|
|
121
|
+
beginRun(name: string, stats?: Stats) {
|
|
122
|
+
proxy("beginRun", name, stats);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
beginSuite(name: string[], stats?: Stats) {
|
|
126
|
+
proxy("beginSuite", name, stats);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
beginTest(name: string, stats?: Stats) {
|
|
130
|
+
proxy("beginTest", name, stats);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
endRun(stats?: Stats) {
|
|
134
|
+
proxy("endRun", stats);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
failTest(name: string, detail: FailureDetail) {
|
|
138
|
+
proxy("failTest", name, detail);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
failRun(detail: FailureDetail) {
|
|
142
|
+
proxy("failRun", detail);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import colors from "ansi-colors";
|
|
8
|
+
import debug from "debug";
|
|
9
|
+
import { glob } from "glob";
|
|
10
|
+
import { relative } from "path";
|
|
11
|
+
import { Package } from "../util/package.js";
|
|
12
|
+
import { Progress } from "../util/progress.js";
|
|
13
|
+
import { Chip } from "./chip.js";
|
|
14
|
+
import { FailureDetail } from "./failure-detail.js";
|
|
15
|
+
import { listSupportFiles } from "./files.js";
|
|
16
|
+
import { testNode } from "./node.js";
|
|
17
|
+
import { TestOptions } from "./options.js";
|
|
18
|
+
import { ProgressReporter, Reporter } from "./reporter.js";
|
|
19
|
+
import { testWeb } from "./web.js";
|
|
20
|
+
|
|
21
|
+
export class TestRunner {
|
|
22
|
+
readonly reporter: Reporter;
|
|
23
|
+
private spec = Array<string>();
|
|
24
|
+
|
|
25
|
+
constructor(
|
|
26
|
+
readonly pkg: Package,
|
|
27
|
+
readonly progress: Progress,
|
|
28
|
+
readonly options: TestOptions,
|
|
29
|
+
) {
|
|
30
|
+
Chip.config = { runner: this };
|
|
31
|
+
|
|
32
|
+
this.reporter = new (class extends ProgressReporter {
|
|
33
|
+
constructor() {
|
|
34
|
+
super(progress);
|
|
35
|
+
}
|
|
36
|
+
override failRun(detail: FailureDetail) {
|
|
37
|
+
process.stdout.write("\n");
|
|
38
|
+
FailureDetail.dump(detail);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
})();
|
|
42
|
+
|
|
43
|
+
if (options.spec === undefined) {
|
|
44
|
+
this.spec = ["test/**/*Test.ts"];
|
|
45
|
+
} else if (Array.isArray(options.spec)) {
|
|
46
|
+
this.spec = options.spec;
|
|
47
|
+
} else {
|
|
48
|
+
this.spec = [options.spec];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (options.debug) {
|
|
52
|
+
debug.enable("mocha:*");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async runNode(format: "esm" | "cjs" = "esm") {
|
|
57
|
+
await this.run(this.progress, () => testNode(this, format));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async runWeb(manual = false) {
|
|
61
|
+
await this.run(this.progress, () => testWeb(this, manual));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
loadFiles(format: "esm" | "cjs") {
|
|
65
|
+
const tests = [];
|
|
66
|
+
for (let spec of this.spec) {
|
|
67
|
+
spec = spec.replace(/\.ts$/, ".js");
|
|
68
|
+
spec = relative(this.pkg.path, spec);
|
|
69
|
+
if (!spec.startsWith(".") && !spec.startsWith("build/") && !spec.startsWith("dist/")) {
|
|
70
|
+
spec = `build/${format}/${spec}`;
|
|
71
|
+
}
|
|
72
|
+
spec = this.pkg.resolve(spec);
|
|
73
|
+
|
|
74
|
+
// Glob only understands forward-slash as separator because reasons
|
|
75
|
+
spec = spec.replace(/\\/g, "/");
|
|
76
|
+
|
|
77
|
+
tests.push(...glob.sync(spec));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!tests.length) {
|
|
81
|
+
fatal(`No files match ${this.spec.join(", ")}`);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return [...listSupportFiles(format), ...tests];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private async run(progress: Progress, runner: () => Promise<void>) {
|
|
88
|
+
await runner();
|
|
89
|
+
if (progress.status !== Progress.Status.Success) {
|
|
90
|
+
fatal(`Test ${progress.status.toLowerCase()}, aborting`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function fatal(message: string) {
|
|
96
|
+
process.stderr.write(colors.redBright(`\n${message}\n\n`));
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|