@xiuchang-midscene/shared 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/dist/es/baseDB.mjs +109 -0
- package/dist/es/baseDB.mjs.bak +109 -0
- package/dist/es/build/copy-static.mjs +31 -0
- package/dist/es/build/copy-static.mjs.bak +31 -0
- package/dist/es/build/rspack-config.mjs +4 -0
- package/dist/es/build/rspack-config.mjs.bak +4 -0
- package/dist/es/cli/cli-runner.mjs +140 -0
- package/dist/es/cli/cli-runner.mjs.bak +140 -0
- package/dist/es/cli/index.mjs +2 -0
- package/dist/es/cli/index.mjs.bak +2 -0
- package/dist/es/common.mjs +37 -0
- package/dist/es/common.mjs.bak +37 -0
- package/dist/es/constants/example-code.mjs +223 -0
- package/dist/es/constants/example-code.mjs.bak +223 -0
- package/dist/es/constants/index.mjs +23 -0
- package/dist/es/constants/index.mjs.bak +23 -0
- package/dist/es/env/basic.mjs +6 -0
- package/dist/es/env/basic.mjs.bak +6 -0
- package/dist/es/env/constants.mjs +70 -0
- package/dist/es/env/constants.mjs.bak +70 -0
- package/dist/es/env/global-config-manager.mjs +94 -0
- package/dist/es/env/global-config-manager.mjs.bak +94 -0
- package/dist/es/env/helper.mjs +43 -0
- package/dist/es/env/helper.mjs.bak +43 -0
- package/dist/es/env/index.mjs +5 -0
- package/dist/es/env/index.mjs.bak +5 -0
- package/dist/es/env/init-debug.mjs +18 -0
- package/dist/es/env/init-debug.mjs.bak +18 -0
- package/dist/es/env/model-config-manager.mjs +79 -0
- package/dist/es/env/model-config-manager.mjs.bak +79 -0
- package/dist/es/env/parse-model-config.mjs +132 -0
- package/dist/es/env/parse-model-config.mjs.bak +132 -0
- package/dist/es/env/types.mjs +220 -0
- package/dist/es/env/types.mjs.bak +220 -0
- package/dist/es/env/utils.mjs +26 -0
- package/dist/es/env/utils.mjs.bak +26 -0
- package/dist/es/extractor/constants.mjs +2 -0
- package/dist/es/extractor/constants.mjs.bak +2 -0
- package/dist/es/extractor/debug.mjs +6 -0
- package/dist/es/extractor/debug.mjs.bak +6 -0
- package/dist/es/extractor/dom-util.mjs +92 -0
- package/dist/es/extractor/dom-util.mjs.bak +92 -0
- package/dist/es/extractor/index.mjs +5 -0
- package/dist/es/extractor/index.mjs.bak +5 -0
- package/dist/es/extractor/locator.mjs +250 -0
- package/dist/es/extractor/locator.mjs.bak +250 -0
- package/dist/es/extractor/tree.mjs +78 -0
- package/dist/es/extractor/tree.mjs.bak +78 -0
- package/dist/es/extractor/util.mjs +245 -0
- package/dist/es/extractor/util.mjs.bak +245 -0
- package/dist/es/extractor/web-extractor.mjs +303 -0
- package/dist/es/extractor/web-extractor.mjs.bak +303 -0
- package/dist/es/img/box-select.mjs +824 -0
- package/dist/es/img/box-select.mjs.bak +824 -0
- package/dist/es/img/canvas-fallback.mjs +238 -0
- package/dist/es/img/canvas-fallback.mjs.bak +238 -0
- package/dist/es/img/get-photon.mjs +45 -0
- package/dist/es/img/get-photon.mjs.bak +45 -0
- package/dist/es/img/get-sharp.mjs +11 -0
- package/dist/es/img/get-sharp.mjs.bak +11 -0
- package/dist/es/img/index.mjs +4 -0
- package/dist/es/img/index.mjs.bak +4 -0
- package/dist/es/img/info.mjs +29 -0
- package/dist/es/img/info.mjs.bak +29 -0
- package/dist/es/img/transform.mjs +295 -0
- package/dist/es/img/transform.mjs.bak +295 -0
- package/dist/es/index.mjs +4 -0
- package/dist/es/index.mjs.bak +4 -0
- package/dist/es/logger.mjs +64 -0
- package/dist/es/logger.mjs.bak +64 -0
- package/dist/es/mcp/base-server.mjs +281 -0
- package/dist/es/mcp/base-server.mjs.bak +281 -0
- package/dist/es/mcp/base-tools.mjs +91 -0
- package/dist/es/mcp/base-tools.mjs.bak +91 -0
- package/dist/es/mcp/chrome-path.mjs +35 -0
- package/dist/es/mcp/chrome-path.mjs.bak +35 -0
- package/dist/es/mcp/index.mjs +7 -0
- package/dist/es/mcp/index.mjs.bak +7 -0
- package/dist/es/mcp/inject-report-html-plugin.mjs +53 -0
- package/dist/es/mcp/inject-report-html-plugin.mjs.bak +53 -0
- package/dist/es/mcp/launcher-helper.mjs +52 -0
- package/dist/es/mcp/launcher-helper.mjs.bak +52 -0
- package/dist/es/mcp/tool-generator.mjs +297 -0
- package/dist/es/mcp/tool-generator.mjs.bak +297 -0
- package/dist/es/mcp/types.mjs +3 -0
- package/dist/es/mcp/types.mjs.bak +3 -0
- package/dist/es/node/fs.mjs +44 -0
- package/dist/es/node/fs.mjs.bak +44 -0
- package/dist/es/node/index.mjs +2 -0
- package/dist/es/node/index.mjs.bak +2 -0
- package/dist/es/node/port.mjs +24 -0
- package/dist/es/node/port.mjs.bak +24 -0
- package/dist/es/oss/demo.mjs +30 -0
- package/dist/es/oss/demo.mjs.bak +30 -0
- package/dist/es/oss/index.mjs +90 -0
- package/dist/es/oss/index.mjs.bak +90 -0
- package/dist/es/polyfills/async-hooks.mjs +2 -0
- package/dist/es/polyfills/async-hooks.mjs.bak +2 -0
- package/dist/es/polyfills/index.mjs +1 -0
- package/dist/es/polyfills/index.mjs.bak +1 -0
- package/dist/es/types/index.mjs +3 -0
- package/dist/es/types/index.mjs.bak +3 -0
- package/dist/es/us-keyboard-layout.mjs +1414 -0
- package/dist/es/us-keyboard-layout.mjs.LICENSE.txt +5 -0
- package/dist/es/us-keyboard-layout.mjs.bak +1414 -0
- package/dist/es/utils.mjs +72 -0
- package/dist/es/utils.mjs.bak +72 -0
- package/dist/es/zod-schema-utils.mjs +54 -0
- package/dist/es/zod-schema-utils.mjs.bak +54 -0
- package/dist/lib/baseDB.js +149 -0
- package/dist/lib/baseDB.js.bak +149 -0
- package/dist/lib/build/copy-static.js +79 -0
- package/dist/lib/build/copy-static.js.bak +79 -0
- package/dist/lib/build/rspack-config.js +38 -0
- package/dist/lib/build/rspack-config.js.bak +38 -0
- package/dist/lib/cli/cli-runner.js +196 -0
- package/dist/lib/cli/cli-runner.js.bak +196 -0
- package/dist/lib/cli/index.js +48 -0
- package/dist/lib/cli/index.js.bak +48 -0
- package/dist/lib/common.js +93 -0
- package/dist/lib/common.js.bak +93 -0
- package/dist/lib/constants/example-code.js +260 -0
- package/dist/lib/constants/example-code.js.bak +260 -0
- package/dist/lib/constants/index.js +96 -0
- package/dist/lib/constants/index.js.bak +96 -0
- package/dist/lib/env/basic.js +40 -0
- package/dist/lib/env/basic.js.bak +40 -0
- package/dist/lib/env/constants.js +113 -0
- package/dist/lib/env/constants.js.bak +113 -0
- package/dist/lib/env/global-config-manager.js +128 -0
- package/dist/lib/env/global-config-manager.js.bak +128 -0
- package/dist/lib/env/helper.js +80 -0
- package/dist/lib/env/helper.js.bak +80 -0
- package/dist/lib/env/index.js +90 -0
- package/dist/lib/env/index.js.bak +90 -0
- package/dist/lib/env/init-debug.js +52 -0
- package/dist/lib/env/init-debug.js.bak +52 -0
- package/dist/lib/env/model-config-manager.js +113 -0
- package/dist/lib/env/model-config-manager.js.bak +113 -0
- package/dist/lib/env/parse-model-config.js +178 -0
- package/dist/lib/env/parse-model-config.js.bak +178 -0
- package/dist/lib/env/types.js +554 -0
- package/dist/lib/env/types.js.bak +554 -0
- package/dist/lib/env/utils.js +72 -0
- package/dist/lib/env/utils.js.bak +72 -0
- package/dist/lib/extractor/constants.js +42 -0
- package/dist/lib/extractor/constants.js.bak +42 -0
- package/dist/lib/extractor/debug.js +12 -0
- package/dist/lib/extractor/debug.js.bak +12 -0
- package/dist/lib/extractor/dom-util.js +153 -0
- package/dist/lib/extractor/dom-util.js.bak +153 -0
- package/dist/lib/extractor/index.js +81 -0
- package/dist/lib/extractor/index.js.bak +81 -0
- package/dist/lib/extractor/locator.js +296 -0
- package/dist/lib/extractor/locator.js.bak +296 -0
- package/dist/lib/extractor/tree.js +124 -0
- package/dist/lib/extractor/tree.js.bak +124 -0
- package/dist/lib/extractor/util.js +336 -0
- package/dist/lib/extractor/util.js.bak +336 -0
- package/dist/lib/extractor/web-extractor.js +349 -0
- package/dist/lib/extractor/web-extractor.js.bak +349 -0
- package/dist/lib/img/box-select.js +875 -0
- package/dist/lib/img/box-select.js.bak +875 -0
- package/dist/lib/img/canvas-fallback.js +305 -0
- package/dist/lib/img/canvas-fallback.js.bak +305 -0
- package/dist/lib/img/get-photon.js +82 -0
- package/dist/lib/img/get-photon.js.bak +82 -0
- package/dist/lib/img/get-sharp.js +45 -0
- package/dist/lib/img/get-sharp.js.bak +45 -0
- package/dist/lib/img/index.js +95 -0
- package/dist/lib/img/index.js.bak +95 -0
- package/dist/lib/img/info.js +83 -0
- package/dist/lib/img/info.js.bak +83 -0
- package/dist/lib/img/transform.js +387 -0
- package/dist/lib/img/transform.js.bak +387 -0
- package/dist/lib/index.js +47 -0
- package/dist/lib/index.js.bak +47 -0
- package/dist/lib/logger.js +114 -0
- package/dist/lib/logger.js.bak +114 -0
- package/dist/lib/mcp/base-server.js +331 -0
- package/dist/lib/mcp/base-server.js.bak +331 -0
- package/dist/lib/mcp/base-tools.js +125 -0
- package/dist/lib/mcp/base-tools.js.bak +125 -0
- package/dist/lib/mcp/chrome-path.js +72 -0
- package/dist/lib/mcp/chrome-path.js.bak +72 -0
- package/dist/lib/mcp/index.js +100 -0
- package/dist/lib/mcp/index.js.bak +100 -0
- package/dist/lib/mcp/inject-report-html-plugin.js +98 -0
- package/dist/lib/mcp/inject-report-html-plugin.js.bak +98 -0
- package/dist/lib/mcp/launcher-helper.js +86 -0
- package/dist/lib/mcp/launcher-helper.js.bak +86 -0
- package/dist/lib/mcp/tool-generator.js +334 -0
- package/dist/lib/mcp/tool-generator.js.bak +334 -0
- package/dist/lib/mcp/types.js +40 -0
- package/dist/lib/mcp/types.js.bak +40 -0
- package/dist/lib/node/fs.js +97 -0
- package/dist/lib/node/fs.js.bak +97 -0
- package/dist/lib/node/index.js +65 -0
- package/dist/lib/node/index.js.bak +65 -0
- package/dist/lib/node/port.js +61 -0
- package/dist/lib/node/port.js.bak +61 -0
- package/dist/lib/oss/demo.js +36 -0
- package/dist/lib/oss/demo.js.bak +36 -0
- package/dist/lib/oss/index.js +138 -0
- package/dist/lib/oss/index.js.bak +138 -0
- package/dist/lib/polyfills/async-hooks.js +36 -0
- package/dist/lib/polyfills/async-hooks.js.bak +36 -0
- package/dist/lib/polyfills/index.js +58 -0
- package/dist/lib/polyfills/index.js.bak +58 -0
- package/dist/lib/types/index.js +37 -0
- package/dist/lib/types/index.js.bak +37 -0
- package/dist/lib/us-keyboard-layout.js +1457 -0
- package/dist/lib/us-keyboard-layout.js.LICENSE.txt +5 -0
- package/dist/lib/us-keyboard-layout.js.bak +1457 -0
- package/dist/lib/utils.js +148 -0
- package/dist/lib/utils.js.bak +148 -0
- package/dist/lib/zod-schema-utils.js +97 -0
- package/dist/lib/zod-schema-utils.js.bak +97 -0
- package/dist/types/baseDB.d.ts +25 -0
- package/dist/types/baseDB.d.ts.bak +25 -0
- package/dist/types/build/copy-static.d.ts +31 -0
- package/dist/types/build/copy-static.d.ts.bak +31 -0
- package/dist/types/build/rspack-config.d.ts +8 -0
- package/dist/types/build/rspack-config.d.ts.bak +8 -0
- package/dist/types/cli/cli-runner.d.ts +14 -0
- package/dist/types/cli/cli-runner.d.ts.bak +14 -0
- package/dist/types/cli/index.d.ts +2 -0
- package/dist/types/cli/index.d.ts.bak +2 -0
- package/dist/types/common.d.ts +12 -0
- package/dist/types/common.d.ts.bak +12 -0
- package/dist/types/constants/example-code.d.ts +2 -0
- package/dist/types/constants/example-code.d.ts.bak +2 -0
- package/dist/types/constants/index.d.ts +21 -0
- package/dist/types/constants/index.d.ts.bak +21 -0
- package/dist/types/env/basic.d.ts +6 -0
- package/dist/types/env/basic.d.ts.bak +6 -0
- package/dist/types/env/constants.d.ts +40 -0
- package/dist/types/env/constants.d.ts.bak +40 -0
- package/dist/types/env/global-config-manager.d.ts +32 -0
- package/dist/types/env/global-config-manager.d.ts.bak +32 -0
- package/dist/types/env/helper.d.ts +4 -0
- package/dist/types/env/helper.d.ts.bak +4 -0
- package/dist/types/env/index.d.ts +4 -0
- package/dist/types/env/index.d.ts.bak +4 -0
- package/dist/types/env/init-debug.d.ts +1 -0
- package/dist/types/env/init-debug.d.ts.bak +1 -0
- package/dist/types/env/model-config-manager.d.ts +25 -0
- package/dist/types/env/model-config-manager.d.ts.bak +25 -0
- package/dist/types/env/parse-model-config.d.ts +31 -0
- package/dist/types/env/parse-model-config.d.ts.bak +31 -0
- package/dist/types/env/types.d.ts +318 -0
- package/dist/types/env/types.d.ts.bak +318 -0
- package/dist/types/env/utils.d.ts +38 -0
- package/dist/types/env/utils.d.ts.bak +38 -0
- package/dist/types/extractor/constants.d.ts +1 -0
- package/dist/types/extractor/constants.d.ts.bak +1 -0
- package/dist/types/extractor/debug.d.ts +1 -0
- package/dist/types/extractor/debug.d.ts.bak +1 -0
- package/dist/types/extractor/dom-util.d.ts +56 -0
- package/dist/types/extractor/dom-util.d.ts.bak +56 -0
- package/dist/types/extractor/index.d.ts +32 -0
- package/dist/types/extractor/index.d.ts.bak +32 -0
- package/dist/types/extractor/locator.d.ts +9 -0
- package/dist/types/extractor/locator.d.ts.bak +9 -0
- package/dist/types/extractor/tree.d.ts +6 -0
- package/dist/types/extractor/tree.d.ts.bak +6 -0
- package/dist/types/extractor/util.d.ts +47 -0
- package/dist/types/extractor/util.d.ts.bak +47 -0
- package/dist/types/extractor/web-extractor.d.ts +19 -0
- package/dist/types/extractor/web-extractor.d.ts.bak +19 -0
- package/dist/types/img/box-select.d.ts +26 -0
- package/dist/types/img/box-select.d.ts.bak +26 -0
- package/dist/types/img/canvas-fallback.d.ts +105 -0
- package/dist/types/img/canvas-fallback.d.ts.bak +105 -0
- package/dist/types/img/get-photon.d.ts +19 -0
- package/dist/types/img/get-photon.d.ts.bak +19 -0
- package/dist/types/img/get-sharp.d.ts +3 -0
- package/dist/types/img/get-sharp.d.ts.bak +3 -0
- package/dist/types/img/index.d.ts +3 -0
- package/dist/types/img/index.d.ts.bak +3 -0
- package/dist/types/img/info.d.ts +29 -0
- package/dist/types/img/info.d.ts.bak +29 -0
- package/dist/types/img/transform.d.ts +107 -0
- package/dist/types/img/transform.d.ts.bak +107 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.bak +4 -0
- package/dist/types/logger.d.ts +5 -0
- package/dist/types/logger.d.ts.bak +5 -0
- package/dist/types/mcp/base-server.d.ts +93 -0
- package/dist/types/mcp/base-server.d.ts.bak +93 -0
- package/dist/types/mcp/base-tools.d.ts +79 -0
- package/dist/types/mcp/base-tools.d.ts.bak +79 -0
- package/dist/types/mcp/chrome-path.d.ts +2 -0
- package/dist/types/mcp/chrome-path.d.ts.bak +2 -0
- package/dist/types/mcp/index.d.ts +7 -0
- package/dist/types/mcp/index.d.ts.bak +7 -0
- package/dist/types/mcp/inject-report-html-plugin.d.ts +18 -0
- package/dist/types/mcp/inject-report-html-plugin.d.ts.bak +18 -0
- package/dist/types/mcp/launcher-helper.d.ts +94 -0
- package/dist/types/mcp/launcher-helper.d.ts.bak +94 -0
- package/dist/types/mcp/tool-generator.d.ts +10 -0
- package/dist/types/mcp/tool-generator.d.ts.bak +10 -0
- package/dist/types/mcp/types.d.ts +103 -0
- package/dist/types/mcp/types.d.ts.bak +103 -0
- package/dist/types/node/fs.d.ts +15 -0
- package/dist/types/node/fs.d.ts.bak +15 -0
- package/dist/types/node/index.d.ts +2 -0
- package/dist/types/node/index.d.ts.bak +2 -0
- package/dist/types/node/port.d.ts +8 -0
- package/dist/types/node/port.d.ts.bak +8 -0
- package/dist/types/oss/demo.d.ts +1 -0
- package/dist/types/oss/demo.d.ts.bak +1 -0
- package/dist/types/oss/index.d.ts +34 -0
- package/dist/types/oss/index.d.ts.bak +34 -0
- package/dist/types/polyfills/async-hooks.d.ts +6 -0
- package/dist/types/polyfills/async-hooks.d.ts.bak +6 -0
- package/dist/types/polyfills/index.d.ts +4 -0
- package/dist/types/polyfills/index.d.ts.bak +4 -0
- package/dist/types/types/index.d.ts +34 -0
- package/dist/types/types/index.d.ts.bak +34 -0
- package/dist/types/us-keyboard-layout.d.ts +32 -0
- package/dist/types/us-keyboard-layout.d.ts.bak +32 -0
- package/dist/types/utils.d.ts +34 -0
- package/dist/types/utils.d.ts.bak +34 -0
- package/dist/types/zod-schema-utils.d.ts +23 -0
- package/dist/types/zod-schema-utils.d.ts.bak +23 -0
- package/package.json +132 -0
- package/src/baseDB.ts +158 -0
- package/src/build/copy-static.ts +68 -0
- package/src/build/rspack-config.ts +12 -0
- package/src/cli/cli-runner.ts +224 -0
- package/src/cli/index.ts +8 -0
- package/src/common.ts +67 -0
- package/src/constants/example-code.ts +223 -0
- package/src/constants/index.ts +29 -0
- package/src/env/basic.ts +12 -0
- package/src/env/constants.ts +234 -0
- package/src/env/global-config-manager.ts +191 -0
- package/src/env/helper.ts +58 -0
- package/src/env/index.ts +4 -0
- package/src/env/init-debug.ts +34 -0
- package/src/env/model-config-manager.ts +149 -0
- package/src/env/parse-model-config.ts +294 -0
- package/src/env/types.ts +547 -0
- package/src/env/utils.ts +89 -0
- package/src/extractor/constants.ts +5 -0
- package/src/extractor/debug.ts +10 -0
- package/src/extractor/dom-util.ts +226 -0
- package/src/extractor/index.ts +48 -0
- package/src/extractor/locator.ts +469 -0
- package/src/extractor/tree.ts +179 -0
- package/src/extractor/util.ts +482 -0
- package/src/extractor/web-extractor.ts +481 -0
- package/src/img/box-select.ts +588 -0
- package/src/img/canvas-fallback.ts +393 -0
- package/src/img/get-photon.ts +108 -0
- package/src/img/get-sharp.ts +18 -0
- package/src/img/index.ts +26 -0
- package/src/img/info.ts +75 -0
- package/src/img/transform.ts +594 -0
- package/src/index.ts +8 -0
- package/src/logger.ts +96 -0
- package/src/mcp/base-server.ts +502 -0
- package/src/mcp/base-tools.ts +185 -0
- package/src/mcp/chrome-path.ts +48 -0
- package/src/mcp/index.ts +7 -0
- package/src/mcp/inject-report-html-plugin.ts +119 -0
- package/src/mcp/launcher-helper.ts +200 -0
- package/src/mcp/tool-generator.ts +429 -0
- package/src/mcp/types.ts +112 -0
- package/src/node/fs.ts +84 -0
- package/src/node/index.ts +2 -0
- package/src/node/port.ts +37 -0
- package/src/oss/demo.ts +61 -0
- package/src/oss/index.ts +187 -0
- package/src/polyfills/async-hooks.ts +6 -0
- package/src/polyfills/index.ts +4 -0
- package/src/types/index.ts +52 -0
- package/src/us-keyboard-layout.ts +723 -0
- package/src/utils.ts +149 -0
- package/src/zod-schema-utils.ts +133 -0
package/src/baseDB.ts
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// Generic database operations class
|
|
2
|
+
export class IndexedDBManager {
|
|
3
|
+
private dbPromise: Promise<IDBDatabase>;
|
|
4
|
+
private dbName: string;
|
|
5
|
+
private version: number;
|
|
6
|
+
private storeConfigs: Array<{ name: string; keyPath: string }>;
|
|
7
|
+
|
|
8
|
+
constructor(
|
|
9
|
+
dbName: string,
|
|
10
|
+
version: number,
|
|
11
|
+
storeConfigs: Array<{ name: string; keyPath: string }>,
|
|
12
|
+
) {
|
|
13
|
+
this.dbName = dbName;
|
|
14
|
+
this.version = version;
|
|
15
|
+
this.storeConfigs = storeConfigs;
|
|
16
|
+
this.dbPromise = this.initDB();
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private initDB(): Promise<IDBDatabase> {
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
const request = indexedDB.open(this.dbName, this.version);
|
|
22
|
+
|
|
23
|
+
request.onerror = () => reject(request.error);
|
|
24
|
+
request.onsuccess = () => resolve(request.result);
|
|
25
|
+
|
|
26
|
+
request.onupgradeneeded = (event) => {
|
|
27
|
+
const db = (event.target as IDBOpenDBRequest).result;
|
|
28
|
+
|
|
29
|
+
// Create stores if they don't exist
|
|
30
|
+
this.storeConfigs.forEach(({ name, keyPath }) => {
|
|
31
|
+
if (!db.objectStoreNames.contains(name)) {
|
|
32
|
+
const store = db.createObjectStore(name, { keyPath });
|
|
33
|
+
store.createIndex('timestamp', 'timestamp', { unique: false });
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private async withTransaction<T>(
|
|
41
|
+
storeNames: string | string[],
|
|
42
|
+
mode: IDBTransactionMode,
|
|
43
|
+
operation: (stores: IDBObjectStore | IDBObjectStore[]) => Promise<T>,
|
|
44
|
+
): Promise<T> {
|
|
45
|
+
const db = await this.dbPromise;
|
|
46
|
+
const transaction = db.transaction(storeNames, mode);
|
|
47
|
+
|
|
48
|
+
const stores = Array.isArray(storeNames)
|
|
49
|
+
? storeNames.map((name) => transaction.objectStore(name))
|
|
50
|
+
: transaction.objectStore(storeNames);
|
|
51
|
+
|
|
52
|
+
return operation(stores);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
private promisifyRequest<T>(request: IDBRequest<T>): Promise<T> {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
request.onsuccess = () => resolve(request.result);
|
|
58
|
+
request.onerror = () => reject(request.error);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async put<T>(storeName: string, data: T): Promise<void> {
|
|
63
|
+
await this.withTransaction(storeName, 'readwrite', async (store) => {
|
|
64
|
+
await this.promisifyRequest((store as IDBObjectStore).put(data));
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async get<T>(storeName: string, key: string): Promise<T | undefined> {
|
|
69
|
+
return this.withTransaction(storeName, 'readonly', async (store) => {
|
|
70
|
+
return this.promisifyRequest((store as IDBObjectStore).get(key));
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async getAll<T>(storeName: string, sortByTimestamp = true): Promise<T[]> {
|
|
75
|
+
return this.withTransaction(storeName, 'readonly', async (store) => {
|
|
76
|
+
const objectStore = store as IDBObjectStore;
|
|
77
|
+
const results = sortByTimestamp
|
|
78
|
+
? await this.promisifyRequest(objectStore.index('timestamp').getAll())
|
|
79
|
+
: await this.promisifyRequest(objectStore.getAll());
|
|
80
|
+
|
|
81
|
+
return sortByTimestamp
|
|
82
|
+
? results.sort((a: any, b: any) => a.timestamp - b.timestamp)
|
|
83
|
+
: results;
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async clear(storeName: string): Promise<void> {
|
|
88
|
+
await this.withTransaction(storeName, 'readwrite', async (store) => {
|
|
89
|
+
await this.promisifyRequest((store as IDBObjectStore).clear());
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async delete(storeName: string, key: string): Promise<void> {
|
|
94
|
+
await this.withTransaction(storeName, 'readwrite', async (store) => {
|
|
95
|
+
await this.promisifyRequest((store as IDBObjectStore).delete(key));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async count(storeName: string): Promise<number> {
|
|
100
|
+
return this.withTransaction(storeName, 'readonly', async (store) => {
|
|
101
|
+
return this.promisifyRequest((store as IDBObjectStore).count());
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
getDBPromise(): Promise<IDBDatabase> {
|
|
106
|
+
return this.dbPromise;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Generic error handler wrapper
|
|
111
|
+
export const withErrorHandling = async <T>(
|
|
112
|
+
operation: () => Promise<T>,
|
|
113
|
+
errorMessage: string,
|
|
114
|
+
defaultValue?: T,
|
|
115
|
+
onQuotaExceeded?: () => Promise<void>,
|
|
116
|
+
): Promise<T | undefined> => {
|
|
117
|
+
try {
|
|
118
|
+
return await operation();
|
|
119
|
+
} catch (e) {
|
|
120
|
+
console.error(errorMessage, e);
|
|
121
|
+
if (
|
|
122
|
+
e instanceof Error &&
|
|
123
|
+
e.name === 'QuotaExceededError' &&
|
|
124
|
+
onQuotaExceeded
|
|
125
|
+
) {
|
|
126
|
+
console.log('Storage quota exceeded, running cleanup...');
|
|
127
|
+
await onQuotaExceeded();
|
|
128
|
+
}
|
|
129
|
+
return defaultValue;
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// Base cleanup function for managing storage space
|
|
134
|
+
export const createCleanupFunction = <
|
|
135
|
+
T extends { id: string; timestamp: number },
|
|
136
|
+
>(
|
|
137
|
+
dbManager: IndexedDBManager,
|
|
138
|
+
storeName: string,
|
|
139
|
+
maxItems: number,
|
|
140
|
+
) => {
|
|
141
|
+
return async (): Promise<void> => {
|
|
142
|
+
try {
|
|
143
|
+
const results = await dbManager.getAll<T>(storeName);
|
|
144
|
+
|
|
145
|
+
if (results.length > maxItems) {
|
|
146
|
+
const toDelete = results
|
|
147
|
+
.sort((a, b) => a.timestamp - b.timestamp)
|
|
148
|
+
.slice(0, results.length - maxItems);
|
|
149
|
+
|
|
150
|
+
await Promise.all(
|
|
151
|
+
toDelete.map((item) => dbManager.delete(storeName, item.id)),
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
} catch (e) {
|
|
155
|
+
console.error(`Failed to cleanup ${storeName}:`, e);
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
export interface CopyStaticOptions {
|
|
5
|
+
/** Source directory to copy from */
|
|
6
|
+
srcDir: string;
|
|
7
|
+
/** Destination directory to copy to */
|
|
8
|
+
destDir: string;
|
|
9
|
+
/** Optional favicon source path (relative to directory containing srcDir) */
|
|
10
|
+
faviconPath?: string;
|
|
11
|
+
/** Name for the rsbuild plugin */
|
|
12
|
+
pluginName?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Creates an rsbuild plugin that copies static files after build
|
|
17
|
+
* @param options Configuration options for copying static files
|
|
18
|
+
* @returns Rsbuild plugin object
|
|
19
|
+
*/
|
|
20
|
+
export const createCopyStaticPlugin = (options: CopyStaticOptions) => ({
|
|
21
|
+
name: options.pluginName || 'copy-static',
|
|
22
|
+
setup(api: any) {
|
|
23
|
+
api.onAfterBuild(async () => {
|
|
24
|
+
const { srcDir, destDir, faviconPath } = options;
|
|
25
|
+
|
|
26
|
+
// Remove symlink left by dev mode before copying
|
|
27
|
+
const stat = await fs.promises.lstat(destDir).catch(() => null);
|
|
28
|
+
if (stat?.isSymbolicLink()) {
|
|
29
|
+
await fs.promises.unlink(destDir);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
await fs.promises.mkdir(destDir, { recursive: true });
|
|
33
|
+
|
|
34
|
+
// Copy directory contents recursively
|
|
35
|
+
await fs.promises.cp(srcDir, destDir, { recursive: true });
|
|
36
|
+
console.log(`Copied build artifacts from ${srcDir} to ${destDir}`);
|
|
37
|
+
|
|
38
|
+
// Copy favicon if specified
|
|
39
|
+
if (faviconPath) {
|
|
40
|
+
const faviconDest = path.join(destDir, 'favicon.ico');
|
|
41
|
+
await fs.promises.copyFile(faviconPath, faviconDest);
|
|
42
|
+
console.log(`Copied favicon from ${faviconPath} to ${faviconDest}`);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Helper function to create a copy static plugin for playground builds
|
|
50
|
+
* @param srcDir Source directory (usually dist directory)
|
|
51
|
+
* @param destDir Destination directory
|
|
52
|
+
* @param pluginName Optional plugin name
|
|
53
|
+
* @param faviconSrc Optional favicon source path
|
|
54
|
+
* @returns Rsbuild plugin
|
|
55
|
+
*/
|
|
56
|
+
export const createPlaygroundCopyPlugin = (
|
|
57
|
+
srcDir: string,
|
|
58
|
+
destDir: string,
|
|
59
|
+
pluginName?: string,
|
|
60
|
+
faviconSrc?: string,
|
|
61
|
+
) => {
|
|
62
|
+
return createCopyStaticPlugin({
|
|
63
|
+
srcDir,
|
|
64
|
+
destDir,
|
|
65
|
+
faviconPath: faviconSrc,
|
|
66
|
+
pluginName,
|
|
67
|
+
});
|
|
68
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Common Rspack configuration helpers for rsbuild projects
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Common warning patterns to ignore in Rspack builds.
|
|
7
|
+
* These warnings are typically from optional dependencies or known non-critical issues.
|
|
8
|
+
*/
|
|
9
|
+
export const commonIgnoreWarnings = [
|
|
10
|
+
// Ignore dynamic import warnings from langsmith/langfuse optional dependencies
|
|
11
|
+
/Critical dependency: the request of a dependency is an expression/,
|
|
12
|
+
];
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { existsSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import dotenv from 'dotenv';
|
|
5
|
+
import { getDebug } from '../logger';
|
|
6
|
+
import type { BaseMidsceneTools } from '../mcp/base-tools';
|
|
7
|
+
import type {
|
|
8
|
+
ToolDefinition,
|
|
9
|
+
ToolResult,
|
|
10
|
+
ToolResultContent,
|
|
11
|
+
} from '../mcp/types';
|
|
12
|
+
|
|
13
|
+
const debug = getDebug('cli-runner');
|
|
14
|
+
|
|
15
|
+
interface CLICommand {
|
|
16
|
+
name: string;
|
|
17
|
+
def: ToolDefinition;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface CLIRunnerOptions {
|
|
21
|
+
stripPrefix?: string;
|
|
22
|
+
argv?: string[];
|
|
23
|
+
version?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export class CLIError extends Error {
|
|
27
|
+
constructor(
|
|
28
|
+
message: string,
|
|
29
|
+
public exitCode = 1,
|
|
30
|
+
) {
|
|
31
|
+
super(message);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function parseValue(raw: string): unknown {
|
|
36
|
+
// JSON objects/arrays
|
|
37
|
+
if (raw.startsWith('{') || raw.startsWith('[')) {
|
|
38
|
+
try {
|
|
39
|
+
return JSON.parse(raw);
|
|
40
|
+
} catch {
|
|
41
|
+
// Not valid JSON, treat as string below
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Numbers
|
|
46
|
+
if (/^-?\d+(\.\d+)?$/.test(raw)) {
|
|
47
|
+
return Number(raw);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return raw;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function parseCliArgs(args: string[]): Record<string, unknown> {
|
|
54
|
+
const result: Record<string, unknown> = {};
|
|
55
|
+
|
|
56
|
+
for (let i = 0; i < args.length; i++) {
|
|
57
|
+
const arg = args[i];
|
|
58
|
+
if (!arg.startsWith('--')) continue;
|
|
59
|
+
|
|
60
|
+
const body = arg.slice(2);
|
|
61
|
+
const eqIdx = body.indexOf('=');
|
|
62
|
+
|
|
63
|
+
if (eqIdx >= 0) {
|
|
64
|
+
// --key=value
|
|
65
|
+
result[body.slice(0, eqIdx)] = parseValue(body.slice(eqIdx + 1));
|
|
66
|
+
} else if (args[i + 1] && !args[i + 1].startsWith('--')) {
|
|
67
|
+
// --key value
|
|
68
|
+
i++;
|
|
69
|
+
result[body] = parseValue(args[i]);
|
|
70
|
+
} else {
|
|
71
|
+
// --flag (boolean)
|
|
72
|
+
result[body] = true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function outputContentItem(item: ToolResultContent, isError: boolean): void {
|
|
80
|
+
switch (item.type) {
|
|
81
|
+
case 'text':
|
|
82
|
+
if (isError) {
|
|
83
|
+
console.error(item.text);
|
|
84
|
+
} else {
|
|
85
|
+
console.log(item.text);
|
|
86
|
+
}
|
|
87
|
+
break;
|
|
88
|
+
|
|
89
|
+
case 'image': {
|
|
90
|
+
const filename = `screenshot-${Date.now()}.png`;
|
|
91
|
+
const filepath = join(tmpdir(), filename);
|
|
92
|
+
writeFileSync(filepath, Buffer.from(item.data, 'base64'));
|
|
93
|
+
console.log(`Screenshot saved: ${filepath}`);
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
default:
|
|
98
|
+
console.log(`[${item.type} content not displayed in CLI]`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function outputResult(result: ToolResult): void {
|
|
103
|
+
for (const item of result.content) {
|
|
104
|
+
outputContentItem(item, result.isError ?? false);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function removePrefix(name: string, prefix?: string): string {
|
|
109
|
+
if (prefix && name.startsWith(prefix)) {
|
|
110
|
+
return name.slice(prefix.length);
|
|
111
|
+
}
|
|
112
|
+
return name;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function printCommandHelp(scriptName: string, cmd: CLICommand): void {
|
|
116
|
+
const { def } = cmd;
|
|
117
|
+
console.log(`\nUsage: ${scriptName} ${cmd.name} [options]\n`);
|
|
118
|
+
console.log(def.description);
|
|
119
|
+
|
|
120
|
+
const schemaEntries = Object.entries(def.schema);
|
|
121
|
+
if (schemaEntries.length > 0) {
|
|
122
|
+
console.log('\nOptions:');
|
|
123
|
+
for (const [key, zodType] of schemaEntries) {
|
|
124
|
+
const desc = zodType.description ?? '';
|
|
125
|
+
console.log(` --${key.padEnd(20)} ${desc}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function printVersion(scriptName: string, version: string): void {
|
|
131
|
+
console.log(`${scriptName} v${version}`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function printHelp(
|
|
135
|
+
scriptName: string,
|
|
136
|
+
commands: CLICommand[],
|
|
137
|
+
version?: string,
|
|
138
|
+
): void {
|
|
139
|
+
if (version) {
|
|
140
|
+
printVersion(scriptName, version);
|
|
141
|
+
console.log('');
|
|
142
|
+
}
|
|
143
|
+
console.log(`\nUsage: ${scriptName} <command> [options]\n`);
|
|
144
|
+
console.log('Commands:');
|
|
145
|
+
for (const { name, def } of commands) {
|
|
146
|
+
console.log(` ${name.padEnd(30)} ${def.description}`);
|
|
147
|
+
}
|
|
148
|
+
console.log(` ${'version'.padEnd(30)} Show CLI version`);
|
|
149
|
+
console.log(`\nRun "${scriptName} <command> --help" for more info.`);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export async function runToolsCLI(
|
|
153
|
+
tools: BaseMidsceneTools,
|
|
154
|
+
scriptName: string,
|
|
155
|
+
options?: CLIRunnerOptions,
|
|
156
|
+
): Promise<void> {
|
|
157
|
+
const rawArgs = options?.argv ?? process.argv.slice(2);
|
|
158
|
+
debug('CLI invoked: %s %s', scriptName, rawArgs.join(' '));
|
|
159
|
+
|
|
160
|
+
// Load .env from cwd before any tool initialization
|
|
161
|
+
const envFile = join(process.cwd(), '.env');
|
|
162
|
+
if (existsSync(envFile)) {
|
|
163
|
+
dotenv.config({ path: envFile });
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
await tools.initTools();
|
|
167
|
+
|
|
168
|
+
const commands: CLICommand[] = tools.getToolDefinitions().map((def) => ({
|
|
169
|
+
name: removePrefix(def.name, options?.stripPrefix).toLowerCase(),
|
|
170
|
+
def,
|
|
171
|
+
}));
|
|
172
|
+
const cliVersion = options?.version;
|
|
173
|
+
|
|
174
|
+
const [commandName, ...restArgs] = rawArgs;
|
|
175
|
+
|
|
176
|
+
if (!commandName || commandName === '--help' || commandName === '-h') {
|
|
177
|
+
debug('showing help (no command or --help flag)');
|
|
178
|
+
printHelp(scriptName, commands, cliVersion);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (
|
|
183
|
+
commandName === '--version' ||
|
|
184
|
+
commandName === '-v' ||
|
|
185
|
+
commandName.toLowerCase() === 'version'
|
|
186
|
+
) {
|
|
187
|
+
if (!cliVersion) {
|
|
188
|
+
throw new CLIError('Failed to determine CLI version');
|
|
189
|
+
}
|
|
190
|
+
printVersion(scriptName, cliVersion);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const match = commands.find(
|
|
195
|
+
(c) => c.name.toLowerCase() === commandName.toLowerCase(),
|
|
196
|
+
);
|
|
197
|
+
if (!match) {
|
|
198
|
+
debug('unknown command: %s', commandName);
|
|
199
|
+
console.error(`Unknown command: ${commandName}`);
|
|
200
|
+
printHelp(scriptName, commands, cliVersion);
|
|
201
|
+
throw new CLIError(`Unknown command: ${commandName}`);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const parsedArgs = parseCliArgs(restArgs);
|
|
205
|
+
debug('command: %s, args: %s', match.name, JSON.stringify(parsedArgs));
|
|
206
|
+
|
|
207
|
+
if (parsedArgs.help === true) {
|
|
208
|
+
debug('showing command help for: %s', match.name);
|
|
209
|
+
printCommandHelp(scriptName, match);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const result = await match.def.handler(parsedArgs);
|
|
214
|
+
debug(
|
|
215
|
+
'command %s completed, isError: %s',
|
|
216
|
+
match.name,
|
|
217
|
+
result.isError ?? false,
|
|
218
|
+
);
|
|
219
|
+
outputResult(result);
|
|
220
|
+
await tools.destroy();
|
|
221
|
+
if (result.isError) {
|
|
222
|
+
throw new CLIError('Command failed', 1);
|
|
223
|
+
}
|
|
224
|
+
}
|
package/src/cli/index.ts
ADDED
package/src/common.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { tmpdir } from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
// do not import getBasicEnvValue and MIDSCENE_RUN_DIR directly from ./env,
|
|
5
|
+
// because it will cause circular dependency
|
|
6
|
+
import { getBasicEnvValue } from './env/basic';
|
|
7
|
+
import { MIDSCENE_RUN_DIR } from './env/types';
|
|
8
|
+
import { ifInNode } from './utils';
|
|
9
|
+
|
|
10
|
+
export const defaultRunDirName = 'midscene_run';
|
|
11
|
+
// Define locally for now to avoid import issues
|
|
12
|
+
|
|
13
|
+
export const getMidsceneRunDir = () => {
|
|
14
|
+
if (!ifInNode) {
|
|
15
|
+
return '';
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return getBasicEnvValue(MIDSCENE_RUN_DIR) || defaultRunDirName;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export const getMidsceneRunBaseDir = () => {
|
|
22
|
+
if (!ifInNode) {
|
|
23
|
+
return '';
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
let basePath = path.resolve(process.cwd(), getMidsceneRunDir());
|
|
27
|
+
|
|
28
|
+
// Create a base directory
|
|
29
|
+
if (!existsSync(basePath)) {
|
|
30
|
+
try {
|
|
31
|
+
mkdirSync(basePath, { recursive: true });
|
|
32
|
+
} catch (error) {
|
|
33
|
+
// console.error(`Failed to create ${runDirName} directory: ${error}`);
|
|
34
|
+
basePath = path.join(tmpdir(), defaultRunDirName);
|
|
35
|
+
mkdirSync(basePath, { recursive: true });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return basePath;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Get the path to the midscene_run directory or a subdirectory within it.
|
|
44
|
+
* Creates the directory if it doesn't exist.
|
|
45
|
+
*
|
|
46
|
+
* @param subdir - Optional subdirectory name (e.g., 'log', 'report')
|
|
47
|
+
* @returns The absolute path to the requested directory
|
|
48
|
+
*/
|
|
49
|
+
export const getMidsceneRunSubDir = (
|
|
50
|
+
subdir: 'dump' | 'cache' | 'report' | 'tmp' | 'log' | 'output',
|
|
51
|
+
): string => {
|
|
52
|
+
if (!ifInNode) {
|
|
53
|
+
return '';
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Create a log directory
|
|
57
|
+
const basePath = getMidsceneRunBaseDir();
|
|
58
|
+
const logPath = path.join(basePath, subdir);
|
|
59
|
+
if (!existsSync(logPath)) {
|
|
60
|
+
mkdirSync(logPath, { recursive: true });
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return logPath;
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED =
|
|
67
|
+
'NOT_IMPLEMENTED_AS_DESIGNED';
|