From 6947a1adbaf7c908a096b1d48fd9d10c3aadfbe3 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 18 Jun 2025 18:50:46 +0200 Subject: [PATCH] Add dependency --- @capacitor/android/LICENSE | 21 + @capacitor/android/capacitor/build.gradle | 96 + .../android/capacitor/lint-baseline.xml | 136 + @capacitor/android/capacitor/lint.xml | 9 + .../android/capacitor/proguard-rules.pro | 28 + .../capacitor/src/main/AndroidManifest.xml | 3 + .../src/main/assets/native-bridge.js | 1025 ++++++++ .../getcapacitor/AndroidProtocolHandler.java | 94 + .../src/main/java/com/getcapacitor/App.java | 61 + .../main/java/com/getcapacitor/AppUUID.java | 65 + .../main/java/com/getcapacitor/Bridge.java | 1589 ++++++++++++ .../java/com/getcapacitor/BridgeActivity.java | 212 ++ .../java/com/getcapacitor/BridgeFragment.java | 134 + .../getcapacitor/BridgeWebChromeClient.java | 510 ++++ .../com/getcapacitor/BridgeWebViewClient.java | 111 + .../main/java/com/getcapacitor/CapConfig.java | 683 ++++++ .../com/getcapacitor/CapacitorWebView.java | 52 + .../main/java/com/getcapacitor/FileUtils.java | 292 +++ .../getcapacitor/InvalidPluginException.java | 8 + .../InvalidPluginMethodException.java | 16 + .../main/java/com/getcapacitor/JSArray.java | 51 + .../main/java/com/getcapacitor/JSExport.java | 193 ++ .../com/getcapacitor/JSExportException.java | 16 + .../java/com/getcapacitor/JSInjector.java | 107 + .../main/java/com/getcapacitor/JSObject.java | 164 ++ .../main/java/com/getcapacitor/JSValue.java | 65 + .../main/java/com/getcapacitor/Logger.java | 103 + .../java/com/getcapacitor/MessageHandler.java | 159 ++ .../java/com/getcapacitor/NativePlugin.java | 37 + .../com/getcapacitor/PermissionState.java | 31 + .../main/java/com/getcapacitor/Plugin.java | 1046 ++++++++ .../java/com/getcapacitor/PluginCall.java | 440 ++++ .../java/com/getcapacitor/PluginConfig.java | 116 + .../java/com/getcapacitor/PluginHandle.java | 160 ++ .../PluginInvocationException.java | 16 + .../com/getcapacitor/PluginLoadException.java | 19 + .../java/com/getcapacitor/PluginManager.java | 56 + .../java/com/getcapacitor/PluginMethod.java | 15 + .../com/getcapacitor/PluginMethodHandle.java | 33 + .../java/com/getcapacitor/PluginResult.java | 84 + .../java/com/getcapacitor/ProcessedRoute.java | 37 + .../java/com/getcapacitor/RouteProcessor.java | 8 + .../java/com/getcapacitor/ServerPath.java | 25 + .../java/com/getcapacitor/UriMatcher.java | 180 ++ .../com/getcapacitor/WebViewListener.java | 57 + .../com/getcapacitor/WebViewLocalServer.java | 749 ++++++ .../annotation/ActivityCallback.java | 11 + .../annotation/CapacitorPlugin.java | 35 + .../getcapacitor/annotation/Permission.java | 22 + .../annotation/PermissionCallback.java | 11 + .../CapacitorCordovaCookieManager.java | 42 + .../cordova/MockCordovaInterfaceImpl.java | 39 + .../cordova/MockCordovaWebViewImpl.java | 284 +++ .../plugin/CapacitorCookieManager.java | 239 ++ .../getcapacitor/plugin/CapacitorCookies.java | 122 + .../getcapacitor/plugin/CapacitorHttp.java | 119 + .../java/com/getcapacitor/plugin/WebView.java | 48 + .../getcapacitor/plugin/util/AssetUtil.java | 358 +++ .../util/CapacitorHttpUrlConnection.java | 478 ++++ .../plugin/util/HttpRequestHandler.java | 452 ++++ .../util/ICapacitorHttpUrlConnection.java | 15 + .../getcapacitor/plugin/util/MimeType.java | 17 + .../java/com/getcapacitor/util/HostMask.java | 123 + .../com/getcapacitor/util/InternalUtils.java | 27 + .../java/com/getcapacitor/util/JSONUtils.java | 166 ++ .../getcapacitor/util/PermissionHelper.java | 114 + .../java/com/getcapacitor/util/WebColor.java | 28 + .../main/res/layout/bridge_layout_main.xml | 15 + .../src/main/res/layout/fragment_bridge.xml | 13 + .../src/main/res/layout/no_webview.xml | 14 + .../capacitor/src/main/res/values/attrs.xml | 6 + .../capacitor/src/main/res/values/colors.xml | 6 + .../capacitor/src/main/res/values/strings.xml | 3 + .../capacitor/src/main/res/values/styles.xml | 6 + @capacitor/android/package.json | 31 + @capacitor/assets/LICENSE | 21 + @capacitor/assets/README.md | 97 + @capacitor/assets/dist/asset-generator.d.ts | 19 + @capacitor/assets/dist/asset-generator.js | 9 + @capacitor/assets/dist/colors.d.ts | 23 + @capacitor/assets/dist/colors.js | 27 + @capacitor/assets/dist/ctx.d.ts | 11 + @capacitor/assets/dist/ctx.js | 52 + @capacitor/assets/dist/definitions.d.ts | 147 ++ @capacitor/assets/dist/definitions.js | 2 + @capacitor/assets/dist/error.d.ts | 18 + @capacitor/assets/dist/error.js | 37 + @capacitor/assets/dist/index.d.ts | 3 + @capacitor/assets/dist/index.js | 71 + @capacitor/assets/dist/input-asset.d.ts | 24 + @capacitor/assets/dist/input-asset.js | 46 + @capacitor/assets/dist/output-asset.d.ts | 25 + @capacitor/assets/dist/output-asset.js | 22 + .../assets/dist/platforms/android/assets.d.ts | 42 + .../assets/dist/platforms/android/assets.js | 340 +++ .../assets/dist/platforms/android/index.d.ts | 28 + .../assets/dist/platforms/android/index.js | 339 +++ .../assets/dist/platforms/ios/assets.d.ts | 13 + .../assets/dist/platforms/ios/assets.js | 89 + .../assets/dist/platforms/ios/index.d.ts | 21 + @capacitor/assets/dist/platforms/ios/index.js | 266 ++ .../assets/dist/platforms/pwa/assets.d.ts | 20 + .../assets/dist/platforms/pwa/assets.js | 93 + .../assets/dist/platforms/pwa/index.d.ts | 31 + @capacitor/assets/dist/platforms/pwa/index.js | 434 ++++ @capacitor/assets/dist/project.d.ts | 18 + @capacitor/assets/dist/project.js | 91 + @capacitor/assets/dist/tasks/generate.d.ts | 3 + @capacitor/assets/dist/tasks/generate.js | 139 ++ @capacitor/assets/dist/util/cli.d.ts | 1 + @capacitor/assets/dist/util/cli.js | 31 + @capacitor/assets/dist/util/log.d.ts | 8 + @capacitor/assets/dist/util/log.js | 51 + @capacitor/assets/dist/util/subprocess.d.ts | 1 + @capacitor/assets/dist/util/subprocess.js | 22 + @capacitor/assets/dist/util/term.d.ts | 2 + @capacitor/assets/dist/util/term.js | 30 + @capacitor/assets/node_modules/.bin/cap | 1 + @capacitor/assets/node_modules/.bin/capacitor | 1 + @capacitor/assets/node_modules/.bin/rimraf | 1 + @capacitor/assets/node_modules/.bin/semver | 1 + .../node_modules/@capacitor/cli/LICENSE | 21 + .../node_modules/@capacitor/cli/README.md | 15 + .../cli/assets/android-template.tar.gz | Bin 0 -> 233664 bytes .../capacitor-cordova-android-plugins.tar.gz | Bin 0 -> 930 bytes .../capacitor-cordova-ios-plugins.tar.gz | Bin 0 -> 433 bytes .../@capacitor/cli/assets/ios-template.tar.gz | Bin 0 -> 155641 bytes .../@capacitor/cli/dist/android/add.js | 52 + .../@capacitor/cli/dist/android/build.js | 100 + .../@capacitor/cli/dist/android/common.js | 97 + .../@capacitor/cli/dist/android/doctor.js | 163 ++ .../@capacitor/cli/dist/android/open.js | 28 + .../@capacitor/cli/dist/android/run.js | 42 + .../@capacitor/cli/dist/android/update.js | 323 +++ .../@capacitor/cli/dist/colors.js | 26 + .../@capacitor/cli/dist/common.js | 398 +++ .../@capacitor/cli/dist/config.js | 396 +++ .../@capacitor/cli/dist/cordova.js | 829 +++++++ .../@capacitor/cli/dist/declarations.d.ts | 605 +++++ .../@capacitor/cli/dist/declarations.js | 2 + .../@capacitor/cli/dist/definitions.js | 2 + .../@capacitor/cli/dist/errors.js | 27 + .../@capacitor/cli/dist/framework-configs.js | 109 + .../node_modules/@capacitor/cli/dist/index.js | 212 ++ .../@capacitor/cli/dist/ios/add.js | 13 + .../@capacitor/cli/dist/ios/build.js | 56 + .../@capacitor/cli/dist/ios/common.js | 103 + .../@capacitor/cli/dist/ios/doctor.js | 49 + .../@capacitor/cli/dist/ios/open.js | 11 + .../@capacitor/cli/dist/ios/run.js | 38 + .../@capacitor/cli/dist/ios/update.js | 406 +++ .../node_modules/@capacitor/cli/dist/ipc.js | 61 + .../node_modules/@capacitor/cli/dist/log.js | 41 + .../@capacitor/cli/dist/plugin.js | 186 ++ .../@capacitor/cli/dist/sysconfig.js | 35 + .../@capacitor/cli/dist/tasks/add.js | 122 + .../@capacitor/cli/dist/tasks/build.js | 61 + .../@capacitor/cli/dist/tasks/config.js | 31 + .../@capacitor/cli/dist/tasks/copy.js | 212 ++ .../@capacitor/cli/dist/tasks/create.js | 11 + .../@capacitor/cli/dist/tasks/doctor.js | 73 + .../@capacitor/cli/dist/tasks/init.js | 143 ++ .../@capacitor/cli/dist/tasks/list.js | 50 + .../@capacitor/cli/dist/tasks/migrate.js | 611 +++++ .../@capacitor/cli/dist/tasks/new-plugin.js | 11 + .../@capacitor/cli/dist/tasks/open.js | 62 + .../@capacitor/cli/dist/tasks/run.js | 114 + .../@capacitor/cli/dist/tasks/serve.js | 11 + .../@capacitor/cli/dist/tasks/sourcemaps.js | 40 + .../@capacitor/cli/dist/tasks/sync.js | 59 + .../@capacitor/cli/dist/tasks/telemetry.js | 40 + .../@capacitor/cli/dist/tasks/update.js | 74 + .../@capacitor/cli/dist/telemetry.js | 130 + .../@capacitor/cli/dist/util/cli.js | 25 + .../@capacitor/cli/dist/util/emoji.js | 13 + .../@capacitor/cli/dist/util/fn.js | 13 + .../@capacitor/cli/dist/util/fs.js | 24 + .../@capacitor/cli/dist/util/js.js | 21 + .../@capacitor/cli/dist/util/livereload.js | 151 ++ .../@capacitor/cli/dist/util/monorepotools.js | 110 + .../@capacitor/cli/dist/util/native-run.js | 53 + .../@capacitor/cli/dist/util/node.js | 54 + .../@capacitor/cli/dist/util/promise.js | 35 + .../@capacitor/cli/dist/util/subprocess.js | 43 + .../@capacitor/cli/dist/util/template.js | 11 + .../@capacitor/cli/dist/util/term.js | 30 + .../@capacitor/cli/dist/util/uuid.js | 11 + .../@capacitor/cli/dist/util/xml.js | 57 + .../@capacitor/cli/dist/web/copy.js | 22 + .../cli/node_modules/commander/LICENSE | 22 + .../cli/node_modules/commander/Readme.md | 1129 +++++++++ .../cli/node_modules/commander/esm.mjs | 16 + .../cli/node_modules/commander/index.js | 27 + .../node_modules/commander/lib/argument.js | 147 ++ .../cli/node_modules/commander/lib/command.js | 2179 +++++++++++++++++ .../cli/node_modules/commander/lib/error.js | 45 + .../cli/node_modules/commander/lib/help.js | 461 ++++ .../cli/node_modules/commander/lib/option.js | 326 +++ .../commander/lib/suggestSimilar.js | 100 + .../commander/package-support.json | 16 + .../cli/node_modules/commander/package.json | 80 + .../node_modules/commander/typings/index.d.ts | 891 +++++++ .../node_modules/@capacitor/cli/package.json | 88 + .../@ionic/utils-array/CHANGELOG.md | 185 ++ .../node_modules/@ionic/utils-array/LICENSE | 21 + .../node_modules/@ionic/utils-array/README.md | 1 + .../@ionic/utils-array/dist/index.d.ts | 39 + .../@ionic/utils-array/dist/index.js | 97 + .../@ionic/utils-array/package.json | 49 + .../brace-expansion/.github/FUNDING.yml | 2 + .../node_modules/brace-expansion/LICENSE | 21 + .../node_modules/brace-expansion/README.md | 135 + .../node_modules/brace-expansion/index.js | 203 ++ .../node_modules/brace-expansion/package.json | 46 + .../assets/node_modules/cliui/CHANGELOG.md | 139 ++ .../assets/node_modules/cliui/LICENSE.txt | 14 + .../assets/node_modules/cliui/README.md | 141 ++ .../assets/node_modules/cliui/index.mjs | 13 + .../assets/node_modules/cliui/package.json | 83 + .../assets/node_modules/css-select/LICENSE | 11 + .../assets/node_modules/css-select/README.md | 255 ++ .../css-select/lib/attributes.d.ts | 7 + .../css-select/lib/attributes.d.ts.map | 1 + .../node_modules/css-select/lib/attributes.js | 232 ++ .../node_modules/css-select/lib/compile.d.ts | 14 + .../css-select/lib/compile.d.ts.map | 1 + .../node_modules/css-select/lib/compile.js | 119 + .../node_modules/css-select/lib/general.d.ts | 3 + .../css-select/lib/general.d.ts.map | 1 + .../node_modules/css-select/lib/general.js | 140 ++ .../node_modules/css-select/lib/index.d.ts | 49 + .../css-select/lib/index.d.ts.map | 1 + .../node_modules/css-select/lib/index.js | 149 ++ .../css-select/lib/procedure.d.ts | 5 + .../css-select/lib/procedure.d.ts.map | 1 + .../node_modules/css-select/lib/procedure.js | 21 + .../lib/pseudo-selectors/aliases.d.ts | 5 + .../lib/pseudo-selectors/aliases.d.ts.map | 1 + .../lib/pseudo-selectors/aliases.js | 33 + .../lib/pseudo-selectors/filters.d.ts | 4 + .../lib/pseudo-selectors/filters.d.ts.map | 1 + .../lib/pseudo-selectors/filters.js | 156 ++ .../lib/pseudo-selectors/index.d.ts | 8 + .../lib/pseudo-selectors/index.d.ts.map | 1 + .../css-select/lib/pseudo-selectors/index.js | 54 + .../lib/pseudo-selectors/pseudos.d.ts | 6 + .../lib/pseudo-selectors/pseudos.d.ts.map | 1 + .../lib/pseudo-selectors/pseudos.js | 89 + .../lib/pseudo-selectors/subselects.d.ts | 10 + .../lib/pseudo-selectors/subselects.d.ts.map | 1 + .../lib/pseudo-selectors/subselects.js | 110 + .../node_modules/css-select/lib/sort.d.ts | 10 + .../node_modules/css-select/lib/sort.d.ts.map | 1 + .../node_modules/css-select/lib/sort.js | 85 + .../node_modules/css-select/lib/types.d.ts | 144 ++ .../css-select/lib/types.d.ts.map | 1 + .../node_modules/css-select/lib/types.js | 2 + .../node_modules/css-select/package.json | 70 + .../node_modules/dom-serializer/LICENSE | 11 + .../node_modules/dom-serializer/README.md | 97 + .../dom-serializer/lib/esm/foreignNames.d.ts | 3 + .../lib/esm/foreignNames.d.ts.map | 1 + .../dom-serializer/lib/esm/foreignNames.js | 100 + .../dom-serializer/lib/esm/index.d.ts | 52 + .../dom-serializer/lib/esm/index.d.ts.map | 1 + .../dom-serializer/lib/esm/index.js | 190 ++ .../dom-serializer/lib/esm/package.json | 1 + .../dom-serializer/lib/foreignNames.d.ts | 3 + .../dom-serializer/lib/foreignNames.d.ts.map | 1 + .../dom-serializer/lib/foreignNames.js | 103 + .../dom-serializer/lib/index.d.ts | 43 + .../dom-serializer/lib/index.d.ts.map | 1 + .../node_modules/dom-serializer/lib/index.js | 211 ++ .../node_modules/dom-serializer/package.json | 55 + .../node_modules/domelementtype/LICENSE | 11 + .../domelementtype/lib/esm/index.d.ts | 48 + .../domelementtype/lib/esm/index.d.ts.map | 1 + .../domelementtype/lib/esm/index.js | 51 + .../domelementtype/lib/esm/package.json | 1 + .../domelementtype/lib/index.d.ts | 48 + .../domelementtype/lib/index.d.ts.map | 1 + .../node_modules/domelementtype/lib/index.js | 55 + .../node_modules/domelementtype/package.json | 54 + .../node_modules/domelementtype/readme.md | 1 + .../assets/node_modules/domhandler/LICENSE | 11 + .../node_modules/domhandler/lib/index.d.ts | 85 + .../domhandler/lib/index.d.ts.map | 1 + .../node_modules/domhandler/lib/index.js | 176 ++ .../node_modules/domhandler/lib/node.d.ts | 237 ++ .../node_modules/domhandler/lib/node.d.ts.map | 1 + .../node_modules/domhandler/lib/node.js | 444 ++++ .../node_modules/domhandler/package.json | 58 + .../assets/node_modules/domhandler/readme.md | 163 ++ .../assets/node_modules/domutils/LICENSE | 11 + .../node_modules/domutils/lib/feeds.d.ts | 45 + .../node_modules/domutils/lib/feeds.d.ts.map | 1 + .../assets/node_modules/domutils/lib/feeds.js | 190 ++ .../node_modules/domutils/lib/helpers.d.ts | 51 + .../domutils/lib/helpers.d.ts.map | 1 + .../node_modules/domutils/lib/helpers.js | 125 + .../node_modules/domutils/lib/index.d.ts | 10 + .../node_modules/domutils/lib/index.d.ts.map | 1 + .../assets/node_modules/domutils/lib/index.js | 28 + .../node_modules/domutils/lib/legacy.d.ts | 47 + .../node_modules/domutils/lib/legacy.d.ts.map | 1 + .../node_modules/domutils/lib/legacy.js | 124 + .../domutils/lib/manipulation.d.ts | 43 + .../domutils/lib/manipulation.d.ts.map | 1 + .../node_modules/domutils/lib/manipulation.js | 129 + .../node_modules/domutils/lib/querying.d.ts | 55 + .../domutils/lib/querying.d.ts.map | 1 + .../node_modules/domutils/lib/querying.js | 126 + .../node_modules/domutils/lib/stringify.d.ts | 41 + .../domutils/lib/stringify.d.ts.map | 1 + .../node_modules/domutils/lib/stringify.js | 86 + .../node_modules/domutils/lib/traversal.d.ts | 59 + .../domutils/lib/traversal.d.ts.map | 1 + .../node_modules/domutils/lib/traversal.js | 117 + .../assets/node_modules/domutils/package.json | 65 + .../assets/node_modules/domutils/readme.md | 31 + .../assets/node_modules/entities/LICENSE | 11 + .../node_modules/entities/lib/decode.d.ts | 5 + .../node_modules/entities/lib/decode.d.ts.map | 1 + .../node_modules/entities/lib/decode.js | 53 + .../entities/lib/decode_codepoint.d.ts | 2 + .../entities/lib/decode_codepoint.d.ts.map | 1 + .../entities/lib/decode_codepoint.js | 30 + .../node_modules/entities/lib/encode.d.ts | 47 + .../node_modules/entities/lib/encode.d.ts.map | 1 + .../node_modules/entities/lib/encode.js | 136 + .../node_modules/entities/lib/index.d.ts | 27 + .../node_modules/entities/lib/index.d.ts.map | 1 + .../assets/node_modules/entities/lib/index.js | 57 + .../entities/lib/maps/decode.json | 1 + .../entities/lib/maps/entities.json | 1 + .../entities/lib/maps/legacy.json | 1 + .../node_modules/entities/lib/maps/xml.json | 1 + .../assets/node_modules/entities/package.json | 64 + .../assets/node_modules/entities/readme.md | 57 + .../assets/node_modules/fs-extra/LICENSE | 15 + .../assets/node_modules/fs-extra/README.md | 262 ++ .../fs-extra/lib/copy/copy-sync.js | 169 ++ .../node_modules/fs-extra/lib/copy/copy.js | 235 ++ .../node_modules/fs-extra/lib/copy/index.js | 7 + .../node_modules/fs-extra/lib/empty/index.js | 39 + .../node_modules/fs-extra/lib/ensure/file.js | 69 + .../node_modules/fs-extra/lib/ensure/index.js | 23 + .../node_modules/fs-extra/lib/ensure/link.js | 64 + .../fs-extra/lib/ensure/symlink-paths.js | 99 + .../fs-extra/lib/ensure/symlink-type.js | 31 + .../fs-extra/lib/ensure/symlink.js | 82 + .../node_modules/fs-extra/lib/fs/index.js | 128 + .../assets/node_modules/fs-extra/lib/index.js | 16 + .../node_modules/fs-extra/lib/json/index.js | 16 + .../fs-extra/lib/json/jsonfile.js | 11 + .../fs-extra/lib/json/output-json-sync.js | 12 + .../fs-extra/lib/json/output-json.js | 12 + .../node_modules/fs-extra/lib/mkdirs/index.js | 14 + .../fs-extra/lib/mkdirs/make-dir.js | 27 + .../node_modules/fs-extra/lib/mkdirs/utils.js | 21 + .../node_modules/fs-extra/lib/move/index.js | 7 + .../fs-extra/lib/move/move-sync.js | 54 + .../node_modules/fs-extra/lib/move/move.js | 75 + .../fs-extra/lib/output-file/index.js | 40 + .../fs-extra/lib/path-exists/index.js | 12 + .../node_modules/fs-extra/lib/remove/index.js | 22 + .../fs-extra/lib/remove/rimraf.js | 302 +++ .../node_modules/fs-extra/lib/util/stat.js | 154 ++ .../node_modules/fs-extra/lib/util/utimes.js | 26 + .../assets/node_modules/fs-extra/package.json | 67 + @capacitor/assets/node_modules/glob/LICENSE | 15 + @capacitor/assets/node_modules/glob/README.md | 1086 ++++++++ .../node_modules/glob/dist/cjs/glob.d.ts | 333 +++ .../node_modules/glob/dist/cjs/glob.d.ts.map | 1 + .../assets/node_modules/glob/dist/cjs/glob.js | 229 ++ .../node_modules/glob/dist/cjs/glob.js.map | 1 + .../node_modules/glob/dist/cjs/has-magic.d.ts | 14 + .../glob/dist/cjs/has-magic.d.ts.map | 1 + .../node_modules/glob/dist/cjs/has-magic.js | 27 + .../glob/dist/cjs/has-magic.js.map | 1 + .../node_modules/glob/dist/cjs/ignore.d.ts | 20 + .../glob/dist/cjs/ignore.d.ts.map | 1 + .../node_modules/glob/dist/cjs/ignore.js | 103 + .../node_modules/glob/dist/cjs/ignore.js.map | 1 + .../node_modules/glob/dist/cjs/index-cjs.d.ts | 75 + .../glob/dist/cjs/index-cjs.d.ts.map | 1 + .../node_modules/glob/dist/cjs/index-cjs.js | 7 + .../glob/dist/cjs/index-cjs.js.map | 1 + .../node_modules/glob/dist/cjs/index.d.ts | 96 + .../node_modules/glob/dist/cjs/index.d.ts.map | 1 + .../node_modules/glob/dist/cjs/index.js | 68 + .../node_modules/glob/dist/cjs/index.js.map | 1 + .../node_modules/glob/dist/cjs/package.json | 3 + .../node_modules/glob/dist/cjs/pattern.d.ts | 77 + .../glob/dist/cjs/pattern.d.ts.map | 1 + .../node_modules/glob/dist/cjs/pattern.js | 219 ++ .../node_modules/glob/dist/cjs/pattern.js.map | 1 + .../node_modules/glob/dist/cjs/processor.d.ts | 59 + .../glob/dist/cjs/processor.d.ts.map | 1 + .../node_modules/glob/dist/cjs/processor.js | 309 +++ .../glob/dist/cjs/processor.js.map | 1 + .../node_modules/glob/dist/cjs/walker.d.ts | 95 + .../glob/dist/cjs/walker.d.ts.map | 1 + .../node_modules/glob/dist/cjs/walker.js | 360 +++ .../node_modules/glob/dist/cjs/walker.js.map | 1 + .../node_modules/glob/dist/mjs/glob.d.ts | 333 +++ .../node_modules/glob/dist/mjs/glob.d.ts.map | 1 + .../assets/node_modules/glob/dist/mjs/glob.js | 225 ++ .../node_modules/glob/dist/mjs/glob.js.map | 1 + .../node_modules/glob/dist/mjs/has-magic.d.ts | 14 + .../glob/dist/mjs/has-magic.d.ts.map | 1 + .../node_modules/glob/dist/mjs/has-magic.js | 23 + .../glob/dist/mjs/has-magic.js.map | 1 + .../node_modules/glob/dist/mjs/ignore.d.ts | 20 + .../glob/dist/mjs/ignore.d.ts.map | 1 + .../node_modules/glob/dist/mjs/ignore.js | 99 + .../node_modules/glob/dist/mjs/ignore.js.map | 1 + .../node_modules/glob/dist/mjs/index.d.ts | 96 + .../node_modules/glob/dist/mjs/index.d.ts.map | 1 + .../node_modules/glob/dist/mjs/index.js | 55 + .../node_modules/glob/dist/mjs/index.js.map | 1 + .../node_modules/glob/dist/mjs/package.json | 3 + .../node_modules/glob/dist/mjs/pattern.d.ts | 77 + .../glob/dist/mjs/pattern.d.ts.map | 1 + .../node_modules/glob/dist/mjs/pattern.js | 215 ++ .../node_modules/glob/dist/mjs/pattern.js.map | 1 + .../node_modules/glob/dist/mjs/processor.d.ts | 59 + .../glob/dist/mjs/processor.d.ts.map | 1 + .../node_modules/glob/dist/mjs/processor.js | 302 +++ .../glob/dist/mjs/processor.js.map | 1 + .../node_modules/glob/dist/mjs/walker.d.ts | 95 + .../glob/dist/mjs/walker.d.ts.map | 1 + .../node_modules/glob/dist/mjs/walker.js | 351 +++ .../node_modules/glob/dist/mjs/walker.js.map | 1 + .../assets/node_modules/glob/package.json | 97 + .../assets/node_modules/minimatch/LICENSE | 15 + .../assets/node_modules/minimatch/README.md | 459 ++++ .../dist/cjs/assert-valid-pattern.d.ts | 2 + .../dist/cjs/assert-valid-pattern.d.ts.map | 1 + .../dist/cjs/assert-valid-pattern.js | 14 + .../dist/cjs/assert-valid-pattern.js.map | 1 + .../node_modules/minimatch/dist/cjs/ast.d.ts | 24 + .../minimatch/dist/cjs/ast.d.ts.map | 1 + .../node_modules/minimatch/dist/cjs/ast.js | 566 +++++ .../minimatch/dist/cjs/ast.js.map | 1 + .../minimatch/dist/cjs/brace-expressions.d.ts | 8 + .../dist/cjs/brace-expressions.d.ts.map | 1 + .../minimatch/dist/cjs/brace-expressions.js | 152 ++ .../dist/cjs/brace-expressions.js.map | 1 + .../minimatch/dist/cjs/escape.d.ts | 12 + .../minimatch/dist/cjs/escape.d.ts.map | 1 + .../node_modules/minimatch/dist/cjs/escape.js | 22 + .../minimatch/dist/cjs/escape.js.map | 1 + .../minimatch/dist/cjs/index-cjs.d.ts | 45 + .../minimatch/dist/cjs/index-cjs.d.ts.map | 1 + .../minimatch/dist/cjs/index-cjs.js | 7 + .../minimatch/dist/cjs/index-cjs.js.map | 1 + .../minimatch/dist/cjs/index.d.ts | 95 + .../minimatch/dist/cjs/index.d.ts.map | 1 + .../node_modules/minimatch/dist/cjs/index.js | 1016 ++++++++ .../minimatch/dist/cjs/index.js.map | 1 + .../minimatch/dist/cjs/package.json | 3 + .../minimatch/dist/cjs/unescape.d.ts | 17 + .../minimatch/dist/cjs/unescape.d.ts.map | 1 + .../minimatch/dist/cjs/unescape.js | 24 + .../minimatch/dist/cjs/unescape.js.map | 1 + .../dist/mjs/assert-valid-pattern.d.ts | 2 + .../dist/mjs/assert-valid-pattern.d.ts.map | 1 + .../dist/mjs/assert-valid-pattern.js | 10 + .../dist/mjs/assert-valid-pattern.js.map | 1 + .../node_modules/minimatch/dist/mjs/ast.d.ts | 24 + .../minimatch/dist/mjs/ast.d.ts.map | 1 + .../node_modules/minimatch/dist/mjs/ast.js | 562 +++++ .../minimatch/dist/mjs/ast.js.map | 1 + .../minimatch/dist/mjs/brace-expressions.d.ts | 8 + .../dist/mjs/brace-expressions.d.ts.map | 1 + .../minimatch/dist/mjs/brace-expressions.js | 148 ++ .../dist/mjs/brace-expressions.js.map | 1 + .../minimatch/dist/mjs/escape.d.ts | 12 + .../minimatch/dist/mjs/escape.d.ts.map | 1 + .../node_modules/minimatch/dist/mjs/escape.js | 18 + .../minimatch/dist/mjs/escape.js.map | 1 + .../minimatch/dist/mjs/index.d.ts | 95 + .../minimatch/dist/mjs/index.d.ts.map | 1 + .../node_modules/minimatch/dist/mjs/index.js | 1000 ++++++++ .../minimatch/dist/mjs/index.js.map | 1 + .../minimatch/dist/mjs/package.json | 3 + .../minimatch/dist/mjs/unescape.d.ts | 17 + .../minimatch/dist/mjs/unescape.d.ts.map | 1 + .../minimatch/dist/mjs/unescape.js | 20 + .../minimatch/dist/mjs/unescape.js.map | 1 + .../node_modules/minimatch/package.json | 86 + .../assets/node_modules/minipass/LICENSE | 15 + .../assets/node_modules/minipass/README.md | 769 ++++++ .../assets/node_modules/minipass/index.d.ts | 150 ++ .../assets/node_modules/minipass/index.js | 702 ++++++ .../assets/node_modules/minipass/index.mjs | 702 ++++++ .../assets/node_modules/minipass/package.json | 79 + .../assets/node_modules/node-fetch/LICENSE.md | 22 + .../assets/node_modules/node-fetch/README.md | 634 +++++ .../assets/node_modules/node-fetch/browser.js | 25 + .../node_modules/node-fetch/lib/index.es.js | 1777 ++++++++++++++ .../node_modules/node-fetch/lib/index.js | 1787 ++++++++++++++ .../node_modules/node-fetch/lib/index.mjs | 1775 ++++++++++++++ .../node_modules/node-fetch/package.json | 89 + .../node-html-parser/CHANGELOG.md | 30 + .../node_modules/node-html-parser/LICENSE | 7 + .../node_modules/node-html-parser/README.md | 286 +++ .../node-html-parser/dist/back.d.ts | 1 + .../node-html-parser/dist/back.js | 6 + .../node-html-parser/dist/index.d.ts | 20 + .../node-html-parser/dist/index.js | 35 + .../node-html-parser/dist/main.js | 1664 +++++++++++++ .../node-html-parser/dist/matcher.d.ts | 6 + .../node-html-parser/dist/matcher.js | 106 + .../node-html-parser/dist/nodes/comment.d.ts | 19 + .../node-html-parser/dist/nodes/comment.js | 54 + .../node-html-parser/dist/nodes/html.d.ts | 233 ++ .../node-html-parser/dist/nodes/html.js | 1238 ++++++++++ .../node-html-parser/dist/nodes/node.d.ts | 23 + .../node-html-parser/dist/nodes/node.js | 52 + .../node-html-parser/dist/nodes/text.d.ts | 43 + .../node-html-parser/dist/nodes/text.js | 142 ++ .../node-html-parser/dist/nodes/type.d.ts | 6 + .../node-html-parser/dist/nodes/type.js | 9 + .../node-html-parser/dist/parse.d.ts | 1 + .../node-html-parser/dist/parse.js | 5 + .../node-html-parser/dist/valid.d.ts | 6 + .../node-html-parser/dist/valid.js | 13 + .../node-html-parser/dist/void-tag.d.ts | 7 + .../node-html-parser/dist/void-tag.js | 29 + .../node-html-parser/package.json | 111 + @capacitor/assets/node_modules/rimraf/LICENSE | 15 + .../assets/node_modules/rimraf/README.md | 214 ++ .../node_modules/rimraf/dist/cjs/package.json | 84 + .../node_modules/rimraf/dist/cjs/src/bin.d.ts | 8 + .../rimraf/dist/cjs/src/bin.d.ts.map | 1 + .../node_modules/rimraf/dist/cjs/src/bin.js | 260 ++ .../rimraf/dist/cjs/src/bin.js.map | 1 + .../rimraf/dist/cjs/src/default-tmp.d.ts | 3 + .../rimraf/dist/cjs/src/default-tmp.d.ts.map | 1 + .../rimraf/dist/cjs/src/default-tmp.js | 61 + .../rimraf/dist/cjs/src/default-tmp.js.map | 1 + .../rimraf/dist/cjs/src/fix-eperm.d.ts | 3 + .../rimraf/dist/cjs/src/fix-eperm.d.ts.map | 1 + .../rimraf/dist/cjs/src/fix-eperm.js | 58 + .../rimraf/dist/cjs/src/fix-eperm.js.map | 1 + .../node_modules/rimraf/dist/cjs/src/fs.d.ts | 17 + .../rimraf/dist/cjs/src/fs.d.ts.map | 1 + .../node_modules/rimraf/dist/cjs/src/fs.js | 46 + .../rimraf/dist/cjs/src/fs.js.map | 1 + .../rimraf/dist/cjs/src/ignore-enoent.d.ts | 3 + .../dist/cjs/src/ignore-enoent.d.ts.map | 1 + .../rimraf/dist/cjs/src/ignore-enoent.js | 21 + .../rimraf/dist/cjs/src/ignore-enoent.js.map | 1 + .../rimraf/dist/cjs/src/index-cjs.d.ts | 57 + .../rimraf/dist/cjs/src/index-cjs.d.ts.map | 1 + .../rimraf/dist/cjs/src/index-cjs.js | 7 + .../rimraf/dist/cjs/src/index-cjs.js.map | 1 + .../rimraf/dist/cjs/src/index.d.ts | 71 + .../rimraf/dist/cjs/src/index.d.ts.map | 1 + .../node_modules/rimraf/dist/cjs/src/index.js | 92 + .../rimraf/dist/cjs/src/index.js.map | 1 + .../rimraf/dist/cjs/src/opt-arg.d.ts | 17 + .../rimraf/dist/cjs/src/opt-arg.d.ts.map | 1 + .../rimraf/dist/cjs/src/opt-arg.js | 36 + .../rimraf/dist/cjs/src/opt-arg.js.map | 1 + .../rimraf/dist/cjs/src/path-arg.d.ts | 4 + .../rimraf/dist/cjs/src/path-arg.d.ts.map | 1 + .../rimraf/dist/cjs/src/path-arg.js | 54 + .../rimraf/dist/cjs/src/path-arg.js.map | 1 + .../rimraf/dist/cjs/src/platform.d.ts | 3 + .../rimraf/dist/cjs/src/platform.d.ts.map | 1 + .../rimraf/dist/cjs/src/platform.js | 4 + .../rimraf/dist/cjs/src/platform.js.map | 1 + .../rimraf/dist/cjs/src/readdir-or-error.d.ts | 5 + .../dist/cjs/src/readdir-or-error.d.ts.map | 1 + .../rimraf/dist/cjs/src/readdir-or-error.js | 19 + .../dist/cjs/src/readdir-or-error.js.map | 1 + .../rimraf/dist/cjs/src/retry-busy.d.ts | 8 + .../rimraf/dist/cjs/src/retry-busy.d.ts.map | 1 + .../rimraf/dist/cjs/src/retry-busy.js | 68 + .../rimraf/dist/cjs/src/retry-busy.js.map | 1 + .../rimraf/dist/cjs/src/rimraf-manual.d.ts | 3 + .../dist/cjs/src/rimraf-manual.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-manual.js | 12 + .../rimraf/dist/cjs/src/rimraf-manual.js.map | 1 + .../dist/cjs/src/rimraf-move-remove.d.ts | 4 + .../dist/cjs/src/rimraf-move-remove.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-move-remove.js | 192 ++ .../dist/cjs/src/rimraf-move-remove.js.map | 1 + .../rimraf/dist/cjs/src/rimraf-native.d.ts | 4 + .../dist/cjs/src/rimraf-native.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-native.js | 24 + .../rimraf/dist/cjs/src/rimraf-native.js.map | 1 + .../rimraf/dist/cjs/src/rimraf-posix.d.ts | 4 + .../rimraf/dist/cjs/src/rimraf-posix.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-posix.js | 123 + .../rimraf/dist/cjs/src/rimraf-posix.js.map | 1 + .../rimraf/dist/cjs/src/rimraf-windows.d.ts | 4 + .../dist/cjs/src/rimraf-windows.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-windows.js | 182 ++ .../rimraf/dist/cjs/src/rimraf-windows.js.map | 1 + .../rimraf/dist/cjs/src/use-native.d.ts | 4 + .../rimraf/dist/cjs/src/use-native.d.ts.map | 1 + .../rimraf/dist/cjs/src/use-native.js | 19 + .../rimraf/dist/cjs/src/use-native.js.map | 1 + .../rimraf/dist/mjs/default-tmp.d.ts | 3 + .../rimraf/dist/mjs/default-tmp.d.ts.map | 1 + .../rimraf/dist/mjs/default-tmp.js | 55 + .../rimraf/dist/mjs/default-tmp.js.map | 1 + .../rimraf/dist/mjs/fix-eperm.d.ts | 3 + .../rimraf/dist/mjs/fix-eperm.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/fix-eperm.js | 53 + .../rimraf/dist/mjs/fix-eperm.js.map | 1 + .../node_modules/rimraf/dist/mjs/fs.d.ts | 17 + .../node_modules/rimraf/dist/mjs/fs.d.ts.map | 1 + .../assets/node_modules/rimraf/dist/mjs/fs.js | 31 + .../node_modules/rimraf/dist/mjs/fs.js.map | 1 + .../rimraf/dist/mjs/ignore-enoent.d.ts | 3 + .../rimraf/dist/mjs/ignore-enoent.d.ts.map | 1 + .../rimraf/dist/mjs/ignore-enoent.js | 16 + .../rimraf/dist/mjs/ignore-enoent.js.map | 1 + .../node_modules/rimraf/dist/mjs/index.d.ts | 71 + .../rimraf/dist/mjs/index.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/index.js | 84 + .../node_modules/rimraf/dist/mjs/index.js.map | 1 + .../node_modules/rimraf/dist/mjs/opt-arg.d.ts | 17 + .../rimraf/dist/mjs/opt-arg.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/opt-arg.js | 31 + .../rimraf/dist/mjs/opt-arg.js.map | 1 + .../node_modules/rimraf/dist/mjs/package.json | 4 + .../rimraf/dist/mjs/path-arg.d.ts | 4 + .../rimraf/dist/mjs/path-arg.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/path-arg.js | 49 + .../rimraf/dist/mjs/path-arg.js.map | 1 + .../rimraf/dist/mjs/platform.d.ts | 3 + .../rimraf/dist/mjs/platform.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/platform.js | 2 + .../rimraf/dist/mjs/platform.js.map | 1 + .../rimraf/dist/mjs/readdir-or-error.d.ts | 5 + .../rimraf/dist/mjs/readdir-or-error.d.ts.map | 1 + .../rimraf/dist/mjs/readdir-or-error.js | 14 + .../rimraf/dist/mjs/readdir-or-error.js.map | 1 + .../rimraf/dist/mjs/retry-busy.d.ts | 8 + .../rimraf/dist/mjs/retry-busy.d.ts.map | 1 + .../rimraf/dist/mjs/retry-busy.js | 63 + .../rimraf/dist/mjs/retry-busy.js.map | 1 + .../rimraf/dist/mjs/rimraf-manual.d.ts | 3 + .../rimraf/dist/mjs/rimraf-manual.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-manual.js | 6 + .../rimraf/dist/mjs/rimraf-manual.js.map | 1 + .../rimraf/dist/mjs/rimraf-move-remove.d.ts | 4 + .../dist/mjs/rimraf-move-remove.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-move-remove.js | 187 ++ .../rimraf/dist/mjs/rimraf-move-remove.js.map | 1 + .../rimraf/dist/mjs/rimraf-native.d.ts | 4 + .../rimraf/dist/mjs/rimraf-native.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-native.js | 19 + .../rimraf/dist/mjs/rimraf-native.js.map | 1 + .../rimraf/dist/mjs/rimraf-posix.d.ts | 4 + .../rimraf/dist/mjs/rimraf-posix.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-posix.js | 118 + .../rimraf/dist/mjs/rimraf-posix.js.map | 1 + .../rimraf/dist/mjs/rimraf-windows.d.ts | 4 + .../rimraf/dist/mjs/rimraf-windows.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-windows.js | 177 ++ .../rimraf/dist/mjs/rimraf-windows.js.map | 1 + .../rimraf/dist/mjs/use-native.d.ts | 4 + .../rimraf/dist/mjs/use-native.d.ts.map | 1 + .../rimraf/dist/mjs/use-native.js | 13 + .../rimraf/dist/mjs/use-native.js.map | 1 + .../assets/node_modules/rimraf/package.json | 84 + @capacitor/assets/node_modules/semver/LICENSE | 15 + .../assets/node_modules/semver/README.md | 654 +++++ .../node_modules/semver/classes/comparator.js | 141 ++ .../node_modules/semver/classes/index.js | 5 + .../node_modules/semver/classes/range.js | 554 +++++ .../node_modules/semver/classes/semver.js | 302 +++ .../node_modules/semver/functions/clean.js | 6 + .../node_modules/semver/functions/cmp.js | 52 + .../node_modules/semver/functions/coerce.js | 60 + .../semver/functions/compare-build.js | 7 + .../semver/functions/compare-loose.js | 3 + .../node_modules/semver/functions/compare.js | 5 + .../node_modules/semver/functions/diff.js | 65 + .../node_modules/semver/functions/eq.js | 3 + .../node_modules/semver/functions/gt.js | 3 + .../node_modules/semver/functions/gte.js | 3 + .../node_modules/semver/functions/inc.js | 19 + .../node_modules/semver/functions/lt.js | 3 + .../node_modules/semver/functions/lte.js | 3 + .../node_modules/semver/functions/major.js | 3 + .../node_modules/semver/functions/minor.js | 3 + .../node_modules/semver/functions/neq.js | 3 + .../node_modules/semver/functions/parse.js | 16 + .../node_modules/semver/functions/patch.js | 3 + .../semver/functions/prerelease.js | 6 + .../node_modules/semver/functions/rcompare.js | 3 + .../node_modules/semver/functions/rsort.js | 3 + .../semver/functions/satisfies.js | 10 + .../node_modules/semver/functions/sort.js | 3 + .../node_modules/semver/functions/valid.js | 6 + .../assets/node_modules/semver/index.js | 89 + .../node_modules/semver/internal/constants.js | 35 + .../node_modules/semver/internal/debug.js | 9 + .../semver/internal/identifiers.js | 23 + .../node_modules/semver/internal/lrucache.js | 40 + .../semver/internal/parse-options.js | 15 + .../assets/node_modules/semver/internal/re.js | 217 ++ .../assets/node_modules/semver/package.json | 77 + .../assets/node_modules/semver/preload.js | 2 + .../assets/node_modules/semver/range.bnf | 16 + .../assets/node_modules/semver/ranges/gtr.js | 4 + .../node_modules/semver/ranges/intersects.js | 7 + .../assets/node_modules/semver/ranges/ltr.js | 4 + .../semver/ranges/max-satisfying.js | 25 + .../semver/ranges/min-satisfying.js | 24 + .../node_modules/semver/ranges/min-version.js | 61 + .../node_modules/semver/ranges/outside.js | 80 + .../node_modules/semver/ranges/simplify.js | 47 + .../node_modules/semver/ranges/subset.js | 247 ++ .../semver/ranges/to-comparators.js | 8 + .../node_modules/semver/ranges/valid.js | 11 + .../assets/node_modules/tr46/.npmignore | 4 + @capacitor/assets/node_modules/tr46/index.js | 193 ++ .../assets/node_modules/tr46/lib/.gitkeep | 0 .../node_modules/tr46/lib/mappingTable.json | 1 + .../assets/node_modules/tr46/package.json | 31 + .../node_modules/tslib/CopyrightNotice.txt | 15 + .../assets/node_modules/tslib/LICENSE.txt | 12 + .../assets/node_modules/tslib/README.md | 164 ++ .../assets/node_modules/tslib/SECURITY.md | 41 + .../node_modules/tslib/modules/index.d.ts | 37 + .../node_modules/tslib/modules/index.js | 68 + .../node_modules/tslib/modules/package.json | 3 + .../assets/node_modules/tslib/package.json | 47 + .../assets/node_modules/tslib/tslib.d.ts | 453 ++++ .../assets/node_modules/tslib/tslib.es6.html | 1 + .../assets/node_modules/tslib/tslib.es6.js | 370 +++ .../assets/node_modules/tslib/tslib.es6.mjs | 370 +++ .../assets/node_modules/tslib/tslib.html | 1 + @capacitor/assets/node_modules/tslib/tslib.js | 421 ++++ .../assets/node_modules/universalify/LICENSE | 20 + .../node_modules/universalify/README.md | 76 + .../assets/node_modules/universalify/index.js | 24 + .../node_modules/universalify/package.json | 34 + .../webidl-conversions/LICENSE.md | 12 + .../node_modules/webidl-conversions/README.md | 53 + .../webidl-conversions/lib/index.js | 189 ++ .../webidl-conversions/package.json | 23 + .../node_modules/whatwg-url/LICENSE.txt | 21 + .../assets/node_modules/whatwg-url/README.md | 67 + .../node_modules/whatwg-url/lib/URL-impl.js | 200 ++ .../assets/node_modules/whatwg-url/lib/URL.js | 196 ++ .../node_modules/whatwg-url/lib/public-api.js | 11 + .../whatwg-url/lib/url-state-machine.js | 1297 ++++++++++ .../node_modules/whatwg-url/lib/utils.js | 20 + .../node_modules/whatwg-url/package.json | 32 + @capacitor/assets/node_modules/xml2js/LICENSE | 19 + .../assets/node_modules/xml2js/README.md | 507 ++++ .../assets/node_modules/xml2js/lib/bom.js | 12 + .../assets/node_modules/xml2js/lib/builder.js | 127 + .../node_modules/xml2js/lib/defaults.js | 72 + .../assets/node_modules/xml2js/lib/parser.js | 385 +++ .../node_modules/xml2js/lib/processors.js | 34 + .../assets/node_modules/xml2js/lib/xml2js.js | 39 + .../assets/node_modules/xml2js/package.json | 93 + .../node_modules/yargs-parser/CHANGELOG.md | 308 +++ .../node_modules/yargs-parser/LICENSE.txt | 14 + .../node_modules/yargs-parser/README.md | 518 ++++ .../node_modules/yargs-parser/browser.js | 29 + .../node_modules/yargs-parser/package.json | 92 + @capacitor/assets/node_modules/yargs/LICENSE | 21 + .../assets/node_modules/yargs/README.md | 204 ++ .../assets/node_modules/yargs/browser.d.ts | 5 + .../assets/node_modules/yargs/browser.mjs | 7 + .../node_modules/yargs/helpers/helpers.mjs | 10 + .../node_modules/yargs/helpers/index.js | 14 + .../node_modules/yargs/helpers/package.json | 3 + .../assets/node_modules/yargs/index.cjs | 53 + .../assets/node_modules/yargs/index.mjs | 8 + .../yargs/lib/platform-shims/browser.mjs | 95 + .../yargs/lib/platform-shims/esm.mjs | 73 + .../assets/node_modules/yargs/locales/be.json | 46 + .../assets/node_modules/yargs/locales/cs.json | 51 + .../assets/node_modules/yargs/locales/de.json | 46 + .../assets/node_modules/yargs/locales/en.json | 55 + .../assets/node_modules/yargs/locales/es.json | 46 + .../assets/node_modules/yargs/locales/fi.json | 49 + .../assets/node_modules/yargs/locales/fr.json | 53 + .../assets/node_modules/yargs/locales/hi.json | 49 + .../assets/node_modules/yargs/locales/hu.json | 46 + .../assets/node_modules/yargs/locales/id.json | 50 + .../assets/node_modules/yargs/locales/it.json | 46 + .../assets/node_modules/yargs/locales/ja.json | 51 + .../assets/node_modules/yargs/locales/ko.json | 49 + .../assets/node_modules/yargs/locales/nb.json | 44 + .../assets/node_modules/yargs/locales/nl.json | 49 + .../assets/node_modules/yargs/locales/nn.json | 44 + .../node_modules/yargs/locales/pirate.json | 13 + .../assets/node_modules/yargs/locales/pl.json | 49 + .../assets/node_modules/yargs/locales/pt.json | 45 + .../node_modules/yargs/locales/pt_BR.json | 48 + .../assets/node_modules/yargs/locales/ru.json | 51 + .../assets/node_modules/yargs/locales/th.json | 46 + .../assets/node_modules/yargs/locales/tr.json | 48 + .../node_modules/yargs/locales/uk_UA.json | 51 + .../assets/node_modules/yargs/locales/uz.json | 52 + .../node_modules/yargs/locales/zh_CN.json | 48 + .../node_modules/yargs/locales/zh_TW.json | 51 + .../assets/node_modules/yargs/package.json | 123 + @capacitor/assets/node_modules/yargs/yargs | 9 + .../assets/node_modules/yargs/yargs.mjs | 10 + @capacitor/assets/package.json | 105 + @capacitor/cli/LICENSE | 21 + @capacitor/cli/README.md | 15 + @capacitor/cli/assets/android-template.tar.gz | Bin 0 -> 235405 bytes .../capacitor-cordova-android-plugins.tar.gz | Bin 0 -> 927 bytes .../capacitor-cordova-ios-plugins.tar.gz | Bin 0 -> 432 bytes .../cli/assets/ios-pods-template.tar.gz | Bin 0 -> 155319 bytes @capacitor/cli/assets/ios-spm-template.tar.gz | Bin 0 -> 155078 bytes @capacitor/cli/dist/android/add.js | 52 + @capacitor/cli/dist/android/build.js | 106 + @capacitor/cli/dist/android/common.js | 97 + @capacitor/cli/dist/android/doctor.js | 163 ++ @capacitor/cli/dist/android/open.js | 28 + @capacitor/cli/dist/android/run.js | 42 + @capacitor/cli/dist/android/update.js | 323 +++ @capacitor/cli/dist/colors.js | 26 + @capacitor/cli/dist/common.js | 407 +++ @capacitor/cli/dist/config.js | 398 +++ @capacitor/cli/dist/cordova.js | 830 +++++++ @capacitor/cli/dist/declarations.d.ts | 592 +++++ @capacitor/cli/dist/declarations.js | 2 + @capacitor/cli/dist/definitions.js | 2 + @capacitor/cli/dist/errors.js | 27 + @capacitor/cli/dist/framework-configs.js | 109 + @capacitor/cli/dist/index.js | 224 ++ @capacitor/cli/dist/ios/add.js | 13 + @capacitor/cli/dist/ios/build.js | 70 + @capacitor/cli/dist/ios/common.js | 103 + @capacitor/cli/dist/ios/doctor.js | 49 + @capacitor/cli/dist/ios/open.js | 17 + @capacitor/cli/dist/ios/run.js | 53 + @capacitor/cli/dist/ios/update.js | 417 ++++ @capacitor/cli/dist/ipc.js | 61 + @capacitor/cli/dist/log.js | 41 + @capacitor/cli/dist/plugin.js | 186 ++ @capacitor/cli/dist/sysconfig.js | 35 + @capacitor/cli/dist/tasks/add.js | 122 + @capacitor/cli/dist/tasks/build.js | 62 + @capacitor/cli/dist/tasks/config.js | 31 + @capacitor/cli/dist/tasks/copy.js | 216 ++ @capacitor/cli/dist/tasks/create.js | 11 + @capacitor/cli/dist/tasks/doctor.js | 73 + @capacitor/cli/dist/tasks/init.js | 139 ++ @capacitor/cli/dist/tasks/list.js | 50 + @capacitor/cli/dist/tasks/migrate.js | 575 +++++ @capacitor/cli/dist/tasks/new-plugin.js | 11 + @capacitor/cli/dist/tasks/open.js | 62 + @capacitor/cli/dist/tasks/run.js | 114 + @capacitor/cli/dist/tasks/serve.js | 11 + @capacitor/cli/dist/tasks/sourcemaps.js | 40 + @capacitor/cli/dist/tasks/sync.js | 59 + @capacitor/cli/dist/tasks/telemetry.js | 40 + @capacitor/cli/dist/tasks/update.js | 74 + @capacitor/cli/dist/telemetry.js | 130 + @capacitor/cli/dist/util/cli.js | 25 + @capacitor/cli/dist/util/emoji.js | 13 + @capacitor/cli/dist/util/fn.js | 13 + @capacitor/cli/dist/util/fs.js | 24 + @capacitor/cli/dist/util/iosplugin.js | 66 + @capacitor/cli/dist/util/js.js | 21 + @capacitor/cli/dist/util/livereload.js | 151 ++ @capacitor/cli/dist/util/monorepotools.js | 110 + @capacitor/cli/dist/util/native-run.js | 53 + @capacitor/cli/dist/util/node.js | 54 + @capacitor/cli/dist/util/promise.js | 35 + @capacitor/cli/dist/util/spm.js | 73 + @capacitor/cli/dist/util/subprocess.js | 43 + @capacitor/cli/dist/util/template.js | 11 + @capacitor/cli/dist/util/term.js | 30 + @capacitor/cli/dist/util/uuid.js | 11 + @capacitor/cli/dist/util/xml.js | 57 + @capacitor/cli/dist/web/copy.js | 22 + @capacitor/cli/node_modules/.bin/rimraf | 1 + @capacitor/cli/node_modules/.bin/semver | 1 + .../brace-expansion/.github/FUNDING.yml | 2 + .../cli/node_modules/brace-expansion/LICENSE | 21 + .../node_modules/brace-expansion/README.md | 135 + .../cli/node_modules/brace-expansion/index.js | 203 ++ .../node_modules/brace-expansion/package.json | 46 + @capacitor/cli/node_modules/commander/LICENSE | 22 + .../cli/node_modules/commander/Readme.md | 1129 +++++++++ @capacitor/cli/node_modules/commander/esm.mjs | 16 + .../cli/node_modules/commander/index.js | 27 + .../node_modules/commander/lib/argument.js | 147 ++ .../cli/node_modules/commander/lib/command.js | 2179 +++++++++++++++++ .../cli/node_modules/commander/lib/error.js | 45 + .../cli/node_modules/commander/lib/help.js | 461 ++++ .../cli/node_modules/commander/lib/option.js | 326 +++ .../commander/lib/suggestSimilar.js | 100 + .../commander/package-support.json | 16 + .../cli/node_modules/commander/package.json | 80 + .../node_modules/commander/typings/index.d.ts | 891 +++++++ @capacitor/cli/node_modules/glob/LICENSE | 15 + @capacitor/cli/node_modules/glob/README.md | 1086 ++++++++ .../cli/node_modules/glob/dist/cjs/glob.d.ts | 333 +++ .../node_modules/glob/dist/cjs/glob.d.ts.map | 1 + .../cli/node_modules/glob/dist/cjs/glob.js | 229 ++ .../node_modules/glob/dist/cjs/glob.js.map | 1 + .../node_modules/glob/dist/cjs/has-magic.d.ts | 14 + .../glob/dist/cjs/has-magic.d.ts.map | 1 + .../node_modules/glob/dist/cjs/has-magic.js | 27 + .../glob/dist/cjs/has-magic.js.map | 1 + .../node_modules/glob/dist/cjs/ignore.d.ts | 20 + .../glob/dist/cjs/ignore.d.ts.map | 1 + .../cli/node_modules/glob/dist/cjs/ignore.js | 103 + .../node_modules/glob/dist/cjs/ignore.js.map | 1 + .../node_modules/glob/dist/cjs/index-cjs.d.ts | 75 + .../glob/dist/cjs/index-cjs.d.ts.map | 1 + .../node_modules/glob/dist/cjs/index-cjs.js | 7 + .../glob/dist/cjs/index-cjs.js.map | 1 + .../cli/node_modules/glob/dist/cjs/index.d.ts | 96 + .../node_modules/glob/dist/cjs/index.d.ts.map | 1 + .../cli/node_modules/glob/dist/cjs/index.js | 68 + .../node_modules/glob/dist/cjs/index.js.map | 1 + .../node_modules/glob/dist/cjs/package.json | 3 + .../node_modules/glob/dist/cjs/pattern.d.ts | 77 + .../glob/dist/cjs/pattern.d.ts.map | 1 + .../cli/node_modules/glob/dist/cjs/pattern.js | 219 ++ .../node_modules/glob/dist/cjs/pattern.js.map | 1 + .../node_modules/glob/dist/cjs/processor.d.ts | 59 + .../glob/dist/cjs/processor.d.ts.map | 1 + .../node_modules/glob/dist/cjs/processor.js | 309 +++ .../glob/dist/cjs/processor.js.map | 1 + .../node_modules/glob/dist/cjs/walker.d.ts | 95 + .../glob/dist/cjs/walker.d.ts.map | 1 + .../cli/node_modules/glob/dist/cjs/walker.js | 360 +++ .../node_modules/glob/dist/cjs/walker.js.map | 1 + .../cli/node_modules/glob/dist/mjs/glob.d.ts | 333 +++ .../node_modules/glob/dist/mjs/glob.d.ts.map | 1 + .../cli/node_modules/glob/dist/mjs/glob.js | 225 ++ .../node_modules/glob/dist/mjs/glob.js.map | 1 + .../node_modules/glob/dist/mjs/has-magic.d.ts | 14 + .../glob/dist/mjs/has-magic.d.ts.map | 1 + .../node_modules/glob/dist/mjs/has-magic.js | 23 + .../glob/dist/mjs/has-magic.js.map | 1 + .../node_modules/glob/dist/mjs/ignore.d.ts | 20 + .../glob/dist/mjs/ignore.d.ts.map | 1 + .../cli/node_modules/glob/dist/mjs/ignore.js | 99 + .../node_modules/glob/dist/mjs/ignore.js.map | 1 + .../cli/node_modules/glob/dist/mjs/index.d.ts | 96 + .../node_modules/glob/dist/mjs/index.d.ts.map | 1 + .../cli/node_modules/glob/dist/mjs/index.js | 55 + .../node_modules/glob/dist/mjs/index.js.map | 1 + .../node_modules/glob/dist/mjs/package.json | 3 + .../node_modules/glob/dist/mjs/pattern.d.ts | 77 + .../glob/dist/mjs/pattern.d.ts.map | 1 + .../cli/node_modules/glob/dist/mjs/pattern.js | 215 ++ .../node_modules/glob/dist/mjs/pattern.js.map | 1 + .../node_modules/glob/dist/mjs/processor.d.ts | 59 + .../glob/dist/mjs/processor.d.ts.map | 1 + .../node_modules/glob/dist/mjs/processor.js | 302 +++ .../glob/dist/mjs/processor.js.map | 1 + .../node_modules/glob/dist/mjs/walker.d.ts | 95 + .../glob/dist/mjs/walker.d.ts.map | 1 + .../cli/node_modules/glob/dist/mjs/walker.js | 351 +++ .../node_modules/glob/dist/mjs/walker.js.map | 1 + @capacitor/cli/node_modules/glob/package.json | 97 + @capacitor/cli/node_modules/minimatch/LICENSE | 15 + .../cli/node_modules/minimatch/README.md | 459 ++++ .../dist/cjs/assert-valid-pattern.d.ts | 2 + .../dist/cjs/assert-valid-pattern.d.ts.map | 1 + .../dist/cjs/assert-valid-pattern.js | 14 + .../dist/cjs/assert-valid-pattern.js.map | 1 + .../node_modules/minimatch/dist/cjs/ast.d.ts | 24 + .../minimatch/dist/cjs/ast.d.ts.map | 1 + .../node_modules/minimatch/dist/cjs/ast.js | 566 +++++ .../minimatch/dist/cjs/ast.js.map | 1 + .../minimatch/dist/cjs/brace-expressions.d.ts | 8 + .../dist/cjs/brace-expressions.d.ts.map | 1 + .../minimatch/dist/cjs/brace-expressions.js | 152 ++ .../dist/cjs/brace-expressions.js.map | 1 + .../minimatch/dist/cjs/escape.d.ts | 12 + .../minimatch/dist/cjs/escape.d.ts.map | 1 + .../node_modules/minimatch/dist/cjs/escape.js | 22 + .../minimatch/dist/cjs/escape.js.map | 1 + .../minimatch/dist/cjs/index-cjs.d.ts | 45 + .../minimatch/dist/cjs/index-cjs.d.ts.map | 1 + .../minimatch/dist/cjs/index-cjs.js | 7 + .../minimatch/dist/cjs/index-cjs.js.map | 1 + .../minimatch/dist/cjs/index.d.ts | 95 + .../minimatch/dist/cjs/index.d.ts.map | 1 + .../node_modules/minimatch/dist/cjs/index.js | 1016 ++++++++ .../minimatch/dist/cjs/index.js.map | 1 + .../minimatch/dist/cjs/package.json | 3 + .../minimatch/dist/cjs/unescape.d.ts | 17 + .../minimatch/dist/cjs/unescape.d.ts.map | 1 + .../minimatch/dist/cjs/unescape.js | 24 + .../minimatch/dist/cjs/unescape.js.map | 1 + .../dist/mjs/assert-valid-pattern.d.ts | 2 + .../dist/mjs/assert-valid-pattern.d.ts.map | 1 + .../dist/mjs/assert-valid-pattern.js | 10 + .../dist/mjs/assert-valid-pattern.js.map | 1 + .../node_modules/minimatch/dist/mjs/ast.d.ts | 24 + .../minimatch/dist/mjs/ast.d.ts.map | 1 + .../node_modules/minimatch/dist/mjs/ast.js | 562 +++++ .../minimatch/dist/mjs/ast.js.map | 1 + .../minimatch/dist/mjs/brace-expressions.d.ts | 8 + .../dist/mjs/brace-expressions.d.ts.map | 1 + .../minimatch/dist/mjs/brace-expressions.js | 148 ++ .../dist/mjs/brace-expressions.js.map | 1 + .../minimatch/dist/mjs/escape.d.ts | 12 + .../minimatch/dist/mjs/escape.d.ts.map | 1 + .../node_modules/minimatch/dist/mjs/escape.js | 18 + .../minimatch/dist/mjs/escape.js.map | 1 + .../minimatch/dist/mjs/index.d.ts | 95 + .../minimatch/dist/mjs/index.d.ts.map | 1 + .../node_modules/minimatch/dist/mjs/index.js | 1000 ++++++++ .../minimatch/dist/mjs/index.js.map | 1 + .../minimatch/dist/mjs/package.json | 3 + .../minimatch/dist/mjs/unescape.d.ts | 17 + .../minimatch/dist/mjs/unescape.d.ts.map | 1 + .../minimatch/dist/mjs/unescape.js | 20 + .../minimatch/dist/mjs/unescape.js.map | 1 + .../cli/node_modules/minimatch/package.json | 86 + @capacitor/cli/node_modules/minipass/LICENSE | 15 + .../cli/node_modules/minipass/README.md | 769 ++++++ .../cli/node_modules/minipass/index.d.ts | 150 ++ @capacitor/cli/node_modules/minipass/index.js | 702 ++++++ .../cli/node_modules/minipass/index.mjs | 702 ++++++ .../cli/node_modules/minipass/package.json | 79 + @capacitor/cli/node_modules/rimraf/LICENSE | 15 + @capacitor/cli/node_modules/rimraf/README.md | 214 ++ .../node_modules/rimraf/dist/cjs/package.json | 84 + .../node_modules/rimraf/dist/cjs/src/bin.d.ts | 8 + .../rimraf/dist/cjs/src/bin.d.ts.map | 1 + .../node_modules/rimraf/dist/cjs/src/bin.js | 260 ++ .../rimraf/dist/cjs/src/bin.js.map | 1 + .../rimraf/dist/cjs/src/default-tmp.d.ts | 3 + .../rimraf/dist/cjs/src/default-tmp.d.ts.map | 1 + .../rimraf/dist/cjs/src/default-tmp.js | 61 + .../rimraf/dist/cjs/src/default-tmp.js.map | 1 + .../rimraf/dist/cjs/src/fix-eperm.d.ts | 3 + .../rimraf/dist/cjs/src/fix-eperm.d.ts.map | 1 + .../rimraf/dist/cjs/src/fix-eperm.js | 58 + .../rimraf/dist/cjs/src/fix-eperm.js.map | 1 + .../node_modules/rimraf/dist/cjs/src/fs.d.ts | 17 + .../rimraf/dist/cjs/src/fs.d.ts.map | 1 + .../node_modules/rimraf/dist/cjs/src/fs.js | 46 + .../rimraf/dist/cjs/src/fs.js.map | 1 + .../rimraf/dist/cjs/src/ignore-enoent.d.ts | 3 + .../dist/cjs/src/ignore-enoent.d.ts.map | 1 + .../rimraf/dist/cjs/src/ignore-enoent.js | 21 + .../rimraf/dist/cjs/src/ignore-enoent.js.map | 1 + .../rimraf/dist/cjs/src/index-cjs.d.ts | 57 + .../rimraf/dist/cjs/src/index-cjs.d.ts.map | 1 + .../rimraf/dist/cjs/src/index-cjs.js | 7 + .../rimraf/dist/cjs/src/index-cjs.js.map | 1 + .../rimraf/dist/cjs/src/index.d.ts | 71 + .../rimraf/dist/cjs/src/index.d.ts.map | 1 + .../node_modules/rimraf/dist/cjs/src/index.js | 92 + .../rimraf/dist/cjs/src/index.js.map | 1 + .../rimraf/dist/cjs/src/opt-arg.d.ts | 17 + .../rimraf/dist/cjs/src/opt-arg.d.ts.map | 1 + .../rimraf/dist/cjs/src/opt-arg.js | 36 + .../rimraf/dist/cjs/src/opt-arg.js.map | 1 + .../rimraf/dist/cjs/src/path-arg.d.ts | 4 + .../rimraf/dist/cjs/src/path-arg.d.ts.map | 1 + .../rimraf/dist/cjs/src/path-arg.js | 54 + .../rimraf/dist/cjs/src/path-arg.js.map | 1 + .../rimraf/dist/cjs/src/platform.d.ts | 3 + .../rimraf/dist/cjs/src/platform.d.ts.map | 1 + .../rimraf/dist/cjs/src/platform.js | 4 + .../rimraf/dist/cjs/src/platform.js.map | 1 + .../rimraf/dist/cjs/src/readdir-or-error.d.ts | 5 + .../dist/cjs/src/readdir-or-error.d.ts.map | 1 + .../rimraf/dist/cjs/src/readdir-or-error.js | 19 + .../dist/cjs/src/readdir-or-error.js.map | 1 + .../rimraf/dist/cjs/src/retry-busy.d.ts | 8 + .../rimraf/dist/cjs/src/retry-busy.d.ts.map | 1 + .../rimraf/dist/cjs/src/retry-busy.js | 68 + .../rimraf/dist/cjs/src/retry-busy.js.map | 1 + .../rimraf/dist/cjs/src/rimraf-manual.d.ts | 3 + .../dist/cjs/src/rimraf-manual.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-manual.js | 12 + .../rimraf/dist/cjs/src/rimraf-manual.js.map | 1 + .../dist/cjs/src/rimraf-move-remove.d.ts | 4 + .../dist/cjs/src/rimraf-move-remove.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-move-remove.js | 192 ++ .../dist/cjs/src/rimraf-move-remove.js.map | 1 + .../rimraf/dist/cjs/src/rimraf-native.d.ts | 4 + .../dist/cjs/src/rimraf-native.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-native.js | 24 + .../rimraf/dist/cjs/src/rimraf-native.js.map | 1 + .../rimraf/dist/cjs/src/rimraf-posix.d.ts | 4 + .../rimraf/dist/cjs/src/rimraf-posix.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-posix.js | 123 + .../rimraf/dist/cjs/src/rimraf-posix.js.map | 1 + .../rimraf/dist/cjs/src/rimraf-windows.d.ts | 4 + .../dist/cjs/src/rimraf-windows.d.ts.map | 1 + .../rimraf/dist/cjs/src/rimraf-windows.js | 182 ++ .../rimraf/dist/cjs/src/rimraf-windows.js.map | 1 + .../rimraf/dist/cjs/src/use-native.d.ts | 4 + .../rimraf/dist/cjs/src/use-native.d.ts.map | 1 + .../rimraf/dist/cjs/src/use-native.js | 19 + .../rimraf/dist/cjs/src/use-native.js.map | 1 + .../rimraf/dist/mjs/default-tmp.d.ts | 3 + .../rimraf/dist/mjs/default-tmp.d.ts.map | 1 + .../rimraf/dist/mjs/default-tmp.js | 55 + .../rimraf/dist/mjs/default-tmp.js.map | 1 + .../rimraf/dist/mjs/fix-eperm.d.ts | 3 + .../rimraf/dist/mjs/fix-eperm.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/fix-eperm.js | 53 + .../rimraf/dist/mjs/fix-eperm.js.map | 1 + .../cli/node_modules/rimraf/dist/mjs/fs.d.ts | 17 + .../node_modules/rimraf/dist/mjs/fs.d.ts.map | 1 + .../cli/node_modules/rimraf/dist/mjs/fs.js | 31 + .../node_modules/rimraf/dist/mjs/fs.js.map | 1 + .../rimraf/dist/mjs/ignore-enoent.d.ts | 3 + .../rimraf/dist/mjs/ignore-enoent.d.ts.map | 1 + .../rimraf/dist/mjs/ignore-enoent.js | 16 + .../rimraf/dist/mjs/ignore-enoent.js.map | 1 + .../node_modules/rimraf/dist/mjs/index.d.ts | 71 + .../rimraf/dist/mjs/index.d.ts.map | 1 + .../cli/node_modules/rimraf/dist/mjs/index.js | 84 + .../node_modules/rimraf/dist/mjs/index.js.map | 1 + .../node_modules/rimraf/dist/mjs/opt-arg.d.ts | 17 + .../rimraf/dist/mjs/opt-arg.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/opt-arg.js | 31 + .../rimraf/dist/mjs/opt-arg.js.map | 1 + .../node_modules/rimraf/dist/mjs/package.json | 4 + .../rimraf/dist/mjs/path-arg.d.ts | 4 + .../rimraf/dist/mjs/path-arg.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/path-arg.js | 49 + .../rimraf/dist/mjs/path-arg.js.map | 1 + .../rimraf/dist/mjs/platform.d.ts | 3 + .../rimraf/dist/mjs/platform.d.ts.map | 1 + .../node_modules/rimraf/dist/mjs/platform.js | 2 + .../rimraf/dist/mjs/platform.js.map | 1 + .../rimraf/dist/mjs/readdir-or-error.d.ts | 5 + .../rimraf/dist/mjs/readdir-or-error.d.ts.map | 1 + .../rimraf/dist/mjs/readdir-or-error.js | 14 + .../rimraf/dist/mjs/readdir-or-error.js.map | 1 + .../rimraf/dist/mjs/retry-busy.d.ts | 8 + .../rimraf/dist/mjs/retry-busy.d.ts.map | 1 + .../rimraf/dist/mjs/retry-busy.js | 63 + .../rimraf/dist/mjs/retry-busy.js.map | 1 + .../rimraf/dist/mjs/rimraf-manual.d.ts | 3 + .../rimraf/dist/mjs/rimraf-manual.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-manual.js | 6 + .../rimraf/dist/mjs/rimraf-manual.js.map | 1 + .../rimraf/dist/mjs/rimraf-move-remove.d.ts | 4 + .../dist/mjs/rimraf-move-remove.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-move-remove.js | 187 ++ .../rimraf/dist/mjs/rimraf-move-remove.js.map | 1 + .../rimraf/dist/mjs/rimraf-native.d.ts | 4 + .../rimraf/dist/mjs/rimraf-native.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-native.js | 19 + .../rimraf/dist/mjs/rimraf-native.js.map | 1 + .../rimraf/dist/mjs/rimraf-posix.d.ts | 4 + .../rimraf/dist/mjs/rimraf-posix.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-posix.js | 118 + .../rimraf/dist/mjs/rimraf-posix.js.map | 1 + .../rimraf/dist/mjs/rimraf-windows.d.ts | 4 + .../rimraf/dist/mjs/rimraf-windows.d.ts.map | 1 + .../rimraf/dist/mjs/rimraf-windows.js | 177 ++ .../rimraf/dist/mjs/rimraf-windows.js.map | 1 + .../rimraf/dist/mjs/use-native.d.ts | 4 + .../rimraf/dist/mjs/use-native.d.ts.map | 1 + .../rimraf/dist/mjs/use-native.js | 13 + .../rimraf/dist/mjs/use-native.js.map | 1 + .../cli/node_modules/rimraf/package.json | 84 + @capacitor/cli/node_modules/semver/LICENSE | 15 + @capacitor/cli/node_modules/semver/README.md | 654 +++++ .../node_modules/semver/classes/comparator.js | 141 ++ .../cli/node_modules/semver/classes/index.js | 5 + .../cli/node_modules/semver/classes/range.js | 554 +++++ .../cli/node_modules/semver/classes/semver.js | 302 +++ .../node_modules/semver/functions/clean.js | 6 + .../cli/node_modules/semver/functions/cmp.js | 52 + .../node_modules/semver/functions/coerce.js | 60 + .../semver/functions/compare-build.js | 7 + .../semver/functions/compare-loose.js | 3 + .../node_modules/semver/functions/compare.js | 5 + .../cli/node_modules/semver/functions/diff.js | 65 + .../cli/node_modules/semver/functions/eq.js | 3 + .../cli/node_modules/semver/functions/gt.js | 3 + .../cli/node_modules/semver/functions/gte.js | 3 + .../cli/node_modules/semver/functions/inc.js | 19 + .../cli/node_modules/semver/functions/lt.js | 3 + .../cli/node_modules/semver/functions/lte.js | 3 + .../node_modules/semver/functions/major.js | 3 + .../node_modules/semver/functions/minor.js | 3 + .../cli/node_modules/semver/functions/neq.js | 3 + .../node_modules/semver/functions/parse.js | 16 + .../node_modules/semver/functions/patch.js | 3 + .../semver/functions/prerelease.js | 6 + .../node_modules/semver/functions/rcompare.js | 3 + .../node_modules/semver/functions/rsort.js | 3 + .../semver/functions/satisfies.js | 10 + .../cli/node_modules/semver/functions/sort.js | 3 + .../node_modules/semver/functions/valid.js | 6 + @capacitor/cli/node_modules/semver/index.js | 89 + .../node_modules/semver/internal/constants.js | 35 + .../cli/node_modules/semver/internal/debug.js | 9 + .../semver/internal/identifiers.js | 23 + .../node_modules/semver/internal/lrucache.js | 40 + .../semver/internal/parse-options.js | 15 + .../cli/node_modules/semver/internal/re.js | 217 ++ .../cli/node_modules/semver/package.json | 77 + @capacitor/cli/node_modules/semver/preload.js | 2 + @capacitor/cli/node_modules/semver/range.bnf | 16 + .../cli/node_modules/semver/ranges/gtr.js | 4 + .../node_modules/semver/ranges/intersects.js | 7 + .../cli/node_modules/semver/ranges/ltr.js | 4 + .../semver/ranges/max-satisfying.js | 25 + .../semver/ranges/min-satisfying.js | 24 + .../node_modules/semver/ranges/min-version.js | 61 + .../cli/node_modules/semver/ranges/outside.js | 80 + .../node_modules/semver/ranges/simplify.js | 47 + .../cli/node_modules/semver/ranges/subset.js | 247 ++ .../semver/ranges/to-comparators.js | 8 + .../cli/node_modules/semver/ranges/valid.js | 11 + @capacitor/cli/node_modules/xml2js/LICENSE | 19 + @capacitor/cli/node_modules/xml2js/README.md | 507 ++++ @capacitor/cli/node_modules/xml2js/lib/bom.js | 12 + .../cli/node_modules/xml2js/lib/builder.js | 127 + .../cli/node_modules/xml2js/lib/defaults.js | 72 + .../cli/node_modules/xml2js/lib/parser.js | 385 +++ .../cli/node_modules/xml2js/lib/processors.js | 34 + .../cli/node_modules/xml2js/lib/xml2js.js | 39 + .../cli/node_modules/xml2js/package.json | 93 + @capacitor/cli/package.json | 89 + @capacitor/core/LICENSE | 21 + @capacitor/core/README.md | 3 + @capacitor/core/cookies.md | 250 ++ @capacitor/core/cordova.js | 1689 +++++++++++++ @capacitor/core/dist/capacitor.js | 3 + @capacitor/core/dist/capacitor.js.map | 1 + @capacitor/core/dist/index.cjs.js | 717 ++++++ @capacitor/core/dist/index.cjs.js.map | 1 + @capacitor/core/dist/index.js | 701 ++++++ @capacitor/core/dist/index.js.map | 1 + @capacitor/core/http.md | 683 ++++++ @capacitor/core/package.json | 61 + @capacitor/core/types/core-plugins.d.ts | 238 ++ .../core/types/definitions-internal.d.ts | 175 ++ @capacitor/core/types/definitions.d.ts | 96 + @capacitor/core/types/global.d.ts | 21 + @capacitor/core/types/index.d.ts | 9 + .../core/types/legacy/legacy-definitions.d.ts | 37 + .../types/legacy/legacy-web-plugin-merge.d.ts | 3 + @capacitor/core/types/platforms.d.ts | 28 + @capacitor/core/types/runtime.d.ts | 9 + @capacitor/core/types/util.d.ts | 28 + @capacitor/core/types/web-plugin.d.ts | 52 + app/build.gradle | 2 + 1260 files changed, 111297 insertions(+) create mode 100644 @capacitor/android/LICENSE create mode 100644 @capacitor/android/capacitor/build.gradle create mode 100644 @capacitor/android/capacitor/lint-baseline.xml create mode 100644 @capacitor/android/capacitor/lint.xml create mode 100644 @capacitor/android/capacitor/proguard-rules.pro create mode 100644 @capacitor/android/capacitor/src/main/AndroidManifest.xml create mode 100644 @capacitor/android/capacitor/src/main/assets/native-bridge.js create mode 100755 @capacitor/android/capacitor/src/main/java/com/getcapacitor/AndroidProtocolHandler.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/App.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/AppUUID.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/Bridge.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeFragment.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeWebViewClient.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/CapConfig.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/CapacitorWebView.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/InvalidPluginException.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/InvalidPluginMethodException.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/JSArray.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/JSExport.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/JSExportException.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/JSInjector.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/JSObject.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/JSValue.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/Logger.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/MessageHandler.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/NativePlugin.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PermissionState.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/Plugin.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginCall.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginConfig.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginHandle.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginInvocationException.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginLoadException.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginManager.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginMethod.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginMethodHandle.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginResult.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/ProcessedRoute.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/RouteProcessor.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/ServerPath.java create mode 100755 @capacitor/android/capacitor/src/main/java/com/getcapacitor/UriMatcher.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/WebViewListener.java create mode 100755 @capacitor/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/ActivityCallback.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/CapacitorPlugin.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/Permission.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/PermissionCallback.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/CapacitorCordovaCookieManager.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaInterfaceImpl.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookies.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/WebView.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/AssetUtil.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/ICapacitorHttpUrlConnection.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/MimeType.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/util/HostMask.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/util/InternalUtils.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/util/JSONUtils.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/util/PermissionHelper.java create mode 100644 @capacitor/android/capacitor/src/main/java/com/getcapacitor/util/WebColor.java create mode 100644 @capacitor/android/capacitor/src/main/res/layout/bridge_layout_main.xml create mode 100644 @capacitor/android/capacitor/src/main/res/layout/fragment_bridge.xml create mode 100644 @capacitor/android/capacitor/src/main/res/layout/no_webview.xml create mode 100644 @capacitor/android/capacitor/src/main/res/values/attrs.xml create mode 100644 @capacitor/android/capacitor/src/main/res/values/colors.xml create mode 100644 @capacitor/android/capacitor/src/main/res/values/strings.xml create mode 100644 @capacitor/android/capacitor/src/main/res/values/styles.xml create mode 100644 @capacitor/android/package.json create mode 100644 @capacitor/assets/LICENSE create mode 100644 @capacitor/assets/README.md create mode 100644 @capacitor/assets/dist/asset-generator.d.ts create mode 100644 @capacitor/assets/dist/asset-generator.js create mode 100644 @capacitor/assets/dist/colors.d.ts create mode 100644 @capacitor/assets/dist/colors.js create mode 100644 @capacitor/assets/dist/ctx.d.ts create mode 100644 @capacitor/assets/dist/ctx.js create mode 100644 @capacitor/assets/dist/definitions.d.ts create mode 100644 @capacitor/assets/dist/definitions.js create mode 100644 @capacitor/assets/dist/error.d.ts create mode 100644 @capacitor/assets/dist/error.js create mode 100644 @capacitor/assets/dist/index.d.ts create mode 100644 @capacitor/assets/dist/index.js create mode 100644 @capacitor/assets/dist/input-asset.d.ts create mode 100644 @capacitor/assets/dist/input-asset.js create mode 100644 @capacitor/assets/dist/output-asset.d.ts create mode 100644 @capacitor/assets/dist/output-asset.js create mode 100644 @capacitor/assets/dist/platforms/android/assets.d.ts create mode 100644 @capacitor/assets/dist/platforms/android/assets.js create mode 100644 @capacitor/assets/dist/platforms/android/index.d.ts create mode 100644 @capacitor/assets/dist/platforms/android/index.js create mode 100644 @capacitor/assets/dist/platforms/ios/assets.d.ts create mode 100644 @capacitor/assets/dist/platforms/ios/assets.js create mode 100644 @capacitor/assets/dist/platforms/ios/index.d.ts create mode 100644 @capacitor/assets/dist/platforms/ios/index.js create mode 100644 @capacitor/assets/dist/platforms/pwa/assets.d.ts create mode 100644 @capacitor/assets/dist/platforms/pwa/assets.js create mode 100644 @capacitor/assets/dist/platforms/pwa/index.d.ts create mode 100644 @capacitor/assets/dist/platforms/pwa/index.js create mode 100644 @capacitor/assets/dist/project.d.ts create mode 100644 @capacitor/assets/dist/project.js create mode 100644 @capacitor/assets/dist/tasks/generate.d.ts create mode 100644 @capacitor/assets/dist/tasks/generate.js create mode 100644 @capacitor/assets/dist/util/cli.d.ts create mode 100644 @capacitor/assets/dist/util/cli.js create mode 100644 @capacitor/assets/dist/util/log.d.ts create mode 100644 @capacitor/assets/dist/util/log.js create mode 100644 @capacitor/assets/dist/util/subprocess.d.ts create mode 100644 @capacitor/assets/dist/util/subprocess.js create mode 100644 @capacitor/assets/dist/util/term.d.ts create mode 100644 @capacitor/assets/dist/util/term.js create mode 120000 @capacitor/assets/node_modules/.bin/cap create mode 120000 @capacitor/assets/node_modules/.bin/capacitor create mode 120000 @capacitor/assets/node_modules/.bin/rimraf create mode 120000 @capacitor/assets/node_modules/.bin/semver create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/LICENSE create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/README.md create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/assets/android-template.tar.gz create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/assets/capacitor-cordova-android-plugins.tar.gz create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/assets/capacitor-cordova-ios-plugins.tar.gz create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/assets/ios-template.tar.gz create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/android/add.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/android/build.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/android/common.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/android/doctor.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/android/open.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/android/run.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/android/update.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/colors.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/common.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/config.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/cordova.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/declarations.d.ts create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/declarations.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/definitions.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/errors.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/framework-configs.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/index.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/ios/add.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/ios/build.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/ios/common.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/ios/doctor.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/ios/open.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/ios/run.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/ios/update.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/ipc.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/log.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/plugin.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/sysconfig.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/add.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/build.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/config.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/copy.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/create.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/doctor.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/init.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/list.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/migrate.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/new-plugin.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/open.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/run.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/serve.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/sourcemaps.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/sync.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/telemetry.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/tasks/update.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/telemetry.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/cli.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/emoji.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/fn.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/fs.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/js.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/livereload.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/monorepotools.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/native-run.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/node.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/promise.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/subprocess.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/template.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/term.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/uuid.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/util/xml.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/dist/web/copy.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/LICENSE create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/Readme.md create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/esm.mjs create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/index.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/lib/argument.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/lib/command.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/lib/error.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/lib/help.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/lib/option.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/lib/suggestSimilar.js create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/package-support.json create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/package.json create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/typings/index.d.ts create mode 100644 @capacitor/assets/node_modules/@capacitor/cli/package.json create mode 100644 @capacitor/assets/node_modules/@ionic/utils-array/CHANGELOG.md create mode 100644 @capacitor/assets/node_modules/@ionic/utils-array/LICENSE create mode 100644 @capacitor/assets/node_modules/@ionic/utils-array/README.md create mode 100644 @capacitor/assets/node_modules/@ionic/utils-array/dist/index.d.ts create mode 100644 @capacitor/assets/node_modules/@ionic/utils-array/dist/index.js create mode 100644 @capacitor/assets/node_modules/@ionic/utils-array/package.json create mode 100644 @capacitor/assets/node_modules/brace-expansion/.github/FUNDING.yml create mode 100644 @capacitor/assets/node_modules/brace-expansion/LICENSE create mode 100644 @capacitor/assets/node_modules/brace-expansion/README.md create mode 100644 @capacitor/assets/node_modules/brace-expansion/index.js create mode 100644 @capacitor/assets/node_modules/brace-expansion/package.json create mode 100644 @capacitor/assets/node_modules/cliui/CHANGELOG.md create mode 100644 @capacitor/assets/node_modules/cliui/LICENSE.txt create mode 100644 @capacitor/assets/node_modules/cliui/README.md create mode 100644 @capacitor/assets/node_modules/cliui/index.mjs create mode 100644 @capacitor/assets/node_modules/cliui/package.json create mode 100644 @capacitor/assets/node_modules/css-select/LICENSE create mode 100644 @capacitor/assets/node_modules/css-select/README.md create mode 100644 @capacitor/assets/node_modules/css-select/lib/attributes.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/attributes.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/attributes.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/compile.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/compile.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/compile.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/general.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/general.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/general.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/index.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/index.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/procedure.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/procedure.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/procedure.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/aliases.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/aliases.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/aliases.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/filters.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/filters.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/filters.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/index.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/index.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/pseudos.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/pseudos.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/pseudos.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/subselects.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/subselects.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/pseudo-selectors/subselects.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/sort.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/sort.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/sort.js create mode 100644 @capacitor/assets/node_modules/css-select/lib/types.d.ts create mode 100644 @capacitor/assets/node_modules/css-select/lib/types.d.ts.map create mode 100644 @capacitor/assets/node_modules/css-select/lib/types.js create mode 100644 @capacitor/assets/node_modules/css-select/package.json create mode 100644 @capacitor/assets/node_modules/dom-serializer/LICENSE create mode 100644 @capacitor/assets/node_modules/dom-serializer/README.md create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/esm/foreignNames.d.ts create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/esm/foreignNames.d.ts.map create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/esm/foreignNames.js create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/esm/index.d.ts create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/esm/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/esm/index.js create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/esm/package.json create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/foreignNames.d.ts create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/foreignNames.d.ts.map create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/foreignNames.js create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/index.d.ts create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/dom-serializer/lib/index.js create mode 100644 @capacitor/assets/node_modules/dom-serializer/package.json create mode 100644 @capacitor/assets/node_modules/domelementtype/LICENSE create mode 100644 @capacitor/assets/node_modules/domelementtype/lib/esm/index.d.ts create mode 100644 @capacitor/assets/node_modules/domelementtype/lib/esm/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/domelementtype/lib/esm/index.js create mode 100644 @capacitor/assets/node_modules/domelementtype/lib/esm/package.json create mode 100644 @capacitor/assets/node_modules/domelementtype/lib/index.d.ts create mode 100644 @capacitor/assets/node_modules/domelementtype/lib/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/domelementtype/lib/index.js create mode 100644 @capacitor/assets/node_modules/domelementtype/package.json create mode 100644 @capacitor/assets/node_modules/domelementtype/readme.md create mode 100644 @capacitor/assets/node_modules/domhandler/LICENSE create mode 100644 @capacitor/assets/node_modules/domhandler/lib/index.d.ts create mode 100644 @capacitor/assets/node_modules/domhandler/lib/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/domhandler/lib/index.js create mode 100644 @capacitor/assets/node_modules/domhandler/lib/node.d.ts create mode 100644 @capacitor/assets/node_modules/domhandler/lib/node.d.ts.map create mode 100644 @capacitor/assets/node_modules/domhandler/lib/node.js create mode 100644 @capacitor/assets/node_modules/domhandler/package.json create mode 100644 @capacitor/assets/node_modules/domhandler/readme.md create mode 100644 @capacitor/assets/node_modules/domutils/LICENSE create mode 100644 @capacitor/assets/node_modules/domutils/lib/feeds.d.ts create mode 100644 @capacitor/assets/node_modules/domutils/lib/feeds.d.ts.map create mode 100644 @capacitor/assets/node_modules/domutils/lib/feeds.js create mode 100644 @capacitor/assets/node_modules/domutils/lib/helpers.d.ts create mode 100644 @capacitor/assets/node_modules/domutils/lib/helpers.d.ts.map create mode 100644 @capacitor/assets/node_modules/domutils/lib/helpers.js create mode 100644 @capacitor/assets/node_modules/domutils/lib/index.d.ts create mode 100644 @capacitor/assets/node_modules/domutils/lib/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/domutils/lib/index.js create mode 100644 @capacitor/assets/node_modules/domutils/lib/legacy.d.ts create mode 100644 @capacitor/assets/node_modules/domutils/lib/legacy.d.ts.map create mode 100644 @capacitor/assets/node_modules/domutils/lib/legacy.js create mode 100644 @capacitor/assets/node_modules/domutils/lib/manipulation.d.ts create mode 100644 @capacitor/assets/node_modules/domutils/lib/manipulation.d.ts.map create mode 100644 @capacitor/assets/node_modules/domutils/lib/manipulation.js create mode 100644 @capacitor/assets/node_modules/domutils/lib/querying.d.ts create mode 100644 @capacitor/assets/node_modules/domutils/lib/querying.d.ts.map create mode 100644 @capacitor/assets/node_modules/domutils/lib/querying.js create mode 100644 @capacitor/assets/node_modules/domutils/lib/stringify.d.ts create mode 100644 @capacitor/assets/node_modules/domutils/lib/stringify.d.ts.map create mode 100644 @capacitor/assets/node_modules/domutils/lib/stringify.js create mode 100644 @capacitor/assets/node_modules/domutils/lib/traversal.d.ts create mode 100644 @capacitor/assets/node_modules/domutils/lib/traversal.d.ts.map create mode 100644 @capacitor/assets/node_modules/domutils/lib/traversal.js create mode 100644 @capacitor/assets/node_modules/domutils/package.json create mode 100644 @capacitor/assets/node_modules/domutils/readme.md create mode 100644 @capacitor/assets/node_modules/entities/LICENSE create mode 100644 @capacitor/assets/node_modules/entities/lib/decode.d.ts create mode 100644 @capacitor/assets/node_modules/entities/lib/decode.d.ts.map create mode 100644 @capacitor/assets/node_modules/entities/lib/decode.js create mode 100644 @capacitor/assets/node_modules/entities/lib/decode_codepoint.d.ts create mode 100644 @capacitor/assets/node_modules/entities/lib/decode_codepoint.d.ts.map create mode 100644 @capacitor/assets/node_modules/entities/lib/decode_codepoint.js create mode 100644 @capacitor/assets/node_modules/entities/lib/encode.d.ts create mode 100644 @capacitor/assets/node_modules/entities/lib/encode.d.ts.map create mode 100644 @capacitor/assets/node_modules/entities/lib/encode.js create mode 100644 @capacitor/assets/node_modules/entities/lib/index.d.ts create mode 100644 @capacitor/assets/node_modules/entities/lib/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/entities/lib/index.js create mode 100644 @capacitor/assets/node_modules/entities/lib/maps/decode.json create mode 100644 @capacitor/assets/node_modules/entities/lib/maps/entities.json create mode 100644 @capacitor/assets/node_modules/entities/lib/maps/legacy.json create mode 100644 @capacitor/assets/node_modules/entities/lib/maps/xml.json create mode 100644 @capacitor/assets/node_modules/entities/package.json create mode 100644 @capacitor/assets/node_modules/entities/readme.md create mode 100644 @capacitor/assets/node_modules/fs-extra/LICENSE create mode 100644 @capacitor/assets/node_modules/fs-extra/README.md create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/copy/copy-sync.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/copy/copy.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/copy/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/empty/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/ensure/file.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/ensure/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/ensure/link.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/ensure/symlink-paths.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/ensure/symlink-type.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/ensure/symlink.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/fs/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/json/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/json/jsonfile.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/json/output-json-sync.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/json/output-json.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/mkdirs/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/mkdirs/make-dir.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/mkdirs/utils.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/move/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/move/move-sync.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/move/move.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/output-file/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/path-exists/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/remove/index.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/remove/rimraf.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/util/stat.js create mode 100644 @capacitor/assets/node_modules/fs-extra/lib/util/utimes.js create mode 100644 @capacitor/assets/node_modules/fs-extra/package.json create mode 100644 @capacitor/assets/node_modules/glob/LICENSE create mode 100644 @capacitor/assets/node_modules/glob/README.md create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/glob.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/glob.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/glob.js create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/glob.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/has-magic.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/has-magic.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/has-magic.js create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/has-magic.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/ignore.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/ignore.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/ignore.js create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/ignore.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/index-cjs.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/index-cjs.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/index-cjs.js create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/index-cjs.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/index.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/index.js create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/index.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/package.json create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/pattern.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/pattern.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/pattern.js create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/pattern.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/processor.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/processor.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/processor.js create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/processor.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/walker.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/walker.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/walker.js create mode 100644 @capacitor/assets/node_modules/glob/dist/cjs/walker.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/glob.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/glob.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/glob.js create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/glob.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/has-magic.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/has-magic.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/has-magic.js create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/has-magic.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/ignore.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/ignore.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/ignore.js create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/ignore.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/index.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/index.js create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/index.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/package.json create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/pattern.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/pattern.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/pattern.js create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/pattern.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/processor.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/processor.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/processor.js create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/processor.js.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/walker.d.ts create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/walker.d.ts.map create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/walker.js create mode 100644 @capacitor/assets/node_modules/glob/dist/mjs/walker.js.map create mode 100644 @capacitor/assets/node_modules/glob/package.json create mode 100644 @capacitor/assets/node_modules/minimatch/LICENSE create mode 100644 @capacitor/assets/node_modules/minimatch/README.md create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/assert-valid-pattern.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/assert-valid-pattern.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/assert-valid-pattern.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/assert-valid-pattern.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/ast.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/ast.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/ast.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/ast.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/brace-expressions.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/brace-expressions.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/brace-expressions.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/brace-expressions.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/escape.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/escape.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/escape.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/escape.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/index-cjs.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/index-cjs.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/index-cjs.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/index-cjs.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/index.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/index.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/index.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/package.json create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/unescape.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/unescape.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/unescape.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/cjs/unescape.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/ast.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/ast.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/ast.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/ast.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/escape.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/escape.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/escape.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/escape.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/index.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/index.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/index.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/package.json create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/unescape.d.ts create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/unescape.d.ts.map create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/unescape.js create mode 100644 @capacitor/assets/node_modules/minimatch/dist/mjs/unescape.js.map create mode 100644 @capacitor/assets/node_modules/minimatch/package.json create mode 100644 @capacitor/assets/node_modules/minipass/LICENSE create mode 100644 @capacitor/assets/node_modules/minipass/README.md create mode 100644 @capacitor/assets/node_modules/minipass/index.d.ts create mode 100644 @capacitor/assets/node_modules/minipass/index.js create mode 100644 @capacitor/assets/node_modules/minipass/index.mjs create mode 100644 @capacitor/assets/node_modules/minipass/package.json create mode 100644 @capacitor/assets/node_modules/node-fetch/LICENSE.md create mode 100644 @capacitor/assets/node_modules/node-fetch/README.md create mode 100644 @capacitor/assets/node_modules/node-fetch/browser.js create mode 100644 @capacitor/assets/node_modules/node-fetch/lib/index.es.js create mode 100644 @capacitor/assets/node_modules/node-fetch/lib/index.js create mode 100644 @capacitor/assets/node_modules/node-fetch/lib/index.mjs create mode 100644 @capacitor/assets/node_modules/node-fetch/package.json create mode 100755 @capacitor/assets/node_modules/node-html-parser/CHANGELOG.md create mode 100644 @capacitor/assets/node_modules/node-html-parser/LICENSE create mode 100644 @capacitor/assets/node_modules/node-html-parser/README.md create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/back.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/back.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/index.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/index.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/main.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/matcher.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/matcher.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/comment.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/comment.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/html.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/html.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/node.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/node.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/text.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/text.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/type.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/nodes/type.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/parse.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/parse.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/valid.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/valid.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/void-tag.d.ts create mode 100644 @capacitor/assets/node_modules/node-html-parser/dist/void-tag.js create mode 100644 @capacitor/assets/node_modules/node-html-parser/package.json create mode 100644 @capacitor/assets/node_modules/rimraf/LICENSE create mode 100644 @capacitor/assets/node_modules/rimraf/README.md create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/package.json create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.d.ts.map create mode 100755 @capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/index.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/index.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/index.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/fs.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/fs.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/fs.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/fs.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/index.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/index.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/index.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/index.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/package.json create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/platform.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/platform.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/platform.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/platform.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/use-native.d.ts create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/use-native.d.ts.map create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/use-native.js create mode 100644 @capacitor/assets/node_modules/rimraf/dist/mjs/use-native.js.map create mode 100644 @capacitor/assets/node_modules/rimraf/package.json create mode 100644 @capacitor/assets/node_modules/semver/LICENSE create mode 100644 @capacitor/assets/node_modules/semver/README.md create mode 100644 @capacitor/assets/node_modules/semver/classes/comparator.js create mode 100644 @capacitor/assets/node_modules/semver/classes/index.js create mode 100644 @capacitor/assets/node_modules/semver/classes/range.js create mode 100644 @capacitor/assets/node_modules/semver/classes/semver.js create mode 100644 @capacitor/assets/node_modules/semver/functions/clean.js create mode 100644 @capacitor/assets/node_modules/semver/functions/cmp.js create mode 100644 @capacitor/assets/node_modules/semver/functions/coerce.js create mode 100644 @capacitor/assets/node_modules/semver/functions/compare-build.js create mode 100644 @capacitor/assets/node_modules/semver/functions/compare-loose.js create mode 100644 @capacitor/assets/node_modules/semver/functions/compare.js create mode 100644 @capacitor/assets/node_modules/semver/functions/diff.js create mode 100644 @capacitor/assets/node_modules/semver/functions/eq.js create mode 100644 @capacitor/assets/node_modules/semver/functions/gt.js create mode 100644 @capacitor/assets/node_modules/semver/functions/gte.js create mode 100644 @capacitor/assets/node_modules/semver/functions/inc.js create mode 100644 @capacitor/assets/node_modules/semver/functions/lt.js create mode 100644 @capacitor/assets/node_modules/semver/functions/lte.js create mode 100644 @capacitor/assets/node_modules/semver/functions/major.js create mode 100644 @capacitor/assets/node_modules/semver/functions/minor.js create mode 100644 @capacitor/assets/node_modules/semver/functions/neq.js create mode 100644 @capacitor/assets/node_modules/semver/functions/parse.js create mode 100644 @capacitor/assets/node_modules/semver/functions/patch.js create mode 100644 @capacitor/assets/node_modules/semver/functions/prerelease.js create mode 100644 @capacitor/assets/node_modules/semver/functions/rcompare.js create mode 100644 @capacitor/assets/node_modules/semver/functions/rsort.js create mode 100644 @capacitor/assets/node_modules/semver/functions/satisfies.js create mode 100644 @capacitor/assets/node_modules/semver/functions/sort.js create mode 100644 @capacitor/assets/node_modules/semver/functions/valid.js create mode 100644 @capacitor/assets/node_modules/semver/index.js create mode 100644 @capacitor/assets/node_modules/semver/internal/constants.js create mode 100644 @capacitor/assets/node_modules/semver/internal/debug.js create mode 100644 @capacitor/assets/node_modules/semver/internal/identifiers.js create mode 100644 @capacitor/assets/node_modules/semver/internal/lrucache.js create mode 100644 @capacitor/assets/node_modules/semver/internal/parse-options.js create mode 100644 @capacitor/assets/node_modules/semver/internal/re.js create mode 100644 @capacitor/assets/node_modules/semver/package.json create mode 100644 @capacitor/assets/node_modules/semver/preload.js create mode 100644 @capacitor/assets/node_modules/semver/range.bnf create mode 100644 @capacitor/assets/node_modules/semver/ranges/gtr.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/intersects.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/ltr.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/max-satisfying.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/min-satisfying.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/min-version.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/outside.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/simplify.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/subset.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/to-comparators.js create mode 100644 @capacitor/assets/node_modules/semver/ranges/valid.js create mode 100644 @capacitor/assets/node_modules/tr46/.npmignore create mode 100644 @capacitor/assets/node_modules/tr46/index.js create mode 100644 @capacitor/assets/node_modules/tr46/lib/.gitkeep create mode 100644 @capacitor/assets/node_modules/tr46/lib/mappingTable.json create mode 100644 @capacitor/assets/node_modules/tr46/package.json create mode 100644 @capacitor/assets/node_modules/tslib/CopyrightNotice.txt create mode 100644 @capacitor/assets/node_modules/tslib/LICENSE.txt create mode 100644 @capacitor/assets/node_modules/tslib/README.md create mode 100644 @capacitor/assets/node_modules/tslib/SECURITY.md create mode 100644 @capacitor/assets/node_modules/tslib/modules/index.d.ts create mode 100644 @capacitor/assets/node_modules/tslib/modules/index.js create mode 100644 @capacitor/assets/node_modules/tslib/modules/package.json create mode 100644 @capacitor/assets/node_modules/tslib/package.json create mode 100644 @capacitor/assets/node_modules/tslib/tslib.d.ts create mode 100644 @capacitor/assets/node_modules/tslib/tslib.es6.html create mode 100644 @capacitor/assets/node_modules/tslib/tslib.es6.js create mode 100644 @capacitor/assets/node_modules/tslib/tslib.es6.mjs create mode 100644 @capacitor/assets/node_modules/tslib/tslib.html create mode 100644 @capacitor/assets/node_modules/tslib/tslib.js create mode 100644 @capacitor/assets/node_modules/universalify/LICENSE create mode 100644 @capacitor/assets/node_modules/universalify/README.md create mode 100644 @capacitor/assets/node_modules/universalify/index.js create mode 100644 @capacitor/assets/node_modules/universalify/package.json create mode 100644 @capacitor/assets/node_modules/webidl-conversions/LICENSE.md create mode 100644 @capacitor/assets/node_modules/webidl-conversions/README.md create mode 100644 @capacitor/assets/node_modules/webidl-conversions/lib/index.js create mode 100644 @capacitor/assets/node_modules/webidl-conversions/package.json create mode 100644 @capacitor/assets/node_modules/whatwg-url/LICENSE.txt create mode 100644 @capacitor/assets/node_modules/whatwg-url/README.md create mode 100644 @capacitor/assets/node_modules/whatwg-url/lib/URL-impl.js create mode 100644 @capacitor/assets/node_modules/whatwg-url/lib/URL.js create mode 100644 @capacitor/assets/node_modules/whatwg-url/lib/public-api.js create mode 100644 @capacitor/assets/node_modules/whatwg-url/lib/url-state-machine.js create mode 100644 @capacitor/assets/node_modules/whatwg-url/lib/utils.js create mode 100644 @capacitor/assets/node_modules/whatwg-url/package.json create mode 100644 @capacitor/assets/node_modules/xml2js/LICENSE create mode 100644 @capacitor/assets/node_modules/xml2js/README.md create mode 100644 @capacitor/assets/node_modules/xml2js/lib/bom.js create mode 100644 @capacitor/assets/node_modules/xml2js/lib/builder.js create mode 100644 @capacitor/assets/node_modules/xml2js/lib/defaults.js create mode 100644 @capacitor/assets/node_modules/xml2js/lib/parser.js create mode 100644 @capacitor/assets/node_modules/xml2js/lib/processors.js create mode 100644 @capacitor/assets/node_modules/xml2js/lib/xml2js.js create mode 100644 @capacitor/assets/node_modules/xml2js/package.json create mode 100644 @capacitor/assets/node_modules/yargs-parser/CHANGELOG.md create mode 100644 @capacitor/assets/node_modules/yargs-parser/LICENSE.txt create mode 100644 @capacitor/assets/node_modules/yargs-parser/README.md create mode 100644 @capacitor/assets/node_modules/yargs-parser/browser.js create mode 100644 @capacitor/assets/node_modules/yargs-parser/package.json create mode 100644 @capacitor/assets/node_modules/yargs/LICENSE create mode 100644 @capacitor/assets/node_modules/yargs/README.md create mode 100644 @capacitor/assets/node_modules/yargs/browser.d.ts create mode 100644 @capacitor/assets/node_modules/yargs/browser.mjs create mode 100644 @capacitor/assets/node_modules/yargs/helpers/helpers.mjs create mode 100644 @capacitor/assets/node_modules/yargs/helpers/index.js create mode 100644 @capacitor/assets/node_modules/yargs/helpers/package.json create mode 100644 @capacitor/assets/node_modules/yargs/index.cjs create mode 100644 @capacitor/assets/node_modules/yargs/index.mjs create mode 100644 @capacitor/assets/node_modules/yargs/lib/platform-shims/browser.mjs create mode 100644 @capacitor/assets/node_modules/yargs/lib/platform-shims/esm.mjs create mode 100644 @capacitor/assets/node_modules/yargs/locales/be.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/cs.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/de.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/en.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/es.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/fi.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/fr.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/hi.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/hu.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/id.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/it.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/ja.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/ko.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/nb.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/nl.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/nn.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/pirate.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/pl.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/pt.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/pt_BR.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/ru.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/th.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/tr.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/uk_UA.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/uz.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/zh_CN.json create mode 100644 @capacitor/assets/node_modules/yargs/locales/zh_TW.json create mode 100644 @capacitor/assets/node_modules/yargs/package.json create mode 100644 @capacitor/assets/node_modules/yargs/yargs create mode 100644 @capacitor/assets/node_modules/yargs/yargs.mjs create mode 100644 @capacitor/assets/package.json create mode 100644 @capacitor/cli/LICENSE create mode 100644 @capacitor/cli/README.md create mode 100644 @capacitor/cli/assets/android-template.tar.gz create mode 100644 @capacitor/cli/assets/capacitor-cordova-android-plugins.tar.gz create mode 100644 @capacitor/cli/assets/capacitor-cordova-ios-plugins.tar.gz create mode 100644 @capacitor/cli/assets/ios-pods-template.tar.gz create mode 100644 @capacitor/cli/assets/ios-spm-template.tar.gz create mode 100644 @capacitor/cli/dist/android/add.js create mode 100644 @capacitor/cli/dist/android/build.js create mode 100644 @capacitor/cli/dist/android/common.js create mode 100644 @capacitor/cli/dist/android/doctor.js create mode 100644 @capacitor/cli/dist/android/open.js create mode 100644 @capacitor/cli/dist/android/run.js create mode 100644 @capacitor/cli/dist/android/update.js create mode 100644 @capacitor/cli/dist/colors.js create mode 100644 @capacitor/cli/dist/common.js create mode 100644 @capacitor/cli/dist/config.js create mode 100644 @capacitor/cli/dist/cordova.js create mode 100644 @capacitor/cli/dist/declarations.d.ts create mode 100644 @capacitor/cli/dist/declarations.js create mode 100644 @capacitor/cli/dist/definitions.js create mode 100644 @capacitor/cli/dist/errors.js create mode 100644 @capacitor/cli/dist/framework-configs.js create mode 100644 @capacitor/cli/dist/index.js create mode 100644 @capacitor/cli/dist/ios/add.js create mode 100644 @capacitor/cli/dist/ios/build.js create mode 100644 @capacitor/cli/dist/ios/common.js create mode 100644 @capacitor/cli/dist/ios/doctor.js create mode 100644 @capacitor/cli/dist/ios/open.js create mode 100644 @capacitor/cli/dist/ios/run.js create mode 100644 @capacitor/cli/dist/ios/update.js create mode 100644 @capacitor/cli/dist/ipc.js create mode 100644 @capacitor/cli/dist/log.js create mode 100644 @capacitor/cli/dist/plugin.js create mode 100644 @capacitor/cli/dist/sysconfig.js create mode 100644 @capacitor/cli/dist/tasks/add.js create mode 100644 @capacitor/cli/dist/tasks/build.js create mode 100644 @capacitor/cli/dist/tasks/config.js create mode 100644 @capacitor/cli/dist/tasks/copy.js create mode 100644 @capacitor/cli/dist/tasks/create.js create mode 100644 @capacitor/cli/dist/tasks/doctor.js create mode 100644 @capacitor/cli/dist/tasks/init.js create mode 100644 @capacitor/cli/dist/tasks/list.js create mode 100644 @capacitor/cli/dist/tasks/migrate.js create mode 100644 @capacitor/cli/dist/tasks/new-plugin.js create mode 100644 @capacitor/cli/dist/tasks/open.js create mode 100644 @capacitor/cli/dist/tasks/run.js create mode 100644 @capacitor/cli/dist/tasks/serve.js create mode 100644 @capacitor/cli/dist/tasks/sourcemaps.js create mode 100644 @capacitor/cli/dist/tasks/sync.js create mode 100644 @capacitor/cli/dist/tasks/telemetry.js create mode 100644 @capacitor/cli/dist/tasks/update.js create mode 100644 @capacitor/cli/dist/telemetry.js create mode 100644 @capacitor/cli/dist/util/cli.js create mode 100644 @capacitor/cli/dist/util/emoji.js create mode 100644 @capacitor/cli/dist/util/fn.js create mode 100644 @capacitor/cli/dist/util/fs.js create mode 100644 @capacitor/cli/dist/util/iosplugin.js create mode 100644 @capacitor/cli/dist/util/js.js create mode 100644 @capacitor/cli/dist/util/livereload.js create mode 100644 @capacitor/cli/dist/util/monorepotools.js create mode 100644 @capacitor/cli/dist/util/native-run.js create mode 100644 @capacitor/cli/dist/util/node.js create mode 100644 @capacitor/cli/dist/util/promise.js create mode 100644 @capacitor/cli/dist/util/spm.js create mode 100644 @capacitor/cli/dist/util/subprocess.js create mode 100644 @capacitor/cli/dist/util/template.js create mode 100644 @capacitor/cli/dist/util/term.js create mode 100644 @capacitor/cli/dist/util/uuid.js create mode 100644 @capacitor/cli/dist/util/xml.js create mode 100644 @capacitor/cli/dist/web/copy.js create mode 120000 @capacitor/cli/node_modules/.bin/rimraf create mode 120000 @capacitor/cli/node_modules/.bin/semver create mode 100644 @capacitor/cli/node_modules/brace-expansion/.github/FUNDING.yml create mode 100644 @capacitor/cli/node_modules/brace-expansion/LICENSE create mode 100644 @capacitor/cli/node_modules/brace-expansion/README.md create mode 100644 @capacitor/cli/node_modules/brace-expansion/index.js create mode 100644 @capacitor/cli/node_modules/brace-expansion/package.json create mode 100644 @capacitor/cli/node_modules/commander/LICENSE create mode 100644 @capacitor/cli/node_modules/commander/Readme.md create mode 100644 @capacitor/cli/node_modules/commander/esm.mjs create mode 100644 @capacitor/cli/node_modules/commander/index.js create mode 100644 @capacitor/cli/node_modules/commander/lib/argument.js create mode 100644 @capacitor/cli/node_modules/commander/lib/command.js create mode 100644 @capacitor/cli/node_modules/commander/lib/error.js create mode 100644 @capacitor/cli/node_modules/commander/lib/help.js create mode 100644 @capacitor/cli/node_modules/commander/lib/option.js create mode 100644 @capacitor/cli/node_modules/commander/lib/suggestSimilar.js create mode 100644 @capacitor/cli/node_modules/commander/package-support.json create mode 100644 @capacitor/cli/node_modules/commander/package.json create mode 100644 @capacitor/cli/node_modules/commander/typings/index.d.ts create mode 100644 @capacitor/cli/node_modules/glob/LICENSE create mode 100644 @capacitor/cli/node_modules/glob/README.md create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/glob.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/glob.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/glob.js create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/glob.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/has-magic.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/has-magic.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/has-magic.js create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/has-magic.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/ignore.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/ignore.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/ignore.js create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/ignore.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/index-cjs.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/index-cjs.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/index-cjs.js create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/index-cjs.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/index.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/index.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/index.js create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/index.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/package.json create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/pattern.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/pattern.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/pattern.js create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/pattern.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/processor.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/processor.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/processor.js create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/processor.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/walker.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/walker.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/walker.js create mode 100644 @capacitor/cli/node_modules/glob/dist/cjs/walker.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/glob.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/glob.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/glob.js create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/glob.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/has-magic.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/has-magic.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/has-magic.js create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/has-magic.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/ignore.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/ignore.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/ignore.js create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/ignore.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/index.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/index.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/index.js create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/index.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/package.json create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/pattern.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/pattern.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/pattern.js create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/pattern.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/processor.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/processor.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/processor.js create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/processor.js.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/walker.d.ts create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/walker.d.ts.map create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/walker.js create mode 100644 @capacitor/cli/node_modules/glob/dist/mjs/walker.js.map create mode 100644 @capacitor/cli/node_modules/glob/package.json create mode 100644 @capacitor/cli/node_modules/minimatch/LICENSE create mode 100644 @capacitor/cli/node_modules/minimatch/README.md create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/assert-valid-pattern.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/assert-valid-pattern.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/assert-valid-pattern.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/assert-valid-pattern.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/ast.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/ast.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/ast.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/ast.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/brace-expressions.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/brace-expressions.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/brace-expressions.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/brace-expressions.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/escape.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/escape.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/escape.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/escape.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/index-cjs.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/index-cjs.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/index-cjs.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/index-cjs.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/index.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/index.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/index.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/index.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/package.json create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/unescape.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/unescape.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/unescape.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/cjs/unescape.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/assert-valid-pattern.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/assert-valid-pattern.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/ast.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/ast.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/ast.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/ast.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/brace-expressions.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/brace-expressions.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/brace-expressions.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/brace-expressions.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/escape.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/escape.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/escape.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/escape.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/index.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/index.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/index.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/index.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/package.json create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/unescape.d.ts create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/unescape.d.ts.map create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/unescape.js create mode 100644 @capacitor/cli/node_modules/minimatch/dist/mjs/unescape.js.map create mode 100644 @capacitor/cli/node_modules/minimatch/package.json create mode 100644 @capacitor/cli/node_modules/minipass/LICENSE create mode 100644 @capacitor/cli/node_modules/minipass/README.md create mode 100644 @capacitor/cli/node_modules/minipass/index.d.ts create mode 100644 @capacitor/cli/node_modules/minipass/index.js create mode 100644 @capacitor/cli/node_modules/minipass/index.mjs create mode 100644 @capacitor/cli/node_modules/minipass/package.json create mode 100644 @capacitor/cli/node_modules/rimraf/LICENSE create mode 100644 @capacitor/cli/node_modules/rimraf/README.md create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/package.json create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/bin.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/bin.d.ts.map create mode 100755 @capacitor/cli/node_modules/rimraf/dist/cjs/src/bin.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/bin.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/default-tmp.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/default-tmp.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/fix-eperm.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/fix-eperm.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/fs.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/fs.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/fs.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/fs.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/ignore-enoent.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/ignore-enoent.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/index-cjs.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/index-cjs.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/index.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/index.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/index.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/index.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/opt-arg.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/opt-arg.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/path-arg.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/path-arg.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/path-arg.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/path-arg.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/platform.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/platform.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/platform.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/platform.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/readdir-or-error.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/readdir-or-error.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/retry-busy.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/retry-busy.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-manual.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-manual.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-native.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-native.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-posix.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-posix.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-windows.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/rimraf-windows.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/use-native.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/use-native.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/use-native.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/cjs/src/use-native.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/default-tmp.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/default-tmp.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/default-tmp.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/default-tmp.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/fix-eperm.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/fix-eperm.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/fix-eperm.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/fix-eperm.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/fs.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/fs.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/fs.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/fs.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/ignore-enoent.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/ignore-enoent.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/index.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/index.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/index.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/index.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/opt-arg.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/opt-arg.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/opt-arg.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/opt-arg.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/package.json create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/path-arg.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/path-arg.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/path-arg.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/path-arg.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/platform.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/platform.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/platform.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/platform.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/readdir-or-error.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/readdir-or-error.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/retry-busy.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/retry-busy.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/retry-busy.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/retry-busy.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-manual.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-manual.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-move-remove.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-move-remove.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-native.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-native.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-native.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-native.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-posix.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-posix.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-windows.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/rimraf-windows.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/use-native.d.ts create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/use-native.d.ts.map create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/use-native.js create mode 100644 @capacitor/cli/node_modules/rimraf/dist/mjs/use-native.js.map create mode 100644 @capacitor/cli/node_modules/rimraf/package.json create mode 100644 @capacitor/cli/node_modules/semver/LICENSE create mode 100644 @capacitor/cli/node_modules/semver/README.md create mode 100644 @capacitor/cli/node_modules/semver/classes/comparator.js create mode 100644 @capacitor/cli/node_modules/semver/classes/index.js create mode 100644 @capacitor/cli/node_modules/semver/classes/range.js create mode 100644 @capacitor/cli/node_modules/semver/classes/semver.js create mode 100644 @capacitor/cli/node_modules/semver/functions/clean.js create mode 100644 @capacitor/cli/node_modules/semver/functions/cmp.js create mode 100644 @capacitor/cli/node_modules/semver/functions/coerce.js create mode 100644 @capacitor/cli/node_modules/semver/functions/compare-build.js create mode 100644 @capacitor/cli/node_modules/semver/functions/compare-loose.js create mode 100644 @capacitor/cli/node_modules/semver/functions/compare.js create mode 100644 @capacitor/cli/node_modules/semver/functions/diff.js create mode 100644 @capacitor/cli/node_modules/semver/functions/eq.js create mode 100644 @capacitor/cli/node_modules/semver/functions/gt.js create mode 100644 @capacitor/cli/node_modules/semver/functions/gte.js create mode 100644 @capacitor/cli/node_modules/semver/functions/inc.js create mode 100644 @capacitor/cli/node_modules/semver/functions/lt.js create mode 100644 @capacitor/cli/node_modules/semver/functions/lte.js create mode 100644 @capacitor/cli/node_modules/semver/functions/major.js create mode 100644 @capacitor/cli/node_modules/semver/functions/minor.js create mode 100644 @capacitor/cli/node_modules/semver/functions/neq.js create mode 100644 @capacitor/cli/node_modules/semver/functions/parse.js create mode 100644 @capacitor/cli/node_modules/semver/functions/patch.js create mode 100644 @capacitor/cli/node_modules/semver/functions/prerelease.js create mode 100644 @capacitor/cli/node_modules/semver/functions/rcompare.js create mode 100644 @capacitor/cli/node_modules/semver/functions/rsort.js create mode 100644 @capacitor/cli/node_modules/semver/functions/satisfies.js create mode 100644 @capacitor/cli/node_modules/semver/functions/sort.js create mode 100644 @capacitor/cli/node_modules/semver/functions/valid.js create mode 100644 @capacitor/cli/node_modules/semver/index.js create mode 100644 @capacitor/cli/node_modules/semver/internal/constants.js create mode 100644 @capacitor/cli/node_modules/semver/internal/debug.js create mode 100644 @capacitor/cli/node_modules/semver/internal/identifiers.js create mode 100644 @capacitor/cli/node_modules/semver/internal/lrucache.js create mode 100644 @capacitor/cli/node_modules/semver/internal/parse-options.js create mode 100644 @capacitor/cli/node_modules/semver/internal/re.js create mode 100644 @capacitor/cli/node_modules/semver/package.json create mode 100644 @capacitor/cli/node_modules/semver/preload.js create mode 100644 @capacitor/cli/node_modules/semver/range.bnf create mode 100644 @capacitor/cli/node_modules/semver/ranges/gtr.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/intersects.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/ltr.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/max-satisfying.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/min-satisfying.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/min-version.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/outside.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/simplify.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/subset.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/to-comparators.js create mode 100644 @capacitor/cli/node_modules/semver/ranges/valid.js create mode 100644 @capacitor/cli/node_modules/xml2js/LICENSE create mode 100644 @capacitor/cli/node_modules/xml2js/README.md create mode 100644 @capacitor/cli/node_modules/xml2js/lib/bom.js create mode 100644 @capacitor/cli/node_modules/xml2js/lib/builder.js create mode 100644 @capacitor/cli/node_modules/xml2js/lib/defaults.js create mode 100644 @capacitor/cli/node_modules/xml2js/lib/parser.js create mode 100644 @capacitor/cli/node_modules/xml2js/lib/processors.js create mode 100644 @capacitor/cli/node_modules/xml2js/lib/xml2js.js create mode 100644 @capacitor/cli/node_modules/xml2js/package.json create mode 100644 @capacitor/cli/package.json create mode 100644 @capacitor/core/LICENSE create mode 100644 @capacitor/core/README.md create mode 100644 @capacitor/core/cookies.md create mode 100644 @capacitor/core/cordova.js create mode 100644 @capacitor/core/dist/capacitor.js create mode 100644 @capacitor/core/dist/capacitor.js.map create mode 100644 @capacitor/core/dist/index.cjs.js create mode 100644 @capacitor/core/dist/index.cjs.js.map create mode 100644 @capacitor/core/dist/index.js create mode 100644 @capacitor/core/dist/index.js.map create mode 100644 @capacitor/core/http.md create mode 100644 @capacitor/core/package.json create mode 100644 @capacitor/core/types/core-plugins.d.ts create mode 100644 @capacitor/core/types/definitions-internal.d.ts create mode 100644 @capacitor/core/types/definitions.d.ts create mode 100644 @capacitor/core/types/global.d.ts create mode 100644 @capacitor/core/types/index.d.ts create mode 100644 @capacitor/core/types/legacy/legacy-definitions.d.ts create mode 100644 @capacitor/core/types/legacy/legacy-web-plugin-merge.d.ts create mode 100644 @capacitor/core/types/platforms.d.ts create mode 100644 @capacitor/core/types/runtime.d.ts create mode 100644 @capacitor/core/types/util.d.ts create mode 100644 @capacitor/core/types/web-plugin.d.ts diff --git a/@capacitor/android/LICENSE b/@capacitor/android/LICENSE new file mode 100644 index 00000000..c3e903bd --- /dev/null +++ b/@capacitor/android/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present Drifty Co. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/@capacitor/android/capacitor/build.gradle b/@capacitor/android/capacitor/build.gradle new file mode 100644 index 00000000..1039f19b --- /dev/null +++ b/@capacitor/android/capacitor/build.gradle @@ -0,0 +1,96 @@ +ext { + androidxActivityVersion = project.hasProperty('androidxActivityVersion') ? rootProject.ext.androidxActivityVersion : '1.8.0' + androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.6.1' + androidxCoordinatorLayoutVersion = project.hasProperty('androidxCoordinatorLayoutVersion') ? rootProject.ext.androidxCoordinatorLayoutVersion : '1.2.0' + androidxCoreVersion = project.hasProperty('androidxCoreVersion') ? rootProject.ext.androidxCoreVersion : '1.12.0' + androidxFragmentVersion = project.hasProperty('androidxFragmentVersion') ? rootProject.ext.androidxFragmentVersion : '1.6.2' + androidxWebkitVersion = project.hasProperty('androidxWebkitVersion') ? rootProject.ext.androidxWebkitVersion : '1.9.0' + junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.2' + androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.1.5' + androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.5.1' + cordovaAndroidVersion = project.hasProperty('cordovaAndroidVersion') ? rootProject.ext.cordovaAndroidVersion : '10.1.1' +} + + +buildscript { + ext.kotlin_version = project.hasProperty("kotlin_version") ? rootProject.ext.kotlin_version : '1.9.10' + repositories { + google() + mavenCentral() + maven { + url "https://plugins.gradle.org/m2/" + } + } + dependencies { + classpath 'com.android.tools.build:gradle:8.2.1' + + if (System.getenv("CAP_PUBLISH") == "true") { + classpath 'io.github.gradle-nexus:publish-plugin:1.3.0' + } + } +} + +tasks.withType(Javadoc).all { enabled = false } + +apply plugin: 'com.android.library' + +if (System.getenv("CAP_PUBLISH") == "true") { + apply plugin: 'io.github.gradle-nexus.publish-plugin' + apply from: file('../scripts/publish-root.gradle') + apply from: file('../scripts/publish-module.gradle') +} + +android { + namespace "com.getcapacitor.android" + compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34 + defaultConfig { + minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22 + targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 34 + versionCode 1 + versionName "1.0" + consumerProguardFiles 'proguard-rules.pro' + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + lintOptions { + baseline file("lint-baseline.xml") + abortOnError true + warningsAsErrors true + lintConfig file('lint.xml') + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } + publishing { + singleVariant("release") + } +} + +repositories { + google() + mavenCentral() +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation platform("org.jetbrains.kotlin:kotlin-bom:$kotlin_version") + implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" + implementation "androidx.core:core:$androidxCoreVersion" + implementation "androidx.activity:activity:$androidxActivityVersion" + implementation "androidx.fragment:fragment:$androidxFragmentVersion" + implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" + implementation "androidx.webkit:webkit:$androidxWebkitVersion" + testImplementation "junit:junit:$junitVersion" + androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" + androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" + implementation "org.apache.cordova:framework:$cordovaAndroidVersion" + testImplementation 'org.json:json:20231013' + testImplementation 'org.mockito:mockito-inline:5.2.0' +} + diff --git a/@capacitor/android/capacitor/lint-baseline.xml b/@capacitor/android/capacitor/lint-baseline.xml new file mode 100644 index 00000000..c1ed9ccb --- /dev/null +++ b/@capacitor/android/capacitor/lint-baseline.xml @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/@capacitor/android/capacitor/lint.xml b/@capacitor/android/capacitor/lint.xml new file mode 100644 index 00000000..b00604ba --- /dev/null +++ b/@capacitor/android/capacitor/lint.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/@capacitor/android/capacitor/proguard-rules.pro b/@capacitor/android/capacitor/proguard-rules.pro new file mode 100644 index 00000000..96db065b --- /dev/null +++ b/@capacitor/android/capacitor/proguard-rules.pro @@ -0,0 +1,28 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Rules for Capacitor v3 plugins and annotations + -keep @com.getcapacitor.annotation.CapacitorPlugin public class * { + @com.getcapacitor.annotation.PermissionCallback ; + @com.getcapacitor.annotation.ActivityCallback ; + @com.getcapacitor.annotation.Permission ; + @com.getcapacitor.PluginMethod public ; + } + + -keep public class * extends com.getcapacitor.Plugin { *; } + +# Rules for Capacitor v2 plugins and annotations +# These are deprecated but can still be used with Capacitor for now +-keep @com.getcapacitor.NativePlugin public class * { + @com.getcapacitor.PluginMethod public ; +} + +# Rules for Cordova plugins +-keep public class * extends org.apache.cordova.* { + public ; + public ; +} \ No newline at end of file diff --git a/@capacitor/android/capacitor/src/main/AndroidManifest.xml b/@capacitor/android/capacitor/src/main/AndroidManifest.xml new file mode 100644 index 00000000..74b7379f --- /dev/null +++ b/@capacitor/android/capacitor/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/@capacitor/android/capacitor/src/main/assets/native-bridge.js b/@capacitor/android/capacitor/src/main/assets/native-bridge.js new file mode 100644 index 00000000..17db853d --- /dev/null +++ b/@capacitor/android/capacitor/src/main/assets/native-bridge.js @@ -0,0 +1,1025 @@ + +/*! Capacitor: https://capacitorjs.com/ - MIT License */ +/* Generated File. Do not edit. */ + +var nativeBridge = (function (exports) { + 'use strict'; + + var ExceptionCode; + (function (ExceptionCode) { + /** + * API is not implemented. + * + * This usually means the API can't be used because it is not implemented for + * the current platform. + */ + ExceptionCode["Unimplemented"] = "UNIMPLEMENTED"; + /** + * API is not available. + * + * This means the API can't be used right now because: + * - it is currently missing a prerequisite, such as network connectivity + * - it requires a particular platform or browser version + */ + ExceptionCode["Unavailable"] = "UNAVAILABLE"; + })(ExceptionCode || (ExceptionCode = {})); + class CapacitorException extends Error { + constructor(message, code, data) { + super(message); + this.message = message; + this.code = code; + this.data = data; + } + } + + // For removing exports for iOS/Android, keep let for reassignment + // eslint-disable-next-line + let dummy = {}; + const readFileAsBase64 = (file) => new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onloadend = () => { + const data = reader.result; + resolve(btoa(data)); + }; + reader.onerror = reject; + reader.readAsBinaryString(file); + }); + const convertFormData = async (formData) => { + const newFormData = []; + for (const pair of formData.entries()) { + const [key, value] = pair; + if (value instanceof File) { + const base64File = await readFileAsBase64(value); + newFormData.push({ + key, + value: base64File, + type: 'base64File', + contentType: value.type, + fileName: value.name, + }); + } + else { + newFormData.push({ key, value, type: 'string' }); + } + } + return newFormData; + }; + const convertBody = async (body, contentType) => { + if (body instanceof ReadableStream || body instanceof Uint8Array) { + let encodedData; + if (body instanceof ReadableStream) { + const reader = body.getReader(); + const chunks = []; + while (true) { + const { done, value } = await reader.read(); + if (done) + break; + chunks.push(value); + } + const concatenated = new Uint8Array(chunks.reduce((acc, chunk) => acc + chunk.length, 0)); + let position = 0; + for (const chunk of chunks) { + concatenated.set(chunk, position); + position += chunk.length; + } + encodedData = concatenated; + } + else { + encodedData = body; + } + let data = new TextDecoder().decode(encodedData); + let type; + if (contentType === 'application/json') { + try { + data = JSON.parse(data); + } + catch (ignored) { + // ignore + } + type = 'json'; + } + else if (contentType === 'multipart/form-data') { + type = 'formData'; + } + else if (contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('image')) { + type = 'image'; + } + else if (contentType === 'application/octet-stream') { + type = 'binary'; + } + else { + type = 'text'; + } + return { + data, + type, + headers: { 'Content-Type': contentType || 'application/octet-stream' }, + }; + } + else if (body instanceof URLSearchParams) { + return { + data: body.toString(), + type: 'text', + }; + } + else if (body instanceof FormData) { + const formData = await convertFormData(body); + return { + data: formData, + type: 'formData', + }; + } + else if (body instanceof File) { + const fileData = await readFileAsBase64(body); + return { + data: fileData, + type: 'file', + headers: { 'Content-Type': body.type }, + }; + } + return { data: body, type: 'json' }; + }; + const CAPACITOR_HTTP_INTERCEPTOR = '/_capacitor_http_interceptor_'; + const CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM = 'u'; + // TODO: export as Cap function + const isRelativeOrProxyUrl = (url) => !url || + !(url.startsWith('http:') || url.startsWith('https:')) || + url.indexOf(CAPACITOR_HTTP_INTERCEPTOR) > -1; + // TODO: export as Cap function + const createProxyUrl = (url, win) => { + var _a, _b; + if (isRelativeOrProxyUrl(url)) + return url; + const bridgeUrl = new URL((_b = (_a = win.Capacitor) === null || _a === void 0 ? void 0 : _a.getServerUrl()) !== null && _b !== void 0 ? _b : ''); + bridgeUrl.pathname = CAPACITOR_HTTP_INTERCEPTOR; + bridgeUrl.searchParams.append(CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM, url); + return bridgeUrl.toString(); + }; + const initBridge = (w) => { + const getPlatformId = (win) => { + var _a, _b; + if (win === null || win === void 0 ? void 0 : win.androidBridge) { + return 'android'; + } + else if ((_b = (_a = win === null || win === void 0 ? void 0 : win.webkit) === null || _a === void 0 ? void 0 : _a.messageHandlers) === null || _b === void 0 ? void 0 : _b.bridge) { + return 'ios'; + } + else { + return 'web'; + } + }; + const convertFileSrcServerUrl = (webviewServerUrl, filePath) => { + if (typeof filePath === 'string') { + if (filePath.startsWith('/')) { + return webviewServerUrl + '/_capacitor_file_' + filePath; + } + else if (filePath.startsWith('file://')) { + return (webviewServerUrl + filePath.replace('file://', '/_capacitor_file_')); + } + else if (filePath.startsWith('content://')) { + return (webviewServerUrl + + filePath.replace('content:/', '/_capacitor_content_')); + } + } + return filePath; + }; + const initEvents = (win, cap) => { + cap.addListener = (pluginName, eventName, callback) => { + const callbackId = cap.nativeCallback(pluginName, 'addListener', { + eventName: eventName, + }, callback); + return { + remove: async () => { + var _a; + (_a = win === null || win === void 0 ? void 0 : win.console) === null || _a === void 0 ? void 0 : _a.debug('Removing listener', pluginName, eventName); + cap.removeListener(pluginName, callbackId, eventName, callback); + }, + }; + }; + cap.removeListener = (pluginName, callbackId, eventName, callback) => { + cap.nativeCallback(pluginName, 'removeListener', { + callbackId: callbackId, + eventName: eventName, + }, callback); + }; + cap.createEvent = (eventName, eventData) => { + const doc = win.document; + if (doc) { + const ev = doc.createEvent('Events'); + ev.initEvent(eventName, false, false); + if (eventData && typeof eventData === 'object') { + for (const i in eventData) { + // eslint-disable-next-line no-prototype-builtins + if (eventData.hasOwnProperty(i)) { + ev[i] = eventData[i]; + } + } + } + return ev; + } + return null; + }; + cap.triggerEvent = (eventName, target, eventData) => { + const doc = win.document; + const cordova = win.cordova; + eventData = eventData || {}; + const ev = cap.createEvent(eventName, eventData); + if (ev) { + if (target === 'document') { + if (cordova === null || cordova === void 0 ? void 0 : cordova.fireDocumentEvent) { + cordova.fireDocumentEvent(eventName, eventData); + return true; + } + else if (doc === null || doc === void 0 ? void 0 : doc.dispatchEvent) { + return doc.dispatchEvent(ev); + } + } + else if (target === 'window' && win.dispatchEvent) { + return win.dispatchEvent(ev); + } + else if (doc === null || doc === void 0 ? void 0 : doc.querySelector) { + const targetEl = doc.querySelector(target); + if (targetEl) { + return targetEl.dispatchEvent(ev); + } + } + } + return false; + }; + win.Capacitor = cap; + }; + const initLegacyHandlers = (win, cap) => { + // define cordova if it's not there already + win.cordova = win.cordova || {}; + const doc = win.document; + const nav = win.navigator; + if (nav) { + nav.app = nav.app || {}; + nav.app.exitApp = () => { + var _a; + if (!((_a = cap.Plugins) === null || _a === void 0 ? void 0 : _a.App)) { + win.console.warn('App plugin not installed'); + } + else { + cap.nativeCallback('App', 'exitApp', {}); + } + }; + } + if (doc) { + const docAddEventListener = doc.addEventListener; + doc.addEventListener = (...args) => { + var _a; + const eventName = args[0]; + const handler = args[1]; + if (eventName === 'deviceready' && handler) { + Promise.resolve().then(handler); + } + else if (eventName === 'backbutton' && cap.Plugins.App) { + // Add a dummy listener so Capacitor doesn't do the default + // back button action + if (!((_a = cap.Plugins) === null || _a === void 0 ? void 0 : _a.App)) { + win.console.warn('App plugin not installed'); + } + else { + cap.Plugins.App.addListener('backButton', () => { + // ignore + }); + } + } + return docAddEventListener.apply(doc, args); + }; + } + // deprecated in v3, remove from v4 + cap.platform = cap.getPlatform(); + cap.isNative = cap.isNativePlatform(); + win.Capacitor = cap; + }; + const initVendor = (win, cap) => { + const Ionic = (win.Ionic = win.Ionic || {}); + const IonicWebView = (Ionic.WebView = Ionic.WebView || {}); + const Plugins = cap.Plugins; + IonicWebView.getServerBasePath = (callback) => { + var _a; + (_a = Plugins === null || Plugins === void 0 ? void 0 : Plugins.WebView) === null || _a === void 0 ? void 0 : _a.getServerBasePath().then((result) => { + callback(result.path); + }); + }; + IonicWebView.setServerAssetPath = (path) => { + var _a; + (_a = Plugins === null || Plugins === void 0 ? void 0 : Plugins.WebView) === null || _a === void 0 ? void 0 : _a.setServerAssetPath({ path }); + }; + IonicWebView.setServerBasePath = (path) => { + var _a; + (_a = Plugins === null || Plugins === void 0 ? void 0 : Plugins.WebView) === null || _a === void 0 ? void 0 : _a.setServerBasePath({ path }); + }; + IonicWebView.persistServerBasePath = () => { + var _a; + (_a = Plugins === null || Plugins === void 0 ? void 0 : Plugins.WebView) === null || _a === void 0 ? void 0 : _a.persistServerBasePath(); + }; + IonicWebView.convertFileSrc = (url) => cap.convertFileSrc(url); + win.Capacitor = cap; + win.Ionic.WebView = IonicWebView; + }; + const initLogger = (win, cap) => { + const BRIDGED_CONSOLE_METHODS = [ + 'debug', + 'error', + 'info', + 'log', + 'trace', + 'warn', + ]; + const createLogFromNative = (c) => (result) => { + if (isFullConsole(c)) { + const success = result.success === true; + const tagStyles = success + ? 'font-style: italic; font-weight: lighter; color: gray' + : 'font-style: italic; font-weight: lighter; color: red'; + c.groupCollapsed('%cresult %c' + + result.pluginId + + '.' + + result.methodName + + ' (#' + + result.callbackId + + ')', tagStyles, 'font-style: italic; font-weight: bold; color: #444'); + if (result.success === false) { + c.error(result.error); + } + else { + c.dir(result.data); + } + c.groupEnd(); + } + else { + if (result.success === false) { + c.error('LOG FROM NATIVE', result.error); + } + else { + c.log('LOG FROM NATIVE', result.data); + } + } + }; + const createLogToNative = (c) => (call) => { + if (isFullConsole(c)) { + c.groupCollapsed('%cnative %c' + + call.pluginId + + '.' + + call.methodName + + ' (#' + + call.callbackId + + ')', 'font-weight: lighter; color: gray', 'font-weight: bold; color: #000'); + c.dir(call); + c.groupEnd(); + } + else { + c.log('LOG TO NATIVE: ', call); + } + }; + const isFullConsole = (c) => { + if (!c) { + return false; + } + return (typeof c.groupCollapsed === 'function' || + typeof c.groupEnd === 'function' || + typeof c.dir === 'function'); + }; + const serializeConsoleMessage = (msg) => { + try { + if (typeof msg === 'object') { + msg = JSON.stringify(msg); + } + return String(msg); + } + catch (e) { + return ''; + } + }; + const platform = getPlatformId(win); + if (platform == 'android' || platform == 'ios') { + // patch document.cookie on Android/iOS + win.CapacitorCookiesDescriptor = + Object.getOwnPropertyDescriptor(Document.prototype, 'cookie') || + Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie'); + let doPatchCookies = false; + // check if capacitor cookies is disabled before patching + if (platform === 'ios') { + // Use prompt to synchronously get capacitor cookies config. + // https://stackoverflow.com/questions/29249132/wkwebview-complex-communication-between-javascript-native-code/49474323#49474323 + const payload = { + type: 'CapacitorCookies.isEnabled', + }; + const isCookiesEnabled = prompt(JSON.stringify(payload)); + if (isCookiesEnabled === 'true') { + doPatchCookies = true; + } + } + else if (typeof win.CapacitorCookiesAndroidInterface !== 'undefined') { + const isCookiesEnabled = win.CapacitorCookiesAndroidInterface.isEnabled(); + if (isCookiesEnabled === true) { + doPatchCookies = true; + } + } + if (doPatchCookies) { + Object.defineProperty(document, 'cookie', { + get: function () { + var _a, _b, _c; + if (platform === 'ios') { + // Use prompt to synchronously get cookies. + // https://stackoverflow.com/questions/29249132/wkwebview-complex-communication-between-javascript-native-code/49474323#49474323 + const payload = { + type: 'CapacitorCookies.get', + }; + const res = prompt(JSON.stringify(payload)); + return res; + } + else if (typeof win.CapacitorCookiesAndroidInterface !== 'undefined') { + // return original document.cookie since Android does not support filtering of `httpOnly` cookies + return (_c = (_b = (_a = win.CapacitorCookiesDescriptor) === null || _a === void 0 ? void 0 : _a.get) === null || _b === void 0 ? void 0 : _b.call(document)) !== null && _c !== void 0 ? _c : ''; + } + }, + set: function (val) { + const cookiePairs = val.split(';'); + const domainSection = val.toLowerCase().split('domain=')[1]; + const domain = cookiePairs.length > 1 && + domainSection != null && + domainSection.length > 0 + ? domainSection.split(';')[0].trim() + : ''; + if (platform === 'ios') { + // Use prompt to synchronously set cookies. + // https://stackoverflow.com/questions/29249132/wkwebview-complex-communication-between-javascript-native-code/49474323#49474323 + const payload = { + type: 'CapacitorCookies.set', + action: val, + domain, + }; + prompt(JSON.stringify(payload)); + } + else if (typeof win.CapacitorCookiesAndroidInterface !== 'undefined') { + win.CapacitorCookiesAndroidInterface.setCookie(domain, val); + } + }, + }); + } + // patch fetch / XHR on Android/iOS + // store original fetch & XHR functions + win.CapacitorWebFetch = window.fetch; + win.CapacitorWebXMLHttpRequest = { + abort: window.XMLHttpRequest.prototype.abort, + constructor: window.XMLHttpRequest.prototype.constructor, + fullObject: window.XMLHttpRequest, + getAllResponseHeaders: window.XMLHttpRequest.prototype.getAllResponseHeaders, + getResponseHeader: window.XMLHttpRequest.prototype.getResponseHeader, + open: window.XMLHttpRequest.prototype.open, + prototype: window.XMLHttpRequest.prototype, + send: window.XMLHttpRequest.prototype.send, + setRequestHeader: window.XMLHttpRequest.prototype.setRequestHeader, + }; + let doPatchHttp = false; + // check if capacitor http is disabled before patching + if (platform === 'ios') { + // Use prompt to synchronously get capacitor http config. + // https://stackoverflow.com/questions/29249132/wkwebview-complex-communication-between-javascript-native-code/49474323#49474323 + const payload = { + type: 'CapacitorHttp', + }; + const isHttpEnabled = prompt(JSON.stringify(payload)); + if (isHttpEnabled === 'true') { + doPatchHttp = true; + } + } + else if (typeof win.CapacitorHttpAndroidInterface !== 'undefined') { + const isHttpEnabled = win.CapacitorHttpAndroidInterface.isEnabled(); + if (isHttpEnabled === true) { + doPatchHttp = true; + } + } + if (doPatchHttp) { + // fetch patch + window.fetch = async (resource, options) => { + const request = new Request(resource, options); + if (request.url.startsWith(`${cap.getServerUrl()}/`)) { + return win.CapacitorWebFetch(resource, options); + } + const { method } = request; + if (method.toLocaleUpperCase() === 'GET' || + method.toLocaleUpperCase() === 'HEAD' || + method.toLocaleUpperCase() === 'OPTIONS' || + method.toLocaleUpperCase() === 'TRACE') { + if (typeof resource === 'string') { + return await win.CapacitorWebFetch(createProxyUrl(resource, win), options); + } + else if (resource instanceof Request) { + const modifiedRequest = new Request(createProxyUrl(resource.url, win), resource); + return await win.CapacitorWebFetch(modifiedRequest, options); + } + } + const tag = `CapacitorHttp fetch ${Date.now()} ${resource}`; + console.time(tag); + try { + const { body } = request; + const optionHeaders = Object.fromEntries(request.headers.entries()); + const { data: requestData, type, headers, } = await convertBody((options === null || options === void 0 ? void 0 : options.body) || body || undefined, optionHeaders['Content-Type'] || optionHeaders['content-type']); + const nativeResponse = await cap.nativePromise('CapacitorHttp', 'request', { + url: request.url, + method: method, + data: requestData, + dataType: type, + headers: Object.assign(Object.assign({}, headers), optionHeaders), + }); + const contentType = nativeResponse.headers['Content-Type'] || + nativeResponse.headers['content-type']; + let data = (contentType === null || contentType === void 0 ? void 0 : contentType.startsWith('application/json')) + ? JSON.stringify(nativeResponse.data) + : nativeResponse.data; + // use null data for 204 No Content HTTP response + if (nativeResponse.status === 204) { + data = null; + } + // intercept & parse response before returning + const response = new Response(data, { + headers: nativeResponse.headers, + status: nativeResponse.status, + }); + /* + * copy url to response, `cordova-plugin-ionic` uses this url from the response + * we need `Object.defineProperty` because url is an inherited getter on the Response + * see: https://stackoverflow.com/a/57382543 + * */ + Object.defineProperty(response, 'url', { + value: nativeResponse.url, + }); + console.timeEnd(tag); + return response; + } + catch (error) { + console.timeEnd(tag); + return Promise.reject(error); + } + }; + window.XMLHttpRequest = function () { + const xhr = new win.CapacitorWebXMLHttpRequest.constructor(); + Object.defineProperties(xhr, { + _headers: { + value: {}, + writable: true, + }, + _method: { + value: xhr.method, + writable: true, + }, + }); + const prototype = win.CapacitorWebXMLHttpRequest.prototype; + const isProgressEventAvailable = () => typeof ProgressEvent !== 'undefined' && + ProgressEvent.prototype instanceof Event; + // XHR patch abort + prototype.abort = function () { + if (isRelativeOrProxyUrl(this._url)) { + return win.CapacitorWebXMLHttpRequest.abort.call(this); + } + this.readyState = 0; + setTimeout(() => { + this.dispatchEvent(new Event('abort')); + this.dispatchEvent(new Event('loadend')); + }); + }; + // XHR patch open + prototype.open = function (method, url) { + this._method = method.toLocaleUpperCase(); + this._url = url; + if (!this._method || + this._method === 'GET' || + this._method === 'HEAD' || + this._method === 'OPTIONS' || + this._method === 'TRACE') { + if (isRelativeOrProxyUrl(url)) { + return win.CapacitorWebXMLHttpRequest.open.call(this, method, url); + } + this._url = createProxyUrl(this._url, win); + return win.CapacitorWebXMLHttpRequest.open.call(this, method, this._url); + } + Object.defineProperties(this, { + readyState: { + get: function () { + var _a; + return (_a = this._readyState) !== null && _a !== void 0 ? _a : 0; + }, + set: function (val) { + this._readyState = val; + setTimeout(() => { + this.dispatchEvent(new Event('readystatechange')); + }); + }, + }, + }); + setTimeout(() => { + this.dispatchEvent(new Event('loadstart')); + }); + this.readyState = 1; + }; + // XHR patch set request header + prototype.setRequestHeader = function (header, value) { + if (isRelativeOrProxyUrl(this._url)) { + return win.CapacitorWebXMLHttpRequest.setRequestHeader.call(this, header, value); + } + this._headers[header] = value; + }; + // XHR patch send + prototype.send = function (body) { + if (isRelativeOrProxyUrl(this._url)) { + return win.CapacitorWebXMLHttpRequest.send.call(this, body); + } + const tag = `CapacitorHttp XMLHttpRequest ${Date.now()} ${this._url}`; + console.time(tag); + try { + this.readyState = 2; + Object.defineProperties(this, { + response: { + value: '', + writable: true, + }, + responseText: { + value: '', + writable: true, + }, + responseURL: { + value: '', + writable: true, + }, + status: { + value: 0, + writable: true, + }, + }); + convertBody(body).then(({ data, type, headers }) => { + const otherHeaders = this._headers != null && Object.keys(this._headers).length > 0 + ? this._headers + : undefined; + // intercept request & pass to the bridge + cap + .nativePromise('CapacitorHttp', 'request', { + url: this._url, + method: this._method, + data: data !== null ? data : undefined, + headers: Object.assign(Object.assign({}, headers), otherHeaders), + dataType: type, + }) + .then((nativeResponse) => { + var _a; + // intercept & parse response before returning + if (this.readyState == 2) { + //TODO: Add progress event emission on native side + if (isProgressEventAvailable()) { + this.dispatchEvent(new ProgressEvent('progress', { + lengthComputable: true, + loaded: nativeResponse.data.length, + total: nativeResponse.data.length, + })); + } + this._headers = nativeResponse.headers; + this.status = nativeResponse.status; + if (this.responseType === '' || + this.responseType === 'text') { + this.response = + typeof nativeResponse.data !== 'string' + ? JSON.stringify(nativeResponse.data) + : nativeResponse.data; + } + else { + this.response = nativeResponse.data; + } + this.responseText = ((_a = (nativeResponse.headers['Content-Type'] || + nativeResponse.headers['content-type'])) === null || _a === void 0 ? void 0 : _a.startsWith('application/json')) + ? JSON.stringify(nativeResponse.data) + : nativeResponse.data; + this.responseURL = nativeResponse.url; + this.readyState = 4; + setTimeout(() => { + this.dispatchEvent(new Event('load')); + this.dispatchEvent(new Event('loadend')); + }); + } + console.timeEnd(tag); + }) + .catch((error) => { + this.status = error.status; + this._headers = error.headers; + this.response = error.data; + this.responseText = JSON.stringify(error.data); + this.responseURL = error.url; + this.readyState = 4; + if (isProgressEventAvailable()) { + this.dispatchEvent(new ProgressEvent('progress', { + lengthComputable: false, + loaded: 0, + total: 0, + })); + } + setTimeout(() => { + this.dispatchEvent(new Event('error')); + this.dispatchEvent(new Event('loadend')); + }); + console.timeEnd(tag); + }); + }); + } + catch (error) { + this.status = 500; + this._headers = {}; + this.response = error; + this.responseText = error.toString(); + this.responseURL = this._url; + this.readyState = 4; + if (isProgressEventAvailable()) { + this.dispatchEvent(new ProgressEvent('progress', { + lengthComputable: false, + loaded: 0, + total: 0, + })); + } + setTimeout(() => { + this.dispatchEvent(new Event('error')); + this.dispatchEvent(new Event('loadend')); + }); + console.timeEnd(tag); + } + }; + // XHR patch getAllResponseHeaders + prototype.getAllResponseHeaders = function () { + if (isRelativeOrProxyUrl(this._url)) { + return win.CapacitorWebXMLHttpRequest.getAllResponseHeaders.call(this); + } + let returnString = ''; + for (const key in this._headers) { + if (key != 'Set-Cookie') { + returnString += key + ': ' + this._headers[key] + '\r\n'; + } + } + return returnString; + }; + // XHR patch getResponseHeader + prototype.getResponseHeader = function (name) { + if (isRelativeOrProxyUrl(this._url)) { + return win.CapacitorWebXMLHttpRequest.getResponseHeader.call(this, name); + } + return this._headers[name]; + }; + Object.setPrototypeOf(xhr, prototype); + return xhr; + }; + Object.assign(window.XMLHttpRequest, win.CapacitorWebXMLHttpRequest.fullObject); + } + } + // patch window.console on iOS and store original console fns + const isIos = getPlatformId(win) === 'ios'; + if (win.console && isIos) { + Object.defineProperties(win.console, BRIDGED_CONSOLE_METHODS.reduce((props, method) => { + const consoleMethod = win.console[method].bind(win.console); + props[method] = { + value: (...args) => { + const msgs = [...args]; + cap.toNative('Console', 'log', { + level: method, + message: msgs.map(serializeConsoleMessage).join(' '), + }); + return consoleMethod(...args); + }, + }; + return props; + }, {})); + } + cap.logJs = (msg, level) => { + switch (level) { + case 'error': + win.console.error(msg); + break; + case 'warn': + win.console.warn(msg); + break; + case 'info': + win.console.info(msg); + break; + default: + win.console.log(msg); + } + }; + cap.logToNative = createLogToNative(win.console); + cap.logFromNative = createLogFromNative(win.console); + cap.handleError = err => win.console.error(err); + win.Capacitor = cap; + }; + function initNativeBridge(win) { + const cap = win.Capacitor || {}; + // keep a collection of callbacks for native response data + const callbacks = new Map(); + const webviewServerUrl = typeof win.WEBVIEW_SERVER_URL === 'string' ? win.WEBVIEW_SERVER_URL : ''; + cap.getServerUrl = () => webviewServerUrl; + cap.convertFileSrc = filePath => convertFileSrcServerUrl(webviewServerUrl, filePath); + // Counter of callback ids, randomized to avoid + // any issues during reloads if a call comes back with + // an existing callback id from an old session + let callbackIdCount = Math.floor(Math.random() * 134217728); + let postToNative = null; + const isNativePlatform = () => true; + const getPlatform = () => getPlatformId(win); + cap.getPlatform = getPlatform; + cap.isPluginAvailable = name => Object.prototype.hasOwnProperty.call(cap.Plugins, name); + cap.isNativePlatform = isNativePlatform; + // create the postToNative() fn if needed + if (getPlatformId(win) === 'android') { + // android platform + postToNative = data => { + var _a; + try { + win.androidBridge.postMessage(JSON.stringify(data)); + } + catch (e) { + (_a = win === null || win === void 0 ? void 0 : win.console) === null || _a === void 0 ? void 0 : _a.error(e); + } + }; + } + else if (getPlatformId(win) === 'ios') { + // ios platform + postToNative = data => { + var _a; + try { + data.type = data.type ? data.type : 'message'; + win.webkit.messageHandlers.bridge.postMessage(data); + } + catch (e) { + (_a = win === null || win === void 0 ? void 0 : win.console) === null || _a === void 0 ? void 0 : _a.error(e); + } + }; + } + cap.handleWindowError = (msg, url, lineNo, columnNo, err) => { + const str = msg.toLowerCase(); + if (str.indexOf('script error') > -1) ; + else { + const errObj = { + type: 'js.error', + error: { + message: msg, + url: url, + line: lineNo, + col: columnNo, + errorObject: JSON.stringify(err), + }, + }; + if (err !== null) { + cap.handleError(err); + } + postToNative(errObj); + } + return false; + }; + if (cap.DEBUG) { + window.onerror = cap.handleWindowError; + } + initLogger(win, cap); + /** + * Send a plugin method call to the native layer + */ + cap.toNative = (pluginName, methodName, options, storedCallback) => { + var _a, _b; + try { + if (typeof postToNative === 'function') { + let callbackId = '-1'; + if (storedCallback && + (typeof storedCallback.callback === 'function' || + typeof storedCallback.resolve === 'function')) { + // store the call for later lookup + callbackId = String(++callbackIdCount); + callbacks.set(callbackId, storedCallback); + } + const callData = { + callbackId: callbackId, + pluginId: pluginName, + methodName: methodName, + options: options || {}, + }; + if (cap.isLoggingEnabled && pluginName !== 'Console') { + cap.logToNative(callData); + } + // post the call data to native + postToNative(callData); + return callbackId; + } + else { + (_a = win === null || win === void 0 ? void 0 : win.console) === null || _a === void 0 ? void 0 : _a.warn(`implementation unavailable for: ${pluginName}`); + } + } + catch (e) { + (_b = win === null || win === void 0 ? void 0 : win.console) === null || _b === void 0 ? void 0 : _b.error(e); + } + return null; + }; + if (win === null || win === void 0 ? void 0 : win.androidBridge) { + win.androidBridge.onmessage = function (event) { + returnResult(JSON.parse(event.data)); + }; + } + /** + * Process a response from the native layer. + */ + cap.fromNative = result => { + returnResult(result); + }; + const returnResult = (result) => { + var _a, _b; + if (cap.isLoggingEnabled && result.pluginId !== 'Console') { + cap.logFromNative(result); + } + // get the stored call, if it exists + try { + const storedCall = callbacks.get(result.callbackId); + if (storedCall) { + // looks like we've got a stored call + if (result.error) { + // ensure stacktraces by copying error properties to an Error + result.error = Object.keys(result.error).reduce((err, key) => { + // use any type to avoid importing util and compiling most of .ts files + err[key] = result.error[key]; + return err; + }, new cap.Exception('')); + } + if (typeof storedCall.callback === 'function') { + // callback + if (result.success) { + storedCall.callback(result.data); + } + else { + storedCall.callback(null, result.error); + } + } + else if (typeof storedCall.resolve === 'function') { + // promise + if (result.success) { + storedCall.resolve(result.data); + } + else { + storedCall.reject(result.error); + } + // no need to keep this stored callback + // around for a one time resolve promise + callbacks.delete(result.callbackId); + } + } + else if (!result.success && result.error) { + // no stored callback, but if there was an error let's log it + (_a = win === null || win === void 0 ? void 0 : win.console) === null || _a === void 0 ? void 0 : _a.warn(result.error); + } + if (result.save === false) { + callbacks.delete(result.callbackId); + } + } + catch (e) { + (_b = win === null || win === void 0 ? void 0 : win.console) === null || _b === void 0 ? void 0 : _b.error(e); + } + // always delete to prevent memory leaks + // overkill but we're not sure what apps will do with this data + delete result.data; + delete result.error; + }; + cap.nativeCallback = (pluginName, methodName, options, callback) => { + if (typeof options === 'function') { + console.warn(`Using a callback as the 'options' parameter of 'nativeCallback()' is deprecated.`); + callback = options; + options = null; + } + return cap.toNative(pluginName, methodName, options, { callback }); + }; + cap.nativePromise = (pluginName, methodName, options) => { + return new Promise((resolve, reject) => { + cap.toNative(pluginName, methodName, options, { + resolve: resolve, + reject: reject, + }); + }); + }; + // eslint-disable-next-line @typescript-eslint/no-unused-vars + cap.withPlugin = (_pluginId, _fn) => dummy; + cap.Exception = CapacitorException; + initEvents(win, cap); + initLegacyHandlers(win, cap); + initVendor(win, cap); + win.Capacitor = cap; + } + initNativeBridge(w); + }; + initBridge(typeof globalThis !== 'undefined' + ? globalThis + : typeof self !== 'undefined' + ? self + : typeof window !== 'undefined' + ? window + : typeof global !== 'undefined' + ? global + : {}); + + dummy = initBridge; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; + +})({}); diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/AndroidProtocolHandler.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/AndroidProtocolHandler.java new file mode 100755 index 00000000..df893c7f --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/AndroidProtocolHandler.java @@ -0,0 +1,94 @@ +// Copyright 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package com.getcapacitor; + +import android.content.Context; +import android.content.res.AssetManager; +import android.net.Uri; +import android.util.TypedValue; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +public class AndroidProtocolHandler { + + private Context context; + + public AndroidProtocolHandler(Context context) { + this.context = context; + } + + public InputStream openAsset(String path) throws IOException { + return context.getAssets().open(path, AssetManager.ACCESS_STREAMING); + } + + public InputStream openResource(Uri uri) { + assert uri.getPath() != null; + // The path must be of the form ".../asset_type/asset_name.ext". + List pathSegments = uri.getPathSegments(); + String assetType = pathSegments.get(pathSegments.size() - 2); + String assetName = pathSegments.get(pathSegments.size() - 1); + + // Drop the file extension. + assetName = assetName.split("\\.")[0]; + try { + // Use the application context for resolving the resource package name so that we do + // not use the browser's own resources. Note that if 'context' here belongs to the + // test suite, it does not have a separate application context. In that case we use + // the original context object directly. + if (context.getApplicationContext() != null) { + context = context.getApplicationContext(); + } + int fieldId = getFieldId(context, assetType, assetName); + int valueType = getValueType(context, fieldId); + if (valueType == TypedValue.TYPE_STRING) { + return context.getResources().openRawResource(fieldId); + } else { + Logger.error("Asset not of type string: " + uri); + } + } catch (ClassNotFoundException | IllegalAccessException | NoSuchFieldException e) { + Logger.error("Unable to open resource URL: " + uri, e); + } + return null; + } + + private static int getFieldId(Context context, String assetType, String assetName) + throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException { + Class d = context.getClassLoader().loadClass(context.getPackageName() + ".R$" + assetType); + java.lang.reflect.Field field = d.getField(assetName); + return field.getInt(null); + } + + public InputStream openFile(String filePath) throws IOException { + String realPath = filePath.replace(Bridge.CAPACITOR_FILE_START, ""); + File localFile = new File(realPath); + return new FileInputStream(localFile); + } + + public InputStream openContentUrl(Uri uri) throws IOException { + Integer port = uri.getPort(); + String baseUrl = uri.getScheme() + "://" + uri.getHost(); + if (port != -1) { + baseUrl += ":" + port; + } + String realPath = uri.toString().replace(baseUrl + Bridge.CAPACITOR_CONTENT_START, "content:/"); + + InputStream stream = null; + try { + stream = context.getContentResolver().openInputStream(Uri.parse(realPath)); + } catch (SecurityException e) { + Logger.error("Unable to open content URL: " + uri, e); + } + return stream; + } + + private static int getValueType(Context context, int fieldId) { + TypedValue value = new TypedValue(); + context.getResources().getValue(fieldId, value, true); + return value.type; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/App.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/App.java new file mode 100644 index 00000000..f46b6332 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/App.java @@ -0,0 +1,61 @@ +package com.getcapacitor; + +import androidx.annotation.Nullable; + +public class App { + + /** + * Interface for callbacks when app status changes. + */ + public interface AppStatusChangeListener { + void onAppStatusChanged(Boolean isActive); + } + + /** + * Interface for callbacks when app is restored with pending plugin call. + */ + public interface AppRestoredListener { + void onAppRestored(PluginResult result); + } + + @Nullable + private AppStatusChangeListener statusChangeListener; + + @Nullable + private AppRestoredListener appRestoredListener; + + private boolean isActive = false; + + public boolean isActive() { + return isActive; + } + + /** + * Set the object to receive callbacks. + * @param listener + */ + public void setStatusChangeListener(@Nullable AppStatusChangeListener listener) { + this.statusChangeListener = listener; + } + + /** + * Set the object to receive callbacks. + * @param listener + */ + public void setAppRestoredListener(@Nullable AppRestoredListener listener) { + this.appRestoredListener = listener; + } + + protected void fireRestoredResult(PluginResult result) { + if (appRestoredListener != null) { + appRestoredListener.onAppRestored(result); + } + } + + public void fireStatusChange(boolean isActive) { + this.isActive = isActive; + if (statusChangeListener != null) { + statusChangeListener.onAppStatusChanged(isActive); + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/AppUUID.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/AppUUID.java new file mode 100644 index 00000000..3c1b1db6 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/AppUUID.java @@ -0,0 +1,65 @@ +package com.getcapacitor; + +import android.content.Context; +import android.content.SharedPreferences; +import androidx.appcompat.app.AppCompatActivity; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Objects; +import java.util.UUID; + +public final class AppUUID { + + private static final String KEY = "CapacitorAppUUID"; + + public static String getAppUUID(AppCompatActivity activity) throws Exception { + assertAppUUID(activity); + return readUUID(activity); + } + + public static void regenerateAppUUID(AppCompatActivity activity) throws Exception { + try { + String uuid = generateUUID(); + writeUUID(activity, uuid); + } catch (NoSuchAlgorithmException ex) { + throw new Exception("Capacitor App UUID could not be generated."); + } + } + + private static void assertAppUUID(AppCompatActivity activity) throws Exception { + String uuid = readUUID(activity); + if (uuid.equals("")) { + regenerateAppUUID(activity); + } + } + + private static String generateUUID() throws NoSuchAlgorithmException { + MessageDigest salt = MessageDigest.getInstance("SHA-256"); + salt.update(UUID.randomUUID().toString().getBytes(StandardCharsets.UTF_8)); + return bytesToHex(salt.digest()); + } + + private static String readUUID(AppCompatActivity activity) { + SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE); + return sharedPref.getString(KEY, ""); + } + + private static void writeUUID(AppCompatActivity activity, String uuid) { + SharedPreferences sharedPref = activity.getPreferences(Context.MODE_PRIVATE); + SharedPreferences.Editor editor = sharedPref.edit(); + editor.putString(KEY, uuid); + editor.apply(); + } + + private static String bytesToHex(byte[] bytes) { + byte[] HEX_ARRAY = "0123456789ABCDEF".getBytes(StandardCharsets.US_ASCII); + byte[] hexChars = new byte[bytes.length * 2]; + for (int j = 0; j < bytes.length; j++) { + int v = bytes[j] & 0xFF; + hexChars[j * 2] = HEX_ARRAY[v >>> 4]; + hexChars[j * 2 + 1] = HEX_ARRAY[v & 0x0F]; + } + return new String(hexChars, StandardCharsets.UTF_8); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Bridge.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Bridge.java new file mode 100644 index 00000000..594146a0 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Bridge.java @@ -0,0 +1,1589 @@ +package com.getcapacitor; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.webkit.ValueCallback; +import android.webkit.WebSettings; +import android.webkit.WebView; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContract; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.pm.PackageInfoCompat; +import androidx.fragment.app.Fragment; +import androidx.webkit.WebViewCompat; +import androidx.webkit.WebViewFeature; +import com.getcapacitor.android.R; +import com.getcapacitor.annotation.CapacitorPlugin; +import com.getcapacitor.annotation.Permission; +import com.getcapacitor.cordova.MockCordovaInterfaceImpl; +import com.getcapacitor.cordova.MockCordovaWebViewImpl; +import com.getcapacitor.util.HostMask; +import com.getcapacitor.util.InternalUtils; +import com.getcapacitor.util.PermissionHelper; +import com.getcapacitor.util.WebColor; +import java.io.File; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.cordova.ConfigXmlParser; +import org.apache.cordova.CordovaPreferences; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.PluginEntry; +import org.apache.cordova.PluginManager; +import org.json.JSONException; + +/** + * The Bridge class is the main engine of Capacitor. It manages + * loading and communicating with all Plugins, + * proxying Native events to Plugins, executing Plugin methods, + * communicating with the WebView, and a whole lot more. + * + * Generally, you'll not use Bridge directly, instead, extend from BridgeActivity + * to get a WebView instance and proxy native events automatically. + * + * If you want to use this Bridge in an existing Android app, please + * see the source for BridgeActivity for the methods you'll need to + * pass through to Bridge: + * + * BridgeActivity.java + */ +public class Bridge { + + private static final String PREFS_NAME = "CapacitorSettings"; + private static final String PERMISSION_PREFS_NAME = "PluginPermStates"; + private static final String BUNDLE_LAST_PLUGIN_ID_KEY = "capacitorLastActivityPluginId"; + private static final String BUNDLE_LAST_PLUGIN_CALL_METHOD_NAME_KEY = "capacitorLastActivityPluginMethod"; + private static final String BUNDLE_PLUGIN_CALL_OPTIONS_SAVED_KEY = "capacitorLastPluginCallOptions"; + private static final String BUNDLE_PLUGIN_CALL_BUNDLE_KEY = "capacitorLastPluginCallBundle"; + private static final String LAST_BINARY_VERSION_CODE = "lastBinaryVersionCode"; + private static final String LAST_BINARY_VERSION_NAME = "lastBinaryVersionName"; + private static final String MINIMUM_ANDROID_WEBVIEW_ERROR = "System WebView is not supported"; + + // The name of the directory we use to look for index.html and the rest of our web assets + public static final String DEFAULT_WEB_ASSET_DIR = "public"; + public static final String CAPACITOR_HTTP_SCHEME = "http"; + public static final String CAPACITOR_HTTPS_SCHEME = "https"; + public static final String CAPACITOR_FILE_START = "/_capacitor_file_"; + public static final String CAPACITOR_CONTENT_START = "/_capacitor_content_"; + public static final String CAPACITOR_HTTP_INTERCEPTOR_START = "/_capacitor_http_interceptor_"; + + /** @deprecated CAPACITOR_HTTPS_INTERCEPTOR_START is no longer required. All proxied requests are handled via CAPACITOR_HTTP_INTERCEPTOR_START instead */ + @Deprecated + public static final String CAPACITOR_HTTPS_INTERCEPTOR_START = "/_capacitor_https_interceptor_"; + + public static final String CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM = "u"; + + public static final int DEFAULT_ANDROID_WEBVIEW_VERSION = 60; + public static final int MINIMUM_ANDROID_WEBVIEW_VERSION = 55; + public static final int DEFAULT_HUAWEI_WEBVIEW_VERSION = 10; + public static final int MINIMUM_HUAWEI_WEBVIEW_VERSION = 10; + + // Loaded Capacitor config + private CapConfig config; + + // A reference to the main activity for the app + private final AppCompatActivity context; + // A reference to the containing Fragment if used + private final Fragment fragment; + private WebViewLocalServer localServer; + private String localUrl; + private String appUrl; + private String appUrlConfig; + private HostMask appAllowNavigationMask; + private Set allowedOriginRules = new HashSet(); + private ArrayList authorities = new ArrayList<>(); + // A reference to the main WebView for the app + private final WebView webView; + public final MockCordovaInterfaceImpl cordovaInterface; + private CordovaWebView cordovaWebView; + private CordovaPreferences preferences; + private BridgeWebViewClient webViewClient; + private App app; + + // Our MessageHandler for sending and receiving data to the WebView + private final MessageHandler msgHandler; + + // The ThreadHandler for executing plugin calls + private final HandlerThread handlerThread = new HandlerThread("CapacitorPlugins"); + + // Our Handler for posting plugin calls. Created from the ThreadHandler + private Handler taskHandler = null; + + private final List> initialPlugins; + + private final List pluginInstances; + + // A map of Plugin Id's to PluginHandle's + private Map plugins = new HashMap<>(); + + // Stored plugin calls that we're keeping around to call again someday + private Map savedCalls = new HashMap<>(); + + // The call IDs of saved plugin calls with associated plugin id for handling permissions + private Map> savedPermissionCallIds = new HashMap<>(); + + // Store a plugin that started a new activity, in case we need to resume + // the app and return that data back + private PluginCall pluginCallForLastActivity; + + // Any URI that was passed to the app on start + private Uri intentUri; + + // A list of listeners that trigger when webView events occur + private List webViewListeners = new ArrayList<>(); + + // An interface to manipulate route resolving + private RouteProcessor routeProcessor; + + // A pre-determined path to load the bridge + private ServerPath serverPath; + + /** + * Create the Bridge with a reference to the main {@link Activity} for the + * app, and a reference to the {@link WebView} our app will use. + * @param context + * @param webView + * @deprecated Use {@link Bridge.Builder} to create Bridge instances + */ + @Deprecated + public Bridge( + AppCompatActivity context, + WebView webView, + List> initialPlugins, + MockCordovaInterfaceImpl cordovaInterface, + PluginManager pluginManager, + CordovaPreferences preferences, + CapConfig config + ) { + this(context, null, null, webView, initialPlugins, new ArrayList<>(), cordovaInterface, pluginManager, preferences, config); + } + + private Bridge( + AppCompatActivity context, + ServerPath serverPath, + Fragment fragment, + WebView webView, + List> initialPlugins, + List pluginInstances, + MockCordovaInterfaceImpl cordovaInterface, + PluginManager pluginManager, + CordovaPreferences preferences, + CapConfig config + ) { + this.app = new App(); + this.serverPath = serverPath; + this.context = context; + this.fragment = fragment; + this.webView = webView; + this.webViewClient = new BridgeWebViewClient(this); + this.initialPlugins = initialPlugins; + this.pluginInstances = pluginInstances; + this.cordovaInterface = cordovaInterface; + this.preferences = preferences; + + // Start our plugin execution threads and handlers + handlerThread.start(); + taskHandler = new Handler(handlerThread.getLooper()); + + this.config = config != null ? config : CapConfig.loadDefault(getActivity()); + Logger.init(this.config); + + // Initialize web view and message handler for it + this.initWebView(); + this.setAllowedOriginRules(); + this.msgHandler = new MessageHandler(this, webView, pluginManager); + + // Grab any intent info that our app was launched with + Intent intent = context.getIntent(); + this.intentUri = intent.getData(); + // Register our core plugins + this.registerAllPlugins(); + + this.loadWebView(); + } + + private void setAllowedOriginRules() { + String[] appAllowNavigationConfig = this.config.getAllowNavigation(); + String authority = this.getHost(); + String scheme = this.getScheme(); + allowedOriginRules.add(scheme + "://" + authority); + if (this.getServerUrl() != null) { + allowedOriginRules.add(this.getServerUrl()); + } + if (appAllowNavigationConfig != null) { + for (String allowNavigation : appAllowNavigationConfig) { + if (!allowNavigation.startsWith("http")) { + allowedOriginRules.add("https://" + allowNavigation); + } else { + allowedOriginRules.add(allowNavigation); + } + } + authorities.addAll(Arrays.asList(appAllowNavigationConfig)); + } + this.appAllowNavigationMask = HostMask.Parser.parse(appAllowNavigationConfig); + } + + public App getApp() { + return app; + } + + private void loadWebView() { + final boolean html5mode = this.config.isHTML5Mode(); + + // Start the local web server + JSInjector injector = getJSInjector(); + if (WebViewFeature.isFeatureSupported(WebViewFeature.DOCUMENT_START_SCRIPT)) { + String allowedOrigin = Uri.parse(appUrl).buildUpon().path(null).fragment(null).clearQuery().build().toString(); + try { + WebViewCompat.addDocumentStartJavaScript(webView, injector.getScriptString(), Collections.singleton(allowedOrigin)); + injector = null; + } catch (IllegalArgumentException ex) { + Logger.warn("Invalid url, using fallback"); + } + } + localServer = new WebViewLocalServer(context, this, injector, authorities, html5mode); + localServer.hostAssets(DEFAULT_WEB_ASSET_DIR); + + Logger.debug("Loading app at " + appUrl); + + webView.setWebChromeClient(new BridgeWebChromeClient(this)); + webView.setWebViewClient(this.webViewClient); + + if (!isDeployDisabled() && !isNewBinary()) { + SharedPreferences prefs = getContext() + .getSharedPreferences(com.getcapacitor.plugin.WebView.WEBVIEW_PREFS_NAME, Activity.MODE_PRIVATE); + String path = prefs.getString(com.getcapacitor.plugin.WebView.CAP_SERVER_PATH, null); + if (path != null && !path.isEmpty() && new File(path).exists()) { + setServerBasePath(path); + } + } + if (!this.isMinimumWebViewInstalled()) { + String errorUrl = this.getErrorUrl(); + if (errorUrl != null) { + webView.loadUrl(errorUrl); + return; + } else { + Logger.error(MINIMUM_ANDROID_WEBVIEW_ERROR); + } + } + + // If serverPath configured, start server based on provided path + if (serverPath != null) { + if (serverPath.getType() == ServerPath.PathType.ASSET_PATH) { + setServerAssetPath(serverPath.getPath()); + } else { + setServerBasePath(serverPath.getPath()); + } + } else { + // Get to work + webView.loadUrl(appUrl); + } + } + + @SuppressLint("WebViewApiAvailability") + public boolean isMinimumWebViewInstalled() { + PackageManager pm = getContext().getPackageManager(); + + // Check getCurrentWebViewPackage() directly if above Android 8 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + PackageInfo info = WebView.getCurrentWebViewPackage(); + Pattern pattern = Pattern.compile("(\\d+)"); + Matcher matcher = pattern.matcher(info.versionName); + if (matcher.find()) { + String majorVersionStr = matcher.group(0); + int majorVersion = Integer.parseInt(majorVersionStr); + if (info.packageName.equals("com.huawei.webview")) { + return majorVersion >= config.getMinHuaweiWebViewVersion(); + } + return majorVersion >= config.getMinWebViewVersion(); + } else { + return false; + } + } + + // Otherwise manually check WebView versions + try { + String webViewPackage = "com.google.android.webview"; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + webViewPackage = "com.android.chrome"; + } + PackageInfo info = InternalUtils.getPackageInfo(pm, webViewPackage); + String majorVersionStr = info.versionName.split("\\.")[0]; + int majorVersion = Integer.parseInt(majorVersionStr); + return majorVersion >= config.getMinWebViewVersion(); + } catch (Exception ex) { + Logger.warn("Unable to get package info for 'com.google.android.webview'" + ex.toString()); + } + + try { + PackageInfo info = InternalUtils.getPackageInfo(pm, "com.android.webview"); + String majorVersionStr = info.versionName.split("\\.")[0]; + int majorVersion = Integer.parseInt(majorVersionStr); + return majorVersion >= config.getMinWebViewVersion(); + } catch (Exception ex) { + Logger.warn("Unable to get package info for 'com.android.webview'" + ex.toString()); + } + + final int amazonFireMajorWebViewVersion = extractWebViewMajorVersion(pm, "com.amazon.webview.chromium"); + if (amazonFireMajorWebViewVersion >= config.getMinWebViewVersion()) { + return true; + } + + // Could not detect any webview, return false + return false; + } + + private int extractWebViewMajorVersion(final PackageManager pm, final String webViewPackageName) { + try { + final PackageInfo info = InternalUtils.getPackageInfo(pm, webViewPackageName); + final String majorVersionStr = info.versionName.split("\\.")[0]; + final int majorVersion = Integer.parseInt(majorVersionStr); + return majorVersion; + } catch (Exception ex) { + Logger.warn(String.format("Unable to get package info for '%s' with err '%s'", webViewPackageName, ex)); + } + return 0; + } + + public boolean launchIntent(Uri url) { + /* + * Give plugins the chance to handle the url + */ + for (Map.Entry entry : plugins.entrySet()) { + Plugin plugin = entry.getValue().getInstance(); + if (plugin != null) { + Boolean shouldOverrideLoad = plugin.shouldOverrideLoad(url); + if (shouldOverrideLoad != null) { + return shouldOverrideLoad; + } + } + } + + if (url.getScheme().equals("data") || url.getScheme().equals("blob")) { + return false; + } + + Uri appUri = Uri.parse(appUrl); + if ( + !(appUri.getHost().equals(url.getHost()) && url.getScheme().equals(appUri.getScheme())) && + !appAllowNavigationMask.matches(url.getHost()) + ) { + try { + Intent openIntent = new Intent(Intent.ACTION_VIEW, url); + getContext().startActivity(openIntent); + } catch (ActivityNotFoundException e) { + // TODO - trigger an event + } + return true; + } + return false; + } + + private boolean isNewBinary() { + String versionCode = ""; + String versionName = ""; + SharedPreferences prefs = getContext() + .getSharedPreferences(com.getcapacitor.plugin.WebView.WEBVIEW_PREFS_NAME, Activity.MODE_PRIVATE); + String lastVersionCode = prefs.getString(LAST_BINARY_VERSION_CODE, null); + String lastVersionName = prefs.getString(LAST_BINARY_VERSION_NAME, null); + + try { + PackageManager pm = getContext().getPackageManager(); + PackageInfo pInfo = InternalUtils.getPackageInfo(pm, getContext().getPackageName()); + versionCode = Integer.toString((int) PackageInfoCompat.getLongVersionCode(pInfo)); + versionName = pInfo.versionName; + } catch (Exception ex) { + Logger.error("Unable to get package info", ex); + } + + if (!versionCode.equals(lastVersionCode) || !versionName.equals(lastVersionName)) { + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(LAST_BINARY_VERSION_CODE, versionCode); + editor.putString(LAST_BINARY_VERSION_NAME, versionName); + editor.putString(com.getcapacitor.plugin.WebView.CAP_SERVER_PATH, ""); + editor.apply(); + return true; + } + return false; + } + + public boolean isDeployDisabled() { + return preferences.getBoolean("DisableDeploy", false); + } + + public boolean shouldKeepRunning() { + return preferences.getBoolean("KeepRunning", true); + } + + public void handleAppUrlLoadError(Exception ex) { + if (ex instanceof SocketTimeoutException) { + Logger.error( + "Unable to load app. Ensure the server is running at " + + appUrl + + ", or modify the " + + "appUrl setting in capacitor.config.json (make sure to npx cap copy after to commit changes).", + ex + ); + } + } + + public boolean isDevMode() { + return (getActivity().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + } + + protected void setCordovaWebView(CordovaWebView cordovaWebView) { + this.cordovaWebView = cordovaWebView; + } + + /** + * Get the Context for the App + * @return + */ + public Context getContext() { + return this.context; + } + + /** + * Get the activity for the app + * @return + */ + public AppCompatActivity getActivity() { + return this.context; + } + + /** + * Get the fragment for the app, if applicable. This will likely be null unless Capacitor + * is being used embedded in a Native Android app. + * + * @return The fragment containing the Capacitor WebView. + */ + public Fragment getFragment() { + return this.fragment; + } + + /** + * Get the core WebView under Capacitor's control + * @return + */ + public WebView getWebView() { + return this.webView; + } + + /** + * Get the URI that was used to launch the app (if any) + * @return + */ + public Uri getIntentUri() { + return intentUri; + } + + /** + * Get scheme that is used to serve content + * @return + */ + public String getScheme() { + return this.config.getAndroidScheme(); + } + + /** + * Get host name that is used to serve content + * @return + */ + public String getHost() { + return this.config.getHostname(); + } + + /** + * Get the server url that is used to serve content + * @return + */ + public String getServerUrl() { + return this.config.getServerUrl(); + } + + public String getErrorUrl() { + String errorPath = this.config.getErrorPath(); + + if (errorPath != null && !errorPath.trim().isEmpty()) { + String authority = this.getHost(); + String scheme = this.getScheme(); + + String localUrl = scheme + "://" + authority; + + return localUrl + "/" + errorPath; + } + + return null; + } + + public String getAppUrl() { + return appUrl; + } + + public CapConfig getConfig() { + return this.config; + } + + public void reset() { + savedCalls = new HashMap<>(); + } + + /** + * Initialize the WebView, setting required flags + */ + @SuppressLint("SetJavaScriptEnabled") + private void initWebView() { + WebSettings settings = webView.getSettings(); + settings.setJavaScriptEnabled(true); + settings.setDomStorageEnabled(true); + settings.setGeolocationEnabled(true); + settings.setDatabaseEnabled(true); + settings.setMediaPlaybackRequiresUserGesture(false); + settings.setJavaScriptCanOpenWindowsAutomatically(true); + if (this.config.isMixedContentAllowed()) { + settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); + } + + String appendUserAgent = this.config.getAppendedUserAgentString(); + if (appendUserAgent != null) { + String defaultUserAgent = settings.getUserAgentString(); + settings.setUserAgentString(defaultUserAgent + " " + appendUserAgent); + } + String overrideUserAgent = this.config.getOverriddenUserAgentString(); + if (overrideUserAgent != null) { + settings.setUserAgentString(overrideUserAgent); + } + + String backgroundColor = this.config.getBackgroundColor(); + try { + if (backgroundColor != null) { + webView.setBackgroundColor(WebColor.parseColor(backgroundColor)); + } + } catch (IllegalArgumentException ex) { + Logger.debug("WebView background color not applied"); + } + + settings.setDisplayZoomControls(false); + settings.setBuiltInZoomControls(this.config.isZoomableWebView()); + + if (config.isInitialFocus()) { + webView.requestFocusFromTouch(); + } + + WebView.setWebContentsDebuggingEnabled(this.config.isWebContentsDebuggingEnabled()); + + appUrlConfig = this.getServerUrl(); + String authority = this.getHost(); + authorities.add(authority); + String scheme = this.getScheme(); + + localUrl = scheme + "://" + authority; + + if (appUrlConfig != null) { + try { + URL appUrlObject = new URL(appUrlConfig); + authorities.add(appUrlObject.getAuthority()); + } catch (Exception ex) { + Logger.error("Provided server url is invalid: " + ex.getMessage()); + return; + } + localUrl = appUrlConfig; + appUrl = appUrlConfig; + } else { + appUrl = localUrl; + // custom URL schemes requires path ending with / + if (!scheme.equals(Bridge.CAPACITOR_HTTP_SCHEME) && !scheme.equals(CAPACITOR_HTTPS_SCHEME)) { + appUrl += "/"; + } + } + + String appUrlPath = this.config.getStartPath(); + if (appUrlPath != null && !appUrlPath.trim().isEmpty()) { + appUrl += appUrlPath; + } + } + + /** + * Register our core Plugin APIs + */ + private void registerAllPlugins() { + this.registerPlugin(com.getcapacitor.plugin.CapacitorCookies.class); + this.registerPlugin(com.getcapacitor.plugin.WebView.class); + this.registerPlugin(com.getcapacitor.plugin.CapacitorHttp.class); + + for (Class pluginClass : this.initialPlugins) { + this.registerPlugin(pluginClass); + } + + for (Plugin plugin : pluginInstances) { + registerPluginInstance(plugin); + } + } + + /** + * Register additional plugins + * @param pluginClasses the plugins to register + */ + public void registerPlugins(Class[] pluginClasses) { + for (Class plugin : pluginClasses) { + this.registerPlugin(plugin); + } + } + + public void registerPluginInstances(Plugin[] pluginInstances) { + for (Plugin plugin : pluginInstances) { + this.registerPluginInstance(plugin); + } + } + + @SuppressWarnings("deprecation") + private String getLegacyPluginName(Class pluginClass) { + NativePlugin legacyPluginAnnotation = pluginClass.getAnnotation(NativePlugin.class); + if (legacyPluginAnnotation == null) { + Logger.error("Plugin doesn't have the @CapacitorPlugin annotation. Please add it"); + return null; + } + + return legacyPluginAnnotation.name(); + } + + /** + * Register a plugin class + * @param pluginClass a class inheriting from Plugin + */ + public void registerPlugin(Class pluginClass) { + String pluginId = pluginId(pluginClass); + if (pluginId == null) return; + + try { + this.plugins.put(pluginId, new PluginHandle(this, pluginClass)); + } catch (InvalidPluginException ex) { + logInvalidPluginException(pluginClass); + } catch (PluginLoadException ex) { + logPluginLoadException(pluginClass, ex); + } + } + + public void registerPluginInstance(Plugin plugin) { + Class clazz = plugin.getClass(); + String pluginId = pluginId(clazz); + if (pluginId == null) return; + + try { + this.plugins.put(pluginId, new PluginHandle(this, plugin)); + } catch (InvalidPluginException ex) { + logInvalidPluginException(clazz); + } + } + + private String pluginId(Class clazz) { + String pluginName = pluginName(clazz); + String pluginId = clazz.getSimpleName(); + if (pluginName == null) return null; + + if (!pluginName.equals("")) { + pluginId = pluginName; + } + Logger.debug("Registering plugin instance: " + pluginId); + return pluginId; + } + + private String pluginName(Class clazz) { + String pluginName; + CapacitorPlugin pluginAnnotation = clazz.getAnnotation(CapacitorPlugin.class); + if (pluginAnnotation == null) { + pluginName = this.getLegacyPluginName(clazz); + } else { + pluginName = pluginAnnotation.name(); + } + + return pluginName; + } + + private void logInvalidPluginException(Class clazz) { + Logger.error( + "NativePlugin " + + clazz.getName() + + " is invalid. Ensure the @CapacitorPlugin annotation exists on the plugin class and" + + " the class extends Plugin" + ); + } + + private void logPluginLoadException(Class clazz, Exception ex) { + Logger.error("NativePlugin " + clazz.getName() + " failed to load", ex); + } + + public PluginHandle getPlugin(String pluginId) { + return this.plugins.get(pluginId); + } + + /** + * Find the plugin handle that responds to the given request code. This will + * fire after certain Android OS intent results/permission checks/etc. + * @param requestCode + * @return + */ + @Deprecated + @SuppressWarnings("deprecation") + public PluginHandle getPluginWithRequestCode(int requestCode) { + for (PluginHandle handle : this.plugins.values()) { + int[] requestCodes; + + CapacitorPlugin pluginAnnotation = handle.getPluginAnnotation(); + if (pluginAnnotation == null) { + // Check for legacy plugin annotation, @NativePlugin + NativePlugin legacyPluginAnnotation = handle.getLegacyPluginAnnotation(); + if (legacyPluginAnnotation == null) { + continue; + } + + if (legacyPluginAnnotation.permissionRequestCode() == requestCode) { + return handle; + } + + requestCodes = legacyPluginAnnotation.requestCodes(); + + for (int rc : requestCodes) { + if (rc == requestCode) { + return handle; + } + } + } else { + requestCodes = pluginAnnotation.requestCodes(); + + for (int rc : requestCodes) { + if (rc == requestCode) { + return handle; + } + } + } + } + return null; + } + + /** + * Call a method on a plugin. + * @param pluginId the plugin id to use to lookup the plugin handle + * @param methodName the name of the method to call + * @param call the call object to pass to the method + */ + public void callPluginMethod(String pluginId, final String methodName, final PluginCall call) { + try { + final PluginHandle plugin = this.getPlugin(pluginId); + + if (plugin == null) { + Logger.error("unable to find plugin : " + pluginId); + call.errorCallback("unable to find plugin : " + pluginId); + return; + } + + if (Logger.shouldLog()) { + Logger.verbose( + "callback: " + + call.getCallbackId() + + ", pluginId: " + + plugin.getId() + + ", methodName: " + + methodName + + ", methodData: " + + call.getData().toString() + ); + } + + Runnable currentThreadTask = () -> { + try { + plugin.invoke(methodName, call); + + if (call.isKeptAlive()) { + saveCall(call); + } + } catch (PluginLoadException | InvalidPluginMethodException ex) { + Logger.error("Unable to execute plugin method", ex); + } catch (Exception ex) { + Logger.error("Serious error executing plugin", ex); + throw new RuntimeException(ex); + } + }; + + taskHandler.post(currentThreadTask); + } catch (Exception ex) { + Logger.error(Logger.tags("callPluginMethod"), "error : " + ex, null); + call.errorCallback(ex.toString()); + } + } + + /** + * Evaluate JavaScript in the web view. This method + * executes on the main thread automatically. + * @param js the JS to execute + * @param callback an optional ValueCallback that will synchronously receive a value + * after calling the JS + */ + public void eval(final String js, final ValueCallback callback) { + Handler mainHandler = new Handler(context.getMainLooper()); + mainHandler.post(() -> webView.evaluateJavascript(js, callback)); + } + + public void logToJs(final String message, final String level) { + eval("window.Capacitor.logJs(\"" + message + "\", \"" + level + "\")", null); + } + + public void logToJs(final String message) { + logToJs(message, "log"); + } + + public void triggerJSEvent(final String eventName, final String target) { + eval("window.Capacitor.triggerEvent(\"" + eventName + "\", \"" + target + "\")", s -> {}); + } + + public void triggerJSEvent(final String eventName, final String target, final String data) { + eval("window.Capacitor.triggerEvent(\"" + eventName + "\", \"" + target + "\", " + data + ")", s -> {}); + } + + public void triggerWindowJSEvent(final String eventName) { + this.triggerJSEvent(eventName, "window"); + } + + public void triggerWindowJSEvent(final String eventName, final String data) { + this.triggerJSEvent(eventName, "window", data); + } + + public void triggerDocumentJSEvent(final String eventName) { + this.triggerJSEvent(eventName, "document"); + } + + public void triggerDocumentJSEvent(final String eventName, final String data) { + this.triggerJSEvent(eventName, "document", data); + } + + public void execute(Runnable runnable) { + taskHandler.post(runnable); + } + + public void executeOnMainThread(Runnable runnable) { + Handler mainHandler = new Handler(context.getMainLooper()); + + mainHandler.post(runnable); + } + + /** + * Retain a call between plugin invocations + * @param call + */ + public void saveCall(PluginCall call) { + this.savedCalls.put(call.getCallbackId(), call); + } + + /** + * Get a retained plugin call + * @param callbackId the callbackId to use to lookup the call with + * @return the stored call + */ + public PluginCall getSavedCall(String callbackId) { + if (callbackId == null) { + return null; + } + + return this.savedCalls.get(callbackId); + } + + PluginCall getPluginCallForLastActivity() { + PluginCall pluginCallForLastActivity = this.pluginCallForLastActivity; + this.pluginCallForLastActivity = null; + return pluginCallForLastActivity; + } + + void setPluginCallForLastActivity(PluginCall pluginCallForLastActivity) { + this.pluginCallForLastActivity = pluginCallForLastActivity; + } + + /** + * Release a retained call + * @param call a call to release + */ + public void releaseCall(PluginCall call) { + releaseCall(call.getCallbackId()); + } + + /** + * Release a retained call by its ID + * @param callbackId an ID of a callback to release + */ + public void releaseCall(String callbackId) { + this.savedCalls.remove(callbackId); + } + + /** + * Removes the earliest saved call prior to a permissions request for a given plugin and + * returns it. + * + * @return The saved plugin call + */ + protected PluginCall getPermissionCall(String pluginId) { + LinkedList permissionCallIds = this.savedPermissionCallIds.get(pluginId); + String savedCallId = null; + if (permissionCallIds != null) { + savedCallId = permissionCallIds.poll(); + } + + return getSavedCall(savedCallId); + } + + /** + * Save a call to be retrieved after requesting permissions. Calls are saved in order. + * + * @param call The plugin call to save. + */ + protected void savePermissionCall(PluginCall call) { + if (call != null) { + if (!savedPermissionCallIds.containsKey(call.getPluginId())) { + savedPermissionCallIds.put(call.getPluginId(), new LinkedList<>()); + } + + savedPermissionCallIds.get(call.getPluginId()).add(call.getCallbackId()); + saveCall(call); + } + } + + /** + * Register an Activity Result Launcher to the containing Fragment or Activity. + * + * @param contract A contract specifying that an activity can be called with an input of + * type I and produce an output of type O. + * @param callback The callback run on Activity Result. + * @return A registered Activity Result Launcher. + */ + public ActivityResultLauncher registerForActivityResult( + @NonNull final ActivityResultContract contract, + @NonNull final ActivityResultCallback callback + ) { + if (fragment != null) { + return fragment.registerForActivityResult(contract, callback); + } else { + return context.registerForActivityResult(contract, callback); + } + } + + /** + * Build the JSInjector that will be used to inject JS into files served to the app, + * to ensure that Capacitor's JS and the JS for all the plugins is loaded each time. + */ + private JSInjector getJSInjector() { + try { + String globalJS = JSExport.getGlobalJS(context, config.isLoggingEnabled(), isDevMode()); + String bridgeJS = JSExport.getBridgeJS(context); + String pluginJS = JSExport.getPluginJS(plugins.values()); + String cordovaJS = JSExport.getCordovaJS(context); + String cordovaPluginsJS = JSExport.getCordovaPluginJS(context); + String cordovaPluginsFileJS = JSExport.getCordovaPluginsFileJS(context); + String localUrlJS = "window.WEBVIEW_SERVER_URL = '" + localUrl + "';"; + + return new JSInjector(globalJS, bridgeJS, pluginJS, cordovaJS, cordovaPluginsJS, cordovaPluginsFileJS, localUrlJS); + } catch (Exception ex) { + Logger.error("Unable to export Capacitor JS. App will not function!", ex); + } + return null; + } + + /** + * Restore any saved bundle state data + * @param savedInstanceState + */ + public void restoreInstanceState(Bundle savedInstanceState) { + String lastPluginId = savedInstanceState.getString(BUNDLE_LAST_PLUGIN_ID_KEY); + String lastPluginCallMethod = savedInstanceState.getString(BUNDLE_LAST_PLUGIN_CALL_METHOD_NAME_KEY); + String lastOptionsJson = savedInstanceState.getString(BUNDLE_PLUGIN_CALL_OPTIONS_SAVED_KEY); + + if (lastPluginId != null) { + // If we have JSON blob saved, create a new plugin call with the original options + if (lastOptionsJson != null) { + try { + JSObject options = new JSObject(lastOptionsJson); + + pluginCallForLastActivity = + new PluginCall(msgHandler, lastPluginId, PluginCall.CALLBACK_ID_DANGLING, lastPluginCallMethod, options); + } catch (JSONException ex) { + Logger.error("Unable to restore plugin call, unable to parse persisted JSON object", ex); + } + } + + // Let the plugin restore any state it needs + Bundle bundleData = savedInstanceState.getBundle(BUNDLE_PLUGIN_CALL_BUNDLE_KEY); + PluginHandle lastPlugin = getPlugin(lastPluginId); + if (bundleData != null && lastPlugin != null) { + lastPlugin.getInstance().restoreState(bundleData); + } else { + Logger.error("Unable to restore last plugin call"); + } + } + } + + public void saveInstanceState(Bundle outState) { + Logger.debug("Saving instance state!"); + + // If there was a last PluginCall for a started activity, we need to + // persist it so we can load it again in case our app gets terminated + if (pluginCallForLastActivity != null) { + PluginCall call = pluginCallForLastActivity; + PluginHandle handle = getPlugin(call.getPluginId()); + + if (handle != null) { + Bundle bundle = handle.getInstance().saveInstanceState(); + if (bundle != null) { + outState.putString(BUNDLE_LAST_PLUGIN_ID_KEY, call.getPluginId()); + outState.putString(BUNDLE_LAST_PLUGIN_CALL_METHOD_NAME_KEY, call.getMethodName()); + outState.putString(BUNDLE_PLUGIN_CALL_OPTIONS_SAVED_KEY, call.getData().toString()); + outState.putBundle(BUNDLE_PLUGIN_CALL_BUNDLE_KEY, bundle); + } else { + Logger.error("Couldn't save last " + call.getPluginId() + "'s Plugin " + call.getMethodName() + " call"); + } + } + } + } + + @Deprecated + @SuppressWarnings("deprecation") + public void startActivityForPluginWithResult(PluginCall call, Intent intent, int requestCode) { + Logger.debug("Starting activity for result"); + + pluginCallForLastActivity = call; + + getActivity().startActivityForResult(intent, requestCode); + } + + /** + * Check for legacy Capacitor or Cordova plugins that may have registered to handle a permission + * request, and handle them if so. If not handled, false is returned. + * + * @param requestCode the code that was requested + * @param permissions the permissions requested + * @param grantResults the set of granted/denied permissions + * @return true if permission code was handled by a plugin explicitly, false if not + */ + @SuppressWarnings("deprecation") + boolean onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + PluginHandle plugin = getPluginWithRequestCode(requestCode); + + if (plugin == null) { + boolean permissionHandled = false; + Logger.debug("Unable to find a Capacitor plugin to handle permission requestCode, trying Cordova plugins " + requestCode); + try { + permissionHandled = cordovaInterface.handlePermissionResult(requestCode, permissions, grantResults); + } catch (JSONException e) { + Logger.debug("Error on Cordova plugin permissions request " + e.getMessage()); + } + return permissionHandled; + } + + // Call deprecated method if using deprecated NativePlugin annotation + if (plugin.getPluginAnnotation() == null) { + plugin.getInstance().handleRequestPermissionsResult(requestCode, permissions, grantResults); + return true; + } + + return false; + } + + /** + * Saves permission states and rejects if permissions were not correctly defined in + * the AndroidManifest.xml file. + * + * @param plugin + * @param savedCall + * @param permissions + * @return true if permissions were saved and defined correctly, false if not + */ + protected boolean validatePermissions(Plugin plugin, PluginCall savedCall, Map permissions) { + SharedPreferences prefs = getContext().getSharedPreferences(PERMISSION_PREFS_NAME, Activity.MODE_PRIVATE); + + for (Map.Entry permission : permissions.entrySet()) { + String permString = permission.getKey(); + boolean isGranted = permission.getValue(); + + if (isGranted) { + // Permission granted. If previously denied, remove cached state + String state = prefs.getString(permString, null); + + if (state != null) { + SharedPreferences.Editor editor = prefs.edit(); + editor.remove(permString); + editor.apply(); + } + } else { + SharedPreferences.Editor editor = prefs.edit(); + + if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), permString)) { + // Permission denied, can prompt again with rationale + editor.putString(permString, PermissionState.PROMPT_WITH_RATIONALE.toString()); + } else { + // Permission denied permanently, store this state for future reference + editor.putString(permString, PermissionState.DENIED.toString()); + } + + editor.apply(); + } + } + + String[] permStrings = permissions.keySet().toArray(new String[0]); + + if (!PermissionHelper.hasDefinedPermissions(getContext(), permStrings)) { + StringBuilder builder = new StringBuilder(); + builder.append("Missing the following permissions in AndroidManifest.xml:\n"); + String[] missing = PermissionHelper.getUndefinedPermissions(getContext(), permStrings); + for (String perm : missing) { + builder.append(perm + "\n"); + } + savedCall.reject(builder.toString()); + return false; + } + + return true; + } + + /** + * Helper to check all permissions and see the current states of each permission. + * + * @since 3.0.0 + * @return A mapping of permission aliases to the associated granted status. + */ + protected Map getPermissionStates(Plugin plugin) { + Map permissionsResults = new HashMap<>(); + CapacitorPlugin annotation = plugin.getPluginHandle().getPluginAnnotation(); + for (Permission perm : annotation.permissions()) { + // If a permission is defined with no permission constants, return GRANTED for it. + // Otherwise, get its true state. + if (perm.strings().length == 0 || (perm.strings().length == 1 && perm.strings()[0].isEmpty())) { + String key = perm.alias(); + if (!key.isEmpty()) { + PermissionState existingResult = permissionsResults.get(key); + + // auto set permission state to GRANTED if the alias is empty. + if (existingResult == null) { + permissionsResults.put(key, PermissionState.GRANTED); + } + } + } else { + for (String permString : perm.strings()) { + String key = perm.alias().isEmpty() ? permString : perm.alias(); + PermissionState permissionStatus; + if (ActivityCompat.checkSelfPermission(this.getContext(), permString) == PackageManager.PERMISSION_GRANTED) { + permissionStatus = PermissionState.GRANTED; + } else { + permissionStatus = PermissionState.PROMPT; + + // Check if there is a cached permission state for the "Never ask again" state + SharedPreferences prefs = getContext().getSharedPreferences(PERMISSION_PREFS_NAME, Activity.MODE_PRIVATE); + String state = prefs.getString(permString, null); + + if (state != null) { + permissionStatus = PermissionState.byState(state); + } + } + + PermissionState existingResult = permissionsResults.get(key); + + // multiple permissions with the same alias must all be true, otherwise all false. + if (existingResult == null || existingResult == PermissionState.GRANTED) { + permissionsResults.put(key, permissionStatus); + } + } + } + } + + return permissionsResults; + } + + /** + * Handle an activity result and pass it to a plugin that has indicated it wants to + * handle the result. + * @param requestCode + * @param resultCode + * @param data + */ + @SuppressWarnings("deprecation") + boolean onActivityResult(int requestCode, int resultCode, Intent data) { + PluginHandle plugin = getPluginWithRequestCode(requestCode); + + if (plugin == null || plugin.getInstance() == null) { + Logger.debug("Unable to find a Capacitor plugin to handle requestCode, trying Cordova plugins " + requestCode); + return cordovaInterface.onActivityResult(requestCode, resultCode, data); + } + + // deprecated, to be removed + PluginCall lastCall = plugin.getInstance().getSavedCall(); + + // If we don't have a saved last call (because our app was killed and restarted, for example), + // Then we should see if we have any saved plugin call information and generate a new, + // "dangling" plugin call (a plugin call that doesn't have a corresponding web callback) + // and then send that to the plugin + if (lastCall == null && pluginCallForLastActivity != null) { + plugin.getInstance().saveCall(pluginCallForLastActivity); + } + + plugin.getInstance().handleOnActivityResult(requestCode, resultCode, data); + + // Clear the plugin call we may have re-hydrated on app launch + pluginCallForLastActivity = null; + + return true; + } + + /** + * Handle an onNewIntent lifecycle event and notify the plugins + * @param intent + */ + public void onNewIntent(Intent intent) { + for (PluginHandle plugin : plugins.values()) { + plugin.getInstance().handleOnNewIntent(intent); + } + + if (cordovaWebView != null) { + cordovaWebView.onNewIntent(intent); + } + } + + /** + * Handle an onConfigurationChanged event and notify the plugins + * @param newConfig + */ + public void onConfigurationChanged(Configuration newConfig) { + for (PluginHandle plugin : plugins.values()) { + plugin.getInstance().handleOnConfigurationChanged(newConfig); + } + } + + /** + * Handle onRestart lifecycle event and notify the plugins + */ + public void onRestart() { + for (PluginHandle plugin : plugins.values()) { + plugin.getInstance().handleOnRestart(); + } + } + + /** + * Handle onStart lifecycle event and notify the plugins + */ + public void onStart() { + for (PluginHandle plugin : plugins.values()) { + plugin.getInstance().handleOnStart(); + } + + if (cordovaWebView != null) { + cordovaWebView.handleStart(); + } + } + + /** + * Handle onResume lifecycle event and notify the plugins + */ + public void onResume() { + for (PluginHandle plugin : plugins.values()) { + plugin.getInstance().handleOnResume(); + } + + if (cordovaWebView != null) { + cordovaWebView.handleResume(this.shouldKeepRunning()); + } + } + + /** + * Handle onPause lifecycle event and notify the plugins + */ + public void onPause() { + for (PluginHandle plugin : plugins.values()) { + plugin.getInstance().handleOnPause(); + } + + if (cordovaWebView != null) { + boolean keepRunning = this.shouldKeepRunning() || cordovaInterface.getActivityResultCallback() != null; + cordovaWebView.handlePause(keepRunning); + } + } + + /** + * Handle onStop lifecycle event and notify the plugins + */ + public void onStop() { + for (PluginHandle plugin : plugins.values()) { + plugin.getInstance().handleOnStop(); + } + + if (cordovaWebView != null) { + cordovaWebView.handleStop(); + } + } + + /** + * Handle onDestroy lifecycle event and notify the plugins + */ + public void onDestroy() { + for (PluginHandle plugin : plugins.values()) { + plugin.getInstance().handleOnDestroy(); + } + + handlerThread.quitSafely(); + + if (cordovaWebView != null) { + cordovaWebView.handleDestroy(); + } + } + + /** + * Handle onDetachedFromWindow lifecycle event + */ + public void onDetachedFromWindow() { + webView.removeAllViews(); + webView.destroy(); + } + + public String getServerBasePath() { + return this.localServer.getBasePath(); + } + + /** + * Tell the local server to load files from the given + * file path instead of the assets path. + * @param path + */ + public void setServerBasePath(String path) { + localServer.hostFiles(path); + webView.post(() -> webView.loadUrl(appUrl)); + } + + /** + * Tell the local server to load files from the given + * asset path. + * @param path + */ + public void setServerAssetPath(String path) { + localServer.hostAssets(path); + webView.post(() -> webView.loadUrl(appUrl)); + } + + /** + * Reload the WebView + */ + public void reload() { + webView.post(() -> webView.loadUrl(appUrl)); + } + + public String getLocalUrl() { + return localUrl; + } + + public WebViewLocalServer getLocalServer() { + return localServer; + } + + public HostMask getAppAllowNavigationMask() { + return appAllowNavigationMask; + } + + public Set getAllowedOriginRules() { + return allowedOriginRules; + } + + public BridgeWebViewClient getWebViewClient() { + return this.webViewClient; + } + + public void setWebViewClient(BridgeWebViewClient client) { + this.webViewClient = client; + webView.setWebViewClient(client); + } + + List getWebViewListeners() { + return webViewListeners; + } + + void setWebViewListeners(List webViewListeners) { + this.webViewListeners = webViewListeners; + } + + RouteProcessor getRouteProcessor() { + return routeProcessor; + } + + void setRouteProcessor(RouteProcessor routeProcessor) { + this.routeProcessor = routeProcessor; + } + + ServerPath getServerPath() { + return serverPath; + } + + /** + * Add a listener that the WebViewClient can trigger on certain events. + * @param webViewListener A {@link WebViewListener} to add. + */ + public void addWebViewListener(WebViewListener webViewListener) { + webViewListeners.add(webViewListener); + } + + /** + * Remove a listener that the WebViewClient triggers on certain events. + * @param webViewListener A {@link WebViewListener} to remove. + */ + public void removeWebViewListener(WebViewListener webViewListener) { + webViewListeners.remove(webViewListener); + } + + public static class Builder { + + private Bundle instanceState = null; + private CapConfig config = null; + private List> plugins = new ArrayList<>(); + private List pluginInstances = new ArrayList<>(); + private AppCompatActivity activity; + private Fragment fragment; + private RouteProcessor routeProcessor; + private final List webViewListeners = new ArrayList<>(); + private ServerPath serverPath; + + public Builder(AppCompatActivity activity) { + this.activity = activity; + } + + public Builder(Fragment fragment) { + this.activity = (AppCompatActivity) fragment.getActivity(); + this.fragment = fragment; + } + + public Builder setInstanceState(Bundle instanceState) { + this.instanceState = instanceState; + return this; + } + + public Builder setConfig(CapConfig config) { + this.config = config; + return this; + } + + public Builder setPlugins(List> plugins) { + this.plugins = plugins; + return this; + } + + public Builder addPlugin(Class plugin) { + this.plugins.add(plugin); + return this; + } + + public Builder addPlugins(List> plugins) { + for (Class cls : plugins) { + this.addPlugin(cls); + } + + return this; + } + + public Builder addPluginInstance(Plugin plugin) { + this.pluginInstances.add(plugin); + return this; + } + + public Builder addPluginInstances(List plugins) { + this.pluginInstances.addAll(plugins); + return this; + } + + public Builder addWebViewListener(WebViewListener webViewListener) { + webViewListeners.add(webViewListener); + return this; + } + + public Builder addWebViewListeners(List webViewListeners) { + for (WebViewListener listener : webViewListeners) { + this.addWebViewListener(listener); + } + + return this; + } + + public Builder setRouteProcessor(RouteProcessor routeProcessor) { + this.routeProcessor = routeProcessor; + return this; + } + + public Builder setServerPath(ServerPath serverPath) { + this.serverPath = serverPath; + return this; + } + + public Bridge create() { + // Cordova initialization + ConfigXmlParser parser = new ConfigXmlParser(); + parser.parse(activity.getApplicationContext()); + CordovaPreferences preferences = parser.getPreferences(); + preferences.setPreferencesBundle(activity.getIntent().getExtras()); + List pluginEntries = parser.getPluginEntries(); + + MockCordovaInterfaceImpl cordovaInterface = new MockCordovaInterfaceImpl(activity); + if (instanceState != null) { + cordovaInterface.restoreInstanceState(instanceState); + } + + WebView webView = this.fragment != null ? fragment.getView().findViewById(R.id.webview) : activity.findViewById(R.id.webview); + MockCordovaWebViewImpl mockWebView = new MockCordovaWebViewImpl(activity.getApplicationContext()); + mockWebView.init(cordovaInterface, pluginEntries, preferences, webView); + PluginManager pluginManager = mockWebView.getPluginManager(); + cordovaInterface.onCordovaInit(pluginManager); + + // Bridge initialization + Bridge bridge = new Bridge( + activity, + serverPath, + fragment, + webView, + plugins, + pluginInstances, + cordovaInterface, + pluginManager, + preferences, + config + ); + + if (webView instanceof CapacitorWebView) { + CapacitorWebView capacitorWebView = (CapacitorWebView) webView; + capacitorWebView.setBridge(bridge); + } + + bridge.setCordovaWebView(mockWebView); + bridge.setWebViewListeners(webViewListeners); + bridge.setRouteProcessor(routeProcessor); + + if (instanceState != null) { + bridge.restoreInstanceState(instanceState); + } + + return bridge; + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java new file mode 100644 index 00000000..dcb1b56a --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeActivity.java @@ -0,0 +1,212 @@ +package com.getcapacitor; + +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import com.getcapacitor.android.R; +import java.util.ArrayList; +import java.util.List; + +public class BridgeActivity extends AppCompatActivity { + + protected Bridge bridge; + protected boolean keepRunning = true; + protected CapConfig config; + + protected int activityDepth = 0; + protected List> initialPlugins = new ArrayList<>(); + protected final Bridge.Builder bridgeBuilder = new Bridge.Builder(this); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + bridgeBuilder.setInstanceState(savedInstanceState); + getApplication().setTheme(R.style.AppTheme_NoActionBar); + setTheme(R.style.AppTheme_NoActionBar); + try { + setContentView(R.layout.bridge_layout_main); + } catch (Exception ex) { + setContentView(R.layout.no_webview); + return; + } + + PluginManager loader = new PluginManager(getAssets()); + + try { + bridgeBuilder.addPlugins(loader.loadPluginClasses()); + } catch (PluginLoadException ex) { + Logger.error("Error loading plugins.", ex); + } + + this.load(); + } + + protected void load() { + Logger.debug("Starting BridgeActivity"); + + bridge = bridgeBuilder.addPlugins(initialPlugins).setConfig(config).create(); + + this.keepRunning = bridge.shouldKeepRunning(); + this.onNewIntent(getIntent()); + } + + public void registerPlugin(Class plugin) { + bridgeBuilder.addPlugin(plugin); + } + + public void registerPlugins(List> plugins) { + bridgeBuilder.addPlugins(plugins); + } + + public Bridge getBridge() { + return this.bridge; + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + bridge.saveInstanceState(outState); + } + + @Override + public void onStart() { + super.onStart(); + activityDepth++; + if (this.bridge != null) { + this.bridge.onStart(); + Logger.debug("App started"); + } + } + + @Override + public void onRestart() { + super.onRestart(); + this.bridge.onRestart(); + Logger.debug("App restarted"); + } + + @Override + public void onResume() { + super.onResume(); + if (bridge != null) { + bridge.getApp().fireStatusChange(true); + this.bridge.onResume(); + Logger.debug("App resumed"); + } + } + + @Override + public void onPause() { + super.onPause(); + if (bridge != null) { + this.bridge.onPause(); + Logger.debug("App paused"); + } + } + + @Override + public void onStop() { + super.onStop(); + if (bridge != null) { + activityDepth = Math.max(0, activityDepth - 1); + if (activityDepth == 0) { + bridge.getApp().fireStatusChange(false); + } + + this.bridge.onStop(); + Logger.debug("App stopped"); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (this.bridge != null) { + this.bridge.onDestroy(); + Logger.debug("App destroyed"); + } + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + this.bridge.onDetachedFromWindow(); + } + + /** + * Handles permission request results. + * + * Capacitor is backwards compatible such that plugins using legacy permission request codes + * may coexist with plugins using the AndroidX Activity v1.2 permission callback flow introduced + * in Capacitor 3.0. + * + * In this method, plugins are checked first for ownership of the legacy permission request code. + * If the {@link Bridge#onRequestPermissionsResult(int, String[], int[])} method indicates it has + * handled the permission, then the permission callback will be considered complete. Otherwise, + * the permission will be handled using the AndroidX Activity flow. + * + * @param requestCode the request code associated with the permission request + * @param permissions the Android permission strings requested + * @param grantResults the status result of the permission request + */ + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + if (this.bridge == null) { + return; + } + + if (!bridge.onRequestPermissionsResult(requestCode, permissions, grantResults)) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + } + } + + /** + * Handles activity results. + * + * Capacitor is backwards compatible such that plugins using legacy activity result codes + * may coexist with plugins using the AndroidX Activity v1.2 activity callback flow introduced + * in Capacitor 3.0. + * + * In this method, plugins are checked first for ownership of the legacy request code. If the + * {@link Bridge#onActivityResult(int, int, Intent)} method indicates it has handled the activity + * result, then the callback will be considered complete. Otherwise, the result will be handled + * using the AndroidX Activiy flow. + * + * @param requestCode the request code associated with the activity result + * @param resultCode the result code + * @param data any data included with the activity result + */ + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (this.bridge == null) { + return; + } + + if (!bridge.onActivityResult(requestCode, resultCode, data)) { + super.onActivityResult(requestCode, resultCode, data); + } + } + + @Override + protected void onNewIntent(Intent intent) { + super.onNewIntent(intent); + + if (this.bridge == null || intent == null) { + return; + } + + this.bridge.onNewIntent(intent); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + if (this.bridge == null) { + return; + } + + this.bridge.onConfigurationChanged(newConfig); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeFragment.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeFragment.java new file mode 100644 index 00000000..f269bd56 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeFragment.java @@ -0,0 +1,134 @@ +package com.getcapacitor; + +import android.content.Context; +import android.content.res.TypedArray; +import android.os.Bundle; +import android.util.AttributeSet; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import androidx.fragment.app.Fragment; +import com.getcapacitor.android.R; +import java.util.ArrayList; +import java.util.List; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link BridgeFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class BridgeFragment extends Fragment { + + private static final String ARG_START_DIR = "startDir"; + + protected Bridge bridge; + protected boolean keepRunning = true; + + private final List> initialPlugins = new ArrayList<>(); + private CapConfig config = null; + + private final List webViewListeners = new ArrayList<>(); + + public BridgeFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param startDir the directory to serve content from + * @return A new instance of fragment BridgeFragment. + */ + public static BridgeFragment newInstance(String startDir) { + BridgeFragment fragment = new BridgeFragment(); + Bundle args = new Bundle(); + args.putString(ARG_START_DIR, startDir); + fragment.setArguments(args); + return fragment; + } + + public void addPlugin(Class plugin) { + this.initialPlugins.add(plugin); + } + + public void setConfig(CapConfig config) { + this.config = config; + } + + public Bridge getBridge() { + return bridge; + } + + public void addWebViewListener(WebViewListener webViewListener) { + webViewListeners.add(webViewListener); + } + + /** + * Load the WebView and create the Bridge + */ + protected void load(Bundle savedInstanceState) { + Logger.debug("Loading Bridge with BridgeFragment"); + + Bundle args = getArguments(); + String startDir = null; + + if (args != null) { + startDir = getArguments().getString(ARG_START_DIR); + } + + bridge = + new Bridge.Builder(this) + .setInstanceState(savedInstanceState) + .setPlugins(initialPlugins) + .setConfig(config) + .addWebViewListeners(webViewListeners) + .create(); + + if (startDir != null) { + bridge.setServerAssetPath(startDir); + } + + this.keepRunning = bridge.shouldKeepRunning(); + } + + @Override + public void onInflate(Context context, AttributeSet attrs, Bundle savedInstanceState) { + super.onInflate(context, attrs, savedInstanceState); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.bridge_fragment); + CharSequence c = a.getString(R.styleable.bridge_fragment_start_dir); + + if (c != null) { + String startDir = c.toString(); + Bundle args = new Bundle(); + args.putString(ARG_START_DIR, startDir); + setArguments(args); + } + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_bridge, container, false); + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + this.load(savedInstanceState); + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (this.bridge != null) { + this.bridge.onDestroy(); + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java new file mode 100644 index 00000000..400b65a0 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeWebChromeClient.java @@ -0,0 +1,510 @@ +package com.getcapacitor; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.AlertDialog; +import android.content.ActivityNotFoundException; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.MediaStore; +import android.view.View; +import android.webkit.ConsoleMessage; +import android.webkit.GeolocationPermissions; +import android.webkit.JsPromptResult; +import android.webkit.JsResult; +import android.webkit.MimeTypeMap; +import android.webkit.PermissionRequest; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebView; +import android.widget.EditText; +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultCallback; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.core.content.FileProvider; +import com.getcapacitor.util.PermissionHelper; +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * Custom WebChromeClient handler, required for showing dialogs, confirms, etc. in our + * WebView instance. + */ +public class BridgeWebChromeClient extends WebChromeClient { + + private interface PermissionListener { + void onPermissionSelect(Boolean isGranted); + } + + private interface ActivityResultListener { + void onActivityResult(ActivityResult result); + } + + private ActivityResultLauncher permissionLauncher; + private ActivityResultLauncher activityLauncher; + private PermissionListener permissionListener; + private ActivityResultListener activityListener; + + private Bridge bridge; + + public BridgeWebChromeClient(Bridge bridge) { + this.bridge = bridge; + + ActivityResultCallback> permissionCallback = (Map isGranted) -> { + if (permissionListener != null) { + boolean granted = true; + for (Map.Entry permission : isGranted.entrySet()) { + if (!permission.getValue()) granted = false; + } + permissionListener.onPermissionSelect(granted); + } + }; + + permissionLauncher = bridge.registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), permissionCallback); + activityLauncher = + bridge.registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (activityListener != null) { + activityListener.onActivityResult(result); + } + } + ); + } + + /** + * Render web content in `view`. + * + * Both this method and {@link #onHideCustomView()} are required for + * rendering web content in full screen. + * + * @see onShowCustomView() docs + */ + @Override + public void onShowCustomView(View view, CustomViewCallback callback) { + callback.onCustomViewHidden(); + super.onShowCustomView(view, callback); + } + + /** + * Render web content in the original Web View again. + * + * Do not remove this method--@see #onShowCustomView(View, CustomViewCallback). + */ + @Override + public void onHideCustomView() { + super.onHideCustomView(); + } + + @Override + public void onPermissionRequest(final PermissionRequest request) { + boolean isRequestPermissionRequired = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M; + + List permissionList = new ArrayList<>(); + if (Arrays.asList(request.getResources()).contains("android.webkit.resource.VIDEO_CAPTURE")) { + permissionList.add(Manifest.permission.CAMERA); + } + if (Arrays.asList(request.getResources()).contains("android.webkit.resource.AUDIO_CAPTURE")) { + permissionList.add(Manifest.permission.MODIFY_AUDIO_SETTINGS); + permissionList.add(Manifest.permission.RECORD_AUDIO); + } + if (!permissionList.isEmpty() && isRequestPermissionRequired) { + String[] permissions = permissionList.toArray(new String[0]); + permissionListener = + isGranted -> { + if (isGranted) { + request.grant(request.getResources()); + } else { + request.deny(); + } + }; + permissionLauncher.launch(permissions); + } else { + request.grant(request.getResources()); + } + } + + /** + * Show the browser alert modal + * @param view + * @param url + * @param message + * @param result + * @return + */ + @Override + public boolean onJsAlert(WebView view, String url, String message, final JsResult result) { + if (bridge.getActivity().isFinishing()) { + return true; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); + builder + .setMessage(message) + .setPositiveButton( + "OK", + (dialog, buttonIndex) -> { + dialog.dismiss(); + result.confirm(); + } + ) + .setOnCancelListener( + dialog -> { + dialog.dismiss(); + result.cancel(); + } + ); + + AlertDialog dialog = builder.create(); + + dialog.show(); + + return true; + } + + /** + * Show the browser confirm modal + * @param view + * @param url + * @param message + * @param result + * @return + */ + @Override + public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) { + if (bridge.getActivity().isFinishing()) { + return true; + } + + final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); + + builder + .setMessage(message) + .setPositiveButton( + "OK", + (dialog, buttonIndex) -> { + dialog.dismiss(); + result.confirm(); + } + ) + .setNegativeButton( + "Cancel", + (dialog, buttonIndex) -> { + dialog.dismiss(); + result.cancel(); + } + ) + .setOnCancelListener( + dialog -> { + dialog.dismiss(); + result.cancel(); + } + ); + + AlertDialog dialog = builder.create(); + + dialog.show(); + + return true; + } + + /** + * Show the browser prompt modal + * @param view + * @param url + * @param message + * @param defaultValue + * @param result + * @return + */ + @Override + public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, final JsPromptResult result) { + if (bridge.getActivity().isFinishing()) { + return true; + } + + final AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); + final EditText input = new EditText(view.getContext()); + + builder + .setMessage(message) + .setView(input) + .setPositiveButton( + "OK", + (dialog, buttonIndex) -> { + dialog.dismiss(); + + String inputText1 = input.getText().toString().trim(); + result.confirm(inputText1); + } + ) + .setNegativeButton( + "Cancel", + (dialog, buttonIndex) -> { + dialog.dismiss(); + result.cancel(); + } + ) + .setOnCancelListener( + dialog -> { + dialog.dismiss(); + result.cancel(); + } + ); + + AlertDialog dialog = builder.create(); + + dialog.show(); + + return true; + } + + /** + * Handle the browser geolocation permission prompt + * @param origin + * @param callback + */ + @Override + public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { + super.onGeolocationPermissionsShowPrompt(origin, callback); + Logger.debug("onGeolocationPermissionsShowPrompt: DOING IT HERE FOR ORIGIN: " + origin); + final String[] geoPermissions = { Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION }; + + if (!PermissionHelper.hasPermissions(bridge.getContext(), geoPermissions)) { + permissionListener = + isGranted -> { + if (isGranted) { + callback.invoke(origin, true, false); + } else { + final String[] coarsePermission = { Manifest.permission.ACCESS_COARSE_LOCATION }; + if ( + Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && + PermissionHelper.hasPermissions(bridge.getContext(), coarsePermission) + ) { + callback.invoke(origin, true, false); + } else { + callback.invoke(origin, false, false); + } + } + }; + permissionLauncher.launch(geoPermissions); + } else { + // permission is already granted + callback.invoke(origin, true, false); + Logger.debug("onGeolocationPermissionsShowPrompt: has required permission"); + } + } + + @Override + public boolean onShowFileChooser( + WebView webView, + final ValueCallback filePathCallback, + final FileChooserParams fileChooserParams + ) { + List acceptTypes = Arrays.asList(fileChooserParams.getAcceptTypes()); + boolean captureEnabled = fileChooserParams.isCaptureEnabled(); + boolean capturePhoto = captureEnabled && acceptTypes.contains("image/*"); + final boolean captureVideo = captureEnabled && acceptTypes.contains("video/*"); + if ((capturePhoto || captureVideo)) { + if (isMediaCaptureSupported()) { + showMediaCaptureOrFilePicker(filePathCallback, fileChooserParams, captureVideo); + } else { + permissionListener = + isGranted -> { + if (isGranted) { + showMediaCaptureOrFilePicker(filePathCallback, fileChooserParams, captureVideo); + } else { + Logger.warn(Logger.tags("FileChooser"), "Camera permission not granted"); + filePathCallback.onReceiveValue(null); + } + }; + final String[] camPermission = { Manifest.permission.CAMERA }; + permissionLauncher.launch(camPermission); + } + } else { + showFilePicker(filePathCallback, fileChooserParams); + } + + return true; + } + + private boolean isMediaCaptureSupported() { + String[] permissions = { Manifest.permission.CAMERA }; + return ( + PermissionHelper.hasPermissions(bridge.getContext(), permissions) || + !PermissionHelper.hasDefinedPermission(bridge.getContext(), Manifest.permission.CAMERA) + ); + } + + private void showMediaCaptureOrFilePicker(ValueCallback filePathCallback, FileChooserParams fileChooserParams, boolean isVideo) { + // TODO: add support for video capture on Android M and older + // On Android M and lower the VIDEO_CAPTURE_INTENT (e.g.: intent.getData()) + // returns a file:// URI instead of the expected content:// URI. + // So we disable it for now because it requires a bit more work + boolean isVideoCaptureSupported = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N; + boolean shown = false; + if (isVideo && isVideoCaptureSupported) { + shown = showVideoCapturePicker(filePathCallback); + } else { + shown = showImageCapturePicker(filePathCallback); + } + if (!shown) { + Logger.warn(Logger.tags("FileChooser"), "Media capture intent could not be launched. Falling back to default file picker."); + showFilePicker(filePathCallback, fileChooserParams); + } + } + + @SuppressLint("QueryPermissionsNeeded") + private boolean showImageCapturePicker(final ValueCallback filePathCallback) { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + if (takePictureIntent.resolveActivity(bridge.getActivity().getPackageManager()) == null) { + return false; + } + + final Uri imageFileUri; + try { + imageFileUri = createImageFileUri(); + } catch (Exception ex) { + Logger.error("Unable to create temporary media capture file: " + ex.getMessage()); + return false; + } + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri); + activityListener = + activityResult -> { + Uri[] result = null; + if (activityResult.getResultCode() == Activity.RESULT_OK) { + result = new Uri[] { imageFileUri }; + } + filePathCallback.onReceiveValue(result); + }; + activityLauncher.launch(takePictureIntent); + + return true; + } + + @SuppressLint("QueryPermissionsNeeded") + private boolean showVideoCapturePicker(final ValueCallback filePathCallback) { + Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE); + if (takeVideoIntent.resolveActivity(bridge.getActivity().getPackageManager()) == null) { + return false; + } + + activityListener = + activityResult -> { + Uri[] result = null; + if (activityResult.getResultCode() == Activity.RESULT_OK) { + result = new Uri[] { activityResult.getData().getData() }; + } + filePathCallback.onReceiveValue(result); + }; + activityLauncher.launch(takeVideoIntent); + + return true; + } + + private void showFilePicker(final ValueCallback filePathCallback, FileChooserParams fileChooserParams) { + Intent intent = fileChooserParams.createIntent(); + if (fileChooserParams.getMode() == FileChooserParams.MODE_OPEN_MULTIPLE) { + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true); + } + if (fileChooserParams.getAcceptTypes().length > 1 || intent.getType().startsWith(".")) { + String[] validTypes = getValidTypes(fileChooserParams.getAcceptTypes()); + intent.putExtra(Intent.EXTRA_MIME_TYPES, validTypes); + if (intent.getType().startsWith(".")) { + intent.setType(validTypes[0]); + } + } + try { + activityListener = + activityResult -> { + Uri[] result; + Intent resultIntent = activityResult.getData(); + if (activityResult.getResultCode() == Activity.RESULT_OK && resultIntent.getClipData() != null) { + final int numFiles = resultIntent.getClipData().getItemCount(); + result = new Uri[numFiles]; + for (int i = 0; i < numFiles; i++) { + result[i] = resultIntent.getClipData().getItemAt(i).getUri(); + } + } else { + result = WebChromeClient.FileChooserParams.parseResult(activityResult.getResultCode(), resultIntent); + } + filePathCallback.onReceiveValue(result); + }; + activityLauncher.launch(intent); + } catch (ActivityNotFoundException e) { + filePathCallback.onReceiveValue(null); + } + } + + private String[] getValidTypes(String[] currentTypes) { + List validTypes = new ArrayList<>(); + MimeTypeMap mtm = MimeTypeMap.getSingleton(); + for (String mime : currentTypes) { + if (mime.startsWith(".")) { + String extension = mime.substring(1); + String extensionMime = mtm.getMimeTypeFromExtension(extension); + if (extensionMime != null && !validTypes.contains(extensionMime)) { + validTypes.add(extensionMime); + } + } else if (!validTypes.contains(mime)) { + validTypes.add(mime); + } + } + Object[] validObj = validTypes.toArray(); + return Arrays.copyOf(validObj, validObj.length, String[].class); + } + + @Override + public boolean onConsoleMessage(ConsoleMessage consoleMessage) { + String tag = Logger.tags("Console"); + if (consoleMessage.message() != null && isValidMsg(consoleMessage.message())) { + String msg = String.format( + "File: %s - Line %d - Msg: %s", + consoleMessage.sourceId(), + consoleMessage.lineNumber(), + consoleMessage.message() + ); + String level = consoleMessage.messageLevel().name(); + if ("ERROR".equalsIgnoreCase(level)) { + Logger.error(tag, msg, null); + } else if ("WARNING".equalsIgnoreCase(level)) { + Logger.warn(tag, msg); + } else if ("TIP".equalsIgnoreCase(level)) { + Logger.debug(tag, msg); + } else { + Logger.info(tag, msg); + } + } + return true; + } + + public boolean isValidMsg(String msg) { + return !( + msg.contains("%cresult %c") || + (msg.contains("%cnative %c")) || + msg.equalsIgnoreCase("[object Object]") || + msg.equalsIgnoreCase("console.groupEnd") + ); + } + + private Uri createImageFileUri() throws IOException { + Activity activity = bridge.getActivity(); + File photoFile = createImageFile(activity); + return FileProvider.getUriForFile(activity, bridge.getContext().getPackageName() + ".fileprovider", photoFile); + } + + private File createImageFile(Activity activity) throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES); + + return File.createTempFile(imageFileName, ".jpg", storageDir); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeWebViewClient.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeWebViewClient.java new file mode 100644 index 00000000..c434247a --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/BridgeWebViewClient.java @@ -0,0 +1,111 @@ +package com.getcapacitor; + +import android.graphics.Bitmap; +import android.net.Uri; +import android.webkit.RenderProcessGoneDetail; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import java.util.List; + +public class BridgeWebViewClient extends WebViewClient { + + private Bridge bridge; + + public BridgeWebViewClient(Bridge bridge) { + this.bridge = bridge; + } + + @Override + public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { + return bridge.getLocalServer().shouldInterceptRequest(request); + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + Uri url = request.getUrl(); + return bridge.launchIntent(url); + } + + @Deprecated + @Override + public boolean shouldOverrideUrlLoading(WebView view, String url) { + return bridge.launchIntent(Uri.parse(url)); + } + + @Override + public void onPageFinished(WebView view, String url) { + super.onPageFinished(view, url); + List webViewListeners = bridge.getWebViewListeners(); + + if (webViewListeners != null && view.getProgress() == 100) { + for (WebViewListener listener : bridge.getWebViewListeners()) { + listener.onPageLoaded(view); + } + } + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + super.onReceivedError(view, request, error); + + List webViewListeners = bridge.getWebViewListeners(); + if (webViewListeners != null) { + for (WebViewListener listener : bridge.getWebViewListeners()) { + listener.onReceivedError(view); + } + } + + String errorPath = bridge.getErrorUrl(); + if (errorPath != null && request.isForMainFrame()) { + view.loadUrl(errorPath); + } + } + + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + super.onPageStarted(view, url, favicon); + bridge.reset(); + List webViewListeners = bridge.getWebViewListeners(); + + if (webViewListeners != null) { + for (WebViewListener listener : bridge.getWebViewListeners()) { + listener.onPageStarted(view); + } + } + } + + @Override + public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { + super.onReceivedHttpError(view, request, errorResponse); + + List webViewListeners = bridge.getWebViewListeners(); + if (webViewListeners != null) { + for (WebViewListener listener : bridge.getWebViewListeners()) { + listener.onReceivedHttpError(view); + } + } + + String errorPath = bridge.getErrorUrl(); + if (errorPath != null && request.isForMainFrame()) { + view.loadUrl(errorPath); + } + } + + @Override + public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail) { + super.onRenderProcessGone(view, detail); + boolean result = false; + + List webViewListeners = bridge.getWebViewListeners(); + if (webViewListeners != null) { + for (WebViewListener listener : bridge.getWebViewListeners()) { + result = listener.onRenderProcessGone(view, detail) || result; + } + } + + return result; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/CapConfig.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/CapConfig.java new file mode 100644 index 00000000..28645340 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/CapConfig.java @@ -0,0 +1,683 @@ +package com.getcapacitor; + +import static com.getcapacitor.Bridge.CAPACITOR_HTTPS_SCHEME; +import static com.getcapacitor.Bridge.DEFAULT_ANDROID_WEBVIEW_VERSION; +import static com.getcapacitor.Bridge.DEFAULT_HUAWEI_WEBVIEW_VERSION; +import static com.getcapacitor.Bridge.MINIMUM_ANDROID_WEBVIEW_VERSION; +import static com.getcapacitor.Bridge.MINIMUM_HUAWEI_WEBVIEW_VERSION; +import static com.getcapacitor.FileUtils.readFileFromAssets; + +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.res.AssetManager; +import androidx.annotation.Nullable; +import com.getcapacitor.util.JSONUtils; +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Represents the configuration options for Capacitor + */ +public class CapConfig { + + private static final String LOG_BEHAVIOR_NONE = "none"; + private static final String LOG_BEHAVIOR_DEBUG = "debug"; + private static final String LOG_BEHAVIOR_PRODUCTION = "production"; + + // Server Config + private boolean html5mode = true; + private String serverUrl; + private String hostname = "localhost"; + private String androidScheme = CAPACITOR_HTTPS_SCHEME; + private String[] allowNavigation; + + // Android Config + private String overriddenUserAgentString; + private String appendedUserAgentString; + private String backgroundColor; + private boolean allowMixedContent = false; + private boolean captureInput = false; + private boolean webContentsDebuggingEnabled = false; + private boolean loggingEnabled = true; + private boolean initialFocus = true; + private boolean useLegacyBridge = false; + private int minWebViewVersion = DEFAULT_ANDROID_WEBVIEW_VERSION; + private int minHuaweiWebViewVersion = DEFAULT_HUAWEI_WEBVIEW_VERSION; + private String errorPath; + private boolean zoomableWebView = false; + + // Embedded + private String startPath; + + // Plugins + private Map pluginsConfiguration = null; + + // Config Object JSON (legacy) + private JSONObject configJSON = new JSONObject(); + + /** + * Constructs an empty config file. + */ + private CapConfig() {} + + /** + * Get an instance of the Config file object. + * @deprecated use {@link #loadDefault(Context)} to load an instance of the Config object + * from the capacitor.config.json file, or use the {@link CapConfig.Builder} to construct + * a CapConfig for embedded use. + * + * @param assetManager The AssetManager used to load the config file + * @param config JSON describing a configuration to use + */ + @Deprecated + public CapConfig(AssetManager assetManager, JSONObject config) { + if (config != null) { + this.configJSON = config; + } else { + // Load the capacitor.config.json + loadConfigFromAssets(assetManager, null); + } + + deserializeConfig(null); + } + + /** + * Constructs a Capacitor Configuration from config.json file. + * + * @param context The context. + * @return A loaded config file, if successful. + */ + public static CapConfig loadDefault(Context context) { + CapConfig config = new CapConfig(); + + if (context == null) { + Logger.error("Capacitor Config could not be created from file. Context must not be null."); + return config; + } + + config.loadConfigFromAssets(context.getAssets(), null); + config.deserializeConfig(context); + return config; + } + + /** + * Constructs a Capacitor Configuration from config.json file within the app assets. + * + * @param context The context. + * @param path A path relative to the root assets directory. + * @return A loaded config file, if successful. + */ + public static CapConfig loadFromAssets(Context context, String path) { + CapConfig config = new CapConfig(); + + if (context == null) { + Logger.error("Capacitor Config could not be created from file. Context must not be null."); + return config; + } + + config.loadConfigFromAssets(context.getAssets(), path); + config.deserializeConfig(context); + return config; + } + + /** + * Constructs a Capacitor Configuration from config.json file within the app file-space. + * + * @param context The context. + * @param path A path relative to the root of the app file-space. + * @return A loaded config file, if successful. + */ + public static CapConfig loadFromFile(Context context, String path) { + CapConfig config = new CapConfig(); + + if (context == null) { + Logger.error("Capacitor Config could not be created from file. Context must not be null."); + return config; + } + + config.loadConfigFromFile(path); + config.deserializeConfig(context); + return config; + } + + /** + * Constructs a Capacitor Configuration using ConfigBuilder. + * + * @param builder A config builder initialized with values + */ + private CapConfig(Builder builder) { + // Server Config + this.html5mode = builder.html5mode; + this.serverUrl = builder.serverUrl; + this.hostname = builder.hostname; + + if (this.validateScheme(builder.androidScheme)) { + this.androidScheme = builder.androidScheme; + } + + this.allowNavigation = builder.allowNavigation; + + // Android Config + this.overriddenUserAgentString = builder.overriddenUserAgentString; + this.appendedUserAgentString = builder.appendedUserAgentString; + this.backgroundColor = builder.backgroundColor; + this.allowMixedContent = builder.allowMixedContent; + this.captureInput = builder.captureInput; + this.webContentsDebuggingEnabled = builder.webContentsDebuggingEnabled; + this.loggingEnabled = builder.loggingEnabled; + this.initialFocus = builder.initialFocus; + this.useLegacyBridge = builder.useLegacyBridge; + this.minWebViewVersion = builder.minWebViewVersion; + this.minHuaweiWebViewVersion = builder.minHuaweiWebViewVersion; + this.errorPath = builder.errorPath; + this.zoomableWebView = builder.zoomableWebView; + + // Embedded + this.startPath = builder.startPath; + + // Plugins Config + this.pluginsConfiguration = builder.pluginsConfiguration; + } + + /** + * Loads a Capacitor Configuration JSON file into a Capacitor Configuration object. + * An optional path string can be provided to look for the config in a subdirectory path. + */ + private void loadConfigFromAssets(AssetManager assetManager, String path) { + if (path == null) { + path = ""; + } else { + // Add slash at the end to form a proper file path if going deeper in assets dir + if (path.charAt(path.length() - 1) != '/') { + path = path + "/"; + } + } + + try { + String jsonString = readFileFromAssets(assetManager, path + "capacitor.config.json"); + configJSON = new JSONObject(jsonString); + } catch (IOException ex) { + Logger.error("Unable to load capacitor.config.json. Run npx cap copy first", ex); + } catch (JSONException ex) { + Logger.error("Unable to parse capacitor.config.json. Make sure it's valid json", ex); + } + } + + /** + * Loads a Capacitor Configuration JSON file into a Capacitor Configuration object. + * An optional path string can be provided to look for the config in a subdirectory path. + */ + private void loadConfigFromFile(String path) { + if (path == null) { + path = ""; + } else { + // Add slash at the end to form a proper file path if going deeper in assets dir + if (path.charAt(path.length() - 1) != '/') { + path = path + "/"; + } + } + + try { + File configFile = new File(path + "capacitor.config.json"); + String jsonString = FileUtils.readFileFromDisk(configFile); + configJSON = new JSONObject(jsonString); + } catch (JSONException ex) { + Logger.error("Unable to parse capacitor.config.json. Make sure it's valid json", ex); + } catch (IOException ex) { + Logger.error("Unable to load capacitor.config.json.", ex); + } + } + + /** + * Deserializes the config from JSON into a Capacitor Configuration object. + */ + private void deserializeConfig(@Nullable Context context) { + boolean isDebug = context != null && (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + + // Server + html5mode = JSONUtils.getBoolean(configJSON, "server.html5mode", html5mode); + serverUrl = JSONUtils.getString(configJSON, "server.url", null); + hostname = JSONUtils.getString(configJSON, "server.hostname", hostname); + errorPath = JSONUtils.getString(configJSON, "server.errorPath", null); + + String configSchema = JSONUtils.getString(configJSON, "server.androidScheme", androidScheme); + if (this.validateScheme(configSchema)) { + androidScheme = configSchema; + } + + allowNavigation = JSONUtils.getArray(configJSON, "server.allowNavigation", null); + + // Android + overriddenUserAgentString = + JSONUtils.getString(configJSON, "android.overrideUserAgent", JSONUtils.getString(configJSON, "overrideUserAgent", null)); + appendedUserAgentString = + JSONUtils.getString(configJSON, "android.appendUserAgent", JSONUtils.getString(configJSON, "appendUserAgent", null)); + backgroundColor = + JSONUtils.getString(configJSON, "android.backgroundColor", JSONUtils.getString(configJSON, "backgroundColor", null)); + allowMixedContent = + JSONUtils.getBoolean( + configJSON, + "android.allowMixedContent", + JSONUtils.getBoolean(configJSON, "allowMixedContent", allowMixedContent) + ); + minWebViewVersion = JSONUtils.getInt(configJSON, "android.minWebViewVersion", DEFAULT_ANDROID_WEBVIEW_VERSION); + minHuaweiWebViewVersion = JSONUtils.getInt(configJSON, "android.minHuaweiWebViewVersion", DEFAULT_HUAWEI_WEBVIEW_VERSION); + captureInput = JSONUtils.getBoolean(configJSON, "android.captureInput", captureInput); + useLegacyBridge = JSONUtils.getBoolean(configJSON, "android.useLegacyBridge", useLegacyBridge); + webContentsDebuggingEnabled = JSONUtils.getBoolean(configJSON, "android.webContentsDebuggingEnabled", isDebug); + zoomableWebView = JSONUtils.getBoolean(configJSON, "android.zoomEnabled", JSONUtils.getBoolean(configJSON, "zoomEnabled", false)); + + String logBehavior = JSONUtils.getString( + configJSON, + "android.loggingBehavior", + JSONUtils.getString(configJSON, "loggingBehavior", LOG_BEHAVIOR_DEBUG) + ); + switch (logBehavior.toLowerCase(Locale.ROOT)) { + case LOG_BEHAVIOR_PRODUCTION: + loggingEnabled = true; + break; + case LOG_BEHAVIOR_NONE: + loggingEnabled = false; + break; + default: // LOG_BEHAVIOR_DEBUG + loggingEnabled = isDebug; + } + + initialFocus = JSONUtils.getBoolean(configJSON, "android.initialFocus", initialFocus); + + // Plugins + pluginsConfiguration = deserializePluginsConfig(JSONUtils.getObject(configJSON, "plugins")); + } + + private boolean validateScheme(String scheme) { + List invalidSchemes = Arrays.asList("file", "ftp", "ftps", "ws", "wss", "about", "blob", "data"); + if (invalidSchemes.contains(scheme)) { + Logger.warn(scheme + " is not an allowed scheme. Defaulting to https."); + return false; + } + + // Non-http(s) schemes are not allowed to modify the URL path as of Android Webview 117 + if (!scheme.equals("http") && !scheme.equals("https")) { + Logger.warn( + "Using a non-standard scheme: " + scheme + " for Android. This is known to cause issues as of Android Webview 117." + ); + } + + return true; + } + + public boolean isHTML5Mode() { + return html5mode; + } + + public String getServerUrl() { + return serverUrl; + } + + public String getErrorPath() { + return errorPath; + } + + public String getHostname() { + return hostname; + } + + public String getStartPath() { + return startPath; + } + + public String getAndroidScheme() { + return androidScheme; + } + + public String[] getAllowNavigation() { + return allowNavigation; + } + + public String getOverriddenUserAgentString() { + return overriddenUserAgentString; + } + + public String getAppendedUserAgentString() { + return appendedUserAgentString; + } + + public String getBackgroundColor() { + return backgroundColor; + } + + public boolean isMixedContentAllowed() { + return allowMixedContent; + } + + public boolean isInputCaptured() { + return captureInput; + } + + public boolean isWebContentsDebuggingEnabled() { + return webContentsDebuggingEnabled; + } + + public boolean isZoomableWebView() { + return zoomableWebView; + } + + public boolean isLoggingEnabled() { + return loggingEnabled; + } + + public boolean isInitialFocus() { + return initialFocus; + } + + public boolean isUsingLegacyBridge() { + return useLegacyBridge; + } + + public int getMinWebViewVersion() { + if (minWebViewVersion < MINIMUM_ANDROID_WEBVIEW_VERSION) { + Logger.warn("Specified minimum webview version is too low, defaulting to " + MINIMUM_ANDROID_WEBVIEW_VERSION); + return MINIMUM_ANDROID_WEBVIEW_VERSION; + } + + return minWebViewVersion; + } + + public int getMinHuaweiWebViewVersion() { + if (minHuaweiWebViewVersion < MINIMUM_HUAWEI_WEBVIEW_VERSION) { + Logger.warn("Specified minimum Huawei webview version is too low, defaulting to " + MINIMUM_HUAWEI_WEBVIEW_VERSION); + return MINIMUM_HUAWEI_WEBVIEW_VERSION; + } + + return minHuaweiWebViewVersion; + } + + public PluginConfig getPluginConfiguration(String pluginId) { + PluginConfig pluginConfig = pluginsConfiguration.get(pluginId); + if (pluginConfig == null) { + pluginConfig = new PluginConfig(new JSONObject()); + } + + return pluginConfig; + } + + /** + * Get a JSON object value from the Capacitor config. + * @deprecated use {@link PluginConfig#getObject(String)} to access plugin config values. + * For main Capacitor config values, use the appropriate getter. + * + * @param key A key to fetch from the config + * @return The value from the config, if exists. Null if not + */ + @Deprecated + public JSONObject getObject(String key) { + try { + return configJSON.getJSONObject(key); + } catch (Exception ex) {} + return null; + } + + /** + * Get a string value from the Capacitor config. + * @deprecated use {@link PluginConfig#getString(String, String)} to access plugin config + * values. For main Capacitor config values, use the appropriate getter. + * + * @param key A key to fetch from the config + * @return The value from the config, if exists. Null if not + */ + @Deprecated + public String getString(String key) { + return JSONUtils.getString(configJSON, key, null); + } + + /** + * Get a string value from the Capacitor config. + * @deprecated use {@link PluginConfig#getString(String, String)} to access plugin config + * values. For main Capacitor config values, use the appropriate getter. + * + * @param key A key to fetch from the config + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + @Deprecated + public String getString(String key, String defaultValue) { + return JSONUtils.getString(configJSON, key, defaultValue); + } + + /** + * Get a boolean value from the Capacitor config. + * @deprecated use {@link PluginConfig#getBoolean(String, boolean)} to access plugin config + * values. For main Capacitor config values, use the appropriate getter. + * + * @param key A key to fetch from the config + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + @Deprecated + public boolean getBoolean(String key, boolean defaultValue) { + return JSONUtils.getBoolean(configJSON, key, defaultValue); + } + + /** + * Get an integer value from the Capacitor config. + * @deprecated use {@link PluginConfig#getInt(String, int)} to access the plugin config + * values. For main Capacitor config values, use the appropriate getter. + * + * @param key A key to fetch from the config + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + @Deprecated + public int getInt(String key, int defaultValue) { + return JSONUtils.getInt(configJSON, key, defaultValue); + } + + /** + * Get a string array value from the Capacitor config. + * @deprecated use {@link PluginConfig#getArray(String)} to access the plugin config + * values. For main Capacitor config values, use the appropriate getter. + * + * @param key A key to fetch from the config + * @return The value from the config, if exists. Null if not + */ + @Deprecated + public String[] getArray(String key) { + return JSONUtils.getArray(configJSON, key, null); + } + + /** + * Get a string array value from the Capacitor config. + * @deprecated use {@link PluginConfig#getArray(String, String[])} to access the plugin + * config values. For main Capacitor config values, use the appropriate getter. + * + * @param key A key to fetch from the config + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + @Deprecated + public String[] getArray(String key, String[] defaultValue) { + return JSONUtils.getArray(configJSON, key, defaultValue); + } + + private static Map deserializePluginsConfig(JSONObject pluginsConfig) { + Map pluginsMap = new HashMap<>(); + + // return an empty map if there is no pluginsConfig json + if (pluginsConfig == null) { + return pluginsMap; + } + + Iterator pluginIds = pluginsConfig.keys(); + + while (pluginIds.hasNext()) { + String pluginId = pluginIds.next(); + JSONObject value = null; + + try { + value = pluginsConfig.getJSONObject(pluginId); + PluginConfig pluginConfig = new PluginConfig(value); + pluginsMap.put(pluginId, pluginConfig); + } catch (JSONException e) { + e.printStackTrace(); + } + } + + return pluginsMap; + } + + /** + * Builds a Capacitor Configuration in code + */ + public static class Builder { + + private Context context; + + // Server Config Values + private boolean html5mode = true; + private String serverUrl; + private String errorPath; + private String hostname = "localhost"; + private String androidScheme = CAPACITOR_HTTPS_SCHEME; + private String[] allowNavigation; + + // Android Config Values + private String overriddenUserAgentString; + private String appendedUserAgentString; + private String backgroundColor; + private boolean allowMixedContent = false; + private boolean captureInput = false; + private Boolean webContentsDebuggingEnabled = null; + private boolean loggingEnabled = true; + private boolean initialFocus = false; + private boolean useLegacyBridge = false; + private int minWebViewVersion = DEFAULT_ANDROID_WEBVIEW_VERSION; + private int minHuaweiWebViewVersion = DEFAULT_HUAWEI_WEBVIEW_VERSION; + private boolean zoomableWebView = false; + + // Embedded + private String startPath = null; + + // Plugins Config Object + private Map pluginsConfiguration = new HashMap<>(); + + /** + * Constructs a new CapConfig Builder. + * + * @param context The context + */ + public Builder(Context context) { + this.context = context; + } + + /** + * Builds a Capacitor Config from the builder. + * + * @return A new Capacitor Config + */ + public CapConfig create() { + if (webContentsDebuggingEnabled == null) { + webContentsDebuggingEnabled = (context.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0; + } + + return new CapConfig(this); + } + + public Builder setPluginsConfiguration(JSONObject pluginsConfiguration) { + this.pluginsConfiguration = deserializePluginsConfig(pluginsConfiguration); + return this; + } + + public Builder setHTML5mode(boolean html5mode) { + this.html5mode = html5mode; + return this; + } + + public Builder setServerUrl(String serverUrl) { + this.serverUrl = serverUrl; + return this; + } + + public Builder setErrorPath(String errorPath) { + this.errorPath = errorPath; + return this; + } + + public Builder setHostname(String hostname) { + this.hostname = hostname; + return this; + } + + public Builder setStartPath(String path) { + this.startPath = path; + return this; + } + + public Builder setAndroidScheme(String androidScheme) { + this.androidScheme = androidScheme; + return this; + } + + public Builder setAllowNavigation(String[] allowNavigation) { + this.allowNavigation = allowNavigation; + return this; + } + + public Builder setOverriddenUserAgentString(String overriddenUserAgentString) { + this.overriddenUserAgentString = overriddenUserAgentString; + return this; + } + + public Builder setAppendedUserAgentString(String appendedUserAgentString) { + this.appendedUserAgentString = appendedUserAgentString; + return this; + } + + public Builder setBackgroundColor(String backgroundColor) { + this.backgroundColor = backgroundColor; + return this; + } + + public Builder setAllowMixedContent(boolean allowMixedContent) { + this.allowMixedContent = allowMixedContent; + return this; + } + + public Builder setCaptureInput(boolean captureInput) { + this.captureInput = captureInput; + return this; + } + + public Builder setUseLegacyBridge(boolean useLegacyBridge) { + this.useLegacyBridge = useLegacyBridge; + return this; + } + + public Builder setWebContentsDebuggingEnabled(boolean webContentsDebuggingEnabled) { + this.webContentsDebuggingEnabled = webContentsDebuggingEnabled; + return this; + } + + public Builder setZoomableWebView(boolean zoomableWebView) { + this.zoomableWebView = zoomableWebView; + return this; + } + + public Builder setLoggingEnabled(boolean enabled) { + this.loggingEnabled = enabled; + return this; + } + + public Builder setInitialFocus(boolean focus) { + this.initialFocus = focus; + return this; + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/CapacitorWebView.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/CapacitorWebView.java new file mode 100644 index 00000000..e46b904a --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/CapacitorWebView.java @@ -0,0 +1,52 @@ +package com.getcapacitor; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.view.inputmethod.BaseInputConnection; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputConnection; +import android.webkit.WebView; + +public class CapacitorWebView extends WebView { + + private BaseInputConnection capInputConnection; + private Bridge bridge; + + public CapacitorWebView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public void setBridge(Bridge bridge) { + this.bridge = bridge; + } + + @Override + public InputConnection onCreateInputConnection(EditorInfo outAttrs) { + CapConfig config; + if (bridge != null) { + config = bridge.getConfig(); + } else { + config = CapConfig.loadDefault(getContext()); + } + + boolean captureInput = config.isInputCaptured(); + if (captureInput) { + if (capInputConnection == null) { + capInputConnection = new BaseInputConnection(this, false); + } + return capInputConnection; + } + return super.onCreateInputConnection(outAttrs); + } + + @Override + @SuppressWarnings("deprecation") + public boolean dispatchKeyEvent(KeyEvent event) { + if (event.getAction() == KeyEvent.ACTION_MULTIPLE) { + evaluateJavascript("document.activeElement.value = document.activeElement.value + '" + event.getCharacters() + "';", null); + return false; + } + return super.dispatchKeyEvent(event); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java new file mode 100644 index 00000000..47add8cd --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/FileUtils.java @@ -0,0 +1,292 @@ +/** + * Portions adopted from react-native-image-crop-picker + * + * MIT License + + * Copyright (c) 2017 Ivan Pusic + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.getcapacitor; + +import android.content.ContentUris; +import android.content.Context; +import android.content.res.AssetManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.Environment; +import android.provider.DocumentsContract; +import android.provider.MediaStore; +import android.provider.OpenableColumns; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +/** + * Common File utilities, such as resolve content URIs and + * creating portable web paths from low-level files + */ +public class FileUtils { + + private static String CapacitorFileScheme = Bridge.CAPACITOR_FILE_START; + + public enum Type { + IMAGE("image"); + + private String type; + + Type(String type) { + this.type = type; + } + } + + public static String getPortablePath(Context c, String host, Uri u) { + String path = getFileUrlForUri(c, u); + if (path.startsWith("file://")) { + path = path.replace("file://", ""); + } + return host + Bridge.CAPACITOR_FILE_START + path; + } + + public static String getFileUrlForUri(final Context context, final Uri uri) { + // DocumentProvider + if (DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + if ("primary".equalsIgnoreCase(type)) { + return legacyPrimaryPath(split[1]); + } else { + final int splitIndex = docId.indexOf(':', 1); + final String tag = docId.substring(0, splitIndex); + final String path = docId.substring(splitIndex + 1); + + String nonPrimaryVolume = getPathToNonPrimaryVolume(context, tag); + if (nonPrimaryVolume != null) { + String result = nonPrimaryVolume + "/" + path; + File file = new File(result); + if (file.exists() && file.canRead()) { + return result; + } + return null; + } + } + } + // DownloadsProvider + else if (isDownloadsDocument(uri)) { + final String id = DocumentsContract.getDocumentId(uri); + final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); + + return getDataColumn(context, contentUri, null, null); + } + // MediaProvider + else if (isMediaDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if ("video".equals(type)) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if ("audio".equals(type)) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + } + + final String selection = "_id=?"; + final String[] selectionArgs = new String[] { split[1] }; + + return getDataColumn(context, contentUri, selection, selectionArgs); + } + } + // MediaStore (and general) + else if ("content".equalsIgnoreCase(uri.getScheme())) { + // Return the remote address + if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); + return getDataColumn(context, uri, null, null); + } + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) { + return uri.getPath(); + } + + return null; + } + + @SuppressWarnings("deprecation") + private static String legacyPrimaryPath(String pathPart) { + return Environment.getExternalStorageDirectory() + "/" + pathPart; + } + + /** + * Read a plaintext file from the assets directory. + * + * @param assetManager Used to open the file. + * @param fileName The path of the file to read. + * @return The contents of the file path. + * @throws IOException Thrown if any issues reading the provided file path. + */ + static String readFileFromAssets(AssetManager assetManager, String fileName) throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(assetManager.open(fileName)))) { + StringBuilder buffer = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + buffer.append(line).append("\n"); + } + + return buffer.toString(); + } + } + + /** + * Read a plaintext file from within the app disk space. + * + * @param file The file to read. + * @return The contents of the file path. + * @throws IOException Thrown if any issues reading the provided file path. + */ + static String readFileFromDisk(File file) throws IOException { + try (BufferedReader reader = new BufferedReader(new FileReader(file))) { + StringBuilder buffer = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + buffer.append(line).append("\n"); + } + + return buffer.toString(); + } + } + + /** + * Get the value of the data column for this Uri. This is useful for + * MediaStore Uris, and other file-based ContentProviders. + * + * @param context The context. + * @param uri The Uri to query. + * @param selection (Optional) Filter used in the query. + * @param selectionArgs (Optional) Selection arguments used in the query. + * @return The value of the _data column, which is typically a file path. + */ + private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { + String path = null; + Cursor cursor = null; + final String column = "_data"; + final String[] projection = { column }; + + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); + if (cursor != null && cursor.moveToFirst()) { + final int index = cursor.getColumnIndexOrThrow(column); + path = cursor.getString(index); + } + } catch (IllegalArgumentException ex) { + return getCopyFilePath(uri, context); + } finally { + if (cursor != null) cursor.close(); + } + if (path == null) { + return getCopyFilePath(uri, context); + } + return path; + } + + private static String getCopyFilePath(Uri uri, Context context) { + Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); + int nameIndex = cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME); + cursor.moveToFirst(); + String name = (cursor.getString(nameIndex)); + File file = new File(context.getFilesDir(), name); + try { + InputStream inputStream = context.getContentResolver().openInputStream(uri); + FileOutputStream outputStream = new FileOutputStream(file); + int read = 0; + int maxBufferSize = 1024 * 1024; + int bufferSize = Math.min(inputStream.available(), maxBufferSize); + final byte[] buffers = new byte[bufferSize]; + while ((read = inputStream.read(buffers)) != -1) { + outputStream.write(buffers, 0, read); + } + inputStream.close(); + outputStream.close(); + } catch (Exception e) { + return null; + } finally { + if (cursor != null) cursor.close(); + } + return file.getPath(); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is ExternalStorageProvider. + */ + private static boolean isExternalStorageDocument(Uri uri) { + return "com.android.externalstorage.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is DownloadsProvider. + */ + private static boolean isDownloadsDocument(Uri uri) { + return "com.android.providers.downloads.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is MediaProvider. + */ + private static boolean isMediaDocument(Uri uri) { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is Google Photos. + */ + private static boolean isGooglePhotosUri(Uri uri) { + return "com.google.android.apps.photos.content".equals(uri.getAuthority()); + } + + private static String getPathToNonPrimaryVolume(Context context, String tag) { + File[] volumes = context.getExternalCacheDirs(); + if (volumes != null) { + for (File volume : volumes) { + if (volume != null) { + String path = volume.getAbsolutePath(); + if (path != null) { + int index = path.indexOf(tag); + if (index != -1) { + return path.substring(0, index) + tag; + } + } + } + } + } + return null; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/InvalidPluginException.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/InvalidPluginException.java new file mode 100644 index 00000000..1757e326 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/InvalidPluginException.java @@ -0,0 +1,8 @@ +package com.getcapacitor; + +class InvalidPluginException extends Exception { + + public InvalidPluginException(String s) { + super(s); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/InvalidPluginMethodException.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/InvalidPluginMethodException.java new file mode 100644 index 00000000..94be491e --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/InvalidPluginMethodException.java @@ -0,0 +1,16 @@ +package com.getcapacitor; + +class InvalidPluginMethodException extends Exception { + + public InvalidPluginMethodException(String s) { + super(s); + } + + public InvalidPluginMethodException(Throwable t) { + super(t); + } + + public InvalidPluginMethodException(String s, Throwable t) { + super(s, t); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSArray.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSArray.java new file mode 100644 index 00000000..06b7f4dd --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSArray.java @@ -0,0 +1,51 @@ +package com.getcapacitor; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.json.JSONArray; +import org.json.JSONException; + +public class JSArray extends JSONArray { + + public JSArray() { + super(); + } + + public JSArray(String json) throws JSONException { + super(json); + } + + public JSArray(Collection copyFrom) { + super(copyFrom); + } + + public JSArray(Object array) throws JSONException { + super(array); + } + + @SuppressWarnings("unchecked") + public List toList() throws JSONException { + List items = new ArrayList<>(); + Object o = null; + for (int i = 0; i < this.length(); i++) { + o = this.get(i); + try { + items.add((E) this.get(i)); + } catch (Exception ex) { + throw new JSONException("Not all items are instances of the given type"); + } + } + return items; + } + + /** + * Create a new JSArray without throwing a error + */ + public static JSArray from(Object array) { + try { + return new JSArray(array); + } catch (JSONException ex) {} + return null; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSExport.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSExport.java new file mode 100644 index 00000000..382f4b5d --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSExport.java @@ -0,0 +1,193 @@ +package com.getcapacitor; + +import static com.getcapacitor.FileUtils.readFileFromAssets; + +import android.content.Context; +import android.text.TextUtils; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class JSExport { + + private static String CATCHALL_OPTIONS_PARAM = "_options"; + private static String CALLBACK_PARAM = "_callback"; + + public static String getGlobalJS(Context context, boolean loggingEnabled, boolean isDebug) { + return "window.Capacitor = { DEBUG: " + isDebug + ", isLoggingEnabled: " + loggingEnabled + ", Plugins: {} };"; + } + + public static String getCordovaJS(Context context) { + String fileContent = ""; + try { + fileContent = readFileFromAssets(context.getAssets(), "public/cordova.js"); + } catch (IOException ex) { + Logger.error("Unable to read public/cordova.js file, Cordova plugins will not work"); + } + return fileContent; + } + + public static String getCordovaPluginsFileJS(Context context) { + String fileContent = ""; + try { + fileContent = readFileFromAssets(context.getAssets(), "public/cordova_plugins.js"); + } catch (IOException ex) { + Logger.error("Unable to read public/cordova_plugins.js file, Cordova plugins will not work"); + } + return fileContent; + } + + public static String getPluginJS(Collection plugins) { + List lines = new ArrayList<>(); + JSONArray pluginArray = new JSONArray(); + + lines.add("// Begin: Capacitor Plugin JS"); + for (PluginHandle plugin : plugins) { + lines.add( + "(function(w) {\n" + + "var a = (w.Capacitor = w.Capacitor || {});\n" + + "var p = (a.Plugins = a.Plugins || {});\n" + + "var t = (p['" + + plugin.getId() + + "'] = {});\n" + + "t.addListener = function(eventName, callback) {\n" + + " return w.Capacitor.addListener('" + + plugin.getId() + + "', eventName, callback);\n" + + "}" + ); + Collection methods = plugin.getMethods(); + for (PluginMethodHandle method : methods) { + if (method.getName().equals("addListener") || method.getName().equals("removeListener")) { + // Don't export add/remove listener, we do that automatically above as they are "special snowflakes" + continue; + } + lines.add(generateMethodJS(plugin, method)); + } + + lines.add("})(window);\n"); + pluginArray.put(createPluginHeader(plugin)); + } + + return TextUtils.join("\n", lines) + "\nwindow.Capacitor.PluginHeaders = " + pluginArray.toString() + ";"; + } + + public static String getCordovaPluginJS(Context context) { + return getFilesContent(context, "public/plugins"); + } + + public static String getFilesContent(Context context, String path) { + StringBuilder builder = new StringBuilder(); + try { + String[] content = context.getAssets().list(path); + if (content.length > 0) { + for (String file : content) { + if (!file.endsWith(".map")) { + builder.append(getFilesContent(context, path + "/" + file)); + } + } + } else { + return readFileFromAssets(context.getAssets(), path); + } + } catch (IOException ex) { + Logger.warn("Unable to read file at path " + path); + } + return builder.toString(); + } + + private static JSONObject createPluginHeader(PluginHandle plugin) { + JSONObject pluginObj = new JSONObject(); + Collection methods = plugin.getMethods(); + try { + String id = plugin.getId(); + JSONArray methodArray = new JSONArray(); + pluginObj.put("name", id); + + for (PluginMethodHandle method : methods) { + methodArray.put(createPluginMethodHeader(method)); + } + + pluginObj.put("methods", methodArray); + } catch (JSONException e) { + // ignore + } + return pluginObj; + } + + private static JSONObject createPluginMethodHeader(PluginMethodHandle method) { + JSONObject methodObj = new JSONObject(); + + try { + methodObj.put("name", method.getName()); + if (!method.getReturnType().equals(PluginMethod.RETURN_NONE)) { + methodObj.put("rtype", method.getReturnType()); + } + } catch (JSONException e) { + // ignore + } + + return methodObj; + } + + public static String getBridgeJS(Context context) throws JSExportException { + return getFilesContent(context, "native-bridge.js"); + } + + private static String generateMethodJS(PluginHandle plugin, PluginMethodHandle method) { + List lines = new ArrayList<>(); + + List args = new ArrayList<>(); + // Add the catch all param that will take a full javascript object to pass to the plugin + args.add(CATCHALL_OPTIONS_PARAM); + + String returnType = method.getReturnType(); + if (returnType.equals(PluginMethod.RETURN_CALLBACK)) { + args.add(CALLBACK_PARAM); + } + + // Create the method function declaration + lines.add("t['" + method.getName() + "'] = function(" + TextUtils.join(", ", args) + ") {"); + + switch (returnType) { + case PluginMethod.RETURN_NONE: + lines.add( + "return w.Capacitor.nativeCallback('" + + plugin.getId() + + "', '" + + method.getName() + + "', " + + CATCHALL_OPTIONS_PARAM + + ")" + ); + break; + case PluginMethod.RETURN_PROMISE: + lines.add( + "return w.Capacitor.nativePromise('" + plugin.getId() + "', '" + method.getName() + "', " + CATCHALL_OPTIONS_PARAM + ")" + ); + break; + case PluginMethod.RETURN_CALLBACK: + lines.add( + "return w.Capacitor.nativeCallback('" + + plugin.getId() + + "', '" + + method.getName() + + "', " + + CATCHALL_OPTIONS_PARAM + + ", " + + CALLBACK_PARAM + + ")" + ); + break; + default: + // TODO: Do something here? + } + + lines.add("}"); + + return TextUtils.join("\n", lines); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSExportException.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSExportException.java new file mode 100644 index 00000000..14b6043a --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSExportException.java @@ -0,0 +1,16 @@ +package com.getcapacitor; + +public class JSExportException extends Exception { + + public JSExportException(String s) { + super(s); + } + + public JSExportException(Throwable t) { + super(t); + } + + public JSExportException(String s, Throwable t) { + super(s, t); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSInjector.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSInjector.java new file mode 100644 index 00000000..a3871f7b --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSInjector.java @@ -0,0 +1,107 @@ +package com.getcapacitor; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; + +/** + * JSInject is responsible for returning Capacitor's core + * runtime JS and any plugin JS back into HTML page responses + * to the client. + */ +class JSInjector { + + private String globalJS; + private String bridgeJS; + private String pluginJS; + private String cordovaJS; + private String cordovaPluginsJS; + private String cordovaPluginsFileJS; + private String localUrlJS; + + public JSInjector( + String globalJS, + String bridgeJS, + String pluginJS, + String cordovaJS, + String cordovaPluginsJS, + String cordovaPluginsFileJS, + String localUrlJS + ) { + this.globalJS = globalJS; + this.bridgeJS = bridgeJS; + this.pluginJS = pluginJS; + this.cordovaJS = cordovaJS; + this.cordovaPluginsJS = cordovaPluginsJS; + this.cordovaPluginsFileJS = cordovaPluginsFileJS; + this.localUrlJS = localUrlJS; + } + + /** + * Generates injectable JS content. + * This may be used in other forms of injecting that aren't using an InputStream. + * @return + */ + public String getScriptString() { + return ( + globalJS + + "\n\n" + + localUrlJS + + "\n\n" + + bridgeJS + + "\n\n" + + pluginJS + + "\n\n" + + cordovaJS + + "\n\n" + + cordovaPluginsFileJS + + "\n\n" + + cordovaPluginsJS + ); + } + + /** + * Given an InputStream from the web server, prepend it with + * our JS stream + * @param responseStream + * @return + */ + public InputStream getInjectedStream(InputStream responseStream) { + String js = ""; + String html = this.readAssetStream(responseStream); + + // Insert the js string at the position after or before using StringBuilder + StringBuilder modifiedHtml = new StringBuilder(html); + if (html.contains("")) { + modifiedHtml.insert(html.indexOf("") + "".length(), "\n" + js + "\n"); + html = modifiedHtml.toString(); + } else if (html.contains("")) { + modifiedHtml.insert(html.indexOf(""), "\n" + js + "\n"); + html = modifiedHtml.toString(); + } else { + Logger.error("Unable to inject Capacitor, Plugins won't work"); + } + return new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)); + } + + private String readAssetStream(InputStream stream) { + try { + final int bufferSize = 1024; + final char[] buffer = new char[bufferSize]; + final StringBuilder out = new StringBuilder(); + Reader in = new InputStreamReader(stream, StandardCharsets.UTF_8); + for (;;) { + int rsz = in.read(buffer, 0, buffer.length); + if (rsz < 0) break; + out.append(buffer, 0, rsz); + } + return out.toString(); + } catch (Exception e) { + Logger.error("Unable to process HTML asset file. This is a fatal error", e); + } + + return ""; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSObject.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSObject.java new file mode 100644 index 00000000..0e987076 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSObject.java @@ -0,0 +1,164 @@ +package com.getcapacitor; + +import androidx.annotation.Nullable; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * A wrapper around JSONObject that isn't afraid to do simple + * JSON put operations without having to throw an exception + * for every little thing jeez + */ +public class JSObject extends JSONObject { + + public JSObject() { + super(); + } + + public JSObject(String json) throws JSONException { + super(json); + } + + public JSObject(JSONObject obj, String[] names) throws JSONException { + super(obj, names); + } + + /** + * Convert a pathetic JSONObject into a JSObject + * @param obj + */ + public static JSObject fromJSONObject(JSONObject obj) throws JSONException { + Iterator keysIter = obj.keys(); + List keys = new ArrayList<>(); + while (keysIter.hasNext()) { + keys.add(keysIter.next()); + } + + return new JSObject(obj, keys.toArray(new String[keys.size()])); + } + + @Override + @Nullable + public String getString(String key) { + return getString(key, null); + } + + @Nullable + public String getString(String key, @Nullable String defaultValue) { + try { + String value = super.getString(key); + if (!super.isNull(key)) { + return value; + } + } catch (JSONException ex) {} + return defaultValue; + } + + @Nullable + public Integer getInteger(String key) { + return getInteger(key, null); + } + + @Nullable + public Integer getInteger(String key, @Nullable Integer defaultValue) { + try { + return super.getInt(key); + } catch (JSONException e) {} + return defaultValue; + } + + @Nullable + public Boolean getBoolean(String key, @Nullable Boolean defaultValue) { + try { + return super.getBoolean(key); + } catch (JSONException e) {} + return defaultValue; + } + + /** + * Fetch boolean from jsonObject + */ + @Nullable + public Boolean getBool(String key) { + return getBoolean(key, null); + } + + @Nullable + public JSObject getJSObject(String name) { + try { + return getJSObject(name, null); + } catch (JSONException e) {} + return null; + } + + @Nullable + public JSObject getJSObject(String name, @Nullable JSObject defaultValue) throws JSONException { + try { + Object obj = get(name); + if (obj instanceof JSONObject) { + Iterator keysIter = ((JSONObject) obj).keys(); + List keys = new ArrayList<>(); + while (keysIter.hasNext()) { + keys.add(keysIter.next()); + } + + return new JSObject((JSONObject) obj, keys.toArray(new String[keys.size()])); + } + } catch (JSONException ex) {} + return defaultValue; + } + + @Override + public JSObject put(String key, boolean value) { + try { + super.put(key, value); + } catch (JSONException ex) {} + return this; + } + + @Override + public JSObject put(String key, int value) { + try { + super.put(key, value); + } catch (JSONException ex) {} + return this; + } + + @Override + public JSObject put(String key, long value) { + try { + super.put(key, value); + } catch (JSONException ex) {} + return this; + } + + @Override + public JSObject put(String key, double value) { + try { + super.put(key, value); + } catch (JSONException ex) {} + return this; + } + + @Override + public JSObject put(String key, Object value) { + try { + super.put(key, value); + } catch (JSONException ex) {} + return this; + } + + public JSObject put(String key, String value) { + try { + super.put(key, value); + } catch (JSONException ex) {} + return this; + } + + public JSObject putSafe(String key, Object value) throws JSONException { + return (JSObject) super.put(key, value); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSValue.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSValue.java new file mode 100644 index 00000000..d97ba91b --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/JSValue.java @@ -0,0 +1,65 @@ +package com.getcapacitor; + +import org.json.JSONException; + +/** + * Represents a single user-data value of any type on the capacitor PluginCall object. + */ +public class JSValue { + + private final Object value; + + /** + * @param call The capacitor plugin call, used for accessing the value safely. + * @param name The name of the property to access. + */ + public JSValue(PluginCall call, String name) { + this.value = this.toValue(call, name); + } + + /** + * Returns the coerced but uncasted underlying value. + */ + public Object getValue() { + return this.value; + } + + @Override + public String toString() { + return this.getValue().toString(); + } + + /** + * Returns the underlying value as a JSObject, or throwing if it cannot. + * + * @throws JSONException If the underlying value is not a JSObject. + */ + public JSObject toJSObject() throws JSONException { + if (this.value instanceof JSObject) return (JSObject) this.value; + throw new JSONException("JSValue could not be coerced to JSObject."); + } + + /** + * Returns the underlying value as a JSArray, or throwing if it cannot. + * + * @throws JSONException If the underlying value is not a JSArray. + */ + public JSArray toJSArray() throws JSONException { + if (this.value instanceof JSArray) return (JSArray) this.value; + throw new JSONException("JSValue could not be coerced to JSArray."); + } + + /** + * Returns the underlying value this object represents, coercing it into a capacitor-friendly object if supported. + */ + private Object toValue(PluginCall call, String name) { + Object value = null; + value = call.getArray(name, null); + if (value != null) return value; + value = call.getObject(name, null); + if (value != null) return value; + value = call.getString(name, null); + if (value != null) return value; + return call.getData().opt(name); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Logger.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Logger.java new file mode 100644 index 00000000..9d24fedd --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Logger.java @@ -0,0 +1,103 @@ +package com.getcapacitor; + +import android.text.TextUtils; +import android.util.Log; + +public class Logger { + + public static final String LOG_TAG_CORE = "Capacitor"; + public static CapConfig config; + + private static Logger instance; + + private static Logger getInstance() { + if (instance == null) { + instance = new Logger(); + } + return instance; + } + + public static void init(CapConfig config) { + Logger.getInstance().loadConfig(config); + } + + private void loadConfig(CapConfig config) { + Logger.config = config; + } + + public static String tags(String... subtags) { + if (subtags != null && subtags.length > 0) { + return LOG_TAG_CORE + "/" + TextUtils.join("/", subtags); + } + + return LOG_TAG_CORE; + } + + public static void verbose(String message) { + verbose(LOG_TAG_CORE, message); + } + + public static void verbose(String tag, String message) { + if (!shouldLog()) { + return; + } + + Log.v(tag, message); + } + + public static void debug(String message) { + debug(LOG_TAG_CORE, message); + } + + public static void debug(String tag, String message) { + if (!shouldLog()) { + return; + } + + Log.d(tag, message); + } + + public static void info(String message) { + info(LOG_TAG_CORE, message); + } + + public static void info(String tag, String message) { + if (!shouldLog()) { + return; + } + + Log.i(tag, message); + } + + public static void warn(String message) { + warn(LOG_TAG_CORE, message); + } + + public static void warn(String tag, String message) { + if (!shouldLog()) { + return; + } + + Log.w(tag, message); + } + + public static void error(String message) { + error(LOG_TAG_CORE, message, null); + } + + public static void error(String message, Throwable e) { + error(LOG_TAG_CORE, message, e); + } + + public static void error(String tag, String message, Throwable e) { + if (!shouldLog()) { + return; + } + + Log.e(tag, message, e); + } + + public static boolean shouldLog() { + return config == null || config.isLoggingEnabled(); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/MessageHandler.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/MessageHandler.java new file mode 100644 index 00000000..b71124e8 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/MessageHandler.java @@ -0,0 +1,159 @@ +package com.getcapacitor; + +import android.webkit.JavascriptInterface; +import android.webkit.WebView; +import androidx.webkit.JavaScriptReplyProxy; +import androidx.webkit.WebViewCompat; +import androidx.webkit.WebViewFeature; +import org.apache.cordova.PluginManager; + +/** + * MessageHandler handles messages from the WebView, dispatching them + * to plugins. + */ +public class MessageHandler { + + private Bridge bridge; + private WebView webView; + private PluginManager cordovaPluginManager; + private JavaScriptReplyProxy javaScriptReplyProxy; + + public MessageHandler(Bridge bridge, WebView webView, PluginManager cordovaPluginManager) { + this.bridge = bridge; + this.webView = webView; + this.cordovaPluginManager = cordovaPluginManager; + + if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_LISTENER) && !bridge.getConfig().isUsingLegacyBridge()) { + WebViewCompat.WebMessageListener capListener = (view, message, sourceOrigin, isMainFrame, replyProxy) -> { + if (isMainFrame) { + postMessage(message.getData()); + javaScriptReplyProxy = replyProxy; + } else { + Logger.warn("Plugin execution is allowed in Main Frame only"); + } + }; + try { + WebViewCompat.addWebMessageListener(webView, "androidBridge", bridge.getAllowedOriginRules(), capListener); + } catch (Exception ex) { + webView.addJavascriptInterface(this, "androidBridge"); + } + } else { + webView.addJavascriptInterface(this, "androidBridge"); + } + } + + /** + * The main message handler that will be called from JavaScript + * to send a message to the native bridge. + * @param jsonStr + */ + @JavascriptInterface + @SuppressWarnings("unused") + public void postMessage(String jsonStr) { + try { + JSObject postData = new JSObject(jsonStr); + + String type = postData.getString("type"); + + boolean typeIsNotNull = type != null; + boolean isCordovaPlugin = typeIsNotNull && type.equals("cordova"); + boolean isJavaScriptError = typeIsNotNull && type.equals("js.error"); + + String callbackId = postData.getString("callbackId"); + + if (isCordovaPlugin) { + String service = postData.getString("service"); + String action = postData.getString("action"); + String actionArgs = postData.getString("actionArgs"); + + Logger.verbose( + Logger.tags("Plugin"), + "To native (Cordova plugin): callbackId: " + + callbackId + + ", service: " + + service + + ", action: " + + action + + ", actionArgs: " + + actionArgs + ); + + this.callCordovaPluginMethod(callbackId, service, action, actionArgs); + } else if (isJavaScriptError) { + Logger.error("JavaScript Error: " + jsonStr); + } else { + String pluginId = postData.getString("pluginId"); + String methodName = postData.getString("methodName"); + JSObject methodData = postData.getJSObject("options", new JSObject()); + + Logger.verbose( + Logger.tags("Plugin"), + "To native (Capacitor plugin): callbackId: " + callbackId + ", pluginId: " + pluginId + ", methodName: " + methodName + ); + + this.callPluginMethod(callbackId, pluginId, methodName, methodData); + } + } catch (Exception ex) { + Logger.error("Post message error:", ex); + } + } + + public void sendResponseMessage(PluginCall call, PluginResult successResult, PluginResult errorResult) { + try { + PluginResult data = new PluginResult(); + data.put("save", call.isKeptAlive()); + data.put("callbackId", call.getCallbackId()); + data.put("pluginId", call.getPluginId()); + data.put("methodName", call.getMethodName()); + + boolean pluginResultInError = errorResult != null; + if (pluginResultInError) { + data.put("success", false); + data.put("error", errorResult); + Logger.debug("Sending plugin error: " + data.toString()); + } else { + data.put("success", true); + if (successResult != null) { + data.put("data", successResult); + } + } + + boolean isValidCallbackId = !call.getCallbackId().equals(PluginCall.CALLBACK_ID_DANGLING); + if (isValidCallbackId) { + if (bridge.getConfig().isUsingLegacyBridge()) { + legacySendResponseMessage(data); + } else if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_MESSAGE_LISTENER) && javaScriptReplyProxy != null) { + javaScriptReplyProxy.postMessage(data.toString()); + } else { + legacySendResponseMessage(data); + } + } else { + bridge.getApp().fireRestoredResult(data); + } + } catch (Exception ex) { + Logger.error("sendResponseMessage: error: " + ex); + } + if (!call.isKeptAlive()) { + call.release(bridge); + } + } + + private void legacySendResponseMessage(PluginResult data) { + final String runScript = "window.Capacitor.fromNative(" + data.toString() + ")"; + final WebView webView = this.webView; + webView.post(() -> webView.evaluateJavascript(runScript, null)); + } + + private void callPluginMethod(String callbackId, String pluginId, String methodName, JSObject methodData) { + PluginCall call = new PluginCall(this, pluginId, callbackId, methodName, methodData); + bridge.callPluginMethod(pluginId, methodName, call); + } + + private void callCordovaPluginMethod(String callbackId, String service, String action, String actionArgs) { + bridge.execute( + () -> { + cordovaPluginManager.exec(service, action, callbackId, actionArgs); + } + ); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/NativePlugin.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/NativePlugin.java new file mode 100644 index 00000000..c4307624 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/NativePlugin.java @@ -0,0 +1,37 @@ +package com.getcapacitor; + +import com.getcapacitor.annotation.CapacitorPlugin; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Base annotation for all Plugins + * @deprecated + *

Use {@link CapacitorPlugin} instead + */ +@Retention(RetentionPolicy.RUNTIME) +@Deprecated +public @interface NativePlugin { + /** + * Request codes this plugin uses and responds to, in order to tie + * Android events back the plugin to handle + */ + int[] requestCodes() default {}; + + /** + * Permissions this plugin needs, in order to make permission requests + * easy if the plugin only needs basic permission prompting + */ + String[] permissions() default {}; + + /** + * The request code to use when automatically requesting permissions + */ + int permissionRequestCode() default 9000; + + /** + * A custom name for the plugin, otherwise uses the + * simple class name. + */ + String name() default ""; +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PermissionState.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PermissionState.java new file mode 100644 index 00000000..382cff71 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PermissionState.java @@ -0,0 +1,31 @@ +package com.getcapacitor; + +import java.util.Locale; + +/** + * Represents the state of a permission + * + * @since 3.0.0 + */ +public enum PermissionState { + GRANTED("granted"), + DENIED("denied"), + PROMPT("prompt"), + PROMPT_WITH_RATIONALE("prompt-with-rationale"); + + private String state; + + PermissionState(String state) { + this.state = state; + } + + @Override + public String toString() { + return state; + } + + public static PermissionState byState(String state) { + state = state.toUpperCase(Locale.ROOT).replace('-', '_'); + return valueOf(state); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Plugin.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Plugin.java new file mode 100644 index 00000000..d8a3e82a --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/Plugin.java @@ -0,0 +1,1046 @@ +package com.getcapacitor; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.res.Configuration; +import android.net.Uri; +import android.os.Bundle; +import androidx.activity.result.ActivityResult; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import com.getcapacitor.annotation.ActivityCallback; +import com.getcapacitor.annotation.CapacitorPlugin; +import com.getcapacitor.annotation.Permission; +import com.getcapacitor.annotation.PermissionCallback; +import com.getcapacitor.util.PermissionHelper; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; +import org.json.JSONException; + +/** + * Plugin is the base class for all plugins, containing a number of + * convenient features for interacting with the {@link Bridge}, managing + * plugin permissions, tracking lifecycle events, and more. + * + * You should inherit from this class when creating new plugins, along with + * adding the {@link CapacitorPlugin} annotation to add additional required + * metadata about the Plugin + */ +public class Plugin { + + // The key we will use inside of a persisted Bundle for the JSON blob + // for a plugin call options. + private static final String BUNDLE_PERSISTED_OPTIONS_JSON_KEY = "_json"; + + // Reference to the Bridge + protected Bridge bridge; + + // Reference to the PluginHandle wrapper for this Plugin + protected PluginHandle handle; + + /** + * A way for plugins to quickly save a call that they will need to reference + * between activity/permissions starts/requests + * + * @deprecated store calls on the bridge using the methods + * {@link com.getcapacitor.Bridge#saveCall(PluginCall)}, + * {@link com.getcapacitor.Bridge#getSavedCall(String)} and + * {@link com.getcapacitor.Bridge#releaseCall(PluginCall)} + */ + @Deprecated + protected PluginCall savedLastCall; + + // Stored event listeners + private final Map> eventListeners; + + /** + * Launchers used by the plugin to handle activity results + */ + private final Map> activityLaunchers = new HashMap<>(); + + /** + * Launchers used by the plugin to handle permission results + */ + private final Map> permissionLaunchers = new HashMap<>(); + + private String lastPluginCallId; + + // Stored results of an event if an event was fired and + // no listeners were attached yet. Only stores the last value. + private final Map> retainedEventArguments; + + public Plugin() { + eventListeners = new HashMap<>(); + retainedEventArguments = new HashMap<>(); + } + + /** + * Called when the plugin has been connected to the bridge + * and is ready to start initializing. + */ + public void load() {} + + /** + * Registers activity result launchers defined on plugins, used for permission requests and + * activities started for result. + */ + void initializeActivityLaunchers() { + List pluginClassMethods = new ArrayList<>(); + for ( + Class pluginCursor = getClass(); + !pluginCursor.getName().equals(Object.class.getName()); + pluginCursor = pluginCursor.getSuperclass() + ) { + pluginClassMethods.addAll(Arrays.asList(pluginCursor.getDeclaredMethods())); + } + + for (final Method method : pluginClassMethods) { + if (method.isAnnotationPresent(ActivityCallback.class)) { + // register callbacks annotated with ActivityCallback for activity results + ActivityResultLauncher launcher = bridge.registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> triggerActivityCallback(method, result) + ); + + activityLaunchers.put(method.getName(), launcher); + } else if (method.isAnnotationPresent(PermissionCallback.class)) { + // register callbacks annotated with PermissionCallback for permission results + ActivityResultLauncher launcher = bridge.registerForActivityResult( + new ActivityResultContracts.RequestMultiplePermissions(), + permissions -> triggerPermissionCallback(method, permissions) + ); + + permissionLaunchers.put(method.getName(), launcher); + } + } + } + + private void triggerPermissionCallback(Method method, Map permissionResultMap) { + PluginCall savedCall = bridge.getPermissionCall(handle.getId()); + + // validate permissions and invoke the permission result callback + if (bridge.validatePermissions(this, savedCall, permissionResultMap)) { + try { + method.setAccessible(true); + method.invoke(this, savedCall); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } + } + + private void triggerActivityCallback(Method method, ActivityResult result) { + PluginCall savedCall = bridge.getSavedCall(lastPluginCallId); + if (savedCall == null) { + savedCall = bridge.getPluginCallForLastActivity(); + } + // invoke the activity result callback + try { + method.setAccessible(true); + method.invoke(this, savedCall, result); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } + + /** + * Start activity for result with the provided Intent and resolve with the provided callback method name. + *

+ * If there is no registered activity callback for the method name passed in, the call will + * be rejected. Make sure a valid activity result callback method is registered using the + * {@link ActivityCallback} annotation. + * + * @param call the plugin call + * @param intent the intent used to start an activity + * @param callbackName the name of the callback to run when the launched activity is finished + * @since 3.0.0 + */ + public void startActivityForResult(PluginCall call, Intent intent, String callbackName) { + ActivityResultLauncher activityResultLauncher = getActivityLauncherOrReject(call, callbackName); + if (activityResultLauncher == null) { + // return when null since call was rejected in getLauncherOrReject + return; + } + bridge.setPluginCallForLastActivity(call); + lastPluginCallId = call.getCallbackId(); + bridge.saveCall(call); + activityResultLauncher.launch(intent); + } + + private void permissionActivityResult(PluginCall call, String[] permissionStrings, String callbackName) { + ActivityResultLauncher permissionResultLauncher = getPermissionLauncherOrReject(call, callbackName); + if (permissionResultLauncher == null) { + // return when null since call was rejected in getLauncherOrReject + return; + } + + bridge.savePermissionCall(call); + permissionResultLauncher.launch(permissionStrings); + } + + /** + * Get the main {@link Context} for the current Activity (your app) + * @return the Context for the current activity + */ + public Context getContext() { + return this.bridge.getContext(); + } + + /** + * Get the main {@link Activity} for the app + * @return the Activity for the current app + */ + public AppCompatActivity getActivity() { + return this.bridge.getActivity(); + } + + /** + * Set the Bridge instance for this plugin + * @param bridge + */ + public void setBridge(Bridge bridge) { + this.bridge = bridge; + } + + /** + * Get the Bridge instance for this plugin + */ + public Bridge getBridge() { + return this.bridge; + } + + /** + * Set the wrapper {@link PluginHandle} instance for this plugin that + * contains additional metadata about the Plugin instance (such + * as indexed methods for reflection, and {@link CapacitorPlugin} annotation data). + * @param pluginHandle + */ + public void setPluginHandle(PluginHandle pluginHandle) { + this.handle = pluginHandle; + } + + /** + * Return the wrapper {@link PluginHandle} for this plugin. + * + * This wrapper contains additional metadata about the plugin instance, + * such as indexed methods for reflection, and {@link CapacitorPlugin} annotation data). + * @return + */ + public PluginHandle getPluginHandle() { + return this.handle; + } + + /** + * Get the root App ID + * @return + */ + public String getAppId() { + return getContext().getPackageName(); + } + + /** + * Called to save a {@link PluginCall} in order to reference it + * later, such as in an activity or permissions result handler + * @deprecated use {@link Bridge#saveCall(PluginCall)} + * + * @param lastCall + */ + @Deprecated + public void saveCall(PluginCall lastCall) { + this.savedLastCall = lastCall; + } + + /** + * Set the last saved call to null to free memory + * @deprecated use {@link PluginCall#release(Bridge)} + */ + @Deprecated + public void freeSavedCall() { + this.savedLastCall.release(bridge); + this.savedLastCall = null; + } + + /** + * Get the last saved call, if any + * @deprecated use {@link Bridge#getSavedCall(String)} + * + * @return + */ + @Deprecated + public PluginCall getSavedCall() { + return this.savedLastCall; + } + + /** + * Get the config options for this plugin. + * + * @return a config object representing the plugin config options, or an empty config + * if none exists + */ + public PluginConfig getConfig() { + return bridge.getConfig().getPluginConfiguration(handle.getId()); + } + + /** + * Get the value for a key on the config for this plugin. + * @deprecated use {@link #getConfig()} and access config values using the methods available + * depending on the type. + * + * @param key the key for the config value + * @return some object containing the value from the config + */ + @Deprecated + public Object getConfigValue(String key) { + try { + PluginConfig pluginConfig = getConfig(); + return pluginConfig.getConfigJSON().get(key); + } catch (JSONException ex) { + return null; + } + } + + /** + * Check whether any of the given permissions has been defined in the AndroidManifest.xml + * @deprecated use {@link #isPermissionDeclared(String)} + * + * @param permissions + * @return + */ + @Deprecated + public boolean hasDefinedPermissions(String[] permissions) { + for (String permission : permissions) { + if (!PermissionHelper.hasDefinedPermission(getContext(), permission)) { + return false; + } + } + return true; + } + + /** + * Check if all annotated permissions have been defined in the AndroidManifest.xml + * @deprecated use {@link #isPermissionDeclared(String)} + * + * @return true if permissions are all defined in the Manifest + */ + @Deprecated + public boolean hasDefinedRequiredPermissions() { + CapacitorPlugin annotation = handle.getPluginAnnotation(); + if (annotation == null) { + // Check for legacy plugin annotation, @NativePlugin + NativePlugin legacyAnnotation = handle.getLegacyPluginAnnotation(); + return hasDefinedPermissions(legacyAnnotation.permissions()); + } else { + for (Permission perm : annotation.permissions()) { + for (String permString : perm.strings()) { + if (!PermissionHelper.hasDefinedPermission(getContext(), permString)) { + return false; + } + } + } + } + + return true; + } + + /** + * Checks if the given permission alias is correctly declared in AndroidManifest.xml + * @param alias a permission alias defined on the plugin + * @return true only if all permissions associated with the given alias are declared in the manifest + */ + public boolean isPermissionDeclared(String alias) { + CapacitorPlugin annotation = handle.getPluginAnnotation(); + if (annotation != null) { + for (Permission perm : annotation.permissions()) { + if (alias.equalsIgnoreCase(perm.alias())) { + boolean result = true; + for (String permString : perm.strings()) { + result = result && PermissionHelper.hasDefinedPermission(getContext(), permString); + } + + return result; + } + } + } + + Logger.error(String.format("isPermissionDeclared: No alias defined for %s " + "or missing @CapacitorPlugin annotation.", alias)); + return false; + } + + /** + * Check whether the given permission has been granted by the user + * @deprecated use {@link #getPermissionState(String)} and {@link #getPermissionStates()} to get + * the states of permissions defined on the Plugin in conjunction with the @CapacitorPlugin + * annotation. Use the Android API {@link ActivityCompat#checkSelfPermission(Context, String)} + * methods to check permissions with Android permission strings + * + * @param permission + * @return + */ + @Deprecated + public boolean hasPermission(String permission) { + return ActivityCompat.checkSelfPermission(this.getContext(), permission) == PackageManager.PERMISSION_GRANTED; + } + + /** + * If the plugin annotation specified a set of permissions, this method checks if each is + * granted + * @deprecated use {@link #getPermissionState(String)} or {@link #getPermissionStates()} to + * check whether permissions are granted or not + * + * @return + */ + @Deprecated + public boolean hasRequiredPermissions() { + CapacitorPlugin annotation = handle.getPluginAnnotation(); + if (annotation == null) { + // Check for legacy plugin annotation, @NativePlugin + NativePlugin legacyAnnotation = handle.getLegacyPluginAnnotation(); + for (String perm : legacyAnnotation.permissions()) { + if (ActivityCompat.checkSelfPermission(this.getContext(), perm) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + + return true; + } + + for (Permission perm : annotation.permissions()) { + for (String permString : perm.strings()) { + if (ActivityCompat.checkSelfPermission(this.getContext(), permString) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + } + + return true; + } + + /** + * Request all of the specified permissions in the CapacitorPlugin annotation (if any) + * + * If there is no registered permission callback for the PluginCall passed in, the call will + * be rejected. Make sure a valid permission callback method is registered using the + * {@link PermissionCallback} annotation. + * + * @since 3.0.0 + * @param call the plugin call + * @param callbackName the name of the callback to run when the permission request is complete + */ + protected void requestAllPermissions(@NonNull PluginCall call, @NonNull String callbackName) { + CapacitorPlugin annotation = handle.getPluginAnnotation(); + if (annotation != null) { + HashSet perms = new HashSet<>(); + for (Permission perm : annotation.permissions()) { + perms.addAll(Arrays.asList(perm.strings())); + } + + permissionActivityResult(call, perms.toArray(new String[0]), callbackName); + } + } + + /** + * Request permissions using an alias defined on the plugin. + * + * If there is no registered permission callback for the PluginCall passed in, the call will + * be rejected. Make sure a valid permission callback method is registered using the + * {@link PermissionCallback} annotation. + * + * @param alias an alias defined on the plugin + * @param call the plugin call involved in originating the request + * @param callbackName the name of the callback to run when the permission request is complete + */ + protected void requestPermissionForAlias(@NonNull String alias, @NonNull PluginCall call, @NonNull String callbackName) { + requestPermissionForAliases(new String[] { alias }, call, callbackName); + } + + /** + * Request permissions using aliases defined on the plugin. + * + * If there is no registered permission callback for the PluginCall passed in, the call will + * be rejected. Make sure a valid permission callback method is registered using the + * {@link PermissionCallback} annotation. + * + * @param aliases a set of aliases defined on the plugin + * @param call the plugin call involved in originating the request + * @param callbackName the name of the callback to run when the permission request is complete + */ + protected void requestPermissionForAliases(@NonNull String[] aliases, @NonNull PluginCall call, @NonNull String callbackName) { + if (aliases.length == 0) { + Logger.error("No permission alias was provided"); + return; + } + + String[] permissions = getPermissionStringsForAliases(aliases); + + if (permissions.length > 0) { + permissionActivityResult(call, permissions, callbackName); + } + } + + /** + * Gets the Android permission strings defined on the {@link CapacitorPlugin} annotation with + * the provided aliases. + * + * @param aliases aliases for permissions defined on the plugin + * @return Android permission strings associated with the provided aliases, if exists + */ + private String[] getPermissionStringsForAliases(@NonNull String[] aliases) { + CapacitorPlugin annotation = handle.getPluginAnnotation(); + HashSet perms = new HashSet<>(); + for (Permission perm : annotation.permissions()) { + if (Arrays.asList(aliases).contains(perm.alias())) { + perms.addAll(Arrays.asList(perm.strings())); + } + } + + return perms.toArray(new String[0]); + } + + /** + * Gets the activity launcher associated with the calling methodName, or rejects the call if + * no registered launcher exists + * + * @param call the plugin call + * @param methodName the name of the activity callback method + * @return a launcher, or null if none found + */ + private @Nullable ActivityResultLauncher getActivityLauncherOrReject(PluginCall call, String methodName) { + ActivityResultLauncher activityLauncher = activityLaunchers.get(methodName); + + // if there is no registered launcher, reject the call with an error and return null + if (activityLauncher == null) { + String registerError = + "There is no ActivityCallback method registered for the name: %s. " + + "Please define a callback method annotated with @ActivityCallback " + + "that receives arguments: (PluginCall, ActivityResult)"; + registerError = String.format(Locale.US, registerError, methodName); + Logger.error(registerError); + call.reject(registerError); + return null; + } + + return activityLauncher; + } + + /** + * Gets the permission launcher associated with the calling methodName, or rejects the call if + * no registered launcher exists + * + * @param call the plugin call + * @param methodName the name of the permission callback method + * @return a launcher, or null if none found + */ + private @Nullable ActivityResultLauncher getPermissionLauncherOrReject(PluginCall call, String methodName) { + ActivityResultLauncher permissionLauncher = permissionLaunchers.get(methodName); + + // if there is no registered launcher, reject the call with an error and return null + if (permissionLauncher == null) { + String registerError = + "There is no PermissionCallback method registered for the name: %s. " + + "Please define a callback method annotated with @PermissionCallback " + + "that receives arguments: (PluginCall)"; + registerError = String.format(Locale.US, registerError, methodName); + Logger.error(registerError); + call.reject(registerError); + return null; + } + + return permissionLauncher; + } + + /** + * Request all of the specified permissions in the CapacitorPlugin annotation (if any) + * + * @deprecated use {@link #requestAllPermissions(PluginCall, String)} in conjunction with @CapacitorPlugin + */ + @Deprecated + public void pluginRequestAllPermissions() { + NativePlugin legacyAnnotation = handle.getLegacyPluginAnnotation(); + ActivityCompat.requestPermissions(getActivity(), legacyAnnotation.permissions(), legacyAnnotation.permissionRequestCode()); + } + + /** + * Helper for requesting a specific permission + * + * @param permission the permission to request + * @param requestCode the requestCode to use to associate the result with the plugin + * @deprecated use {@link #requestPermissionForAlias(String, PluginCall, String)} in conjunction with @CapacitorPlugin + */ + @Deprecated + public void pluginRequestPermission(String permission, int requestCode) { + ActivityCompat.requestPermissions(getActivity(), new String[] { permission }, requestCode); + } + + /** + * Helper for requesting specific permissions + * @deprecated use {@link #requestPermissionForAliases(String[], PluginCall, String)} in conjunction + * with @CapacitorPlugin + * + * @param permissions the set of permissions to request + * @param requestCode the requestCode to use to associate the result with the plugin + */ + @Deprecated + public void pluginRequestPermissions(String[] permissions, int requestCode) { + ActivityCompat.requestPermissions(getActivity(), permissions, requestCode); + } + + /** + * Get the permission state for the provided permission alias. + * + * @param alias the permission alias to get + * @return the state of the provided permission alias or null + */ + public PermissionState getPermissionState(String alias) { + return getPermissionStates().get(alias); + } + + /** + * Helper to check all permissions defined on a plugin and see the state of each. + * + * @since 3.0.0 + * @return A mapping of permission aliases to the associated granted status. + */ + public Map getPermissionStates() { + return bridge.getPermissionStates(this); + } + + /** + * Add a listener for the given event + * @param eventName + * @param call + */ + private void addEventListener(String eventName, PluginCall call) { + List listeners = eventListeners.get(eventName); + if (listeners == null || listeners.isEmpty()) { + listeners = new ArrayList<>(); + eventListeners.put(eventName, listeners); + + // Must add the call before sending retained arguments + listeners.add(call); + + sendRetainedArgumentsForEvent(eventName); + } else { + listeners.add(call); + } + } + + /** + * Remove a listener from the given event + * @param eventName + * @param call + */ + private void removeEventListener(String eventName, PluginCall call) { + List listeners = eventListeners.get(eventName); + if (listeners == null) { + return; + } + + listeners.remove(call); + } + + /** + * Notify all listeners that an event occurred + * @param eventName + * @param data + */ + protected void notifyListeners(String eventName, JSObject data, boolean retainUntilConsumed) { + Logger.verbose(getLogTag(), "Notifying listeners for event " + eventName); + List listeners = eventListeners.get(eventName); + if (listeners == null || listeners.isEmpty()) { + Logger.debug(getLogTag(), "No listeners found for event " + eventName); + if (retainUntilConsumed) { + List argList = retainedEventArguments.get(eventName); + + if (argList == null) { + argList = new ArrayList(); + } + + argList.add(data); + retainedEventArguments.put(eventName, argList); + } + return; + } + + CopyOnWriteArrayList listenersCopy = new CopyOnWriteArrayList(listeners); + for (PluginCall call : listenersCopy) { + call.resolve(data); + } + } + + /** + * Notify all listeners that an event occurred + * This calls {@link Plugin#notifyListeners(String, JSObject, boolean)} + * with retainUntilConsumed set to false + * @param eventName + * @param data + */ + protected void notifyListeners(String eventName, JSObject data) { + notifyListeners(eventName, data, false); + } + + /** + * Check if there are any listeners for the given event + */ + protected boolean hasListeners(String eventName) { + List listeners = eventListeners.get(eventName); + if (listeners == null) { + return false; + } + return !listeners.isEmpty(); + } + + /** + * Send retained arguments (if any) for this event. This + * is called only when the first listener for an event is added + * @param eventName + */ + private void sendRetainedArgumentsForEvent(String eventName) { + // copy retained args and null source to prevent potential race conditions + List retainedArgs = retainedEventArguments.get(eventName); + if (retainedArgs == null) { + return; + } + + retainedEventArguments.remove(eventName); + + for (JSObject retained : retainedArgs) { + notifyListeners(eventName, retained); + } + } + + /** + * Exported plugin call for adding a listener to this plugin + * @param call + */ + @SuppressWarnings("unused") + @PluginMethod(returnType = PluginMethod.RETURN_NONE) + public void addListener(PluginCall call) { + String eventName = call.getString("eventName"); + call.setKeepAlive(true); + addEventListener(eventName, call); + } + + /** + * Exported plugin call to remove a listener from this plugin + * @param call + */ + @SuppressWarnings("unused") + @PluginMethod(returnType = PluginMethod.RETURN_NONE) + public void removeListener(PluginCall call) { + String eventName = call.getString("eventName"); + String callbackId = call.getString("callbackId"); + PluginCall savedCall = bridge.getSavedCall(callbackId); + if (savedCall != null) { + removeEventListener(eventName, savedCall); + bridge.releaseCall(savedCall); + } + } + + /** + * Exported plugin call to remove all listeners from this plugin + * @param call + */ + @SuppressWarnings("unused") + @PluginMethod(returnType = PluginMethod.RETURN_PROMISE) + public void removeAllListeners(PluginCall call) { + eventListeners.clear(); + call.resolve(); + } + + /** + * Exported plugin call for checking the granted status for each permission + * declared on the plugin. This plugin call responds with a mapping of permissions to + * the associated granted status. + * + * @since 3.0.0 + */ + @PluginMethod + @PermissionCallback + public void checkPermissions(PluginCall pluginCall) { + Map permissionsResult = getPermissionStates(); + + if (permissionsResult.size() == 0) { + // if no permissions are defined on the plugin, resolve undefined + pluginCall.resolve(); + } else { + JSObject permissionsResultJSON = new JSObject(); + for (Map.Entry entry : permissionsResult.entrySet()) { + permissionsResultJSON.put(entry.getKey(), entry.getValue()); + } + + pluginCall.resolve(permissionsResultJSON); + } + } + + /** + * Exported plugin call to request all permissions for this plugin. + * To manually request permissions within a plugin use: + * {@link #requestAllPermissions(PluginCall, String)}, or + * {@link #requestPermissionForAlias(String, PluginCall, String)}, or + * {@link #requestPermissionForAliases(String[], PluginCall, String)} + * + * @param call the plugin call + */ + @PluginMethod + public void requestPermissions(PluginCall call) { + CapacitorPlugin annotation = handle.getPluginAnnotation(); + if (annotation == null) { + handleLegacyPermission(call); + } else { + // handle permission requests for plugins defined with @CapacitorPlugin (since 3.0.0) + String[] permAliases = null; + Set autoGrantPerms = new HashSet<>(); + + // If call was made with a list of specific permission aliases to request, save them + // to be requested + JSArray providedPerms = call.getArray("permissions"); + List providedPermsList = null; + + if (providedPerms != null) { + try { + providedPermsList = providedPerms.toList(); + } catch (JSONException ignore) { + // do nothing + } + } + + // If call was made without any custom permissions, request all from plugin annotation + Set aliasSet = new HashSet<>(); + if (providedPermsList == null || providedPermsList.isEmpty()) { + for (Permission perm : annotation.permissions()) { + // If a permission is defined with no permission strings, separate it for auto-granting. + // Otherwise, the alias is added to the list to be requested. + if (perm.strings().length == 0 || (perm.strings().length == 1 && perm.strings()[0].isEmpty())) { + if (!perm.alias().isEmpty()) { + autoGrantPerms.add(perm.alias()); + } + } else { + aliasSet.add(perm.alias()); + } + } + + permAliases = aliasSet.toArray(new String[0]); + } else { + for (Permission perm : annotation.permissions()) { + if (providedPermsList.contains(perm.alias())) { + aliasSet.add(perm.alias()); + } + } + + if (aliasSet.isEmpty()) { + call.reject("No valid permission alias was requested of this plugin."); + } else { + permAliases = aliasSet.toArray(new String[0]); + } + } + + if (permAliases != null && permAliases.length > 0) { + // request permissions using provided aliases or all defined on the plugin + requestPermissionForAliases(permAliases, call, "checkPermissions"); + } else if (!autoGrantPerms.isEmpty()) { + // if the plugin only has auto-grant permissions, return all as GRANTED + JSObject permissionsResults = new JSObject(); + + for (String perm : autoGrantPerms) { + permissionsResults.put(perm, PermissionState.GRANTED.toString()); + } + + call.resolve(permissionsResults); + } else { + // no permissions are defined on the plugin, resolve undefined + call.resolve(); + } + } + } + + @SuppressWarnings("deprecation") + private void handleLegacyPermission(PluginCall call) { + // handle permission requests for plugins defined with @NativePlugin (prior to 3.0.0) + NativePlugin legacyAnnotation = this.handle.getLegacyPluginAnnotation(); + String[] perms = legacyAnnotation.permissions(); + if (perms.length > 0) { + saveCall(call); + pluginRequestPermissions(perms, legacyAnnotation.permissionRequestCode()); + } else { + call.resolve(); + } + } + + /** + * Handle request permissions result. A plugin using the deprecated {@link NativePlugin} + * should override this to handle the result, or this method will handle the result + * for our convenient requestPermissions call. + * @deprecated in favor of using callbacks in conjunction with {@link CapacitorPlugin} + * + * @param requestCode + * @param permissions + * @param grantResults + */ + @Deprecated + protected void handleRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + if (!hasDefinedPermissions(permissions)) { + StringBuilder builder = new StringBuilder(); + builder.append("Missing the following permissions in AndroidManifest.xml:\n"); + String[] missing = PermissionHelper.getUndefinedPermissions(getContext(), permissions); + for (String perm : missing) { + builder.append(perm + "\n"); + } + savedLastCall.reject(builder.toString()); + savedLastCall = null; + } + } + + /** + * Called before the app is destroyed to give a plugin the chance to + * save the last call options for a saved plugin. By default, this + * method saves the full JSON blob of the options call. Since Bundle sizes + * may be limited, plugins that expect to be called with large data + * objects (such as a file), should override this method and selectively + * store option values in a {@link Bundle} to avoid exceeding limits. + * @return a new {@link Bundle} with fields set from the options of the last saved {@link PluginCall} + */ + protected Bundle saveInstanceState() { + PluginCall savedCall = bridge.getSavedCall(lastPluginCallId); + + if (savedCall == null) { + return null; + } + + Bundle ret = new Bundle(); + JSObject callData = savedCall.getData(); + + if (callData != null) { + ret.putString(BUNDLE_PERSISTED_OPTIONS_JSON_KEY, callData.toString()); + } + + return ret; + } + + /** + * Called when the app is opened with a previously un-handled + * activity response. If the plugin that started the activity + * stored data in {@link Plugin#saveInstanceState()} then this + * method will be called to allow the plugin to restore from that. + * @param state + */ + protected void restoreState(Bundle state) {} + + /** + * Handle activity result, should be overridden by each plugin + * + * @deprecated provide a callback method using the {@link ActivityCallback} annotation and use + * the {@link #startActivityForResult(PluginCall, Intent, String)} method + * + * @param requestCode + * @param resultCode + * @param data + */ + @Deprecated + protected void handleOnActivityResult(int requestCode, int resultCode, Intent data) {} + + /** + * Handle onNewIntent + * @param intent + */ + protected void handleOnNewIntent(Intent intent) {} + + /** + * Handle onConfigurationChanged + * @param newConfig + */ + protected void handleOnConfigurationChanged(Configuration newConfig) {} + + /** + * Handle onStart + */ + protected void handleOnStart() {} + + /** + * Handle onRestart + */ + protected void handleOnRestart() {} + + /** + * Handle onResume + */ + protected void handleOnResume() {} + + /** + * Handle onPause + */ + protected void handleOnPause() {} + + /** + * Handle onStop + */ + protected void handleOnStop() {} + + /** + * Handle onDestroy + */ + protected void handleOnDestroy() {} + + /** + * Give the plugins a chance to take control when a URL is about to be loaded in the WebView. + * Returning true causes the WebView to abort loading the URL. + * Returning false causes the WebView to continue loading the URL. + * Returning null will defer to the default Capacitor policy + */ + @SuppressWarnings("unused") + public Boolean shouldOverrideLoad(Uri url) { + return null; + } + + /** + * Start a new Activity. + * + * Note: This method must be used by all plugins instead of calling + * {@link Activity#startActivityForResult} as it associates the plugin with + * any resulting data from the new Activity even if this app + * is destroyed by the OS (to free up memory, for example). + * @param intent + * @param resultCode + */ + @Deprecated + protected void startActivityForResult(PluginCall call, Intent intent, int resultCode) { + bridge.startActivityForPluginWithResult(call, intent, resultCode); + } + + /** + * Execute the given runnable on the Bridge's task handler + * @param runnable + */ + public void execute(Runnable runnable) { + bridge.execute(runnable); + } + + /** + * Shortcut for getting the plugin log tag + * @param subTags + */ + protected String getLogTag(String... subTags) { + return Logger.tags(subTags); + } + + /** + * Gets a plugin log tag with the child's class name as subTag. + */ + protected String getLogTag() { + return Logger.tags(this.getClass().getSimpleName()); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginCall.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginCall.java new file mode 100644 index 00000000..18661d76 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginCall.java @@ -0,0 +1,440 @@ +package com.getcapacitor; + +import androidx.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Wraps a call from the web layer to native + */ +public class PluginCall { + + /** + * A special callback id that indicates there is no matching callback + * on the client to associate any PluginCall results back to. This is used + * in the case of an app resuming with saved instance data, for example. + */ + public static final String CALLBACK_ID_DANGLING = "-1"; + + private final MessageHandler msgHandler; + private final String pluginId; + private final String callbackId; + private final String methodName; + private final JSObject data; + + private boolean keepAlive = false; + + /** + * Indicates that this PluginCall was released, and should no longer be used + */ + @Deprecated + private boolean isReleased = false; + + public PluginCall(MessageHandler msgHandler, String pluginId, String callbackId, String methodName, JSObject data) { + this.msgHandler = msgHandler; + this.pluginId = pluginId; + this.callbackId = callbackId; + this.methodName = methodName; + this.data = data; + } + + public void successCallback(PluginResult successResult) { + if (CALLBACK_ID_DANGLING.equals(this.callbackId)) { + // don't send back response if the callbackId was "-1" + return; + } + + this.msgHandler.sendResponseMessage(this, successResult, null); + } + + /** + * @deprecated + * Use {@link #resolve(JSObject data)} + */ + @Deprecated + public void success(JSObject data) { + PluginResult result = new PluginResult(data); + this.msgHandler.sendResponseMessage(this, result, null); + } + + /** + * @deprecated + * Use {@link #resolve()} + */ + @Deprecated + public void success() { + this.resolve(new JSObject()); + } + + public void resolve(JSObject data) { + PluginResult result = new PluginResult(data); + this.msgHandler.sendResponseMessage(this, result, null); + } + + public void resolve() { + this.msgHandler.sendResponseMessage(this, null, null); + } + + public void errorCallback(String msg) { + PluginResult errorResult = new PluginResult(); + + try { + errorResult.put("message", msg); + } catch (Exception jsonEx) { + Logger.error(Logger.tags("Plugin"), jsonEx.toString(), null); + } + + this.msgHandler.sendResponseMessage(this, null, errorResult); + } + + /** + * @deprecated + * Use {@link #reject(String msg, Exception ex)} + */ + @Deprecated + public void error(String msg, Exception ex) { + reject(msg, ex); + } + + /** + * @deprecated + * Use {@link #reject(String msg, String code, Exception ex)} + */ + @Deprecated + public void error(String msg, String code, Exception ex) { + reject(msg, code, ex); + } + + /** + * @deprecated + * Use {@link #reject(String msg)} + */ + @Deprecated + public void error(String msg) { + reject(msg); + } + + public void reject(String msg, String code, Exception ex, JSObject data) { + PluginResult errorResult = new PluginResult(); + + if (ex != null) { + Logger.error(Logger.tags("Plugin"), msg, ex); + } + + try { + errorResult.put("message", msg); + errorResult.put("code", code); + if (null != data) { + errorResult.put("data", data); + } + } catch (Exception jsonEx) { + Logger.error(Logger.tags("Plugin"), jsonEx.getMessage(), jsonEx); + } + + this.msgHandler.sendResponseMessage(this, null, errorResult); + } + + public void reject(String msg, Exception ex, JSObject data) { + reject(msg, null, ex, data); + } + + public void reject(String msg, String code, JSObject data) { + reject(msg, code, null, data); + } + + public void reject(String msg, String code, Exception ex) { + reject(msg, code, ex, null); + } + + public void reject(String msg, JSObject data) { + reject(msg, null, null, data); + } + + public void reject(String msg, Exception ex) { + reject(msg, null, ex, null); + } + + public void reject(String msg, String code) { + reject(msg, code, null, null); + } + + public void reject(String msg) { + reject(msg, null, null, null); + } + + public void unimplemented() { + unimplemented("not implemented"); + } + + public void unimplemented(String msg) { + reject(msg, "UNIMPLEMENTED", null, null); + } + + public void unavailable() { + unavailable("not available"); + } + + public void unavailable(String msg) { + reject(msg, "UNAVAILABLE", null, null); + } + + public String getPluginId() { + return this.pluginId; + } + + public String getCallbackId() { + return this.callbackId; + } + + public String getMethodName() { + return this.methodName; + } + + public JSObject getData() { + return this.data; + } + + @Nullable + public String getString(String name) { + return this.getString(name, null); + } + + @Nullable + public String getString(String name, @Nullable String defaultValue) { + Object value = this.data.opt(name); + if (value == null) { + return defaultValue; + } + + if (value instanceof String) { + return (String) value; + } + return defaultValue; + } + + @Nullable + public Integer getInt(String name) { + return this.getInt(name, null); + } + + @Nullable + public Integer getInt(String name, @Nullable Integer defaultValue) { + Object value = this.data.opt(name); + if (value == null) { + return defaultValue; + } + + if (value instanceof Integer) { + return (Integer) value; + } + return defaultValue; + } + + @Nullable + public Long getLong(String name) { + return this.getLong(name, null); + } + + @Nullable + public Long getLong(String name, @Nullable Long defaultValue) { + Object value = this.data.opt(name); + if (value == null) { + return defaultValue; + } + + if (value instanceof Long) { + return (Long) value; + } + return defaultValue; + } + + @Nullable + public Float getFloat(String name) { + return this.getFloat(name, null); + } + + @Nullable + public Float getFloat(String name, @Nullable Float defaultValue) { + Object value = this.data.opt(name); + if (value == null) { + return defaultValue; + } + + if (value instanceof Float) { + return (Float) value; + } + if (value instanceof Double) { + return ((Double) value).floatValue(); + } + if (value instanceof Integer) { + return ((Integer) value).floatValue(); + } + return defaultValue; + } + + @Nullable + public Double getDouble(String name) { + return this.getDouble(name, null); + } + + @Nullable + public Double getDouble(String name, @Nullable Double defaultValue) { + Object value = this.data.opt(name); + if (value == null) { + return defaultValue; + } + + if (value instanceof Double) { + return (Double) value; + } + if (value instanceof Float) { + return ((Float) value).doubleValue(); + } + if (value instanceof Integer) { + return ((Integer) value).doubleValue(); + } + return defaultValue; + } + + @Nullable + public Boolean getBoolean(String name) { + return this.getBoolean(name, null); + } + + @Nullable + public Boolean getBoolean(String name, @Nullable Boolean defaultValue) { + Object value = this.data.opt(name); + if (value == null) { + return defaultValue; + } + + if (value instanceof Boolean) { + return (Boolean) value; + } + return defaultValue; + } + + public JSObject getObject(String name) { + return this.getObject(name, null); + } + + @Nullable + public JSObject getObject(String name, JSObject defaultValue) { + Object value = this.data.opt(name); + if (value == null) { + return defaultValue; + } + + if (value instanceof JSONObject) { + try { + return JSObject.fromJSONObject((JSONObject) value); + } catch (JSONException ex) { + return defaultValue; + } + } + return defaultValue; + } + + public JSArray getArray(String name) { + return this.getArray(name, null); + } + + /** + * Get a JSONArray and turn it into a JSArray + * @param name + * @param defaultValue + * @return + */ + @Nullable + public JSArray getArray(String name, JSArray defaultValue) { + Object value = this.data.opt(name); + if (value == null) { + return defaultValue; + } + + if (value instanceof JSONArray) { + try { + JSONArray valueArray = (JSONArray) value; + List items = new ArrayList<>(); + for (int i = 0; i < valueArray.length(); i++) { + items.add(valueArray.get(i)); + } + return new JSArray(items.toArray()); + } catch (JSONException ex) { + return defaultValue; + } + } + return defaultValue; + } + + /** + * @param name of the option to check + * @return boolean indicating if the plugin call has an option for the provided name. + * @deprecated Presence of a key should not be considered significant. + * Use typed accessors to check the value instead. + */ + @Deprecated + public boolean hasOption(String name) { + return this.data.has(name); + } + + /** + * Indicate that the Bridge should cache this call in order to call + * it again later. For example, the addListener system uses this to + * continuously call the call's callback (😆). + * @deprecated use {@link #setKeepAlive(Boolean)} instead + */ + @Deprecated + public void save() { + setKeepAlive(true); + } + + /** + * Indicate that the Bridge should cache this call in order to call + * it again later. For example, the addListener system uses this to + * continuously call the call's callback. + * + * @param keepAlive whether to keep the callback saved + */ + public void setKeepAlive(Boolean keepAlive) { + this.keepAlive = keepAlive; + } + + public void release(Bridge bridge) { + this.keepAlive = false; + bridge.releaseCall(this); + this.isReleased = true; + } + + /** + * @deprecated use {@link #isKeptAlive()} + * @return true if the plugin call is kept alive + */ + @Deprecated + public boolean isSaved() { + return isKeptAlive(); + } + + /** + * Gets the keepAlive value of the plugin call + * @return true if the plugin call is kept alive + */ + public boolean isKeptAlive() { + return keepAlive; + } + + @Deprecated + public boolean isReleased() { + return isReleased; + } + + class PluginCallDataTypeException extends Exception { + + PluginCallDataTypeException(String m) { + super(m); + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginConfig.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginConfig.java new file mode 100644 index 00000000..0f00fc53 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginConfig.java @@ -0,0 +1,116 @@ +package com.getcapacitor; + +import com.getcapacitor.util.JSONUtils; +import org.json.JSONObject; + +/** + * Represents the configuration options for plugins used by Capacitor + */ +public class PluginConfig { + + /** + * The object containing plugin config values. + */ + private final JSONObject config; + + /** + * Constructs a PluginsConfig with the provided JSONObject value. + * + * @param config A plugin configuration expressed as a JSON Object + */ + PluginConfig(JSONObject config) { + this.config = config; + } + + /** + * Get a string value for a plugin in the Capacitor config. + * + * @param configKey The key of the value to retrieve + * @return The value from the config, if exists. Null if not + */ + public String getString(String configKey) { + return getString(configKey, null); + } + + /** + * Get a string value for a plugin in the Capacitor config. + * + * @param configKey The key of the value to retrieve + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + public String getString(String configKey, String defaultValue) { + return JSONUtils.getString(config, configKey, defaultValue); + } + + /** + * Get a boolean value for a plugin in the Capacitor config. + * + * @param configKey The key of the value to retrieve + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + public boolean getBoolean(String configKey, boolean defaultValue) { + return JSONUtils.getBoolean(config, configKey, defaultValue); + } + + /** + * Get an integer value for a plugin in the Capacitor config. + * + * @param configKey The key of the value to retrieve + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + public int getInt(String configKey, int defaultValue) { + return JSONUtils.getInt(config, configKey, defaultValue); + } + + /** + * Get a string array value for a plugin in the Capacitor config. + * + * @param configKey The key of the value to retrieve + * @return The value from the config, if exists. Null if not + */ + public String[] getArray(String configKey) { + return getArray(configKey, null); + } + + /** + * Get a string array value for a plugin in the Capacitor config. + * + * @param configKey The key of the value to retrieve + * @param defaultValue A default value to return if the key does not exist in the config + * @return The value from the config, if key exists. Default value returned if not + */ + public String[] getArray(String configKey, String[] defaultValue) { + return JSONUtils.getArray(config, configKey, defaultValue); + } + + /** + * Get a JSON object value for a plugin in the Capacitor config. + * + * @param configKey The key of the value to retrieve + * @return The value from the config, if exists. Null if not + */ + public JSONObject getObject(String configKey) { + return JSONUtils.getObject(config, configKey); + } + + /** + * Check if the PluginConfig is empty. + * + * @return true if the plugin config has no entries + */ + public boolean isEmpty() { + return config.length() == 0; + } + + /** + * Gets the JSON Object containing the config of the the provided plugin ID. + * + * @return The config for that plugin + */ + public JSONObject getConfigJSON() { + return config; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginHandle.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginHandle.java new file mode 100644 index 00000000..bfdd9228 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginHandle.java @@ -0,0 +1,160 @@ +package com.getcapacitor; + +import com.getcapacitor.annotation.CapacitorPlugin; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * PluginHandle is an instance of a plugin that has been registered + * and indexed. Think of it as a Plugin instance with extra metadata goodies + */ +public class PluginHandle { + + private final Bridge bridge; + private final Class pluginClass; + + private final Map pluginMethods = new HashMap<>(); + + private final String pluginId; + + @SuppressWarnings("deprecation") + private NativePlugin legacyPluginAnnotation; + + private CapacitorPlugin pluginAnnotation; + + private Plugin instance; + + @SuppressWarnings("deprecation") + private PluginHandle(Class clazz, Bridge bridge) throws InvalidPluginException { + this.bridge = bridge; + this.pluginClass = clazz; + + CapacitorPlugin pluginAnnotation = pluginClass.getAnnotation(CapacitorPlugin.class); + if (pluginAnnotation == null) { + // Check for legacy plugin annotation, @NativePlugin + NativePlugin legacyPluginAnnotation = pluginClass.getAnnotation(NativePlugin.class); + if (legacyPluginAnnotation == null) { + throw new InvalidPluginException("No @CapacitorPlugin annotation found for plugin " + pluginClass.getName()); + } + + if (!legacyPluginAnnotation.name().equals("")) { + this.pluginId = legacyPluginAnnotation.name(); + } else { + this.pluginId = pluginClass.getSimpleName(); + } + + this.legacyPluginAnnotation = legacyPluginAnnotation; + } else { + if (!pluginAnnotation.name().equals("")) { + this.pluginId = pluginAnnotation.name(); + } else { + this.pluginId = pluginClass.getSimpleName(); + } + + this.pluginAnnotation = pluginAnnotation; + } + + this.indexMethods(clazz); + } + + public PluginHandle(Bridge bridge, Class pluginClass) throws InvalidPluginException, PluginLoadException { + this(pluginClass, bridge); + this.load(); + } + + public PluginHandle(Bridge bridge, Plugin plugin) throws InvalidPluginException { + this(plugin.getClass(), bridge); + this.loadInstance(plugin); + } + + public Class getPluginClass() { + return pluginClass; + } + + public String getId() { + return this.pluginId; + } + + @SuppressWarnings("deprecation") + public NativePlugin getLegacyPluginAnnotation() { + return this.legacyPluginAnnotation; + } + + public CapacitorPlugin getPluginAnnotation() { + return this.pluginAnnotation; + } + + public Plugin getInstance() { + return this.instance; + } + + public Collection getMethods() { + return this.pluginMethods.values(); + } + + public Plugin load() throws PluginLoadException { + if (this.instance != null) { + return this.instance; + } + + try { + this.instance = this.pluginClass.getDeclaredConstructor().newInstance(); + return this.loadInstance(instance); + } catch (Exception ex) { + throw new PluginLoadException("Unable to load plugin instance. Ensure plugin is publicly accessible"); + } + } + + public Plugin loadInstance(Plugin plugin) { + this.instance = plugin; + this.instance.setPluginHandle(this); + this.instance.setBridge(this.bridge); + this.instance.load(); + this.instance.initializeActivityLaunchers(); + return this.instance; + } + + /** + * Call a method on a plugin. + * @param methodName the name of the method to call + * @param call the constructed PluginCall with parameters from the caller + * @throws InvalidPluginMethodException if no method was found on that plugin + */ + public void invoke(String methodName, PluginCall call) + throws PluginLoadException, InvalidPluginMethodException, InvocationTargetException, IllegalAccessException { + if (this.instance == null) { + // Can throw PluginLoadException + this.load(); + } + + PluginMethodHandle methodMeta = pluginMethods.get(methodName); + if (methodMeta == null) { + throw new InvalidPluginMethodException("No method " + methodName + " found for plugin " + pluginClass.getName()); + } + + methodMeta.getMethod().invoke(this.instance, call); + } + + /** + * Index all the known callable methods for a plugin for faster + * invocation later + */ + private void indexMethods(Class plugin) { + //Method[] methods = pluginClass.getDeclaredMethods(); + Method[] methods = pluginClass.getMethods(); + + for (Method methodReflect : methods) { + PluginMethod method = methodReflect.getAnnotation(PluginMethod.class); + + if (method == null) { + continue; + } + + PluginMethodHandle methodMeta = new PluginMethodHandle(methodReflect, method); + pluginMethods.put(methodReflect.getName(), methodMeta); + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginInvocationException.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginInvocationException.java new file mode 100644 index 00000000..ae6b0eb8 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginInvocationException.java @@ -0,0 +1,16 @@ +package com.getcapacitor; + +class PluginInvocationException extends Exception { + + public PluginInvocationException(String s) { + super(s); + } + + public PluginInvocationException(Throwable t) { + super(t); + } + + public PluginInvocationException(String s, Throwable t) { + super(s, t); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginLoadException.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginLoadException.java new file mode 100644 index 00000000..8d81a382 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginLoadException.java @@ -0,0 +1,19 @@ +package com.getcapacitor; + +/** + * Thrown when a plugin fails to instantiate + */ +public class PluginLoadException extends Exception { + + public PluginLoadException(String s) { + super(s); + } + + public PluginLoadException(Throwable t) { + super(t); + } + + public PluginLoadException(String s, Throwable t) { + super(s, t); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginManager.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginManager.java new file mode 100644 index 00000000..540bc912 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginManager.java @@ -0,0 +1,56 @@ +package com.getcapacitor; + +import android.content.res.AssetManager; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class PluginManager { + + private final AssetManager assetManager; + + public PluginManager(AssetManager assetManager) { + this.assetManager = assetManager; + } + + public List> loadPluginClasses() throws PluginLoadException { + JSONArray pluginsJSON = parsePluginsJSON(); + ArrayList> pluginList = new ArrayList<>(); + + try { + for (int i = 0, size = pluginsJSON.length(); i < size; i++) { + JSONObject pluginJSON = pluginsJSON.getJSONObject(i); + String classPath = pluginJSON.getString("classpath"); + Class c = Class.forName(classPath); + pluginList.add(c.asSubclass(Plugin.class)); + } + } catch (JSONException e) { + throw new PluginLoadException("Could not parse capacitor.plugins.json as JSON"); + } catch (ClassNotFoundException e) { + throw new PluginLoadException("Could not find class by class path: " + e.getMessage()); + } + + return pluginList; + } + + private JSONArray parsePluginsJSON() throws PluginLoadException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(assetManager.open("capacitor.plugins.json")))) { + StringBuilder builder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + builder.append(line); + } + String jsonString = builder.toString(); + return new JSONArray(jsonString); + } catch (IOException e) { + throw new PluginLoadException("Could not load capacitor.plugins.json"); + } catch (JSONException e) { + throw new PluginLoadException("Could not parse capacitor.plugins.json as JSON"); + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginMethod.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginMethod.java new file mode 100644 index 00000000..85663043 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginMethod.java @@ -0,0 +1,15 @@ +package com.getcapacitor; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface PluginMethod { + String RETURN_PROMISE = "promise"; + + String RETURN_CALLBACK = "callback"; + + String RETURN_NONE = "none"; + + String returnType() default RETURN_PROMISE; +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginMethodHandle.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginMethodHandle.java new file mode 100644 index 00000000..a728c1f1 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginMethodHandle.java @@ -0,0 +1,33 @@ +package com.getcapacitor; + +import java.lang.reflect.Method; + +public class PluginMethodHandle { + + // The reflect method reference + private final Method method; + // The name of the method + private final String name; + // The return type of the method (see PluginMethod for constants) + private final String returnType; + + public PluginMethodHandle(Method method, PluginMethod methodDecorator) { + this.method = method; + + this.name = method.getName(); + + this.returnType = methodDecorator.returnType(); + } + + public String getReturnType() { + return returnType; + } + + public String getName() { + return name; + } + + public Method getMethod() { + return method; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginResult.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginResult.java new file mode 100644 index 00000000..cdc169e0 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/PluginResult.java @@ -0,0 +1,84 @@ +package com.getcapacitor; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +/** + * Wraps a result for web from calling a native plugin. + */ +public class PluginResult { + + private final JSObject json; + + public PluginResult() { + this(new JSObject()); + } + + public PluginResult(JSObject json) { + this.json = json; + } + + public PluginResult put(String name, boolean value) { + return this.jsonPut(name, value); + } + + public PluginResult put(String name, double value) { + return this.jsonPut(name, value); + } + + public PluginResult put(String name, int value) { + return this.jsonPut(name, value); + } + + public PluginResult put(String name, long value) { + return this.jsonPut(name, value); + } + + /** + * Format a date as an ISO string + */ + public PluginResult put(String name, Date value) { + TimeZone tz = TimeZone.getTimeZone("UTC"); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm'Z'"); + df.setTimeZone(tz); + return this.jsonPut(name, df.format(value)); + } + + public PluginResult put(String name, Object value) { + return this.jsonPut(name, value); + } + + public PluginResult put(String name, PluginResult value) { + return this.jsonPut(name, value.json); + } + + PluginResult jsonPut(String name, Object value) { + try { + this.json.put(name, value); + } catch (Exception ex) { + Logger.error(Logger.tags("Plugin"), "", ex); + } + return this; + } + + public String toString() { + return this.json.toString(); + } + + /** + * Return plugin metadata and information about the result, if it succeeded the data, or error information if it didn't. + * This is used for appRestoredResult, as it's technically a raw data response from a plugin. + * @return the raw data response from the plugin. + */ + public JSObject getWrappedResult() { + JSObject ret = new JSObject(); + ret.put("pluginId", this.json.getString("pluginId")); + ret.put("methodName", this.json.getString("methodName")); + ret.put("success", this.json.getBoolean("success", false)); + ret.put("data", this.json.getJSObject("data")); + ret.put("error", this.json.getJSObject("error")); + return ret; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/ProcessedRoute.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/ProcessedRoute.java new file mode 100644 index 00000000..eb3d7b0d --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/ProcessedRoute.java @@ -0,0 +1,37 @@ +package com.getcapacitor; + +/** + * An data class used in conjunction with RouteProcessor. + * + * @see com.getcapacitor.RouteProcessor + */ +public class ProcessedRoute { + + private String path; + private boolean isAsset; + private boolean ignoreAssetPath; + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public boolean isAsset() { + return isAsset; + } + + public void setAsset(boolean asset) { + isAsset = asset; + } + + public boolean isIgnoreAssetPath() { + return ignoreAssetPath; + } + + public void setIgnoreAssetPath(boolean ignoreAssetPath) { + this.ignoreAssetPath = ignoreAssetPath; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/RouteProcessor.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/RouteProcessor.java new file mode 100644 index 00000000..670c8bc6 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/RouteProcessor.java @@ -0,0 +1,8 @@ +package com.getcapacitor; + +/** + * An interface used in the processing of routes + */ +public interface RouteProcessor { + ProcessedRoute process(String basePath, String path); +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/ServerPath.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/ServerPath.java new file mode 100644 index 00000000..5b34b460 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/ServerPath.java @@ -0,0 +1,25 @@ +package com.getcapacitor; + +public class ServerPath { + + public enum PathType { + BASE_PATH, + ASSET_PATH + } + + private final PathType type; + private final String path; + + public ServerPath(PathType type, String path) { + this.type = type; + this.path = path; + } + + public PathType getType() { + return type; + } + + public String getPath() { + return path; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/UriMatcher.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/UriMatcher.java new file mode 100755 index 00000000..715a0a0b --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/UriMatcher.java @@ -0,0 +1,180 @@ +/* + * Copyright (C) 2006 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +//package com.google.webviewlocalserver.third_party.android; +package com.getcapacitor; + +import android.net.Uri; +import com.getcapacitor.util.HostMask; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Pattern; + +public class UriMatcher { + + /** + * Creates the root node of the URI tree. + * + * @param code the code to match for the root URI + */ + public UriMatcher(Object code) { + mCode = code; + mWhich = -1; + mChildren = new ArrayList<>(); + mText = null; + } + + private UriMatcher() { + mCode = null; + mWhich = -1; + mChildren = new ArrayList<>(); + mText = null; + } + + /** + * Add a URI to match, and the code to return when this URI is + * matched. URI nodes may be exact match string, the token "*" + * that matches any text, or the token "#" that matches only + * numbers. + *

+ * Starting from API level {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, + * this method will accept a leading slash in the path. + * + * @param authority the authority to match + * @param path the path to match. * may be used as a wild card for + * any text, and # may be used as a wild card for numbers. + * @param code the code that is returned when a URI is matched + * against the given components. Must be positive. + */ + public void addURI(String scheme, String authority, String path, Object code) { + if (code == null) { + throw new IllegalArgumentException("Code can't be null"); + } + + String[] tokens = null; + if (path != null) { + String newPath = path; + // Strip leading slash if present. + if (!path.isEmpty() && path.charAt(0) == '/') { + newPath = path.substring(1); + } + tokens = PATH_SPLIT_PATTERN.split(newPath); + } + + int numTokens = tokens != null ? tokens.length : 0; + UriMatcher node = this; + for (int i = -2; i < numTokens; i++) { + String token; + if (i == -2) token = scheme; else if (i == -1) token = authority; else token = tokens[i]; + ArrayList children = node.mChildren; + int numChildren = children.size(); + UriMatcher child; + int j; + for (j = 0; j < numChildren; j++) { + child = children.get(j); + if (token.equals(child.mText)) { + node = child; + break; + } + } + if (j == numChildren) { + // Child not found, create it + child = new UriMatcher(); + if (i == -1 && token.contains("*")) { + child.mWhich = MASK; + } else if (token.equals("**")) { + child.mWhich = REST; + } else if (token.equals("*")) { + child.mWhich = TEXT; + } else { + child.mWhich = EXACT; + } + child.mText = token; + node.mChildren.add(child); + node = child; + } + } + node.mCode = code; + } + + static final Pattern PATH_SPLIT_PATTERN = Pattern.compile("/"); + + /** + * Try to match against the path in a url. + * + * @param uri The url whose path we will match against. + * @return The code for the matched node (added using addURI), + * or null if there is no matched node. + */ + public Object match(Uri uri) { + final List pathSegments = uri.getPathSegments(); + final int li = pathSegments.size(); + + UriMatcher node = this; + + if (li == 0 && uri.getAuthority() == null) { + return this.mCode; + } + + for (int i = -2; i < li; i++) { + String u; + if (i == -2) u = uri.getScheme(); else if (i == -1) u = uri.getAuthority(); else u = pathSegments.get(i); + ArrayList list = node.mChildren; + if (list == null) { + break; + } + node = null; + int lj = list.size(); + for (int j = 0; j < lj; j++) { + UriMatcher n = list.get(j); + which_switch:switch (n.mWhich) { + case MASK: + if (HostMask.Parser.parse(n.mText).matches(u)) { + node = n; + } + break; + case EXACT: + if (n.mText.equals(u)) { + node = n; + } + break; + case TEXT: + node = n; + break; + case REST: + return n.mCode; + } + if (node != null) { + break; + } + } + if (node == null) { + return null; + } + } + + return node.mCode; + } + + private static final int EXACT = 0; + private static final int TEXT = 1; + private static final int REST = 2; + private static final int MASK = 3; + + private Object mCode; + private int mWhich; + private String mText; + private ArrayList mChildren; +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/WebViewListener.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/WebViewListener.java new file mode 100644 index 00000000..6df4f6c0 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/WebViewListener.java @@ -0,0 +1,57 @@ +package com.getcapacitor; + +import android.webkit.RenderProcessGoneDetail; +import android.webkit.WebView; + +/** + * Provides callbacks associated with the {@link BridgeWebViewClient} + */ +public abstract class WebViewListener { + + /** + * Callback for page load event. + * + * @param webView The WebView that loaded + */ + public void onPageLoaded(WebView webView) { + // Override me to add behavior to the page loaded event + } + + /** + * Callback for onReceivedError event. + * + * @param webView The WebView that loaded + */ + public void onReceivedError(WebView webView) { + // Override me to add behavior to handle the onReceivedError event + } + + /** + * Callback for onReceivedHttpError event. + * + * @param webView The WebView that loaded + */ + public void onReceivedHttpError(WebView webView) { + // Override me to add behavior to handle the onReceivedHttpError event + } + + /** + * Callback for page start event. + * + * @param webView The WebView that loaded + */ + public void onPageStarted(WebView webView) { + // Override me to add behavior to the page started event + } + + /** + * Callback for render process gone event. Return true if the state is handled. + * + * @param webView The WebView that loaded + * @return returns false by default if the listener is not overridden and used + */ + public boolean onRenderProcessGone(WebView webView, RenderProcessGoneDetail detail) { + // Override me to add behavior to the web view render process gone event + return false; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java new file mode 100755 index 00000000..f1fc63cb --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/WebViewLocalServer.java @@ -0,0 +1,749 @@ +/* +Copyright 2015 Google Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + */ +package com.getcapacitor; + +import static com.getcapacitor.plugin.util.HttpRequestHandler.isDomainExcludedFromSSL; + +import android.content.Context; +import android.net.Uri; +import android.util.Base64; +import android.webkit.CookieManager; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; +import com.getcapacitor.plugin.util.CapacitorHttpUrlConnection; +import com.getcapacitor.plugin.util.HttpRequestHandler; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Helper class meant to be used with the android.webkit.WebView class to enable hosting assets, + * resources and other data on 'virtual' https:// URL. + * Hosting assets and resources on https:// URLs is desirable as it is compatible with the + * Same-Origin policy. + *

+ * This class is intended to be used from within the + * {@link android.webkit.WebViewClient#shouldInterceptRequest(android.webkit.WebView, String)} and + * {@link android.webkit.WebViewClient#shouldInterceptRequest(android.webkit.WebView, + * android.webkit.WebResourceRequest)} + * methods. + */ +public class WebViewLocalServer { + + private static final String capacitorFileStart = Bridge.CAPACITOR_FILE_START; + private static final String capacitorContentStart = Bridge.CAPACITOR_CONTENT_START; + private String basePath; + + private final UriMatcher uriMatcher; + private final AndroidProtocolHandler protocolHandler; + private final ArrayList authorities; + private boolean isAsset; + // Whether to route all requests to paths without extensions back to `index.html` + private final boolean html5mode; + private final JSInjector jsInjector; + private final Bridge bridge; + + /** + * A handler that produces responses for paths on the virtual asset server. + *

+ * Methods of this handler will be invoked on a background thread and care must be taken to + * correctly synchronize access to any shared state. + *

+ * On Android KitKat and above these methods may be called on more than one thread. This thread + * may be different than the thread on which the shouldInterceptRequest method was invoke. + * This means that on Android KitKat and above it is possible to block in this method without + * blocking other resources from loading. The number of threads used to parallelize loading + * is an internal implementation detail of the WebView and may change between updates which + * means that the amount of time spend blocking in this method should be kept to an absolute + * minimum. + */ + public abstract static class PathHandler { + + protected String mimeType; + private String encoding; + private String charset; + private int statusCode; + private String reasonPhrase; + private Map responseHeaders; + + public PathHandler() { + this(null, null, 200, "OK", null); + } + + public PathHandler(String encoding, String charset, int statusCode, String reasonPhrase, Map responseHeaders) { + this.encoding = encoding; + this.charset = charset; + this.statusCode = statusCode; + this.reasonPhrase = reasonPhrase; + Map tempResponseHeaders; + if (responseHeaders == null) { + tempResponseHeaders = new HashMap<>(); + } else { + tempResponseHeaders = responseHeaders; + } + tempResponseHeaders.put("Cache-Control", "no-cache"); + this.responseHeaders = tempResponseHeaders; + } + + public InputStream handle(WebResourceRequest request) { + return handle(request.getUrl()); + } + + public abstract InputStream handle(Uri url); + + public String getEncoding() { + return encoding; + } + + public String getCharset() { + return charset; + } + + public int getStatusCode() { + return statusCode; + } + + public String getReasonPhrase() { + return reasonPhrase; + } + + public Map getResponseHeaders() { + return responseHeaders; + } + } + + WebViewLocalServer(Context context, Bridge bridge, JSInjector jsInjector, ArrayList authorities, boolean html5mode) { + uriMatcher = new UriMatcher(null); + this.html5mode = html5mode; + this.protocolHandler = new AndroidProtocolHandler(context.getApplicationContext()); + this.authorities = authorities; + this.bridge = bridge; + this.jsInjector = jsInjector; + } + + private static Uri parseAndVerifyUrl(String url) { + if (url == null) { + return null; + } + Uri uri = Uri.parse(url); + if (uri == null) { + Logger.error("Malformed URL: " + url); + return null; + } + String path = uri.getPath(); + if (path == null || path.isEmpty()) { + Logger.error("URL does not have a path: " + url); + return null; + } + return uri; + } + + /** + * Attempt to retrieve the WebResourceResponse associated with the given request. + * This method should be invoked from within + * {@link android.webkit.WebViewClient#shouldInterceptRequest(android.webkit.WebView, + * android.webkit.WebResourceRequest)}. + * + * @param request the request to process. + * @return a response if the request URL had a matching handler, null if no handler was found. + */ + public WebResourceResponse shouldInterceptRequest(WebResourceRequest request) { + Uri loadingUrl = request.getUrl(); + + if (null != loadingUrl.getPath() && loadingUrl.getPath().startsWith(Bridge.CAPACITOR_HTTP_INTERCEPTOR_START)) { + Logger.debug("Handling CapacitorHttp request: " + loadingUrl); + try { + return handleCapacitorHttpRequest(request); + } catch (Exception e) { + Logger.error(e.getLocalizedMessage()); + return null; + } + } + + PathHandler handler; + synchronized (uriMatcher) { + handler = (PathHandler) uriMatcher.match(request.getUrl()); + } + if (handler == null) { + return null; + } + + if (isLocalFile(loadingUrl) || isMainUrl(loadingUrl) || !isAllowedUrl(loadingUrl) || isErrorUrl(loadingUrl)) { + Logger.debug("Handling local request: " + request.getUrl().toString()); + return handleLocalRequest(request, handler); + } else { + return handleProxyRequest(request, handler); + } + } + + private boolean isLocalFile(Uri uri) { + String path = uri.getPath(); + return path.startsWith(capacitorContentStart) || path.startsWith(capacitorFileStart); + } + + private boolean isErrorUrl(Uri uri) { + String url = uri.toString(); + return url.equals(bridge.getErrorUrl()); + } + + private boolean isMainUrl(Uri loadingUrl) { + return (bridge.getServerUrl() == null && loadingUrl.getHost().equalsIgnoreCase(bridge.getHost())); + } + + private boolean isAllowedUrl(Uri loadingUrl) { + return !(bridge.getServerUrl() == null && !bridge.getAppAllowNavigationMask().matches(loadingUrl.getHost())); + } + + private String getReasonPhraseFromResponseCode(int code) { + return switch (code) { + case 100 -> "Continue"; + case 101 -> "Switching Protocols"; + case 200 -> "OK"; + case 201 -> "Created"; + case 202 -> "Accepted"; + case 203 -> "Non-Authoritative Information"; + case 204 -> "No Content"; + case 205 -> "Reset Content"; + case 206 -> "Partial Content"; + case 300 -> "Multiple Choices"; + case 301 -> "Moved Permanently"; + case 302 -> "Found"; + case 303 -> "See Other"; + case 304 -> "Not Modified"; + case 400 -> "Bad Request"; + case 401 -> "Unauthorized"; + case 403 -> "Forbidden"; + case 404 -> "Not Found"; + case 405 -> "Method Not Allowed"; + case 406 -> "Not Acceptable"; + case 407 -> "Proxy Authentication Required"; + case 408 -> "Request Timeout"; + case 409 -> "Conflict"; + case 410 -> "Gone"; + case 500 -> "Internal Server Error"; + case 501 -> "Not Implemented"; + case 502 -> "Bad Gateway"; + case 503 -> "Service Unavailable"; + case 504 -> "Gateway Timeout"; + case 505 -> "HTTP Version Not Supported"; + default -> "Unknown"; + }; + } + + private WebResourceResponse handleCapacitorHttpRequest(WebResourceRequest request) throws IOException { + String urlString = request.getUrl().getQueryParameter(Bridge.CAPACITOR_HTTP_INTERCEPTOR_URL_PARAM); + URL url = new URL(urlString); + JSObject headers = new JSObject(); + + for (Map.Entry header : request.getRequestHeaders().entrySet()) { + headers.put(header.getKey(), header.getValue()); + } + + HttpRequestHandler.HttpURLConnectionBuilder connectionBuilder = new HttpRequestHandler.HttpURLConnectionBuilder() + .setUrl(url) + .setMethod(request.getMethod()) + .setHeaders(headers) + .openConnection(); + + CapacitorHttpUrlConnection connection = connectionBuilder.build(); + + if (!isDomainExcludedFromSSL(bridge, url)) { + connection.setSSLSocketFactory(bridge); + } + + connection.connect(); + + String mimeType = null; + String encoding = null; + Map responseHeaders = new LinkedHashMap<>(); + for (Map.Entry> entry : connection.getHeaderFields().entrySet()) { + StringBuilder builder = new StringBuilder(); + for (String value : entry.getValue()) { + builder.append(value); + builder.append(", "); + } + builder.setLength(builder.length() - 2); + + if ("Content-Type".equalsIgnoreCase(entry.getKey())) { + String[] contentTypeParts = builder.toString().split(";"); + mimeType = contentTypeParts[0].trim(); + if (contentTypeParts.length > 1) { + String[] encodingParts = contentTypeParts[1].split("="); + if (encodingParts.length > 1) { + encoding = encodingParts[1].trim(); + } + } + } else { + responseHeaders.put(entry.getKey(), builder.toString()); + } + } + + InputStream inputStream = connection.getErrorStream(); + if (inputStream == null) { + inputStream = connection.getInputStream(); + } + + if (null == mimeType) { + mimeType = getMimeType(request.getUrl().getPath(), inputStream); + } + + int responseCode = connection.getResponseCode(); + String reasonPhrase = getReasonPhraseFromResponseCode(responseCode); + + return new WebResourceResponse(mimeType, encoding, responseCode, reasonPhrase, responseHeaders, inputStream); + } + + private WebResourceResponse handleLocalRequest(WebResourceRequest request, PathHandler handler) { + String path = request.getUrl().getPath(); + + if (request.getRequestHeaders().get("Range") != null) { + InputStream responseStream = new LollipopLazyInputStream(handler, request); + String mimeType = getMimeType(path, responseStream); + Map tempResponseHeaders = handler.getResponseHeaders(); + int statusCode = 206; + try { + int totalRange = responseStream.available(); + String rangeString = request.getRequestHeaders().get("Range"); + String[] parts = rangeString.split("="); + String[] streamParts = parts[1].split("-"); + String fromRange = streamParts[0]; + int range = totalRange - 1; + if (streamParts.length > 1) { + range = Integer.parseInt(streamParts[1]); + } + tempResponseHeaders.put("Accept-Ranges", "bytes"); + tempResponseHeaders.put("Content-Range", "bytes " + fromRange + "-" + range + "/" + totalRange); + } catch (IOException e) { + statusCode = 404; + } + return new WebResourceResponse( + mimeType, + handler.getEncoding(), + statusCode, + handler.getReasonPhrase(), + tempResponseHeaders, + responseStream + ); + } + + if (isLocalFile(request.getUrl()) || isErrorUrl(request.getUrl())) { + InputStream responseStream = new LollipopLazyInputStream(handler, request); + String mimeType = getMimeType(request.getUrl().getPath(), responseStream); + int statusCode = getStatusCode(responseStream, handler.getStatusCode()); + return new WebResourceResponse( + mimeType, + handler.getEncoding(), + statusCode, + handler.getReasonPhrase(), + handler.getResponseHeaders(), + responseStream + ); + } + + if (path.equals("/cordova.js")) { + return new WebResourceResponse( + "application/javascript", + handler.getEncoding(), + handler.getStatusCode(), + handler.getReasonPhrase(), + handler.getResponseHeaders(), + null + ); + } + + if (path.equals("/") || (!request.getUrl().getLastPathSegment().contains(".") && html5mode)) { + InputStream responseStream; + try { + String startPath = this.basePath + "/index.html"; + if (bridge.getRouteProcessor() != null) { + ProcessedRoute processedRoute = bridge.getRouteProcessor().process(this.basePath, "/index.html"); + startPath = processedRoute.getPath(); + isAsset = processedRoute.isAsset(); + } + + if (isAsset) { + responseStream = protocolHandler.openAsset(startPath); + } else { + responseStream = protocolHandler.openFile(startPath); + } + } catch (IOException e) { + Logger.error("Unable to open index.html", e); + return null; + } + + if (jsInjector != null) { + responseStream = jsInjector.getInjectedStream(responseStream); + } + + int statusCode = getStatusCode(responseStream, handler.getStatusCode()); + return new WebResourceResponse( + "text/html", + handler.getEncoding(), + statusCode, + handler.getReasonPhrase(), + handler.getResponseHeaders(), + responseStream + ); + } + + if ("/favicon.ico".equalsIgnoreCase(path)) { + try { + return new WebResourceResponse("image/png", null, null); + } catch (Exception e) { + Logger.error("favicon handling failed", e); + } + } + + int periodIndex = path.lastIndexOf("."); + if (periodIndex >= 0) { + String ext = path.substring(path.lastIndexOf(".")); + + InputStream responseStream = new LollipopLazyInputStream(handler, request); + + // TODO: Conjure up a bit more subtlety than this + if (ext.equals(".html") && jsInjector != null) { + responseStream = jsInjector.getInjectedStream(responseStream); + } + + String mimeType = getMimeType(path, responseStream); + int statusCode = getStatusCode(responseStream, handler.getStatusCode()); + return new WebResourceResponse( + mimeType, + handler.getEncoding(), + statusCode, + handler.getReasonPhrase(), + handler.getResponseHeaders(), + responseStream + ); + } + + return null; + } + + /** + * Prepends an {@code InputStream} with the JavaScript required by Capacitor. + * This method only changes the original {@code InputStream} if {@code WebView} does not + * support the {@code DOCUMENT_START_SCRIPT} feature. + * @param original the original {@code InputStream} + * @return the modified {@code InputStream} + */ + public InputStream getJavaScriptInjectedStream(InputStream original) { + if (jsInjector != null) { + return jsInjector.getInjectedStream(original); + } + return original; + } + + /** + * Instead of reading files from the filesystem/assets, proxy through to the URL + * and let an external server handle it. + * @param request + * @param handler + * @return + */ + private WebResourceResponse handleProxyRequest(WebResourceRequest request, PathHandler handler) { + if (jsInjector != null) { + final String method = request.getMethod(); + if (method.equals("GET")) { + try { + String url = request.getUrl().toString(); + Map headers = request.getRequestHeaders(); + boolean isHtmlText = false; + for (Map.Entry header : headers.entrySet()) { + if (header.getKey().equalsIgnoreCase("Accept") && header.getValue().toLowerCase().contains("text/html")) { + isHtmlText = true; + break; + } + } + if (isHtmlText) { + HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); + for (Map.Entry header : headers.entrySet()) { + conn.setRequestProperty(header.getKey(), header.getValue()); + } + String getCookie = CookieManager.getInstance().getCookie(url); + if (getCookie != null) { + conn.setRequestProperty("Cookie", getCookie); + } + conn.setRequestMethod(method); + conn.setReadTimeout(30 * 1000); + conn.setConnectTimeout(30 * 1000); + if (request.getUrl().getUserInfo() != null) { + byte[] userInfoBytes = request.getUrl().getUserInfo().getBytes(StandardCharsets.UTF_8); + String base64 = Base64.encodeToString(userInfoBytes, Base64.NO_WRAP); + conn.setRequestProperty("Authorization", "Basic " + base64); + } + + List cookies = conn.getHeaderFields().get("Set-Cookie"); + if (cookies != null) { + for (String cookie : cookies) { + CookieManager.getInstance().setCookie(url, cookie); + } + } + InputStream responseStream = conn.getInputStream(); + responseStream = jsInjector.getInjectedStream(responseStream); + + return new WebResourceResponse( + "text/html", + handler.getEncoding(), + handler.getStatusCode(), + handler.getReasonPhrase(), + handler.getResponseHeaders(), + responseStream + ); + } + } catch (Exception ex) { + bridge.handleAppUrlLoadError(ex); + } + } + } + return null; + } + + private String getMimeType(String path, InputStream stream) { + String mimeType = null; + try { + mimeType = URLConnection.guessContentTypeFromName(path); // Does not recognize *.js + if (mimeType != null && path.endsWith(".js") && mimeType.equals("image/x-icon")) { + Logger.debug("We shouldn't be here"); + } + if (mimeType == null) { + if (path.endsWith(".js") || path.endsWith(".mjs")) { + // Make sure JS files get the proper mimetype to support ES modules + mimeType = "application/javascript"; + } else if (path.endsWith(".wasm")) { + mimeType = "application/wasm"; + } else { + mimeType = URLConnection.guessContentTypeFromStream(stream); + } + } + } catch (Exception ex) { + Logger.error("Unable to get mime type" + path, ex); + } + return mimeType; + } + + private int getStatusCode(InputStream stream, int defaultCode) { + int finalStatusCode = defaultCode; + try { + if (stream.available() == -1) { + finalStatusCode = 404; + } + } catch (IOException e) { + finalStatusCode = 500; + } + return finalStatusCode; + } + + /** + * Registers a handler for the given uri. The handler will be invoked + * every time the shouldInterceptRequest method of the instance is called with + * a matching uri. + * + * @param uri the uri to use the handler for. The scheme and authority (domain) will be matched + * exactly. The path may contain a '*' element which will match a single element of + * a path (so a handler registered for /a/* will be invoked for /a/b and /a/c.html + * but not for /a/b/b) or the '**' element which will match any number of path + * elements. + * @param handler the handler to use for the uri. + */ + void register(Uri uri, PathHandler handler) { + synchronized (uriMatcher) { + uriMatcher.addURI(uri.getScheme(), uri.getAuthority(), uri.getPath(), handler); + } + } + + /** + * Hosts the application's assets on an https:// URL. Assets from the local path + * assetPath/... will be available under + * https://{uuid}.androidplatform.net/assets/.... + * + * @param assetPath the local path in the application's asset folder which will be made + * available by the server (for example "/www"). + * @return prefixes under which the assets are hosted. + */ + public void hostAssets(String assetPath) { + this.isAsset = true; + this.basePath = assetPath; + createHostingDetails(); + } + + /** + * Hosts the application's files on an https:// URL. Files from the basePath + * basePath/... will be available under + * https://{uuid}.androidplatform.net/.... + * + * @param basePath the local path in the application's data folder which will be made + * available by the server (for example "/www"). + * @return prefixes under which the assets are hosted. + */ + public void hostFiles(final String basePath) { + this.isAsset = false; + this.basePath = basePath; + createHostingDetails(); + } + + private void createHostingDetails() { + final String assetPath = this.basePath; + + if (assetPath.indexOf('*') != -1) { + throw new IllegalArgumentException("assetPath cannot contain the '*' character."); + } + + PathHandler handler = new PathHandler() { + @Override + public InputStream handle(Uri url) { + InputStream stream = null; + String path = url.getPath(); + + // Pass path to routeProcessor if present + RouteProcessor routeProcessor = bridge.getRouteProcessor(); + boolean ignoreAssetPath = false; + if (routeProcessor != null) { + ProcessedRoute processedRoute = bridge.getRouteProcessor().process("", path); + path = processedRoute.getPath(); + isAsset = processedRoute.isAsset(); + ignoreAssetPath = processedRoute.isIgnoreAssetPath(); + } + + try { + if (path.startsWith(capacitorContentStart)) { + stream = protocolHandler.openContentUrl(url); + } else if (path.startsWith(capacitorFileStart)) { + stream = protocolHandler.openFile(path); + } else if (!isAsset) { + if (routeProcessor == null) { + path = basePath + url.getPath(); + } + + stream = protocolHandler.openFile(path); + } else if (ignoreAssetPath) { + stream = protocolHandler.openAsset(path); + } else { + stream = protocolHandler.openAsset(assetPath + path); + } + } catch (IOException e) { + Logger.error("Unable to open asset URL: " + url); + return null; + } + + return stream; + } + }; + + for (String authority : authorities) { + registerUriForScheme(Bridge.CAPACITOR_HTTP_SCHEME, handler, authority); + registerUriForScheme(Bridge.CAPACITOR_HTTPS_SCHEME, handler, authority); + + String customScheme = this.bridge.getScheme(); + if (!customScheme.equals(Bridge.CAPACITOR_HTTP_SCHEME) && !customScheme.equals(Bridge.CAPACITOR_HTTPS_SCHEME)) { + registerUriForScheme(customScheme, handler, authority); + } + } + } + + private void registerUriForScheme(String scheme, PathHandler handler, String authority) { + Uri.Builder uriBuilder = new Uri.Builder(); + uriBuilder.scheme(scheme); + uriBuilder.authority(authority); + uriBuilder.path(""); + Uri uriPrefix = uriBuilder.build(); + + register(Uri.withAppendedPath(uriPrefix, "/"), handler); + register(Uri.withAppendedPath(uriPrefix, "**"), handler); + } + + /** + * The KitKat WebView reads the InputStream on a separate threadpool. We can use that to + * parallelize loading. + */ + private abstract static class LazyInputStream extends InputStream { + + protected final PathHandler handler; + private InputStream is = null; + + public LazyInputStream(PathHandler handler) { + this.handler = handler; + } + + private InputStream getInputStream() { + if (is == null) { + is = handle(); + } + return is; + } + + protected abstract InputStream handle(); + + @Override + public int available() throws IOException { + InputStream is = getInputStream(); + return (is != null) ? is.available() : -1; + } + + @Override + public int read() throws IOException { + InputStream is = getInputStream(); + return (is != null) ? is.read() : -1; + } + + @Override + public int read(byte[] b) throws IOException { + InputStream is = getInputStream(); + return (is != null) ? is.read(b) : -1; + } + + @Override + public int read(byte[] b, int off, int len) throws IOException { + InputStream is = getInputStream(); + return (is != null) ? is.read(b, off, len) : -1; + } + + @Override + public long skip(long n) throws IOException { + InputStream is = getInputStream(); + return (is != null) ? is.skip(n) : 0; + } + } + + // For L and above. + private static class LollipopLazyInputStream extends LazyInputStream { + + private WebResourceRequest request; + private InputStream is; + + public LollipopLazyInputStream(PathHandler handler, WebResourceRequest request) { + super(handler); + this.request = request; + } + + @Override + protected InputStream handle() { + return handler.handle(request); + } + } + + public String getBasePath() { + return this.basePath; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/ActivityCallback.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/ActivityCallback.java new file mode 100644 index 00000000..a158145d --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/ActivityCallback.java @@ -0,0 +1,11 @@ +package com.getcapacitor.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ActivityCallback { +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/CapacitorPlugin.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/CapacitorPlugin.java new file mode 100644 index 00000000..903378db --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/CapacitorPlugin.java @@ -0,0 +1,35 @@ +package com.getcapacitor.annotation; + +import android.content.Intent; +import com.getcapacitor.PluginCall; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Base annotation for all Plugins + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface CapacitorPlugin { + /** + * A custom name for the plugin, otherwise uses the + * simple class name. + */ + String name() default ""; + + /** + * Request codes this plugin uses and responds to, in order to tie + * Android events back the plugin to handle. + * + * NOTE: This is a legacy option provided to support third party libraries + * not currently implementing the new AndroidX Activity Results API. Plugins + * without this limitation should use a registered callback with + * {@link com.getcapacitor.Plugin#startActivityForResult(PluginCall, Intent, String)} + */ + int[] requestCodes() default {}; + + /** + * Permissions this plugin needs, in order to make permission requests + * easy if the plugin only needs basic permission prompting + */ + Permission[] permissions() default {}; +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/Permission.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/Permission.java new file mode 100644 index 00000000..35114370 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/Permission.java @@ -0,0 +1,22 @@ +package com.getcapacitor.annotation; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * Permission annotation for use with @CapacitorPlugin + */ +@Retention(RetentionPolicy.RUNTIME) +public @interface Permission { + /** + * An array of Android permission strings. + * Eg: {Manifest.permission.ACCESS_COARSE_LOCATION} + * or {"android.permission.ACCESS_COARSE_LOCATION"} + */ + String[] strings() default {}; + + /** + * An optional name to use instead of the Android permission string. + */ + String alias() default ""; +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/PermissionCallback.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/PermissionCallback.java new file mode 100644 index 00000000..d4ca0992 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/annotation/PermissionCallback.java @@ -0,0 +1,11 @@ +package com.getcapacitor.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface PermissionCallback { +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/CapacitorCordovaCookieManager.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/CapacitorCordovaCookieManager.java new file mode 100644 index 00000000..72ac4ee7 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/CapacitorCordovaCookieManager.java @@ -0,0 +1,42 @@ +package com.getcapacitor.cordova; + +import android.webkit.CookieManager; +import android.webkit.WebView; +import org.apache.cordova.ICordovaCookieManager; + +class CapacitorCordovaCookieManager implements ICordovaCookieManager { + + protected final WebView webView; + private final CookieManager cookieManager; + + public CapacitorCordovaCookieManager(WebView webview) { + webView = webview; + cookieManager = CookieManager.getInstance(); + cookieManager.setAcceptThirdPartyCookies(webView, true); + } + + @Override + public void setCookiesEnabled(boolean accept) { + cookieManager.setAcceptCookie(accept); + } + + @Override + public void setCookie(final String url, final String value) { + cookieManager.setCookie(url, value); + } + + @Override + public String getCookie(final String url) { + return cookieManager.getCookie(url); + } + + @Override + public void clearCookies() { + cookieManager.removeAllCookies(null); + } + + @Override + public void flush() { + cookieManager.flush(); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaInterfaceImpl.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaInterfaceImpl.java new file mode 100644 index 00000000..7e8358da --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaInterfaceImpl.java @@ -0,0 +1,39 @@ +package com.getcapacitor.cordova; + +import android.util.Pair; +import androidx.appcompat.app.AppCompatActivity; +import java.util.concurrent.Executors; +import org.apache.cordova.CordovaInterfaceImpl; +import org.apache.cordova.CordovaPlugin; +import org.json.JSONException; + +public class MockCordovaInterfaceImpl extends CordovaInterfaceImpl { + + public MockCordovaInterfaceImpl(AppCompatActivity activity) { + super(activity, Executors.newCachedThreadPool()); + } + + public CordovaPlugin getActivityResultCallback() { + return this.activityResultCallback; + } + + /** + * Checks Cordova permission callbacks to handle permissions defined by a Cordova plugin. + * Returns true if Cordova is handling the permission request with a registered code. + * + * @param requestCode + * @param permissions + * @param grantResults + * @return true if Cordova handled the permission request, false if not + */ + @SuppressWarnings("deprecation") + public boolean handlePermissionResult(int requestCode, String[] permissions, int[] grantResults) throws JSONException { + Pair callback = permissionResultCallbacks.getAndRemoveCallback(requestCode); + if (callback != null) { + callback.first.onRequestPermissionResult(callback.second, permissions, grantResults); + return true; + } + + return false; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java new file mode 100644 index 00000000..d5b77cdd --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/cordova/MockCordovaWebViewImpl.java @@ -0,0 +1,284 @@ +package com.getcapacitor.cordova; + +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.view.View; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebView; +import java.util.List; +import java.util.Map; +import org.apache.cordova.CordovaInterface; +import org.apache.cordova.CordovaPreferences; +import org.apache.cordova.CordovaResourceApi; +import org.apache.cordova.CordovaWebView; +import org.apache.cordova.CordovaWebViewEngine; +import org.apache.cordova.ICordovaCookieManager; +import org.apache.cordova.NativeToJsMessageQueue; +import org.apache.cordova.PluginEntry; +import org.apache.cordova.PluginManager; +import org.apache.cordova.PluginResult; + +public class MockCordovaWebViewImpl implements CordovaWebView { + + private Context context; + private PluginManager pluginManager; + private CordovaPreferences preferences; + private CordovaResourceApi resourceApi; + private NativeToJsMessageQueue nativeToJsMessageQueue; + private CordovaInterface cordova; + private CapacitorCordovaCookieManager cookieManager; + private WebView webView; + private boolean hasPausedEver; + + public MockCordovaWebViewImpl(Context context) { + this.context = context; + } + + @Override + public void init(CordovaInterface cordova, List pluginEntries, CordovaPreferences preferences) { + this.cordova = cordova; + this.preferences = preferences; + this.pluginManager = new PluginManager(this, this.cordova, pluginEntries); + this.resourceApi = new CordovaResourceApi(this.context, this.pluginManager); + this.pluginManager.init(); + } + + public void init(CordovaInterface cordova, List pluginEntries, CordovaPreferences preferences, WebView webView) { + this.cordova = cordova; + this.webView = webView; + this.preferences = preferences; + this.pluginManager = new PluginManager(this, this.cordova, pluginEntries); + this.resourceApi = new CordovaResourceApi(this.context, this.pluginManager); + nativeToJsMessageQueue = new NativeToJsMessageQueue(); + nativeToJsMessageQueue.addBridgeMode(new CapacitorEvalBridgeMode(webView, this.cordova)); + nativeToJsMessageQueue.setBridgeMode(0); + this.cookieManager = new CapacitorCordovaCookieManager(webView); + this.pluginManager.init(); + } + + public static class CapacitorEvalBridgeMode extends NativeToJsMessageQueue.BridgeMode { + + private final WebView webView; + private final CordovaInterface cordova; + + public CapacitorEvalBridgeMode(WebView webView, CordovaInterface cordova) { + this.webView = webView; + this.cordova = cordova; + } + + @Override + public void onNativeToJsMessageAvailable(final NativeToJsMessageQueue queue) { + cordova + .getActivity() + .runOnUiThread( + () -> { + String js = queue.popAndEncodeAsJs(); + if (js != null) { + webView.evaluateJavascript(js, null); + } + } + ); + } + } + + @Override + public boolean isInitialized() { + return cordova != null; + } + + @Override + public View getView() { + return this.webView; + } + + @Override + public void loadUrlIntoView(String url, boolean recreatePlugins) { + if (url.equals("about:blank") || url.startsWith("javascript:")) { + webView.loadUrl(url); + return; + } + } + + @Override + public void stopLoading() {} + + @Override + public boolean canGoBack() { + return false; + } + + @Override + public void clearCache() {} + + @Deprecated + @Override + public void clearCache(boolean b) {} + + @Override + public void clearHistory() {} + + @Override + public boolean backHistory() { + return false; + } + + @Override + public void handlePause(boolean keepRunning) { + if (!isInitialized()) { + return; + } + hasPausedEver = true; + pluginManager.onPause(keepRunning); + triggerDocumentEvent("pause"); + // If app doesn't want to run in background + if (!keepRunning) { + // Pause JavaScript timers. This affects all webviews within the app! + this.setPaused(true); + } + } + + @Override + public void onNewIntent(Intent intent) { + if (this.pluginManager != null) { + this.pluginManager.onNewIntent(intent); + } + } + + @Override + public void handleResume(boolean keepRunning) { + if (!isInitialized()) { + return; + } + this.setPaused(false); + this.pluginManager.onResume(keepRunning); + if (hasPausedEver) { + triggerDocumentEvent("resume"); + } + } + + @Override + public void handleStart() { + if (!isInitialized()) { + return; + } + pluginManager.onStart(); + } + + @Override + public void handleStop() { + if (!isInitialized()) { + return; + } + pluginManager.onStop(); + } + + @Override + public void handleDestroy() { + if (!isInitialized()) { + return; + } + this.pluginManager.onDestroy(); + } + + @Deprecated + @Override + public void sendJavascript(String statememt) { + nativeToJsMessageQueue.addJavaScript(statememt); + } + + public void eval(final String js, final ValueCallback callback) { + Handler mainHandler = new Handler(context.getMainLooper()); + mainHandler.post(() -> webView.evaluateJavascript(js, callback)); + } + + public void triggerDocumentEvent(final String eventName) { + eval("window.Capacitor.triggerEvent('" + eventName + "', 'document');", s -> {}); + } + + @Override + public void showWebPage(String url, boolean openExternal, boolean clearHistory, Map params) {} + + @Deprecated + @Override + public boolean isCustomViewShowing() { + return false; + } + + @Deprecated + @Override + public void showCustomView(View view, WebChromeClient.CustomViewCallback callback) {} + + @Deprecated + @Override + public void hideCustomView() {} + + @Override + public CordovaResourceApi getResourceApi() { + return this.resourceApi; + } + + @Override + public void setButtonPlumbedToJs(int keyCode, boolean override) {} + + @Override + public boolean isButtonPlumbedToJs(int keyCode) { + return false; + } + + @Override + public void sendPluginResult(PluginResult cr, String callbackId) { + nativeToJsMessageQueue.addPluginResult(cr, callbackId); + } + + @Override + public PluginManager getPluginManager() { + return this.pluginManager; + } + + @Override + public CordovaWebViewEngine getEngine() { + return null; + } + + @Override + public CordovaPreferences getPreferences() { + return this.preferences; + } + + @Override + public ICordovaCookieManager getCookieManager() { + return cookieManager; + } + + @Override + public String getUrl() { + return webView.getUrl(); + } + + @Override + public Context getContext() { + return this.webView.getContext(); + } + + @Override + public void loadUrl(String url) { + loadUrlIntoView(url, true); + } + + @Override + public Object postMessage(String id, Object data) { + return pluginManager.postMessage(id, data); + } + + public void setPaused(boolean value) { + if (value) { + webView.onPause(); + webView.pauseTimers(); + } else { + webView.onResume(); + webView.resumeTimers(); + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java new file mode 100644 index 00000000..cf4ab632 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookieManager.java @@ -0,0 +1,239 @@ +package com.getcapacitor.plugin; + +import com.getcapacitor.Bridge; +import com.getcapacitor.Logger; +import java.net.CookieManager; +import java.net.CookiePolicy; +import java.net.CookieStore; +import java.net.HttpCookie; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +public class CapacitorCookieManager extends CookieManager { + + private final android.webkit.CookieManager webkitCookieManager; + + private final String localUrl; + + private final String serverUrl; + + private final String TAG = "CapacitorCookies"; + + /** + * Create a new cookie manager with the default cookie store and policy + */ + public CapacitorCookieManager(Bridge bridge) { + this(null, null, bridge); + } + + /** + * Create a new cookie manager with specified cookie store and cookie policy. + * @param store a {@code CookieStore} to be used by CookieManager. if {@code null}, cookie + * manager will use a default one, which is an in-memory CookieStore implementation. + * @param policy a {@code CookiePolicy} instance to be used by cookie manager as policy + * callback. if {@code null}, ACCEPT_ORIGINAL_SERVER will be used. + */ + public CapacitorCookieManager(CookieStore store, CookiePolicy policy, Bridge bridge) { + super(store, policy); + webkitCookieManager = android.webkit.CookieManager.getInstance(); + this.localUrl = bridge.getLocalUrl(); + this.serverUrl = bridge.getServerUrl(); + } + + public void removeSessionCookies() { + this.webkitCookieManager.removeSessionCookies(null); + } + + public String getSanitizedDomain(String url) throws URISyntaxException { + if (this.serverUrl != null && !this.serverUrl.isEmpty() && (url == null || url.isEmpty() || this.serverUrl.contains(url))) { + url = this.serverUrl; + } else if (this.localUrl != null && !this.localUrl.isEmpty() && (url == null || url.isEmpty() || this.localUrl.contains(url))) { + url = this.localUrl; + } else try { + URI uri = new URI(url); + String scheme = uri.getScheme(); + if (scheme == null || scheme.isEmpty()) { + url = "https://" + url; + } + } catch (URISyntaxException e) { + Logger.error(TAG, "Failed to get scheme from URL.", e); + } + + try { + new URI(url); + } catch (Exception error) { + Logger.error(TAG, "Failed to get sanitized URL.", error); + throw error; + } + return url; + } + + private String getDomainFromCookieString(String cookie) throws URISyntaxException { + String[] domain = cookie.toLowerCase(Locale.ROOT).split("domain="); + return getSanitizedDomain(domain.length <= 1 ? null : domain[1].split(";")[0].trim()); + } + + /** + * Gets the cookies for the given URL. + * @param url the URL for which the cookies are requested + * @return value the cookies as a string, using the format of the 'Cookie' HTTP request header + */ + public String getCookieString(String url) { + try { + url = getSanitizedDomain(url); + Logger.info(TAG, "Getting cookies at: '" + url + "'"); + return webkitCookieManager.getCookie(url); + } catch (Exception error) { + Logger.error(TAG, "Failed to get cookies at the given URL.", error); + } + + return null; + } + + /** + * Gets a cookie value for the given URL and key. + * @param url the URL for which the cookies are requested + * @param key the key of the cookie to search for + * @return the {@code HttpCookie} value of the cookie at the key, + * otherwise it will return a new empty {@code HttpCookie} + */ + public HttpCookie getCookie(String url, String key) { + HttpCookie[] cookies = getCookies(url); + for (HttpCookie cookie : cookies) { + if (cookie.getName().equals(key)) { + return cookie; + } + } + + return null; + } + + /** + * Gets an array of {@code HttpCookie} given a URL. + * @param url the URL for which the cookies are requested + * @return an {@code HttpCookie} array of non-expired cookies + */ + public HttpCookie[] getCookies(String url) { + try { + ArrayList cookieList = new ArrayList<>(); + String cookieString = getCookieString(url); + if (cookieString != null) { + String[] singleCookie = cookieString.split(";"); + for (String c : singleCookie) { + HttpCookie parsed = HttpCookie.parse(c).get(0); + parsed.setValue(parsed.getValue()); + cookieList.add(parsed); + } + } + HttpCookie[] cookies = new HttpCookie[cookieList.size()]; + return cookieList.toArray(cookies); + } catch (Exception ex) { + return new HttpCookie[0]; + } + } + + /** + * Sets a cookie for the given URL. Any existing cookie with the same host, path and name will + * be replaced with the new cookie. The cookie being set will be ignored if it is expired. + * @param url the URL for which the cookie is to be set + * @param value the cookie as a string, using the format of the 'Set-Cookie' HTTP response header + */ + public void setCookie(String url, String value) { + try { + url = getSanitizedDomain(url); + Logger.info(TAG, "Setting cookie '" + value + "' at: '" + url + "'"); + webkitCookieManager.setCookie(url, value); + flush(); + } catch (Exception error) { + Logger.error(TAG, "Failed to set cookie.", error); + } + } + + /** + * Sets a cookie for the given URL. Any existing cookie with the same host, path and name will + * be replaced with the new cookie. The cookie being set will be ignored if it is expired. + * @param url the URL for which the cookie is to be set + * @param key the {@code HttpCookie} name to use for lookup + * @param value the value of the {@code HttpCookie} given a key + */ + public void setCookie(String url, String key, String value) { + String cookieValue = key + "=" + value; + setCookie(url, cookieValue); + } + + public void setCookie(String url, String key, String value, String expires, String path) { + String cookieValue = key + "=" + value + "; expires=" + expires + "; path=" + path; + setCookie(url, cookieValue); + } + + /** + * Removes all cookies. This method is asynchronous. + */ + public void removeAllCookies() { + webkitCookieManager.removeAllCookies(null); + flush(); + } + + /** + * Ensures all cookies currently accessible through the getCookie API are written to persistent + * storage. This call will block the caller until it is done and may perform I/O. + */ + public void flush() { + webkitCookieManager.flush(); + } + + @Override + public void put(URI uri, Map> responseHeaders) { + // make sure our args are valid + if ((uri == null) || (responseHeaders == null)) return; + + // go over the headers + for (String headerKey : responseHeaders.keySet()) { + // ignore headers which aren't cookie related + if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue; + + // process each of the headers + for (String headerValue : Objects.requireNonNull(responseHeaders.get(headerKey))) { + try { + // Set at the requested server url + setCookie(uri.toString(), headerValue); + + // Set at the defined domain in the response or at default capacitor hosted url + setCookie(getDomainFromCookieString(headerValue), headerValue); + } catch (Exception ignored) {} + } + } + } + + @Override + public Map> get(URI uri, Map> requestHeaders) { + // make sure our args are valid + if ((uri == null) || (requestHeaders == null)) throw new IllegalArgumentException("Argument is null"); + + // save our url once + String url = uri.toString(); + + // prepare our response + Map> res = new HashMap<>(); + + // get the cookie + String cookie = getCookieString(url); + + // return it + if (cookie != null) res.put("Cookie", Collections.singletonList(cookie)); + return res; + } + + @Override + public CookieStore getCookieStore() { + // we don't want anyone to work with this cookie store directly + throw new UnsupportedOperationException(); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookies.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookies.java new file mode 100644 index 00000000..64f97d87 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorCookies.java @@ -0,0 +1,122 @@ +package com.getcapacitor.plugin; + +import android.webkit.JavascriptInterface; +import com.getcapacitor.JSObject; +import com.getcapacitor.Plugin; +import com.getcapacitor.PluginCall; +import com.getcapacitor.PluginConfig; +import com.getcapacitor.PluginMethod; +import com.getcapacitor.annotation.CapacitorPlugin; +import java.io.UnsupportedEncodingException; +import java.net.CookieHandler; +import java.net.HttpCookie; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; + +@CapacitorPlugin +public class CapacitorCookies extends Plugin { + + CapacitorCookieManager cookieManager; + + @Override + public void load() { + this.bridge.getWebView().addJavascriptInterface(this, "CapacitorCookiesAndroidInterface"); + this.cookieManager = new CapacitorCookieManager(null, java.net.CookiePolicy.ACCEPT_ALL, this.bridge); + this.cookieManager.removeSessionCookies(); + CookieHandler.setDefault(this.cookieManager); + super.load(); + } + + @Override + protected void handleOnDestroy() { + super.handleOnDestroy(); + this.cookieManager.removeSessionCookies(); + } + + @JavascriptInterface + public boolean isEnabled() { + PluginConfig pluginConfig = getBridge().getConfig().getPluginConfiguration("CapacitorCookies"); + return pluginConfig.getBoolean("enabled", false); + } + + @JavascriptInterface + public void setCookie(String domain, String action) { + cookieManager.setCookie(domain, action); + } + + @PluginMethod + public void getCookies(PluginCall call) { + this.bridge.eval( + "document.cookie", + value -> { + String cookies = value.substring(1, value.length() - 1); + String[] cookieArray = cookies.split(";"); + + JSObject cookieMap = new JSObject(); + + for (String cookie : cookieArray) { + if (cookie.length() > 0) { + String[] keyValue = cookie.split("=", 2); + + if (keyValue.length == 2) { + String key = keyValue[0].trim(); + String val = keyValue[1].trim(); + try { + key = URLDecoder.decode(keyValue[0].trim(), StandardCharsets.UTF_8.name()); + val = URLDecoder.decode(keyValue[1].trim(), StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException ignored) {} + + cookieMap.put(key, val); + } + } + } + + call.resolve(cookieMap); + } + ); + } + + @PluginMethod + public void setCookie(PluginCall call) { + String key = call.getString("key"); + if (null == key) { + call.reject("Must provide key"); + } + String value = call.getString("value"); + if (null == value) { + call.reject("Must provide value"); + } + String url = call.getString("url"); + String expires = call.getString("expires", ""); + String path = call.getString("path", "/"); + cookieManager.setCookie(url, key, value, expires, path); + call.resolve(); + } + + @PluginMethod + public void deleteCookie(PluginCall call) { + String key = call.getString("key"); + if (null == key) { + call.reject("Must provide key"); + } + String url = call.getString("url"); + cookieManager.setCookie(url, key + "=; Expires=Wed, 31 Dec 2000 23:59:59 GMT"); + call.resolve(); + } + + @PluginMethod + public void clearCookies(PluginCall call) { + String url = call.getString("url"); + HttpCookie[] cookies = cookieManager.getCookies(url); + for (HttpCookie cookie : cookies) { + cookieManager.setCookie(url, cookie.getName() + "=; Expires=Wed, 31 Dec 2000 23:59:59 GMT"); + } + call.resolve(); + } + + @PluginMethod + public void clearAllCookies(PluginCall call) { + cookieManager.removeAllCookies(); + call.resolve(); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java new file mode 100644 index 00000000..46bc1741 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/CapacitorHttp.java @@ -0,0 +1,119 @@ +package com.getcapacitor.plugin; + +import android.Manifest; +import android.webkit.JavascriptInterface; +import com.getcapacitor.JSObject; +import com.getcapacitor.Plugin; +import com.getcapacitor.PluginCall; +import com.getcapacitor.PluginConfig; +import com.getcapacitor.PluginMethod; +import com.getcapacitor.annotation.CapacitorPlugin; +import com.getcapacitor.annotation.Permission; +import com.getcapacitor.plugin.util.CapacitorHttpUrlConnection; +import com.getcapacitor.plugin.util.HttpRequestHandler; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +@CapacitorPlugin( + permissions = { + @Permission(strings = { Manifest.permission.WRITE_EXTERNAL_STORAGE }, alias = "HttpWrite"), + @Permission(strings = { Manifest.permission.READ_EXTERNAL_STORAGE }, alias = "HttpRead") + } +) +public class CapacitorHttp extends Plugin { + + private final Map activeRequests = new ConcurrentHashMap<>(); + private final ExecutorService executor = Executors.newCachedThreadPool(); + + @Override + public void load() { + this.bridge.getWebView().addJavascriptInterface(this, "CapacitorHttpAndroidInterface"); + super.load(); + } + + @Override + protected void handleOnDestroy() { + super.handleOnDestroy(); + + for (Map.Entry entry : activeRequests.entrySet()) { + Runnable job = entry.getKey(); + PluginCall call = entry.getValue(); + + if (call.getData().has("activeCapacitorHttpUrlConnection")) { + try { + CapacitorHttpUrlConnection connection = (CapacitorHttpUrlConnection) call + .getData() + .get("activeCapacitorHttpUrlConnection"); + connection.disconnect(); + call.getData().remove("activeCapacitorHttpUrlConnection"); + } catch (Exception ignored) {} + } + + getBridge().releaseCall(call); + } + + activeRequests.clear(); + executor.shutdownNow(); + } + + private void http(final PluginCall call, final String httpMethod) { + Runnable asyncHttpCall = new Runnable() { + @Override + public void run() { + try { + JSObject response = HttpRequestHandler.request(call, httpMethod, getBridge()); + call.resolve(response); + } catch (Exception e) { + call.reject(e.getLocalizedMessage(), e.getClass().getSimpleName(), e); + } finally { + activeRequests.remove(this); + } + } + }; + + if (!executor.isShutdown()) { + activeRequests.put(asyncHttpCall, call); + executor.submit(asyncHttpCall); + } else { + call.reject("Failed to execute request - Http Plugin was shutdown"); + } + } + + @JavascriptInterface + public boolean isEnabled() { + PluginConfig pluginConfig = getBridge().getConfig().getPluginConfiguration("CapacitorHttp"); + return pluginConfig.getBoolean("enabled", false); + } + + @PluginMethod + public void request(final PluginCall call) { + this.http(call, null); + } + + @PluginMethod + public void get(final PluginCall call) { + this.http(call, "GET"); + } + + @PluginMethod + public void post(final PluginCall call) { + this.http(call, "POST"); + } + + @PluginMethod + public void put(final PluginCall call) { + this.http(call, "PUT"); + } + + @PluginMethod + public void patch(final PluginCall call) { + this.http(call, "PATCH"); + } + + @PluginMethod + public void delete(final PluginCall call) { + this.http(call, "DELETE"); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/WebView.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/WebView.java new file mode 100644 index 00000000..096d62a5 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/WebView.java @@ -0,0 +1,48 @@ +package com.getcapacitor.plugin; + +import android.app.Activity; +import android.content.SharedPreferences; +import com.getcapacitor.JSObject; +import com.getcapacitor.Plugin; +import com.getcapacitor.PluginCall; +import com.getcapacitor.PluginMethod; +import com.getcapacitor.annotation.CapacitorPlugin; + +@CapacitorPlugin +public class WebView extends Plugin { + + public static final String WEBVIEW_PREFS_NAME = "CapWebViewSettings"; + public static final String CAP_SERVER_PATH = "serverBasePath"; + + @PluginMethod + public void setServerAssetPath(PluginCall call) { + String path = call.getString("path"); + bridge.setServerAssetPath(path); + call.resolve(); + } + + @PluginMethod + public void setServerBasePath(PluginCall call) { + String path = call.getString("path"); + bridge.setServerBasePath(path); + call.resolve(); + } + + @PluginMethod + public void getServerBasePath(PluginCall call) { + String path = bridge.getServerBasePath(); + JSObject ret = new JSObject(); + ret.put("path", path); + call.resolve(ret); + } + + @PluginMethod + public void persistServerBasePath(PluginCall call) { + String path = bridge.getServerBasePath(); + SharedPreferences prefs = getContext().getSharedPreferences(WEBVIEW_PREFS_NAME, Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(CAP_SERVER_PATH, path); + editor.apply(); + call.resolve(); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/AssetUtil.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/AssetUtil.java new file mode 100644 index 00000000..3a7043bb --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/AssetUtil.java @@ -0,0 +1,358 @@ +package com.getcapacitor.plugin.util; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.res.AssetManager; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.StrictMode; +import androidx.core.content.FileProvider; +import com.getcapacitor.Logger; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.UUID; + +/** + * Manager for assets. + */ +public final class AssetUtil { + + public static final int RESOURCE_ID_ZERO_VALUE = 0; + // Name of the storage folder + private static final String STORAGE_FOLDER = "/capacitorassets"; + + // Ref to the context passed through the constructor to access the + // resources and app directory. + private final Context context; + + /** + * Constructor + * + * @param context Application context. + */ + private AssetUtil(Context context) { + this.context = context; + } + + /** + * Static method to retrieve class instance. + * + * @param context Application context. + */ + public static AssetUtil getInstance(Context context) { + return new AssetUtil(context); + } + + /** + * The URI for a path. + * + * @param path The given path. + */ + public Uri parse(String path) { + if (path == null || path.isEmpty()) { + return Uri.EMPTY; + } else if (path.startsWith("res:")) { + return getUriForResourcePath(path); + } else if (path.startsWith("file:///")) { + return getUriFromPath(path); + } else if (path.startsWith("file://")) { + return getUriFromAsset(path); + } else if (path.startsWith("http")) { + return getUriFromRemote(path); + } else if (path.startsWith("content://")) { + return Uri.parse(path); + } + + return Uri.EMPTY; + } + + /** + * URI for a file. + * + * @param path Absolute path like file:///... + * + * @return URI pointing to the given path. + */ + private Uri getUriFromPath(String path) { + String absPath = path.replaceFirst("file://", "").replaceFirst("\\?.*$", ""); + File file = new File(absPath); + + if (!file.exists()) { + Logger.error("File not found: " + file.getAbsolutePath()); + return Uri.EMPTY; + } + + return getUriFromFile(file); + } + + /** + * URI for an asset. + * + * @param path Asset path like file://... + * + * @return URI pointing to the given path. + */ + private Uri getUriFromAsset(String path) { + String resPath = path.replaceFirst("file:/", "www").replaceFirst("\\?.*$", ""); + String fileName = resPath.substring(resPath.lastIndexOf('/') + 1); + File file = getTmpFile(fileName); + + if (file == null) return Uri.EMPTY; + + try { + AssetManager assets = context.getAssets(); + InputStream in = assets.open(resPath); + FileOutputStream out = new FileOutputStream(file); + copyFile(in, out); + } catch (Exception e) { + Logger.error("File not found: assets/" + resPath); + return Uri.EMPTY; + } + + return getUriFromFile(file); + } + + /** + * The URI for a resource. + * + * @param path The given relative path. + * + * @return URI pointing to the given path. + */ + private Uri getUriForResourcePath(String path) { + Resources res = context.getResources(); + String resPath = path.replaceFirst("res://", ""); + int resId = getResId(resPath); + + if (resId == 0) { + Logger.error("File not found: " + resPath); + return Uri.EMPTY; + } + + return new Uri.Builder() + .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) + .authority(res.getResourcePackageName(resId)) + .appendPath(res.getResourceTypeName(resId)) + .appendPath(res.getResourceEntryName(resId)) + .build(); + } + + /** + * Uri from remote located content. + * + * @param path Remote address. + * + * @return Uri of the downloaded file. + */ + private Uri getUriFromRemote(String path) { + File file = getTmpFile(); + + if (file == null) return Uri.EMPTY; + + try { + URL url = new URL(path); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + + StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); + + StrictMode.setThreadPolicy(policy); + + connection.setRequestProperty("Connection", "close"); + connection.setConnectTimeout(5000); + connection.connect(); + + InputStream in = connection.getInputStream(); + FileOutputStream out = new FileOutputStream(file); + + copyFile(in, out); + return getUriFromFile(file); + } catch (MalformedURLException e) { + Logger.error(Logger.tags("Asset"), "Incorrect URL", e); + } catch (FileNotFoundException e) { + Logger.error(Logger.tags("Asset"), "Failed to create new File from HTTP Content", e); + } catch (IOException e) { + Logger.error(Logger.tags("Asset"), "No Input can be created from http Stream", e); + } + + return Uri.EMPTY; + } + + /** + * Copy content from input stream into output stream. + * + * @param in The input stream. + * @param out The output stream. + */ + private void copyFile(InputStream in, FileOutputStream out) { + byte[] buffer = new byte[1024]; + int read; + + try { + while ((read = in.read(buffer)) != -1) { + out.write(buffer, 0, read); + } + out.flush(); + out.close(); + } catch (Exception e) { + Logger.error("Error copying", e); + } + } + + /** + * Resource ID for drawable. + * + * @param resPath Resource path as string. + * + * @return The resource ID or 0 if not found. + */ + public int getResId(String resPath) { + int resId = getResId(context.getResources(), resPath); + + if (resId == 0) { + resId = getResId(Resources.getSystem(), resPath); + } + + return resId; + } + + /** + * Get resource ID. + * + * @param res The resources where to look for. + * @param resPath The name of the resource. + * + * @return The resource ID or 0 if not found. + */ + private int getResId(Resources res, String resPath) { + String pkgName = getPkgName(res); + String resName = getBaseName(resPath); + int resId; + + resId = res.getIdentifier(resName, "mipmap", pkgName); + + if (resId == 0) { + resId = res.getIdentifier(resName, "drawable", pkgName); + } + + if (resId == 0) { + resId = res.getIdentifier(resName, "raw", pkgName); + } + + return resId; + } + + /** + * Convert URI to Bitmap. + * + * @param uri Internal image URI + */ + public Bitmap getIconFromUri(Uri uri) throws IOException { + InputStream input = context.getContentResolver().openInputStream(uri); + return BitmapFactory.decodeStream(input); + } + + /** + * Extract name of drawable resource from path. + * + * @param resPath Resource path as string. + */ + private String getBaseName(String resPath) { + String drawable = resPath; + + if (drawable.contains("/")) { + drawable = drawable.substring(drawable.lastIndexOf('/') + 1); + } + + if (resPath.contains(".")) { + drawable = drawable.substring(0, drawable.lastIndexOf('.')); + } + + return drawable; + } + + /** + * Returns a file located under the external cache dir of that app. + * + * @return File with a random UUID name. + */ + private File getTmpFile() { + return getTmpFile(UUID.randomUUID().toString()); + } + + /** + * Returns a file located under the external cache dir of that app. + * + * @param name The name of the file. + * + * @return File with the provided name. + */ + private File getTmpFile(String name) { + File dir = context.getExternalCacheDir(); + + if (dir == null) { + dir = context.getCacheDir(); + } + + if (dir == null) { + Logger.error(Logger.tags("Asset"), "Missing cache dir", null); + return null; + } + + String storage = dir.toString() + STORAGE_FOLDER; + + //noinspection ResultOfMethodCallIgnored + new File(storage).mkdir(); + + return new File(storage, name); + } + + /** + * Get content URI for the specified file. + * + * @param file The file to get the URI. + * + * @return content://... + */ + private Uri getUriFromFile(File file) { + try { + String authority = context.getPackageName() + ".provider"; + return FileProvider.getUriForFile(context, authority, file); + } catch (IllegalArgumentException e) { + Logger.error("File not supported by provider", e); + return Uri.EMPTY; + } + } + + /** + * Package name specified by the resource bundle. + */ + private String getPkgName(Resources res) { + return res == Resources.getSystem() ? "android" : context.getPackageName(); + } + + public static int getResourceID(Context context, String resourceName, String dir) { + return context.getResources().getIdentifier(resourceName, dir, context.getPackageName()); + } + + public static String getResourceBaseName(String resPath) { + if (resPath == null) return null; + + if (resPath.contains("/")) { + return resPath.substring(resPath.lastIndexOf('/') + 1); + } + + if (resPath.contains(".")) { + return resPath.substring(0, resPath.lastIndexOf('.')); + } + + return resPath; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java new file mode 100644 index 00000000..44115374 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/CapacitorHttpUrlConnection.java @@ -0,0 +1,478 @@ +package com.getcapacitor.plugin.util; + +import android.os.Build; +import android.os.LocaleList; +import android.text.TextUtils; +import com.getcapacitor.Bridge; +import com.getcapacitor.JSArray; +import com.getcapacitor.JSObject; +import com.getcapacitor.JSValue; +import com.getcapacitor.PluginCall; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.Method; +import java.net.HttpURLConnection; +import java.net.ProtocolException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLEncoder; +import java.net.UnknownServiceException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSocketFactory; +import org.json.JSONException; +import org.json.JSONObject; + +public class CapacitorHttpUrlConnection implements ICapacitorHttpUrlConnection { + + private final HttpURLConnection connection; + + /** + * Make a new CapacitorHttpUrlConnection instance, which wraps around HttpUrlConnection + * and provides some helper functions for setting request headers and the request body + * @param conn the base HttpUrlConnection. You can pass the value from + * {@code (HttpUrlConnection) URL.openConnection()} + */ + public CapacitorHttpUrlConnection(HttpURLConnection conn) { + connection = conn; + this.setDefaultRequestProperties(); + } + + /** + * Returns the underlying HttpUrlConnection value + * @return the underlying HttpUrlConnection value + */ + public HttpURLConnection getHttpConnection() { + return connection; + } + + public void disconnect() { + connection.disconnect(); + } + + /** + * Set the value of the {@code allowUserInteraction} field of + * this {@code URLConnection}. + * + * @param isAllowedInteraction the new value. + * @throws IllegalStateException if already connected + */ + public void setAllowUserInteraction(boolean isAllowedInteraction) { + connection.setAllowUserInteraction(isAllowedInteraction); + } + + /** + * Set the method for the URL request, one of: + *

    + *
  • GET + *
  • POST + *
  • HEAD + *
  • OPTIONS + *
  • PUT + *
  • DELETE + *
  • TRACE + *
are legal, subject to protocol restrictions. The default + * method is GET. + * + * @param method the HTTP method + * @exception ProtocolException if the method cannot be reset or if + * the requested method isn't valid for HTTP. + * @exception SecurityException if a security manager is set and the + * method is "TRACE", but the "allowHttpTrace" + * NetPermission is not granted. + */ + public void setRequestMethod(String method) throws ProtocolException { + connection.setRequestMethod(method); + } + + /** + * Sets a specified timeout value, in milliseconds, to be used + * when opening a communications link to the resource referenced + * by this URLConnection. If the timeout expires before the + * connection can be established, a + * java.net.SocketTimeoutException is raised. A timeout of zero is + * interpreted as an infinite timeout. + * + *

Warning: If the hostname resolves to multiple IP + * addresses, Android's default implementation of {@link HttpURLConnection} + * will try each in + * RFC 3484 order. If + * connecting to each of these addresses fails, multiple timeouts will + * elapse before the connect attempt throws an exception. Host names + * that support both IPv6 and IPv4 always have at least 2 IP addresses. + * + * @param timeout an {@code int} that specifies the connect + * timeout value in milliseconds + * @throws IllegalArgumentException if the timeout parameter is negative + */ + public void setConnectTimeout(int timeout) { + if (timeout < 0) { + throw new IllegalArgumentException("timeout can not be negative"); + } + connection.setConnectTimeout(timeout); + } + + /** + * Sets the read timeout to a specified timeout, in + * milliseconds. A non-zero value specifies the timeout when + * reading from Input stream when a connection is established to a + * resource. If the timeout expires before there is data available + * for read, a java.net.SocketTimeoutException is raised. A + * timeout of zero is interpreted as an infinite timeout. + * + * @param timeout an {@code int} that specifies the timeout + * value to be used in milliseconds + * @throws IllegalArgumentException if the timeout parameter is negative + */ + public void setReadTimeout(int timeout) { + if (timeout < 0) { + throw new IllegalArgumentException("timeout can not be negative"); + } + connection.setReadTimeout(timeout); + } + + /** + * Sets whether automatic HTTP redirects should be disabled + * @param disableRedirects the flag to determine if redirects should be followed + */ + public void setDisableRedirects(boolean disableRedirects) { + connection.setInstanceFollowRedirects(!disableRedirects); + } + + /** + * Sets the request headers given a JSObject of key-value pairs + * @param headers the JSObject values to map to the HttpUrlConnection request headers + */ + public void setRequestHeaders(JSObject headers) { + Iterator keys = headers.keys(); + while (keys.hasNext()) { + String key = keys.next(); + String value = headers.getString(key); + connection.setRequestProperty(key, value); + } + } + + /** + * Sets the value of the {@code doOutput} field for this + * {@code URLConnection} to the specified value. + *

+ * A URL connection can be used for input and/or output. Set the DoOutput + * flag to true if you intend to use the URL connection for output, + * false if not. The default is false. + * + * @param shouldDoOutput the new value. + * @throws IllegalStateException if already connected + */ + public void setDoOutput(boolean shouldDoOutput) { + connection.setDoOutput(shouldDoOutput); + } + + /** + * + * @param call + * @throws JSONException + * @throws IOException + */ + public void setRequestBody(PluginCall call, JSValue body) throws JSONException, IOException { + setRequestBody(call, body, null); + } + + /** + * + * @param call + * @throws JSONException + * @throws IOException + */ + public void setRequestBody(PluginCall call, JSValue body, String bodyType) throws JSONException, IOException { + String contentType = connection.getRequestProperty("Content-Type"); + String dataString = ""; + + if (contentType == null || contentType.isEmpty()) return; + + if (contentType.contains("application/json")) { + JSArray jsArray = null; + if (body != null) { + dataString = body.toString(); + } else { + jsArray = call.getArray("data", null); + } + if (jsArray != null) { + dataString = jsArray.toString(); + } else if (body == null) { + dataString = call.getString("data"); + } + this.writeRequestBody(dataString != null ? dataString : ""); + } else if (bodyType != null && bodyType.equals("file")) { + try (DataOutputStream os = new DataOutputStream(connection.getOutputStream())) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + os.write(Base64.getDecoder().decode(body.toString())); + } + os.flush(); + } + } else if (contentType.contains("application/x-www-form-urlencoded")) { + try { + JSObject obj = body.toJSObject(); + this.writeObjectRequestBody(obj); + } catch (Exception e) { + // Body is not a valid JSON, treat it as an already formatted string + this.writeRequestBody(body.toString()); + } + } else if (bodyType != null && bodyType.equals("formData")) { + this.writeFormDataRequestBody(contentType, body.toJSArray()); + } else { + this.writeRequestBody(body.toString()); + } + } + + /** + * Writes the provided string to the HTTP connection managed by this instance. + * + * @param body The string value to write to the connection stream. + */ + private void writeRequestBody(String body) throws IOException { + try (DataOutputStream os = new DataOutputStream(connection.getOutputStream())) { + os.write(body.getBytes(StandardCharsets.UTF_8)); + os.flush(); + } + } + + private void writeObjectRequestBody(JSObject object) throws IOException, JSONException { + try (DataOutputStream os = new DataOutputStream(connection.getOutputStream())) { + Iterator keys = object.keys(); + while (keys.hasNext()) { + String key = keys.next(); + Object d = object.get(key); + os.writeBytes(key); + os.writeBytes("="); + os.writeBytes(URLEncoder.encode(d.toString(), "UTF-8")); + + if (keys.hasNext()) { + os.writeBytes("&"); + } + } + os.flush(); + } + } + + private void writeFormDataRequestBody(String contentType, JSArray entries) throws IOException, JSONException { + try (DataOutputStream os = new DataOutputStream(connection.getOutputStream())) { + String boundary = contentType.split(";")[1].split("=")[1]; + String lineEnd = "\r\n"; + String twoHyphens = "--"; + + for (Object e : entries.toList()) { + if (e instanceof JSONObject) { + JSONObject entry = (JSONObject) e; + String type = entry.getString("type"); + String key = entry.getString("key"); + String value = entry.getString("value"); + if (type.equals("string")) { + os.writeBytes(twoHyphens + boundary + lineEnd); + os.writeBytes("Content-Disposition: form-data; name=\"" + key + "\"" + lineEnd + lineEnd); + os.write(value.getBytes(StandardCharsets.UTF_8)); + os.writeBytes(lineEnd); + } else if (type.equals("base64File")) { + String fileName = entry.getString("fileName"); + String fileContentType = entry.getString("contentType"); + + os.writeBytes(twoHyphens + boundary + lineEnd); + os.writeBytes("Content-Disposition: form-data; name=\"" + key + "\"; filename=\"" + fileName + "\"" + lineEnd); + os.writeBytes("Content-Type: " + fileContentType + lineEnd); + os.writeBytes("Content-Transfer-Encoding: binary" + lineEnd); + os.writeBytes(lineEnd); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + os.write(Base64.getDecoder().decode(value)); + } else { + os.write(android.util.Base64.decode(value, android.util.Base64.DEFAULT)); + } + + os.writeBytes(lineEnd); + } + } + } + + os.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); + os.flush(); + } + } + + /** + * Opens a communications link to the resource referenced by this + * URL, if such a connection has not already been established. + *

+ * If the {@code connect} method is called when the connection + * has already been opened (indicated by the {@code connected} + * field having the value {@code true}), the call is ignored. + *

+ * URLConnection objects go through two phases: first they are + * created, then they are connected. After being created, and + * before being connected, various options can be specified + * (e.g., doInput and UseCaches). After connecting, it is an + * error to try to set them. Operations that depend on being + * connected, like getContentLength, will implicitly perform the + * connection, if necessary. + * + * @throws SocketTimeoutException if the timeout expires before + * the connection can be established + * @exception IOException if an I/O error occurs while opening the + * connection. + */ + public void connect() throws IOException { + connection.connect(); + } + + /** + * Gets the status code from an HTTP response message. + * For example, in the case of the following status lines: + *

+     * HTTP/1.0 200 OK
+     * HTTP/1.0 401 Unauthorized
+     * 
+ * It will return 200 and 401 respectively. + * Returns -1 if no code can be discerned + * from the response (i.e., the response is not valid HTTP). + * @throws IOException if an error occurred connecting to the server. + * @return the HTTP Status-Code, or -1 + */ + public int getResponseCode() throws IOException { + return connection.getResponseCode(); + } + + /** + * Returns the value of this {@code URLConnection}'s {@code URL} + * field. + * + * @return the value of this {@code URLConnection}'s {@code URL} + * field. + */ + public URL getURL() { + return connection.getURL(); + } + + /** + * Returns the error stream if the connection failed + * but the server sent useful data nonetheless. The + * typical example is when an HTTP server responds + * with a 404, which will cause a FileNotFoundException + * to be thrown in connect, but the server sent an HTML + * help page with suggestions as to what to do. + * + *

This method will not cause a connection to be initiated. If + * the connection was not connected, or if the server did not have + * an error while connecting or if the server had an error but + * no error data was sent, this method will return null. This is + * the default. + * + * @return an error stream if any, null if there have been no + * errors, the connection is not connected or the server sent no + * useful data. + */ + @Override + public InputStream getErrorStream() { + return connection.getErrorStream(); + } + + /** + * Returns the value of the named header field. + *

+ * If called on a connection that sets the same header multiple times + * with possibly different values, only the last value is returned. + * + * + * @param name the name of a header field. + * @return the value of the named header field, or {@code null} + * if there is no such field in the header. + */ + @Override + public String getHeaderField(String name) { + return connection.getHeaderField(name); + } + + /** + * Returns an input stream that reads from this open connection. + * + * A SocketTimeoutException can be thrown when reading from the + * returned input stream if the read timeout expires before data + * is available for read. + * + * @return an input stream that reads from this open connection. + * @exception IOException if an I/O error occurs while + * creating the input stream. + * @exception UnknownServiceException if the protocol does not support + * input. + * @see #setReadTimeout(int) + */ + @Override + public InputStream getInputStream() throws IOException { + return connection.getInputStream(); + } + + /** + * Returns an unmodifiable Map of the header fields. + * The Map keys are Strings that represent the + * response-header field names. Each Map value is an + * unmodifiable List of Strings that represents + * the corresponding field values. + * + * @return a Map of header fields + */ + public Map> getHeaderFields() { + return connection.getHeaderFields(); + } + + /** + * Sets the default request properties on the newly created connection. + * This is called as early as possible to allow overrides by user-provided values. + */ + private void setDefaultRequestProperties() { + String acceptLanguage = buildDefaultAcceptLanguageProperty(); + if (!TextUtils.isEmpty(acceptLanguage)) { + connection.setRequestProperty("Accept-Language", acceptLanguage); + } + } + + /** + * Builds and returns a locale string describing the device's current locale preferences. + */ + private String buildDefaultAcceptLanguageProperty() { + Locale locale; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + locale = LocaleList.getDefault().get(0); + } else { + locale = Locale.getDefault(); + } + String result = ""; + String lang = locale.getLanguage(); + String country = locale.getCountry(); + if (!TextUtils.isEmpty(lang)) { + if (!TextUtils.isEmpty(country)) { + result = String.format("%s-%s,%s;q=0.5", lang, country, lang); + } else { + result = String.format("%s;q=0.5", lang); + } + } + return result; + } + + public void setSSLSocketFactory(Bridge bridge) { + // Attach SSL Certificates if Enterprise Plugin is available + try { + Class sslPinningImpl = Class.forName("io.ionic.sslpinning.SSLPinning"); + Method method = sslPinningImpl.getDeclaredMethod("getSSLSocketFactory", Bridge.class); + SSLSocketFactory sslSocketFactory = (SSLSocketFactory) method.invoke( + sslPinningImpl.getDeclaredConstructor().newInstance(), + bridge + ); + if (sslSocketFactory != null) { + ((HttpsURLConnection) this.connection).setSSLSocketFactory(sslSocketFactory); + } + } catch (Exception ignored) {} + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java new file mode 100644 index 00000000..be72678c --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/HttpRequestHandler.java @@ -0,0 +1,452 @@ +package com.getcapacitor.plugin.util; + +import android.text.TextUtils; +import android.util.Base64; +import com.getcapacitor.Bridge; +import com.getcapacitor.JSArray; +import com.getcapacitor.JSObject; +import com.getcapacitor.JSValue; +import com.getcapacitor.PluginCall; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Method; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Iterator; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +public class HttpRequestHandler { + + /** + * An enum specifying conventional HTTP Response Types + * See https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseType + */ + public enum ResponseType { + ARRAY_BUFFER("arraybuffer"), + BLOB("blob"), + DOCUMENT("document"), + JSON("json"), + TEXT("text"); + + private final String name; + + ResponseType(String name) { + this.name = name; + } + + static final ResponseType DEFAULT = TEXT; + + public static ResponseType parse(String value) { + for (ResponseType responseType : values()) { + if (responseType.name.equalsIgnoreCase(value)) { + return responseType; + } + } + return DEFAULT; + } + } + + /** + * Internal builder class for building a CapacitorHttpUrlConnection + */ + public static class HttpURLConnectionBuilder { + + public Integer connectTimeout; + public Integer readTimeout; + public Boolean disableRedirects; + public JSObject headers; + public String method; + public URL url; + + public CapacitorHttpUrlConnection connection; + + public HttpURLConnectionBuilder setConnectTimeout(Integer connectTimeout) { + this.connectTimeout = connectTimeout; + return this; + } + + public HttpURLConnectionBuilder setReadTimeout(Integer readTimeout) { + this.readTimeout = readTimeout; + return this; + } + + public HttpURLConnectionBuilder setDisableRedirects(Boolean disableRedirects) { + this.disableRedirects = disableRedirects; + return this; + } + + public HttpURLConnectionBuilder setHeaders(JSObject headers) { + this.headers = headers; + return this; + } + + public HttpURLConnectionBuilder setMethod(String method) { + this.method = method; + return this; + } + + public HttpURLConnectionBuilder setUrl(URL url) { + this.url = url; + return this; + } + + public HttpURLConnectionBuilder openConnection() throws IOException { + connection = new CapacitorHttpUrlConnection((HttpURLConnection) url.openConnection()); + + connection.setAllowUserInteraction(false); + connection.setRequestMethod(method); + + if (connectTimeout != null) connection.setConnectTimeout(connectTimeout); + if (readTimeout != null) connection.setReadTimeout(readTimeout); + if (disableRedirects != null) connection.setDisableRedirects(disableRedirects); + + connection.setRequestHeaders(headers); + return this; + } + + public HttpURLConnectionBuilder setUrlParams(JSObject params) throws MalformedURLException, URISyntaxException, JSONException { + return this.setUrlParams(params, true); + } + + public HttpURLConnectionBuilder setUrlParams(JSObject params, boolean shouldEncode) + throws URISyntaxException, MalformedURLException { + String initialQuery = url.getQuery(); + String initialQueryBuilderStr = initialQuery == null ? "" : initialQuery; + + Iterator keys = params.keys(); + + if (!keys.hasNext()) { + return this; + } + + StringBuilder urlQueryBuilder = new StringBuilder(initialQueryBuilderStr); + + // Build the new query string + while (keys.hasNext()) { + String key = keys.next(); + + // Attempt as JSONArray and fallback to string if it fails + try { + StringBuilder value = new StringBuilder(); + JSONArray arr = params.getJSONArray(key); + for (int x = 0; x < arr.length(); x++) { + this.addUrlParam(value, key, arr.getString(x), shouldEncode); + if (x != arr.length() - 1) { + value.append("&"); + } + } + if (urlQueryBuilder.length() > 0) { + urlQueryBuilder.append("&"); + } + urlQueryBuilder.append(value); + } catch (JSONException e) { + if (urlQueryBuilder.length() > 0) { + urlQueryBuilder.append("&"); + } + this.addUrlParam(urlQueryBuilder, key, params.getString(key), shouldEncode); + } + } + + String urlQuery = urlQueryBuilder.toString(); + + URI uri = url.toURI(); + String unEncodedUrlString = + uri.getScheme() + + "://" + + uri.getAuthority() + + uri.getPath() + + ((!urlQuery.equals("")) ? "?" + urlQuery : "") + + ((uri.getFragment() != null) ? uri.getFragment() : ""); + this.url = new URL(unEncodedUrlString); + + return this; + } + + private static void addUrlParam(StringBuilder sb, String key, String value, boolean shouldEncode) { + if (shouldEncode) { + try { + key = URLEncoder.encode(key, "UTF-8"); + value = URLEncoder.encode(value, "UTF-8"); + } catch (UnsupportedEncodingException ex) { + throw new RuntimeException(ex.getCause()); + } + } + sb.append(key).append("=").append(value); + } + + public CapacitorHttpUrlConnection build() { + return connection; + } + } + + /** + * Builds an HTTP Response given CapacitorHttpUrlConnection and ResponseType objects. + * Defaults to ResponseType.DEFAULT + * @param connection The CapacitorHttpUrlConnection to respond with + * @throws IOException Thrown if the InputStream is unable to be parsed correctly + * @throws JSONException Thrown if the JSON is unable to be parsed + */ + public static JSObject buildResponse(CapacitorHttpUrlConnection connection) throws IOException, JSONException { + return buildResponse(connection, ResponseType.DEFAULT); + } + + /** + * Builds an HTTP Response given CapacitorHttpUrlConnection and ResponseType objects + * @param connection The CapacitorHttpUrlConnection to respond with + * @param responseType The requested ResponseType + * @return A JSObject that contains the HTTPResponse to return to the browser + * @throws IOException Thrown if the InputStream is unable to be parsed correctly + * @throws JSONException Thrown if the JSON is unable to be parsed + */ + public static JSObject buildResponse(CapacitorHttpUrlConnection connection, ResponseType responseType) + throws IOException, JSONException { + int statusCode = connection.getResponseCode(); + + JSObject output = new JSObject(); + output.put("status", statusCode); + output.put("headers", buildResponseHeaders(connection)); + output.put("url", connection.getURL()); + output.put("data", readData(connection, responseType)); + + InputStream errorStream = connection.getErrorStream(); + if (errorStream != null) { + output.put("error", true); + } + + return output; + } + + /** + * Read the existing ICapacitorHttpUrlConnection data + * @param connection The ICapacitorHttpUrlConnection object to read in + * @param responseType The type of HTTP response to return to the API + * @return The parsed data from the connection + * @throws IOException Thrown if the InputStreams cannot be properly parsed + * @throws JSONException Thrown if the JSON is malformed when parsing as JSON + */ + public static Object readData(ICapacitorHttpUrlConnection connection, ResponseType responseType) throws IOException, JSONException { + InputStream errorStream = connection.getErrorStream(); + String contentType = connection.getHeaderField("Content-Type"); + + if (errorStream != null) { + if (isOneOf(contentType, MimeType.APPLICATION_JSON, MimeType.APPLICATION_VND_API_JSON)) { + return parseJSON(readStreamAsString(errorStream)); + } else { + return readStreamAsString(errorStream); + } + } else if (contentType != null && contentType.contains(MimeType.APPLICATION_JSON.getValue())) { + // backward compatibility + return parseJSON(readStreamAsString(connection.getInputStream())); + } else { + InputStream stream = connection.getInputStream(); + switch (responseType) { + case ARRAY_BUFFER: + case BLOB: + return readStreamAsBase64(stream); + case JSON: + return parseJSON(readStreamAsString(stream)); + case DOCUMENT: + case TEXT: + default: + return readStreamAsString(stream); + } + } + } + + /** + * Helper function for determining if the Content-Type is a typeof an existing Mime-Type + * @param contentType The Content-Type string to check for + * @param mimeTypes The Mime-Type values to check against + * @return + */ + public static boolean isOneOf(String contentType, MimeType... mimeTypes) { + if (contentType != null) { + for (MimeType mimeType : mimeTypes) { + if (contentType.contains(mimeType.getValue())) { + return true; + } + } + } + return false; + } + + /** + * Build the JSObject response headers based on the connection header map + * @param connection The CapacitorHttpUrlConnection connection + * @return A JSObject of the header values from the CapacitorHttpUrlConnection + */ + public static JSObject buildResponseHeaders(CapacitorHttpUrlConnection connection) { + JSObject output = new JSObject(); + + for (Map.Entry> entry : connection.getHeaderFields().entrySet()) { + String valuesString = TextUtils.join(", ", entry.getValue()); + output.put(entry.getKey(), valuesString); + } + + return output; + } + + /** + * Returns a JSObject or a JSArray based on a string-ified input + * @param input String-ified JSON that needs parsing + * @return A JSObject or JSArray + * @throws JSONException thrown if the JSON is malformed + */ + public static Object parseJSON(String input) throws JSONException { + JSONObject json = new JSONObject(); + try { + if ("null".equals(input.trim())) { + return JSONObject.NULL; + } else if ("true".equals(input.trim())) { + return true; + } else if ("false".equals(input.trim())) { + return false; + } else if (input.trim().length() <= 0) { + return ""; + } else if (input.trim().matches("^\".*\"$")) { + // a string enclosed in " " is a json value, return the string without the quotes + return input.trim().substring(1, input.trim().length() - 1); + } else if (input.trim().matches("^-?\\d+$")) { + return Integer.parseInt(input.trim()); + } else if (input.trim().matches("^-?\\d+(\\.\\d+)?$")) { + return Double.parseDouble(input.trim()); + } else { + try { + return new JSObject(input); + } catch (JSONException e) { + return new JSArray(input); + } + } + } catch (JSONException e) { + return input; + } + } + + /** + * Returns a string based on a base64 InputStream + * @param in The base64 InputStream to convert to a String + * @return String value of InputStream + * @throws IOException thrown if the InputStream is unable to be read as base64 + */ + public static String readStreamAsBase64(InputStream in) throws IOException { + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + byte[] buffer = new byte[1024]; + int readBytes; + while ((readBytes = in.read(buffer)) != -1) { + out.write(buffer, 0, readBytes); + } + byte[] result = out.toByteArray(); + return Base64.encodeToString(result, 0, result.length, Base64.DEFAULT); + } + } + + /** + * Returns a string based on an InputStream + * @param in The InputStream to convert to a String + * @return String value of InputStream + * @throws IOException thrown if the InputStream is unable to be read + */ + public static String readStreamAsString(InputStream in) throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { + StringBuilder builder = new StringBuilder(); + String line = reader.readLine(); + while (line != null) { + builder.append(line); + line = reader.readLine(); + if (line != null) { + builder.append(System.getProperty("line.separator")); + } + } + return builder.toString(); + } + } + + /** + * Makes an Http Request based on the PluginCall parameters + * @param call The Capacitor PluginCall that contains the options need for an Http request + * @param httpMethod The HTTP method that overrides the PluginCall HTTP method + * @throws IOException throws an IO request when a connection can't be made + * @throws URISyntaxException thrown when the URI is malformed + * @throws JSONException thrown when the incoming JSON is malformed + */ + public static JSObject request(PluginCall call, String httpMethod, Bridge bridge) + throws IOException, URISyntaxException, JSONException { + String urlString = call.getString("url", ""); + JSObject headers = call.getObject("headers", new JSObject()); + JSObject params = call.getObject("params", new JSObject()); + Integer connectTimeout = call.getInt("connectTimeout"); + Integer readTimeout = call.getInt("readTimeout"); + Boolean disableRedirects = call.getBoolean("disableRedirects"); + Boolean shouldEncode = call.getBoolean("shouldEncodeUrlParams", true); + ResponseType responseType = ResponseType.parse(call.getString("responseType")); + String dataType = call.getString("dataType"); + + String method = httpMethod != null ? httpMethod.toUpperCase(Locale.ROOT) : call.getString("method", "GET").toUpperCase(Locale.ROOT); + + boolean isHttpMutate = method.equals("DELETE") || method.equals("PATCH") || method.equals("POST") || method.equals("PUT"); + + URL url = new URL(urlString); + HttpURLConnectionBuilder connectionBuilder = new HttpURLConnectionBuilder() + .setUrl(url) + .setMethod(method) + .setHeaders(headers) + .setUrlParams(params, shouldEncode) + .setConnectTimeout(connectTimeout) + .setReadTimeout(readTimeout) + .setDisableRedirects(disableRedirects) + .openConnection(); + + CapacitorHttpUrlConnection connection = connectionBuilder.build(); + + if (null != bridge && !isDomainExcludedFromSSL(bridge, url)) { + connection.setSSLSocketFactory(bridge); + } + + // Set HTTP body on a non GET or HEAD request + if (isHttpMutate) { + JSValue data = new JSValue(call, "data"); + if (data.getValue() != null) { + connection.setDoOutput(true); + connection.setRequestBody(call, data, dataType); + } + } + + call.getData().put("activeCapacitorHttpUrlConnection", connection); + connection.connect(); + + JSObject response = buildResponse(connection, responseType); + + connection.disconnect(); + call.getData().remove("activeCapacitorHttpUrlConnection"); + + return response; + } + + public static Boolean isDomainExcludedFromSSL(Bridge bridge, URL url) { + try { + Class sslPinningImpl = Class.forName("io.ionic.sslpinning.SSLPinning"); + Method method = sslPinningImpl.getDeclaredMethod("isDomainExcluded", Bridge.class, URL.class); + return (Boolean) method.invoke(sslPinningImpl.getDeclaredConstructor().newInstance(), bridge, url); + } catch (Exception ignored) { + return false; + } + } + + @FunctionalInterface + public interface ProgressEmitter { + void emit(Integer bytes, Integer contentLength); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/ICapacitorHttpUrlConnection.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/ICapacitorHttpUrlConnection.java new file mode 100644 index 00000000..4ed8881a --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/ICapacitorHttpUrlConnection.java @@ -0,0 +1,15 @@ +package com.getcapacitor.plugin.util; + +import java.io.IOException; +import java.io.InputStream; + +/** + * This interface was extracted from {@link CapacitorHttpUrlConnection} to enable mocking that class. + */ +public interface ICapacitorHttpUrlConnection { + InputStream getErrorStream(); + + String getHeaderField(String name); + + InputStream getInputStream() throws IOException; +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/MimeType.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/MimeType.java new file mode 100644 index 00000000..cfc90f82 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/plugin/util/MimeType.java @@ -0,0 +1,17 @@ +package com.getcapacitor.plugin.util; + +enum MimeType { + APPLICATION_JSON("application/json"), + APPLICATION_VND_API_JSON("application/vnd.api+json"), // https://jsonapi.org + TEXT_HTML("text/html"); + + private final String value; + + MimeType(String value) { + this.value = value; + } + + String getValue() { + return value; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/HostMask.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/HostMask.java new file mode 100644 index 00000000..486d0fd0 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/HostMask.java @@ -0,0 +1,123 @@ +package com.getcapacitor.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public interface HostMask { + boolean matches(String host); + + class Parser { + + private static HostMask NOTHING = new Nothing(); + + public static HostMask parse(String[] masks) { + return masks == null ? NOTHING : HostMask.Any.parse(masks); + } + + public static HostMask parse(String mask) { + return mask == null ? NOTHING : HostMask.Simple.parse(mask); + } + } + + class Simple implements HostMask { + + private final List maskParts; + + private Simple(List maskParts) { + if (maskParts == null) { + throw new IllegalArgumentException("Mask parts can not be null"); + } + this.maskParts = maskParts; + } + + static Simple parse(String mask) { + List parts = Util.splitAndReverse(mask); + return new Simple(parts); + } + + @Override + public boolean matches(String host) { + if (host == null) { + return false; + } + List hostParts = Util.splitAndReverse(host); + int hostSize = hostParts.size(); + int maskSize = maskParts.size(); + if (maskSize > 1 && hostSize != maskSize) { + return false; + } + + int minSize = Math.min(hostSize, maskSize); + + for (int i = 0; i < minSize; i++) { + String maskPart = maskParts.get(i); + String hostPart = hostParts.get(i); + if (!Util.matches(maskPart, hostPart)) { + return false; + } + } + return true; + } + } + + class Any implements HostMask { + + private final List masks; + + Any(List masks) { + this.masks = masks; + } + + @Override + public boolean matches(String host) { + for (HostMask mask : masks) { + if (mask.matches(host)) { + return true; + } + } + return false; + } + + static Any parse(String... rawMasks) { + List masks = new ArrayList<>(); + for (String raw : rawMasks) { + masks.add(HostMask.Simple.parse(raw)); + } + return new Any(masks); + } + } + + class Nothing implements HostMask { + + @Override + public boolean matches(String host) { + return false; + } + } + + class Util { + + static boolean matches(String mask, String string) { + if (mask == null) { + return false; + } else if ("*".equals(mask)) { + return true; + } else if (string == null) { + return false; + } else { + return mask.toUpperCase().equals(string.toUpperCase()); + } + } + + static List splitAndReverse(String string) { + if (string == null) { + throw new IllegalArgumentException("Can not split null argument"); + } + List parts = Arrays.asList(string.split("\\.")); + Collections.reverse(parts); + return parts; + } + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/InternalUtils.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/InternalUtils.java new file mode 100644 index 00000000..b7354159 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/InternalUtils.java @@ -0,0 +1,27 @@ +package com.getcapacitor.util; + +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.os.Build; + +public class InternalUtils { + + public static PackageInfo getPackageInfo(PackageManager pm, String packageName) throws PackageManager.NameNotFoundException { + return InternalUtils.getPackageInfo(pm, packageName, 0); + } + + public static PackageInfo getPackageInfo(PackageManager pm, String packageName, long flags) + throws PackageManager.NameNotFoundException { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + return pm.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(flags)); + } else { + return getPackageInfoLegacy(pm, packageName, (int) flags); + } + } + + @SuppressWarnings("deprecation") + private static PackageInfo getPackageInfoLegacy(PackageManager pm, String packageName, long flags) + throws PackageManager.NameNotFoundException { + return pm.getPackageInfo(packageName, (int) flags); + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/JSONUtils.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/JSONUtils.java new file mode 100644 index 00000000..1d2fc207 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/JSONUtils.java @@ -0,0 +1,166 @@ +package com.getcapacitor.util; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +/** + * Helper methods for parsing JSON objects. + */ +public class JSONUtils { + + /** + * Get a string value from the given JSON object. + * + * @param jsonObject A JSON object to search + * @param key A key to fetch from the JSON object + * @param defaultValue A default value to return if the key cannot be found + * @return The value at the given key in the JSON object, or the default value + */ + public static String getString(JSONObject jsonObject, String key, String defaultValue) { + String k = getDeepestKey(key); + try { + JSONObject o = getDeepestObject(jsonObject, key); + + String value = o.getString(k); + if (value == null) { + return defaultValue; + } + return value; + } catch (JSONException ignore) { + // value was not found + } + + return defaultValue; + } + + /** + * Get a boolean value from the given JSON object. + * + * @param jsonObject A JSON object to search + * @param key A key to fetch from the JSON object + * @param defaultValue A default value to return if the key cannot be found + * @return The value at the given key in the JSON object, or the default value + */ + public static boolean getBoolean(JSONObject jsonObject, String key, boolean defaultValue) { + String k = getDeepestKey(key); + try { + JSONObject o = getDeepestObject(jsonObject, key); + + return o.getBoolean(k); + } catch (JSONException ignore) { + // value was not found + } + + return defaultValue; + } + + /** + * Get an int value from the given JSON object. + * + * @param jsonObject A JSON object to search + * @param key A key to fetch from the JSON object + * @param defaultValue A default value to return if the key cannot be found + * @return The value at the given key in the JSON object, or the default value + */ + public static int getInt(JSONObject jsonObject, String key, int defaultValue) { + String k = getDeepestKey(key); + try { + JSONObject o = getDeepestObject(jsonObject, key); + return o.getInt(k); + } catch (JSONException ignore) { + // value was not found + } + + return defaultValue; + } + + /** + * Get a JSON object value from the given JSON object. + * + * @param jsonObject A JSON object to search + * @param key A key to fetch from the JSON object + * @return The value from the config, if exists. Null if not + */ + public static JSONObject getObject(JSONObject jsonObject, String key) { + String k = getDeepestKey(key); + try { + JSONObject o = getDeepestObject(jsonObject, key); + + return o.getJSONObject(k); + } catch (JSONException ignore) { + // value was not found + } + + return null; + } + + /** + * Get a string array value from the given JSON object. + * + * @param jsonObject A JSON object to search + * @param key A key to fetch from the JSON object + * @param defaultValue A default value to return if the key cannot be found + * @return The value at the given key in the JSON object, or the default value + */ + public static String[] getArray(JSONObject jsonObject, String key, String[] defaultValue) { + String k = getDeepestKey(key); + try { + JSONObject o = getDeepestObject(jsonObject, key); + + JSONArray a = o.getJSONArray(k); + if (a == null) { + return defaultValue; + } + + int l = a.length(); + String[] value = new String[l]; + + for (int i = 0; i < l; i++) { + value[i] = (String) a.get(i); + } + + return value; + } catch (JSONException ignore) { + // value was not found + } + + return defaultValue; + } + + /** + * Given a JSON key path, gets the deepest key. + * + * @param key The key path + * @return The deepest key + */ + private static String getDeepestKey(String key) { + String[] parts = key.split("\\."); + if (parts.length > 0) { + return parts[parts.length - 1]; + } + + return null; + } + + /** + * Given a JSON object and key path, gets the deepest object in the path. + * + * @param jsonObject A JSON object + * @param key The key path to follow + * @return The deepest object along the key path + * @throws JSONException Thrown if any JSON errors + */ + private static JSONObject getDeepestObject(JSONObject jsonObject, String key) throws JSONException { + String[] parts = key.split("\\."); + JSONObject o = jsonObject; + + // Search until the second to last part of the key + for (int i = 0; i < parts.length - 1; i++) { + String k = parts[i]; + o = o.getJSONObject(k); + } + + return o; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/PermissionHelper.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/PermissionHelper.java new file mode 100644 index 00000000..e7b83321 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/PermissionHelper.java @@ -0,0 +1,114 @@ +package com.getcapacitor.util; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import androidx.core.app.ActivityCompat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * A helper class for checking permissions. + * + * @since 3.0.0 + */ +public class PermissionHelper { + + /** + * Checks if a list of given permissions are all granted by the user + * + * @since 3.0.0 + * @param permissions Permissions to check. + * @return True if all permissions are granted, false if at least one is not. + */ + public static boolean hasPermissions(Context context, String[] permissions) { + for (String perm : permissions) { + if (ActivityCompat.checkSelfPermission(context, perm) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + return true; + } + + /** + * Check whether the given permission has been defined in the AndroidManifest.xml + * + * @since 3.0.0 + * @param permission A permission to check. + * @return True if the permission has been defined in the Manifest, false if not. + */ + public static boolean hasDefinedPermission(Context context, String permission) { + boolean hasPermission = false; + String[] requestedPermissions = PermissionHelper.getManifestPermissions(context); + if (requestedPermissions != null && requestedPermissions.length > 0) { + List requestedPermissionsList = Arrays.asList(requestedPermissions); + ArrayList requestedPermissionsArrayList = new ArrayList<>(requestedPermissionsList); + if (requestedPermissionsArrayList.contains(permission)) { + hasPermission = true; + } + } + return hasPermission; + } + + /** + * Check whether all of the given permissions have been defined in the AndroidManifest.xml + * @param context the app context + * @param permissions a list of permissions + * @return true only if all permissions are defined in the AndroidManifest.xml + */ + public static boolean hasDefinedPermissions(Context context, String[] permissions) { + for (String permission : permissions) { + if (!PermissionHelper.hasDefinedPermission(context, permission)) { + return false; + } + } + + return true; + } + + /** + * Get the permissions defined in AndroidManifest.xml + * + * @since 3.0.0 + * @return The permissions defined in AndroidManifest.xml + */ + public static String[] getManifestPermissions(Context context) { + String[] requestedPermissions = null; + try { + PackageManager pm = context.getPackageManager(); + PackageInfo packageInfo = InternalUtils.getPackageInfo(pm, context.getPackageName(), PackageManager.GET_PERMISSIONS); + + if (packageInfo != null) { + requestedPermissions = packageInfo.requestedPermissions; + } + } catch (Exception ex) {} + return requestedPermissions; + } + + /** + * Given a list of permissions, return a new list with the ones not present in AndroidManifest.xml + * + * @since 3.0.0 + * @param neededPermissions The permissions needed. + * @return The permissions not present in AndroidManifest.xml + */ + public static String[] getUndefinedPermissions(Context context, String[] neededPermissions) { + ArrayList undefinedPermissions = new ArrayList<>(); + String[] requestedPermissions = getManifestPermissions(context); + if (requestedPermissions != null && requestedPermissions.length > 0) { + List requestedPermissionsList = Arrays.asList(requestedPermissions); + ArrayList requestedPermissionsArrayList = new ArrayList<>(requestedPermissionsList); + for (String permission : neededPermissions) { + if (!requestedPermissionsArrayList.contains(permission)) { + undefinedPermissions.add(permission); + } + } + String[] undefinedPermissionArray = new String[undefinedPermissions.size()]; + undefinedPermissionArray = undefinedPermissions.toArray(undefinedPermissionArray); + + return undefinedPermissionArray; + } + return neededPermissions; + } +} diff --git a/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/WebColor.java b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/WebColor.java new file mode 100644 index 00000000..e055021e --- /dev/null +++ b/@capacitor/android/capacitor/src/main/java/com/getcapacitor/util/WebColor.java @@ -0,0 +1,28 @@ +package com.getcapacitor.util; + +import android.graphics.Color; + +public class WebColor { + + /** + * Parse the color string, and return the corresponding color-int. If the string cannot be parsed, throws an IllegalArgumentException exception. + * @param colorString The hexadecimal color string. The format is an RGB or RGBA hex string. + * @return The corresponding color as an int. + */ + public static int parseColor(String colorString) { + String formattedColor = colorString; + if (colorString.charAt(0) != '#') { + formattedColor = "#" + formattedColor; + } + + if (formattedColor.length() != 7 && formattedColor.length() != 9) { + throw new IllegalArgumentException("The encoded color space is invalid or unknown"); + } else if (formattedColor.length() == 7) { + return Color.parseColor(formattedColor); + } else { + // Convert to Android format #AARRGGBB from #RRGGBBAA + formattedColor = "#" + formattedColor.substring(7) + formattedColor.substring(1, 7); + return Color.parseColor(formattedColor); + } + } +} diff --git a/@capacitor/android/capacitor/src/main/res/layout/bridge_layout_main.xml b/@capacitor/android/capacitor/src/main/res/layout/bridge_layout_main.xml new file mode 100644 index 00000000..12f0b8fc --- /dev/null +++ b/@capacitor/android/capacitor/src/main/res/layout/bridge_layout_main.xml @@ -0,0 +1,15 @@ + + + + + + diff --git a/@capacitor/android/capacitor/src/main/res/layout/fragment_bridge.xml b/@capacitor/android/capacitor/src/main/res/layout/fragment_bridge.xml new file mode 100644 index 00000000..b6123ea8 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/res/layout/fragment_bridge.xml @@ -0,0 +1,13 @@ + + + + + diff --git a/@capacitor/android/capacitor/src/main/res/layout/no_webview.xml b/@capacitor/android/capacitor/src/main/res/layout/no_webview.xml new file mode 100644 index 00000000..7228cc2f --- /dev/null +++ b/@capacitor/android/capacitor/src/main/res/layout/no_webview.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/@capacitor/android/capacitor/src/main/res/values/attrs.xml b/@capacitor/android/capacitor/src/main/res/values/attrs.xml new file mode 100644 index 00000000..23a10371 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/res/values/attrs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/@capacitor/android/capacitor/src/main/res/values/colors.xml b/@capacitor/android/capacitor/src/main/res/values/colors.xml new file mode 100644 index 00000000..347d6088 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/@capacitor/android/capacitor/src/main/res/values/strings.xml b/@capacitor/android/capacitor/src/main/res/values/strings.xml new file mode 100644 index 00000000..2db1111d --- /dev/null +++ b/@capacitor/android/capacitor/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + This app requires a WebView to work + diff --git a/@capacitor/android/capacitor/src/main/res/values/styles.xml b/@capacitor/android/capacitor/src/main/res/values/styles.xml new file mode 100644 index 00000000..d3268920 --- /dev/null +++ b/@capacitor/android/capacitor/src/main/res/values/styles.xml @@ -0,0 +1,6 @@ + + + diff --git a/@capacitor/android/package.json b/@capacitor/android/package.json new file mode 100644 index 00000000..e92f27ef --- /dev/null +++ b/@capacitor/android/package.json @@ -0,0 +1,31 @@ +{ + "name": "@capacitor/android", + "version": "6.1.2", + "description": "Capacitor: Cross-platform apps with JavaScript and the web", + "homepage": "https://capacitorjs.com", + "author": "Ionic Team (https://ionic.io)", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/ionic-team/capacitor.git" + }, + "bugs": { + "url": "https://github.com/ionic-team/capacitor/issues" + }, + "files": [ + "capacitor/build.gradle", + "capacitor/lint-baseline.xml", + "capacitor/lint.xml", + "capacitor/proguard-rules.pro", + "capacitor/src/main/" + ], + "scripts": { + "verify": "./gradlew clean lint build test -b capacitor/build.gradle" + }, + "peerDependencies": { + "@capacitor/core": "^6.1.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/@capacitor/assets/LICENSE b/@capacitor/assets/LICENSE new file mode 100644 index 00000000..f56aabad --- /dev/null +++ b/@capacitor/assets/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2021 Drifty Co. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/@capacitor/assets/README.md b/@capacitor/assets/README.md new file mode 100644 index 00000000..a821c5c7 --- /dev/null +++ b/@capacitor/assets/README.md @@ -0,0 +1,97 @@ +# Capacitor Assets + +This tool will crop and resize JPEG and PNG source images to generate icons and splash screens for iOS, Android, and Progressive Web Apps using [Capacitor](https://capacitorjs.com/). + +Note: previous versions of this tool supported Cordova but Cordova support has been removed as of `1.x`. We strongly recommend teams [migrate to Capacitor](https://capacitorjs.com/docs/cordova/migrating-from-cordova-to-capacitor). + +## Install + +```shell +npm install --save-dev @capacitor/assets +``` + +## Usage + +The tool expects a `assets` or `resources` folder to exist in the root of the project. + +There are two modes this tool can be used in: Easy Mode, and Full Control mode. + +### Usage - Easy Mode (recommended) + +With Easy Mode, the tool supports generating all the icon and splash assets you need for iOS, Android, and PWA from a single logo file along with an optional dark mode logo, and background colors. This is the easiest way to generate all your assets, but it trades customizability for convenience. + +To use this mode, create a single `logo.png` or `icon.png` with an optional `logo-dark.png` in `assets/` (the tool also supports using SVG files as source images, substitue `.svg` as needed): + +``` +assets/ +├── logo.png +└── logo-dark.png +``` + +Then, generate the assets and provide the background colors that will be used to generate background layers for icons: + +```shell +npx @capacitor/assets generate --iconBackgroundColor '#eeeeee' --iconBackgroundColorDark '#222222' --splashBackgroundColor '#eeeeee' --splashBackgroundColorDark '#111111' +``` + +Where the provided flags are: + +- `--iosProject` - the path to the iOS project (default `ios/App`) +- `--androidProject` - the path to the Android project (default `android`) +- `--assetPath ` - Path to the assets directory for your project. By default will check `"assets"` and `"resources"` directories, in that order. +- `--iconBackgroundColor` - the background color (hex value) used when generating icon layers for light mode (default `#ffffff`) +- `--iconBackgroundColorDark` - the background color (hex value) used when generating icon layers for dark mode (where supported) (default `#111111`) +- `--splashBackgroundColor` - the background color (hex value) used when generating splash screens (default `#ffffff`) +- `--splashBackgroundColorDark` - the background color (hex value) used when generating splash screens for dark mode (where supported) (default `#111111`) +- `--logoSplashTargetWidth` - A specific width to set the logo to when generating splash screens from a single logo file (not used by default, logo is scaled as percentage of splash instead, see `--logoSplashScale`) +- `--logoSplashScale` - the scale multiplier to apply to the logo when generating splash screens from a single logo file (default: `0.2`) +- `--ios` - explicitly run iOS asset generation. Using a platform flag makes the platform list exclusive. +- `--android` - explicitly run Android asset generation. Using a platform flag makes the platform list exclusive. +- `--pwa` - explicitly run PWA asset generation. Using a platform flag makes the platform list exclusive. + +### Usage - Custom Mode + +This mode provides full control over the assets used to generate icons and splash screens, but requires more source files. To use this mode, provide custom icons and splash screen source images as shown below: + +``` +assets/ +├── icon-only.png +├── icon-foreground.png +├── icon-background.png +├── splash.png +└── splash-dark.png +``` + +- `assets/icon-only.(png|jpg)` must be at least 1024×1024px +- `assets/icon-(foreground|background).(png|jpg)` must be at least 1024×1024px +- `assets/splash[-dark].(png|jpg)` must be at least 2732×2732px + +To generate resources with all the default options, just run: + +```shell +npx @capacitor/assets generate +``` + +`@capacitor/assets` accepts a platform for the first argument (`ios`, `android`, or `pwa` currently). If specified, resources are generated only for that platform: + +```shell +npx @capacitor/assets generate --ios +``` + +Otherwise `@capacitor/assets` will use all detected Capacitor platforms. + +## PWA Notes + +### Manifest + +This tool will create and/or update the web app manifest used in your project, and supports both the older `manifest.json` file and the newer `manifest.webmanifest` files, preferring `manifest.webmanifest` when no existing manifest is found. + +By default, the tool will look for the manifest file in `public`, `src`, and `www` in that order. Use the flag `--pwaManifestPath` to specify the exact path to your web app manifest. + +### Help + +See the help instructions on the command line with the `--help` flag. + +```shell +npx @capacitor/assets generate --help +``` diff --git a/@capacitor/assets/dist/asset-generator.d.ts b/@capacitor/assets/dist/asset-generator.d.ts new file mode 100644 index 00000000..888ea27a --- /dev/null +++ b/@capacitor/assets/dist/asset-generator.d.ts @@ -0,0 +1,19 @@ +import type { InputAsset } from './input-asset'; +import type { OutputAsset } from './output-asset'; +import type { Project } from './project'; +export declare abstract class AssetGenerator { + options: AssetGeneratorOptions; + constructor(options: AssetGeneratorOptions); + abstract generate(asset: InputAsset, project: Project): Promise; +} +export interface AssetGeneratorOptions { + iconBackgroundColor?: string; + iconBackgroundColorDark?: string; + splashBackgroundColor?: string; + splashBackgroundColorDark?: string; + pwaManifestPath?: string; + pwaNoAppleFetch?: boolean; + logoSplashScale?: number; + logoSplashTargetWidth?: number; + androidFlavor?: string; +} diff --git a/@capacitor/assets/dist/asset-generator.js b/@capacitor/assets/dist/asset-generator.js new file mode 100644 index 00000000..e2f67b74 --- /dev/null +++ b/@capacitor/assets/dist/asset-generator.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AssetGenerator = void 0; +class AssetGenerator { + constructor(options) { + this.options = options; + } +} +exports.AssetGenerator = AssetGenerator; diff --git a/@capacitor/assets/dist/colors.d.ts b/@capacitor/assets/dist/colors.d.ts new file mode 100644 index 00000000..10ca64eb --- /dev/null +++ b/@capacitor/assets/dist/colors.d.ts @@ -0,0 +1,23 @@ +import kleur from 'kleur'; +export declare const strong: kleur.Color; +export declare const weak: kleur.Color; +export declare const input: kleur.Color; +export declare const success: kleur.Color; +export declare const failure: kleur.Color; +export declare const ancillary: kleur.Color; +export declare const extra: kleur.Color; +declare const COLORS: { + strong: kleur.Color; + weak: kleur.Color; + input: kleur.Color; + success: kleur.Color; + failure: kleur.Color; + ancillary: kleur.Color; + log: { + DEBUG: kleur.Color; + INFO: kleur.Color; + WARN: kleur.Color; + ERROR: kleur.Color; + }; +}; +export default COLORS; diff --git a/@capacitor/assets/dist/colors.js b/@capacitor/assets/dist/colors.js new file mode 100644 index 00000000..d412d0f6 --- /dev/null +++ b/@capacitor/assets/dist/colors.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extra = exports.ancillary = exports.failure = exports.success = exports.input = exports.weak = exports.strong = void 0; +const tslib_1 = require("tslib"); +const kleur_1 = (0, tslib_1.__importDefault)(require("kleur")); +exports.strong = kleur_1.default.bold; +exports.weak = kleur_1.default.dim; +exports.input = kleur_1.default.cyan; +exports.success = kleur_1.default.green; +exports.failure = kleur_1.default.red; +exports.ancillary = kleur_1.default.cyan; +exports.extra = kleur_1.default.yellow; +const COLORS = { + strong: exports.strong, + weak: exports.weak, + input: exports.input, + success: exports.success, + failure: exports.failure, + ancillary: exports.ancillary, + log: { + DEBUG: kleur_1.default.magenta, + INFO: kleur_1.default.cyan, + WARN: kleur_1.default.yellow, + ERROR: kleur_1.default.red, + }, +}; +exports.default = COLORS; diff --git a/@capacitor/assets/dist/ctx.d.ts b/@capacitor/assets/dist/ctx.d.ts new file mode 100644 index 00000000..1252c1d6 --- /dev/null +++ b/@capacitor/assets/dist/ctx.d.ts @@ -0,0 +1,11 @@ +import type { AssetGeneratorOptions } from './asset-generator'; +import { Project } from './project'; +export interface Context { + projectRootPath?: string; + args: AssetGeneratorOptions | any; + project: Project; + nodePackageRoot: string; + rootDir: string; +} +export declare function loadContext(projectRootPath?: string): Promise; +export declare function setArguments(ctx: Context, args: any): void; diff --git a/@capacitor/assets/dist/ctx.js b/@capacitor/assets/dist/ctx.js new file mode 100644 index 00000000..1128ceef --- /dev/null +++ b/@capacitor/assets/dist/ctx.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.setArguments = exports.loadContext = void 0; +const tslib_1 = require("tslib"); +const path_1 = require("path"); +const yargs_1 = (0, tslib_1.__importDefault)(require("yargs")); +const helpers_1 = require("yargs/helpers"); +const project_1 = require("./project"); +async function loadContext(projectRootPath) { + var _a; + const rootDir = process.cwd(); + const argv = (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv)).argv; + let project; + try { + project = await loadProject(argv, projectRootPath, (_a = argv.assetPath) !== null && _a !== void 0 ? _a : 'assets'); + } + catch (e) { + throw new Error(`Unable to load project: ${e.message}`); + } + return { + args: argv, + project, + projectRootPath, + // Important for resolving custom prettier plugin + nodePackageRoot: (0, path_1.join)(__dirname, '../../'), + rootDir, + }; +} +exports.loadContext = loadContext; +function setArguments(ctx, args) { + ctx.args = args; + process.env.VERBOSE = '' + !!args.verbose; +} +exports.setArguments = setArguments; +async function loadProject(args, projectRootPath, projectAssetPath) { + const config = await loadMobileProjectConfig(args); + const project = new project_1.Project(projectRootPath, config, projectAssetPath); + await project.load(); + return project; +} +// TODO: Use the config loading stuff from @capacitor/configure +function loadMobileProjectConfig(args) { + var _a, _b; + return { + ios: { + path: (_a = args.iosProject) !== null && _a !== void 0 ? _a : 'ios/App', + }, + android: { + path: (_b = args.androidProject) !== null && _b !== void 0 ? _b : 'android', + }, + }; +} diff --git a/@capacitor/assets/dist/definitions.d.ts b/@capacitor/assets/dist/definitions.d.ts new file mode 100644 index 00000000..9cd03388 --- /dev/null +++ b/@capacitor/assets/dist/definitions.d.ts @@ -0,0 +1,147 @@ +import type { InputAsset } from './input-asset'; +export interface Assets { + logo: InputAsset | null; + logoDark: InputAsset | null; + icon: InputAsset | null; + iconForeground: InputAsset | null; + iconBackground: InputAsset | null; + splash: InputAsset | null; + splashDark: InputAsset | null; + iosIcon?: InputAsset | null; + iosSplash?: InputAsset | null; + iosSplashDark?: InputAsset | null; + androidIcon?: InputAsset | null; + androidIconForeground?: InputAsset | null; + androidIconBackground?: InputAsset | null; + androidSplash?: InputAsset | null; + androidSplashDark?: InputAsset | null; + androidNotificationIcon?: InputAsset | null; + pwaIcon?: InputAsset | null; + pwaSplash?: InputAsset | null; + pwaSplashDark?: InputAsset | null; +} +export declare const enum AssetKind { + Logo = "logo", + LogoDark = "logo-dark", + AdaptiveIcon = "adaptive-icon", + Icon = "icon", + IconForeground = "icon-foreground", + IconBackground = "icon-background", + NotificationIcon = "notification-icon", + Splash = "splash", + SplashDark = "splash-dark" +} +export declare const enum Platform { + Any = "any", + Ios = "ios", + Android = "android", + Pwa = "pwa" +} +export declare const enum Format { + Png = "png", + Jpeg = "jpeg", + Svg = "svg", + WebP = "webp", + Unknown = "unknown" +} +export declare const enum Orientation { + Default = "", + Portrait = "portrait", + Landscape = "landscape" +} +export declare const enum Theme { + Any = "any", + Light = "light", + Dark = "dark" +} +export declare const enum AndroidDensity { + Default = "", + Ldpi = "ldpi", + Mdpi = "mdpi", + Hdpi = "hdpi", + Xhdpi = "xhdpi", + Xxhdpi = "xxhdpi", + Xxxhdpi = "xxxhdpi", + LandLdpi = "land-ldpi", + LandMdpi = "land-mdpi", + LandHdpi = "land-hdpi", + LandXhdpi = "land-xhdpi", + LandXxhdpi = "land-xxhdpi", + LandXxxhdpi = "land-xxxhdpi", + PortLdpi = "port-ldpi", + PortMdpi = "port-mdpi", + PortHdpi = "port-hdpi", + PortXhdpi = "port-xhdpi", + PortXxhdpi = "port-xxhdpi", + PortXxxhdpi = "port-xxxhdpi", + DefaultNight = "night", + LdpiNight = "night-ldpi", + MdpiNight = "night-mdpi", + HdpiNight = "night-hdpi", + XhdpiNight = "night-xhdpi", + XxhdpiNight = "night-xxhdpi", + XxxhdpiNight = "night-xxxhdpi", + LandLdpiNight = "land-night-ldpi", + LandMdpiNight = "land-night-mdpi", + LandHdpiNight = "land-night-hdpi", + LandXhdpiNight = "land-night-xhdpi", + LandXxhdpiNight = "land-night-xxhdpi", + LandXxxhdpiNight = "land-night-xxxhdpi", + PortLdpiNight = "port-night-ldpi", + PortMdpiNight = "port-night-mdpi", + PortHdpiNight = "port-night-hdpi", + PortXhdpiNight = "port-night-xhdpi", + PortXxhdpiNight = "port-night-xxhdpi", + PortXxxhdpiNight = "port-night-xxxhdpi" +} +export interface OutputAssetTemplate { + platform: Platform; + kind: AssetKind; + format: Format; + width: number; + height: number; + scale?: number; +} +export interface IosOutputAssetTemplate extends OutputAssetTemplate { + name: string; + idiom: IosIdiom; +} +export declare const enum IosIdiom { + Universal = "universal", + iPhone = "iphone", + iPad = "ipad", + Watch = "watch", + TV = "tv" +} +export declare type IosOutputAssetTemplateIcon = IosOutputAssetTemplate; +export interface IosOutputAssetTemplateSplash extends IosOutputAssetTemplate { + orientation: Orientation; + theme: Theme; +} +export interface PwaOutputAssetTemplate extends OutputAssetTemplate { + name: string; + orientation?: Orientation; + density?: string; +} +export interface AndroidOutputAssetTemplate extends OutputAssetTemplate { + density: AndroidDensity; +} +export interface AndroidOutputAssetTemplateSplash extends OutputAssetTemplate { + density: AndroidDensity; + orientation: Orientation; +} +export interface AndroidOutputAssetTemplateAdaptiveIcon extends OutputAssetTemplate { + density: AndroidDensity; +} +export interface IosContents { + images: { + filename: string; + size: string; + scale: string; + idiom: string; + }[]; + info?: { + version: number; + author: string; + }; +} diff --git a/@capacitor/assets/dist/definitions.js b/@capacitor/assets/dist/definitions.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/@capacitor/assets/dist/definitions.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/@capacitor/assets/dist/error.d.ts b/@capacitor/assets/dist/error.d.ts new file mode 100644 index 00000000..24152df7 --- /dev/null +++ b/@capacitor/assets/dist/error.d.ts @@ -0,0 +1,18 @@ +export declare abstract class BaseError extends Error { + readonly message: string; + abstract readonly name: string; + abstract readonly code: string; + constructor(message: string); + toString(): string; + toJSON(): { + [key: string]: any; + }; +} +export declare class BadProjectError extends BaseError { + readonly name = "BadProjectError"; + readonly code = "BAD_PROJECT"; +} +export declare class BadPipelineError extends BaseError { + readonly name = "BadPipelineError"; + readonly code = "BAD_SHARP_PIPELINE"; +} diff --git a/@capacitor/assets/dist/error.js b/@capacitor/assets/dist/error.js new file mode 100644 index 00000000..59db0779 --- /dev/null +++ b/@capacitor/assets/dist/error.js @@ -0,0 +1,37 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.BadPipelineError = exports.BadProjectError = exports.BaseError = void 0; +class BaseError extends Error { + constructor(message) { + super(message); + this.message = message; + this.stack = new Error().stack || ''; + this.message = message; + } + toString() { + return this.message; + } + toJSON() { + return { + code: this.code, + message: this.message, + }; + } +} +exports.BaseError = BaseError; +class BadProjectError extends BaseError { + constructor() { + super(...arguments); + this.name = 'BadProjectError'; + this.code = 'BAD_PROJECT'; + } +} +exports.BadProjectError = BadProjectError; +class BadPipelineError extends BaseError { + constructor() { + super(...arguments); + this.name = 'BadPipelineError'; + this.code = 'BAD_SHARP_PIPELINE'; + } +} +exports.BadPipelineError = BadPipelineError; diff --git a/@capacitor/assets/dist/index.d.ts b/@capacitor/assets/dist/index.d.ts new file mode 100644 index 00000000..84e69306 --- /dev/null +++ b/@capacitor/assets/dist/index.d.ts @@ -0,0 +1,3 @@ +import type { Context } from './ctx'; +export declare function run(): Promise; +export declare function runProgram(ctx: Context): void; diff --git a/@capacitor/assets/dist/index.js b/@capacitor/assets/dist/index.js new file mode 100644 index 00000000..7d63dc75 --- /dev/null +++ b/@capacitor/assets/dist/index.js @@ -0,0 +1,71 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runProgram = exports.run = void 0; +const tslib_1 = require("tslib"); +const commander_1 = require("commander"); +const c = (0, tslib_1.__importStar)(require("./colors")); +const ctx_1 = require("./ctx"); +const cli_1 = require("./util/cli"); +const log_1 = require("./util/log"); +async function run() { + try { + const ctx = await (0, ctx_1.loadContext)(); + runProgram(ctx); + } + catch (e) { + process.exitCode = 1; + log_1.logger.error(e.message ? e.message : String(e)); + throw e; + } +} +exports.run = run; +function parseIntOption(value) { + // parseInt takes a string and a radix + const parsedValue = parseInt(value, 10); + if (isNaN(parsedValue)) { + throw new commander_1.InvalidArgumentError('Not a number.'); + } + return parsedValue; +} +function runProgram(ctx) { + // program.version(env.package.version); + const program = new commander_1.Command(); + program + .command('generate') + .description(`Run image generation`) + .option('--verbose', 'Verbose output') + .option('--ios', 'Generate iOS assets') + .option('--android', 'Generate Android assets') + .option('--pwa', 'Generate PWA/Web assets') + .option('--logoSplashScale ', 'Scaling factor for logo when generating splash screens from a single logo file') + .option('--logoSplashTargetWidth ', 'A specific target width for logo to use when generating splash screens from a single logo file', parseIntOption) + .option('--iconBackgroundColor ', 'Background color used for icons when generating from a single logo file') + .option('--iconBackgroundColorDark ', 'Background color used for icon in dark mode when generating from a single logo file') + .option('--splashBackgroundColor ', 'Background color used for splash screens when generating from a single logo file') + .option('--splashBackgroundColorDark ', 'Background color used for splash screens in dark mode when generating from a single logo file') + .option('--pwaManifestPath ', "Path to the web app's manifest.json or manifest.webmanifest file") + .option('--pwaNoAppleFetch', 'Whether to fetch the latest screen sizes for Apple devices from the official Apple site. Set to true if running offline to use local cached sizes (may be occasionally out of date)') + .option('--assetPath ', 'Path to the assets directory for your project. By default will check "assets" and "resources" directories, in that order.') + .option('--androidFlavor ', 'Android product flavor name where generated assets will be created. Defaults to "main".') + .option('--iosProject

', 'Path to iOS project (defaults to "ios/App")') + .option('--androidProject ', 'Path to Android project (defaults to "android")') + /* + .option( + '--pwaTags', + 'Log tags necessary for including generated PWA assets in your index.html file', + ) + */ + .action((0, cli_1.wrapAction)(async (args = {}) => { + (0, ctx_1.setArguments)(ctx, args); + const { run } = await Promise.resolve().then(() => (0, tslib_1.__importStar)(require('./tasks/generate'))); + await run(ctx); + })); + program.arguments('[command]').action( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (0, cli_1.wrapAction)((_) => { + (0, log_1.log)(c.strong('\n⚡️ Capacitor Assets ⚡️\n')); + program.outputHelp(); + })); + program.parse(process.argv); +} +exports.runProgram = runProgram; diff --git a/@capacitor/assets/dist/input-asset.d.ts b/@capacitor/assets/dist/input-asset.d.ts new file mode 100644 index 00000000..00b6fb46 --- /dev/null +++ b/@capacitor/assets/dist/input-asset.d.ts @@ -0,0 +1,24 @@ +import sharp from 'sharp'; +import type { AssetGenerator } from './asset-generator'; +import type { AssetKind, Platform } from './definitions'; +import { Format } from './definitions'; +import type { OutputAsset } from './output-asset'; +import type { Project } from './project'; +/** + * An instance of an asset that we will use to generate + * a number of output assets. + */ +export declare class InputAsset { + path: string; + kind: AssetKind; + platform: Platform; + private filename; + width?: number; + height?: number; + private _sharp; + constructor(path: string, kind: AssetKind, platform: Platform); + pipeline(): sharp.Sharp | undefined; + format(): Format.Jpeg | Format.Png | Format.Svg | Format.Unknown; + load(): Promise; + generate(strategy: AssetGenerator, project: Project): Promise; +} diff --git a/@capacitor/assets/dist/input-asset.js b/@capacitor/assets/dist/input-asset.js new file mode 100644 index 00000000..0e670c64 --- /dev/null +++ b/@capacitor/assets/dist/input-asset.js @@ -0,0 +1,46 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.InputAsset = void 0; +const tslib_1 = require("tslib"); +const path_1 = require("path"); +const sharp_1 = (0, tslib_1.__importDefault)(require("sharp")); +/** + * An instance of an asset that we will use to generate + * a number of output assets. + */ +class InputAsset { + constructor(path, kind, platform) { + this.path = path; + this.kind = kind; + this.platform = platform; + this._sharp = null; + this.filename = (0, path_1.basename)(path); + } + pipeline() { + var _a; + return (_a = this._sharp) === null || _a === void 0 ? void 0 : _a.clone(); + } + format() { + const ext = (0, path_1.extname)(this.filename); + switch (ext) { + case '.png': + return "png" /* Png */; + case '.jpg': + case '.jpeg': + return "jpeg" /* Jpeg */; + case '.svg': + return "svg" /* Svg */; + } + return "unknown" /* Unknown */; + } + async load() { + this._sharp = await (0, sharp_1.default)(this.path); + const metadata = await this._sharp.metadata(); + this.width = metadata.width; + this.height = metadata.height; + } + async generate(strategy, project) { + return strategy.generate(this, project); + } +} +exports.InputAsset = InputAsset; diff --git a/@capacitor/assets/dist/output-asset.d.ts b/@capacitor/assets/dist/output-asset.d.ts new file mode 100644 index 00000000..50c622b9 --- /dev/null +++ b/@capacitor/assets/dist/output-asset.d.ts @@ -0,0 +1,25 @@ +import type { OutputInfo } from 'sharp'; +import type { OutputAssetTemplate } from './definitions'; +import type { InputAsset } from './input-asset'; +import type { Project } from './project'; +/** + * An instance of a generated asset + */ +export declare class OutputAsset { + template: OutputAssetTemplateType; + asset: InputAsset; + project: Project; + destFilenames: { + [name: string]: string; + }; + outputInfoMap: { + [name: string]: OutputInfo; + }; + constructor(template: OutputAssetTemplateType, asset: InputAsset, project: Project, destFilenames: { + [name: string]: string; + }, outputInfoMap: { + [name: string]: OutputInfo; + }); + getDestFilename(assetName: string): string; + getOutputInfo(assetName: string): OutputInfo; +} diff --git a/@capacitor/assets/dist/output-asset.js b/@capacitor/assets/dist/output-asset.js new file mode 100644 index 00000000..bb743395 --- /dev/null +++ b/@capacitor/assets/dist/output-asset.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.OutputAsset = void 0; +/** + * An instance of a generated asset + */ +class OutputAsset { + constructor(template, asset, project, destFilenames, outputInfoMap) { + this.template = template; + this.asset = asset; + this.project = project; + this.destFilenames = destFilenames; + this.outputInfoMap = outputInfoMap; + } + getDestFilename(assetName) { + return this.destFilenames[assetName]; + } + getOutputInfo(assetName) { + return this.outputInfoMap[assetName]; + } +} +exports.OutputAsset = OutputAsset; diff --git a/@capacitor/assets/dist/platforms/android/assets.d.ts b/@capacitor/assets/dist/platforms/android/assets.d.ts new file mode 100644 index 00000000..df0a91ec --- /dev/null +++ b/@capacitor/assets/dist/platforms/android/assets.d.ts @@ -0,0 +1,42 @@ +import type { AndroidOutputAssetTemplate, AndroidOutputAssetTemplateAdaptiveIcon, AndroidOutputAssetTemplateSplash } from '../../definitions'; +export declare const ANDROID_LDPI_ICON: AndroidOutputAssetTemplate; +export declare const ANDROID_MDPI_ICON: AndroidOutputAssetTemplate; +export declare const ANDROID_HDPI_ICON: AndroidOutputAssetTemplate; +export declare const ANDROID_XHDPI_ICON: AndroidOutputAssetTemplate; +export declare const ANDROID_XXHDPI_ICON: AndroidOutputAssetTemplate; +export declare const ANDROID_XXXHDPI_ICON: AndroidOutputAssetTemplate; +/** + * Adaptive icons + */ +export declare const ANDROID_LDPI_ADAPTIVE_ICON: AndroidOutputAssetTemplateAdaptiveIcon; +export declare const ANDROID_MDPI_ADAPTIVE_ICON: AndroidOutputAssetTemplateAdaptiveIcon; +export declare const ANDROID_HDPI_ADAPTIVE_ICON: AndroidOutputAssetTemplateAdaptiveIcon; +export declare const ANDROID_XHDPI_ADAPTIVE_ICON: AndroidOutputAssetTemplateAdaptiveIcon; +export declare const ANDROID_XXHDPI_ADAPTIVE_ICON: AndroidOutputAssetTemplateAdaptiveIcon; +export declare const ANDROID_XXXHDPI_ADAPTIVE_ICON: AndroidOutputAssetTemplateAdaptiveIcon; +export declare const ANDROID_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_LDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_MDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_HDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_XHDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_XXHDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_XXXHDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_LDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_MDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_HDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_XHDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_XXHDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_XXXHDPI_SCREEN: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_LDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_MDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_HDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_XHDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_XXHDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_LAND_XXXHDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_LDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_MDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_HDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_XHDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_XXHDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; +export declare const ANDROID_PORT_XXXHDPI_SCREEN_DARK: AndroidOutputAssetTemplateSplash; diff --git a/@capacitor/assets/dist/platforms/android/assets.js b/@capacitor/assets/dist/platforms/android/assets.js new file mode 100644 index 00000000..63b08560 --- /dev/null +++ b/@capacitor/assets/dist/platforms/android/assets.js @@ -0,0 +1,340 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ANDROID_PORT_XXXHDPI_SCREEN_DARK = exports.ANDROID_PORT_XXHDPI_SCREEN_DARK = exports.ANDROID_PORT_XHDPI_SCREEN_DARK = exports.ANDROID_PORT_HDPI_SCREEN_DARK = exports.ANDROID_PORT_MDPI_SCREEN_DARK = exports.ANDROID_PORT_LDPI_SCREEN_DARK = exports.ANDROID_LAND_XXXHDPI_SCREEN_DARK = exports.ANDROID_LAND_XXHDPI_SCREEN_DARK = exports.ANDROID_LAND_XHDPI_SCREEN_DARK = exports.ANDROID_LAND_HDPI_SCREEN_DARK = exports.ANDROID_LAND_MDPI_SCREEN_DARK = exports.ANDROID_LAND_LDPI_SCREEN_DARK = exports.ANDROID_SCREEN_DARK = exports.ANDROID_PORT_XXXHDPI_SCREEN = exports.ANDROID_PORT_XXHDPI_SCREEN = exports.ANDROID_PORT_XHDPI_SCREEN = exports.ANDROID_PORT_HDPI_SCREEN = exports.ANDROID_PORT_MDPI_SCREEN = exports.ANDROID_PORT_LDPI_SCREEN = exports.ANDROID_LAND_XXXHDPI_SCREEN = exports.ANDROID_LAND_XXHDPI_SCREEN = exports.ANDROID_LAND_XHDPI_SCREEN = exports.ANDROID_LAND_HDPI_SCREEN = exports.ANDROID_LAND_MDPI_SCREEN = exports.ANDROID_LAND_LDPI_SCREEN = exports.ANDROID_SCREEN = exports.ANDROID_XXXHDPI_ADAPTIVE_ICON = exports.ANDROID_XXHDPI_ADAPTIVE_ICON = exports.ANDROID_XHDPI_ADAPTIVE_ICON = exports.ANDROID_HDPI_ADAPTIVE_ICON = exports.ANDROID_MDPI_ADAPTIVE_ICON = exports.ANDROID_LDPI_ADAPTIVE_ICON = exports.ANDROID_XXXHDPI_ICON = exports.ANDROID_XXHDPI_ICON = exports.ANDROID_XHDPI_ICON = exports.ANDROID_HDPI_ICON = exports.ANDROID_MDPI_ICON = exports.ANDROID_LDPI_ICON = void 0; +exports.ANDROID_LDPI_ICON = { + platform: "android" /* Android */, + kind: "icon" /* Icon */, + format: "png" /* Png */, + width: 36, + height: 36, + density: "ldpi" /* Ldpi */, +}; +exports.ANDROID_MDPI_ICON = { + platform: "android" /* Android */, + kind: "icon" /* Icon */, + format: "png" /* Png */, + width: 48, + height: 48, + density: "mdpi" /* Mdpi */, +}; +exports.ANDROID_HDPI_ICON = { + platform: "android" /* Android */, + kind: "icon" /* Icon */, + format: "png" /* Png */, + width: 72, + height: 72, + density: "hdpi" /* Hdpi */, +}; +exports.ANDROID_XHDPI_ICON = { + platform: "android" /* Android */, + kind: "icon" /* Icon */, + format: "png" /* Png */, + width: 96, + height: 96, + density: "xhdpi" /* Xhdpi */, +}; +exports.ANDROID_XXHDPI_ICON = { + platform: "android" /* Android */, + kind: "icon" /* Icon */, + format: "png" /* Png */, + width: 144, + height: 144, + density: "xxhdpi" /* Xxhdpi */, +}; +exports.ANDROID_XXXHDPI_ICON = { + platform: "android" /* Android */, + kind: "icon" /* Icon */, + format: "png" /* Png */, + width: 192, + height: 192, + density: "xxxhdpi" /* Xxxhdpi */, +}; +/** + * Adaptive icons + */ +exports.ANDROID_LDPI_ADAPTIVE_ICON = { + platform: "android" /* Android */, + kind: "adaptive-icon" /* AdaptiveIcon */, + format: "png" /* Png */, + width: 81, + height: 81, + density: "ldpi" /* Ldpi */, +}; +exports.ANDROID_MDPI_ADAPTIVE_ICON = { + platform: "android" /* Android */, + kind: "adaptive-icon" /* AdaptiveIcon */, + format: "png" /* Png */, + width: 108, + height: 108, + density: "mdpi" /* Mdpi */, +}; +exports.ANDROID_HDPI_ADAPTIVE_ICON = { + platform: "android" /* Android */, + kind: "adaptive-icon" /* AdaptiveIcon */, + format: "png" /* Png */, + width: 162, + height: 162, + density: "hdpi" /* Hdpi */, +}; +exports.ANDROID_XHDPI_ADAPTIVE_ICON = { + platform: "android" /* Android */, + kind: "adaptive-icon" /* AdaptiveIcon */, + format: "png" /* Png */, + width: 216, + height: 216, + density: "xhdpi" /* Xhdpi */, +}; +exports.ANDROID_XXHDPI_ADAPTIVE_ICON = { + platform: "android" /* Android */, + kind: "adaptive-icon" /* AdaptiveIcon */, + format: "png" /* Png */, + width: 324, + height: 324, + density: "xxhdpi" /* Xxhdpi */, +}; +exports.ANDROID_XXXHDPI_ADAPTIVE_ICON = { + platform: "android" /* Android */, + kind: "adaptive-icon" /* AdaptiveIcon */, + format: "png" /* Png */, + width: 432, + height: 432, + density: "xxxhdpi" /* Xxxhdpi */, +}; +// +// Splash screens +// +exports.ANDROID_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 320, + height: 480, + density: "" /* Default */, + orientation: "" /* Default */, +}; +exports.ANDROID_LAND_LDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 320, + height: 240, + density: "land-ldpi" /* LandLdpi */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_MDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 480, + height: 320, + density: "land-mdpi" /* LandMdpi */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_HDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 800, + height: 480, + density: "land-hdpi" /* LandHdpi */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_XHDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 1280, + height: 720, + density: "land-xhdpi" /* LandXhdpi */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_XXHDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 1600, + height: 960, + density: "land-xxhdpi" /* LandXxhdpi */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_XXXHDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 1920, + height: 1280, + density: "land-xxxhdpi" /* LandXxxhdpi */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_PORT_LDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 240, + height: 320, + density: "port-ldpi" /* PortLdpi */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_MDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 320, + height: 480, + density: "port-mdpi" /* PortMdpi */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_HDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 480, + height: 800, + density: "port-hdpi" /* PortHdpi */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_XHDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 720, + height: 1280, + density: "port-xhdpi" /* PortXhdpi */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_XXHDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 960, + height: 1600, + density: "port-xxhdpi" /* PortXxhdpi */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_XXXHDPI_SCREEN = { + platform: "android" /* Android */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + width: 1280, + height: 1920, + density: "port-xxxhdpi" /* PortXxxhdpi */, + orientation: "portrait" /* Portrait */, +}; +// Dark/night mode splashes +exports.ANDROID_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 320, + height: 240, + density: "night" /* DefaultNight */, + orientation: "" /* Default */, +}; +exports.ANDROID_LAND_LDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 320, + height: 240, + density: "land-night-ldpi" /* LandLdpiNight */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_MDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 480, + height: 320, + density: "land-night-mdpi" /* LandMdpiNight */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_HDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 800, + height: 480, + density: "land-night-hdpi" /* LandHdpiNight */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_XHDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 1280, + height: 720, + density: "land-night-xhdpi" /* LandXhdpiNight */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_XXHDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 1600, + height: 960, + density: "land-night-xxhdpi" /* LandXxhdpiNight */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_LAND_XXXHDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 1920, + height: 1280, + density: "land-night-xxxhdpi" /* LandXxxhdpiNight */, + orientation: "landscape" /* Landscape */, +}; +exports.ANDROID_PORT_LDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 240, + height: 320, + density: "port-night-ldpi" /* PortLdpiNight */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_MDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 320, + height: 480, + density: "port-night-mdpi" /* PortMdpiNight */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_HDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 480, + height: 800, + density: "port-night-hdpi" /* PortHdpiNight */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_XHDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 720, + height: 1280, + density: "port-night-xhdpi" /* PortXhdpiNight */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_XXHDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 960, + height: 1600, + density: "port-night-xxhdpi" /* PortXxhdpiNight */, + orientation: "portrait" /* Portrait */, +}; +exports.ANDROID_PORT_XXXHDPI_SCREEN_DARK = { + platform: "android" /* Android */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + width: 1280, + height: 1920, + density: "port-night-xxxhdpi" /* PortXxxhdpiNight */, + orientation: "portrait" /* Portrait */, +}; diff --git a/@capacitor/assets/dist/platforms/android/index.d.ts b/@capacitor/assets/dist/platforms/android/index.d.ts new file mode 100644 index 00000000..f411d2cf --- /dev/null +++ b/@capacitor/assets/dist/platforms/android/index.d.ts @@ -0,0 +1,28 @@ +import type { AssetGeneratorOptions } from '../../asset-generator'; +import { AssetGenerator } from '../../asset-generator'; +import type { InputAsset } from '../../input-asset'; +import { OutputAsset } from '../../output-asset'; +import type { Project } from '../../project'; +export declare class AndroidAssetGenerator extends AssetGenerator { + constructor(options?: AssetGeneratorOptions); + generate(asset: InputAsset, project: Project): Promise; + /** + * Generate from logo combines all of the other operations into a single operation + * from a single asset source file. In this mode, a logo along with a background color + * is used to generate all icons and splash screens (with dark mode where possible). + */ + private generateFromLogo; + private _generateAdaptiveIconsFromLogo; + private _generateSplashesFromLogo; + private generateLegacyIcon; + private generateLegacyLauncherIcon; + private generateRoundLauncherIcon; + private generateAdaptiveIconForeground; + private _generateAdaptiveIconForeground; + private generateAdaptiveIconBackground; + private _generateAdaptiveIconBackground; + private updateManifest; + private generateSplashes; + private generateSplash; + private getResPath; +} diff --git a/@capacitor/assets/dist/platforms/android/index.js b/@capacitor/assets/dist/platforms/android/index.js new file mode 100644 index 00000000..3248cbbc --- /dev/null +++ b/@capacitor/assets/dist/platforms/android/index.js @@ -0,0 +1,339 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.AndroidAssetGenerator = void 0; +const tslib_1 = require("tslib"); +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const sharp_1 = (0, tslib_1.__importDefault)(require("sharp")); +const asset_generator_1 = require("../../asset-generator"); +const error_1 = require("../../error"); +const output_asset_1 = require("../../output-asset"); +const log_1 = require("../../util/log"); +const AndroidAssetTemplates = (0, tslib_1.__importStar)(require("./assets")); +class AndroidAssetGenerator extends asset_generator_1.AssetGenerator { + constructor(options = {}) { + super(options); + } + async generate(asset, project) { + var _a; + const androidDir = (_a = project.config.android) === null || _a === void 0 ? void 0 : _a.path; + if (!androidDir) { + throw new error_1.BadProjectError('No android project found'); + } + if (asset.platform !== "any" /* Any */ && asset.platform !== "android" /* Android */) { + return []; + } + switch (asset.kind) { + case "logo" /* Logo */: + case "logo-dark" /* LogoDark */: + return this.generateFromLogo(asset, project); + case "icon" /* Icon */: + return this.generateLegacyIcon(asset, project); + case "icon-foreground" /* IconForeground */: + return this.generateAdaptiveIconForeground(asset, project); + case "icon-background" /* IconBackground */: + return this.generateAdaptiveIconBackground(asset, project); + case "splash" /* Splash */: + case "splash-dark" /* SplashDark */: + return this.generateSplashes(asset, project); + } + return []; + } + /** + * Generate from logo combines all of the other operations into a single operation + * from a single asset source file. In this mode, a logo along with a background color + * is used to generate all icons and splash screens (with dark mode where possible). + */ + async generateFromLogo(asset, project) { + const pipe = asset.pipeline(); + const generated = []; + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + // Generate adaptive icons + const generatedAdaptiveIcons = await this._generateAdaptiveIconsFromLogo(project, asset, pipe); + generated.push(...generatedAdaptiveIcons); + if (asset.kind === "logo" /* Logo */) { + // Generate legacy icons + const generatedLegacyIcons = await this.generateLegacyIcon(asset, project); + generated.push(...generatedLegacyIcons); + const splashes = Object.values(AndroidAssetTemplates).filter((a) => a.kind === "splash" /* Splash */); + const generatedSplashes = await Promise.all(splashes.map(async (splash) => { + var _a; + return this._generateSplashesFromLogo(project, asset, splash, pipe, (_a = this.options.splashBackgroundColor) !== null && _a !== void 0 ? _a : '#ffffff'); + })); + generated.push(...generatedSplashes); + } + // Generate dark splashes + const darkSplashes = Object.values(AndroidAssetTemplates).filter((a) => a.kind === "splash-dark" /* SplashDark */); + const generatedSplashes = await Promise.all(darkSplashes.map(async (splash) => { + var _a; + return this._generateSplashesFromLogo(project, asset, splash, pipe, (_a = this.options.splashBackgroundColorDark) !== null && _a !== void 0 ? _a : '#111111'); + })); + generated.push(...generatedSplashes); + return [...generated]; + } + // Generate adaptive icons from the source logo + async _generateAdaptiveIconsFromLogo(project, asset, pipe) { + var _a, _b; + // Current versions of Android don't appear to support night mode icons (13+ might?) + // so, for now, we only generate light mode ones + if (asset.kind === "logo-dark" /* LogoDark */) { + return []; + } + // Create the background pipeline for the generated icons + const backgroundPipe = (0, sharp_1.default)({ + create: { + width: asset.width, + height: asset.height, + channels: 4, + background: asset.kind === "logo" /* Logo */ + ? (_a = this.options.iconBackgroundColor) !== null && _a !== void 0 ? _a : '#ffffff' + : (_b = this.options.iconBackgroundColorDark) !== null && _b !== void 0 ? _b : '#111111', + }, + }); + const icons = Object.values(AndroidAssetTemplates).filter((a) => a.kind === "adaptive-icon" /* AdaptiveIcon */); + const backgroundImages = await Promise.all(icons.map(async (icon) => { + return await this._generateAdaptiveIconBackground(project, asset, icon, backgroundPipe); + })); + const foregroundImages = await Promise.all(icons.map(async (icon) => { + return await this._generateAdaptiveIconForeground(project, asset, icon, pipe); + })); + return [...foregroundImages, ...backgroundImages]; + } + async _generateSplashesFromLogo(project, asset, splash, pipe, backgroundColor) { + var _a, _b, _c, _d, _e, _f, _g; + // Generate light splash + const resPath = this.getResPath(project); + let drawableDir = `drawable`; + if (splash.density) { + drawableDir = `drawable-${splash.density}`; + } + const parentDir = (0, path_1.join)(resPath, drawableDir); + if (!(await (0, utils_fs_1.pathExists)(parentDir))) { + await (0, utils_fs_1.mkdirp)(parentDir); + } + const dest = (0, path_1.join)(resPath, drawableDir, 'splash.png'); + const targetLogoWidthPercent = (_a = this.options.logoSplashScale) !== null && _a !== void 0 ? _a : 0.2; + let targetWidth = (_b = this.options.logoSplashTargetWidth) !== null && _b !== void 0 ? _b : Math.floor(((_c = splash.width) !== null && _c !== void 0 ? _c : 0) * targetLogoWidthPercent); + if (targetWidth > splash.width || targetWidth > splash.height) { + targetWidth = Math.floor(((_d = splash.width) !== null && _d !== void 0 ? _d : 0) * targetLogoWidthPercent); + } + if (targetWidth > splash.width || targetWidth > splash.height) { + (0, log_1.warn)(`Logo dimensions exceed dimensions of splash ${splash.width}x${splash.height}, using default logo size`); + targetWidth = Math.floor(((_e = splash.width) !== null && _e !== void 0 ? _e : 0) * 0.2); + } + const canvas = (0, sharp_1.default)({ + create: { + width: (_f = splash.width) !== null && _f !== void 0 ? _f : 0, + height: (_g = splash.height) !== null && _g !== void 0 ? _g : 0, + channels: 4, + background: backgroundColor, + }, + }); + const resized = await (0, sharp_1.default)(asset.path).resize(targetWidth).toBuffer(); + const outputInfo = await canvas + .composite([{ input: resized, gravity: sharp_1.default.gravity.center }]) + .png() + .toFile(dest); + const splashOutput = new output_asset_1.OutputAsset(splash, asset, project, { + [dest]: dest, + }, { + [dest]: outputInfo, + }); + return splashOutput; + } + async generateLegacyIcon(asset, project) { + const icons = Object.values(AndroidAssetTemplates).filter((a) => a.kind === "icon" /* Icon */); + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + const collected = await Promise.all(icons.map(async (icon) => { + const [dest, outputInfo] = await this.generateLegacyLauncherIcon(project, asset, icon); + return new output_asset_1.OutputAsset(icon, asset, project, { [`mipmap-${icon.density}/ic_launcher.png`]: dest }, { [`mipmap-${icon.density}/ic_launcher.png`]: outputInfo }); + })); + collected.push(...(await Promise.all(icons.map(async (icon) => { + const [dest, outputInfo] = await this.generateRoundLauncherIcon(project, asset, icon); + return new output_asset_1.OutputAsset(icon, asset, project, { [`mipmap-${icon.density}/ic_launcher_round.png`]: dest }, { [`mipmap-${icon.density}/ic_launcher_round.png`]: outputInfo }); + })))); + await this.updateManifest(project); + return collected; + } + async generateLegacyLauncherIcon(project, asset, template) { + const resPath = this.getResPath(project); + const parentDir = (0, path_1.join)(resPath, `mipmap-${template.density}`); + if (!(await (0, utils_fs_1.pathExists)(parentDir))) { + await (0, utils_fs_1.mkdirp)(parentDir); + } + const destRound = (0, path_1.join)(resPath, `mipmap-${template.density}`, 'ic_launcher.png'); + // This pipeline is trick, but we need two separate pipelines + // per https://github.com/lovell/sharp/issues/2378#issuecomment-864132578 + const padding = 8; + const resized = await (0, sharp_1.default)(asset.path) + .resize(template.width, template.height) + // .composite([{ input: Buffer.from(svg), blend: 'dest-in' }]) + .toBuffer(); + const composited = await (0, sharp_1.default)(resized) + .resize(Math.max(0, template.width - padding * 2), Math.max(0, template.height - padding * 2)) + .extend({ + top: padding, + bottom: padding, + left: padding, + right: padding, + background: { r: 0, g: 0, b: 0, alpha: 0 }, + }) + .toBuffer(); + const outputInfo = await (0, sharp_1.default)(composited).png().toFile(destRound); + return [destRound, outputInfo]; + } + async generateRoundLauncherIcon(project, asset, template) { + const svg = ``; + const resPath = this.getResPath(project); + const destRound = (0, path_1.join)(resPath, `mipmap-${template.density}`, 'ic_launcher_round.png'); + // This pipeline is tricky, but we need two separate pipelines + // per https://github.com/lovell/sharp/issues/2378#issuecomment-864132578 + const resized = await (0, sharp_1.default)(asset.path).resize(template.width, template.height).toBuffer(); + const composited = await (0, sharp_1.default)(resized) + .composite([{ input: Buffer.from(svg), blend: 'dest-in' }]) + .toBuffer(); + const outputInfo = await (0, sharp_1.default)(composited).png().toFile(destRound); + return [destRound, outputInfo]; + } + async generateAdaptiveIconForeground(asset, project) { + const icons = Object.values(AndroidAssetTemplates).filter((a) => a.kind === "icon" /* Icon */); + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + return Promise.all(icons.map(async (icon) => { + return await this._generateAdaptiveIconForeground(project, asset, icon, pipe); + })); + } + async _generateAdaptiveIconForeground(project, asset, icon, pipe) { + const resPath = this.getResPath(project); + // Create the foreground and background images + const destForeground = (0, path_1.join)(resPath, `mipmap-${icon.density}`, 'ic_launcher_foreground.png'); + const parentDir = (0, path_1.dirname)(destForeground); + if (!(await (0, utils_fs_1.pathExists)(parentDir))) { + await (0, utils_fs_1.mkdirp)(parentDir); + } + const outputInfoForeground = await pipe.resize(icon.width, icon.height).png().toFile(destForeground); + // Create the adaptive icon XML + const icLauncherXml = ` + + + + + + + + + + `.trim(); + const mipmapAnyPath = (0, path_1.join)(resPath, `mipmap-anydpi-v26`); + if (!(await (0, utils_fs_1.pathExists)(mipmapAnyPath))) { + await (0, utils_fs_1.mkdirp)(mipmapAnyPath); + } + const destIcLauncher = (0, path_1.join)(mipmapAnyPath, `ic_launcher.xml`); + const destIcLauncherRound = (0, path_1.join)(mipmapAnyPath, `ic_launcher_round.xml`); + await (0, utils_fs_1.writeFile)(destIcLauncher, icLauncherXml); + await (0, utils_fs_1.writeFile)(destIcLauncherRound, icLauncherXml); + // Return the created files for this OutputAsset + return new output_asset_1.OutputAsset(icon, asset, project, { + [`mipmap-${icon.density}/ic_launcher_foreground.png`]: destForeground, + 'mipmap-anydpi-v26/ic_launcher.xml': destIcLauncher, + 'mipmap-anydpi-v26/ic_launcher_round.xml': destIcLauncherRound, + }, { + [`mipmap-${icon.density}/ic_launcher_foreground.png`]: outputInfoForeground, + }); + } + async generateAdaptiveIconBackground(asset, project) { + const icons = Object.values(AndroidAssetTemplates).filter((a) => a.kind === "icon" /* Icon */); + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + return Promise.all(icons.map(async (icon) => { + return await this._generateAdaptiveIconBackground(project, asset, icon, pipe); + })); + } + async _generateAdaptiveIconBackground(project, asset, icon, pipe) { + const resPath = this.getResPath(project); + const destBackground = (0, path_1.join)(resPath, `mipmap-${icon.density}`, 'ic_launcher_background.png'); + const parentDir = (0, path_1.dirname)(destBackground); + if (!(await (0, utils_fs_1.pathExists)(parentDir))) { + await (0, utils_fs_1.mkdirp)(parentDir); + } + const outputInfoBackground = await pipe.resize(icon.width, icon.height).png().toFile(destBackground); + // Create the adaptive icon XML + const icLauncherXml = ` + + + + + + + + + + `.trim(); + const mipmapAnyPath = (0, path_1.join)(resPath, `mipmap-anydpi-v26`); + if (!(await (0, utils_fs_1.pathExists)(mipmapAnyPath))) { + await (0, utils_fs_1.mkdirp)(mipmapAnyPath); + } + const destIcLauncher = (0, path_1.join)(mipmapAnyPath, `ic_launcher.xml`); + const destIcLauncherRound = (0, path_1.join)(mipmapAnyPath, `ic_launcher_round.xml`); + await (0, utils_fs_1.writeFile)(destIcLauncher, icLauncherXml); + await (0, utils_fs_1.writeFile)(destIcLauncherRound, icLauncherXml); + // Return the created files for this OutputAsset + return new output_asset_1.OutputAsset(icon, asset, project, { + [`mipmap-${icon.density}/ic_launcher_background.png`]: destBackground, + 'mipmap-anydpi-v26/ic_launcher.xml': destIcLauncher, + 'mipmap-anydpi-v26/ic_launcher_round.xml': destIcLauncherRound, + }, { + [`mipmap-${icon.density}/ic_launcher_background.png`]: outputInfoBackground, + }); + } + async updateManifest(project) { + var _a, _b; + (_b = (_a = project.android) === null || _a === void 0 ? void 0 : _a.getAndroidManifest()) === null || _b === void 0 ? void 0 : _b.setAttrs('manifest/application', { + 'android:icon': '@mipmap/ic_launcher', + 'android:roundIcon': '@mipmap/ic_launcher_round', + }); + await project.commit(); + } + async generateSplashes(asset, project) { + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + const splashes = (asset.kind === "splash" /* Splash */ + ? Object.values(AndroidAssetTemplates).filter((a) => a.kind === "splash" /* Splash */) + : Object.values(AndroidAssetTemplates).filter((a) => a.kind === "splash-dark" /* SplashDark */)); + const resPath = this.getResPath(project); + const collected = await Promise.all(splashes.map(async (splash) => { + const [dest, outputInfo] = await this.generateSplash(project, asset, splash, pipe); + const relPath = (0, path_1.relative)(resPath, dest); + return new output_asset_1.OutputAsset(splash, asset, project, { [relPath]: dest }, { [relPath]: outputInfo }); + })); + return collected; + } + async generateSplash(project, asset, template, pipe) { + const drawableDir = template.density ? `drawable-${template.density}` : 'drawable'; + const resPath = this.getResPath(project); + const parentDir = (0, path_1.join)(resPath, drawableDir); + if (!(await (0, utils_fs_1.pathExists)(parentDir))) { + await (0, utils_fs_1.mkdirp)(parentDir); + } + const dest = (0, path_1.join)(resPath, drawableDir, 'splash.png'); + const outputInfo = await pipe.resize(template.width, template.height).png().toFile(dest); + return [dest, outputInfo]; + } + getResPath(project) { + var _a; + return (0, path_1.join)(project.config.android.path, 'app', 'src', (_a = this.options.androidFlavor) !== null && _a !== void 0 ? _a : 'main', 'res'); + } +} +exports.AndroidAssetGenerator = AndroidAssetGenerator; diff --git a/@capacitor/assets/dist/platforms/ios/assets.d.ts b/@capacitor/assets/dist/platforms/ios/assets.d.ts new file mode 100644 index 00000000..ecc654f5 --- /dev/null +++ b/@capacitor/assets/dist/platforms/ios/assets.d.ts @@ -0,0 +1,13 @@ +import type { IosOutputAssetTemplate, IosOutputAssetTemplateSplash } from '../../definitions'; +/** + * 1024px Icon + * + * - iOS 1024 icon + */ +export declare const IOS_1024_ICON: IosOutputAssetTemplate; +export declare const IOS_1X_UNIVERSAL_ANYANY_SPLASH: IosOutputAssetTemplateSplash; +export declare const IOS_2X_UNIVERSAL_ANYANY_SPLASH: IosOutputAssetTemplateSplash; +export declare const IOS_3X_UNIVERSAL_ANYANY_SPLASH: IosOutputAssetTemplateSplash; +export declare const IOS_1X_UNIVERSAL_ANYANY_SPLASH_DARK: IosOutputAssetTemplateSplash; +export declare const IOS_2X_UNIVERSAL_ANYANY_SPLASH_DARK: IosOutputAssetTemplateSplash; +export declare const IOS_3X_UNIVERSAL_ANYANY_SPLASH_DARK: IosOutputAssetTemplateSplash; diff --git a/@capacitor/assets/dist/platforms/ios/assets.js b/@capacitor/assets/dist/platforms/ios/assets.js new file mode 100644 index 00000000..4a54b9e2 --- /dev/null +++ b/@capacitor/assets/dist/platforms/ios/assets.js @@ -0,0 +1,89 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IOS_3X_UNIVERSAL_ANYANY_SPLASH_DARK = exports.IOS_2X_UNIVERSAL_ANYANY_SPLASH_DARK = exports.IOS_1X_UNIVERSAL_ANYANY_SPLASH_DARK = exports.IOS_3X_UNIVERSAL_ANYANY_SPLASH = exports.IOS_2X_UNIVERSAL_ANYANY_SPLASH = exports.IOS_1X_UNIVERSAL_ANYANY_SPLASH = exports.IOS_1024_ICON = void 0; +/** + * 1024px Icon + * + * - iOS 1024 icon + */ +exports.IOS_1024_ICON = { + platform: "ios" /* Ios */, + idiom: "universal" /* Universal */, + kind: "icon" /* Icon */, + name: 'AppIcon-512@2x.png', + format: "png" /* Png */, + width: 1024, + height: 1024, +}; +exports.IOS_1X_UNIVERSAL_ANYANY_SPLASH = { + platform: "ios" /* Ios */, + idiom: "universal" /* Universal */, + kind: "splash" /* Splash */, + name: 'Default@1x~universal~anyany.png', + format: "png" /* Png */, + width: 2732, + height: 2732, + orientation: "portrait" /* Portrait */, + scale: 1, + theme: "any" /* Any */, +}; +exports.IOS_2X_UNIVERSAL_ANYANY_SPLASH = { + platform: "ios" /* Ios */, + idiom: "universal" /* Universal */, + kind: "splash" /* Splash */, + name: 'Default@2x~universal~anyany.png', + format: "png" /* Png */, + width: 2732, + height: 2732, + orientation: "portrait" /* Portrait */, + scale: 2, + theme: "any" /* Any */, +}; +exports.IOS_3X_UNIVERSAL_ANYANY_SPLASH = { + platform: "ios" /* Ios */, + idiom: "universal" /* Universal */, + kind: "splash" /* Splash */, + name: 'Default@3x~universal~anyany.png', + format: "png" /* Png */, + width: 2732, + height: 2732, + orientation: "portrait" /* Portrait */, + scale: 3, + theme: "any" /* Any */, +}; +exports.IOS_1X_UNIVERSAL_ANYANY_SPLASH_DARK = { + platform: "ios" /* Ios */, + idiom: "universal" /* Universal */, + kind: "splash-dark" /* SplashDark */, + name: 'Default@1x~universal~anyany-dark.png', + format: "png" /* Png */, + width: 2732, + height: 2732, + orientation: "portrait" /* Portrait */, + scale: 1, + theme: "dark" /* Dark */, +}; +exports.IOS_2X_UNIVERSAL_ANYANY_SPLASH_DARK = { + platform: "ios" /* Ios */, + idiom: "universal" /* Universal */, + kind: "splash-dark" /* SplashDark */, + name: 'Default@2x~universal~anyany-dark.png', + format: "png" /* Png */, + width: 2732, + height: 2732, + orientation: "portrait" /* Portrait */, + scale: 2, + theme: "dark" /* Dark */, +}; +exports.IOS_3X_UNIVERSAL_ANYANY_SPLASH_DARK = { + platform: "ios" /* Ios */, + idiom: "universal" /* Universal */, + kind: "splash-dark" /* SplashDark */, + name: 'Default@3x~universal~anyany-dark.png', + format: "png" /* Png */, + width: 2732, + height: 2732, + orientation: "portrait" /* Portrait */, + scale: 3, + theme: "dark" /* Dark */, +}; diff --git a/@capacitor/assets/dist/platforms/ios/index.d.ts b/@capacitor/assets/dist/platforms/ios/index.d.ts new file mode 100644 index 00000000..1b061b56 --- /dev/null +++ b/@capacitor/assets/dist/platforms/ios/index.d.ts @@ -0,0 +1,21 @@ +import type { AssetGeneratorOptions } from '../../asset-generator'; +import { AssetGenerator } from '../../asset-generator'; +import type { InputAsset } from '../../input-asset'; +import { OutputAsset } from '../../output-asset'; +import type { Project } from '../../project'; +export declare const IOS_APP_ICON_SET_NAME = "AppIcon"; +export declare const IOS_APP_ICON_SET_PATH: string; +export declare const IOS_SPLASH_IMAGE_SET_NAME = "Splash"; +export declare const IOS_SPLASH_IMAGE_SET_PATH: string; +export declare class IosAssetGenerator extends AssetGenerator { + constructor(options?: AssetGeneratorOptions); + generate(asset: InputAsset, project: Project): Promise; + private generateFromLogo; + private _generateIcons; + private generateIconsForLogo; + private generateIcons; + private generateSplashes; + private updateIconsContentsJson; + private updateSplashContentsJson; + private updateSplashContentsJsonDark; +} diff --git a/@capacitor/assets/dist/platforms/ios/index.js b/@capacitor/assets/dist/platforms/ios/index.js new file mode 100644 index 00000000..b7ba5435 --- /dev/null +++ b/@capacitor/assets/dist/platforms/ios/index.js @@ -0,0 +1,266 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.IosAssetGenerator = exports.IOS_SPLASH_IMAGE_SET_PATH = exports.IOS_SPLASH_IMAGE_SET_NAME = exports.IOS_APP_ICON_SET_PATH = exports.IOS_APP_ICON_SET_NAME = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const sharp_1 = (0, tslib_1.__importDefault)(require("sharp")); +const asset_generator_1 = require("../../asset-generator"); +const error_1 = require("../../error"); +const output_asset_1 = require("../../output-asset"); +const assets_1 = require("./assets"); +const IosAssetTemplates = (0, tslib_1.__importStar)(require("./assets")); +exports.IOS_APP_ICON_SET_NAME = 'AppIcon'; +exports.IOS_APP_ICON_SET_PATH = `App/Assets.xcassets/${exports.IOS_APP_ICON_SET_NAME}.appiconset`; +exports.IOS_SPLASH_IMAGE_SET_NAME = 'Splash'; +exports.IOS_SPLASH_IMAGE_SET_PATH = `App/Assets.xcassets/${exports.IOS_SPLASH_IMAGE_SET_NAME}.imageset`; +class IosAssetGenerator extends asset_generator_1.AssetGenerator { + constructor(options = {}) { + super(options); + } + async generate(asset, project) { + var _a; + const iosDir = (_a = project.config.ios) === null || _a === void 0 ? void 0 : _a.path; + if (!iosDir) { + throw new error_1.BadProjectError('No ios project found'); + } + if (asset.platform !== "any" /* Any */ && asset.platform !== "ios" /* Ios */) { + return []; + } + switch (asset.kind) { + case "logo" /* Logo */: + case "logo-dark" /* LogoDark */: + return this.generateFromLogo(asset, project); + case "icon" /* Icon */: + return this.generateIcons(asset, project); + case "splash" /* Splash */: + case "splash-dark" /* SplashDark */: + return this.generateSplashes(asset, project); + } + return []; + } + async generateFromLogo(asset, project) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j; + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + const iosDir = project.config.ios.path; + // Generate logos + let logos = []; + if (asset.kind === "logo" /* Logo */) { + logos = await this.generateIconsForLogo(asset, project); + } + const generated = []; + const targetLogoWidthPercent = (_a = this.options.logoSplashScale) !== null && _a !== void 0 ? _a : 0.2; + const targetWidth = (_b = this.options.logoSplashTargetWidth) !== null && _b !== void 0 ? _b : Math.floor(((_c = asset.width) !== null && _c !== void 0 ? _c : 0) * targetLogoWidthPercent); + if (asset.kind === "logo" /* Logo */) { + // Generate light splash + const lightDefaultBackground = '#ffffff'; + const lightSplashes = [ + assets_1.IOS_1X_UNIVERSAL_ANYANY_SPLASH, + assets_1.IOS_2X_UNIVERSAL_ANYANY_SPLASH, + assets_1.IOS_3X_UNIVERSAL_ANYANY_SPLASH, + ]; + const lightSplashesGenerated = []; + for (const lightSplash of lightSplashes) { + const lightDest = (0, path_1.join)(iosDir, exports.IOS_SPLASH_IMAGE_SET_PATH, lightSplash.name); + const canvas = (0, sharp_1.default)({ + create: { + width: (_d = lightSplash.width) !== null && _d !== void 0 ? _d : 0, + height: (_e = lightSplash.height) !== null && _e !== void 0 ? _e : 0, + channels: 4, + background: (_f = this.options.splashBackgroundColor) !== null && _f !== void 0 ? _f : lightDefaultBackground, + }, + }); + const resized = await (0, sharp_1.default)(asset.path).resize(targetWidth).toBuffer(); + const lightOutputInfo = await canvas + .composite([{ input: resized, gravity: sharp_1.default.gravity.center }]) + .png() + .toFile(lightDest); + const lightSplashOutput = new output_asset_1.OutputAsset(lightSplash, asset, project, { + [lightDest]: lightDest, + }, { + [lightDest]: lightOutputInfo, + }); + generated.push(lightSplashOutput); + lightSplashesGenerated.push(lightSplashOutput); + } + await this.updateSplashContentsJson(lightSplashesGenerated, project); + } + // Generate dark splash + const darkDefaultBackground = '#111111'; + const darkSplashes = [ + assets_1.IOS_1X_UNIVERSAL_ANYANY_SPLASH_DARK, + assets_1.IOS_2X_UNIVERSAL_ANYANY_SPLASH_DARK, + assets_1.IOS_3X_UNIVERSAL_ANYANY_SPLASH_DARK, + ]; + const darkSplashesGenerated = []; + for (const darkSplash of darkSplashes) { + const darkDest = (0, path_1.join)(iosDir, exports.IOS_SPLASH_IMAGE_SET_PATH, darkSplash.name); + const canvas = (0, sharp_1.default)({ + create: { + width: (_g = darkSplash.width) !== null && _g !== void 0 ? _g : 0, + height: (_h = darkSplash.height) !== null && _h !== void 0 ? _h : 0, + channels: 4, + background: (_j = this.options.splashBackgroundColorDark) !== null && _j !== void 0 ? _j : darkDefaultBackground, + }, + }); + const resized = await (0, sharp_1.default)(asset.path).resize(targetWidth).toBuffer(); + const darkOutputInfo = await canvas + .composite([{ input: resized, gravity: sharp_1.default.gravity.center }]) + .png() + .toFile(darkDest); + const darkSplashOutput = new output_asset_1.OutputAsset(darkSplash, asset, project, { + [darkDest]: darkDest, + }, { + [darkDest]: darkOutputInfo, + }); + generated.push(darkSplashOutput); + darkSplashesGenerated.push(darkSplashOutput); + } + await this.updateSplashContentsJsonDark(darkSplashesGenerated, project); + return [...logos, ...generated]; + } + async _generateIcons(asset, project, icons) { + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + const iosDir = project.config.ios.path; + const lightDefaultBackground = '#ffffff'; + const generated = await Promise.all(icons.map(async (icon) => { + var _a; + const dest = (0, path_1.join)(iosDir, exports.IOS_APP_ICON_SET_PATH, icon.name); + const outputInfo = await pipe + .resize(icon.width, icon.height) + .png() + .flatten({ background: (_a = this.options.iconBackgroundColor) !== null && _a !== void 0 ? _a : lightDefaultBackground }) + .toFile(dest); + return new output_asset_1.OutputAsset(icon, asset, project, { + [icon.name]: dest, + }, { + [icon.name]: outputInfo, + }); + })); + await this.updateIconsContentsJson(generated, project); + return generated; + } + // Generate ALL the icons when only given a logo + async generateIconsForLogo(asset, project) { + const icons = Object.values(IosAssetTemplates).filter((a) => ["icon" /* Icon */].find((i) => i === a.kind)); + return this._generateIcons(asset, project, icons); + } + async generateIcons(asset, project) { + const icons = Object.values(IosAssetTemplates).filter((a) => ["icon" /* Icon */].find((i) => i === a.kind)); + return this._generateIcons(asset, project, icons); + } + async generateSplashes(asset, project) { + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + const assetMetas = asset.kind === "splash" /* Splash */ + ? [assets_1.IOS_1X_UNIVERSAL_ANYANY_SPLASH, assets_1.IOS_2X_UNIVERSAL_ANYANY_SPLASH, assets_1.IOS_3X_UNIVERSAL_ANYANY_SPLASH] + : [ + assets_1.IOS_1X_UNIVERSAL_ANYANY_SPLASH_DARK, + assets_1.IOS_2X_UNIVERSAL_ANYANY_SPLASH_DARK, + assets_1.IOS_3X_UNIVERSAL_ANYANY_SPLASH_DARK, + ]; + const generated = []; + for (const assetMeta of assetMetas) { + const iosDir = project.config.ios.path; + const dest = (0, path_1.join)(iosDir, exports.IOS_SPLASH_IMAGE_SET_PATH, assetMeta.name); + const outputInfo = await pipe.resize(assetMeta.width, assetMeta.height).png().toFile(dest); + const g = new output_asset_1.OutputAsset(assetMeta, asset, project, { + [assetMeta.name]: dest, + }, { + [assetMeta.name]: outputInfo, + }); + generated.push(g); + } + if (asset.kind === "splash" /* Splash */) { + await this.updateSplashContentsJson(generated, project); + } + else if (asset.kind === "splash-dark" /* SplashDark */) { + // Need to register this as a dark-mode splash + await this.updateSplashContentsJsonDark(generated, project); + } + return generated; + } + async updateIconsContentsJson(generated, project) { + const assetsPath = (0, path_1.join)(project.config.ios.path, exports.IOS_APP_ICON_SET_PATH); + const contentsJsonPath = (0, path_1.join)(assetsPath, 'Contents.json'); + const json = await (0, utils_fs_1.readFile)(contentsJsonPath, { encoding: 'utf-8' }); + const parsed = JSON.parse(json); + const withoutMissing = []; + for (const g of generated) { + const width = g.template.width; + const height = g.template.height; + parsed.images.map((i) => { + if (i.filename !== g.template.name) { + (0, utils_fs_1.rmSync)((0, path_1.join)(assetsPath, i.filename)); + } + }); + withoutMissing.push({ + idiom: g.template.idiom, + size: `${width}x${height}`, + filename: g.template.name, + platform: "ios" /* Ios */, + }); + } + parsed.images = withoutMissing; + await (0, utils_fs_1.writeFile)(contentsJsonPath, JSON.stringify(parsed, null, 2)); + } + async updateSplashContentsJson(generated, project) { + var _a; + const contentsJsonPath = (0, path_1.join)(project.config.ios.path, exports.IOS_SPLASH_IMAGE_SET_PATH, 'Contents.json'); + const json = await (0, utils_fs_1.readFile)(contentsJsonPath, { encoding: 'utf-8' }); + const parsed = JSON.parse(json); + const withoutMissing = parsed.images.filter((i) => !!i.filename); + for (const g of generated) { + const existing = withoutMissing.find((f) => f.scale === `${g.template.scale}x` && f.idiom === 'universal' && typeof f.appearances === 'undefined'); + if (existing) { + existing.filename = g.template.name; + } + else { + withoutMissing.push({ + idiom: 'universal', + scale: `${(_a = g.template.scale) !== null && _a !== void 0 ? _a : 1}x`, + filename: g.template.name, + }); + } + } + parsed.images = withoutMissing; + await (0, utils_fs_1.writeFile)(contentsJsonPath, JSON.stringify(parsed, null, 2)); + } + async updateSplashContentsJsonDark(generated, project) { + var _a; + const contentsJsonPath = (0, path_1.join)(project.config.ios.path, exports.IOS_SPLASH_IMAGE_SET_PATH, 'Contents.json'); + const json = await (0, utils_fs_1.readFile)(contentsJsonPath, { encoding: 'utf-8' }); + const parsed = JSON.parse(json); + const withoutMissing = parsed.images.filter((i) => !!i.filename); + for (const g of generated) { + const existing = withoutMissing.find((f) => f.scale === `${g.template.scale}x` && f.idiom === 'universal' && typeof f.appearances !== 'undefined'); + if (existing) { + existing.filename = g.template.name; + } + else { + withoutMissing.push({ + appearances: [ + { + appearance: 'luminosity', + value: 'dark', + }, + ], + idiom: 'universal', + scale: `${(_a = g.template.scale) !== null && _a !== void 0 ? _a : 1}x`, + filename: g.template.name, + }); + } + } + parsed.images = withoutMissing; + await (0, utils_fs_1.writeFile)(contentsJsonPath, JSON.stringify(parsed, null, 2)); + } +} +exports.IosAssetGenerator = IosAssetGenerator; diff --git a/@capacitor/assets/dist/platforms/pwa/assets.d.ts b/@capacitor/assets/dist/platforms/pwa/assets.d.ts new file mode 100644 index 00000000..8019d44f --- /dev/null +++ b/@capacitor/assets/dist/platforms/pwa/assets.d.ts @@ -0,0 +1,20 @@ +import type { PwaOutputAssetTemplate } from '../../definitions'; +export declare const PWA_48_PX_ICON: PwaOutputAssetTemplate; +export declare const PWA_72_PX_ICON: PwaOutputAssetTemplate; +export declare const PWA_96_PX_ICON: PwaOutputAssetTemplate; +export declare const PWA_128_PX_ICON: PwaOutputAssetTemplate; +export declare const PWA_192_PX_ICON: PwaOutputAssetTemplate; +export declare const PWA_256_PX_ICON: PwaOutputAssetTemplate; +export declare const PWA_512_PX_ICON: PwaOutputAssetTemplate; +export declare const PWA_SPLASH: PwaOutputAssetTemplate; +export declare const ASSETS: { + PWA_48_PX_ICON: PwaOutputAssetTemplate; + PWA_72_PX_ICON: PwaOutputAssetTemplate; + PWA_96_PX_ICON: PwaOutputAssetTemplate; + PWA_128_PX_ICON: PwaOutputAssetTemplate; + PWA_192_PX_ICON: PwaOutputAssetTemplate; + PWA_256_PX_ICON: PwaOutputAssetTemplate; + PWA_512_PX_ICON: PwaOutputAssetTemplate; + PWA_SPLASH: PwaOutputAssetTemplate; +}; +export declare const PWA_IOS_DEVICE_SIZES: string[]; diff --git a/@capacitor/assets/dist/platforms/pwa/assets.js b/@capacitor/assets/dist/platforms/pwa/assets.js new file mode 100644 index 00000000..697292e0 --- /dev/null +++ b/@capacitor/assets/dist/platforms/pwa/assets.js @@ -0,0 +1,93 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PWA_IOS_DEVICE_SIZES = exports.ASSETS = exports.PWA_SPLASH = exports.PWA_512_PX_ICON = exports.PWA_256_PX_ICON = exports.PWA_192_PX_ICON = exports.PWA_128_PX_ICON = exports.PWA_96_PX_ICON = exports.PWA_72_PX_ICON = exports.PWA_48_PX_ICON = void 0; +exports.PWA_48_PX_ICON = { + platform: "pwa" /* Pwa */, + kind: "icon" /* Icon */, + name: 'icon-48.webp', + format: "webp" /* WebP */, + width: 48, + height: 48, +}; +exports.PWA_72_PX_ICON = { + platform: "pwa" /* Pwa */, + kind: "icon" /* Icon */, + name: 'icon-72.webp', + format: "webp" /* WebP */, + width: 72, + height: 72, +}; +exports.PWA_96_PX_ICON = { + platform: "pwa" /* Pwa */, + kind: "icon" /* Icon */, + name: 'icon-96.webp', + format: "webp" /* WebP */, + width: 96, + height: 96, +}; +exports.PWA_128_PX_ICON = { + platform: "pwa" /* Pwa */, + kind: "icon" /* Icon */, + name: 'icon-128.webp', + format: "webp" /* WebP */, + width: 128, + height: 128, +}; +exports.PWA_192_PX_ICON = { + platform: "pwa" /* Pwa */, + kind: "icon" /* Icon */, + name: 'icon-192.webp', + format: "webp" /* WebP */, + width: 192, + height: 192, +}; +exports.PWA_256_PX_ICON = { + platform: "pwa" /* Pwa */, + kind: "icon" /* Icon */, + name: 'icon-256.webp', + format: "webp" /* WebP */, + width: 256, + height: 256, +}; +exports.PWA_512_PX_ICON = { + platform: "pwa" /* Pwa */, + kind: "icon" /* Icon */, + name: 'icon-512.webp', + format: "webp" /* WebP */, + width: 512, + height: 512, +}; +exports.PWA_SPLASH = { + platform: "pwa" /* Pwa */, + kind: "splash" /* Splash */, + name: 'apple-splash.webp', + format: "webp" /* WebP */, + width: 2048, + height: 2048, +}; +exports.ASSETS = { + PWA_48_PX_ICON: exports.PWA_48_PX_ICON, + PWA_72_PX_ICON: exports.PWA_72_PX_ICON, + PWA_96_PX_ICON: exports.PWA_96_PX_ICON, + PWA_128_PX_ICON: exports.PWA_128_PX_ICON, + PWA_192_PX_ICON: exports.PWA_192_PX_ICON, + PWA_256_PX_ICON: exports.PWA_256_PX_ICON, + PWA_512_PX_ICON: exports.PWA_512_PX_ICON, + PWA_SPLASH: exports.PWA_SPLASH, +}; +// From https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout/ +exports.PWA_IOS_DEVICE_SIZES = [ + '2048x2732@2x', + '1668x2388@2x', + '1668x2224@2x', + '1620x2160@2x', + '1536x2048@2x', + '1284x2778@3x', + '1242x2688@3x', + '1170x2532@3x', + '1125x2436@3x', + '1080x1920@3x', + '828x1792@2x', + '750x1334@2x', + '640x1136@2x', +]; diff --git a/@capacitor/assets/dist/platforms/pwa/index.d.ts b/@capacitor/assets/dist/platforms/pwa/index.d.ts new file mode 100644 index 00000000..d99a05da --- /dev/null +++ b/@capacitor/assets/dist/platforms/pwa/index.d.ts @@ -0,0 +1,31 @@ +import type { AssetGeneratorOptions } from '../../asset-generator'; +import { AssetGenerator } from '../../asset-generator'; +import type { InputAsset } from '../../input-asset'; +import { OutputAsset } from '../../output-asset'; +import type { Project } from '../../project'; +export declare const PWA_ASSET_PATH = "icons"; +export interface ManifestIcon { + src: string; + size?: string | number; + sizes?: string; + destination?: string; + purpose?: string; + type?: string; +} +export declare class PwaAssetGenerator extends AssetGenerator { + constructor(options?: AssetGeneratorOptions); + getManifestJson(project: Project): Promise; + getSplashSizes(): Promise; + generate(asset: InputAsset, project: Project): Promise; + private generateFromLogo; + private _generateSplashFromLogo; + private generateIcons; + private getPWADirectory; + private getPWAAssetsDirectory; + private getManifestJsonPath; + private updateManifest; + private makeIconManifestEntry; + private generateSplashes; + private _generateSplash; + static logInstructions(generated: OutputAsset[]): void; +} diff --git a/@capacitor/assets/dist/platforms/pwa/index.js b/@capacitor/assets/dist/platforms/pwa/index.js new file mode 100644 index 00000000..1ef0b5a7 --- /dev/null +++ b/@capacitor/assets/dist/platforms/pwa/index.js @@ -0,0 +1,434 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.PwaAssetGenerator = exports.PWA_ASSET_PATH = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const node_fetch_1 = (0, tslib_1.__importDefault)(require("node-fetch")); +const node_html_parser_1 = (0, tslib_1.__importDefault)(require("node-html-parser")); +const path_1 = require("path"); +const sharp_1 = (0, tslib_1.__importDefault)(require("sharp")); +const asset_generator_1 = require("../../asset-generator"); +const error_1 = require("../../error"); +const output_asset_1 = require("../../output-asset"); +const log_1 = require("../../util/log"); +const assets_1 = require("./assets"); +exports.PWA_ASSET_PATH = 'icons'; +class PwaAssetGenerator extends asset_generator_1.AssetGenerator { + constructor(options = {}) { + super(options); + } + async getManifestJson(project) { + var _a; + const path = await this.getManifestJsonPath((_a = project.directory) !== null && _a !== void 0 ? _a : ''); + const contents = await (0, utils_fs_1.readFile)(path, { encoding: 'utf-8' }); + return JSON.parse(contents); + } + async getSplashSizes() { + var _a; + const appleInterfacePage = `https://developer.apple.com/design/human-interface-guidelines/foundations/layout/`; + let assetSizes = assets_1.PWA_IOS_DEVICE_SIZES; + if (!this.options.pwaNoAppleFetch) { + try { + const res = await (0, node_fetch_1.default)(appleInterfacePage); + const html = await res.text(); + const doc = (0, node_html_parser_1.default)(html); + const target = doc.querySelector('main > section .row > .column table'); + const sizes = (_a = target === null || target === void 0 ? void 0 : target.querySelectorAll('tr > td:nth-child(2)')) !== null && _a !== void 0 ? _a : []; + const sizeStrings = sizes.map((td) => { + const t = td.innerText; + return t + .slice(t.indexOf('pt (') + 4) + .slice(0, -1) + .replace(' px ', ''); + }); + const deduped = new Set(sizeStrings); + assetSizes = Array.from(deduped); + } + catch (e) { + (0, log_1.warn)(`Unable to load iOS HIG screen sizes to generate iOS PWA splash screens. Using local snapshot of device sizes. Use --pwaNoAppleFetch true to always use local sizes`); + } + } + return assetSizes; + } + async generate(asset, project) { + const pwaDir = project.directory; + if (!pwaDir) { + throw new error_1.BadProjectError('No web app (PWA) found'); + } + if (asset.platform !== "any" /* Any */) { + return []; + } + switch (asset.kind) { + case "logo" /* Logo */: + case "logo-dark" /* LogoDark */: + return this.generateFromLogo(asset, project); + case "icon" /* Icon */: + return this.generateIcons(asset, project); + // eslint-disable-next-line no-duplicate-case + case "icon" /* Icon */: + return []; + case "splash" /* Splash */: + case "splash-dark" /* SplashDark */: + // PWA has no splashes + return this.generateSplashes(asset, project); + } + return []; + } + async generateFromLogo(asset, project) { + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + // Generate logos + const logos = await this.generateIcons(asset, project); + const assetSizes = await this.getSplashSizes(); + const generated = []; + const splashes = await Promise.all(assetSizes.map((a) => this._generateSplashFromLogo(project, asset, a))); + generated.push(...splashes.flat()); + return [...logos, ...generated]; + } + async _generateSplashFromLogo(project, asset, sizeString) { + var _a, _b, _c; + const parts = sizeString.split('@'); + const sizeParts = parts[0].split('x'); + const width = parseFloat(sizeParts[0]); + const height = parseFloat(sizeParts[1]); + const density = parts[1]; + const generated = []; + const pwaDir = await this.getPWADirectory((_a = project.directory) !== null && _a !== void 0 ? _a : undefined); + const pwaAssetDir = await this.getPWAAssetsDirectory(pwaDir); + const destDir = (0, path_1.join)(pwaAssetDir, exports.PWA_ASSET_PATH); + try { + await (0, utils_fs_1.mkdirp)(destDir); + } + catch (e) { + console.log(e); + // ignore error + } + // TODO: In the future, add size checks to ensure canvas image + // is not exceeded (see Android splash generation) + const targetLogoWidthPercent = (_b = this.options.logoSplashScale) !== null && _b !== void 0 ? _b : 0.2; + const targetWidth = (_c = this.options.logoSplashTargetWidth) !== null && _c !== void 0 ? _c : Math.floor(width * targetLogoWidthPercent); + if (asset.kind === "logo" /* Logo */) { + // Generate light splash + const lightDefaultBackground = '#ffffff'; + const lightDest = (0, path_1.join)(destDir, `apple-splash-${width}-${height}@${density}.png`); + const canvas = (0, sharp_1.default)({ + create: { + width, + height, + channels: 4, + background: lightDefaultBackground, + }, + }); + const resized = await (0, sharp_1.default)(asset.path).resize(targetWidth).toBuffer(); + const lightOutputInfo = await canvas + .composite([{ input: resized, gravity: sharp_1.default.gravity.center }]) + .png() + .toFile(lightDest); + const template = { + name: `apple-splash-${width}-${height}@${density}.png`, + platform: "pwa" /* Pwa */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + orientation: "portrait" /* Portrait */, + density: density[0], + width, + height, + }; + const lightSplashOutput = new output_asset_1.OutputAsset(template, asset, project, { + [lightDest]: lightDest, + }, { + [lightDest]: lightOutputInfo, + }); + generated.push(lightSplashOutput); + } + // Generate dark splash + const darkDefaultBackground = '#111111'; + const darkDest = (0, path_1.join)(destDir, `apple-splash-${width}-${height}@${density}-dark.png`); + const canvas = (0, sharp_1.default)({ + create: { + width, + height, + channels: 4, + background: darkDefaultBackground, + }, + }); + const resized = await (0, sharp_1.default)(asset.path).resize(targetWidth).toBuffer(); + const darkOutputInfo = await canvas + .composite([{ input: resized, gravity: sharp_1.default.gravity.center }]) + .png() + .toFile(darkDest); + const template = { + name: `apple-splash-${width}-${height}@${density}-dark.png`, + platform: "pwa" /* Pwa */, + kind: "splash-dark" /* SplashDark */, + format: "png" /* Png */, + orientation: "portrait" /* Portrait */, + density: density[0], + width, + height, + }; + const darkSplashOutput = new output_asset_1.OutputAsset(template, asset, project, { + [darkDest]: darkDest, + }, { + [darkDest]: darkOutputInfo, + }); + generated.push(darkSplashOutput); + return generated; + } + async generateIcons(asset, project) { + var _a; + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + const pwaDir = await this.getPWADirectory((_a = project.directory) !== null && _a !== void 0 ? _a : undefined); + const icons = Object.values(assets_1.ASSETS).filter((a) => a.kind === "icon" /* Icon */); + const generatedAssets = await Promise.all(icons.map(async (icon) => { + const destDir = (0, path_1.join)(await this.getPWAAssetsDirectory(pwaDir), exports.PWA_ASSET_PATH); + try { + await (0, utils_fs_1.mkdirp)(destDir); + } + catch { + // ignore error + } + const dest = (0, path_1.join)(destDir, icon.name); + const outputInfo = await pipe.resize(icon.width, icon.height).png().toFile(dest); + return new output_asset_1.OutputAsset(icon, asset, project, { + [icon.name]: dest, + }, { + [icon.name]: outputInfo, + }); + })); + await this.updateManifest(project, generatedAssets); + return generatedAssets; + } + async getPWADirectory(projectRoot) { + if (await (0, utils_fs_1.pathExists)((0, path_1.join)(projectRoot !== null && projectRoot !== void 0 ? projectRoot : '', 'public')) /* React */) { + return (0, path_1.join)(projectRoot !== null && projectRoot !== void 0 ? projectRoot : '', 'public'); + } + else if (await (0, utils_fs_1.pathExists)((0, path_1.join)(projectRoot !== null && projectRoot !== void 0 ? projectRoot : '', 'src')) /* Angular and Vue */) { + return (0, path_1.join)(projectRoot !== null && projectRoot !== void 0 ? projectRoot : '', 'src'); + } + else if (await (0, utils_fs_1.pathExists)((0, path_1.join)(projectRoot !== null && projectRoot !== void 0 ? projectRoot : '', 'www'))) { + return (0, path_1.join)(projectRoot !== null && projectRoot !== void 0 ? projectRoot : '', 'www'); + } + else { + return (0, path_1.join)(projectRoot !== null && projectRoot !== void 0 ? projectRoot : '', 'www'); + } + } + async getPWAAssetsDirectory(pwaDir) { + if (await (0, utils_fs_1.pathExists)((0, path_1.join)(pwaDir !== null && pwaDir !== void 0 ? pwaDir : '', 'assets'))) { + return (0, path_1.join)(pwaDir !== null && pwaDir !== void 0 ? pwaDir : '', 'assets'); + } + return ''; + } + async getManifestJsonPath(projectRoot) { + const r = (p) => (0, path_1.join)(projectRoot !== null && projectRoot !== void 0 ? projectRoot : '', p); + if (this.options.pwaManifestPath) { + return r(this.options.pwaManifestPath); + } + if (await (0, utils_fs_1.pathExists)(r('public'))) { + if (await (0, utils_fs_1.pathExists)(r('public/manifest.json'))) { + return r('public/manifest.json'); + } + // Default to the spec-preferred naming + return r('public/manifest.webmanifest'); + } + else if (await (0, utils_fs_1.pathExists)(r('src/assets'))) { + if (await (0, utils_fs_1.pathExists)(r('src/manifest.json'))) { + return r('src/manifest.json'); + } + // Default to the spec-preferred naming + return r('src/manifest.webmanifest'); + } + else if (await (0, utils_fs_1.pathExists)(r('www'))) { + if (await (0, utils_fs_1.pathExists)(r('www'))) { + return r('www/manifest.json'); + } + // Default to the spec-preferred naming + return r('www/manifest.webmanifest'); + } + else { + // Safe fallback to older styles + return r('www/manifest.json'); + } + } + async updateManifest(project, assets) { + var _a, _b; + const pwaDir = await this.getPWADirectory((_a = project.directory) !== null && _a !== void 0 ? _a : undefined); + const pwaAssetDir = await this.getPWAAssetsDirectory(pwaDir); + const manifestPath = await this.getManifestJsonPath((_b = project.directory) !== null && _b !== void 0 ? _b : undefined); + const pwaAssets = assets.filter((a) => a.template.platform === "pwa" /* Pwa */); + let manifestJson = {}; + if (await (0, utils_fs_1.pathExists)(manifestPath)) { + manifestJson = await (0, utils_fs_1.readJSON)(manifestPath); + } + let icons = manifestJson['icons'] || []; + const replacedIcons = []; + for (const asset of pwaAssets) { + const src = asset.template.name; + const fname = (0, path_1.basename)(src); + const relativePath = (0, path_1.relative)(pwaDir, (0, path_1.join)(pwaAssetDir, exports.PWA_ASSET_PATH, fname)); + replacedIcons.push(this.makeIconManifestEntry(asset.template, relativePath)); + } + // Delete icons that were replaced + for (const icon of icons) { + if (await (0, utils_fs_1.pathExists)((0, path_1.join)(pwaDir, icon.src))) { + const exists = !!pwaAssets.find(({ template: { width, height } }) => { + return `${width}x${height}` === icon.sizes; + }); + if (!exists) { + (0, utils_fs_1.rmSync)((0, path_1.join)(pwaDir, icon.src)); + (0, log_1.warn)(`DELETE ${icon.src}`); + } + } + } + icons = replacedIcons; + // Update the manifest background color to the splash one if provided to ensure + // platform automatic splash generation works + if (this.options.splashBackgroundColor) { + manifestJson['background_color'] = this.options.splashBackgroundColor; + } + const jsonOutput = { + ...manifestJson, + icons, + }; + await (0, utils_fs_1.writeJSON)(manifestPath, jsonOutput, { + spaces: 2, + }); + } + makeIconManifestEntry(asset, relativePath) { + const ext = (0, path_1.extname)(relativePath); + const posixPath = relativePath.split(path_1.sep).join(path_1.posix.sep); + const type = { + png: 'image/png', + jpg: 'image/jpeg', + jpeg: 'image/jpeg', + svg: 'image/svg+xml', + }[ext] || 'image/png'; + const entry = { + src: posixPath, + type, + sizes: `${asset.width}x${asset.height}`, + }; + if (asset.kind === "icon" /* Icon */) { + entry.purpose = 'any maskable'; + } + return entry; + } + async generateSplashes(asset, project) { + const pipe = asset.pipeline(); + if (!pipe) { + throw new error_1.BadPipelineError('Sharp instance not created'); + } + const assetSizes = await this.getSplashSizes(); + return Promise.all(assetSizes.map((a) => this._generateSplash(project, asset, a, pipe))); + } + async _generateSplash(project, asset, sizeString, pipe) { + var _a; + const parts = sizeString.split('@'); + const sizeParts = parts[0].split('x'); + const width = parseFloat(sizeParts[0]); + const height = parseFloat(sizeParts[1]); + const density = parts[1]; + const name = `apple-splash-${width}-${height}@${density}${asset.kind === "splash-dark" /* SplashDark */ ? '-dark' : ''}.png`; + const pwaDir = await this.getPWADirectory((_a = project.directory) !== null && _a !== void 0 ? _a : undefined); + const pwaAssetDir = await this.getPWAAssetsDirectory(pwaDir); + const destDir = (0, path_1.join)(pwaAssetDir, exports.PWA_ASSET_PATH); + try { + await (0, utils_fs_1.mkdirp)(destDir); + } + catch { + // ignore error + } + const dest = (0, path_1.join)(destDir, name); + const outputInfo = await pipe.resize(width, height).png().toFile(dest); + const template = { + name, + platform: "pwa" /* Pwa */, + kind: "splash" /* Splash */, + format: "png" /* Png */, + orientation: "portrait" /* Portrait */, + density: density[0], + width, + height, + }; + const splashOutput = new output_asset_1.OutputAsset(template, asset, project, { + [dest]: dest, + }, { + [dest]: outputInfo, + }); + return splashOutput; + } + static logInstructions(generated) { + var _a, _b, _c, _d, _e, _f; + (0, log_1.log)(`PWA instructions: + +Add the following tags to your index.html to support PWA icons: +`); + const pwaAssets = generated.filter((g) => g.template.platform === "pwa" /* Pwa */); + const mainIcon = pwaAssets.find((g) => g.template.width == 512 && g.template.kind === "icon" /* Icon */); + (0, log_1.log)(``); + for (const g of pwaAssets.filter((a) => a.template.kind === "icon" /* Icon */)) { + const w = g.template.width; + const h = g.template.height; + const path = (_b = Object.values(g.destFilenames)[0]) !== null && _b !== void 0 ? _b : ''; + (0, log_1.log)(``); + } + for (const g of pwaAssets.filter((a) => a.template.kind === "splash" /* Splash */)) { + const template = g.template; + const w = g.template.width; + const h = g.template.height; + const path = (_c = Object.values(g.destFilenames)[0]) !== null && _c !== void 0 ? _c : ''; + (0, log_1.log)(``); + } + for (const g of pwaAssets.filter((a) => a.template.kind === "splash" /* Splash */)) { + const template = g.template; + const w = g.template.width; + const h = g.template.height; + const path = (_d = Object.values(g.destFilenames)[0]) !== null && _d !== void 0 ? _d : ''; + (0, log_1.log)(``); + } + for (const g of pwaAssets.filter((a) => a.template.kind === "splash-dark" /* SplashDark */)) { + const template = g.template; + const w = g.template.width; + const h = g.template.height; + const path = (_e = Object.values(g.destFilenames)[0]) !== null && _e !== void 0 ? _e : ''; + (0, log_1.log)(``); + } + for (const g of pwaAssets.filter((a) => a.template.kind === "splash-dark" /* SplashDark */)) { + const template = g.template; + const w = g.template.width; + const h = g.template.height; + const path = (_f = Object.values(g.destFilenames)[0]) !== null && _f !== void 0 ? _f : ''; + (0, log_1.log)(``); + } + console.log('Generated', pwaAssets.filter((a) => a.template.kind === "splash" /* Splash */).length, pwaAssets.filter((a) => a.template.kind === "splash-dark" /* SplashDark */).length); + /* + for (const g of pwaAssets.filter(a => a.template.kind === AssetKind.Splash)) { + const w = g.template.width; + const h = g.template.height; + const path = Object.values(g.destFilenames)[0] ?? ''; + log(`; diff --git a/@capacitor/assets/dist/tasks/generate.js b/@capacitor/assets/dist/tasks/generate.js new file mode 100644 index 00000000..735dde84 --- /dev/null +++ b/@capacitor/assets/dist/tasks/generate.js @@ -0,0 +1,139 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.run = void 0; +const tslib_1 = require("tslib"); +const c = (0, tslib_1.__importStar)(require("../colors")); +const android_1 = require("../platforms/android"); +const ios_1 = require("../platforms/ios"); +const pwa_1 = require("../platforms/pwa"); +const log_1 = require("../util/log"); +async function run(ctx) { + try { + if (!(await ctx.project.assetDirExists())) { + (0, log_1.error)(`Asset directory not found at ${ctx.project.projectRoot}. Use --asset-path to specify a specific directory containing assets`); + return []; + } + const assets = await ctx.project.loadInputAssets(); + if ([assets.logo, assets.icon, assets.splash, assets.splashDark].every((a) => !a)) { + (0, log_1.error)(`No assets found in the asset path ${c.ancillary(ctx.project.assetDir)}. See https://github.com/ionic-team/capacitor-assets to learn how to use this tool.`); + return []; + } + let platforms = ['ios', 'android', 'pwa']; + if (ctx.args.ios || ctx.args.android || ctx.args.pwa) { + platforms = []; + } + if (ctx.args.ios) { + platforms.push('ios'); + } + if (ctx.args.android) { + platforms.push('android'); + } + if (ctx.args.pwa) { + platforms.push('pwa'); + } + await verifyPlatformFolders(/* mut */ platforms, ctx.project); + if (platforms.length > 0) { + if (!ctx.args.silent) { + (0, log_1.log)(`Generating assets for ${platforms.map((p) => c.strong(c.success(p))).join(', ')}`); + } + const generators = getGenerators(ctx, platforms); + const generated = await generateAssets(assets, generators, ctx.project); + if (!ctx.args.silent) { + logGenerated(generated); + } + /* + if (!ctx.args.silent && platforms.indexOf('pwa') >= 0 && ctx.args.pwaTags) { + PwaAssetGenerator.logInstructions(generated); + } + */ + return generated; + } + else { + log_1.logger.warn('No platforms found, exiting'); + return []; + } + } + catch (e) { + (0, log_1.error)('Unable to generate assets', e.message); + (0, log_1.error)(e); + } + return []; +} +exports.run = run; +async function verifyPlatformFolders(platforms, project) { + var _a, _b; + if (platforms.indexOf('ios') >= 0 && !(await project.iosExists())) { + platforms.splice(platforms.indexOf('ios'), 1); + log_1.logger.warn(`iOS platform not found at ${((_a = project.config.ios) === null || _a === void 0 ? void 0 : _a.path) || ''}, skipping iOS generation`); + } + if (platforms.indexOf('android') >= 0 && !(await project.androidExists())) { + platforms.splice(platforms.indexOf('android'), 1); + log_1.logger.warn(`Android platform not found at ${((_b = project.config.android) === null || _b === void 0 ? void 0 : _b.path) || ''}, skipping android generation`); + } +} +async function generateAssets(assets, generators, project) { + const generated = []; + async function generateAndCollect(asset) { + const g = await Promise.all(generators.map((g) => asset.generate(g, project))); + generated.push(...g.flat().filter((f) => !!f)); + } + const assetTypes = Object.values(assets).filter((v) => !!v); + for (const asset of assetTypes) { + await generateAndCollect(asset); + } + return generated; +} +function getGenerators(ctx, platforms) { + return platforms.map((p) => { + if (p === 'ios') { + return new ios_1.IosAssetGenerator(ctx.args); + } + if (p === 'android') { + return new android_1.AndroidAssetGenerator(ctx.args); + } + if (p === 'pwa') { + return new pwa_1.PwaAssetGenerator(ctx.args); + } + }); +} +// Print out a nice report of the assets generated +// and totals per platform +function logGenerated(generated) { + const sorted = generated.slice().sort((a, b) => { + return a.template.platform.localeCompare(b.template.platform); + }); + for (const g of sorted) { + Object.keys(g.destFilenames).forEach((name) => { + const filename = g.getDestFilename(name); + const outputInfo = g.getOutputInfo(name); + (0, log_1.log)(`${c.strong(c.success('CREATE'))} ${c.strong(c.extra(g.template.platform))} ${c.weak(g.template.kind)} ${filename !== null && filename !== void 0 ? filename : ''}${outputInfo ? ` (${size(outputInfo.size)})` : ''}`); + }); + } + (0, log_1.log)('\n'); + // Aggregate total assets and size per platform + const totals = sorted.reduce((totals, g) => { + if (!(g.template.platform in totals)) { + totals[g.template.platform] = { + count: 0, + size: 0, + }; + } + const entry = totals[g.template.platform]; + const count = Object.values(g.destFilenames).reduce((v) => v + 1, 0); + const size = Object.values(g.outputInfoMap).reduce((v, c) => v + c.size, 0); + totals[g.template.platform] = { + count: entry.count + count, + size: entry.size + size, + }; + return totals; + }, {}); + (0, log_1.log)('Totals:'); + for (const platformName of Object.keys(totals).sort()) { + const e = totals[platformName]; + (0, log_1.log)(`${c.strong(c.success(platformName))}: ${c.strong(c.extra(e.count))} generated, ${c.strong(size(e.size))} total`); + } +} +function size(bytes) { + const i = Math.floor(Math.log(bytes) / Math.log(1024)); + return Number((bytes / Math.pow(1024, i)).toFixed(2)) * 1 + ' ' + ['B', 'KB', 'MB', 'GB', 'TB'][i]; +} diff --git a/@capacitor/assets/dist/util/cli.d.ts b/@capacitor/assets/dist/util/cli.d.ts new file mode 100644 index 00000000..4fd5c067 --- /dev/null +++ b/@capacitor/assets/dist/util/cli.d.ts @@ -0,0 +1 @@ +export declare function wrapAction(action: any): (...args: any[]) => Promise; diff --git a/@capacitor/assets/dist/util/cli.js b/@capacitor/assets/dist/util/cli.js new file mode 100644 index 00000000..54f9f7a4 --- /dev/null +++ b/@capacitor/assets/dist/util/cli.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.wrapAction = void 0; +const log_1 = require("./log"); +function wrapAction(action) { + return async (...args) => { + try { + await action(...args); + } + catch (e) { + log_1.logger.error(e.message); + throw e; + } + }; +} +exports.wrapAction = wrapAction; +/* +export async function logPrompt(msg: string, promptObject: any) { + const { wordWrap } = await import('@ionic/cli-framework-output'); + const prompt = await import('prompts'); + + logger.log({ + msg: `${c.input(`[?]`)} ${wordWrap(msg, { indentation: 4 })}`, + logger, + format: false, + }); + + return prompt.default(promptObject, { onCancel: () => process.exit(1) }); +} + +*/ diff --git a/@capacitor/assets/dist/util/log.d.ts b/@capacitor/assets/dist/util/log.d.ts new file mode 100644 index 00000000..375f632d --- /dev/null +++ b/@capacitor/assets/dist/util/log.d.ts @@ -0,0 +1,8 @@ +import { StreamOutputStrategy } from '@ionic/cli-framework-output'; +export declare const output: StreamOutputStrategy; +export declare const logger: import("@ionic/cli-framework-output").Logger; +export declare function debug(...args: any[]): void; +export declare function log(...args: any[]): void; +export declare function warn(...args: any[]): void; +export declare function error(...args: any[]): void; +export declare function fatal(msg: string, exc?: Error): never; diff --git a/@capacitor/assets/dist/util/log.js b/@capacitor/assets/dist/util/log.js new file mode 100644 index 00000000..c6b0cfad --- /dev/null +++ b/@capacitor/assets/dist/util/log.js @@ -0,0 +1,51 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fatal = exports.error = exports.warn = exports.log = exports.debug = exports.logger = exports.output = void 0; +const tslib_1 = require("tslib"); +const cli_framework_output_1 = require("@ionic/cli-framework-output"); +const colors_1 = (0, tslib_1.__importDefault)(require("../colors")); +const term_1 = require("./term"); +const options = { + colors: colors_1.default, + stream: process.argv.includes('--json') ? process.stderr : process.stdout, +}; +exports.output = (0, term_1.isInteractive)() ? new cli_framework_output_1.TTYOutputStrategy(options) : new cli_framework_output_1.StreamOutputStrategy(options); +exports.logger = (0, cli_framework_output_1.createDefaultLogger)({ + output: exports.output, + formatterOptions: { + titleize: false, + tags: new Map([ + [cli_framework_output_1.LOGGER_LEVELS.DEBUG, colors_1.default.log.DEBUG('[debug]')], + [cli_framework_output_1.LOGGER_LEVELS.INFO, colors_1.default.log.INFO('[info]')], + [cli_framework_output_1.LOGGER_LEVELS.WARN, colors_1.default.log.WARN('[warn]')], + [cli_framework_output_1.LOGGER_LEVELS.ERROR, colors_1.default.log.ERROR('[error]')], + ]), + }, +}); +function debug(...args) { + if (process.env.VERBOSE !== 'false') { + console.log(...args); + } +} +exports.debug = debug; +function log(...args) { + console.log(...args); +} +exports.log = log; +function warn(...args) { + console.warn(...args); +} +exports.warn = warn; +function error(...args) { + console.error(...args); +} +exports.error = error; +function fatal(msg, exc) { + console.error(colors_1.default.failure(`Fatal error: ${msg}`)); + console.log('ERROR', msg, exc); + if (exc) { + console.error(exc); + } + process.exit(1); +} +exports.fatal = fatal; diff --git a/@capacitor/assets/dist/util/subprocess.d.ts b/@capacitor/assets/dist/util/subprocess.d.ts new file mode 100644 index 00000000..5edf2e14 --- /dev/null +++ b/@capacitor/assets/dist/util/subprocess.d.ts @@ -0,0 +1 @@ +export declare function runCommand(command: string, args: string[], options?: {}): Promise; diff --git a/@capacitor/assets/dist/util/subprocess.js b/@capacitor/assets/dist/util/subprocess.js new file mode 100644 index 00000000..966f894a --- /dev/null +++ b/@capacitor/assets/dist/util/subprocess.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runCommand = void 0; +const tslib_1 = require("tslib"); +const utils_subprocess_1 = require("@ionic/utils-subprocess"); +const colors_1 = (0, tslib_1.__importDefault)(require("../colors")); +async function runCommand(command, args, options = {}) { + console.log(colors_1.default.strong(`> ${command} ${args.join(' ')}`)); + const p = new utils_subprocess_1.Subprocess(command, args, options); + try { + // return await p.output(); + return await p.run(); + } + catch (e) { + if (e instanceof utils_subprocess_1.SubprocessError) { + // old behavior of just throwing the stdout/stderr strings + throw e.output ? e.output : e.code ? e.code : e.error ? e.error.message : 'Unknown error'; + } + throw e; + } +} +exports.runCommand = runCommand; diff --git a/@capacitor/assets/dist/util/term.d.ts b/@capacitor/assets/dist/util/term.d.ts new file mode 100644 index 00000000..7b413055 --- /dev/null +++ b/@capacitor/assets/dist/util/term.d.ts @@ -0,0 +1,2 @@ +export declare const checkInteractive: (...args: any[]) => boolean; +export declare const isInteractive: () => boolean; diff --git a/@capacitor/assets/dist/util/term.js b/@capacitor/assets/dist/util/term.js new file mode 100644 index 00000000..7f727d42 --- /dev/null +++ b/@capacitor/assets/dist/util/term.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isInteractive = exports.checkInteractive = void 0; +const tslib_1 = require("tslib"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const colors_1 = (0, tslib_1.__importDefault)(require("../colors")); +const log_1 = require("./log"); +// Given input variables to a command, make sure all are provided if the terminal +// is not interactive (because we won't be able to prompt the user) +const checkInteractive = (...args) => { + if ((0, exports.isInteractive)()) { + return true; + } + // Fail if no args are provided, treat this as just a check of whether the term is + // interactive or not. + if (!args.length) { + return false; + } + // Make sure none of the provided args are empty, otherwise print the interactive + // warning and return false + if (args.filter((arg) => !arg).length) { + log_1.logger.error(`Non-interactive shell detected.\n` + + `Run the command with ${colors_1.default.input('--help')} to see a list of arguments that must be provided.`); + return false; + } + return true; +}; +exports.checkInteractive = checkInteractive; +const isInteractive = () => utils_terminal_1.TERMINAL_INFO.tty && !utils_terminal_1.TERMINAL_INFO.ci; +exports.isInteractive = isInteractive; diff --git a/@capacitor/assets/node_modules/.bin/cap b/@capacitor/assets/node_modules/.bin/cap new file mode 120000 index 00000000..8c246109 --- /dev/null +++ b/@capacitor/assets/node_modules/.bin/cap @@ -0,0 +1 @@ +../@capacitor/cli/bin/capacitor \ No newline at end of file diff --git a/@capacitor/assets/node_modules/.bin/capacitor b/@capacitor/assets/node_modules/.bin/capacitor new file mode 120000 index 00000000..8c246109 --- /dev/null +++ b/@capacitor/assets/node_modules/.bin/capacitor @@ -0,0 +1 @@ +../@capacitor/cli/bin/capacitor \ No newline at end of file diff --git a/@capacitor/assets/node_modules/.bin/rimraf b/@capacitor/assets/node_modules/.bin/rimraf new file mode 120000 index 00000000..3445a8a7 --- /dev/null +++ b/@capacitor/assets/node_modules/.bin/rimraf @@ -0,0 +1 @@ +../rimraf/dist/cjs/src/bin.js \ No newline at end of file diff --git a/@capacitor/assets/node_modules/.bin/semver b/@capacitor/assets/node_modules/.bin/semver new file mode 120000 index 00000000..5aaadf42 --- /dev/null +++ b/@capacitor/assets/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver.js \ No newline at end of file diff --git a/@capacitor/assets/node_modules/@capacitor/cli/LICENSE b/@capacitor/assets/node_modules/@capacitor/cli/LICENSE new file mode 100644 index 00000000..c3e903bd --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present Drifty Co. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/@capacitor/assets/node_modules/@capacitor/cli/README.md b/@capacitor/assets/node_modules/@capacitor/cli/README.md new file mode 100644 index 00000000..d758c3ca --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/README.md @@ -0,0 +1,15 @@ +# Capacitor CLI + +The Capacitor command-line interface should be installed locally and executed through `npm` scripts. + +``` +npm install @capacitor/cli --save-dev +``` + +## Using Capacitor CLI + +Consult the Getting Started guide for information on using the CLI and Capacitor scripts. + +### License + +* [MIT](https://github.com/ionic-team/capacitor/blob/HEAD/LICENSE) diff --git a/@capacitor/assets/node_modules/@capacitor/cli/assets/android-template.tar.gz b/@capacitor/assets/node_modules/@capacitor/cli/assets/android-template.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..c812adb220c4f94c217040f35a878c42e239f666 GIT binary patch literal 233664 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 E07NUwLjV8( literal 0 HcmV?d00001 diff --git a/@capacitor/assets/node_modules/@capacitor/cli/assets/capacitor-cordova-ios-plugins.tar.gz b/@capacitor/assets/node_modules/@capacitor/cli/assets/capacitor-cordova-ios-plugins.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..fe10aaeffde7dad32cab2f43ea501957ef0db344 GIT binary patch literal 433 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

)x&HdPTKwGdZ7m8Y3c3M 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 { + return (0, template_1.extractTemplate)(config.cli.assets.android.platformTemplateArchiveAbs, config.android.platformDirAbs); + }); +} +exports.addAndroid = addAndroid; +async function createLocalProperties(platformDir) { + const defaultAndroidPath = (0, path_1.join)((0, os_1.homedir)(), 'Library/Android/sdk'); + if (await (0, utils_fs_1.pathExists)(defaultAndroidPath)) { + const localSettings = ` +## This file is automatically generated by Android Studio. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file should *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=${defaultAndroidPath} + `; + await (0, utils_fs_1.writeFile)((0, path_1.join)(platformDir, 'local.properties'), localSettings, { + encoding: 'utf-8', + }); + // Only sync if we were able to create the local properties above, otherwise + // this will fail + try { + await gradleSync(platformDir); + } + catch (e) { + console.error('Error running gradle sync', e); + console.error('Unable to infer default Android SDK settings. This is fine, just run npx cap open android and import and sync gradle manually'); + } + } +} +exports.createLocalProperties = createLocalProperties; +async function gradleSync(platformDir) { + await (0, subprocess_1.runCommand)(`./gradlew`, [], { + cwd: platformDir, + }); +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/android/build.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/build.js new file mode 100644 index 00000000..728ad75f --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/build.js @@ -0,0 +1,100 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildAndroid = void 0; +const tslib_1 = require("tslib"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const log_1 = require("../log"); +const subprocess_1 = require("../util/subprocess"); +async function buildAndroid(config, buildOptions) { + var _a, _b; + const releaseType = (_a = buildOptions.androidreleasetype) !== null && _a !== void 0 ? _a : 'AAB'; + const releaseTypeIsAAB = releaseType === 'AAB'; + const flavor = (_b = buildOptions.flavor) !== null && _b !== void 0 ? _b : ''; + const arg = releaseTypeIsAAB + ? `:app:bundle${flavor}Release` + : `assemble${flavor}Release`; + const gradleArgs = [arg]; + try { + await (0, common_1.runTask)('Running Gradle build', async () => (0, subprocess_1.runCommand)('./gradlew', gradleArgs, { + cwd: config.android.platformDirAbs, + })); + } + catch (e) { + if (e.includes('EACCES')) { + throw `gradlew file does not have executable permissions. This can happen if the Android platform was added on a Windows machine. Please run ${colors_1.default.strong(`chmod +x ./${config.android.platformDir}/gradlew`)} and try again.`; + } + else { + throw e; + } + } + const releaseDir = releaseTypeIsAAB + ? flavor !== '' + ? `${flavor}Release` + : 'release' + : flavor !== '' + ? (0, path_1.join)(flavor, 'release') + : 'release'; + const releasePath = (0, path_1.join)(config.android.appDirAbs, 'build', 'outputs', releaseTypeIsAAB ? 'bundle' : 'apk', releaseDir); + const unsignedReleaseName = `app${flavor !== '' ? `-${flavor}` : ''}-release${releaseTypeIsAAB ? '' : '-unsigned'}.${releaseType.toLowerCase()}`; + const signedReleaseName = unsignedReleaseName.replace(`-release${releaseTypeIsAAB ? '' : '-unsigned'}.${releaseType.toLowerCase()}`, `-release-signed.${releaseType.toLowerCase()}`); + if (buildOptions.signingtype == 'jarsigner') { + await signWithJarSigner(config, buildOptions, releasePath, signedReleaseName, unsignedReleaseName); + } + else { + await signWithApkSigner(config, buildOptions, releasePath, signedReleaseName, unsignedReleaseName); + } + (0, log_1.logSuccess)(`Successfully generated ${signedReleaseName} at: ${releasePath}`); +} +exports.buildAndroid = buildAndroid; +async function signWithApkSigner(config, buildOptions, releasePath, signedReleaseName, unsignedReleaseName) { + if (!buildOptions.keystorepath || !buildOptions.keystorepass) { + throw 'Missing options. Please supply all options for android signing. (Keystore Path, Keystore Password)'; + } + const signingArgs = [ + 'sign', + '--ks', + buildOptions.keystorepath, + '--ks-pass', + `pass:${buildOptions.keystorepass}`, + '--in', + `${(0, path_1.join)(releasePath, unsignedReleaseName)}`, + '--out', + `${(0, path_1.join)(releasePath, signedReleaseName)}`, + ]; + await (0, common_1.runTask)('Signing Release', async () => { + await (0, subprocess_1.runCommand)('apksigner', signingArgs, { + cwd: config.android.platformDirAbs, + }); + }); +} +async function signWithJarSigner(config, buildOptions, releasePath, signedReleaseName, unsignedReleaseName) { + if (!buildOptions.keystorepath || + !buildOptions.keystorealias || + !buildOptions.keystorealiaspass || + !buildOptions.keystorepass) { + throw 'Missing options. Please supply all options for android signing. (Keystore Path, Keystore Password, Keystore Key Alias, Keystore Key Password)'; + } + const signingArgs = [ + '-sigalg', + 'SHA1withRSA', + '-digestalg', + 'SHA1', + '-keystore', + buildOptions.keystorepath, + '-keypass', + buildOptions.keystorealiaspass, + '-storepass', + buildOptions.keystorepass, + `-signedjar`, + `${(0, path_1.join)(releasePath, signedReleaseName)}`, + `${(0, path_1.join)(releasePath, unsignedReleaseName)}`, + buildOptions.keystorealias, + ]; + await (0, common_1.runTask)('Signing Release', async () => { + await (0, subprocess_1.runCommand)('jarsigner', signingArgs, { + cwd: config.android.platformDirAbs, + }); + }); +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/android/common.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/common.js new file mode 100644 index 00000000..0a86c2c2 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/common.js @@ -0,0 +1,97 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.editProjectSettingsAndroid = exports.resolvePlugin = exports.getAndroidPlugins = exports.checkAndroidPackage = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const plugin_1 = require("../plugin"); +const fs_1 = require("../util/fs"); +async function checkAndroidPackage(config) { + return (0, common_1.checkCapacitorPlatform)(config, 'android'); +} +exports.checkAndroidPackage = checkAndroidPackage; +async function getAndroidPlugins(allPlugins) { + const resolved = await Promise.all(allPlugins.map(async (plugin) => await resolvePlugin(plugin))); + return resolved.filter((plugin) => !!plugin); +} +exports.getAndroidPlugins = getAndroidPlugins; +async function resolvePlugin(plugin) { + var _a; + const platform = 'android'; + if ((_a = plugin.manifest) === null || _a === void 0 ? void 0 : _a.android) { + let pluginFilesPath = plugin.manifest.android.src + ? plugin.manifest.android.src + : platform; + const absolutePath = (0, path_1.join)(plugin.rootPath, pluginFilesPath, plugin.id); + // Android folder shouldn't have subfolders, but they used to, so search for them for compatibility reasons + if (await (0, utils_fs_1.pathExists)(absolutePath)) { + pluginFilesPath = (0, path_1.join)(platform, plugin.id); + } + plugin.android = { + type: 0 /* PluginType.Core */, + path: (0, fs_1.convertToUnixPath)(pluginFilesPath), + }; + } + else if (plugin.xml) { + plugin.android = { + type: 1 /* PluginType.Cordova */, + path: 'src/' + platform, + }; + if ((0, cordova_1.getIncompatibleCordovaPlugins)(platform).includes(plugin.id) || + !(0, plugin_1.getPluginPlatform)(plugin, platform)) { + plugin.android.type = 2 /* PluginType.Incompatible */; + } + } + else { + return null; + } + return plugin; +} +exports.resolvePlugin = resolvePlugin; +/** + * Update an Android project with the desired app name and appId. + * This is a little trickier for Android because the appId becomes + * the package name. + */ +async function editProjectSettingsAndroid(config) { + const appId = config.app.appId; + const appName = config.app.appName + .replace(/&/g, '&') + .replace(/ checkGradlew(config), + () => checkAppSrcDirs(config), + ]); + (0, log_1.logSuccess)('Android looking great! 👌'); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } +} +exports.doctorAndroid = doctorAndroid; +async function checkAppSrcDirs(config) { + if (!(await (0, utils_fs_1.pathExists)(config.android.appDirAbs))) { + return `${colors_1.default.strong(config.android.appDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + if (!(await (0, utils_fs_1.pathExists)(config.android.srcMainDirAbs))) { + return `${colors_1.default.strong(config.android.srcMainDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + if (!(await (0, utils_fs_1.pathExists)(config.android.assetsDirAbs))) { + return `${colors_1.default.strong(config.android.assetsDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + if (!(await (0, utils_fs_1.pathExists)(config.android.webDirAbs))) { + return `${colors_1.default.strong(config.android.webDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + const appSrcMainAssetsWwwIndexHtmlDir = (0, path_1.join)(config.android.webDirAbs, 'index.html'); + if (!(await (0, utils_fs_1.pathExists)(appSrcMainAssetsWwwIndexHtmlDir))) { + return `${colors_1.default.strong('index.html')} file is missing in ${colors_1.default.strong(config.android.webDirAbs)}`; + } + return checkAndroidManifestFile(config); +} +async function checkAndroidManifestFile(config) { + const manifestFileName = 'AndroidManifest.xml'; + const manifestFilePath = (0, path_1.join)(config.android.srcMainDirAbs, manifestFileName); + if (!(await (0, utils_fs_1.pathExists)(manifestFilePath))) { + return `${colors_1.default.strong(manifestFileName)} is missing in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + try { + const xmlData = await (0, xml_1.readXML)(manifestFilePath); + return checkAndroidManifestData(config, xmlData); + } + catch (e) { + return e; + } +} +async function checkAndroidManifestData(config, xmlData) { + const manifestNode = xmlData.manifest; + if (!manifestNode) { + return `Missing ${colors_1.default.input('')} XML node in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + const applicationChildNodes = manifestNode.application; + if (!Array.isArray(manifestNode.application)) { + return `Missing ${colors_1.default.input('')} XML node as a child node of ${colors_1.default.input('')} in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + let mainActivityClassPath = ''; + const mainApplicationNode = applicationChildNodes.find(applicationChildNode => { + const activityChildNodes = applicationChildNode.activity; + if (!Array.isArray(activityChildNodes)) { + return false; + } + const mainActivityNode = activityChildNodes.find(activityChildNode => { + const intentFilterChildNodes = activityChildNode['intent-filter']; + if (!Array.isArray(intentFilterChildNodes)) { + return false; + } + return intentFilterChildNodes.find(intentFilterChildNode => { + const actionChildNodes = intentFilterChildNode.action; + if (!Array.isArray(actionChildNodes)) { + return false; + } + const mainActionChildNode = actionChildNodes.find(actionChildNode => { + const androidName = actionChildNode.$['android:name']; + return androidName === 'android.intent.action.MAIN'; + }); + if (!mainActionChildNode) { + return false; + } + const categoryChildNodes = intentFilterChildNode.category; + if (!Array.isArray(categoryChildNodes)) { + return false; + } + return categoryChildNodes.find(categoryChildNode => { + const androidName = categoryChildNode.$['android:name']; + return androidName === 'android.intent.category.LAUNCHER'; + }); + }); + }); + if (mainActivityNode) { + mainActivityClassPath = mainActivityNode.$['android:name']; + } + return mainActivityNode; + }); + if (!mainApplicationNode) { + return `Missing main ${colors_1.default.input('')} XML node in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + if (!mainActivityClassPath) { + return `Missing ${colors_1.default.input('')} attribute for MainActivity class in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + return checkPackage(config, mainActivityClassPath); +} +async function checkPackage(config, mainActivityClassPath) { + const appSrcMainJavaDir = (0, path_1.join)(config.android.srcMainDirAbs, 'java'); + if (!(await (0, utils_fs_1.pathExists)(appSrcMainJavaDir))) { + return `${colors_1.default.strong('java')} directory is missing in ${colors_1.default.strong(appSrcMainJavaDir)}`; + } + const mainActivityClassName = mainActivityClassPath.split('.').pop(); + const srcFiles = await (0, utils_fs_1.readdirp)(appSrcMainJavaDir, { + filter: entry => !entry.stats.isDirectory() && + ['.java', '.kt'].includes((0, path_1.extname)(entry.path)) && + mainActivityClassName === (0, path_1.parse)(entry.path).name, + }); + if (srcFiles.length == 0) { + return `Main activity file (${mainActivityClassName}) is missing`; + } + return checkBuildGradle(config); +} +async function checkBuildGradle(config) { + const fileName = 'build.gradle'; + const filePath = (0, path_1.join)(config.android.appDirAbs, fileName); + if (!(await (0, utils_fs_1.pathExists)(filePath))) { + return `${colors_1.default.strong(fileName)} file is missing in ${colors_1.default.strong(config.android.appDir)}`; + } + let fileContent = await (0, utils_fs_1.readFile)(filePath, { encoding: 'utf-8' }); + fileContent = fileContent.replace(/'|"/g, '').replace(/\s+/g, ' '); + const searchFor = `applicationId`; + if (fileContent.indexOf(searchFor) === -1) { + return `${colors_1.default.strong('build.gradle')} file missing ${colors_1.default.input(`applicationId`)} config in ${filePath}`; + } + return null; +} +async function checkGradlew(config) { + const fileName = 'gradlew'; + const filePath = (0, path_1.join)(config.android.platformDirAbs, fileName); + if (!(await (0, utils_fs_1.pathExists)(filePath))) { + return `${colors_1.default.strong(fileName)} file is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + return null; +} +async function checkAndroidInstalled() { + /* + if (!await isInstalled('android')) { + return 'Android is not installed. For information: https://developer.android.com/studio/index.html'; + } + */ + return null; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/android/open.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/open.js new file mode 100644 index 00000000..574bcf83 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/open.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.openAndroid = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const open_1 = tslib_1.__importDefault(require("open")); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const log_1 = require("../log"); +const debug = (0, debug_1.default)('capacitor:android:open'); +async function openAndroid(config) { + const androidStudioPath = await config.android.studioPath; + const dir = config.android.platformDirAbs; + try { + if (!(await (0, utils_fs_1.pathExists)(androidStudioPath))) { + throw new Error(`Android Studio does not exist at: ${androidStudioPath}`); + } + await (0, open_1.default)(dir, { app: { name: androidStudioPath }, wait: false }); + log_1.logger.info(`Opening Android project at: ${colors_1.default.strong(config.android.platformDir)}.`); + } + catch (e) { + debug('Error opening Android Studio: %O', e); + log_1.logger.error('Unable to launch Android Studio. Is it installed?\n' + + `Attempted to open Android Studio at: ${colors_1.default.strong(androidStudioPath)}\n` + + `You can configure this with the ${colors_1.default.input('CAPACITOR_ANDROID_STUDIO_PATH')} environment variable.`); + } +} +exports.openAndroid = openAndroid; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/android/run.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/run.js new file mode 100644 index 00000000..d001ba45 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/run.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runAndroid = void 0; +const tslib_1 = require("tslib"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const native_run_1 = require("../util/native-run"); +const subprocess_1 = require("../util/subprocess"); +const debug = (0, debug_1.default)('capacitor:android:run'); +async function runAndroid(config, { target: selectedTarget, flavor: selectedFlavor, forwardPorts: selectedPorts, }) { + var _a; + const target = await (0, common_1.promptForPlatformTarget)(await (0, native_run_1.getPlatformTargets)('android'), selectedTarget); + const runFlavor = selectedFlavor || ((_a = config.android) === null || _a === void 0 ? void 0 : _a.flavor) || ''; + const arg = `assemble${runFlavor}Debug`; + const gradleArgs = [arg]; + debug('Invoking ./gradlew with args: %O', gradleArgs); + try { + await (0, common_1.runTask)('Running Gradle build', async () => (0, subprocess_1.runCommand)('./gradlew', gradleArgs, { + cwd: config.android.platformDirAbs, + })); + } + catch (e) { + if (e.includes('EACCES')) { + throw `gradlew file does not have executable permissions. This can happen if the Android platform was added on a Windows machine. Please run ${colors_1.default.strong(`chmod +x ./${config.android.platformDir}/gradlew`)} and try again.`; + } + else { + throw e; + } + } + const pathToApk = `${config.android.platformDirAbs}/${config.android.appDir}/build/outputs/apk${runFlavor !== '' ? '/' + runFlavor : ''}/debug`; + const apkName = (0, common_1.parseApkNameFromFlavor)(runFlavor); + const apkPath = (0, path_1.resolve)(pathToApk, apkName); + const nativeRunArgs = ['android', '--app', apkPath, '--target', target.id]; + if (selectedPorts) { + nativeRunArgs.push('--forward', `${selectedPorts}`); + } + debug('Invoking native-run with args: %O', nativeRunArgs); + await (0, common_1.runTask)(`Deploying ${colors_1.default.strong(apkName)} to ${colors_1.default.input(target.id)}`, async () => (0, native_run_1.runNativeRun)(nativeRunArgs)); +} +exports.runAndroid = runAndroid; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/android/update.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/update.js new file mode 100644 index 00000000..76c80f36 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/android/update.js @@ -0,0 +1,323 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handleCordovaPluginsGradle = exports.installGradlePlugins = exports.updateAndroid = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const plugin_1 = require("../plugin"); +const copy_1 = require("../tasks/copy"); +const migrate_1 = require("../tasks/migrate"); +const fs_1 = require("../util/fs"); +const node_1 = require("../util/node"); +const template_1 = require("../util/template"); +const common_2 = require("./common"); +const platform = 'android'; +const debug = (0, debug_1.default)('capacitor:android:update'); +async function updateAndroid(config) { + const plugins = await getPluginsTask(config); + const capacitorPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 0 /* PluginType.Core */); + (0, plugin_1.printPlugins)(capacitorPlugins, 'android'); + await writePluginsJson(config, capacitorPlugins); + await removePluginsNativeFiles(config); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + await (0, migrate_1.patchOldCapacitorPlugins)(config); + if (cordovaPlugins.length > 0) { + await copyPluginsNativeFiles(config, cordovaPlugins); + } + if (!(await (0, utils_fs_1.pathExists)(config.android.webDirAbs))) { + await (0, copy_1.copy)(config, platform); + } + await (0, cordova_1.handleCordovaPluginsJS)(cordovaPlugins, config, platform); + await (0, cordova_1.checkPluginDependencies)(plugins, platform); + await installGradlePlugins(config, capacitorPlugins, cordovaPlugins); + await handleCordovaPluginsGradle(config, cordovaPlugins); + await (0, cordova_1.writeCordovaAndroidManifest)(cordovaPlugins, config, platform); + const incompatibleCordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 2 /* PluginType.Incompatible */); + (0, plugin_1.printPlugins)(incompatibleCordovaPlugins, platform, 'incompatible'); + await (0, common_1.checkPlatformVersions)(config, platform); +} +exports.updateAndroid = updateAndroid; +function getGradlePackageName(id) { + return id.replace('@', '').replace('/', '-'); +} +async function writePluginsJson(config, plugins) { + const classes = await findAndroidPluginClasses(plugins); + const pluginsJsonPath = (0, path_1.resolve)(config.android.assetsDirAbs, 'capacitor.plugins.json'); + await (0, utils_fs_1.writeJSON)(pluginsJsonPath, classes, { spaces: '\t' }); +} +async function findAndroidPluginClasses(plugins) { + const entries = []; + for (const plugin of plugins) { + entries.push(...(await findAndroidPluginClassesInPlugin(plugin))); + } + return entries; +} +async function findAndroidPluginClassesInPlugin(plugin) { + if (!plugin.android || (0, plugin_1.getPluginType)(plugin, platform) !== 0 /* PluginType.Core */) { + return []; + } + const srcPath = (0, path_1.resolve)(plugin.rootPath, plugin.android.path, 'src/main'); + const srcFiles = await (0, utils_fs_1.readdirp)(srcPath, { + filter: entry => !entry.stats.isDirectory() && + ['.java', '.kt'].includes((0, path_1.extname)(entry.path)), + }); + const classRegex = /^@(?:CapacitorPlugin|NativePlugin)[\s\S]+?class ([\w]+)/gm; + const packageRegex = /^package ([\w.]+);?$/gm; + debug('Searching %O source files in %O by %O regex', srcFiles.length, srcPath, classRegex); + const entries = await Promise.all(srcFiles.map(async (srcFile) => { + const srcFileContents = await (0, utils_fs_1.readFile)(srcFile, { encoding: 'utf-8' }); + classRegex.lastIndex = 0; + const classMatch = classRegex.exec(srcFileContents); + if (classMatch) { + const className = classMatch[1]; + debug('Searching %O for package by %O regex', srcFile, packageRegex); + packageRegex.lastIndex = 0; + const packageMatch = packageRegex.exec(srcFileContents.substring(0, classMatch.index)); + if (!packageMatch) { + (0, errors_1.fatal)(`Package could not be parsed from Android plugin.\n` + + `Location: ${colors_1.default.strong(srcFile)}`); + } + const packageName = packageMatch[1]; + const classpath = `${packageName}.${className}`; + debug('%O is a suitable plugin class', classpath); + return { + pkg: plugin.id, + classpath, + }; + } + })); + return entries.filter((entry) => !!entry); +} +async function installGradlePlugins(config, capacitorPlugins, cordovaPlugins) { + const capacitorAndroidPackagePath = (0, node_1.resolveNode)(config.app.rootDir, '@capacitor/android', 'package.json'); + if (!capacitorAndroidPackagePath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong('node_modules/@capacitor/android')}.\n` + + `Are you sure ${colors_1.default.strong('@capacitor/android')} is installed?`); + } + const capacitorAndroidPath = (0, path_1.resolve)((0, path_1.dirname)(capacitorAndroidPackagePath), 'capacitor'); + const settingsPath = config.android.platformDirAbs; + const dependencyPath = config.android.appDirAbs; + const relativeCapcitorAndroidPath = (0, fs_1.convertToUnixPath)((0, path_1.relative)(settingsPath, capacitorAndroidPath)); + const settingsLines = `// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('${relativeCapcitorAndroidPath}') +${capacitorPlugins + .map(p => { + if (!p.android) { + return ''; + } + const relativePluginPath = (0, fs_1.convertToUnixPath)((0, path_1.relative)(settingsPath, p.rootPath)); + return ` +include ':${getGradlePackageName(p.id)}' +project(':${getGradlePackageName(p.id)}').projectDir = new File('${relativePluginPath}/${p.android.path}') +`; + }) + .join('')}`; + const applyArray = []; + const frameworksArray = []; + let prefsArray = []; + cordovaPlugins.map(p => { + const relativePluginPath = (0, fs_1.convertToUnixPath)((0, path_1.relative)(dependencyPath, p.rootPath)); + const frameworks = (0, plugin_1.getPlatformElement)(p, platform, 'framework'); + frameworks.map((framework) => { + if (framework.$.custom && + framework.$.custom === 'true' && + framework.$.type && + framework.$.type === 'gradleReference') { + applyArray.push(`apply from: "${relativePluginPath}/${framework.$.src}"`); + } + else if (!framework.$.type && !framework.$.custom) { + if (framework.$.src.startsWith('platform(')) { + frameworksArray.push(` implementation ${framework.$.src}`); + } + else { + frameworksArray.push(` implementation "${framework.$.src}"`); + } + } + }); + prefsArray = prefsArray.concat((0, plugin_1.getAllElements)(p, platform, 'preference')); + }); + let frameworkString = frameworksArray.join('\n'); + frameworkString = await replaceFrameworkVariables(config, prefsArray, frameworkString); + const dependencyLines = `// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} + +apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" +dependencies { +${capacitorPlugins + .map(p => { + return ` implementation project(':${getGradlePackageName(p.id)}')`; + }) + .join('\n')} +${frameworkString} +} +${applyArray.join('\n')} + +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} +`; + await (0, utils_fs_1.writeFile)((0, path_1.join)(settingsPath, 'capacitor.settings.gradle'), settingsLines); + await (0, utils_fs_1.writeFile)((0, path_1.join)(dependencyPath, 'capacitor.build.gradle'), dependencyLines); +} +exports.installGradlePlugins = installGradlePlugins; +async function handleCordovaPluginsGradle(config, cordovaPlugins) { + var _a, _b, _c; + const pluginsGradlePath = (0, path_1.join)(config.android.cordovaPluginsDirAbs, 'build.gradle'); + const kotlinNeeded = await kotlinNeededCheck(config, cordovaPlugins); + const kotlinVersionString = (_c = (_b = (_a = config.app.extConfig.cordova) === null || _a === void 0 ? void 0 : _a.preferences) === null || _b === void 0 ? void 0 : _b.GradlePluginKotlinVersion) !== null && _c !== void 0 ? _c : '1.8.20'; + const frameworksArray = []; + let prefsArray = []; + const applyArray = []; + applyArray.push(`apply from: "cordova.variables.gradle"`); + cordovaPlugins.map(p => { + const relativePluginPath = (0, fs_1.convertToUnixPath)((0, path_1.relative)(config.android.cordovaPluginsDirAbs, p.rootPath)); + const frameworks = (0, plugin_1.getPlatformElement)(p, platform, 'framework'); + frameworks.map((framework) => { + if (!framework.$.type && !framework.$.custom) { + frameworksArray.push(framework.$.src); + } + else if (framework.$.custom && + framework.$.custom === 'true' && + framework.$.type && + framework.$.type === 'gradleReference') { + applyArray.push(`apply from: "${relativePluginPath}/${framework.$.src}"`); + } + }); + prefsArray = prefsArray.concat((0, plugin_1.getAllElements)(p, platform, 'preference')); + }); + let frameworkString = frameworksArray + .map(f => { + if (f.startsWith('platform(')) { + return ` implementation ${f}`; + } + else { + return ` implementation "${f}"`; + } + }) + .join('\n'); + frameworkString = await replaceFrameworkVariables(config, prefsArray, frameworkString); + if (kotlinNeeded) { + frameworkString += `\n implementation "androidx.core:core-ktx:$androidxCoreKTXVersion"`; + frameworkString += `\n implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"`; + } + const applyString = applyArray.join('\n'); + let buildGradle = await (0, utils_fs_1.readFile)(pluginsGradlePath, { encoding: 'utf-8' }); + buildGradle = buildGradle.replace(/(SUB-PROJECT DEPENDENCIES START)[\s\S]*(\/\/ SUB-PROJECT DEPENDENCIES END)/, '$1\n' + frameworkString.concat('\n') + ' $2'); + buildGradle = buildGradle.replace(/(PLUGIN GRADLE EXTENSIONS START)[\s\S]*(\/\/ PLUGIN GRADLE EXTENSIONS END)/, '$1\n' + applyString.concat('\n') + '$2'); + if (kotlinNeeded) { + buildGradle = buildGradle.replace(/(buildscript\s{\n(\t|\s{4})repositories\s{\n((\t{2}|\s{8}).+\n)+(\t|\s{4})}\n(\t|\s{4})dependencies\s{\n(\t{2}|\s{8}).+)\n((\t|\s{4})}\n}\n)/, `$1\n classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"\n$8`); + buildGradle = buildGradle.replace(/(ext\s{)/, `$1\n androidxCoreKTXVersion = project.hasProperty('androidxCoreKTXVersion') ? rootProject.ext.androidxCoreKTXVersion : '1.8.0'`); + buildGradle = buildGradle.replace(/(buildscript\s{)/, `$1\n ext.kotlin_version = project.hasProperty('kotlin_version') ? rootProject.ext.kotlin_version : '${kotlinVersionString}'`); + buildGradle = buildGradle.replace(/(apply\splugin:\s'com\.android\.library')/, `$1\napply plugin: 'kotlin-android'`); + buildGradle = buildGradle.replace(/(compileOptions\s{\n((\t{2}|\s{8}).+\n)+(\t|\s{4})})\n(})/, `$1\n sourceSets {\n main.java.srcDirs += 'src/main/kotlin'\n }\n$5`); + } + await (0, utils_fs_1.writeFile)(pluginsGradlePath, buildGradle); + const cordovaVariables = `// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +ext { + cdvMinSdkVersion = project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : ${config.android.minVersion} + // Plugin gradle extensions can append to this to have code run at the end. + cdvPluginPostBuildExtras = [] + cordovaConfig = [:] +}`; + await (0, utils_fs_1.writeFile)((0, path_1.join)(config.android.cordovaPluginsDirAbs, 'cordova.variables.gradle'), cordovaVariables); +} +exports.handleCordovaPluginsGradle = handleCordovaPluginsGradle; +async function kotlinNeededCheck(config, cordovaPlugins) { + var _a, _b; + if (((_b = (_a = config.app.extConfig.cordova) === null || _a === void 0 ? void 0 : _a.preferences) === null || _b === void 0 ? void 0 : _b.GradlePluginKotlinEnabled) !== + 'true') { + for (const plugin of cordovaPlugins) { + const androidPlatform = (0, plugin_1.getPluginPlatform)(plugin, platform); + const sourceFiles = androidPlatform['source-file']; + if (sourceFiles) { + for (const srcFile of sourceFiles) { + if (/^.*\.kt$/.test(srcFile['$'].src)) { + return true; + } + } + } + } + return false; + } + else { + return true; + } +} +async function copyPluginsNativeFiles(config, cordovaPlugins) { + const pluginsPath = (0, path_1.join)(config.android.cordovaPluginsDirAbs, 'src', 'main'); + for (const p of cordovaPlugins) { + const androidPlatform = (0, plugin_1.getPluginPlatform)(p, platform); + if (androidPlatform) { + const sourceFiles = androidPlatform['source-file']; + if (sourceFiles) { + for (const sourceFile of sourceFiles) { + const fileName = sourceFile.$.src.split('/').pop(); + let baseFolder = 'java/'; + if (fileName.split('.').pop() === 'aidl') { + baseFolder = 'aidl/'; + } + const target = sourceFile.$['target-dir'] + .replace('app/src/main/', '') + .replace('src/', baseFolder); + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, sourceFile.$.src), (0, path_1.join)(pluginsPath, target, fileName)); + } + } + const resourceFiles = androidPlatform['resource-file']; + if (resourceFiles) { + for (const resourceFile of resourceFiles) { + const target = resourceFile.$['target']; + if (resourceFile.$.src.split('.').pop() === 'aar') { + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, resourceFile.$.src), (0, path_1.join)(pluginsPath, 'libs', target.split('/').pop())); + } + else if (target !== '.') { + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, resourceFile.$.src), (0, path_1.join)(pluginsPath, target)); + } + } + } + const libFiles = (0, plugin_1.getPlatformElement)(p, platform, 'lib-file'); + for (const libFile of libFiles) { + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, libFile.$.src), (0, path_1.join)(pluginsPath, 'libs', libFile.$.src.split('/').pop())); + } + } + } +} +async function removePluginsNativeFiles(config) { + await (0, utils_fs_1.remove)(config.android.cordovaPluginsDirAbs); + await (0, template_1.extractTemplate)(config.cli.assets.android.cordovaPluginsTemplateArchiveAbs, config.android.cordovaPluginsDirAbs); +} +async function getPluginsTask(config) { + return await (0, common_1.runTask)('Updating Android plugins', async () => { + const allPlugins = await (0, plugin_1.getPlugins)(config, 'android'); + const androidPlugins = await (0, common_2.getAndroidPlugins)(allPlugins); + return androidPlugins; + }); +} +async function getVariablesGradleFile(config) { + const variablesFile = (0, path_1.resolve)(config.android.platformDirAbs, 'variables.gradle'); + let variablesGradle = ''; + if (await (0, utils_fs_1.pathExists)(variablesFile)) { + variablesGradle = await (0, utils_fs_1.readFile)(variablesFile, { encoding: 'utf-8' }); + } + return variablesGradle; +} +async function replaceFrameworkVariables(config, prefsArray, frameworkString) { + const variablesGradle = await getVariablesGradleFile(config); + prefsArray.map((preference) => { + if (!variablesGradle.includes(preference.$.name)) { + frameworkString = frameworkString.replace(new RegExp(('$' + preference.$.name).replace('$', '\\$&'), 'g'), preference.$.default); + } + }); + return frameworkString; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/colors.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/colors.js new file mode 100644 index 00000000..8fe2c66c --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/colors.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ancillary = exports.failure = exports.success = exports.input = exports.weak = exports.strong = void 0; +const tslib_1 = require("tslib"); +const kleur_1 = tslib_1.__importDefault(require("kleur")); +exports.strong = kleur_1.default.bold; +exports.weak = kleur_1.default.dim; +exports.input = kleur_1.default.cyan; +exports.success = kleur_1.default.green; +exports.failure = kleur_1.default.red; +exports.ancillary = kleur_1.default.cyan; +const COLORS = { + strong: exports.strong, + weak: exports.weak, + input: exports.input, + success: exports.success, + failure: exports.failure, + ancillary: exports.ancillary, + log: { + DEBUG: kleur_1.default.magenta, + INFO: kleur_1.default.cyan, + WARN: kleur_1.default.yellow, + ERROR: kleur_1.default.red, + }, +}; +exports.default = COLORS; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/common.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/common.js new file mode 100644 index 00000000..9b7fa42d --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/common.js @@ -0,0 +1,398 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseApkNameFromFlavor = exports.checkJDKMajorVersion = exports.resolvePlatform = exports.checkPlatformVersions = exports.getAddedPlatforms = exports.getPlatformTargetName = exports.promptForPlatformTarget = exports.promptForPlatform = exports.isValidEnterprisePlatform = exports.getKnownEnterprisePlatforms = exports.isValidCommunityPlatform = exports.getKnownCommunityPlatforms = exports.isValidPlatform = exports.getKnownPlatforms = exports.selectPlatforms = exports.getProjectPlatformDirectory = exports.getCLIVersion = exports.getCoreVersion = exports.getCapacitorPackageVersion = exports.requireCapacitorPackage = exports.getCapacitorPackage = exports.runTask = exports.runPlatformHook = exports.wait = exports.checkAppName = exports.checkAppId = exports.checkAppDir = exports.checkAppConfig = exports.checkCapacitorPlatform = exports.checkPackage = exports.checkWebDir = exports.check = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const errors_1 = require("./errors"); +const log_1 = require("./log"); +const monorepotools_1 = require("./util/monorepotools"); +const node_1 = require("./util/node"); +const subprocess_1 = require("./util/subprocess"); +async function check(checks) { + const results = await Promise.all(checks.map(f => f())); + const errors = results.filter(r => r != null); + if (errors.length > 0) { + throw errors.join('\n'); + } +} +exports.check = check; +async function checkWebDir(config) { + var _a; + // We can skip checking the web dir if a server URL is set. + if ((_a = config.app.extConfig.server) === null || _a === void 0 ? void 0 : _a.url) { + return null; + } + const invalidFolders = ['', '.', '..', '../', './']; + if (invalidFolders.includes(config.app.webDir)) { + return `"${config.app.webDir}" is not a valid value for webDir`; + } + if (!(await (0, utils_fs_1.pathExists)(config.app.webDirAbs))) { + return (`Could not find the web assets directory: ${colors_1.default.strong((0, utils_terminal_1.prettyPath)(config.app.webDirAbs))}.\n` + + `Please create it and make sure it has an ${colors_1.default.strong('index.html')} file. You can change the path of this directory in ${colors_1.default.strong(config.app.extConfigName)} (${colors_1.default.input('webDir')} option). You may need to compile the web assets for your app (typically ${colors_1.default.input('npm run build')}). More info: ${colors_1.default.strong('https://capacitorjs.com/docs/basics/workflow#sync-your-project')}`); + } + if (!(await (0, utils_fs_1.pathExists)((0, path_1.join)(config.app.webDirAbs, 'index.html')))) { + return (`The web assets directory (${colors_1.default.strong((0, utils_terminal_1.prettyPath)(config.app.webDirAbs))}) must contain an ${colors_1.default.strong('index.html')} file.\n` + + `It will be the entry point for the web portion of the Capacitor app.`); + } + return null; +} +exports.checkWebDir = checkWebDir; +async function checkPackage() { + if (!(await (0, utils_fs_1.pathExists)('package.json'))) { + if (await (0, utils_fs_1.pathExists)('project.json')) { + return null; + } + else { + return (`The Capacitor CLI needs to run at the root of an npm package or in a valid NX monorepo.\n` + + `Make sure you have a package.json or project.json file in the directory where you run the Capacitor CLI.\n` + + `More info: ${colors_1.default.strong('https://docs.npmjs.com/cli/init')}`); + } + } + return null; +} +exports.checkPackage = checkPackage; +async function checkCapacitorPlatform(config, platform) { + const pkg = await getCapacitorPackage(config, platform); + if (!pkg) { + return (`Could not find the ${colors_1.default.input(platform)} platform.\n` + + `You must install it in your project first, e.g. w/ ${colors_1.default.input(`npm install @capacitor/${platform}`)}`); + } + return null; +} +exports.checkCapacitorPlatform = checkCapacitorPlatform; +async function checkAppConfig(config) { + if (!config.app.appId) { + return (`Missing ${colors_1.default.input('appId')} for new platform.\n` + + `Please add it in ${config.app.extConfigName} or run ${colors_1.default.input('npx cap init')}.`); + } + if (!config.app.appName) { + return (`Missing ${colors_1.default.input('appName')} for new platform.\n` + + `Please add it in ${config.app.extConfigName} or run ${colors_1.default.input('npx cap init')}.`); + } + const appIdError = await checkAppId(config, config.app.appId); + if (appIdError) { + return appIdError; + } + const appNameError = await checkAppName(config, config.app.appName); + if (appNameError) { + return appNameError; + } + return null; +} +exports.checkAppConfig = checkAppConfig; +async function checkAppDir(config, dir) { + if (!/^\S*$/.test(dir)) { + return `Your app directory should not contain spaces`; + } + return null; +} +exports.checkAppDir = checkAppDir; +async function checkAppId(config, id) { + if (!id) { + return `Invalid App ID. Must be in Java package form with no dashes (ex: com.example.app)`; + } + if (/^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$/.test(id.toLowerCase())) { + return null; + } + return `Invalid App ID "${id}". Must be in Java package form with no dashes (ex: com.example.app)`; +} +exports.checkAppId = checkAppId; +async function checkAppName(config, name) { + // We allow pretty much anything right now, have fun + if (!(name === null || name === void 0 ? void 0 : name.length)) { + return `Must provide an app name. For example: 'Spacebook'`; + } + return null; +} +exports.checkAppName = checkAppName; +async function wait(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} +exports.wait = wait; +async function runPlatformHook(config, platformName, platformDir, hook) { + var _a; + const { spawn } = await Promise.resolve().then(() => tslib_1.__importStar(require('child_process'))); + let pkg; + if ((0, monorepotools_1.isNXMonorepo)(platformDir)) { + pkg = await (0, utils_fs_1.readJSON)((0, path_1.join)((0, monorepotools_1.findNXMonorepoRoot)(platformDir), 'package.json')); + } + else { + pkg = await (0, utils_fs_1.readJSON)((0, path_1.join)(platformDir, 'package.json')); + } + const cmd = (_a = pkg.scripts) === null || _a === void 0 ? void 0 : _a[hook]; + if (!cmd) { + return; + } + return new Promise((resolve, reject) => { + const p = spawn(cmd, { + stdio: 'inherit', + shell: true, + cwd: platformDir, + env: { + INIT_CWD: platformDir, + CAPACITOR_ROOT_DIR: config.app.rootDir, + CAPACITOR_WEB_DIR: config.app.webDirAbs, + CAPACITOR_CONFIG: JSON.stringify(config.app.extConfig), + CAPACITOR_PLATFORM_NAME: platformName, + ...process.env, + }, + }); + p.on('close', () => { + resolve(); + }); + p.on('error', err => { + reject(err); + }); + }); +} +exports.runPlatformHook = runPlatformHook; +async function runTask(title, fn) { + const chain = log_1.output.createTaskChain(); + chain.next(title); + try { + const value = await fn(); + chain.end(); + return value; + } + catch (e) { + chain.fail(); + throw e; + } +} +exports.runTask = runTask; +async function getCapacitorPackage(config, name) { + const packagePath = (0, node_1.resolveNode)(config.app.rootDir, `@capacitor/${name}`, 'package.json'); + if (!packagePath) { + return null; + } + return (0, utils_fs_1.readJSON)(packagePath); +} +exports.getCapacitorPackage = getCapacitorPackage; +async function requireCapacitorPackage(config, name) { + const pkg = await getCapacitorPackage(config, name); + if (!pkg) { + (0, errors_1.fatal)(`Unable to find node_modules/@capacitor/${name}.\n` + + `Are you sure ${colors_1.default.strong(`@capacitor/${name}`)} is installed?`); + } + return pkg; +} +exports.requireCapacitorPackage = requireCapacitorPackage; +async function getCapacitorPackageVersion(config, platform) { + return (await requireCapacitorPackage(config, platform)).version; +} +exports.getCapacitorPackageVersion = getCapacitorPackageVersion; +async function getCoreVersion(config) { + return getCapacitorPackageVersion(config, 'core'); +} +exports.getCoreVersion = getCoreVersion; +async function getCLIVersion(config) { + return getCapacitorPackageVersion(config, 'cli'); +} +exports.getCLIVersion = getCLIVersion; +function getPlatformDirectory(config, platform) { + switch (platform) { + case 'android': + return config.android.platformDirAbs; + case 'ios': + return config.ios.platformDirAbs; + case 'web': + return config.web.platformDirAbs; + } + return null; +} +async function getProjectPlatformDirectory(config, platform) { + const platformPath = getPlatformDirectory(config, platform); + if (platformPath && (await (0, utils_fs_1.pathExists)(platformPath))) { + return platformPath; + } + return null; +} +exports.getProjectPlatformDirectory = getProjectPlatformDirectory; +async function selectPlatforms(config, selectedPlatformName) { + if (selectedPlatformName) { + // already passed in a platform name + const platformName = selectedPlatformName.toLowerCase().trim(); + if (!(await isValidPlatform(platformName))) { + (0, errors_1.fatal)(`Invalid platform: ${colors_1.default.input(platformName)}`); + } + else if (!(await getProjectPlatformDirectory(config, platformName))) { + if (platformName === 'web') { + (0, errors_1.fatal)(`Could not find the web platform directory.\n` + + `Make sure ${colors_1.default.strong(config.app.webDir)} exists.`); + } + (0, errors_1.fatal)(`${colors_1.default.strong(platformName)} platform has not been added yet.\n` + + `See the docs for adding the ${colors_1.default.strong(platformName)} platform: ${colors_1.default.strong(`https://capacitorjs.com/docs/${platformName}#adding-the-${platformName}-platform`)}`); + } + // return the platform in an string array + return [platformName]; + } + // wasn't given a platform name, so let's + // get the platforms that have already been created + return getAddedPlatforms(config); +} +exports.selectPlatforms = selectPlatforms; +async function getKnownPlatforms() { + return ['web', 'android', 'ios']; +} +exports.getKnownPlatforms = getKnownPlatforms; +async function isValidPlatform(platform) { + return (await getKnownPlatforms()).includes(platform); +} +exports.isValidPlatform = isValidPlatform; +async function getKnownCommunityPlatforms() { + return ['electron']; +} +exports.getKnownCommunityPlatforms = getKnownCommunityPlatforms; +async function isValidCommunityPlatform(platform) { + return (await getKnownCommunityPlatforms()).includes(platform); +} +exports.isValidCommunityPlatform = isValidCommunityPlatform; +async function getKnownEnterprisePlatforms() { + return ['windows']; +} +exports.getKnownEnterprisePlatforms = getKnownEnterprisePlatforms; +async function isValidEnterprisePlatform(platform) { + return (await getKnownEnterprisePlatforms()).includes(platform); +} +exports.isValidEnterprisePlatform = isValidEnterprisePlatform; +async function promptForPlatform(platforms, promptMessage, selectedPlatformName) { + const { prompt } = await Promise.resolve().then(() => tslib_1.__importStar(require('prompts'))); + if (!selectedPlatformName) { + const answers = await prompt([ + { + type: 'select', + name: 'mode', + message: promptMessage, + choices: platforms.map(p => ({ title: p, value: p })), + }, + ], { onCancel: () => process.exit(1) }); + return answers.mode.toLowerCase().trim(); + } + const platformName = selectedPlatformName.toLowerCase().trim(); + if (!(await isValidPlatform(platformName))) { + const knownPlatforms = await getKnownPlatforms(); + (0, errors_1.fatal)(`Invalid platform: ${colors_1.default.input(platformName)}.\n` + + `Valid platforms include: ${knownPlatforms.join(', ')}`); + } + return platformName; +} +exports.promptForPlatform = promptForPlatform; +async function promptForPlatformTarget(targets, selectedTarget) { + const { prompt } = await Promise.resolve().then(() => tslib_1.__importStar(require('prompts'))); + const validTargets = targets.filter(t => t.id !== undefined); + if (!selectedTarget) { + if (validTargets.length === 1) { + return validTargets[0]; + } + else { + const answers = await prompt([ + { + type: 'select', + name: 'target', + message: 'Please choose a target device:', + choices: validTargets.map(t => ({ + title: `${getPlatformTargetName(t)} (${t.id})`, + value: t, + })), + }, + ], { onCancel: () => process.exit(1) }); + return answers.target; + } + } + const targetID = selectedTarget.trim(); + const target = targets.find(t => t.id === targetID); + if (!target) { + (0, errors_1.fatal)(`Invalid target ID: ${colors_1.default.input(targetID)}.\n` + + `Valid targets are: ${targets.map(t => t.id).join(', ')}`); + } + return target; +} +exports.promptForPlatformTarget = promptForPlatformTarget; +function getPlatformTargetName(target) { + var _a, _b, _c; + return `${(_c = (_b = (_a = target.name) !== null && _a !== void 0 ? _a : target.model) !== null && _b !== void 0 ? _b : target.id) !== null && _c !== void 0 ? _c : '?'}${target.virtual + ? ` (${target.platform === 'ios' ? 'simulator' : 'emulator'})` + : ''}`; +} +exports.getPlatformTargetName = getPlatformTargetName; +async function getAddedPlatforms(config) { + const platforms = []; + if (await getProjectPlatformDirectory(config, config.android.name)) { + platforms.push(config.android.name); + } + if (await getProjectPlatformDirectory(config, config.ios.name)) { + platforms.push(config.ios.name); + } + platforms.push(config.web.name); + return platforms; +} +exports.getAddedPlatforms = getAddedPlatforms; +async function checkPlatformVersions(config, platform) { + const semver = await Promise.resolve().then(() => tslib_1.__importStar(require('semver'))); + const coreVersion = await getCoreVersion(config); + const platformVersion = await getCapacitorPackageVersion(config, platform); + if (semver.diff(coreVersion, platformVersion) === 'minor' || + semver.diff(coreVersion, platformVersion) === 'major') { + log_1.logger.warn(`${colors_1.default.strong('@capacitor/core')}${colors_1.default.weak(`@${coreVersion}`)} version doesn't match ${colors_1.default.strong(`@capacitor/${platform}`)}${colors_1.default.weak(`@${platformVersion}`)} version.\n` + + `Consider updating to a matching version, e.g. w/ ${colors_1.default.input(`npm install @capacitor/core@${platformVersion}`)}`); + } +} +exports.checkPlatformVersions = checkPlatformVersions; +function resolvePlatform(config, platform) { + if (platform[0] !== '@') { + const core = (0, node_1.resolveNode)(config.app.rootDir, `@capacitor/${platform}`, 'package.json'); + if (core) { + return (0, path_1.dirname)(core); + } + const community = (0, node_1.resolveNode)(config.app.rootDir, `@capacitor-community/${platform}`, 'package.json'); + if (community) { + return (0, path_1.dirname)(community); + } + const enterprise = (0, node_1.resolveNode)(config.app.rootDir, `@ionic-enterprise/capacitor-${platform}`, 'package.json'); + if (enterprise) { + return (0, path_1.dirname)(enterprise); + } + } + // third-party + const thirdParty = (0, node_1.resolveNode)(config.app.rootDir, platform, 'package.json'); + if (thirdParty) { + return (0, path_1.dirname)(thirdParty); + } + return null; +} +exports.resolvePlatform = resolvePlatform; +async function checkJDKMajorVersion() { + try { + const string = await (0, subprocess_1.runCommand)('java', ['--version']); + const versionRegex = RegExp(/([0-9]+)\.?([0-9]*)\.?([0-9]*)/); + const versionMatch = versionRegex.exec(string); + if (versionMatch === null) { + return -1; + } + const firstVersionNumber = parseInt(versionMatch[1]); + const secondVersionNumber = parseInt(versionMatch[2]); + if (typeof firstVersionNumber === 'number' && firstVersionNumber != 1) { + return firstVersionNumber; + } + else if (typeof secondVersionNumber === 'number' && + firstVersionNumber == 1 && + secondVersionNumber < 9) { + return secondVersionNumber; + } + else { + return -1; + } + } + catch (e) { + return -1; + } +} +exports.checkJDKMajorVersion = checkJDKMajorVersion; +function parseApkNameFromFlavor(flavor) { + const convertedName = flavor.replace(/([A-Z])/g, '$1').toLowerCase(); + return `app-${convertedName ? `${convertedName}-` : ''}debug.apk`; +} +exports.parseApkNameFromFlavor = parseApkNameFromFlavor; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/config.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/config.js new file mode 100644 index 00000000..1773a7e2 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/config.js @@ -0,0 +1,396 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.checkExternalConfig = exports.writeConfig = exports.loadConfig = exports.CONFIG_FILE_NAME_JSON = exports.CONFIG_FILE_NAME_JS = exports.CONFIG_FILE_NAME_TS = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const common_1 = require("./common"); +const errors_1 = require("./errors"); +const log_1 = require("./log"); +const fn_1 = require("./util/fn"); +const js_1 = require("./util/js"); +const monorepotools_1 = require("./util/monorepotools"); +const node_1 = require("./util/node"); +const promise_1 = require("./util/promise"); +const subprocess_1 = require("./util/subprocess"); +const debug = (0, debug_1.default)('capacitor:config'); +exports.CONFIG_FILE_NAME_TS = 'capacitor.config.ts'; +exports.CONFIG_FILE_NAME_JS = 'capacitor.config.js'; +exports.CONFIG_FILE_NAME_JSON = 'capacitor.config.json'; +async function loadConfig() { + var _a, _b, _c, _d; + const appRootDir = process.cwd(); + const cliRootDir = (0, path_1.dirname)(__dirname); + const conf = await loadExtConfig(appRootDir); + const depsForNx = await (async () => { + var _a, _b; + if ((0, monorepotools_1.isNXMonorepo)(appRootDir)) { + const rootOfNXMonorepo = (0, monorepotools_1.findNXMonorepoRoot)(appRootDir); + const pkgJSONOfMonorepoRoot = await (0, fn_1.tryFn)(utils_fs_1.readJSON, (0, path_1.resolve)(rootOfNXMonorepo, 'package.json')); + const devDependencies = (_a = pkgJSONOfMonorepoRoot === null || pkgJSONOfMonorepoRoot === void 0 ? void 0 : pkgJSONOfMonorepoRoot.devDependencies) !== null && _a !== void 0 ? _a : {}; + const dependencies = (_b = pkgJSONOfMonorepoRoot === null || pkgJSONOfMonorepoRoot === void 0 ? void 0 : pkgJSONOfMonorepoRoot.dependencies) !== null && _b !== void 0 ? _b : {}; + return { + devDependencies, + dependencies, + }; + } + return {}; + })(); + const appId = (_a = conf.extConfig.appId) !== null && _a !== void 0 ? _a : ''; + const appName = (_b = conf.extConfig.appName) !== null && _b !== void 0 ? _b : ''; + const webDir = (_c = conf.extConfig.webDir) !== null && _c !== void 0 ? _c : 'www'; + const cli = await loadCLIConfig(cliRootDir); + const config = { + android: await loadAndroidConfig(appRootDir, conf.extConfig, cli), + ios: await loadIOSConfig(appRootDir, conf.extConfig), + web: await loadWebConfig(appRootDir, webDir), + cli, + app: { + rootDir: appRootDir, + appId, + appName, + webDir, + webDirAbs: (0, path_1.resolve)(appRootDir, webDir), + package: (_d = (await (0, fn_1.tryFn)(utils_fs_1.readJSON, (0, path_1.resolve)(appRootDir, 'package.json')))) !== null && _d !== void 0 ? _d : { + name: appName, + version: '1.0.0', + ...depsForNx, + }, + ...conf, + }, + }; + debug('config: %O', config); + return config; +} +exports.loadConfig = loadConfig; +async function writeConfig(extConfig, extConfigFilePath) { + switch ((0, path_1.extname)(extConfigFilePath)) { + case '.json': { + await (0, utils_fs_1.writeJSON)(extConfigFilePath, extConfig, { spaces: 2 }); + break; + } + case '.ts': { + await (0, utils_fs_1.writeFile)(extConfigFilePath, formatConfigTS(extConfig)); + break; + } + } +} +exports.writeConfig = writeConfig; +async function loadExtConfigTS(rootDir, extConfigName, extConfigFilePath) { + var _a, _b; + try { + const tsPath = (0, node_1.resolveNode)(rootDir, 'typescript'); + if (!tsPath) { + (0, errors_1.fatal)('Could not find installation of TypeScript.\n' + + `To use ${colors_1.default.strong(extConfigName)} files, you must install TypeScript in your project, e.g. w/ ${colors_1.default.input('npm install -D typescript')}`); + } + const ts = require(tsPath); // eslint-disable-line @typescript-eslint/no-var-requires + const extConfigObject = (0, node_1.requireTS)(ts, extConfigFilePath); + const extConfig = (_a = extConfigObject.default) !== null && _a !== void 0 ? _a : extConfigObject; + return { + extConfigType: 'ts', + extConfigName, + extConfigFilePath: extConfigFilePath, + extConfig, + }; + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)(`Parsing ${colors_1.default.strong(extConfigName)} failed.\n\n${(_b = e.stack) !== null && _b !== void 0 ? _b : e}`); + } + throw e; + } +} +async function loadExtConfigJS(rootDir, extConfigName, extConfigFilePath) { + var _a; + try { + return { + extConfigType: 'js', + extConfigName, + extConfigFilePath: extConfigFilePath, + extConfig: require(extConfigFilePath), + }; + } + catch (e) { + (0, errors_1.fatal)(`Parsing ${colors_1.default.strong(extConfigName)} failed.\n\n${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); + } +} +async function loadExtConfig(rootDir) { + var _a; + const extConfigFilePathTS = (0, path_1.resolve)(rootDir, exports.CONFIG_FILE_NAME_TS); + if (await (0, utils_fs_1.pathExists)(extConfigFilePathTS)) { + return loadExtConfigTS(rootDir, exports.CONFIG_FILE_NAME_TS, extConfigFilePathTS); + } + const extConfigFilePathJS = (0, path_1.resolve)(rootDir, exports.CONFIG_FILE_NAME_JS); + if (await (0, utils_fs_1.pathExists)(extConfigFilePathJS)) { + return loadExtConfigJS(rootDir, exports.CONFIG_FILE_NAME_JS, extConfigFilePathJS); + } + const extConfigFilePath = (0, path_1.resolve)(rootDir, exports.CONFIG_FILE_NAME_JSON); + return { + extConfigType: 'json', + extConfigName: exports.CONFIG_FILE_NAME_JSON, + extConfigFilePath: extConfigFilePath, + extConfig: (_a = (await (0, fn_1.tryFn)(utils_fs_1.readJSON, extConfigFilePath))) !== null && _a !== void 0 ? _a : {}, + }; +} +async function loadCLIConfig(rootDir) { + const assetsDir = 'assets'; + const assetsDirAbs = (0, path_1.join)(rootDir, assetsDir); + const iosPlatformTemplateArchive = 'ios-template.tar.gz'; + const iosCordovaPluginsTemplateArchive = 'capacitor-cordova-ios-plugins.tar.gz'; + const androidPlatformTemplateArchive = 'android-template.tar.gz'; + const androidCordovaPluginsTemplateArchive = 'capacitor-cordova-android-plugins.tar.gz'; + return { + rootDir, + assetsDir, + assetsDirAbs, + assets: { + ios: { + platformTemplateArchive: iosPlatformTemplateArchive, + platformTemplateArchiveAbs: (0, path_1.resolve)(assetsDirAbs, iosPlatformTemplateArchive), + cordovaPluginsTemplateArchive: iosCordovaPluginsTemplateArchive, + cordovaPluginsTemplateArchiveAbs: (0, path_1.resolve)(assetsDirAbs, iosCordovaPluginsTemplateArchive), + }, + android: { + platformTemplateArchive: androidPlatformTemplateArchive, + platformTemplateArchiveAbs: (0, path_1.resolve)(assetsDirAbs, androidPlatformTemplateArchive), + cordovaPluginsTemplateArchive: androidCordovaPluginsTemplateArchive, + cordovaPluginsTemplateArchiveAbs: (0, path_1.resolve)(assetsDirAbs, androidCordovaPluginsTemplateArchive), + }, + }, + package: await (0, utils_fs_1.readJSON)((0, path_1.resolve)(rootDir, 'package.json')), + os: determineOS(process.platform), + }; +} +async function loadAndroidConfig(rootDir, extConfig, cliConfig) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s; + const name = 'android'; + const platformDir = (_b = (_a = extConfig.android) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : 'android'; + const platformDirAbs = (0, path_1.resolve)(rootDir, platformDir); + const appDir = 'app'; + const srcDir = `${appDir}/src`; + const srcMainDir = `${srcDir}/main`; + const assetsDir = `${srcMainDir}/assets`; + const webDir = `${assetsDir}/public`; + const resDir = `${srcMainDir}/res`; + let apkPath = `${appDir}/build/outputs/apk/`; + const flavor = ((_c = extConfig.android) === null || _c === void 0 ? void 0 : _c.flavor) || ''; + if ((_d = extConfig.android) === null || _d === void 0 ? void 0 : _d.flavor) { + apkPath = `${apkPath}/${(_e = extConfig.android) === null || _e === void 0 ? void 0 : _e.flavor}`; + } + const apkName = (0, common_1.parseApkNameFromFlavor)(flavor); + const buildOutputDir = `${apkPath}/debug`; + const cordovaPluginsDir = 'capacitor-cordova-android-plugins'; + const studioPath = (0, promise_1.lazy)(() => determineAndroidStudioPath(cliConfig.os)); + const buildOptions = { + keystorePath: (_g = (_f = extConfig.android) === null || _f === void 0 ? void 0 : _f.buildOptions) === null || _g === void 0 ? void 0 : _g.keystorePath, + keystorePassword: (_j = (_h = extConfig.android) === null || _h === void 0 ? void 0 : _h.buildOptions) === null || _j === void 0 ? void 0 : _j.keystorePassword, + keystoreAlias: (_l = (_k = extConfig.android) === null || _k === void 0 ? void 0 : _k.buildOptions) === null || _l === void 0 ? void 0 : _l.keystoreAlias, + keystoreAliasPassword: (_o = (_m = extConfig.android) === null || _m === void 0 ? void 0 : _m.buildOptions) === null || _o === void 0 ? void 0 : _o.keystoreAliasPassword, + signingType: (_q = (_p = extConfig.android) === null || _p === void 0 ? void 0 : _p.buildOptions) === null || _q === void 0 ? void 0 : _q.signingType, + releaseType: (_s = (_r = extConfig.android) === null || _r === void 0 ? void 0 : _r.buildOptions) === null || _s === void 0 ? void 0 : _s.releaseType, + }; + return { + name, + minVersion: '22', + studioPath, + platformDir, + platformDirAbs, + cordovaPluginsDir, + cordovaPluginsDirAbs: (0, path_1.resolve)(platformDirAbs, cordovaPluginsDir), + appDir, + appDirAbs: (0, path_1.resolve)(platformDirAbs, appDir), + srcDir, + srcDirAbs: (0, path_1.resolve)(platformDirAbs, srcDir), + srcMainDir, + srcMainDirAbs: (0, path_1.resolve)(platformDirAbs, srcMainDir), + assetsDir, + assetsDirAbs: (0, path_1.resolve)(platformDirAbs, assetsDir), + webDir, + webDirAbs: (0, path_1.resolve)(platformDirAbs, webDir), + resDir, + resDirAbs: (0, path_1.resolve)(platformDirAbs, resDir), + apkName, + buildOutputDir, + buildOutputDirAbs: (0, path_1.resolve)(platformDirAbs, buildOutputDir), + flavor, + buildOptions, + }; +} +async function loadIOSConfig(rootDir, extConfig) { + var _a, _b, _c, _d; + const name = 'ios'; + const platformDir = (_b = (_a = extConfig.ios) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : 'ios'; + const platformDirAbs = (0, path_1.resolve)(rootDir, platformDir); + const scheme = (_d = (_c = extConfig.ios) === null || _c === void 0 ? void 0 : _c.scheme) !== null && _d !== void 0 ? _d : 'App'; + const nativeProjectDir = 'App'; + const nativeProjectDirAbs = (0, path_1.resolve)(platformDirAbs, nativeProjectDir); + const nativeTargetDir = `${nativeProjectDir}/App`; + const nativeTargetDirAbs = (0, path_1.resolve)(platformDirAbs, nativeTargetDir); + const nativeXcodeProjDir = `${nativeProjectDir}/App.xcodeproj`; + const nativeXcodeProjDirAbs = (0, path_1.resolve)(platformDirAbs, nativeXcodeProjDir); + const nativeXcodeWorkspaceDirAbs = (0, promise_1.lazy)(() => determineXcodeWorkspaceDirAbs(nativeProjectDirAbs)); + const podPath = (0, promise_1.lazy)(() => determineGemfileOrCocoapodPath(rootDir, platformDirAbs, nativeProjectDirAbs)); + const webDirAbs = (0, promise_1.lazy)(() => determineIOSWebDirAbs(nativeProjectDirAbs, nativeTargetDirAbs, nativeXcodeProjDirAbs)); + const cordovaPluginsDir = 'capacitor-cordova-ios-plugins'; + return { + name, + minVersion: '13.0', + platformDir, + platformDirAbs, + scheme, + cordovaPluginsDir, + cordovaPluginsDirAbs: (0, path_1.resolve)(platformDirAbs, cordovaPluginsDir), + nativeProjectDir, + nativeProjectDirAbs, + nativeTargetDir, + nativeTargetDirAbs, + nativeXcodeProjDir, + nativeXcodeProjDirAbs, + nativeXcodeWorkspaceDir: (0, promise_1.lazy)(async () => (0, path_1.relative)(platformDirAbs, await nativeXcodeWorkspaceDirAbs)), + nativeXcodeWorkspaceDirAbs, + webDir: (0, promise_1.lazy)(async () => (0, path_1.relative)(platformDirAbs, await webDirAbs)), + webDirAbs, + podPath, + }; +} +async function loadWebConfig(rootDir, webDir) { + const platformDir = webDir; + const platformDirAbs = (0, path_1.resolve)(rootDir, platformDir); + return { + name: 'web', + platformDir, + platformDirAbs, + }; +} +function determineOS(os) { + switch (os) { + case 'darwin': + return "mac" /* OS.Mac */; + case 'win32': + return "windows" /* OS.Windows */; + case 'linux': + return "linux" /* OS.Linux */; + } + return "unknown" /* OS.Unknown */; +} +async function determineXcodeWorkspaceDirAbs(nativeProjectDirAbs) { + return (0, path_1.resolve)(nativeProjectDirAbs, 'App.xcworkspace'); +} +async function determineIOSWebDirAbs(nativeProjectDirAbs, nativeTargetDirAbs, nativeXcodeProjDirAbs) { + const re = /path\s=\spublic[\s\S]+?sourceTree\s=\s([^;]+)/; + const pbxprojPath = (0, path_1.resolve)(nativeXcodeProjDirAbs, 'project.pbxproj'); + try { + const pbxproj = await (0, utils_fs_1.readFile)(pbxprojPath, { encoding: 'utf8' }); + const m = pbxproj.match(re); + if (m && m[1] === 'SOURCE_ROOT') { + log_1.logger.warn(`Using the iOS project root for the ${colors_1.default.strong('public')} directory is deprecated.\n` + + `Please follow the Upgrade Guide to move ${colors_1.default.strong('public')} inside the iOS target directory: ${colors_1.default.strong('https://capacitorjs.com/docs/updating/3-0#move-public-into-the-ios-target-directory')}`); + return (0, path_1.resolve)(nativeProjectDirAbs, 'public'); + } + } + catch (e) { + // ignore + } + return (0, path_1.resolve)(nativeTargetDirAbs, 'public'); +} +async function determineAndroidStudioPath(os) { + if (process.env.CAPACITOR_ANDROID_STUDIO_PATH) { + return process.env.CAPACITOR_ANDROID_STUDIO_PATH; + } + switch (os) { + case "mac" /* OS.Mac */: + return '/Applications/Android Studio.app'; + case "windows" /* OS.Windows */: { + const { runCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./util/subprocess'))); + let p = 'C:\\Program Files\\Android\\Android Studio\\bin\\studio64.exe'; + try { + if (!(await (0, utils_fs_1.pathExists)(p))) { + let commandResult = await runCommand('REG', [ + 'QUERY', + 'HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio', + '/v', + 'Path', + ]); + commandResult = commandResult.replace(/(\r\n|\n|\r)/gm, ''); + const i = commandResult.indexOf('REG_SZ'); + if (i > 0) { + p = commandResult.substring(i + 6).trim() + '\\bin\\studio64.exe'; + } + } + } + catch (e) { + debug(`Error checking registry for Android Studio path: %O`, e); + break; + } + return p; + } + case "linux" /* OS.Linux */: + return '/usr/local/android-studio/bin/studio.sh'; + } + return ''; +} +async function determineGemfileOrCocoapodPath(rootDir, platformDir, nativeProjectDirAbs) { + if (process.env.CAPACITOR_COCOAPODS_PATH) { + return process.env.CAPACITOR_COCOAPODS_PATH; + } + let gemfilePath = ''; + if (await (0, utils_fs_1.pathExists)((0, path_1.resolve)(rootDir, 'Gemfile'))) { + gemfilePath = (0, path_1.resolve)(rootDir, 'Gemfile'); + } + else if (await (0, utils_fs_1.pathExists)((0, path_1.resolve)(platformDir, 'Gemfile'))) { + gemfilePath = (0, path_1.resolve)(platformDir, 'Gemfile'); + } + else if (await (0, utils_fs_1.pathExists)((0, path_1.resolve)(nativeProjectDirAbs, 'Gemfile'))) { + gemfilePath = (0, path_1.resolve)(nativeProjectDirAbs, 'Gemfile'); + } + const appSpecificGemfileExists = gemfilePath != ''; + // Multi-app projects might share a single global 'Gemfile' at the Git repository root directory. + if (!appSpecificGemfileExists) { + try { + const output = await (0, subprocess_1.getCommandOutput)('git', ['rev-parse', '--show-toplevel'], { cwd: rootDir }); + if (output != null) { + gemfilePath = (0, path_1.resolve)(output, 'Gemfile'); + } + } + catch (e) { + // Nothing + } + } + try { + const gemfileText = (await (0, utils_fs_1.readFile)(gemfilePath)).toString(); + if (!gemfileText) { + return 'pod'; + } + const cocoapodsInGemfile = new RegExp(/gem 'cocoapods'/).test(gemfileText); + if (cocoapodsInGemfile) { + return 'bundle exec pod'; + } + else { + return 'pod'; + } + } + catch { + return 'pod'; + } +} +function formatConfigTS(extConfig) { + // TODO: tags + return `import { CapacitorConfig } from '@capacitor/cli'; + +const config: CapacitorConfig = ${(0, js_1.formatJSObject)(extConfig)}; + +export default config;\n`; +} +function checkExternalConfig(config) { + if (typeof config.extConfig.bundledWebRuntime !== 'undefined') { + let actionMessage = `Can be safely deleted.`; + if (config.extConfig.bundledWebRuntime === true) { + actionMessage = `Please, use a bundler to bundle Capacitor and its plugins.`; + } + log_1.logger.warn(`The ${colors_1.default.strong('bundledWebRuntime')} configuration option has been deprecated. ${actionMessage}`); + } +} +exports.checkExternalConfig = checkExternalConfig; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/cordova.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/cordova.js new file mode 100644 index 00000000..229cd383 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/cordova.js @@ -0,0 +1,829 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.writeCordovaAndroidManifest = exports.getCordovaPreferences = exports.needsStaticPod = exports.getIncompatibleCordovaPlugins = exports.checkPluginDependencies = exports.logCordovaManualSteps = exports.getCordovaPlugins = exports.handleCordovaPluginsJS = exports.autoGenerateConfig = exports.removePluginFiles = exports.createEmptyCordovaJS = exports.copyCordovaJS = exports.copyPluginsJS = exports.generateCordovaPluginsJSFile = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const plist_1 = tslib_1.__importDefault(require("plist")); +const prompts_1 = tslib_1.__importDefault(require("prompts")); +const common_1 = require("./android/common"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const errors_1 = require("./errors"); +const common_2 = require("./ios/common"); +const log_1 = require("./log"); +const plugin_1 = require("./plugin"); +const node_1 = require("./util/node"); +const term_1 = require("./util/term"); +const xml_1 = require("./util/xml"); +/** + * Build the root cordova_plugins.js file referencing each Plugin JS file. + */ +function generateCordovaPluginsJSFile(config, plugins, platform) { + const pluginModules = []; + const pluginExports = []; + plugins.map(p => { + const pluginId = p.xml.$.id; + const jsModules = (0, plugin_1.getJSModules)(p, platform); + jsModules.map((jsModule) => { + const clobbers = []; + const merges = []; + let clobbersModule = ''; + let mergesModule = ''; + let runsModule = ''; + let clobberKey = ''; + let mergeKey = ''; + if (jsModule.clobbers) { + jsModule.clobbers.map((clobber) => { + clobbers.push(clobber.$.target); + clobberKey = clobber.$.target; + }); + clobbersModule = `, + "clobbers": [ + "${clobbers.join('",\n "')}" + ]`; + } + if (jsModule.merges) { + jsModule.merges.map((merge) => { + merges.push(merge.$.target); + mergeKey = merge.$.target; + }); + mergesModule = `, + "merges": [ + "${merges.join('",\n "')}" + ]`; + } + if (jsModule.runs) { + runsModule = ',\n "runs": true'; + } + const pluginModule = { + clobber: clobberKey, + merge: mergeKey, + // mimics Cordova's module name logic if the name attr is missing + pluginContent: `{ + "id": "${pluginId + + '.' + + (jsModule.$.name || jsModule.$.src.match(/([^/]+)\.js/)[1])}", + "file": "plugins/${pluginId}/${jsModule.$.src}", + "pluginId": "${pluginId}"${clobbersModule}${mergesModule}${runsModule} + }`, + }; + pluginModules.push(pluginModule); + }); + pluginExports.push(`"${pluginId}": "${p.xml.$.version}"`); + }); + return ` + cordova.define('cordova/plugin_list', function(require, exports, module) { + module.exports = [ + ${pluginModules + .sort((a, b) => a.clobber && b.clobber // Clobbers in alpha order + ? a.clobber.localeCompare(b.clobber) + : a.clobber || b.clobber // Clobbers before anything else + ? b.clobber.localeCompare(a.clobber) + : a.merge.localeCompare(b.merge)) + .map(e => e.pluginContent) + .join(',\n ')} + ]; + module.exports.metadata = + // TOP OF METADATA + { + ${pluginExports.join(',\n ')} + }; + // BOTTOM OF METADATA + }); + `; +} +exports.generateCordovaPluginsJSFile = generateCordovaPluginsJSFile; +/** + * Build the plugins/* files for each Cordova plugin installed. + */ +async function copyPluginsJS(config, cordovaPlugins, platform) { + const webDir = await getWebDir(config, platform); + const pluginsDir = (0, path_1.join)(webDir, 'plugins'); + const cordovaPluginsJSFile = (0, path_1.join)(webDir, 'cordova_plugins.js'); + await removePluginFiles(config, platform); + await Promise.all(cordovaPlugins.map(async (p) => { + const pluginId = p.xml.$.id; + const pluginDir = (0, path_1.join)(pluginsDir, pluginId, 'www'); + await (0, utils_fs_1.ensureDir)(pluginDir); + const jsModules = (0, plugin_1.getJSModules)(p, platform); + await Promise.all(jsModules.map(async (jsModule) => { + const filePath = (0, path_1.join)(webDir, 'plugins', pluginId, jsModule.$.src); + await (0, utils_fs_1.copy)((0, path_1.join)(p.rootPath, jsModule.$.src), filePath); + let data = await (0, utils_fs_1.readFile)(filePath, { encoding: 'utf-8' }); + data = data.trim(); + // mimics Cordova's module name logic if the name attr is missing + const name = pluginId + + '.' + + (jsModule.$.name || + (0, path_1.basename)(jsModule.$.src, (0, path_1.extname)(jsModule.$.src))); + data = `cordova.define("${name}", function(require, exports, module) { \n${data}\n});`; + data = data.replace(/)<[^<]*)*<\/script\s*>/gi, ''); + await (0, utils_fs_1.writeFile)(filePath, data, { encoding: 'utf-8' }); + })); + const assets = (0, plugin_1.getAssets)(p, platform); + await Promise.all(assets.map(async (asset) => { + const filePath = (0, path_1.join)(webDir, asset.$.target); + await (0, utils_fs_1.copy)((0, path_1.join)(p.rootPath, asset.$.src), filePath); + })); + })); + await (0, utils_fs_1.writeFile)(cordovaPluginsJSFile, generateCordovaPluginsJSFile(config, cordovaPlugins, platform)); +} +exports.copyPluginsJS = copyPluginsJS; +async function copyCordovaJS(config, platform) { + const cordovaPath = (0, node_1.resolveNode)(config.app.rootDir, '@capacitor/core', 'cordova.js'); + if (!cordovaPath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong('node_modules/@capacitor/core/cordova.js')}.\n` + `Are you sure ${colors_1.default.strong('@capacitor/core')} is installed?`); + } + return (0, utils_fs_1.copy)(cordovaPath, (0, path_1.join)(await getWebDir(config, platform), 'cordova.js')); +} +exports.copyCordovaJS = copyCordovaJS; +async function createEmptyCordovaJS(config, platform) { + const webDir = await getWebDir(config, platform); + await (0, utils_fs_1.writeFile)((0, path_1.join)(webDir, 'cordova.js'), ''); + await (0, utils_fs_1.writeFile)((0, path_1.join)(webDir, 'cordova_plugins.js'), ''); +} +exports.createEmptyCordovaJS = createEmptyCordovaJS; +async function removePluginFiles(config, platform) { + const webDir = await getWebDir(config, platform); + const pluginsDir = (0, path_1.join)(webDir, 'plugins'); + const cordovaPluginsJSFile = (0, path_1.join)(webDir, 'cordova_plugins.js'); + await (0, utils_fs_1.remove)(pluginsDir); + await (0, utils_fs_1.remove)(cordovaPluginsJSFile); +} +exports.removePluginFiles = removePluginFiles; +async function autoGenerateConfig(config, cordovaPlugins, platform) { + var _a, _b, _c, _d; + let xmlDir = (0, path_1.join)(config.android.resDirAbs, 'xml'); + const fileName = 'config.xml'; + if (platform === 'ios') { + xmlDir = config.ios.nativeTargetDirAbs; + } + await (0, utils_fs_1.ensureDir)(xmlDir); + const cordovaConfigXMLFile = (0, path_1.join)(xmlDir, fileName); + await (0, utils_fs_1.remove)(cordovaConfigXMLFile); + const pluginEntries = []; + cordovaPlugins.map(p => { + const currentPlatform = (0, plugin_1.getPluginPlatform)(p, platform); + if (currentPlatform) { + const configFiles = currentPlatform['config-file']; + if (configFiles) { + const configXMLEntries = configFiles.filter(function (item) { + var _a; + return (_a = item.$) === null || _a === void 0 ? void 0 : _a.target.includes(fileName); + }); + configXMLEntries.map((entry) => { + if (entry.feature) { + const feature = { feature: entry.feature }; + pluginEntries.push(feature); + } + }); + } + } + }); + let accessOriginString = []; + if ((_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.cordova) === null || _b === void 0 ? void 0 : _b.accessOrigins) { + accessOriginString = await Promise.all(config.app.extConfig.cordova.accessOrigins.map(async (host) => { + return ` + `; + })); + } + else { + accessOriginString.push(``); + } + const pluginEntriesString = await Promise.all(pluginEntries.map(async (item) => { + const xmlString = await (0, xml_1.writeXML)(item); + return xmlString; + })); + let pluginPreferencesString = []; + if ((_d = (_c = config.app.extConfig) === null || _c === void 0 ? void 0 : _c.cordova) === null || _d === void 0 ? void 0 : _d.preferences) { + pluginPreferencesString = await Promise.all(Object.entries(config.app.extConfig.cordova.preferences).map(async ([key, value]) => { + return ` + `; + })); + } + const content = ` + + ${accessOriginString.join('')} + ${pluginEntriesString.join('')} + ${pluginPreferencesString.join('')} +`; + await (0, utils_fs_1.writeFile)(cordovaConfigXMLFile, content); +} +exports.autoGenerateConfig = autoGenerateConfig; +async function getWebDir(config, platform) { + if (platform === 'ios') { + return config.ios.webDirAbs; + } + if (platform === 'android') { + return config.android.webDirAbs; + } + return ''; +} +async function handleCordovaPluginsJS(cordovaPlugins, config, platform) { + const webDir = await getWebDir(config, platform); + await (0, utils_fs_1.mkdirp)(webDir); + if (cordovaPlugins.length > 0) { + (0, plugin_1.printPlugins)(cordovaPlugins, platform, 'cordova'); + await copyCordovaJS(config, platform); + await copyPluginsJS(config, cordovaPlugins, platform); + } + else { + await removePluginFiles(config, platform); + await createEmptyCordovaJS(config, platform); + } + await autoGenerateConfig(config, cordovaPlugins, platform); +} +exports.handleCordovaPluginsJS = handleCordovaPluginsJS; +async function getCordovaPlugins(config, platform) { + const allPlugins = await (0, plugin_1.getPlugins)(config, platform); + let plugins = []; + if (platform === config.ios.name) { + plugins = await (0, common_2.getIOSPlugins)(allPlugins); + } + else if (platform === config.android.name) { + plugins = await (0, common_1.getAndroidPlugins)(allPlugins); + } + return plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); +} +exports.getCordovaPlugins = getCordovaPlugins; +async function logCordovaManualSteps(cordovaPlugins, config, platform) { + cordovaPlugins.map(p => { + const editConfig = (0, plugin_1.getPlatformElement)(p, platform, 'edit-config'); + const configFile = (0, plugin_1.getPlatformElement)(p, platform, 'config-file'); + editConfig.concat(configFile).map(async (configElement) => { + if (configElement.$ && !configElement.$.target.includes('config.xml')) { + if (platform === config.ios.name) { + if (configElement.$.target.includes('Info.plist')) { + logiOSPlist(configElement, config, p); + } + } + } + }); + }); +} +exports.logCordovaManualSteps = logCordovaManualSteps; +async function logiOSPlist(configElement, config, plugin) { + var _a, _b; + let plistPath = (0, path_1.resolve)(config.ios.nativeTargetDirAbs, 'Info.plist'); + if ((_a = config.app.extConfig.ios) === null || _a === void 0 ? void 0 : _a.scheme) { + plistPath = (0, path_1.resolve)(config.ios.nativeProjectDirAbs, `${(_b = config.app.extConfig.ios) === null || _b === void 0 ? void 0 : _b.scheme}-Info.plist`); + } + if (!(await (0, utils_fs_1.pathExists)(plistPath))) { + plistPath = (0, path_1.resolve)(config.ios.nativeTargetDirAbs, 'Base.lproj', 'Info.plist'); + } + if (await (0, utils_fs_1.pathExists)(plistPath)) { + const xmlMeta = await (0, xml_1.readXML)(plistPath); + const data = await (0, utils_fs_1.readFile)(plistPath, { encoding: 'utf-8' }); + const trimmedPlistData = data.replace(/(\t|\r|\n)/g, ''); + const plistData = plist_1.default.parse(data); + const dict = xmlMeta.plist.dict.pop(); + if (!dict.key.includes(configElement.$.parent)) { + let xml = buildConfigFileXml(configElement); + xml = `${configElement.$.parent}${getConfigFileTagContent(xml)}`; + log_1.logger.warn(`Configuration required for ${colors_1.default.strong(plugin.id)}.\n` + + `Add the following to Info.plist:\n` + + xml); + } + else if (configElement.array || configElement.dict) { + if (configElement.array && + configElement.array.length > 0 && + configElement.array[0].string) { + let xml = ''; + configElement.array[0].string.map((element) => { + const d = plistData[configElement.$.parent]; + if (Array.isArray(d) && !d.includes(element)) { + xml = xml.concat(`${element}\n`); + } + }); + if (xml.length > 0) { + log_1.logger.warn(`Configuration required for ${colors_1.default.strong(plugin.id)}.\n` + + `Add the following in the existing ${colors_1.default.strong(configElement.$.parent)} array of your Info.plist:\n` + + xml); + } + } + else { + let xml = buildConfigFileXml(configElement); + xml = `${configElement.$.parent}${getConfigFileTagContent(xml)}`; + xml = `${xml}`; + const parseXmlToSearchable = (childElementsObj, arrayToAddTo) => { + for (const childElement of childElementsObj) { + const childElementName = childElement['#name']; + const toAdd = { name: childElementName }; + if (childElementName === 'key' || childElementName === 'string') { + toAdd.value = childElement['_']; + } + else { + if (childElement['$']) { + toAdd.attrs = { ...childElement['$'] }; + } + if (childElement['$$']) { + toAdd.children = []; + parseXmlToSearchable(childElement['$$'], toAdd['children']); + } + } + arrayToAddTo.push(toAdd); + } + }; + const existingElements = (0, xml_1.parseXML)(trimmedPlistData, { + explicitChildren: true, + trim: true, + preserveChildrenOrder: true, + }); + const parsedExistingElements = []; + const rootKeyOfExistingElements = Object.keys(existingElements)[0]; + const rootOfExistingElementsToAdd = { name: rootKeyOfExistingElements, children: [] }; + if (existingElements[rootKeyOfExistingElements]['$']) { + rootOfExistingElementsToAdd.attrs = { + ...existingElements[rootKeyOfExistingElements]['$'], + }; + } + parseXmlToSearchable(existingElements[rootKeyOfExistingElements]['$$'], rootOfExistingElementsToAdd['children']); + parsedExistingElements.push(rootOfExistingElementsToAdd); + const requiredElements = (0, xml_1.parseXML)(xml, { + explicitChildren: true, + trim: true, + preserveChildrenOrder: true, + }); + const parsedRequiredElements = []; + const rootKeyOfRequiredElements = Object.keys(requiredElements)[0]; + const rootOfRequiredElementsToAdd = { name: rootKeyOfRequiredElements, children: [] }; + if (requiredElements[rootKeyOfRequiredElements]['$']) { + rootOfRequiredElementsToAdd.attrs = { + ...requiredElements[rootKeyOfRequiredElements]['$'], + }; + } + parseXmlToSearchable(requiredElements[rootKeyOfRequiredElements]['$$'], rootOfRequiredElementsToAdd['children']); + parsedRequiredElements.push(rootOfRequiredElementsToAdd); + const doesContainElements = (requiredElementsArray, existingElementsArray) => { + for (const requiredElement of requiredElementsArray) { + if (requiredElement.name === 'key' || + requiredElement.name === 'string') { + let foundMatch = false; + for (const existingElement of existingElementsArray) { + if (existingElement.name === requiredElement.name && + (existingElement.value === requiredElement.value || + /^[$].{1,}$/.test(requiredElement.value.trim()))) { + foundMatch = true; + break; + } + } + if (!foundMatch) { + return false; + } + } + else { + let foundMatch = false; + for (const existingElement of existingElementsArray) { + if (existingElement.name === requiredElement.name) { + if ((requiredElement.children !== undefined) === + (existingElement.children !== undefined)) { + if (doesContainElements(requiredElement.children, existingElement.children)) { + foundMatch = true; + break; + } + } + } + } + if (!foundMatch) { + return false; + } + } + } + return true; + }; + if (!doesContainElements(parsedRequiredElements, parsedExistingElements)) { + logPossibleMissingItem(configElement, plugin); + } + } + } + } + else { + logPossibleMissingItem(configElement, plugin); + } +} +function logPossibleMissingItem(configElement, plugin) { + let xml = buildConfigFileXml(configElement); + xml = getConfigFileTagContent(xml); + xml = removeOuterTags(xml); + log_1.logger.warn(`Configuration might be missing for ${colors_1.default.strong(plugin.id)}.\n` + + `Add the following to the existing ${colors_1.default.strong(configElement.$.parent)} entry of Info.plist:\n` + + xml); +} +function buildConfigFileXml(configElement) { + return (0, xml_1.buildXmlElement)(configElement, 'config-file'); +} +function getConfigFileTagContent(str) { + return str.replace(/|<\/config-file>/g, ''); +} +function removeOuterTags(str) { + const start = str.indexOf('>') + 1; + const end = str.lastIndexOf('<'); + return str.substring(start, end); +} +async function checkPluginDependencies(plugins, platform) { + const pluginDeps = new Map(); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + const incompatible = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 2 /* PluginType.Incompatible */); + await Promise.all(cordovaPlugins.map(async (p) => { + let allDependencies = []; + allDependencies = allDependencies.concat((0, plugin_1.getPlatformElement)(p, platform, 'dependency')); + if (p.xml['dependency']) { + allDependencies = allDependencies.concat(p.xml['dependency']); + } + allDependencies = allDependencies.filter((dep) => !getIncompatibleCordovaPlugins(platform).includes(dep.$.id) && + incompatible.filter(p => p.id === dep.$.id || p.xml.$.id === dep.$.id) + .length === 0); + if (allDependencies) { + await Promise.all(allDependencies.map(async (dep) => { + var _a; + let plugin = dep.$.id; + let version = dep.$.version; + if (plugin.includes('@') && plugin.indexOf('@') !== 0) { + [plugin, version] = plugin.split('@'); + } + if (cordovaPlugins.filter(p => p.id === plugin || p.xml.$.id === plugin).length === 0) { + if ((_a = dep.$.url) === null || _a === void 0 ? void 0 : _a.startsWith('http')) { + plugin = dep.$.url; + version = dep.$.commit; + } + const deps = pluginDeps.get(p.id) || []; + deps.push(`${plugin}${version ? colors_1.default.weak(` (${version})`) : ''}`); + pluginDeps.set(p.id, deps); + } + })); + } + })); + if (pluginDeps.size > 0) { + let msg = `${colors_1.default.failure(colors_1.default.strong('Plugins are missing dependencies.'))}\n` + + `Cordova plugin dependencies must be installed in your project (e.g. w/ ${colors_1.default.input('npm install')}).\n`; + for (const [plugin, deps] of pluginDeps.entries()) { + msg += + `\n ${colors_1.default.strong(plugin)} is missing dependencies:\n` + + deps.map(d => ` - ${d}`).join('\n'); + } + log_1.logger.warn(`${msg}\n`); + } +} +exports.checkPluginDependencies = checkPluginDependencies; +function getIncompatibleCordovaPlugins(platform) { + const pluginList = [ + 'cordova-plugin-splashscreen', + 'cordova-plugin-ionic-webview', + 'cordova-plugin-crosswalk-webview', + 'cordova-plugin-wkwebview-engine', + 'cordova-plugin-console', + 'cordova-plugin-music-controls', + 'cordova-plugin-add-swift-support', + 'cordova-plugin-ionic-keyboard', + 'cordova-plugin-braintree', + '@ionic-enterprise/filesystem', + '@ionic-enterprise/keyboard', + '@ionic-enterprise/splashscreen', + 'cordova-support-google-services', + ]; + if (platform === 'ios') { + pluginList.push('cordova-plugin-statusbar', '@ionic-enterprise/statusbar', 'SalesforceMobileSDK-CordovaPlugin'); + } + if (platform === 'android') { + pluginList.push('cordova-plugin-compat'); + } + return pluginList; +} +exports.getIncompatibleCordovaPlugins = getIncompatibleCordovaPlugins; +function needsStaticPod(plugin, config) { + var _a, _b, _c, _d; + let pluginList = [ + 'phonegap-plugin-push', + '@batch.com/cordova-plugin', + 'onesignal-cordova-plugin', + ]; + if ((_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.cordova) === null || _b === void 0 ? void 0 : _b.staticPlugins) { + pluginList = pluginList.concat((_d = (_c = config.app.extConfig) === null || _c === void 0 ? void 0 : _c.cordova) === null || _d === void 0 ? void 0 : _d.staticPlugins); + } + return pluginList.includes(plugin.id) || useFrameworks(plugin); +} +exports.needsStaticPod = needsStaticPod; +function useFrameworks(plugin) { + const podspecs = (0, plugin_1.getPlatformElement)(plugin, 'ios', 'podspec'); + const frameworkPods = podspecs.filter((podspec) => podspec.pods.filter((pods) => pods.$ && pods.$['use-frameworks'] === 'true').length > 0); + return frameworkPods.length > 0; +} +async function getCordovaPreferences(config) { + var _a, _b, _c, _d, _e; + const configXml = (0, path_1.join)(config.app.rootDir, 'config.xml'); + let cordova = {}; + if (await (0, utils_fs_1.pathExists)(configXml)) { + cordova.preferences = {}; + const xmlMeta = await (0, xml_1.readXML)(configXml); + if (xmlMeta.widget.preference) { + xmlMeta.widget.preference.map((pref) => { + cordova.preferences[pref.$.name] = pref.$.value; + }); + } + } + if (cordova.preferences && Object.keys(cordova.preferences).length > 0) { + if ((0, term_1.isInteractive)()) { + const answers = await (0, log_1.logPrompt)(`${colors_1.default.strong(`Cordova preferences can be automatically ported to ${colors_1.default.strong(config.app.extConfigName)}.`)}\n` + + `Keep in mind: Not all values can be automatically migrated from ${colors_1.default.strong('config.xml')}. There may be more work to do.\n` + + `More info: ${colors_1.default.strong('https://capacitorjs.com/docs/cordova/migrating-from-cordova-to-capacitor')}`, { + type: 'confirm', + name: 'confirm', + message: `Migrate Cordova preferences from config.xml?`, + initial: true, + }); + if (answers.confirm) { + if ((_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.cordova) === null || _b === void 0 ? void 0 : _b.preferences) { + const answers = await (0, prompts_1.default)([ + { + type: 'confirm', + name: 'confirm', + message: `${config.app.extConfigName} already contains Cordova preferences. Overwrite?`, + }, + ], { onCancel: () => process.exit(1) }); + if (!answers.confirm) { + cordova = (_c = config.app.extConfig) === null || _c === void 0 ? void 0 : _c.cordova; + } + } + } + else { + cordova = (_d = config.app.extConfig) === null || _d === void 0 ? void 0 : _d.cordova; + } + } + } + else { + cordova = (_e = config.app.extConfig) === null || _e === void 0 ? void 0 : _e.cordova; + } + return cordova; +} +exports.getCordovaPreferences = getCordovaPreferences; +async function writeCordovaAndroidManifest(cordovaPlugins, config, platform, cleartext) { + var _a; + const manifestPath = (0, path_1.join)(config.android.cordovaPluginsDirAbs, 'src', 'main', 'AndroidManifest.xml'); + const rootXMLEntries = []; + const applicationXMLEntries = []; + const applicationXMLAttributes = []; + let prefsArray = []; + cordovaPlugins.map(async (p) => { + const editConfig = (0, plugin_1.getPlatformElement)(p, platform, 'edit-config'); + const configFile = (0, plugin_1.getPlatformElement)(p, platform, 'config-file'); + prefsArray = prefsArray.concat((0, plugin_1.getAllElements)(p, platform, 'preference')); + editConfig.concat(configFile).map(async (configElement) => { + var _a, _b; + if (configElement.$ && + (((_a = configElement.$.target) === null || _a === void 0 ? void 0 : _a.includes('AndroidManifest.xml')) || + ((_b = configElement.$.file) === null || _b === void 0 ? void 0 : _b.includes('AndroidManifest.xml')))) { + const keys = Object.keys(configElement).filter(k => k !== '$'); + keys.map(k => { + configElement[k].map(async (e) => { + const xmlElement = (0, xml_1.buildXmlElement)(e, k); + const pathParts = getPathParts(configElement.$.parent || configElement.$.target); + if (pathParts.length > 1) { + if (pathParts.pop() === 'application') { + if (configElement.$.mode && + configElement.$.mode === 'merge' && + xmlElement.startsWith(' { + applicationXMLAttributes.push(`${ek}="${e.$[ek]}"`); + }); + } + else if (!applicationXMLEntries.includes(xmlElement) && + !contains(applicationXMLEntries, xmlElement, k)) { + applicationXMLEntries.push(xmlElement); + } + } + else { + const manifestPathOfCapApp = (0, path_1.join)(config.android.appDirAbs, 'src', 'main', 'AndroidManifest.xml'); + const manifestContentTrimmed = (await (0, utils_fs_1.readFile)(manifestPathOfCapApp)) + .toString() + .trim() + .replace(/\n|\t|\r/g, '') + .replace(/[\s]{1,}[\s]{1,}/g, '>') + .replace(/[\s]{2,}/g, ' '); + const requiredManifestContentTrimmed = xmlElement + .trim() + .replace(/\n|\t|\r/g, '') + .replace(/[\s]{1,}[\s]{1,}/g, '>') + .replace(/[\s]{2,}/g, ' '); + const pathPartList = getPathParts(configElement.$.parent || configElement.$.target); + const doesXmlManifestContainRequiredInfo = (requiredElements, existingElements, pathTarget) => { + const findElementsToSearchIn = (existingElements, pathTarget) => { + const parts = [...pathTarget]; + const elementsToSearchNextIn = []; + for (const existingElement of existingElements) { + if (existingElement.name === pathTarget[0]) { + if (existingElement.children) { + for (const el of existingElement.children) { + elementsToSearchNextIn.push(el); + } + } + else { + elementsToSearchNextIn.push(existingElement); + } + } + } + if (elementsToSearchNextIn.length === 0) { + return []; + } + else { + parts.splice(0, 1); + if (parts.length <= 0) { + return elementsToSearchNextIn; + } + else { + return findElementsToSearchIn(elementsToSearchNextIn, parts); + } + } + }; + const parseXmlToSearchable = (childElementsObj, arrayToAddTo) => { + for (const childElementKey of Object.keys(childElementsObj)) { + for (const occurannceOfElement of childElementsObj[childElementKey]) { + const toAdd = { name: childElementKey }; + if (occurannceOfElement['$']) { + toAdd.attrs = { ...occurannceOfElement['$'] }; + } + if (occurannceOfElement['$$']) { + toAdd.children = []; + parseXmlToSearchable(occurannceOfElement['$$'], toAdd['children']); + } + arrayToAddTo.push(toAdd); + } + } + }; + const doesElementMatch = (requiredElement, existingElement) => { + var _a; + if (requiredElement.name !== existingElement.name) { + return false; + } + if ((requiredElement.attrs !== undefined) !== + (existingElement.attrs !== undefined)) { + return false; + } + else { + if (requiredElement.attrs !== undefined) { + const requiredELementAttrKeys = Object.keys(requiredElement.attrs); + for (const key of requiredELementAttrKeys) { + if (!/^[$].{1,}$/.test(requiredElement.attrs[key].trim())) { + if (requiredElement.attrs[key] !== + existingElement.attrs[key]) { + return false; + } + } + } + } + } + if ((requiredElement.children !== undefined) !== + (existingElement.children !== undefined) && + ((_a = requiredElement.children) === null || _a === void 0 ? void 0 : _a.length) !== 0) { + return false; + } + else { + if (requiredElement.children !== undefined) { + // each req element is in existing element + for (const requiredElementItem of requiredElement.children) { + let foundRequiredElement = false; + for (const existingElementItem of existingElement.children) { + const foundRequiredElementIn = doesElementMatch(requiredElementItem, existingElementItem); + if (foundRequiredElementIn) { + foundRequiredElement = true; + break; + } + } + if (!foundRequiredElement) { + return false; + } + } + } + else { + if (requiredElement.children === undefined && + existingElement.children === undefined) { + return true; + } + else { + let foundRequiredElement = false; + for (const existingElementItem of existingElement.children) { + const foundRequiredElementIn = doesElementMatch(requiredElement, existingElementItem); + if (foundRequiredElementIn) { + foundRequiredElement = true; + break; + } + } + if (!foundRequiredElement) { + return false; + } + } + } + } + return true; + }; + const parsedExistingElements = []; + const rootKeyOfExistingElements = Object.keys(existingElements)[0]; + const rootOfExistingElementsToAdd = { name: rootKeyOfExistingElements, children: [] }; + if (existingElements[rootKeyOfExistingElements]['$']) { + rootOfExistingElementsToAdd.attrs = { + ...existingElements[rootKeyOfExistingElements]['$'], + }; + } + parseXmlToSearchable(existingElements[rootKeyOfExistingElements]['$$'], rootOfExistingElementsToAdd['children']); + parsedExistingElements.push(rootOfExistingElementsToAdd); + const parsedRequiredElements = []; + const rootKeyOfRequiredElements = Object.keys(requiredElements)[0]; + const rootOfRequiredElementsToAdd = { name: rootKeyOfRequiredElements, children: [] }; + if (requiredElements[rootKeyOfRequiredElements]['$']) { + rootOfRequiredElementsToAdd.attrs = { + ...requiredElements[rootKeyOfRequiredElements]['$'], + }; + } + if (requiredElements[rootKeyOfRequiredElements]['$$'] !== + undefined) { + parseXmlToSearchable(requiredElements[rootKeyOfRequiredElements]['$$'], rootOfRequiredElementsToAdd['children']); + } + parsedRequiredElements.push(rootOfRequiredElementsToAdd); + const elementsToSearch = findElementsToSearchIn(parsedExistingElements, pathTarget); + for (const requiredElement of parsedRequiredElements) { + let foundMatch = false; + for (const existingElement of elementsToSearch) { + const doesContain = doesElementMatch(requiredElement, existingElement); + if (doesContain) { + foundMatch = true; + break; + } + } + if (!foundMatch) { + return false; + } + } + return true; + }; + if (!doesXmlManifestContainRequiredInfo((0, xml_1.parseXML)(requiredManifestContentTrimmed, { + explicitChildren: true, + trim: true, + }), (0, xml_1.parseXML)(manifestContentTrimmed, { + explicitChildren: true, + trim: true, + }), pathPartList)) { + log_1.logger.warn(`Android Configuration required for ${colors_1.default.strong(p.id)}.\n` + + `Add the following to AndroidManifest.xml:\n` + + xmlElement); + } + } + } + else { + if (!rootXMLEntries.includes(xmlElement) && + !contains(rootXMLEntries, xmlElement, k)) { + rootXMLEntries.push(xmlElement); + } + } + }); + }); + } + }); + }); + const cleartextString = 'android:usesCleartextTraffic="true"'; + const cleartextValue = (cleartext || ((_a = config.app.extConfig.server) === null || _a === void 0 ? void 0 : _a.cleartext)) && + !applicationXMLAttributes.includes(cleartextString) + ? cleartextString + : ''; + let content = ` + + +${applicationXMLEntries.join('\n')} + +${rootXMLEntries.join('\n')} +`; + content = content.replace(new RegExp('$PACKAGE_NAME'.replace('$', '\\$&'), 'g'), '${applicationId}'); + for (const preference of prefsArray) { + content = content.replace(new RegExp(('$' + preference.$.name).replace('$', '\\$&'), 'g'), preference.$.default); + } + if (await (0, utils_fs_1.pathExists)(manifestPath)) { + await (0, utils_fs_1.writeFile)(manifestPath, content); + } +} +exports.writeCordovaAndroidManifest = writeCordovaAndroidManifest; +function getPathParts(path) { + const rootPath = 'manifest'; + path = path.replace('/*', rootPath); + const parts = path.split('/').filter(part => part !== ''); + if (parts.length > 1 || parts.includes(rootPath)) { + return parts; + } + return [rootPath, path]; +} +function contains(entries, obj, k) { + const element = (0, xml_1.parseXML)(obj); + for (const entry of entries) { + const current = (0, xml_1.parseXML)(entry); + if (element && + current && + current[k] && + element[k] && + current[k].$ && + element[k].$ && + element[k].$['android:name'] === current[k].$['android:name']) { + return true; + } + } + return false; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/declarations.d.ts b/@capacitor/assets/node_modules/@capacitor/cli/dist/declarations.d.ts new file mode 100644 index 00000000..22c82e2a --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/declarations.d.ts @@ -0,0 +1,605 @@ +export interface CapacitorConfig { + /** + * The unique identifier of your packaged app. + * + * This is also known as the Bundle ID in iOS and the Application ID in + * Android. It must be in reverse domain name notation, generally + * representing a domain name that you or your company owns. + * + * @since 1.0.0 + */ + appId?: string; + /** + * The human-friendly name of your app. + * + * This should be what you'd see in the App Store, but can be changed after + * within each native platform after it is generated. + * + * @since 1.0.0 + */ + appName?: string; + /** + * The directory of your compiled web assets. + * + * This directory should contain the final `index.html` of your app. + * + * @since 1.0.0 + */ + webDir?: string; + /** + * Whether to copy the Capacitor runtime bundle or not. + * + * If your app is not using a bundler, set this to `true`, then Capacitor + * will create a `capacitor.js` file that you'll need to add as a script in + * your `index.html` file. + * + * It's deprecated and will be removed in Capacitor 6 + * + * @since 1.0.0 + * @deprecated 5.0.0 + * @default false + */ + bundledWebRuntime?: boolean; + /** + * The build configuration (as defined by the native app) under which Capacitor + * will send statements to the log system. This applies to log statements in + * native code as well as statements redirected from JavaScript (`console.debug`, + * `console.error`, etc.). Enabling logging will let statements render in the + * Xcode and Android Studio windows but can leak information on device if enabled + * in released builds. + * + * 'none' = logs are never produced + * 'debug' = logs are produced in debug builds but not production builds + * 'production' = logs are always produced + * + * @since 3.0.0 + * @default debug + */ + loggingBehavior?: 'none' | 'debug' | 'production'; + /** + * User agent of Capacitor Web View. + * + * @since 1.4.0 + */ + overrideUserAgent?: string; + /** + * String to append to the original user agent of Capacitor Web View. + * + * This is disregarded if `overrideUserAgent` is used. + * + * @since 1.4.0 + */ + appendUserAgent?: string; + /** + * Background color of the Capacitor Web View. + * + * @since 1.1.0 + */ + backgroundColor?: string; + android?: { + /** + * Specify a custom path to the native Android project. + * + * @since 3.0.0 + * @default android + */ + path?: string; + /** + * User agent of Capacitor Web View on Android. + * + * Overrides global `overrideUserAgent` option. + * + * @since 1.4.0 + */ + overrideUserAgent?: string; + /** + * String to append to the original user agent of Capacitor Web View for Android. + * + * Overrides global `appendUserAgent` option. + * + * This is disregarded if `overrideUserAgent` is used. + * + * @since 1.4.0 + */ + appendUserAgent?: string; + /** + * Background color of the Capacitor Web View for Android. + * + * Overrides global `backgroundColor` option. + * + * @since 1.1.0 + */ + backgroundColor?: string; + /** + * Enable mixed content in the Capacitor Web View for Android. + * + * [Mixed + * content](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content) + * is disabled by default for security. During development, you may need to + * enable it to allow the Web View to load files from different schemes. + * + * **This is not intended for use in production.** + * + * @since 1.0.0 + * @default false + */ + allowMixedContent?: boolean; + /** + * This enables a simpler keyboard which may have some limitations. + * + * This will capture JS keys using an alternative + * [`InputConnection`](https://developer.android.com/reference/android/view/inputmethod/InputConnection). + * + * @since 1.0.0 + * @default false + */ + captureInput?: boolean; + /** + * Always enable debuggable web content. + * + * This is automatically enabled during development. + * + * @since 1.0.0 + * @default false + */ + webContentsDebuggingEnabled?: boolean; + /** + * The build configuration under which Capacitor will generate logs on Android. + * + * Overrides global `loggingBehavior` option. + * + * @since 3.0.0 + * @default debug + */ + loggingBehavior?: 'none' | 'debug' | 'production'; + /** + * Allowlist of plugins to include during `npx cap sync` for Android. + * + * Overrides global `includePlugins` option. + * + * @since 3.0.0 + */ + includePlugins?: string[]; + /** + * Android flavor to use. + * + * If the app has flavors declared in the `build.gradle` + * configure the flavor you want to run with `npx cap run` command. + * + * @since 3.1.0 + */ + flavor?: string; + /** + * Whether to give the webview initial focus. + * + * @since 3.5.1 + * @default true + */ + initialFocus?: boolean; + /** + * The minimum supported webview version on Android supported by your app. + * + * The minimum supported cannot be lower than version `55`, which is required for Capacitor. + * + * If the device uses a lower WebView version, an error message will be shown on Logcat. + * If `server.errorPath` is configured, the WebView will redirect to that file, so can be + * used to show a custom error. + * + * @since 4.0.0 + * @default 60 + */ + minWebViewVersion?: number; + /** + * The minimum supported Huawei webview version on Android supported by your app. + * + * The minimum supported cannot be lower than version `10`, which is required for Capacitor. + * + * If the device uses a lower WebView version, an error message will be shown on Logcat. + * If `server.errorPath` is configured, the WebView will redirect to that file, so can be + * used to show a custom error. + * + * @since 4.6.4 + * @default 10 + */ + minHuaweiWebViewVersion?: number; + buildOptions?: { + /** + * Path to your keystore + * + * @since 4.4.0 + */ + keystorePath?: string; + /** + * Password to your keystore + * + * @since 4.4.0 + */ + keystorePassword?: string; + /** + * Alias in the keystore to use + * + * @since 4.4.0 + */ + keystoreAlias?: string; + /** + * Password for the alias in the keystore to use + * + * @since 4.4.0 + */ + keystoreAliasPassword?: string; + /** + * Bundle type for your release build + * + * @since 4.4.0 + * @default "AAB" + */ + releaseType?: 'AAB' | 'APK'; + /** + * Program to sign your build with + * + * @since 5.1.0 + * @default "jarsigner" + */ + signingType?: 'apksigner' | 'jarsigner'; + }; + /** + * Use legacy [addJavascriptInterface](https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String)) + * instead of the new and more secure [addWebMessageListener](https://developer.android.com/reference/androidx/webkit/WebViewCompat#addWebMessageListener(android.webkit.WebView,java.lang.String,java.util.Set%3Cjava.lang.String%3E,androidx.webkit.WebViewCompat.WebMessageListener)) + * + * @since 4.5.0 + * @default false + */ + useLegacyBridge?: boolean; + }; + ios?: { + /** + * Specify a custom path to the native iOS project. + * + * @since 3.0.0 + * @default ios + */ + path?: string; + /** + * iOS build scheme to use. + * + * Usually this matches your app's target in Xcode. You can use the + * following command to list schemes: + * + * ```shell + * xcodebuild -workspace ios/App/App.xcworkspace -list + * ``` + * + * @since 3.0.0 + * @default App + */ + scheme?: string; + /** + * User agent of Capacitor Web View on iOS. + * + * Overrides global `overrideUserAgent` option. + * + * @since 1.4.0 + */ + overrideUserAgent?: string; + /** + * String to append to the original user agent of Capacitor Web View for iOS. + * + * Overrides global `appendUserAgent` option. + * + * This is disregarded if `overrideUserAgent` is used. + * + * @since 1.4.0 + */ + appendUserAgent?: string; + /** + * Background color of the Capacitor Web View for iOS. + * + * Overrides global `backgroundColor` option. + * + * @since 1.1.0 + */ + backgroundColor?: string; + /** + * Configure the scroll view's content inset adjustment behavior. + * + * This will set the + * [`contentInsetAdjustmentBehavior`](https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior) + * property on the Web View's + * [`UIScrollView`](https://developer.apple.com/documentation/uikit/uiscrollview). + * + * @since 2.0.0 + * @default never + */ + contentInset?: 'automatic' | 'scrollableAxes' | 'never' | 'always'; + /** + * Configure whether the scroll view is scrollable. + * + * This will set the + * [`isScrollEnabled`](https://developer.apple.com/documentation/uikit/uiscrollview/1619395-isscrollenabled) + * property on the Web View's + * [`UIScrollView`](https://developer.apple.com/documentation/uikit/uiscrollview). + * + * @since 1.0.0 + */ + scrollEnabled?: boolean; + /** + * Configure custom linker flags for compiling Cordova plugins. + * + * @since 1.0.0 + * @default [] + */ + cordovaLinkerFlags?: string[]; + /** + * Allow destination previews when pressing on links. + * + * This will set the + * [`allowsLinkPreview`](https://developer.apple.com/documentation/webkit/wkwebview/1415000-allowslinkpreview) + * property on the Web View, instead of using the default value. + * + * @since 2.0.0 + */ + allowsLinkPreview?: boolean; + /** + * The build configuration under which Capacitor will generate logs on iOS. + * + * Overrides global `loggingBehavior` option. + * + * @since 3.0.0 + * @default debug + */ + loggingBehavior?: 'none' | 'debug' | 'production'; + /** + * Allowlist of plugins to include during `npx cap sync` for iOS. + * + * Overrides global `includePlugins` option. + * + * @since 3.0.0 + */ + includePlugins?: string[]; + /** + * Sets WKWebView configuration for limitsNavigationsToAppBoundDomains. + * + * If the Info.plist file includes `WKAppBoundDomains` key, it's recommended to + * set this option to true, otherwise some features won't work. + * But as side effect, it blocks navigation outside the domains in the + * `WKAppBoundDomains` list. + * `localhost` (or the value configured as `server.hostname`) also needs to be + * added to the `WKAppBoundDomains` list. + * + * @since 3.1.0 + * @default false + */ + limitsNavigationsToAppBoundDomains?: boolean; + /** + * The content mode for the web view to use when it loads and renders web content. + * + * - 'recommended': The content mode that is appropriate for the current device. + * - 'desktop': The content mode that represents a desktop experience. + * - 'mobile': The content mode that represents a mobile experience. + * + * @since 4.0.0 + * @default recommended + */ + preferredContentMode?: 'recommended' | 'desktop' | 'mobile'; + /** + * Configure if Capacitor will handle local/push notifications. + * Set to false if you want to use your own UNUserNotificationCenter to handle notifications. + * + * @since 4.5.0 + * @default true + */ + handleApplicationNotifications?: boolean; + /** + * Using Xcode 14.3, on iOS 16.4 and greater, enable debuggable web content for release builds. + * + * If not set, it's `true` for development builds. + * + * @since 4.8.0 + * @default false + */ + webContentsDebuggingEnabled?: boolean; + }; + server?: { + /** + * Configure the local hostname of the device. + * + * It is recommended to keep this as `localhost` as it allows the use of + * Web APIs that would otherwise require a [secure + * context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) + * such as + * [`navigator.geolocation`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/geolocation) + * and + * [`MediaDevices.getUserMedia`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia). + * + * @since 1.0.0 + * @default localhost + */ + hostname?: string; + /** + * Configure the local scheme on iOS. + * + * [Can't be set to schemes that the WKWebView already handles, such as http or https](https://developer.apple.com/documentation/webkit/wkwebviewconfiguration/2875766-seturlschemehandler) + * This can be useful when migrating from + * [`cordova-plugin-ionic-webview`](https://github.com/ionic-team/cordova-plugin-ionic-webview), + * where the default scheme on iOS is `ionic`. + * + * @since 1.2.0 + * @default capacitor + */ + iosScheme?: string; + /** + * Configure the local scheme on Android. + * + * Custom schemes on Android are unable to change the URL path as of Webview 117. Changing this value from anything other than `http` or `https` can result in your + * application unable to resolve routing. If you must change this for some reason, consider using a hash-based url strategy, but there are no guarentees that this + * will continue to work long term as allowing non-standard schemes to modify query parameters and url fragments is only allowed for compatibility reasons. + * https://ionic.io/blog/capacitor-android-customscheme-issue-with-chrome-117 + * + * @since 1.2.0 + * @default http + */ + androidScheme?: string; + /** + * Load an external URL in the Web View. + * + * This is intended for use with live-reload servers. + * + * **This is not intended for use in production.** + * + * @since 1.0.0 + */ + url?: string; + /** + * Allow cleartext traffic in the Web View. + * + * On Android, all cleartext traffic is disabled by default as of API 28. + * + * This is intended for use with live-reload servers where unencrypted HTTP + * traffic is often used. + * + * **This is not intended for use in production.** + * + * @since 1.5.0 + * @default false + */ + cleartext?: boolean; + /** + * Set additional URLs the Web View can navigate to. + * + * By default, all external URLs are opened in the external browser (not + * the Web View). + * + * **This is not intended for use in production.** + * + * @since 1.0.0 + * @default [] + */ + allowNavigation?: string[]; + /** + * Specify path to a local html page to display in case of errors. + * On Android the html file won't have access to Capacitor plugins. + * + * @since 4.0.0 + * @default null + */ + errorPath?: string; + }; + cordova?: { + /** + * Populates tags in the config.xml with the origin set to + * the values entered here. + * If not provided, a single tag gets included. + * It only has effect on a few Cordova plugins that respect the whitelist. + * + * @since 3.3.0 + */ + accessOrigins?: string[]; + /** + * Configure Cordova preferences. + * + * @since 1.3.0 + */ + preferences?: { + [key: string]: string | undefined; + }; + /** + * List of Cordova plugins that need to be static but are not + * already in the static plugin list. + * + * @since 3.3.0 + */ + staticPlugins?: string[]; + }; + /** + * Configure plugins. + * + * This is an object with configuration values specified by plugin class + * name. + * + * @since 1.0.0 + */ + plugins?: PluginsConfig; + /** + * Allowlist of plugins to include during `npx cap sync`. + * + * This should be an array of strings representing the npm package name of + * plugins to include when running `npx cap sync`. If unset, Capacitor will + * inspect `package.json` for a list of potential plugins. + * + * @since 3.0.0 + */ + includePlugins?: string[]; +} +export interface FederatedApp { + name: string; + webDir: string; + liveUpdateConfig?: LiveUpdateConfig; +} +export interface LiveUpdateConfig { + appId: string; + channel: string; + autoUpdateMethod: AutoUpdateMethod; + maxVersions?: number; + key?: string; +} +export type AutoUpdateMethod = 'none' | 'background'; +export interface PluginsConfig { + /** + * Plugin configuration by class name. + * + * @since 1.0.0 + */ + [key: string]: { + [key: string]: any; + } | undefined; + /** + * FederatedCapacitor plugin configuration + * + * @since 5.0.0 + */ + FederatedCapacitor?: { + shell: Omit; + apps: FederatedApp[]; + liveUpdatesKey?: string; + }; + /** + * Capacitor Live Updates plugin configuration + * + * @since 4.2.0 + */ + LiveUpdates?: LiveUpdateConfig; + /** + * Capacitor Cookies plugin configuration + * + * @since 4.3.0 + */ + CapacitorCookies?: { + /** + * Enable CapacitorCookies to override the global `document.cookie` on native. + * + * @default false + */ + enabled?: boolean; + /** + * Enable `httpOnly` and other insecure cookies to be read and accessed on Android. + * + * Note: This can potentially be a security risk and is only intended to be used + * when your application uses a custom scheme on Android. + * + */ + androidCustomSchemeAllowInsecureAccess?: boolean; + }; + /** + * Capacitor Http plugin configuration + * + * @since 4.3.0 + */ + CapacitorHttp?: { + /** + * Enable CapacitorHttp to override the global `fetch` and `XMLHttpRequest` on native. + * + * @default false + */ + enabled?: boolean; + }; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/declarations.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/declarations.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/declarations.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/definitions.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/definitions.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/definitions.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/errors.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/errors.js new file mode 100644 index 00000000..061c9a91 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/errors.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isFatal = exports.fatal = exports.FatalException = exports.BaseException = void 0; +class BaseException extends Error { + constructor(message, code) { + super(message); + this.message = message; + this.code = code; + } +} +exports.BaseException = BaseException; +class FatalException extends BaseException { + constructor(message, exitCode = 1) { + super(message, 'FATAL'); + this.message = message; + this.exitCode = exitCode; + } +} +exports.FatalException = FatalException; +function fatal(message) { + throw new FatalException(message); +} +exports.fatal = fatal; +function isFatal(e) { + return e && e instanceof FatalException; +} +exports.isFatal = isFatal; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/framework-configs.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/framework-configs.js new file mode 100644 index 00000000..2df939d7 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/framework-configs.js @@ -0,0 +1,109 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.detectFramework = void 0; +const FRAMEWORK_CONFIGS = [ + { + name: 'Angular', + isMatch: config => hasDependency(config, '@angular/cli'), + webDir: 'dist', + priority: 3, + }, + { + name: 'Create React App', + isMatch: config => hasDependency(config, 'react-scripts'), + webDir: 'build', + priority: 3, + }, + { + name: 'Ember', + isMatch: config => hasDependency(config, 'ember-cli'), + webDir: 'dist', + priority: 3, + }, + { + name: 'Gatsby', + isMatch: config => hasDependency(config, 'gatsby'), + webDir: 'public', + priority: 2, + }, + { + name: 'Ionic Angular', + isMatch: config => hasDependency(config, '@ionic/angular'), + webDir: 'www', + priority: 1, + }, + { + name: 'Ionic React', + isMatch: config => hasDependency(config, '@ionic/react'), + webDir: 'build', + priority: 1, + }, + { + name: 'Ionic Vue', + isMatch: config => hasDependency(config, '@ionic/vue'), + webDir: 'public', + priority: 1, + }, + { + name: 'Next', + isMatch: config => hasDependency(config, 'next'), + webDir: 'public', + priority: 2, + }, + { + name: 'Preact', + isMatch: config => hasDependency(config, 'preact-cli'), + webDir: 'build', + priority: 3, + }, + { + name: 'Stencil', + isMatch: config => hasDependency(config, '@stencil/core'), + webDir: 'www', + priority: 3, + }, + { + name: 'Svelte', + isMatch: config => hasDependency(config, 'svelte') && hasDependency(config, 'sirv-cli'), + webDir: 'public', + priority: 3, + }, + { + name: 'Vite', + isMatch: config => hasDependency(config, 'vite'), + webDir: 'dist', + priority: 2, + }, + { + name: 'Vue', + isMatch: config => hasDependency(config, '@vue/cli-service'), + webDir: 'dist', + priority: 3, + }, +]; +function detectFramework(config) { + const frameworks = FRAMEWORK_CONFIGS.filter(f => f.isMatch(config)).sort((a, b) => { + if (a.priority < b.priority) + return -1; + if (a.priority > b.priority) + return 1; + return 0; + }); + return frameworks[0]; +} +exports.detectFramework = detectFramework; +function hasDependency(config, depName) { + const deps = getDependencies(config); + return deps.includes(depName); +} +function getDependencies(config) { + var _a, _b, _c, _d; + const deps = []; + if ((_b = (_a = config === null || config === void 0 ? void 0 : config.app) === null || _a === void 0 ? void 0 : _a.package) === null || _b === void 0 ? void 0 : _b.dependencies) { + deps.push(...Object.keys(config.app.package.dependencies)); + } + if ((_d = (_c = config === null || config === void 0 ? void 0 : config.app) === null || _c === void 0 ? void 0 : _c.package) === null || _d === void 0 ? void 0 : _d.devDependencies) { + deps.push(...Object.keys(config.app.package.devDependencies)); + } + return deps; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/index.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/index.js new file mode 100644 index 00000000..eaf59d95 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/index.js @@ -0,0 +1,212 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runProgram = exports.run = void 0; +const tslib_1 = require("tslib"); +const commander_1 = require("commander"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const config_1 = require("./config"); +const errors_1 = require("./errors"); +const ipc_1 = require("./ipc"); +const log_1 = require("./log"); +const telemetry_1 = require("./telemetry"); +const cli_1 = require("./util/cli"); +const emoji_1 = require("./util/emoji"); +process.on('unhandledRejection', error => { + console.error(colors_1.default.failure('[fatal]'), error); +}); +process.on('message', ipc_1.receive); +async function run() { + try { + const config = await (0, config_1.loadConfig)(); + runProgram(config); + } + catch (e) { + process.exitCode = (0, errors_1.isFatal)(e) ? e.exitCode : 1; + log_1.logger.error(e.message ? e.message : String(e)); + } +} +exports.run = run; +function runProgram(config) { + commander_1.program.version(config.cli.package.version); + commander_1.program + .command('config', { hidden: true }) + .description(`print evaluated Capacitor config`) + .option('--json', 'Print in JSON format') + .action((0, cli_1.wrapAction)(async ({ json }) => { + const { configCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/config'))); + await configCommand(config, json); + })); + commander_1.program + .command('create [directory] [name] [id]', { hidden: true }) + .description('Creates a new Capacitor project') + .action((0, cli_1.wrapAction)(async () => { + const { createCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/create'))); + await createCommand(); + })); + commander_1.program + .command('init [appName] [appId]') + .description(`Initialize Capacitor configuration`) + .option('--web-dir ', 'Optional: Directory of your projects built web assets') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (appName, appId, { webDir }) => { + const { initCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/init'))); + await initCommand(config, appName, appId, webDir); + }))); + commander_1.program + .command('serve', { hidden: true }) + .description('Serves a Capacitor Progressive Web App in the browser') + .action((0, cli_1.wrapAction)(async () => { + const { serveCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/serve'))); + await serveCommand(); + })); + commander_1.program + .command('sync [platform]') + .description(`${colors_1.default.input('copy')} + ${colors_1.default.input('update')}`) + .option('--deployment', 'Optional: if provided, pod install will use --deployment option') + .option('--inline', 'Optional: if true, all source maps will be inlined for easier debugging on mobile devices', false) + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { deployment, inline }) => { + (0, config_1.checkExternalConfig)(config.app); + const { syncCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/sync'))); + await syncCommand(config, platform, deployment, inline); + }))); + commander_1.program + .command('update [platform]') + .description(`updates the native plugins and dependencies based on ${colors_1.default.strong('package.json')}`) + .option('--deployment', 'Optional: if provided, pod install will use --deployment option') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { deployment }) => { + (0, config_1.checkExternalConfig)(config.app); + const { updateCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/update'))); + await updateCommand(config, platform, deployment); + }))); + commander_1.program + .command('copy [platform]') + .description('copies the web app build into the native app') + .option('--inline', 'Optional: if true, all source maps will be inlined for easier debugging on mobile devices', false) + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { inline }) => { + (0, config_1.checkExternalConfig)(config.app); + const { copyCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/copy'))); + await copyCommand(config, platform, inline); + }))); + commander_1.program + .command('build ') + .description('builds the release version of the selected platform') + .option('--scheme ', 'iOS Scheme to build') + .option('--flavor ', 'Android Flavor to build') + .option('--keystorepath ', 'Path to the keystore') + .option('--keystorepass ', 'Password to the keystore') + .option('--keystorealias ', 'Key Alias in the keystore') + .option('--keystorealiaspass ', 'Password for the Key Alias') + .addOption(new commander_1.Option('--androidreleasetype ', 'Android release type; APK or AAB').choices(['AAB', 'APK'])) + .addOption(new commander_1.Option('--signing-type ', 'Program used to sign apps (default: jarsigner)').choices(['apksigner', 'jarsigner'])) + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { scheme, flavor, keystorepath, keystorepass, keystorealias, keystorealiaspass, androidreleasetype, signingType, }) => { + const { buildCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/build'))); + await buildCommand(config, platform, { + scheme, + flavor, + keystorepath, + keystorepass, + keystorealias, + keystorealiaspass, + androidreleasetype, + signingtype: signingType, + }); + }))); + commander_1.program + .command(`run [platform]`) + .description(`runs ${colors_1.default.input('sync')}, then builds and deploys the native app`) + .option('--scheme ', 'set the scheme of the iOS project') + .option('--flavor ', 'set the flavor of the Android project (flavor dimensions not yet supported)') + .option('--list', 'list targets, then quit') + // TODO: remove once --json is a hidden option (https://github.com/tj/commander.js/issues/1106) + .allowUnknownOption(true) + .option('--target ', 'use a specific target') + .option('--no-sync', `do not run ${colors_1.default.input('sync')}`) + .option('--forwardPorts ', 'Automatically run "adb reverse" for better live-reloading support') + .option('-l, --live-reload', 'Enable Live Reload') + .option('--host ', 'Host used for live reload') + .option('--port ', 'Port used for live reload') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { scheme, flavor, list, target, sync, forwardPorts, liveReload, host, port, }) => { + const { runCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/run'))); + await runCommand(config, platform, { + scheme, + flavor, + list, + target, + sync, + forwardPorts, + liveReload, + host, + port, + }); + }))); + commander_1.program + .command('open [platform]') + .description('opens the native project workspace (Xcode for iOS)') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform) => { + const { openCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/open'))); + await openCommand(config, platform); + }))); + commander_1.program + .command('add [platform]') + .description('add a native platform project') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform) => { + (0, config_1.checkExternalConfig)(config.app); + const { addCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/add'))); + await addCommand(config, platform); + }))); + commander_1.program + .command('ls [platform]') + .description('list installed Cordova and Capacitor plugins') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform) => { + (0, config_1.checkExternalConfig)(config.app); + const { listCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/list'))); + await listCommand(config, platform); + }))); + commander_1.program + .command('doctor [platform]') + .description('checks the current setup for common errors') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform) => { + (0, config_1.checkExternalConfig)(config.app); + const { doctorCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/doctor'))); + await doctorCommand(config, platform); + }))); + commander_1.program + .command('telemetry [on|off]', { hidden: true }) + .description('enable or disable telemetry') + .action((0, cli_1.wrapAction)(async (onOrOff) => { + const { telemetryCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/telemetry'))); + await telemetryCommand(onOrOff); + })); + commander_1.program + .command('📡', { hidden: true }) + .description('IPC receiver command') + .action(() => { + // no-op: IPC messages are received via `process.on('message')` + }); + commander_1.program + .command('plugin:generate', { hidden: true }) + .description('start a new Capacitor plugin') + .action((0, cli_1.wrapAction)(async () => { + const { newPluginCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/new-plugin'))); + await newPluginCommand(); + })); + commander_1.program + .command('migrate') + .option('--noprompt', 'do not prompt for confirmation') + .option('--packagemanager ', 'The package manager to use for dependency installs (npm, pnpm, yarn)') + .description('Migrate your current Capacitor app to the latest major version of Capacitor.') + .action((0, cli_1.wrapAction)(async ({ noprompt, packagemanager }) => { + const { migrateCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/migrate'))); + await migrateCommand(config, noprompt, packagemanager); + })); + commander_1.program.arguments('[command]').action((0, cli_1.wrapAction)(async (cmd) => { + if (typeof cmd === 'undefined') { + log_1.output.write(`\n ${(0, emoji_1.emoji)('⚡️', '--')} ${colors_1.default.strong('Capacitor - Cross-Platform apps with JavaScript and the Web')} ${(0, emoji_1.emoji)('⚡️', '--')}\n\n`); + commander_1.program.outputHelp(); + } + else { + (0, errors_1.fatal)(`Unknown command: ${colors_1.default.input(cmd)}`); + } + })); + commander_1.program.parse(process.argv); +} +exports.runProgram = runProgram; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/add.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/add.js new file mode 100644 index 00000000..7472926b --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/add.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.addIOS = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const template_1 = require("../util/template"); +async function addIOS(config) { + await (0, common_1.runTask)(`Adding native Xcode project in ${colors_1.default.strong(config.ios.platformDir)}`, () => { + return (0, template_1.extractTemplate)(config.cli.assets.ios.platformTemplateArchiveAbs, config.ios.platformDirAbs); + }); +} +exports.addIOS = addIOS; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/build.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/build.js new file mode 100644 index 00000000..4e2908f2 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/build.js @@ -0,0 +1,56 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildiOS = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const rimraf_1 = tslib_1.__importDefault(require("rimraf")); +const common_1 = require("../common"); +const log_1 = require("../log"); +const subprocess_1 = require("../util/subprocess"); +async function buildiOS(config, buildOptions) { + var _a; + const theScheme = (_a = buildOptions.scheme) !== null && _a !== void 0 ? _a : 'App'; + await (0, common_1.runTask)('Building xArchive', async () => (0, subprocess_1.runCommand)('xcodebuild', [ + '-workspace', + (0, path_1.basename)(await config.ios.nativeXcodeWorkspaceDirAbs), + '-scheme', + `${theScheme}`, + '-destination', + `generic/platform=iOS`, + '-archivePath', + `${theScheme}.xcarchive`, + 'archive', + ], { + cwd: config.ios.nativeProjectDirAbs, + })); + const archivePlistContents = ` + + + +method +app-store + +`; + const archivePlistPath = (0, path_1.join)(`${config.ios.nativeProjectDirAbs}`, 'archive.plist'); + (0, utils_fs_1.writeFileSync)(archivePlistPath, archivePlistContents); + await (0, common_1.runTask)('Building IPA', async () => (0, subprocess_1.runCommand)('xcodebuild', [ + 'archive', + '-archivePath', + `${theScheme}.xcarchive`, + '-exportArchive', + '-exportOptionsPlist', + 'archive.plist', + '-exportPath', + 'output', + '-allowProvisioningUpdates', + ], { + cwd: config.ios.nativeProjectDirAbs, + })); + await (0, common_1.runTask)('Cleaning up', async () => { + (0, utils_fs_1.unlinkSync)(archivePlistPath); + rimraf_1.default.sync((0, path_1.join)(config.ios.nativeProjectDirAbs, `${theScheme}.xcarchive`)); + }); + (0, log_1.logSuccess)(`Successfully generated an IPA at: ${(0, path_1.join)(config.ios.nativeProjectDirAbs, 'output')}`); +} +exports.buildiOS = buildiOS; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/common.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/common.js new file mode 100644 index 00000000..ad73c854 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/common.js @@ -0,0 +1,103 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.editProjectSettingsIOS = exports.resolvePlugin = exports.getIOSPlugins = exports.checkCocoaPods = exports.checkBundler = exports.checkIOSPackage = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const child_process_1 = require("child_process"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const subprocess_1 = require("../util/subprocess"); +async function checkIOSPackage(config) { + return (0, common_1.checkCapacitorPlatform)(config, 'ios'); +} +exports.checkIOSPackage = checkIOSPackage; +function execBundler() { + try { + const bundleOutput = (0, child_process_1.execSync)('bundle &> /dev/null ; echo $?'); + return parseInt(bundleOutput.toString()); + } + catch (e) { + return -1; + } +} +async function checkBundler(config) { + if (config.cli.os === "mac" /* OS.Mac */) { + let bundlerResult = execBundler(); + if (bundlerResult === 1) { + // Bundler version is outdated + log_1.logger.info(`Using ${colors_1.default.strong('Gemfile')}: Bundler update needed...`); + await (0, subprocess_1.runCommand)('gem', ['install', 'bundler']); + bundlerResult = execBundler(); + } + if (bundlerResult === 0) { + // Bundler in use, all gems current + log_1.logger.info(`Using ${colors_1.default.strong('Gemfile')}: RubyGems bundle installed`); + } + } + return null; +} +exports.checkBundler = checkBundler; +async function checkCocoaPods(config) { + if (!(await (0, subprocess_1.isInstalled)(await config.ios.podPath)) && + config.cli.os === "mac" /* OS.Mac */) { + return (`CocoaPods is not installed.\n` + + `See this install guide: ${colors_1.default.strong('https://capacitorjs.com/docs/getting-started/environment-setup#homebrew')}`); + } + return null; +} +exports.checkCocoaPods = checkCocoaPods; +async function getIOSPlugins(allPlugins) { + const resolved = await Promise.all(allPlugins.map(async (plugin) => await resolvePlugin(plugin))); + return resolved.filter((plugin) => !!plugin); +} +exports.getIOSPlugins = getIOSPlugins; +async function resolvePlugin(plugin) { + var _a, _b; + const platform = 'ios'; + if ((_a = plugin.manifest) === null || _a === void 0 ? void 0 : _a.ios) { + plugin.ios = { + name: plugin.name, + type: 0 /* PluginType.Core */, + path: (_b = plugin.manifest.ios.src) !== null && _b !== void 0 ? _b : platform, + }; + } + else if (plugin.xml) { + plugin.ios = { + name: plugin.name, + type: 1 /* PluginType.Cordova */, + path: 'src/' + platform, + }; + if ((0, cordova_1.getIncompatibleCordovaPlugins)(platform).includes(plugin.id) || + !(0, plugin_1.getPluginPlatform)(plugin, platform)) { + plugin.ios.type = 2 /* PluginType.Incompatible */; + } + } + else { + return null; + } + return plugin; +} +exports.resolvePlugin = resolvePlugin; +/** + * Update the native project files with the desired app id and app name + */ +async function editProjectSettingsIOS(config) { + const appId = config.app.appId; + const appName = config.app.appName + .replace(/&/g, '&') + .replace(//g, '>'); + const pbxPath = `${config.ios.nativeXcodeProjDirAbs}/project.pbxproj`; + const plistPath = (0, path_1.resolve)(config.ios.nativeTargetDirAbs, 'Info.plist'); + let plistContent = await (0, utils_fs_1.readFile)(plistPath, { encoding: 'utf-8' }); + plistContent = plistContent.replace(/CFBundleDisplayName<\/key>[\s\S]?\s+([^<]*)<\/string>/, `CFBundleDisplayName\n ${appName}`); + let pbxContent = await (0, utils_fs_1.readFile)(pbxPath, { encoding: 'utf-8' }); + pbxContent = pbxContent.replace(/PRODUCT_BUNDLE_IDENTIFIER = ([^;]+)/g, `PRODUCT_BUNDLE_IDENTIFIER = ${appId}`); + await (0, utils_fs_1.writeFile)(plistPath, plistContent, { encoding: 'utf-8' }); + await (0, utils_fs_1.writeFile)(pbxPath, pbxContent, { encoding: 'utf-8' }); +} +exports.editProjectSettingsIOS = editProjectSettingsIOS; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/doctor.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/doctor.js new file mode 100644 index 00000000..853ac183 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/doctor.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.doctorIOS = void 0; +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const subprocess_1 = require("../util/subprocess"); +const common_2 = require("./common"); +async function doctorIOS(config) { + var _a; + // DOCTOR ideas for iOS: + // plugin specific warnings + // check cocoapods installed + // check projects exist + // check content in www === ios/www + // check CLI versions + // check plugins versions + // check native project deps are up-to-date === npm install + // check if npm install was updated + // check online datebase of common errors + // check if www folder is empty (index.html does not exist) + try { + await (0, common_1.check)([ + () => (0, common_2.checkBundler)(config) || (0, common_2.checkCocoaPods)(config), + () => (0, common_1.checkWebDir)(config), + checkXcode, + ]); + (0, log_1.logSuccess)('iOS looking great! 👌'); + } + catch (e) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } +} +exports.doctorIOS = doctorIOS; +async function checkXcode() { + if (!(await (0, subprocess_1.isInstalled)('xcodebuild'))) { + return `Xcode is not installed`; + } + // const matches = output.match(/^Xcode (.*)/); + // if (matches && matches.length === 2) { + // const minVersion = '9.0.0'; + // const semver = await import('semver'); + // console.log(matches[1]); + // if (semver.gt(minVersion, matches[1])) { + // return `Xcode version is too old, ${minVersion} is required`; + // } + // } + return null; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/open.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/open.js new file mode 100644 index 00000000..ddd2c6c1 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/open.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.openIOS = void 0; +const tslib_1 = require("tslib"); +const open_1 = tslib_1.__importDefault(require("open")); +const common_1 = require("../common"); +async function openIOS(config) { + await (0, open_1.default)(await config.ios.nativeXcodeWorkspaceDirAbs, { wait: false }); + await (0, common_1.wait)(3000); +} +exports.openIOS = openIOS; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/run.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/run.js new file mode 100644 index 00000000..4c176f8f --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/run.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runIOS = void 0; +const tslib_1 = require("tslib"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const native_run_1 = require("../util/native-run"); +const subprocess_1 = require("../util/subprocess"); +const debug = (0, debug_1.default)('capacitor:ios:run'); +async function runIOS(config, { target: selectedTarget, scheme: selectedScheme }) { + const target = await (0, common_1.promptForPlatformTarget)(await (0, native_run_1.getPlatformTargets)('ios'), selectedTarget); + const runScheme = selectedScheme || config.ios.scheme; + const derivedDataPath = (0, path_1.resolve)(config.ios.platformDirAbs, 'DerivedData', target.id); + const xcodebuildArgs = [ + '-workspace', + (0, path_1.basename)(await config.ios.nativeXcodeWorkspaceDirAbs), + '-scheme', + runScheme, + '-configuration', + 'Debug', + '-destination', + `id=${target.id}`, + '-derivedDataPath', + derivedDataPath, + ]; + debug('Invoking xcodebuild with args: %O', xcodebuildArgs); + await (0, common_1.runTask)('Running xcodebuild', async () => (0, subprocess_1.runCommand)('xcrun', ['xcodebuild', ...xcodebuildArgs], { + cwd: config.ios.nativeProjectDirAbs, + })); + const appName = `${runScheme}.app`; + const appPath = (0, path_1.resolve)(derivedDataPath, 'Build/Products', target.virtual ? 'Debug-iphonesimulator' : 'Debug-iphoneos', appName); + const nativeRunArgs = ['ios', '--app', appPath, '--target', target.id]; + debug('Invoking native-run with args: %O', nativeRunArgs); + await (0, common_1.runTask)(`Deploying ${colors_1.default.strong(appName)} to ${colors_1.default.input(target.id)}`, async () => (0, native_run_1.runNativeRun)(nativeRunArgs)); +} +exports.runIOS = runIOS; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/update.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/update.js new file mode 100644 index 00000000..7f65db36 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/ios/update.js @@ -0,0 +1,406 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.installCocoaPodsPlugins = exports.updateIOS = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const copy_1 = require("../tasks/copy"); +const fs_1 = require("../util/fs"); +const node_1 = require("../util/node"); +const subprocess_1 = require("../util/subprocess"); +const template_1 = require("../util/template"); +const common_2 = require("./common"); +const platform = 'ios'; +async function updateIOS(config, deployment) { + const plugins = await getPluginsTask(config); + const capacitorPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 0 /* PluginType.Core */); + (0, plugin_1.printPlugins)(capacitorPlugins, 'ios'); + await removePluginsNativeFiles(config); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + if (cordovaPlugins.length > 0) { + await copyPluginsNativeFiles(config, cordovaPlugins); + } + if (!(await (0, utils_fs_1.pathExists)(await config.ios.webDirAbs))) { + await (0, copy_1.copy)(config, platform); + } + await (0, cordova_1.handleCordovaPluginsJS)(cordovaPlugins, config, platform); + await (0, cordova_1.checkPluginDependencies)(plugins, platform); + await generateCordovaPodspecs(cordovaPlugins, config); + await installCocoaPodsPlugins(config, plugins, deployment); + await (0, cordova_1.logCordovaManualSteps)(cordovaPlugins, config, platform); + const incompatibleCordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 2 /* PluginType.Incompatible */); + (0, plugin_1.printPlugins)(incompatibleCordovaPlugins, platform, 'incompatible'); + await (0, common_1.checkPlatformVersions)(config, platform); +} +exports.updateIOS = updateIOS; +async function installCocoaPodsPlugins(config, plugins, deployment) { + await (0, common_1.runTask)(`Updating iOS native dependencies with ${colors_1.default.input(`${await config.ios.podPath} install`)}`, () => { + return updatePodfile(config, plugins, deployment); + }); +} +exports.installCocoaPodsPlugins = installCocoaPodsPlugins; +async function updatePodfile(config, plugins, deployment) { + const dependenciesContent = await generatePodFile(config, plugins); + const relativeCapacitoriOSPath = await getRelativeCapacitoriOSPath(config); + const podfilePath = (0, path_1.join)(config.ios.nativeProjectDirAbs, 'Podfile'); + let podfileContent = await (0, utils_fs_1.readFile)(podfilePath, { encoding: 'utf-8' }); + podfileContent = podfileContent.replace(/(def capacitor_pods)[\s\S]+?(\nend)/, `$1${dependenciesContent}$2`); + podfileContent = podfileContent.replace(/(require_relative)[\s\S]+?(@capacitor\/ios\/scripts\/pods_helpers')/, `require_relative '${relativeCapacitoriOSPath}/scripts/pods_helpers'`); + podfileContent = podfileContent.replace(`def assertDeploymentTarget(installer) + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + # ensure IPHONEOS_DEPLOYMENT_TARGET is at least 13.0 + deployment_target = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f + should_upgrade = deployment_target < 13.0 && deployment_target != 0.0 + if should_upgrade + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + end + end + end +end`, `require_relative '${relativeCapacitoriOSPath}/scripts/pods_helpers'`); + await (0, utils_fs_1.writeFile)(podfilePath, podfileContent, { encoding: 'utf-8' }); + const podPath = await config.ios.podPath; + const useBundler = podPath.startsWith('bundle'); + const podCommandExists = await (0, subprocess_1.isInstalled)('pod'); + if (useBundler || podCommandExists) { + if (useBundler) { + await (0, subprocess_1.runCommand)('bundle', ['exec', 'pod', 'install', ...(deployment ? ['--deployment'] : [])], { cwd: config.ios.nativeProjectDirAbs }); + } + else { + await (0, subprocess_1.runCommand)(podPath, ['install', ...(deployment ? ['--deployment'] : [])], { cwd: config.ios.nativeProjectDirAbs }); + } + } + else { + log_1.logger.warn('Skipping pod install because CocoaPods is not installed'); + } + const isXcodebuildAvailable = await (0, subprocess_1.isInstalled)('xcodebuild'); + if (isXcodebuildAvailable) { + await (0, subprocess_1.runCommand)('xcodebuild', ['-project', (0, path_1.basename)(`${config.ios.nativeXcodeProjDirAbs}`), 'clean'], { + cwd: config.ios.nativeProjectDirAbs, + }); + } + else { + log_1.logger.warn('Unable to find "xcodebuild". Skipping xcodebuild clean step...'); + } +} +async function getRelativeCapacitoriOSPath(config) { + const capacitoriOSPath = (0, node_1.resolveNode)(config.app.rootDir, '@capacitor/ios', 'package.json'); + if (!capacitoriOSPath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong('node_modules/@capacitor/ios')}.\n` + + `Are you sure ${colors_1.default.strong('@capacitor/ios')} is installed?`); + } + return (0, fs_1.convertToUnixPath)((0, path_1.relative)(config.ios.nativeProjectDirAbs, await (0, utils_fs_1.realpath)((0, path_1.dirname)(capacitoriOSPath)))); +} +async function generatePodFile(config, plugins) { + const relativeCapacitoriOSPath = await getRelativeCapacitoriOSPath(config); + const capacitorPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 0 /* PluginType.Core */); + const pods = await Promise.all(capacitorPlugins.map(async (p) => { + if (!p.ios) { + return ''; + } + return ` pod '${p.ios.name}', :path => '${(0, fs_1.convertToUnixPath)((0, path_1.relative)(config.ios.nativeProjectDirAbs, await (0, utils_fs_1.realpath)(p.rootPath)))}'\n`; + })); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + cordovaPlugins.map(async (p) => { + const podspecs = (0, plugin_1.getPlatformElement)(p, platform, 'podspec'); + podspecs.map((podspec) => { + podspec.pods.map((pPods) => { + pPods.pod.map((pod) => { + if (pod.$.git) { + let gitRef = ''; + if (pod.$.tag) { + gitRef = `, :tag => '${pod.$.tag}'`; + } + else if (pod.$.branch) { + gitRef = `, :branch => '${pod.$.branch}'`; + } + else if (pod.$.commit) { + gitRef = `, :commit => '${pod.$.commit}'`; + } + pods.push(` pod '${pod.$.name}', :git => '${pod.$.git}'${gitRef}\n`); + } + }); + }); + }); + }); + const staticPlugins = cordovaPlugins.filter(p => (0, cordova_1.needsStaticPod)(p, config)); + const noStaticPlugins = cordovaPlugins.filter(el => !staticPlugins.includes(el)); + if (noStaticPlugins.length > 0) { + pods.push(` pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins'\n`); + } + if (staticPlugins.length > 0) { + pods.push(` pod 'CordovaPluginsStatic', :path => '../capacitor-cordova-ios-plugins'\n`); + } + const resourcesPlugins = cordovaPlugins.filter(filterResources); + if (resourcesPlugins.length > 0) { + pods.push(` pod 'CordovaPluginsResources', :path => '../capacitor-cordova-ios-plugins'\n`); + } + return ` + pod 'Capacitor', :path => '${relativeCapacitoriOSPath}' + pod 'CapacitorCordova', :path => '${relativeCapacitoriOSPath}' +${pods.join('').trimRight()}`; +} +function getFrameworkName(framework) { + if (isFramework(framework)) { + if (framework.$.custom && framework.$.custom === 'true') { + return framework.$.src; + } + return framework.$.src.substr(0, framework.$.src.indexOf('.')); + } + return framework.$.src + .substr(0, framework.$.src.indexOf('.')) + .replace('lib', ''); +} +function isFramework(framework) { + return framework.$.src.split('.').pop().includes('framework'); +} +async function generateCordovaPodspecs(cordovaPlugins, config) { + const staticPlugins = cordovaPlugins.filter(p => (0, cordova_1.needsStaticPod)(p, config)); + const noStaticPlugins = cordovaPlugins.filter(el => !staticPlugins.includes(el)); + generateCordovaPodspec(noStaticPlugins, config, false); + generateCordovaPodspec(staticPlugins, config, true); +} +async function generateCordovaPodspec(cordovaPlugins, config, isStatic) { + const weakFrameworks = []; + const linkedFrameworks = []; + const customFrameworks = []; + const systemLibraries = []; + const sourceFrameworks = []; + const frameworkDeps = []; + const compilerFlags = []; + let prefsArray = []; + let name = 'CordovaPlugins'; + let sourcesFolderName = 'sources'; + if (isStatic) { + name += 'Static'; + frameworkDeps.push('s.static_framework = true'); + sourcesFolderName += 'static'; + } + cordovaPlugins.map((plugin) => { + const frameworks = (0, plugin_1.getPlatformElement)(plugin, platform, 'framework'); + frameworks.map((framework) => { + if (!framework.$.type) { + const name = getFrameworkName(framework); + if (isFramework(framework)) { + if (framework.$.weak && framework.$.weak === 'true') { + if (!weakFrameworks.includes(name)) { + weakFrameworks.push(name); + } + } + else if (framework.$.custom && framework.$.custom === 'true') { + const frameworktPath = (0, path_1.join)(sourcesFolderName, plugin.name, name); + if (!customFrameworks.includes(frameworktPath)) { + customFrameworks.push(frameworktPath); + } + } + else { + if (!linkedFrameworks.includes(name)) { + linkedFrameworks.push(name); + } + } + } + else { + if (!systemLibraries.includes(name)) { + systemLibraries.push(name); + } + } + } + else if (framework.$.type && framework.$.type === 'podspec') { + let depString = `s.dependency '${framework.$.src}'`; + if (framework.$.spec && framework.$.spec !== '') { + depString += `, '${framework.$.spec}'`; + } + if (!frameworkDeps.includes(depString)) { + frameworkDeps.push(depString); + } + } + }); + prefsArray = prefsArray.concat((0, plugin_1.getAllElements)(plugin, platform, 'preference')); + const podspecs = (0, plugin_1.getPlatformElement)(plugin, platform, 'podspec'); + podspecs.map((podspec) => { + podspec.pods.map((pods) => { + pods.pod.map((pod) => { + let depString = `s.dependency '${pod.$.name}'`; + if (pod.$.spec && pod.$.spec !== '') { + depString += `, '${pod.$.spec}'`; + } + if (!frameworkDeps.includes(depString)) { + frameworkDeps.push(depString); + } + }); + }); + }); + const sourceFiles = (0, plugin_1.getPlatformElement)(plugin, platform, 'source-file'); + sourceFiles.map((sourceFile) => { + if (sourceFile.$.framework && sourceFile.$.framework === 'true') { + let fileName = sourceFile.$.src.split('/').pop(); + if (!fileName.startsWith('lib')) { + fileName = 'lib' + fileName; + } + const frameworktPath = (0, path_1.join)(sourcesFolderName, plugin.name, fileName); + if (!sourceFrameworks.includes(frameworktPath)) { + sourceFrameworks.push(frameworktPath); + } + } + else if (sourceFile.$['compiler-flags']) { + const cFlag = sourceFile.$['compiler-flags']; + if (!compilerFlags.includes(cFlag)) { + compilerFlags.push(cFlag); + } + } + }); + }); + const onlySystemLibraries = systemLibraries.filter(library => removeNoSystem(library, sourceFrameworks)); + if (weakFrameworks.length > 0) { + frameworkDeps.push(`s.weak_frameworks = '${weakFrameworks.join(`', '`)}'`); + } + if (linkedFrameworks.length > 0) { + frameworkDeps.push(`s.frameworks = '${linkedFrameworks.join(`', '`)}'`); + } + if (onlySystemLibraries.length > 0) { + frameworkDeps.push(`s.libraries = '${onlySystemLibraries.join(`', '`)}'`); + } + if (customFrameworks.length > 0) { + frameworkDeps.push(`s.vendored_frameworks = '${customFrameworks.join(`', '`)}'`); + frameworkDeps.push(`s.exclude_files = 'sources/**/*.framework/Headers/*.h', 'sources/**/*.framework/PrivateHeaders/*.h'`); + } + if (sourceFrameworks.length > 0) { + frameworkDeps.push(`s.vendored_libraries = '${sourceFrameworks.join(`', '`)}'`); + } + if (compilerFlags.length > 0) { + frameworkDeps.push(`s.compiler_flags = '${compilerFlags.join(' ')}'`); + } + const arcPlugins = cordovaPlugins.filter(filterARCFiles); + if (arcPlugins.length > 0) { + frameworkDeps.push(`s.subspec 'noarc' do |sna| + sna.requires_arc = false + sna.source_files = 'noarc/**/*.{swift,h,m,c,cc,mm,cpp}' + end`); + } + let frameworksString = frameworkDeps.join('\n '); + frameworksString = await replaceFrameworkVariables(config, prefsArray, frameworksString); + const content = ` + Pod::Spec.new do |s| + s.name = '${name}' + s.version = '${config.cli.package.version}' + s.summary = 'Autogenerated spec' + s.license = 'Unknown' + s.homepage = 'https://example.com' + s.authors = { 'Capacitor Generator' => 'hi@example.com' } + s.source = { :git => 'https://github.com/ionic-team/does-not-exist.git', :tag => '${config.cli.package.version}' } + s.source_files = '${sourcesFolderName}/**/*.{swift,h,m,c,cc,mm,cpp}' + s.ios.deployment_target = '${config.ios.minVersion}' + s.xcconfig = {'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1 WK_WEB_VIEW_ONLY=1' } + s.dependency 'CapacitorCordova'${getLinkerFlags(config)} + s.swift_version = '5.1' + ${frameworksString} + end`; + await (0, utils_fs_1.writeFile)((0, path_1.join)(config.ios.cordovaPluginsDirAbs, `${name}.podspec`), content); +} +function getLinkerFlags(config) { + var _a; + if ((_a = config.app.extConfig.ios) === null || _a === void 0 ? void 0 : _a.cordovaLinkerFlags) { + return `\n s.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '${config.app.extConfig.ios.cordovaLinkerFlags.join(' ')}' }`; + } + return ''; +} +async function copyPluginsNativeFiles(config, cordovaPlugins) { + for (const p of cordovaPlugins) { + const sourceFiles = (0, plugin_1.getPlatformElement)(p, platform, 'source-file'); + const headerFiles = (0, plugin_1.getPlatformElement)(p, platform, 'header-file'); + const codeFiles = sourceFiles.concat(headerFiles); + const frameworks = (0, plugin_1.getPlatformElement)(p, platform, 'framework'); + let sourcesFolderName = 'sources'; + if ((0, cordova_1.needsStaticPod)(p, config)) { + sourcesFolderName += 'static'; + } + const sourcesFolder = (0, path_1.join)(config.ios.cordovaPluginsDirAbs, sourcesFolderName, p.name); + for (const codeFile of codeFiles) { + let fileName = codeFile.$.src.split('/').pop(); + const fileExt = codeFile.$.src.split('.').pop(); + if (fileExt === 'a' && !fileName.startsWith('lib')) { + fileName = 'lib' + fileName; + } + let destFolder = sourcesFolderName; + if (codeFile.$['compiler-flags'] && + codeFile.$['compiler-flags'] === '-fno-objc-arc') { + destFolder = 'noarc'; + } + const filePath = (0, plugin_1.getFilePath)(config, p, codeFile.$.src); + const fileDest = (0, path_1.join)(config.ios.cordovaPluginsDirAbs, destFolder, p.name, fileName); + await (0, utils_fs_1.copy)(filePath, fileDest); + if (!codeFile.$.framework) { + let fileContent = await (0, utils_fs_1.readFile)(fileDest, { encoding: 'utf-8' }); + if (fileExt === 'swift') { + fileContent = 'import Cordova\n' + fileContent; + await (0, utils_fs_1.writeFile)(fileDest, fileContent, { encoding: 'utf-8' }); + } + else { + if (fileContent.includes('@import Firebase;')) { + fileContent = fileContent.replace('@import Firebase;', '#import '); + await (0, utils_fs_1.writeFile)(fileDest, fileContent, { encoding: 'utf-8' }); + } + if (fileContent.includes('[NSBundle bundleForClass:[self class]]') || + fileContent.includes('[NSBundle bundleForClass:[CDVCapture class]]')) { + fileContent = fileContent.replace('[NSBundle bundleForClass:[self class]]', '[NSBundle mainBundle]'); + fileContent = fileContent.replace('[NSBundle bundleForClass:[CDVCapture class]]', '[NSBundle mainBundle]'); + await (0, utils_fs_1.writeFile)(fileDest, fileContent, { encoding: 'utf-8' }); + } + if (fileContent.includes('[self.webView superview]') || + fileContent.includes('self.webView.superview')) { + fileContent = fileContent.replace(/\[self.webView superview\]/g, 'self.viewController.view'); + fileContent = fileContent.replace(/self.webView.superview/g, 'self.viewController.view'); + await (0, utils_fs_1.writeFile)(fileDest, fileContent, { encoding: 'utf-8' }); + } + } + } + } + const resourceFiles = (0, plugin_1.getPlatformElement)(p, platform, 'resource-file'); + for (const resourceFile of resourceFiles) { + const fileName = resourceFile.$.src.split('/').pop(); + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, resourceFile.$.src), (0, path_1.join)(config.ios.cordovaPluginsDirAbs, 'resources', fileName)); + } + for (const framework of frameworks) { + if (framework.$.custom && framework.$.custom === 'true') { + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, framework.$.src), (0, path_1.join)(sourcesFolder, framework.$.src)); + } + } + } +} +async function removePluginsNativeFiles(config) { + await (0, utils_fs_1.remove)(config.ios.cordovaPluginsDirAbs); + await (0, template_1.extractTemplate)(config.cli.assets.ios.cordovaPluginsTemplateArchiveAbs, config.ios.cordovaPluginsDirAbs); +} +function filterResources(plugin) { + const resources = (0, plugin_1.getPlatformElement)(plugin, platform, 'resource-file'); + return resources.length > 0; +} +function filterARCFiles(plugin) { + const sources = (0, plugin_1.getPlatformElement)(plugin, platform, 'source-file'); + const sourcesARC = sources.filter((sourceFile) => sourceFile.$['compiler-flags'] && + sourceFile.$['compiler-flags'] === '-fno-objc-arc'); + return sourcesARC.length > 0; +} +function removeNoSystem(library, sourceFrameworks) { + const libraries = sourceFrameworks.filter(framework => framework.includes(library)); + return libraries.length === 0; +} +async function getPluginsTask(config) { + return await (0, common_1.runTask)('Updating iOS plugins', async () => { + const allPlugins = await (0, plugin_1.getPlugins)(config, 'ios'); + const iosPlugins = await (0, common_2.getIOSPlugins)(allPlugins); + return iosPlugins; + }); +} +async function replaceFrameworkVariables(config, prefsArray, frameworkString) { + prefsArray.map((preference) => { + frameworkString = frameworkString.replace(new RegExp(('$' + preference.$.name).replace('$', '\\$&'), 'g'), preference.$.default); + }); + return frameworkString; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/ipc.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/ipc.js new file mode 100644 index 00000000..c4d30ed5 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/ipc.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.receive = exports.send = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const utils_subprocess_1 = require("@ionic/utils-subprocess"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const https_1 = require("https"); +const path_1 = require("path"); +const cli_1 = require("./util/cli"); +const debug = (0, debug_1.default)('capacitor:ipc'); +/** + * Send an IPC message to a forked process. + */ +async function send(msg) { + const dir = cli_1.ENV_PATHS.log; + await (0, utils_fs_1.mkdirp)(dir); + const logPath = (0, path_1.resolve)(dir, 'ipc.log'); + debug('Sending %O IPC message to forked process (logs: %O)', msg.type, logPath); + const fd = await (0, utils_fs_1.open)(logPath, 'a'); + const p = (0, utils_subprocess_1.fork)(process.argv[1], ['📡'], { stdio: ['ignore', fd, fd, 'ipc'] }); + p.send(msg); + p.disconnect(); + p.unref(); +} +exports.send = send; +/** + * Receive and handle an IPC message. + * + * Assume minimal context and keep external dependencies to a minimum. + */ +async function receive(msg) { + debug('Received %O IPC message', msg.type); + if (msg.type === 'telemetry') { + const now = new Date().toISOString(); + const { data } = msg; + // This request is only made if telemetry is on. + const req = (0, https_1.request)({ + hostname: 'api.ionicjs.com', + port: 443, + path: '/events/metrics', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, response => { + debug('Sent %O metric to events service (status: %O)', data.name, response.statusCode); + if (response.statusCode !== 204) { + response.on('data', chunk => { + debug('Bad response from events service. Request body: %O', chunk.toString()); + }); + } + }); + const body = { + metrics: [data], + sent_at: now, + }; + req.end(JSON.stringify(body)); + } +} +exports.receive = receive; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/log.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/log.js new file mode 100644 index 00000000..f7de2473 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/log.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logSuccess = exports.logPrompt = exports.logger = exports.output = void 0; +const tslib_1 = require("tslib"); +const cli_framework_output_1 = require("@ionic/cli-framework-output"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const term_1 = require("./util/term"); +const options = { + colors: colors_1.default, + stream: process.argv.includes('--json') ? process.stderr : process.stdout, +}; +exports.output = (0, term_1.isInteractive)() + ? new cli_framework_output_1.TTYOutputStrategy(options) + : new cli_framework_output_1.StreamOutputStrategy(options); +exports.logger = (0, cli_framework_output_1.createDefaultLogger)({ + output: exports.output, + formatterOptions: { + titleize: false, + tags: new Map([ + [cli_framework_output_1.LOGGER_LEVELS.DEBUG, colors_1.default.log.DEBUG('[debug]')], + [cli_framework_output_1.LOGGER_LEVELS.INFO, colors_1.default.log.INFO('[info]')], + [cli_framework_output_1.LOGGER_LEVELS.WARN, colors_1.default.log.WARN('[warn]')], + [cli_framework_output_1.LOGGER_LEVELS.ERROR, colors_1.default.log.ERROR('[error]')], + ]), + }, +}); +async function logPrompt(msg, promptObject) { + const { wordWrap } = await Promise.resolve().then(() => tslib_1.__importStar(require('@ionic/cli-framework-output'))); + const { prompt } = await Promise.resolve().then(() => tslib_1.__importStar(require('prompts'))); + exports.logger.log({ + msg: `${colors_1.default.input('[?]')} ${wordWrap(msg, { indentation: 4 })}`, + logger: exports.logger, + format: false, + }); + return prompt(promptObject, { onCancel: () => process.exit(1) }); +} +exports.logPrompt = logPrompt; +function logSuccess(msg) { + exports.logger.msg(`${colors_1.default.success('[success]')} ${msg}`); +} +exports.logSuccess = logSuccess; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/plugin.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/plugin.js new file mode 100644 index 00000000..c7a1cd78 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/plugin.js @@ -0,0 +1,186 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAllElements = exports.getFilePath = exports.getAssets = exports.getJSModules = exports.getPluginType = exports.getPlatformElement = exports.getPluginPlatform = exports.printPlugins = exports.fixName = exports.getDependencies = exports.resolvePlugin = exports.getPlugins = exports.getIncludedPluginPackages = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const errors_1 = require("./errors"); +const log_1 = require("./log"); +const node_1 = require("./util/node"); +const xml_1 = require("./util/xml"); +function getIncludedPluginPackages(config, platform) { + var _a, _b, _c, _d; + const { extConfig } = config.app; + switch (platform) { + case 'android': + return (_b = (_a = extConfig.android) === null || _a === void 0 ? void 0 : _a.includePlugins) !== null && _b !== void 0 ? _b : extConfig.includePlugins; + case 'ios': + return (_d = (_c = extConfig.ios) === null || _c === void 0 ? void 0 : _c.includePlugins) !== null && _d !== void 0 ? _d : extConfig.includePlugins; + } +} +exports.getIncludedPluginPackages = getIncludedPluginPackages; +async function getPlugins(config, platform) { + var _a; + const possiblePlugins = (_a = getIncludedPluginPackages(config, platform)) !== null && _a !== void 0 ? _a : getDependencies(config); + const resolvedPlugins = await Promise.all(possiblePlugins.map(async (p) => resolvePlugin(config, p))); + return resolvedPlugins.filter((p) => !!p); +} +exports.getPlugins = getPlugins; +async function resolvePlugin(config, name) { + try { + const packagePath = (0, node_1.resolveNode)(config.app.rootDir, name, 'package.json'); + if (!packagePath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong(`node_modules/${name}`)}.\n` + + `Are you sure ${colors_1.default.strong(name)} is installed?`); + } + const rootPath = (0, path_1.dirname)(packagePath); + const meta = await (0, utils_fs_1.readJSON)(packagePath); + if (!meta) { + return null; + } + if (meta.capacitor) { + return { + id: name, + name: fixName(name), + version: meta.version, + rootPath, + repository: meta.repository, + manifest: meta.capacitor, + }; + } + const pluginXMLPath = (0, path_1.join)(rootPath, 'plugin.xml'); + const xmlMeta = await (0, xml_1.readXML)(pluginXMLPath); + return { + id: name, + name: fixName(name), + version: meta.version, + rootPath: rootPath, + repository: meta.repository, + xml: xmlMeta.plugin, + }; + } + catch (e) { + // ignore + } + return null; +} +exports.resolvePlugin = resolvePlugin; +function getDependencies(config) { + var _a, _b; + return [ + ...Object.keys((_a = config.app.package.dependencies) !== null && _a !== void 0 ? _a : {}), + ...Object.keys((_b = config.app.package.devDependencies) !== null && _b !== void 0 ? _b : {}), + ]; +} +exports.getDependencies = getDependencies; +function fixName(name) { + name = name + .replace(/\//g, '_') + .replace(/-/g, '_') + .replace(/@/g, '') + .replace(/_\w/g, m => m[1].toUpperCase()); + return name.charAt(0).toUpperCase() + name.slice(1); +} +exports.fixName = fixName; +function printPlugins(plugins, platform, type = 'capacitor') { + if (plugins.length === 0) { + return; + } + let msg; + const plural = plugins.length === 1 ? '' : 's'; + switch (type) { + case 'cordova': + msg = `Found ${plugins.length} Cordova plugin${plural} for ${colors_1.default.strong(platform)}:\n`; + break; + case 'incompatible': + msg = `Found ${plugins.length} incompatible Cordova plugin${plural} for ${colors_1.default.strong(platform)}, skipped install:\n`; + break; + case 'capacitor': + msg = `Found ${plugins.length} Capacitor plugin${plural} for ${colors_1.default.strong(platform)}:\n`; + break; + } + msg += plugins.map(p => `${p.id}${colors_1.default.weak(`@${p.version}`)}`).join('\n'); + log_1.logger.info(msg); +} +exports.printPlugins = printPlugins; +function getPluginPlatform(p, platform) { + const platforms = p.xml.platform; + if (platforms) { + const platforms = p.xml.platform.filter(function (item) { + return item.$.name === platform; + }); + return platforms[0]; + } + return []; +} +exports.getPluginPlatform = getPluginPlatform; +function getPlatformElement(p, platform, elementName) { + const platformTag = getPluginPlatform(p, platform); + if (platformTag) { + const element = platformTag[elementName]; + if (element) { + return element; + } + } + return []; +} +exports.getPlatformElement = getPlatformElement; +function getPluginType(p, platform) { + var _a, _b, _c, _d; + switch (platform) { + case 'ios': + return (_b = (_a = p.ios) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : 0 /* PluginType.Core */; + case 'android': + return (_d = (_c = p.android) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : 0 /* PluginType.Core */; + } + return 0 /* PluginType.Core */; +} +exports.getPluginType = getPluginType; +/** + * Get each JavaScript Module for the given plugin + */ +function getJSModules(p, platform) { + return getAllElements(p, platform, 'js-module'); +} +exports.getJSModules = getJSModules; +/** + * Get each asset tag for the given plugin + */ +function getAssets(p, platform) { + return getAllElements(p, platform, 'asset'); +} +exports.getAssets = getAssets; +function getFilePath(config, plugin, path) { + if (path.startsWith('node_modules')) { + let pathSegments = path.split('/').slice(1); + if (pathSegments[0].startsWith('@')) { + pathSegments = [ + pathSegments[0] + '/' + pathSegments[1], + ...pathSegments.slice(2), + ]; + } + const filePath = (0, node_1.resolveNode)(config.app.rootDir, ...pathSegments); + if (!filePath) { + throw new Error(`Can't resolve module ${pathSegments[0]}`); + } + return filePath; + } + return (0, path_1.join)(plugin.rootPath, path); +} +exports.getFilePath = getFilePath; +/** + * For a given plugin, return all the plugin.xml elements with elementName, checking root and specified platform + */ +function getAllElements(p, platform, elementName) { + let modules = []; + if (p.xml[elementName]) { + modules = modules.concat(p.xml[elementName]); + } + const platformModules = getPluginPlatform(p, platform); + if (platformModules === null || platformModules === void 0 ? void 0 : platformModules[elementName]) { + modules = modules.concat(platformModules[elementName]); + } + return modules; +} +exports.getAllElements = getAllElements; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/sysconfig.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/sysconfig.js new file mode 100644 index 00000000..149eee54 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/sysconfig.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.writeConfig = exports.readConfig = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const cli_1 = require("./util/cli"); +const uuid_1 = require("./util/uuid"); +const debug = (0, debug_1.default)('capacitor:sysconfig'); +const SYSCONFIG_FILE = 'sysconfig.json'; +const SYSCONFIG_PATH = (0, path_1.resolve)(cli_1.ENV_PATHS.config, SYSCONFIG_FILE); +async function readConfig() { + debug('Reading from %O', SYSCONFIG_PATH); + try { + return await (0, utils_fs_1.readJSON)(SYSCONFIG_PATH); + } + catch (e) { + if (e.code !== 'ENOENT') { + throw e; + } + const sysconfig = { + machine: (0, uuid_1.uuidv4)(), + }; + await writeConfig(sysconfig); + return sysconfig; + } +} +exports.readConfig = readConfig; +async function writeConfig(sysconfig) { + debug('Writing to %O', SYSCONFIG_PATH); + await (0, utils_fs_1.mkdirp)((0, path_1.dirname)(SYSCONFIG_PATH)); + await (0, utils_fs_1.writeJSON)(SYSCONFIG_PATH, sysconfig, { spaces: '\t' }); +} +exports.writeConfig = writeConfig; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/add.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/add.js new file mode 100644 index 00000000..2bb6a805 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/add.js @@ -0,0 +1,122 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.addCommand = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const add_1 = require("../android/add"); +const common_1 = require("../android/common"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_2 = require("../common"); +const errors_1 = require("../errors"); +const add_2 = require("../ios/add"); +const common_3 = require("../ios/common"); +const log_1 = require("../log"); +const sync_1 = require("./sync"); +async function addCommand(config, selectedPlatformName) { + var _a; + if (selectedPlatformName && !(await (0, common_2.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_2.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_2.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:add'); + } + else { + let msg = `Platform ${colors_1.default.input(selectedPlatformName)} not found.`; + if (await (0, common_2.isValidCommunityPlatform)(selectedPlatformName)) { + msg += `\nTry installing ${colors_1.default.strong(`@capacitor-community/${selectedPlatformName}`)} and adding the platform again.`; + } + if (await (0, common_2.isValidEnterprisePlatform)(selectedPlatformName)) { + msg += + `\nThis is an enterprise platform and @ionic-enterprise/capacitor-${selectedPlatformName} is not installed.\n` + + `To learn how to use this platform, visit https://ionic.io/docs/${selectedPlatformName}`; + } + log_1.logger.error(msg); + } + } + else { + const knownPlatforms = await (0, common_2.getKnownPlatforms)(); + const platformName = await (0, common_2.promptForPlatform)(knownPlatforms, `Please choose a platform to add:`, selectedPlatformName); + if (platformName === config.web.name) { + webWarning(); + return; + } + const existingPlatformDir = await (0, common_2.getProjectPlatformDirectory)(config, platformName); + if (existingPlatformDir) { + (0, errors_1.fatal)(`${colors_1.default.input(platformName)} platform already exists.\n` + + `To re-add this platform, first remove ${colors_1.default.strong((0, utils_terminal_1.prettyPath)(existingPlatformDir))}, then run this command again.\n` + + `${colors_1.default.strong('WARNING')}: Your native project will be completely removed.`); + } + try { + await (0, common_2.check)([ + () => (0, common_2.checkPackage)(), + () => (0, common_2.checkAppConfig)(config), + ...addChecks(config, platformName), + ]); + await doAdd(config, platformName); + await editPlatforms(config, platformName); + if (await (0, utils_fs_1.pathExists)(config.app.webDirAbs)) { + await (0, sync_1.sync)(config, platformName, false, false); + if (platformName === config.android.name) { + await (0, common_2.runTask)('Syncing Gradle', async () => { + return (0, add_1.createLocalProperties)(config.android.platformDirAbs); + }); + } + } + else { + log_1.logger.warn(`${colors_1.default.success(colors_1.default.strong('sync'))} could not run--missing ${colors_1.default.strong(config.app.webDir)} directory.`); + } + printNextSteps(platformName); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } + } +} +exports.addCommand = addCommand; +function printNextSteps(platformName) { + (0, log_1.logSuccess)(`${colors_1.default.strong(platformName)} platform added!`); + log_1.output.write(`Follow the Developer Workflow guide to get building:\n${colors_1.default.strong(`https://capacitorjs.com/docs/basics/workflow`)}\n`); +} +function addChecks(config, platformName) { + if (platformName === config.ios.name) { + return [ + () => (0, common_3.checkIOSPackage)(config), + () => (0, common_3.checkBundler)(config) || (0, common_3.checkCocoaPods)(config), + ]; + } + else if (platformName === config.android.name) { + return [() => (0, common_1.checkAndroidPackage)(config)]; + } + else if (platformName === config.web.name) { + return []; + } + else { + throw `Platform ${platformName} is not valid.`; + } +} +async function doAdd(config, platformName) { + await (0, common_2.runTask)(colors_1.default.success(colors_1.default.strong('add')), async () => { + if (platformName === config.ios.name) { + await (0, add_2.addIOS)(config); + } + else if (platformName === config.android.name) { + await (0, add_1.addAndroid)(config); + } + }); +} +async function editPlatforms(config, platformName) { + if (platformName === config.ios.name) { + await (0, common_3.editProjectSettingsIOS)(config); + } + else if (platformName === config.android.name) { + await (0, common_1.editProjectSettingsAndroid)(config); + } +} +function webWarning() { + log_1.logger.error(`Not adding platform ${colors_1.default.strong('web')}.\n` + + `In Capacitor, the web platform is just your web app! For example, if you have a React or Angular project, the web platform is that project.\n` + + `To add Capacitor functionality to your web app, follow the Web Getting Started Guide: ${colors_1.default.strong('https://capacitorjs.com/docs/web')}`); +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/build.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/build.js new file mode 100644 index 00000000..981cad35 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/build.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.build = exports.buildCommand = void 0; +const build_1 = require("../android/build"); +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const build_2 = require("../ios/build"); +async function buildCommand(config, selectedPlatformName, buildOptions) { + var _a; + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + let platformName; + if (platforms.length === 1) { + platformName = platforms[0]; + } + else { + platformName = await (0, common_1.promptForPlatform)(platforms.filter(createBuildablePlatformFilter(config)), `Please choose a platform to build for:`); + } + const buildCommandOptions = { + scheme: buildOptions.scheme || config.ios.scheme, + flavor: buildOptions.flavor || config.android.flavor, + keystorepath: buildOptions.keystorepath || config.android.buildOptions.keystorePath, + keystorepass: buildOptions.keystorepass || config.android.buildOptions.keystorePassword, + keystorealias: buildOptions.keystorealias || config.android.buildOptions.keystoreAlias, + keystorealiaspass: buildOptions.keystorealiaspass || + config.android.buildOptions.keystoreAliasPassword, + androidreleasetype: buildOptions.androidreleasetype || + config.android.buildOptions.releaseType || + 'AAB', + signingtype: buildOptions.signingtype || + config.android.buildOptions.signingType || + 'jarsigner', + }; + try { + await build(config, platformName, buildCommandOptions); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } +} +exports.buildCommand = buildCommand; +async function build(config, platformName, buildOptions) { + if (platformName == config.ios.name) { + await (0, build_2.buildiOS)(config, buildOptions); + } + else if (platformName === config.android.name) { + await (0, build_1.buildAndroid)(config, buildOptions); + } + else if (platformName === config.web.name) { + throw `Platform "${platformName}" is not available in the build command.`; + } + else { + throw `Platform "${platformName}" is not valid.`; + } +} +exports.build = build; +function createBuildablePlatformFilter(config) { + return platform => platform === config.ios.name || platform === config.android.name; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/config.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/config.js new file mode 100644 index 00000000..6e9ac0ac --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/config.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.configCommand = void 0; +const tslib_1 = require("tslib"); +const util_1 = tslib_1.__importDefault(require("util")); +const log_1 = require("../log"); +async function configCommand(config, json) { + const evaluatedConfig = await deepAwait(config); + if (json) { + process.stdout.write(`${JSON.stringify(evaluatedConfig)}\n`); + } + else { + log_1.output.write(`${util_1.default.inspect(evaluatedConfig, { depth: Infinity, colors: true })}\n`); + } +} +exports.configCommand = configCommand; +async function deepAwait(obj) { + if (obj && + !Array.isArray(obj) && + typeof obj === 'object' && + obj.constructor === Object) { + const o = {}; + for (const [k, v] of Object.entries(obj)) { + o[k] = await deepAwait(v); + } + return o; + } + else { + return await obj; + } +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/copy.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/copy.js new file mode 100644 index 00000000..ea3c064e --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/copy.js @@ -0,0 +1,212 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.copy = exports.copyCommand = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const promise_1 = require("../util/promise"); +const copy_1 = require("../web/copy"); +const sourcemaps_1 = require("./sourcemaps"); +async function copyCommand(config, selectedPlatformName, inline = false) { + var _a; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_1.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_1.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:copy'); + } + else { + log_1.logger.error(`Platform ${colors_1.default.input(selectedPlatformName)} not found.`); + } + } + else { + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + try { + await (0, promise_1.allSerial)(platforms.map(platformName => () => copy(config, platformName, inline))); + } + catch (e) { + if ((0, errors_1.isFatal)(e)) { + throw e; + } + log_1.logger.error((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + } +} +exports.copyCommand = copyCommand; +async function copy(config, platformName, inline = false) { + await (0, common_1.runTask)(colors_1.default.success(colors_1.default.strong(`copy ${platformName}`)), async () => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v; + const result = await (0, common_1.checkWebDir)(config); + if (result) { + throw result; + } + await (0, common_1.runPlatformHook)(config, platformName, config.app.rootDir, 'capacitor:copy:before'); + const allPlugins = await (0, plugin_1.getPlugins)(config, platformName); + let usesFederatedCapacitor = false; + if (allPlugins.filter(plugin => plugin.id === '@ionic-enterprise/federated-capacitor').length > 0) { + usesFederatedCapacitor = true; + } + let usesLiveUpdates = false; + if (allPlugins.filter(plugin => plugin.id === '@capacitor/live-updates') + .length > 0) { + usesLiveUpdates = true; + } + let usesSSLPinning = false; + if (allPlugins.filter(plugin => plugin.id === '@ionic-enterprise/ssl-pinning') + .length > 0) { + usesSSLPinning = true; + } + if (platformName === config.ios.name) { + if (usesFederatedCapacitor) { + await copyFederatedWebDirs(config, await config.ios.webDirAbs); + if ((_c = (_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.plugins) === null || _b === void 0 ? void 0 : _b.FederatedCapacitor) === null || _c === void 0 ? void 0 : _c.liveUpdatesKey) { + await copySecureLiveUpdatesKey(config.app.extConfig.plugins.FederatedCapacitor.liveUpdatesKey, config.app.rootDir, config.ios.nativeTargetDirAbs); + } + } + else { + await copyWebDir(config, await config.ios.webDirAbs, config.app.webDirAbs); + } + if (usesLiveUpdates && ((_f = (_e = (_d = config.app.extConfig) === null || _d === void 0 ? void 0 : _d.plugins) === null || _e === void 0 ? void 0 : _e.LiveUpdates) === null || _f === void 0 ? void 0 : _f.key)) { + await copySecureLiveUpdatesKey(config.app.extConfig.plugins.LiveUpdates.key, config.app.rootDir, config.ios.nativeTargetDirAbs); + } + if (usesSSLPinning && ((_j = (_h = (_g = config.app.extConfig) === null || _g === void 0 ? void 0 : _g.plugins) === null || _h === void 0 ? void 0 : _h.SSLPinning) === null || _j === void 0 ? void 0 : _j.certs)) { + await copySSLCert((_k = config.app.extConfig.plugins.SSLPinning) === null || _k === void 0 ? void 0 : _k.certs, config.app.rootDir, await config.ios.webDirAbs); + } + await copyCapacitorConfig(config, config.ios.nativeTargetDirAbs); + const cordovaPlugins = await (0, cordova_1.getCordovaPlugins)(config, platformName); + await (0, cordova_1.handleCordovaPluginsJS)(cordovaPlugins, config, platformName); + } + else if (platformName === config.android.name) { + if (usesFederatedCapacitor) { + await copyFederatedWebDirs(config, config.android.webDirAbs); + if ((_o = (_m = (_l = config.app.extConfig) === null || _l === void 0 ? void 0 : _l.plugins) === null || _m === void 0 ? void 0 : _m.FederatedCapacitor) === null || _o === void 0 ? void 0 : _o.liveUpdatesKey) { + await copySecureLiveUpdatesKey(config.app.extConfig.plugins.FederatedCapacitor.liveUpdatesKey, config.app.rootDir, config.android.assetsDirAbs); + } + } + else { + await copyWebDir(config, config.android.webDirAbs, config.app.webDirAbs); + } + if (usesLiveUpdates && ((_r = (_q = (_p = config.app.extConfig) === null || _p === void 0 ? void 0 : _p.plugins) === null || _q === void 0 ? void 0 : _q.LiveUpdates) === null || _r === void 0 ? void 0 : _r.key)) { + await copySecureLiveUpdatesKey(config.app.extConfig.plugins.LiveUpdates.key, config.app.rootDir, config.android.assetsDirAbs); + } + if (usesSSLPinning && ((_u = (_t = (_s = config.app.extConfig) === null || _s === void 0 ? void 0 : _s.plugins) === null || _t === void 0 ? void 0 : _t.SSLPinning) === null || _u === void 0 ? void 0 : _u.certs)) { + await copySSLCert((_v = config.app.extConfig.plugins.SSLPinning) === null || _v === void 0 ? void 0 : _v.certs, config.app.rootDir, config.android.assetsDirAbs); + } + await copyCapacitorConfig(config, config.android.assetsDirAbs); + const cordovaPlugins = await (0, cordova_1.getCordovaPlugins)(config, platformName); + await (0, cordova_1.handleCordovaPluginsJS)(cordovaPlugins, config, platformName); + await (0, cordova_1.writeCordovaAndroidManifest)(cordovaPlugins, config, platformName); + } + else if (platformName === config.web.name) { + if (usesFederatedCapacitor) { + log_1.logger.info('FederatedCapacitor Plugin installed, skipping web bundling...'); + } + else { + await (0, copy_1.copyWeb)(config); + } + } + else { + throw `Platform ${platformName} is not valid.`; + } + if (inline) { + await (0, sourcemaps_1.inlineSourceMaps)(config, platformName); + } + }); + await (0, common_1.runPlatformHook)(config, platformName, config.app.rootDir, 'capacitor:copy:after'); +} +exports.copy = copy; +async function copyCapacitorConfig(config, nativeAbsDir) { + const nativeRelDir = (0, path_1.relative)(config.app.rootDir, nativeAbsDir); + const nativeConfigFile = 'capacitor.config.json'; + const nativeConfigFilePath = (0, path_1.join)(nativeAbsDir, nativeConfigFile); + await (0, common_1.runTask)(`Creating ${colors_1.default.strong(nativeConfigFile)} in ${nativeRelDir}`, async () => { + var _a; + (_a = config.app.extConfig.android) === null || _a === void 0 ? true : delete _a.buildOptions; + await (0, utils_fs_1.writeJSON)(nativeConfigFilePath, config.app.extConfig, { + spaces: '\t', + }); + }); +} +async function copyWebDir(config, nativeAbsDir, webAbsDir) { + var _a; + const webRelDir = (0, path_1.basename)(webAbsDir); + const nativeRelDir = (0, path_1.relative)(config.app.rootDir, nativeAbsDir); + if (((_a = config.app.extConfig.server) === null || _a === void 0 ? void 0 : _a.url) && !(await (0, utils_fs_1.pathExists)(webAbsDir))) { + log_1.logger.warn(`Cannot copy web assets from ${colors_1.default.strong(webRelDir)} to ${nativeRelDir}\n` + + `Web asset directory specified by ${colors_1.default.input('webDir')} does not exist. This is not an error because ${colors_1.default.input('server.url')} is set in config.`); + return; + } + await (0, common_1.runTask)(`Copying web assets from ${colors_1.default.strong(webRelDir)} to ${nativeRelDir}`, async () => { + await (0, utils_fs_1.remove)(nativeAbsDir); + return (0, utils_fs_1.copy)(webAbsDir, nativeAbsDir); + }); +} +async function copyFederatedWebDirs(config, nativeAbsDir) { + var _a, _b; + log_1.logger.info('FederatedCapacitor Plugin Loaded - Copying Web Assets'); + if (!((_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.plugins) === null || _b === void 0 ? void 0 : _b.FederatedCapacitor)) { + throw `FederatedCapacitor plugin is present but no valid config is defined.`; + } + const federatedConfig = config.app.extConfig.plugins.FederatedCapacitor; + if (federatedConfig) { + if (federatedConfig.shell.name === undefined) { + throw `FederatedCapacitor plugin is present but no valid Shell application is defined in the config.`; + } + if (!federatedConfig.apps.every(isFederatedApp)) { + throw `FederatedCapacitor plugin is present but there is a problem with the apps defined in the config.`; + } + const copyApps = () => { + return federatedConfig.apps.map(app => { + const appDir = (0, path_1.resolve)(config.app.rootDir, app.webDir); + return copyWebDir(config, (0, path_1.resolve)(nativeAbsDir, app.name), appDir); + }); + }; + const copyShell = () => { + return copyWebDir(config, (0, path_1.resolve)(nativeAbsDir, federatedConfig.shell.name), config.app.webDirAbs); + }; + await Promise.all([...copyApps(), copyShell()]); + } +} +function isFederatedApp(config) { + return (config.webDir !== undefined && + config.name !== undefined); +} +async function copySecureLiveUpdatesKey(secureLiveUpdatesKeyFile, rootDir, nativeAbsDir) { + const keyAbsFromPath = (0, path_1.join)(rootDir, secureLiveUpdatesKeyFile); + const keyAbsToPath = (0, path_1.join)(nativeAbsDir, (0, path_1.basename)(keyAbsFromPath)); + const keyRelToDir = (0, path_1.relative)(rootDir, nativeAbsDir); + if (!(await (0, utils_fs_1.pathExists)(keyAbsFromPath))) { + log_1.logger.warn(`Cannot copy Secure Live Updates signature file from ${colors_1.default.strong(keyAbsFromPath)} to ${keyRelToDir}\n` + + `Signature file does not exist at specified key path.`); + return; + } + await (0, common_1.runTask)(`Copying Secure Live Updates key from ${colors_1.default.strong(secureLiveUpdatesKeyFile)} to ${keyRelToDir}`, async () => { + return (0, utils_fs_1.copy)(keyAbsFromPath, keyAbsToPath); + }); +} +async function copySSLCert(sslCertPaths, rootDir, targetDir) { + const validCertPaths = []; + for (const sslCertPath of sslCertPaths) { + const certAbsFromPath = (0, path_1.join)(rootDir, sslCertPath); + if (!(await (0, utils_fs_1.pathExists)(certAbsFromPath))) { + log_1.logger.warn(`Cannot copy SSL Certificate file from ${colors_1.default.strong(certAbsFromPath)}\n` + + `SSL Certificate does not exist at specified path.`); + return; + } + validCertPaths.push(certAbsFromPath); + } + const certsDirAbsToPath = (0, path_1.join)(targetDir, 'certs'); + const certsDirRelToDir = (0, path_1.relative)(rootDir, targetDir); + await (0, common_1.runTask)(`Copying SSL Certificates from to ${certsDirRelToDir}`, async () => { + const promises = []; + for (const certPath of validCertPaths) { + promises.push((0, utils_fs_1.copy)(certPath, (0, path_1.join)(certsDirAbsToPath, (0, path_1.basename)(certPath)))); + } + return Promise.all(promises); + }); +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/create.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/create.js new file mode 100644 index 00000000..3b92c8b7 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/create.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createCommand = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +async function createCommand() { + (0, errors_1.fatal)(`The create command has been removed.\n` + + `Use ${colors_1.default.input('npm init @capacitor/app')}`); +} +exports.createCommand = createCommand; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/doctor.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/doctor.js new file mode 100644 index 00000000..8fced771 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/doctor.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.doctor = exports.doctorCore = exports.doctorCommand = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const doctor_1 = require("../android/doctor"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const doctor_2 = require("../ios/doctor"); +const log_1 = require("../log"); +const emoji_1 = require("../util/emoji"); +const node_1 = require("../util/node"); +const subprocess_1 = require("../util/subprocess"); +async function doctorCommand(config, selectedPlatformName) { + log_1.output.write(`${(0, emoji_1.emoji)('💊', '')} ${colors_1.default.strong('Capacitor Doctor')} ${(0, emoji_1.emoji)('💊', '')} \n\n`); + await doctorCore(config); + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + await Promise.all(platforms.map(platformName => { + return doctor(config, platformName); + })); +} +exports.doctorCommand = doctorCommand; +async function doctorCore(config) { + const [cliVersion, coreVersion, androidVersion, iosVersion] = await Promise.all([ + (0, subprocess_1.getCommandOutput)('npm', ['info', '@capacitor/cli', 'version']), + (0, subprocess_1.getCommandOutput)('npm', ['info', '@capacitor/core', 'version']), + (0, subprocess_1.getCommandOutput)('npm', ['info', '@capacitor/android', 'version']), + (0, subprocess_1.getCommandOutput)('npm', ['info', '@capacitor/ios', 'version']), + ]); + log_1.output.write(`${colors_1.default.strong('Latest Dependencies:')}\n\n` + + ` @capacitor/cli: ${colors_1.default.weak(cliVersion !== null && cliVersion !== void 0 ? cliVersion : 'unknown')}\n` + + ` @capacitor/core: ${colors_1.default.weak(coreVersion !== null && coreVersion !== void 0 ? coreVersion : 'unknown')}\n` + + ` @capacitor/android: ${colors_1.default.weak(androidVersion !== null && androidVersion !== void 0 ? androidVersion : 'unknown')}\n` + + ` @capacitor/ios: ${colors_1.default.weak(iosVersion !== null && iosVersion !== void 0 ? iosVersion : 'unknown')}\n\n` + + `${colors_1.default.strong('Installed Dependencies:')}\n\n`); + await printInstalledPackages(config); + log_1.output.write('\n'); +} +exports.doctorCore = doctorCore; +async function printInstalledPackages(config) { + const packageNames = [ + '@capacitor/cli', + '@capacitor/core', + '@capacitor/android', + '@capacitor/ios', + ]; + await Promise.all(packageNames.map(async (packageName) => { + const packagePath = (0, node_1.resolveNode)(config.app.rootDir, packageName, 'package.json'); + await printPackageVersion(packageName, packagePath); + })); +} +async function printPackageVersion(packageName, packagePath) { + let version; + if (packagePath) { + version = (await (0, utils_fs_1.readJSON)(packagePath)).version; + } + log_1.output.write(` ${packageName}: ${colors_1.default.weak(version || 'not installed')}\n`); +} +async function doctor(config, platformName) { + if (platformName === config.ios.name) { + await (0, doctor_2.doctorIOS)(config); + } + else if (platformName === config.android.name) { + await (0, doctor_1.doctorAndroid)(config); + } + else if (platformName === config.web.name) { + return Promise.resolve(); + } + else { + throw `Platform ${platformName} is not valid.`; + } +} +exports.doctor = doctor; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/init.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/init.js new file mode 100644 index 00000000..d15150aa --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/init.js @@ -0,0 +1,143 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.initCommand = void 0; +const tslib_1 = require("tslib"); +const open_1 = tslib_1.__importDefault(require("open")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const config_1 = require("../config"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const framework_configs_1 = require("../framework-configs"); +const log_1 = require("../log"); +const sysconfig_1 = require("../sysconfig"); +const node_1 = require("../util/node"); +const term_1 = require("../util/term"); +async function initCommand(config, name, id, webDirFromCLI) { + var _a, _b, _c, _d; + try { + if (!(0, term_1.checkInteractive)(name, id)) { + return; + } + if (config.app.extConfigType !== 'json') { + (0, errors_1.fatal)(`Cannot run ${colors_1.default.input('init')} for a project using a non-JSON configuration file.\n` + + `Delete ${colors_1.default.strong(config.app.extConfigName)} and try again.`); + } + const isNewConfig = Object.keys(config.app.extConfig).length === 0; + const tsInstalled = !!(0, node_1.resolveNode)(config.app.rootDir, 'typescript'); + const appName = await getName(config, name); + const appId = await getAppId(config, id); + const webDir = (0, term_1.isInteractive)() + ? await getWebDir(config, webDirFromCLI) + : (_a = webDirFromCLI !== null && webDirFromCLI !== void 0 ? webDirFromCLI : config.app.extConfig.webDir) !== null && _a !== void 0 ? _a : 'www'; + await (0, common_1.check)([ + () => (0, common_1.checkAppName)(config, appName), + () => (0, common_1.checkAppId)(config, appId), + ]); + const androidScheme = (_c = (_b = config.app.extConfig.server) === null || _b === void 0 ? void 0 : _b.androidScheme) !== null && _c !== void 0 ? _c : 'https'; + const cordova = await (0, cordova_1.getCordovaPreferences)(config); + await runMergeConfig(config, { + appId, + appName, + webDir, + server: { + androidScheme: androidScheme, + }, + cordova, + }, isNewConfig && tsInstalled ? 'ts' : 'json'); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + log_1.output.write('Usage: npx cap init appName appId\n' + + 'Example: npx cap init "My App" "com.example.myapp"\n\n'); + (0, errors_1.fatal)((_d = e.stack) !== null && _d !== void 0 ? _d : e); + } + throw e; + } +} +exports.initCommand = initCommand; +async function getName(config, name) { + var _a; + if (!name) { + const answers = await (0, log_1.logPrompt)(`${colors_1.default.strong(`What is the name of your app?`)}\n` + + `This should be a human-friendly app name, like what you'd see in the App Store.`, { + type: 'text', + name: 'name', + message: `Name`, + initial: config.app.appName + ? config.app.appName + : (_a = config.app.package.name) !== null && _a !== void 0 ? _a : 'App', + }); + return answers.name; + } + return name; +} +async function getAppId(config, id) { + if (!id) { + const answers = await (0, log_1.logPrompt)(`${colors_1.default.strong(`What should be the Package ID for your app?`)}\n` + + `Package IDs (aka Bundle ID in iOS and Application ID in Android) are unique identifiers for apps. They must be in reverse domain name notation, generally representing a domain name that you or your company owns.`, { + type: 'text', + name: 'id', + message: `Package ID`, + initial: config.app.appId ? config.app.appId : 'com.example.app', + }); + return answers.id; + } + return id; +} +async function getWebDir(config, webDir) { + if (!webDir) { + const framework = (0, framework_configs_1.detectFramework)(config); + if (framework === null || framework === void 0 ? void 0 : framework.webDir) { + return framework.webDir; + } + const answers = await (0, log_1.logPrompt)(`${colors_1.default.strong(`What is the web asset directory for your app?`)}\n` + + `This directory should contain the final ${colors_1.default.strong('index.html')} of your app.`, { + type: 'text', + name: 'webDir', + message: `Web asset directory`, + initial: config.app.webDir ? config.app.webDir : 'www', + }); + return answers.webDir; + } + return webDir; +} +async function runMergeConfig(config, extConfig, type) { + const configDirectory = (0, path_1.dirname)(config.app.extConfigFilePath); + const newConfigPath = (0, path_1.resolve)(configDirectory, type === 'ts' ? config_1.CONFIG_FILE_NAME_TS : config_1.CONFIG_FILE_NAME_JSON); + await (0, common_1.runTask)(`Creating ${colors_1.default.strong((0, path_1.basename)(newConfigPath))} in ${colors_1.default.input(config.app.rootDir)}`, async () => { + await mergeConfig(config, extConfig, newConfigPath); + }); + printNextSteps((0, path_1.basename)(newConfigPath)); + if ((0, term_1.isInteractive)()) { + let sysconfig = await (0, sysconfig_1.readConfig)(); + if (typeof sysconfig.signup === 'undefined') { + const signup = await promptToSignup(); + sysconfig = { ...sysconfig, signup }; + await (0, sysconfig_1.writeConfig)(sysconfig); + } + } +} +async function mergeConfig(config, extConfig, newConfigPath) { + const oldConfig = { ...config.app.extConfig }; + const newConfig = { ...oldConfig, ...extConfig }; + await (0, config_1.writeConfig)(newConfig, newConfigPath); +} +function printNextSteps(newConfigName) { + (0, log_1.logSuccess)(`${colors_1.default.strong(newConfigName)} created!`); + log_1.output.write(`\nNext steps: \n${colors_1.default.strong(`https://capacitorjs.com/docs/getting-started#where-to-go-next`)}\n`); +} +async function promptToSignup() { + const answers = await (0, log_1.logPrompt)(`Join the Ionic Community! 💙\n` + + `Connect with millions of developers on the Ionic Forum and get access to live events, news updates, and more.`, { + type: 'confirm', + name: 'create', + message: `Create free Ionic account?`, + initial: true, + }); + if (answers.create) { + (0, open_1.default)(`http://ionicframework.com/signup?source=capacitor`); + } + return answers.create; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/list.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/list.js new file mode 100644 index 00000000..a8f05fa1 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/list.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.list = exports.listCommand = void 0; +const tslib_1 = require("tslib"); +const common_1 = require("../android/common"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_2 = require("../common"); +const errors_1 = require("../errors"); +const common_3 = require("../ios/common"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const promise_1 = require("../util/promise"); +async function listCommand(config, selectedPlatformName) { + var _a; + const platforms = await (0, common_2.selectPlatforms)(config, selectedPlatformName); + try { + await (0, promise_1.allSerial)(platforms.map(platformName => () => list(config, platformName))); + } + catch (e) { + if ((0, errors_1.isFatal)(e)) { + throw e; + } + log_1.logger.error((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } +} +exports.listCommand = listCommand; +async function list(config, platform) { + const allPlugins = await (0, plugin_1.getPlugins)(config, platform); + let plugins = []; + if (platform === config.ios.name) { + plugins = await (0, common_3.getIOSPlugins)(allPlugins); + } + else if (platform === config.android.name) { + plugins = await (0, common_1.getAndroidPlugins)(allPlugins); + } + else if (platform === config.web.name) { + log_1.logger.info(`Listing plugins for ${colors_1.default.input(platform)} is not possible.`); + return; + } + else { + throw `Platform ${colors_1.default.input(platform)} is not valid.`; + } + const capacitorPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 0 /* PluginType.Core */); + (0, plugin_1.printPlugins)(capacitorPlugins, platform); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + (0, plugin_1.printPlugins)(cordovaPlugins, platform, 'cordova'); + const incompatibleCordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 2 /* PluginType.Incompatible */); + (0, plugin_1.printPlugins)(incompatibleCordovaPlugins, platform, 'incompatible'); +} +exports.list = list; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/migrate.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/migrate.js new file mode 100644 index 00000000..ecdc574d --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/migrate.js @@ -0,0 +1,611 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.patchOldCapacitorPlugins = exports.migrateCommand = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const rimraf_1 = tslib_1.__importDefault(require("rimraf")); +const common_1 = require("../android/common"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_2 = require("../common"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const fs_1 = require("../util/fs"); +const node_1 = require("../util/node"); +const subprocess_1 = require("../util/subprocess"); +const template_1 = require("../util/template"); +// eslint-disable-next-line prefer-const +let allDependencies = {}; +const libs = [ + '@capacitor/core', + '@capacitor/cli', + '@capacitor/ios', + '@capacitor/android', +]; +const plugins = [ + '@capacitor/action-sheet', + '@capacitor/app', + '@capacitor/app-launcher', + '@capacitor/browser', + '@capacitor/camera', + '@capacitor/clipboard', + '@capacitor/device', + '@capacitor/dialog', + '@capacitor/filesystem', + '@capacitor/geolocation', + '@capacitor/google-maps', + '@capacitor/haptics', + '@capacitor/keyboard', + '@capacitor/local-notifications', + '@capacitor/motion', + '@capacitor/network', + '@capacitor/preferences', + '@capacitor/push-notifications', + '@capacitor/screen-reader', + '@capacitor/screen-orientation', + '@capacitor/share', + '@capacitor/splash-screen', + '@capacitor/status-bar', + '@capacitor/text-zoom', + '@capacitor/toast', +]; +const coreVersion = '^5.0.0'; +const pluginVersion = '^5.0.0'; +const gradleVersion = '8.0.2'; +let installFailed = false; +async function migrateCommand(config, noprompt, packagemanager) { + if (config === null) { + (0, errors_1.fatal)('Config data missing'); + } + const capMajor = await checkCapacitorMajorVersion(config); + if (capMajor < 4) { + (0, errors_1.fatal)('Migrate can only be used on capacitor 4 and above, please use the CLI in Capacitor 4 to upgrade to 4 first'); + } + const jdkMajor = await (0, common_2.checkJDKMajorVersion)(); + if (jdkMajor < 17) { + log_1.logger.warn('Capacitor 5 requires JDK 17 or higher. Some steps may fail.'); + } + const variablesAndClasspaths = await getAndroidVariablesAndClasspaths(config); + if (!variablesAndClasspaths) { + (0, errors_1.fatal)('Variable and Classpath info could not be read.'); + } + allDependencies = { + ...config.app.package.dependencies, + ...config.app.package.devDependencies, + }; + const monorepoWarning = 'Please note this tool is not intended for use in a mono-repo enviroment, please check out the Ionic vscode extension for this functionality.'; + log_1.logger.info(monorepoWarning); + const { migrateconfirm } = noprompt + ? { migrateconfirm: 'y' } + : await (0, log_1.logPrompt)(`Capacitor 5 sets a deployment target of iOS 13 and Android 13 (SDK 33). \n`, { + type: 'text', + name: 'migrateconfirm', + message: `Are you sure you want to migrate? (Y/n)`, + initial: 'y', + }); + if (typeof migrateconfirm === 'string' && + migrateconfirm.toLowerCase() === 'y') { + try { + const { depInstallConfirm } = noprompt + ? { depInstallConfirm: 'y' } + : await (0, log_1.logPrompt)(`Would you like the migrator to run npm, yarn, or pnpm install to install the latest versions of capacitor packages? (Those using other package managers should answer N)`, { + type: 'text', + name: 'depInstallConfirm', + message: `Run Dependency Install? (Y/n)`, + initial: 'y', + }); + const runNpmInstall = typeof depInstallConfirm === 'string' && + depInstallConfirm.toLowerCase() === 'y'; + let installerType = 'npm'; + if (runNpmInstall) { + const { manager } = packagemanager + ? { manager: packagemanager } + : await (0, log_1.logPrompt)('What dependency manager do you use?', { + type: 'select', + name: 'manager', + message: `Dependency Management Tool`, + choices: [ + { title: 'NPM', value: 'npm' }, + { title: 'Yarn', value: 'yarn' }, + { title: 'PNPM', value: 'pnpm' }, + ], + initial: 0, + }); + installerType = manager; + } + try { + await (0, common_2.runTask)(`Installing Latest Modules using ${installerType}.`, () => { + return installLatestLibs(installerType, runNpmInstall, config); + }); + } + catch (ex) { + log_1.logger.error(`${installerType} install failed. Try deleting node_modules folder and running ${colors_1.default.input(`${installerType} install --force`)} manually.`); + installFailed = true; + } + // Update iOS Projects + if (allDependencies['@capacitor/ios'] && + (0, utils_fs_1.existsSync)(config.ios.platformDirAbs)) { + //Update icon to single 1024 x 1024 icon + await (0, common_2.runTask)('Update App Icon to only 1024 x 1024', () => { + return updateAppIcons(config); + }); + //Remove Podfile.lock from .gitignore + await (0, common_2.runTask)('Remove Podfile.lock from iOS .gitignore', () => { + return updateIosGitIgnore((0, path_1.join)(config.ios.platformDirAbs, '.gitignore')); + }); + } + if (allDependencies['@capacitor/android'] && + (0, utils_fs_1.existsSync)(config.android.platformDirAbs)) { + await (0, common_2.runTask)(`Migrating build.gradle file.`, () => { + return updateBuildGradle((0, path_1.join)(config.android.platformDirAbs, 'build.gradle'), variablesAndClasspaths); + }); + // Remove enableJetifier + await (0, common_2.runTask)('Remove android.enableJetifier=true from gradle.properties', () => { + return updateGradleProperties((0, path_1.join)(config.android.platformDirAbs, 'gradle.properties')); + }); + // Move package from android manifest + await (0, common_2.runTask)('Migrating package from Manifest to build.gradle', () => { + return movePackageFromManifestToBuildGradle((0, path_1.join)(config.android.platformDirAbs, 'app', 'src', 'main', 'AndroidManifest.xml'), (0, path_1.join)(config.android.platformDirAbs, 'app', 'build.gradle')); + }); + // Update gradle-wrapper.properties + await (0, common_2.runTask)(`Migrating gradle-wrapper.properties by updating gradle version to ${gradleVersion}.`, () => { + return updateGradleWrapper((0, path_1.join)(config.android.platformDirAbs, 'gradle', 'wrapper', 'gradle-wrapper.properties')); + }); + // Variables gradle + await (0, common_2.runTask)(`Migrating variables.gradle file.`, () => { + return (async () => { + const variablesPath = (0, path_1.join)(config.android.platformDirAbs, 'variables.gradle'); + let txt = readFile(variablesPath); + if (!txt) { + return; + } + txt = txt.replace(/= {2}'/g, `= '`); + (0, utils_fs_1.writeFileSync)(variablesPath, txt, { encoding: 'utf-8' }); + for (const variable of Object.keys(variablesAndClasspaths.variables)) { + if (!(await updateFile(config, variablesPath, `${variable} = '`, `'`, variablesAndClasspaths.variables[variable].toString(), true))) { + const didWork = await updateFile(config, variablesPath, `${variable} = `, `\n`, variablesAndClasspaths.variables[variable].toString(), true); + if (!didWork) { + let file = readFile(variablesPath); + if (file) { + file = file.replace('}', ` ${variable} = '${variablesAndClasspaths.variables[variable].toString()}'\n}`); + (0, utils_fs_1.writeFileSync)(variablesPath, file); + } + } + } + } + const pluginVariables = { + firebaseMessagingVersion: '23.1.2', + playServicesLocationVersion: '21.0.1', + androidxBrowserVersion: '1.5.0', + androidxMaterialVersion: '1.8.0', + androidxExifInterfaceVersion: '1.3.6', + androidxCoreKTXVersion: '1.10.0', + googleMapsPlayServicesVersion: '18.1.0', + googleMapsUtilsVersion: '3.4.0', + googleMapsKtxVersion: '3.4.0', + googleMapsUtilsKtxVersion: '3.4.0', + kotlinxCoroutinesVersion: '1.6.4', + }; + for (const variable of Object.keys(pluginVariables)) { + await updateFile(config, variablesPath, `${variable} = '`, `'`, pluginVariables[variable], true); + } + })(); + }); + rimraf_1.default.sync((0, path_1.join)(config.android.appDirAbs, 'build')); + if (!installFailed) { + await (0, common_2.runTask)('Migrating package from Manifest to build.gradle in Capacitor plugins', () => { + return patchOldCapacitorPlugins(config); + }); + } + else { + log_1.logger.warn('Skipped migrating package from Manifest to build.gradle in Capacitor plugins'); + } + } + if (!installFailed) { + // Run Cap Sync + await (0, common_2.runTask)(`Running cap sync.`, () => { + return (0, subprocess_1.getCommandOutput)('npx', ['cap', 'sync']); + }); + } + else { + log_1.logger.warn('Skipped Running cap sync.'); + } + if (allDependencies['@capacitor/android'] && + (0, utils_fs_1.existsSync)(config.android.platformDirAbs)) { + if (!installFailed) { + try { + await (0, common_2.runTask)(`Upgrading gradle wrapper files`, () => { + return updateGradleWrapperFiles(config.android.platformDirAbs); + }); + } + catch (e) { + if (e.includes('EACCES')) { + log_1.logger.error(`gradlew file does not have executable permissions. This can happen if the Android platform was added on a Windows machine. Please run ${colors_1.default.input(`chmod +x ./${config.android.platformDir}/gradlew`)} and ${colors_1.default.input(`cd ${config.android.platformDir} && ./gradlew wrapper --distribution-type all --gradle-version ${gradleVersion} --warning-mode all`)} to update the files manually`); + } + else { + log_1.logger.error(`gradle wrapper files were not updated`); + } + } + } + else { + log_1.logger.warn('Skipped upgrading gradle wrapper files'); + } + } + // Write all breaking changes + await (0, common_2.runTask)(`Writing breaking changes.`, () => { + return writeBreakingChanges(); + }); + if (!installFailed) { + (0, log_1.logSuccess)(`Migration to Capacitor ${coreVersion} is complete. Run and test your app!`); + } + else { + log_1.logger.warn(`Migration to Capacitor ${coreVersion} is incomplete. Check the log messages for more information.`); + } + } + catch (err) { + (0, errors_1.fatal)(`Failed to migrate: ${err}`); + } + } + else { + (0, errors_1.fatal)(`User canceled migration.`); + } +} +exports.migrateCommand = migrateCommand; +async function checkCapacitorMajorVersion(config) { + var _a; + const capacitorVersion = await (0, common_2.getCoreVersion)(config); + const versionArray = (_a = capacitorVersion.match(/([0-9]+)\.([0-9]+)\.([0-9]+)/)) !== null && _a !== void 0 ? _a : []; + const majorVersion = parseInt(versionArray[1]); + return majorVersion; +} +async function installLatestLibs(dependencyManager, runInstall, config) { + const pkgJsonPath = (0, path_1.join)(config.app.rootDir, 'package.json'); + const pkgJsonFile = readFile(pkgJsonPath); + if (!pkgJsonFile) { + return; + } + const pkgJson = JSON.parse(pkgJsonFile); + for (const devDepKey of Object.keys(pkgJson['devDependencies'] || {})) { + if (libs.includes(devDepKey)) { + pkgJson['devDependencies'][devDepKey] = coreVersion; + } + else if (plugins.includes(devDepKey)) { + pkgJson['devDependencies'][devDepKey] = pluginVersion; + } + } + for (const depKey of Object.keys(pkgJson['dependencies'] || {})) { + if (libs.includes(depKey)) { + pkgJson['dependencies'][depKey] = coreVersion; + } + else if (plugins.includes(depKey)) { + pkgJson['dependencies'][depKey] = pluginVersion; + } + } + (0, utils_fs_1.writeFileSync)(pkgJsonPath, JSON.stringify(pkgJson, null, 2), { + encoding: 'utf-8', + }); + if (runInstall) { + rimraf_1.default.sync((0, path_1.join)(config.app.rootDir, 'node_modules/@capacitor/!(cli)')); + await (0, subprocess_1.runCommand)(dependencyManager, ['install']); + if (dependencyManager == 'yarn') { + await (0, subprocess_1.runCommand)(dependencyManager, ['upgrade']); + } + else { + await (0, subprocess_1.runCommand)(dependencyManager, ['update']); + } + } + else { + log_1.logger.info(`Please run an install command with your package manager of choice. (ex: yarn install)`); + } +} +async function writeBreakingChanges() { + const breaking = [ + '@capacitor/camera', + '@capacitor/device', + '@capacitor/local-notifications', + '@capacitor/push-notifications', + ]; + const broken = []; + for (const lib of breaking) { + if (allDependencies[lib]) { + broken.push(lib); + } + } + if (broken.length > 0) { + log_1.logger.info(`IMPORTANT: Review https://capacitorjs.com/docs/updating/5-0#plugins for breaking changes in these plugins that you use: ${broken.join(', ')}.`); + } +} +async function getAndroidVariablesAndClasspaths(config) { + const tempAndroidTemplateFolder = (0, path_1.join)(config.cli.assetsDirAbs, 'tempAndroidTemplate'); + await (0, template_1.extractTemplate)(config.cli.assets.android.platformTemplateArchiveAbs, tempAndroidTemplateFolder); + const variablesGradleFile = readFile((0, path_1.join)(tempAndroidTemplateFolder, 'variables.gradle')); + const buildGradleFile = readFile((0, path_1.join)(tempAndroidTemplateFolder, 'build.gradle')); + if (!variablesGradleFile || !buildGradleFile) { + return; + } + (0, fs_1.deleteFolderRecursive)(tempAndroidTemplateFolder); + const firstIndxOfCATBGV = buildGradleFile.indexOf(`classpath 'com.android.tools.build:gradle:`) + 42; + const firstIndxOfCGGGS = buildGradleFile.indexOf(`com.google.gms:google-services:`) + 31; + const comAndroidToolsBuildGradleVersion = '' + + buildGradleFile.substring(firstIndxOfCATBGV, buildGradleFile.indexOf("'", firstIndxOfCATBGV)); + const comGoogleGmsGoogleServices = '' + + buildGradleFile.substring(firstIndxOfCGGGS, buildGradleFile.indexOf("'", firstIndxOfCGGGS)); + const variablesGradleAsJSON = JSON.parse(variablesGradleFile + .replace('ext ', '') + .replace(/=/g, ':') + .replace(/\n/g, ',') + .replace(/,([^:]+):/g, function (_k, p1) { + return `,"${p1}":`; + }) + .replace('{,', '{') + .replace(',}', '}') + .replace(/\s/g, '') + .replace(/'/g, '"')); + return { + 'variables': variablesGradleAsJSON, + 'com.android.tools.build:gradle': comAndroidToolsBuildGradleVersion, + 'com.google.gms:google-services': comGoogleGmsGoogleServices, + }; +} +function readFile(filename) { + try { + if (!(0, utils_fs_1.existsSync)(filename)) { + log_1.logger.error(`Unable to find ${filename}. Try updating it manually`); + return; + } + return (0, utils_fs_1.readFileSync)(filename, 'utf-8'); + } + catch (err) { + log_1.logger.error(`Unable to read ${filename}. Verify it is not already open. ${err}`); + } +} +async function updateGradleWrapper(filename) { + const txt = readFile(filename); + if (!txt) { + return; + } + const replaced = setAllStringIn(txt, 'distributionUrl=', '\n', + // eslint-disable-next-line no-useless-escape + `https\\://services.gradle.org/distributions/gradle-${gradleVersion}-all.zip`); + (0, utils_fs_1.writeFileSync)(filename, replaced, 'utf-8'); +} +async function updateGradleWrapperFiles(platformDir) { + await (0, subprocess_1.runCommand)(`./gradlew`, [ + 'wrapper', + '--distribution-type', + 'all', + '--gradle-version', + gradleVersion, + '--warning-mode', + 'all', + ], { + cwd: platformDir, + }); +} +async function updateIosGitIgnore(filename) { + const txt = readFile(filename); + if (!txt) { + return; + } + const lines = txt.split('\n'); + let linesToKeep = ''; + for (const line of lines) { + // check for enableJetifier + const podfileMatch = line.match(/.+Podfile\.lock/) || []; + if (podfileMatch.length == 0) { + linesToKeep += line + '\n'; + } + } + (0, utils_fs_1.writeFileSync)(filename, linesToKeep, { encoding: 'utf-8' }); +} +async function updateAppIcons(config) { + const iconToKeep = 'AppIcon-512@2x.png'; + const contentsFile = 'Contents.json'; + const newContentsFileContents = `{ + "images" : [ + { + "filename" : "${iconToKeep}", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +}`; + const path = (0, path_1.join)(config.ios.platformDirAbs, 'App', 'App', 'Assets.xcassets', 'AppIcon.appiconset'); + if (!(0, utils_fs_1.existsSync)(path)) { + log_1.logger.error(`Unable to find ${path}. Try updating it manually`); + return; + } + if (!(0, utils_fs_1.existsSync)((0, path_1.join)(path, iconToKeep))) { + log_1.logger.error(`Unable to find ${iconToKeep}. Try updating it manually`); + return; + } + if (!(0, utils_fs_1.existsSync)((0, path_1.join)(path, contentsFile))) { + log_1.logger.error(`Unable to find ${path}. Try updating it manually`); + return; + } + const filenames = (0, utils_fs_1.readdirSync)(path); + for (const filename of filenames) { + if (filename != iconToKeep && filename != contentsFile) { + (0, utils_fs_1.removeSync)((0, path_1.join)(path, filename)); + } + } + (0, utils_fs_1.writeFileSync)((0, path_1.join)(path, contentsFile), newContentsFileContents); +} +async function updateGradleProperties(filename) { + const txt = readFile(filename); + if (!txt) { + return; + } + const lines = txt.split('\n'); + let linesToKeep = ''; + for (const line of lines) { + // check for enableJetifier + const jetifierMatch = line.match(/android\.enableJetifier\s*=\s*true/) || []; + const commentMatch = line.match(/# Automatically convert third-party libraries to use AndroidX/) || []; + if (jetifierMatch.length == 0 && commentMatch.length == 0) { + linesToKeep += line + '\n'; + } + } + (0, utils_fs_1.writeFileSync)(filename, linesToKeep, { encoding: 'utf-8' }); +} +async function movePackageFromManifestToBuildGradle(manifestFilename, buildGradleFilename) { + const manifestText = readFile(manifestFilename); + const buildGradleText = readFile(buildGradleFilename); + if (!manifestText) { + log_1.logger.error(`Could not read ${manifestFilename}. Check its permissions and if it exists.`); + return; + } + if (!buildGradleText) { + log_1.logger.error(`Could not read ${buildGradleFilename}. Check its permissions and if it exists.`); + return; + } + const namespaceExists = new RegExp(/\s+namespace\s+/).test(buildGradleText); + if (namespaceExists) { + log_1.logger.error('Found namespace in build.gradle already, skipping migration'); + return; + } + let packageName; + const manifestRegEx = new RegExp(/package="([^"]+)"/); + const manifestResults = manifestRegEx.exec(manifestText); + if (manifestResults === null) { + log_1.logger.error(`Unable to update Android Manifest. Package not found.`); + return; + } + else { + packageName = manifestResults[1]; + } + let manifestReplaced = manifestText; + manifestReplaced = manifestReplaced.replace(manifestRegEx, ''); + if (manifestText == manifestReplaced) { + log_1.logger.error(`Unable to update Android Manifest: no changes were detected in Android Manifest file`); + return; + } + let buildGradleReplaced = buildGradleText; + buildGradleReplaced = setAllStringIn(buildGradleText, 'android {', '\n', `\n namespace "${packageName}"`); + if (buildGradleText == buildGradleReplaced) { + log_1.logger.error(`Unable to update buildGradleText: no changes were detected in Android Manifest file`); + return; + } + (0, utils_fs_1.writeFileSync)(manifestFilename, manifestReplaced, 'utf-8'); + (0, utils_fs_1.writeFileSync)(buildGradleFilename, buildGradleReplaced, 'utf-8'); +} +async function updateBuildGradle(filename, variablesAndClasspaths) { + // In build.gradle add dependencies: + // classpath 'com.android.tools.build:gradle:8.0.0' + // classpath 'com.google.gms:google-services:4.3.15' + const txt = readFile(filename); + if (!txt) { + return; + } + const neededDeps = { + 'com.android.tools.build:gradle': variablesAndClasspaths['com.android.tools.build:gradle'], + 'com.google.gms:google-services': variablesAndClasspaths['com.google.gms:google-services'], + }; + let replaced = txt; + for (const dep of Object.keys(neededDeps)) { + if (replaced.includes(`classpath '${dep}`)) { + const semver = await Promise.resolve().then(() => tslib_1.__importStar(require('semver'))); + const firstIndex = replaced.indexOf(dep) + dep.length + 1; + const existingVersion = '' + replaced.substring(firstIndex, replaced.indexOf("'", firstIndex)); + if (semver.gte(neededDeps[dep], existingVersion)) { + replaced = setAllStringIn(replaced, `classpath '${dep}:`, `'`, neededDeps[dep]); + log_1.logger.info(`Set ${dep} = ${neededDeps[dep]}.`); + } + } + } + (0, utils_fs_1.writeFileSync)(filename, replaced, 'utf-8'); +} +async function updateFile(config, filename, textStart, textEnd, replacement, skipIfNotFound) { + if (config === null) { + return false; + } + const path = filename; + let txt = readFile(path); + if (!txt) { + return false; + } + if (txt.includes(textStart)) { + if (replacement) { + txt = setAllStringIn(txt, textStart, textEnd, replacement); + (0, utils_fs_1.writeFileSync)(path, txt, { encoding: 'utf-8' }); + } + else { + // Replacing in code so we need to count the number of brackets to find the end of the function in swift + const lines = txt.split('\n'); + let replaced = ''; + let keep = true; + let brackets = 0; + for (const line of lines) { + if (line.includes(textStart)) { + keep = false; + } + if (!keep) { + brackets += (line.match(/{/g) || []).length; + brackets -= (line.match(/}/g) || []).length; + if (brackets == 0) { + keep = true; + } + } + else { + replaced += line + '\n'; + } + } + (0, utils_fs_1.writeFileSync)(path, replaced, { encoding: 'utf-8' }); + } + return true; + } + else if (!skipIfNotFound) { + log_1.logger.error(`Unable to find "${textStart}" in ${filename}. Try updating it manually`); + } + return false; +} +function setAllStringIn(data, start, end, replacement) { + let position = 0; + let result = data; + let replaced = true; + while (replaced) { + const foundIdx = result.indexOf(start, position); + if (foundIdx == -1) { + replaced = false; + } + else { + const idx = foundIdx + start.length; + position = idx + replacement.length; + result = + result.substring(0, idx) + + replacement + + result.substring(result.indexOf(end, idx)); + } + } + return result; +} +async function patchOldCapacitorPlugins(config) { + const allPlugins = await (0, plugin_1.getPlugins)(config, 'android'); + const androidPlugins = await (0, common_1.getAndroidPlugins)(allPlugins); + return await Promise.all(androidPlugins.map(async (p) => { + var _a, _b; + if ((_b = (_a = p.manifest) === null || _a === void 0 ? void 0 : _a.android) === null || _b === void 0 ? void 0 : _b.src) { + const buildGradlePath = (0, node_1.resolveNode)(config.app.rootDir, p.id, p.manifest.android.src, 'build.gradle'); + const manifestPath = (0, node_1.resolveNode)(config.app.rootDir, p.id, p.manifest.android.src, 'src', 'main', 'AndroidManifest.xml'); + if (buildGradlePath && manifestPath) { + const gradleContent = readFile(buildGradlePath); + if (!(gradleContent === null || gradleContent === void 0 ? void 0 : gradleContent.includes('namespace'))) { + if (plugins.includes(p.id)) { + log_1.logger.warn(`You are using an outdated version of ${p.id}, update the plugin to version ${pluginVersion}`); + } + else { + log_1.logger.warn(`${p.id}@${p.version} doesn't officially support Capacitor ${coreVersion} yet, doing our best moving it's package to build.gradle so it builds`); + } + movePackageFromManifestToBuildGradle(manifestPath, buildGradlePath); + } + } + } + })); +} +exports.patchOldCapacitorPlugins = patchOldCapacitorPlugins; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/new-plugin.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/new-plugin.js new file mode 100644 index 00000000..5dd5f53e --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/new-plugin.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.newPluginCommand = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +async function newPluginCommand() { + (0, errors_1.fatal)(`The plugin:generate command has been removed.\n` + + `Use ${colors_1.default.input('npm init @capacitor/plugin')}`); +} +exports.newPluginCommand = newPluginCommand; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/open.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/open.js new file mode 100644 index 00000000..58f928b6 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/open.js @@ -0,0 +1,62 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.open = exports.openCommand = void 0; +const tslib_1 = require("tslib"); +const open_1 = require("../android/open"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const open_2 = require("../ios/open"); +const log_1 = require("../log"); +async function openCommand(config, selectedPlatformName) { + var _a; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_1.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_1.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:open'); + } + else { + log_1.logger.error(`Platform ${colors_1.default.input(selectedPlatformName)} not found.`); + } + } + else { + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + let platformName; + if (platforms.length === 1) { + platformName = platforms[0]; + } + else { + platformName = await (0, common_1.promptForPlatform)(platforms.filter(createOpenablePlatformFilter(config)), `Please choose a platform to open:`); + } + try { + await open(config, platformName); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } + } +} +exports.openCommand = openCommand; +function createOpenablePlatformFilter(config) { + return platform => platform === config.ios.name || platform === config.android.name; +} +async function open(config, platformName) { + if (platformName === config.ios.name) { + await (0, common_1.runTask)('Opening the Xcode workspace...', () => { + return (0, open_2.openIOS)(config); + }); + } + else if (platformName === config.android.name) { + return (0, open_1.openAndroid)(config); + } + else if (platformName === config.web.name) { + return Promise.resolve(); + } + else { + throw `Platform ${platformName} is not valid.`; + } +} +exports.open = open; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/run.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/run.js new file mode 100644 index 00000000..12b83b2a --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/run.js @@ -0,0 +1,114 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.run = exports.runCommand = void 0; +const tslib_1 = require("tslib"); +const utils_process_1 = require("@ionic/utils-process"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const run_1 = require("../android/run"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const run_2 = require("../ios/run"); +const log_1 = require("../log"); +const livereload_1 = require("../util/livereload"); +const native_run_1 = require("../util/native-run"); +const sync_1 = require("./sync"); +async function runCommand(config, selectedPlatformName, options) { + var _a, _b, _c, _d; + options.host = + (_b = (_a = options.host) !== null && _a !== void 0 ? _a : livereload_1.CapLiveReloadHelper.getIpAddress()) !== null && _b !== void 0 ? _b : 'localhost'; + options.port = (_c = options.port) !== null && _c !== void 0 ? _c : '3000'; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_1.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_1.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:run'); + } + else { + log_1.logger.error(`Platform ${colors_1.default.input(selectedPlatformName)} not found.`); + } + } + else { + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + let platformName; + if (platforms.length === 1) { + platformName = platforms[0]; + } + else { + platformName = await (0, common_1.promptForPlatform)(platforms.filter(createRunnablePlatformFilter(config)), `Please choose a platform to run:`); + } + if (options.list) { + const targets = await (0, native_run_1.getPlatformTargets)(platformName); + const outputTargets = targets.map(t => { + var _a; + return ({ + name: (0, common_1.getPlatformTargetName)(t), + api: `${t.platform === 'ios' ? 'iOS' : 'API'} ${t.sdkVersion}`, + id: (_a = t.id) !== null && _a !== void 0 ? _a : '?', + }); + }); + // TODO: make hidden commander option (https://github.com/tj/commander.js/issues/1106) + if (process.argv.includes('--json')) { + process.stdout.write(`${JSON.stringify(outputTargets)}\n`); + } + else { + const rows = outputTargets.map(t => [t.name, t.api, t.id]); + log_1.output.write(`${(0, utils_terminal_1.columnar)(rows, { + headers: ['Name', 'API', 'Target ID'], + vsep: ' ', + })}\n`); + } + return; + } + try { + if (options.sync) { + await (0, sync_1.sync)(config, platformName, false, true); + } + const cordovaPlugins = await (0, cordova_1.getCordovaPlugins)(config, platformName); + if (options.liveReload) { + await livereload_1.CapLiveReloadHelper.editCapConfigForLiveReload(config, platformName, options); + if (platformName === config.android.name) { + await await (0, cordova_1.writeCordovaAndroidManifest)(cordovaPlugins, config, platformName, true); + } + } + await run(config, platformName, options); + if (options.liveReload) { + new Promise(resolve => process.on('SIGINT', resolve)) + .then(async () => { + await livereload_1.CapLiveReloadHelper.revertCapConfigForLiveReload(); + if (platformName === config.android.name) { + await (0, cordova_1.writeCordovaAndroidManifest)(cordovaPlugins, config, platformName, false); + } + }) + .then(() => process.exit()); + log_1.logger.info(`App running with live reload listing for: http://${options.host}:${options.port}. Press Ctrl+C to quit.`); + await (0, utils_process_1.sleepForever)(); + } + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_d = e.stack) !== null && _d !== void 0 ? _d : e); + } + throw e; + } + } +} +exports.runCommand = runCommand; +async function run(config, platformName, options) { + if (platformName == config.ios.name) { + await (0, run_2.runIOS)(config, options); + } + else if (platformName === config.android.name) { + await (0, run_1.runAndroid)(config, options); + } + else if (platformName === config.web.name) { + return; + } + else { + throw `Platform ${platformName} is not valid.`; + } +} +exports.run = run; +function createRunnablePlatformFilter(config) { + return platform => platform === config.ios.name || platform === config.android.name; +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/serve.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/serve.js new file mode 100644 index 00000000..bad369f9 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/serve.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.serveCommand = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +async function serveCommand() { + (0, errors_1.fatal)(`The serve command has been removed.\n` + + `Use a third-party tool for serving single page apps, such as ${colors_1.default.strong('serve')}: ${colors_1.default.strong('https://www.npmjs.com/package/serve')}`); +} +exports.serveCommand = serveCommand; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/sourcemaps.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/sourcemaps.js new file mode 100644 index 00000000..a4396f4d --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/sourcemaps.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.inlineSourceMaps = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const log_1 = require("../log"); +function walkDirectory(dirPath) { + const files = (0, utils_fs_1.readdirSync)(dirPath); + files.forEach(file => { + const targetFile = (0, path_1.join)(dirPath, file); + if ((0, utils_fs_1.existsSync)(targetFile) && (0, utils_fs_1.lstatSync)(targetFile).isDirectory()) { + walkDirectory(targetFile); + } + else { + const mapFile = (0, path_1.join)(dirPath, `${file}.map`); + if ((0, path_1.extname)(file) === '.js' && (0, utils_fs_1.existsSync)(mapFile)) { + const bufMap = (0, utils_fs_1.readFileSync)(mapFile).toString('base64'); + const bufFile = (0, utils_fs_1.readFileSync)(targetFile, 'utf8'); + const result = bufFile.replace(`sourceMappingURL=${file}.map`, 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + + bufMap); + (0, utils_fs_1.writeFileSync)(targetFile, result); + (0, utils_fs_1.unlinkSync)(mapFile); + } + } + }); +} +async function inlineSourceMaps(config, platformName) { + let buildDir = ''; + if (platformName == config.ios.name) { + buildDir = await config.ios.webDirAbs; + } + if (platformName == config.android.name) { + buildDir = await config.android.webDirAbs; + } + if (buildDir) { + log_1.logger.info('Inlining sourcemaps'); + walkDirectory(buildDir); + } +} +exports.inlineSourceMaps = inlineSourceMaps; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/sync.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/sync.js new file mode 100644 index 00000000..4e1fb86c --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/sync.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sync = exports.syncCommand = void 0; +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const promise_1 = require("../util/promise"); +const copy_1 = require("./copy"); +const update_1 = require("./update"); +/** + * Sync is a copy and an update in one. + */ +async function syncCommand(config, selectedPlatformName, deployment, inline = false) { + var _a, _b; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + try { + await (0, copy_1.copyCommand)(config, selectedPlatformName, inline); + } + catch (e) { + log_1.logger.error((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + await (0, update_1.updateCommand)(config, selectedPlatformName, deployment); + } + else { + const then = +new Date(); + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + try { + await (0, common_1.check)([ + () => (0, common_1.checkPackage)(), + () => (0, common_1.checkWebDir)(config), + ...(0, update_1.updateChecks)(config, platforms), + ]); + await (0, promise_1.allSerial)(platforms.map(platformName => () => sync(config, platformName, deployment, inline))); + const now = +new Date(); + const diff = (now - then) / 1000; + log_1.logger.info(`Sync finished in ${diff}s`); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_b = e.stack) !== null && _b !== void 0 ? _b : e); + } + throw e; + } + } +} +exports.syncCommand = syncCommand; +async function sync(config, platformName, deployment, inline = false) { + var _a; + await (0, common_1.runPlatformHook)(config, platformName, config.app.rootDir, 'capacitor:sync:before'); + try { + await (0, copy_1.copy)(config, platformName, inline); + } + catch (e) { + log_1.logger.error((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + await (0, update_1.update)(config, platformName, deployment); + await (0, common_1.runPlatformHook)(config, platformName, config.app.rootDir, 'capacitor:sync:after'); +} +exports.sync = sync; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/telemetry.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/telemetry.js new file mode 100644 index 00000000..e1d4d035 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/telemetry.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.telemetryCommand = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const sysconfig_1 = require("../sysconfig"); +const telemetry_1 = require("../telemetry"); +async function telemetryCommand(onOrOff) { + const sysconfig = await (0, sysconfig_1.readConfig)(); + const enabled = interpretEnabled(onOrOff); + if (typeof enabled === 'boolean') { + if (sysconfig.telemetry === enabled) { + log_1.logger.info(`Telemetry is already ${colors_1.default.strong(enabled ? 'on' : 'off')}`); + } + else { + await (0, sysconfig_1.writeConfig)({ ...sysconfig, telemetry: enabled }); + (0, log_1.logSuccess)(`You have ${colors_1.default.strong(`opted ${enabled ? 'in' : 'out'}`)} ${enabled ? 'for' : 'of'} telemetry on this machine.`); + if (enabled) { + log_1.output.write(telemetry_1.THANK_YOU); + } + } + } + else { + log_1.logger.info(`Telemetry is ${colors_1.default.strong(sysconfig.telemetry ? 'on' : 'off')}`); + } +} +exports.telemetryCommand = telemetryCommand; +function interpretEnabled(onOrOff) { + switch (onOrOff) { + case 'on': + return true; + case 'off': + return false; + case undefined: + return undefined; + } + (0, errors_1.fatal)(`Argument must be ${colors_1.default.strong('on')} or ${colors_1.default.strong('off')} (or left unspecified)`); +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/update.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/update.js new file mode 100644 index 00000000..bbddf697 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/tasks/update.js @@ -0,0 +1,74 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.update = exports.updateChecks = exports.updateCommand = void 0; +const tslib_1 = require("tslib"); +const update_1 = require("../android/update"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const common_2 = require("../ios/common"); +const update_2 = require("../ios/update"); +const log_1 = require("../log"); +const promise_1 = require("../util/promise"); +async function updateCommand(config, selectedPlatformName, deployment) { + var _a; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_1.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_1.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:update'); + } + else { + log_1.logger.error(`Platform ${colors_1.default.input(selectedPlatformName)} not found.`); + } + } + else { + const then = +new Date(); + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + try { + await (0, common_1.check)([() => (0, common_1.checkPackage)(), ...updateChecks(config, platforms)]); + await (0, promise_1.allSerial)(platforms.map(platformName => async () => await update(config, platformName, deployment))); + const now = +new Date(); + const diff = (now - then) / 1000; + log_1.logger.info(`Update finished in ${diff}s`); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } + } +} +exports.updateCommand = updateCommand; +function updateChecks(config, platforms) { + const checks = []; + for (const platformName of platforms) { + if (platformName === config.ios.name) { + checks.push(() => (0, common_2.checkBundler)(config) || (0, common_2.checkCocoaPods)(config)); + } + else if (platformName === config.android.name) { + continue; + } + else if (platformName === config.web.name) { + continue; + } + else { + throw `Platform ${platformName} is not valid.`; + } + } + return checks; +} +exports.updateChecks = updateChecks; +async function update(config, platformName, deployment) { + await (0, common_1.runTask)(colors_1.default.success(colors_1.default.strong(`update ${platformName}`)), async () => { + await (0, common_1.runPlatformHook)(config, platformName, config.app.rootDir, 'capacitor:update:before'); + if (platformName === config.ios.name) { + await (0, update_2.updateIOS)(config, deployment); + } + else if (platformName === config.android.name) { + await (0, update_1.updateAndroid)(config); + } + await (0, common_1.runPlatformHook)(config, platformName, config.app.rootDir, 'capacitor:update:after'); + }); +} +exports.update = update; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/telemetry.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/telemetry.js new file mode 100644 index 00000000..e156222b --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/telemetry.js @@ -0,0 +1,130 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sendMetric = exports.telemetryAction = exports.THANK_YOU = void 0; +const tslib_1 = require("tslib"); +const commander_1 = require("commander"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const ipc_1 = require("./ipc"); +const log_1 = require("./log"); +const sysconfig_1 = require("./sysconfig"); +const subprocess_1 = require("./util/subprocess"); +const term_1 = require("./util/term"); +const debug = (0, debug_1.default)('capacitor:telemetry'); +exports.THANK_YOU = `\nThank you for helping to make Capacitor better! 💖` + + `\nInformation about the data we collect is available on our website: ${colors_1.default.strong('https://capacitorjs.com/telemetry')}\n`; +function telemetryAction(config, action) { + return async (...actionArgs) => { + const start = new Date(); + // This is how commanderjs works--the command object is either the last + // element or second to last if there are additional options (via `.allowUnknownOption()`) + const lastArg = actionArgs[actionArgs.length - 1]; + const cmd = lastArg instanceof commander_1.Command ? lastArg : actionArgs[actionArgs.length - 2]; + const command = getFullCommandName(cmd); + let error; + try { + await action(...actionArgs); + } + catch (e) { + error = e; + } + const end = new Date(); + const duration = end.getTime() - start.getTime(); + const packages = Object.entries({ + ...config.app.package.devDependencies, + ...config.app.package.dependencies, + }); + // Only collect packages in the capacitor org: + // https://www.npmjs.com/org/capacitor + const capacitorPackages = packages.filter(([k]) => k.startsWith('@capacitor/')); + const versions = capacitorPackages.map(([k, v]) => [ + `${k.replace(/^@capacitor\//, '').replace(/-/g, '_')}_version`, + v, + ]); + const data = { + app_id: await getAppIdentifier(config), + command, + arguments: cmd.args.join(' '), + options: JSON.stringify(cmd.opts()), + duration, + error: error ? (error.message ? error.message : String(error)) : null, + node_version: process.version, + os: config.cli.os, + ...Object.fromEntries(versions), + }; + if ((0, term_1.isInteractive)()) { + let sysconfig = await (0, sysconfig_1.readConfig)(); + if (!error && typeof sysconfig.telemetry === 'undefined') { + const confirm = await promptForTelemetry(); + sysconfig = { ...sysconfig, telemetry: confirm }; + await (0, sysconfig_1.writeConfig)(sysconfig); + } + await sendMetric(sysconfig, 'capacitor_cli_command', data); + } + if (error) { + throw error; + } + }; +} +exports.telemetryAction = telemetryAction; +/** + * If telemetry is enabled, send a metric via IPC to a forked process for uploading. + */ +async function sendMetric(sysconfig, name, data) { + if (sysconfig.telemetry && (0, term_1.isInteractive)()) { + const message = { + name, + timestamp: new Date().toISOString(), + session_id: sysconfig.machine, + source: 'capacitor_cli', + value: data, + }; + await (0, ipc_1.send)({ type: 'telemetry', data: message }); + } + else { + debug('Telemetry is off (user choice, non-interactive terminal, or CI)--not sending metric'); + } +} +exports.sendMetric = sendMetric; +async function promptForTelemetry() { + const { confirm } = await (0, log_1.logPrompt)(`${colors_1.default.strong('Would you like to help improve Capacitor by sharing anonymous usage data? 💖')}\n` + + `Read more about what is being collected and why here: ${colors_1.default.strong('https://capacitorjs.com/telemetry')}. You can change your mind at any time by using the ${colors_1.default.input('npx cap telemetry')} command.`, { + type: 'confirm', + name: 'confirm', + message: 'Share anonymous usage data?', + initial: true, + }); + if (confirm) { + log_1.output.write(exports.THANK_YOU); + } + return confirm; +} +/** + * Get a unique anonymous identifier for this app. + */ +async function getAppIdentifier(config) { + const { createHash } = await Promise.resolve().then(() => tslib_1.__importStar(require('crypto'))); + // get the first commit hash, which should be universally unique + const output = await (0, subprocess_1.getCommandOutput)('git', ['rev-list', '--max-parents=0', 'HEAD'], { cwd: config.app.rootDir }); + const firstLine = output === null || output === void 0 ? void 0 : output.split('\n')[0]; + if (!firstLine) { + debug('Could not obtain unique app identifier'); + return null; + } + // use sha1 to create a one-way hash to anonymize + const id = createHash('sha1').update(firstLine).digest('hex'); + return id; +} +/** + * Walk through the command's parent tree and construct a space-separated name. + * + * Probably overkill because we don't have nested commands, but whatever. + */ +function getFullCommandName(cmd) { + const names = []; + while (cmd.parent !== null) { + names.push(cmd.name()); + cmd = cmd.parent; + } + return names.reverse().join(' '); +} diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/cli.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/cli.js new file mode 100644 index 00000000..bedab983 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/cli.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.wrapAction = exports.ENV_PATHS = void 0; +const tslib_1 = require("tslib"); +const env_paths_1 = tslib_1.__importDefault(require("env-paths")); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +exports.ENV_PATHS = (0, env_paths_1.default)('capacitor', { suffix: '' }); +function wrapAction(action) { + return async (...args) => { + try { + await action(...args); + } + catch (e) { + if ((0, errors_1.isFatal)(e)) { + process.exitCode = e.exitCode; + log_1.logger.error(e.message); + } + else { + throw e; + } + } + }; +} +exports.wrapAction = wrapAction; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/emoji.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/emoji.js new file mode 100644 index 00000000..00a9dbc8 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/emoji.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.emoji = void 0; +// Emoji falback, right now just uses fallback on windows, +// but could expand to be more sophisticated to allow emoji +// on Hyper term on windows, for example. +const emoji = (x, fallback) => { + if (process.platform === 'win32') { + return fallback; + } + return x; +}; +exports.emoji = emoji; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/fn.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/fn.js new file mode 100644 index 00000000..9c99b90e --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/fn.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tryFn = void 0; +const tryFn = async (fn, ...args) => { + try { + return await fn(...args); + } + catch { + // ignore + } + return null; +}; +exports.tryFn = tryFn; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/fs.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/fs.js new file mode 100644 index 00000000..884e83e7 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/fs.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.deleteFolderRecursive = exports.convertToUnixPath = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const convertToUnixPath = (path) => { + return path.replace(/\\/g, '/'); +}; +exports.convertToUnixPath = convertToUnixPath; +const deleteFolderRecursive = (directoryPath) => { + if ((0, utils_fs_1.existsSync)(directoryPath)) { + (0, utils_fs_1.readdirSync)(directoryPath).forEach(file => { + const curPath = (0, path_1.join)(directoryPath, file); + if ((0, utils_fs_1.lstatSync)(curPath).isDirectory()) { + (0, exports.deleteFolderRecursive)(curPath); + } + else { + (0, utils_fs_1.unlinkSync)(curPath); + } + }); + (0, utils_fs_1.rmdirSync)(directoryPath); + } +}; +exports.deleteFolderRecursive = deleteFolderRecursive; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/js.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/js.js new file mode 100644 index 00000000..ceabcda1 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/js.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatJSObject = void 0; +const tslib_1 = require("tslib"); +const util_1 = tslib_1.__importDefault(require("util")); +function formatJSObject(o) { + try { + o = JSON.parse(JSON.stringify(o)); + } + catch (e) { + throw new Error(`Cannot parse object as JSON: ${e.stack ? e.stack : e}`); + } + return util_1.default.inspect(o, { + compact: false, + breakLength: Infinity, + depth: Infinity, + maxArrayLength: Infinity, + maxStringLength: Infinity, + }); +} +exports.formatJSObject = formatJSObject; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/livereload.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/livereload.js new file mode 100644 index 00000000..d017d94f --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/livereload.js @@ -0,0 +1,151 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CapLiveReloadHelper = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const os_1 = require("os"); +const path_1 = require("path"); +class CapLiveReload { + constructor() { + this.configJsonToRevertTo = { + json: null, + platformPath: null, + }; + // nothing to do + } + getIpAddress(name, family) { + var _a; + const interfaces = (_a = (0, os_1.networkInterfaces)()) !== null && _a !== void 0 ? _a : {}; + const _normalizeFamily = (family) => { + if (family === 4) { + return 'ipv4'; + } + if (family === 6) { + return 'ipv6'; + } + return family ? family.toLowerCase() : 'ipv4'; + }; + const isLoopback = (addr) => { + return (/^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/.test(addr) || + /^fe80::1$/.test(addr) || + /^::1$/.test(addr) || + /^::$/.test(addr)); + }; + const isPrivate = (addr) => { + return (/^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^f[cd][0-9a-f]{2}:/i.test(addr) || + /^fe80:/i.test(addr) || + /^::1$/.test(addr) || + /^::$/.test(addr)); + }; + const isPublic = (addr) => { + return !isPrivate(addr); + }; + const loopback = (family) => { + // + // Default to `ipv4` + // + family = _normalizeFamily(family); + if (family !== 'ipv4' && family !== 'ipv6') { + throw new Error('family must be ipv4 or ipv6'); + } + return family === 'ipv4' ? '127.0.0.1' : 'fe80::1'; + }; + // + // Default to `ipv4` + // + family = _normalizeFamily(family); + // + // If a specific network interface has been named, + // return the address. + // + if (name && name !== 'private' && name !== 'public') { + const res = interfaces[name].filter((details) => { + const itemFamily = _normalizeFamily(details.family); + return itemFamily === family; + }); + if (res.length === 0) { + return undefined; + } + return res[0].address; + } + const all = Object.keys(interfaces) + .map(nic => { + // + // Note: name will only be `public` or `private` + // when this is called. + // + const addresses = interfaces[nic].filter((details) => { + details.family = _normalizeFamily(details.family); + if (details.family !== family || isLoopback(details.address)) { + return false; + } + if (!name) { + return true; + } + return name === 'public' + ? isPrivate(details.address) + : isPublic(details.address); + }); + return addresses.length ? addresses[0].address : undefined; + }) + .filter(Boolean); + return !all.length ? loopback(family) : all[0]; + } + // TODO remove on next major as it's unused + async editExtConfigForLiveReload(config, platformName, options, rootConfigChange = false) { + const platformAbsPath = platformName == config.ios.name + ? config.ios.nativeTargetDirAbs + : platformName == config.android.name + ? config.android.assetsDirAbs + : null; + if (platformAbsPath == null) + throw new Error('Platform not found.'); + const capConfigPath = rootConfigChange + ? config.app.extConfigFilePath + : (0, path_1.join)(platformAbsPath, 'capacitor.config.json'); + const configJson = { ...config.app.extConfig }; + this.configJsonToRevertTo.json = JSON.stringify(configJson, null, 2); + this.configJsonToRevertTo.platformPath = capConfigPath; + const url = `http://${options.host}:${options.port}`; + configJson.server = { + url, + }; + return configJson; + } + // TODO remove rootConfigChange param on next major as it's unused + async editCapConfigForLiveReload(config, platformName, options, rootConfigChange = false) { + const platformAbsPath = platformName == config.ios.name + ? config.ios.nativeTargetDirAbs + : platformName == config.android.name + ? config.android.assetsDirAbs + : null; + if (platformAbsPath == null) + throw new Error('Platform not found.'); + const capConfigPath = rootConfigChange + ? config.app.extConfigFilePath + : (0, path_1.join)(platformAbsPath, 'capacitor.config.json'); + const configJson = (0, utils_fs_1.readJSONSync)(capConfigPath); + this.configJsonToRevertTo.json = JSON.stringify(configJson, null, 2); + this.configJsonToRevertTo.platformPath = capConfigPath; + const url = `http://${options.host}:${options.port}`; + configJson.server = { + url, + }; + (0, utils_fs_1.writeJSONSync)(capConfigPath, configJson, { spaces: '\t' }); + } + async revertCapConfigForLiveReload() { + if (this.configJsonToRevertTo.json == null || + this.configJsonToRevertTo.platformPath == null) + return; + const capConfigPath = this.configJsonToRevertTo.platformPath; + const configJson = this.configJsonToRevertTo.json; + (0, utils_fs_1.writeJSONSync)(capConfigPath, JSON.parse(configJson), { spaces: '\t' }); + this.configJsonToRevertTo.json = null; + this.configJsonToRevertTo.platformPath = null; + } +} +exports.CapLiveReloadHelper = new CapLiveReload(); diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/monorepotools.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/monorepotools.js new file mode 100644 index 00000000..038dfeee --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/monorepotools.js @@ -0,0 +1,110 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isNXMonorepo = exports.isMonorepo = exports.findPackageRelativePathInMonorepo = exports.findPackagePath = exports.findNXMonorepoRoot = exports.findMonorepoRoot = void 0; +const node_fs_1 = require("node:fs"); +const node_path_1 = require("node:path"); +/** + * Finds the monorepo root from the given path. + * @param currentPath - The current path to start searching from. + * @returns The path to the monorepo root. + * @throws An error if the monorepo root is not found. + */ +function findMonorepoRoot(currentPath) { + const packageJsonPath = (0, node_path_1.join)(currentPath, 'package.json'); + const pnpmWorkspacePath = (0, node_path_1.join)(currentPath, 'pnpm-workspace.yaml'); + if ((0, node_fs_1.existsSync)(pnpmWorkspacePath) || + ((0, node_fs_1.existsSync)(packageJsonPath) && + JSON.parse((0, node_fs_1.readFileSync)(packageJsonPath, 'utf-8')).workspaces)) { + return currentPath; + } + const parentPath = (0, node_path_1.dirname)(currentPath); + if (parentPath === currentPath) { + throw new Error('Monorepo root not found'); + } + return findMonorepoRoot(parentPath); +} +exports.findMonorepoRoot = findMonorepoRoot; +/** + * Finds the NX monorepo root from the given path. + * @param currentPath - The current path to start searching from. + * @returns The path to the monorepo root. + * @throws An error if the monorepo root is not found. + */ +function findNXMonorepoRoot(currentPath) { + const nxJsonPath = (0, node_path_1.join)(currentPath, 'nx.json'); + if ((0, node_fs_1.existsSync)(nxJsonPath)) { + return currentPath; + } + const parentPath = (0, node_path_1.dirname)(currentPath); + if (parentPath === currentPath) { + throw new Error('Monorepo root not found'); + } + return findNXMonorepoRoot(parentPath); +} +exports.findNXMonorepoRoot = findNXMonorepoRoot; +/** + * Finds the path to a package within the node_modules folder, + * searching up the directory hierarchy until the last possible directory is reached. + * @param packageName - The name of the package to find. + * @param currentPath - The current path to start searching from. + * @param lastPossibleDirectory - The last possible directory to search for the package. + * @returns The path to the package, or null if not found. + */ +function findPackagePath(packageName, currentPath, lastPossibleDirectory) { + const nodeModulesPath = (0, node_path_1.join)(currentPath, 'node_modules', packageName); + if ((0, node_fs_1.existsSync)(nodeModulesPath)) { + return nodeModulesPath; + } + if (currentPath === lastPossibleDirectory) { + return null; + } + const parentPath = (0, node_path_1.dirname)(currentPath); + return findPackagePath(packageName, parentPath, lastPossibleDirectory); +} +exports.findPackagePath = findPackagePath; +/** + * Finds the relative path to a package from the current directory, + * using the monorepo root as the last possible directory. + * @param packageName - The name of the package to find. + * @param currentPath - The current path to start searching from. + * @returns The relative path to the package, or null if not found. + */ +function findPackageRelativePathInMonorepo(packageName, currentPath) { + const monorepoRoot = findMonorepoRoot(currentPath); + const packagePath = findPackagePath(packageName, currentPath, monorepoRoot); + if (packagePath) { + return (0, node_path_1.relative)(currentPath, packagePath); + } + return null; +} +exports.findPackageRelativePathInMonorepo = findPackageRelativePathInMonorepo; +/** + * Detects if the current directory is part of a monorepo (npm, yarn, pnpm). + * @param currentPath - The current path to start searching from. + * @returns True if the current directory is part of a monorepo, false otherwise. + */ +function isMonorepo(currentPath) { + try { + findMonorepoRoot(currentPath); + return true; + } + catch (error) { + return false; + } +} +exports.isMonorepo = isMonorepo; +/** + * Detects if the current directory is part of a nx integrated monorepo. + * @param currentPath - The current path to start searching from. + * @returns True if the current directory is part of a monorepo, false otherwise. + */ +function isNXMonorepo(currentPath) { + try { + findNXMonorepoRoot(currentPath); + return true; + } + catch (error) { + return false; + } +} +exports.isNXMonorepo = isNXMonorepo; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/native-run.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/native-run.js new file mode 100644 index 00000000..4b6090bb --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/native-run.js @@ -0,0 +1,53 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPlatformTargets = exports.runNativeRun = void 0; +const tslib_1 = require("tslib"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +const node_1 = require("./node"); +const subprocess_1 = require("./subprocess"); +async function runNativeRun(args, options = {}) { + const p = (0, node_1.resolveNode)(__dirname, (0, path_1.dirname)('native-run/package'), 'bin/native-run'); + if (!p) { + (0, errors_1.fatal)(`${colors_1.default.input('native-run')} not found.`); + } + return await (0, subprocess_1.runCommand)(p, args, options); +} +exports.runNativeRun = runNativeRun; +async function getPlatformTargets(platformName) { + const errors = []; + try { + const output = await runNativeRun([platformName, '--list', '--json']); + const parsedOutput = JSON.parse(output); + if (parsedOutput.devices.length || parsedOutput.virtualDevices.length) { + return [ + ...parsedOutput.devices.map((t) => ({ ...t, virtual: false })), + ...parsedOutput.virtualDevices.map((t) => ({ + ...t, + virtual: true, + })), + ]; + } + else { + parsedOutput.errors.map((e) => { + errors.push(e); + }); + } + } + catch (e) { + const err = JSON.parse(e); + errors.push(err); + } + const plural = errors.length > 1 ? 's' : ''; + const errMsg = `${colors_1.default.strong('native-run')} failed with error${plural}\n + ${errors + .map((e) => { + return `\t${colors_1.default.strong(e.code)}: ${e.error}`; + }) + .join('\n')} + \n\tMore details for this error${plural} may be available online: ${colors_1.default.strong('https://github.com/ionic-team/native-run/wiki/Android-Errors')} + `; + throw errMsg; +} +exports.getPlatformTargets = getPlatformTargets; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/node.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/node.js new file mode 100644 index 00000000..3701ce13 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/node.js @@ -0,0 +1,54 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.resolveNode = exports.requireTS = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const fs_1 = require("fs"); +const path_1 = require("path"); +/** + * @see https://github.com/ionic-team/stencil/blob/HEAD/src/compiler/sys/node-require.ts + */ +const requireTS = (ts, p) => { + const id = (0, path_1.resolve)(p); + delete require.cache[id]; + require.extensions['.ts'] = (module, fileName) => { + var _a; + let sourceText = (0, utils_fs_1.readFileSync)(fileName, 'utf8'); + if (fileName.endsWith('.ts')) { + const tsResults = ts.transpileModule(sourceText, { + fileName, + compilerOptions: { + module: ts.ModuleKind.CommonJS, + moduleResolution: ts.ModuleResolutionKind.NodeJs, + esModuleInterop: true, + strict: true, + target: ts.ScriptTarget.ES2017, + }, + reportDiagnostics: true, + }); + sourceText = tsResults.outputText; + } + else { + // quick hack to turn a modern es module + // into and old school commonjs module + sourceText = sourceText.replace(/export\s+\w+\s+(\w+)/gm, 'exports.$1'); + } + (_a = module._compile) === null || _a === void 0 ? void 0 : _a.call(module, sourceText, fileName); + }; + const m = require(id); // eslint-disable-line @typescript-eslint/no-var-requires + delete require.extensions['.ts']; + return m; +}; +exports.requireTS = requireTS; +function resolveNode(root, ...pathSegments) { + try { + return require.resolve(pathSegments.join('/'), { paths: [root] }); + } + catch (e) { + const path = [root, 'node_modules', ...pathSegments].join('/'); + if ((0, fs_1.existsSync)(path)) { + return path; + } + return null; + } +} +exports.resolveNode = resolveNode; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/promise.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/promise.js new file mode 100644 index 00000000..05c86c67 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/promise.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.lazy = exports.LazyPromise = exports.allSerial = void 0; +function allSerial(funcs) { + return funcs.reduce((promise, func) => promise.then(result => func().then(x => result.concat(x))), Promise.resolve([])); +} +exports.allSerial = allSerial; +class LazyPromise extends Promise { + constructor(executor) { + super(() => { + /* ignore */ + }); + this._executor = executor; + } + then(onfulfilled, onrejected) { + this._promise = this._promise || new Promise(this._executor); + return this._promise.then(onfulfilled, onrejected); + } + catch(onrejected) { + this._promise = this._promise || new Promise(this._executor); + return this._promise.catch(onrejected); + } +} +exports.LazyPromise = LazyPromise; +function lazy(fn) { + return new LazyPromise(async (resolve, reject) => { + try { + resolve(await fn()); + } + catch (e) { + reject(e); + } + }); +} +exports.lazy = lazy; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/subprocess.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/subprocess.js new file mode 100644 index 00000000..7c5d46fa --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/subprocess.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isInstalled = exports.getCommandOutput = exports.runCommand = void 0; +const utils_subprocess_1 = require("@ionic/utils-subprocess"); +async function runCommand(command, args, options = {}) { + const p = new utils_subprocess_1.Subprocess(command, args, options); + try { + return await p.output(); + } + catch (e) { + if (e instanceof utils_subprocess_1.SubprocessError) { + // old behavior of just throwing the stdout/stderr strings + throw e.output + ? e.output + : e.code + ? e.code + : e.error + ? e.error.message + : 'Unknown error'; + } + throw e; + } +} +exports.runCommand = runCommand; +async function getCommandOutput(command, args, options = {}) { + try { + return (await runCommand(command, args, options)).trim(); + } + catch (e) { + return null; + } +} +exports.getCommandOutput = getCommandOutput; +async function isInstalled(command) { + try { + await (0, utils_subprocess_1.which)(command); + } + catch (e) { + return false; + } + return true; +} +exports.isInstalled = isInstalled; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/template.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/template.js new file mode 100644 index 00000000..5d41a32d --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/template.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extractTemplate = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const tar_1 = tslib_1.__importDefault(require("tar")); +async function extractTemplate(src, dir) { + await (0, utils_fs_1.mkdirp)(dir); + await tar_1.default.extract({ file: src, cwd: dir }); +} +exports.extractTemplate = extractTemplate; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/term.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/term.js new file mode 100644 index 00000000..71988b67 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/term.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isInteractive = exports.checkInteractive = void 0; +const tslib_1 = require("tslib"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const log_1 = require("../log"); +// Given input variables to a command, make sure all are provided if the terminal +// is not interactive (because we won't be able to prompt the user) +const checkInteractive = (...args) => { + if ((0, exports.isInteractive)()) { + return true; + } + // Fail if no args are provided, treat this as just a check of whether the term is + // interactive or not. + if (!args.length) { + return false; + } + // Make sure none of the provided args are empty, otherwise print the interactive + // warning and return false + if (args.filter(arg => !arg).length) { + log_1.logger.error(`Non-interactive shell detected.\n` + + `Run the command with ${colors_1.default.input('--help')} to see a list of arguments that must be provided.`); + return false; + } + return true; +}; +exports.checkInteractive = checkInteractive; +const isInteractive = () => utils_terminal_1.TERMINAL_INFO.tty && !utils_terminal_1.TERMINAL_INFO.ci; +exports.isInteractive = isInteractive; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/uuid.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/uuid.js new file mode 100644 index 00000000..5391cb82 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/uuid.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uuidv4 = void 0; +function uuidv4() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + const r = (Math.random() * 16) | 0; + const v = c == 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +} +exports.uuidv4 = uuidv4; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/util/xml.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/xml.js new file mode 100644 index 00000000..1748bfe8 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/util/xml.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildXmlElement = exports.writeXML = exports.parseXML = exports.readXML = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const xml2js_1 = tslib_1.__importDefault(require("xml2js")); +async function readXML(path) { + var _a; + try { + const xmlStr = await (0, utils_fs_1.readFile)(path, { encoding: 'utf-8' }); + try { + return await xml2js_1.default.parseStringPromise(xmlStr); + } + catch (e) { + throw `Error parsing: ${path}, ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`; + } + } + catch (e) { + throw `Unable to read: ${path}`; + } +} +exports.readXML = readXML; +function parseXML(xmlStr, options) { + const parser = options !== undefined + ? new xml2js_1.default.Parser({ ...options }) + : new xml2js_1.default.Parser(); + let xmlObj; + parser.parseString(xmlStr, (err, result) => { + if (!err) { + xmlObj = result; + } + }); + return xmlObj; +} +exports.parseXML = parseXML; +async function writeXML(object) { + return new Promise(resolve => { + const builder = new xml2js_1.default.Builder({ + headless: true, + explicitRoot: false, + rootName: 'deleteme', + }); + let xml = builder.buildObject(object); + xml = xml.replace('', '').replace('', ''); + resolve(xml); + }); +} +exports.writeXML = writeXML; +function buildXmlElement(configElement, rootName) { + const builder = new xml2js_1.default.Builder({ + headless: true, + explicitRoot: false, + rootName: rootName, + }); + return builder.buildObject(configElement); +} +exports.buildXmlElement = buildXmlElement; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/dist/web/copy.js b/@capacitor/assets/node_modules/@capacitor/cli/dist/web/copy.js new file mode 100644 index 00000000..d815005b --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/dist/web/copy.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.copyWeb = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const node_1 = require("../util/node"); +async function copyWeb(config) { + if (config.app.bundledWebRuntime) { + const runtimePath = (0, node_1.resolveNode)(config.app.rootDir, '@capacitor/core', 'dist', 'capacitor.js'); + if (!runtimePath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong('node_modules/@capacitor/core/dist/capacitor.js')}.\n` + `Are you sure ${colors_1.default.strong('@capacitor/core')} is installed?`); + } + return (0, common_1.runTask)(`Copying ${colors_1.default.strong('capacitor.js')} to web dir`, () => { + return (0, utils_fs_1.copy)(runtimePath, (0, path_1.join)(config.app.webDirAbs, 'capacitor.js')); + }); + } +} +exports.copyWeb = copyWeb; diff --git a/@capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/LICENSE b/@capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/LICENSE new file mode 100644 index 00000000..10f997ab --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/Readme.md b/@capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/Readme.md new file mode 100644 index 00000000..ed19cff6 --- /dev/null +++ b/@capacitor/assets/node_modules/@capacitor/cli/node_modules/commander/Readme.md @@ -0,0 +1,1129 @@ +# Commander.js + +[![Build Status](https://github.com/tj/commander.js/workflows/build/badge.svg)](https://github.com/tj/commander.js/actions?query=workflow%3A%22build%22) +[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander) +[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true) +[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) + +The complete solution for [node.js](http://nodejs.org) command-line interfaces. + +Read this in other languages: English | [简体中文](./Readme_zh-CN.md) + +- [Commander.js](#commanderjs) + - [Installation](#installation) + - [Quick Start](#quick-start) + - [Declaring _program_ variable](#declaring-program-variable) + - [Options](#options) + - [Common option types, boolean and value](#common-option-types-boolean-and-value) + - [Default option value](#default-option-value) + - [Other option types, negatable boolean and boolean|value](#other-option-types-negatable-boolean-and-booleanvalue) + - [Required option](#required-option) + - [Variadic option](#variadic-option) + - [Version option](#version-option) + - [More configuration](#more-configuration) + - [Custom option processing](#custom-option-processing) + - [Commands](#commands) + - [Command-arguments](#command-arguments) + - [More configuration](#more-configuration-1) + - [Custom argument processing](#custom-argument-processing) + - [Action handler](#action-handler) + - [Stand-alone executable (sub)commands](#stand-alone-executable-subcommands) + - [Life cycle hooks](#life-cycle-hooks) + - [Automated help](#automated-help) + - [Custom help](#custom-help) + - [Display help after errors](#display-help-after-errors) + - [Display help from code](#display-help-from-code) + - [.name](#name) + - [.usage](#usage) + - [.description and .summary](#description-and-summary) + - [.helpOption(flags, description)](#helpoptionflags-description) + - [.addHelpCommand()](#addhelpcommand) + - [More configuration](#more-configuration-2) + - [Custom event listeners](#custom-event-listeners) + - [Bits and pieces](#bits-and-pieces) + - [.parse() and .parseAsync()](#parse-and-parseasync) + - [Parsing Configuration](#parsing-configuration) + - [Legacy options as properties](#legacy-options-as-properties) + - [TypeScript](#typescript) + - [createCommand()](#createcommand) + - [Node options such as `--harmony`](#node-options-such-as---harmony) + - [Debugging stand-alone executable subcommands](#debugging-stand-alone-executable-subcommands) + - [Display error](#display-error) + - [Override exit and output handling](#override-exit-and-output-handling) + - [Additional documentation](#additional-documentation) + - [Support](#support) + - [Commander for enterprise](#commander-for-enterprise) + +For information about terms used in this document see: [terminology](./docs/terminology.md) + +## Installation + +```sh +npm install commander +``` + +## Quick Start + +You write code to describe your command line interface. +Commander looks after parsing the arguments into options and command-arguments, +displays usage errors for problems, and implements a help system. + +Commander is strict and displays an error for unrecognised options. +The two most used option types are a boolean option, and an option which takes its value from the following argument. + +Example file: [split.js](./examples/split.js) + +```js +const { program } = require('commander'); + +program + .option('--first') + .option('-s, --separator '); + +program.parse(); + +const options = program.opts(); +const limit = options.first ? 1 : undefined; +console.log(program.args[0].split(options.separator, limit)); +``` + +```console +$ node split.js -s / --fits a/b/c +error: unknown option '--fits' +(Did you mean --first?) +$ node split.js -s / --first a/b/c +[ 'a' ] +``` + +Here is a more complete program using a subcommand and with descriptions for the help. In a multi-command program, you have an action handler for each command (or stand-alone executables for the commands). + +Example file: [string-util.js](./examples/string-util.js) + +```js +const { Command } = require('commander'); +const program = new Command(); + +program + .name('string-util') + .description('CLI to some JavaScript string utilities') + .version('0.8.0'); + +program.command('split') + .description('Split a string into substrings and display as an array') + .argument('', 'string to split') + .option('--first', 'display just the first substring') + .option('-s, --separator ', 'separator character', ',') + .action((str, options) => { + const limit = options.first ? 1 : undefined; + console.log(str.split(options.separator, limit)); + }); + +program.parse(); +``` + +```console +$ node string-util.js help split +Usage: string-util split [options] + +Split a string into substrings and display as an array. + +Arguments: + string string to split + +Options: + --first display just the first substring + -s, --separator separator character (default: ",") + -h, --help display help for command + +$ node string-util.js split --separator=/ a/b/c +[ 'a', 'b', 'c' ] +``` + +More samples can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory. + +## Declaring _program_ variable + +Commander exports a global object which is convenient for quick programs. +This is used in the examples in this README for brevity. + +```js +// CommonJS (.cjs) +const { program } = require('commander'); +``` + +For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use. + +```js +// CommonJS (.cjs) +const { Command } = require('commander'); +const program = new Command(); +``` + +```js +// ECMAScript (.mjs) +import { Command } from 'commander'; +const program = new Command(); +``` + +```ts +// TypeScript (.ts) +import { Command } from 'commander'; +const program = new Command(); +``` + +## Options + +Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|'). + +The parsed options can be accessed by calling `.opts()` on a `Command` object, and are passed to the action handler. + +Multi-word options such as "--template-engine" are camel-cased, becoming `program.opts().templateEngine` etc. + +An option and its option-argument can be separated by a space, or combined into the same argument. The option-argument can follow the short option directly or follow an `=` for a long option. + +```sh +serve -p 80 +serve -p80 +serve --port 80 +serve --port=80 +``` + +You can use `--` to indicate the end of the options, and any remaining arguments will be used without being interpreted. + +By default options on the command line are not positional, and can be specified before or after other arguments. + +There are additional related routines for when `.opts()` is not enough: + +- `.optsWithGlobals()` returns merged local and global option values +- `.getOptionValue()` and `.setOptionValue()` work with a single option value +- `.getOptionValueSource()` and `.setOptionValueWithSource()` include where the option value came from + +### Common option types, boolean and value + +The two most used option types are a boolean option, and an option which takes its value +from the following argument (declared with angle brackets like `--expect `). Both are `undefined` unless specified on command line. + +Example file: [options-common.js](./examples/options-common.js) + +```js +program + .option('-d, --debug', 'output extra debugging') + .option('-s, --small', 'small pizza size') + .option('-p, --pizza-type ', 'flavour of pizza'); + +program.parse(process.argv); + +const options = program.opts(); +if (options.debug) console.log(options); +console.log('pizza details:'); +if (options.small) console.log('- small pizza size'); +if (options.pizzaType) console.log(`- ${options.pizzaType}`); +``` + +```console +$ pizza-options -p +error: option '-p, --pizza-type ' argument missing +$ pizza-options -d -s -p vegetarian +{ debug: true, small: true, pizzaType: 'vegetarian' } +pizza details: +- small pizza size +- vegetarian +$ pizza-options --pizza-type=cheese +pizza details: +- cheese +``` + +Multiple boolean short options may be combined together following the dash, and may be followed by a single short option taking a value. +For example `-d -s -p cheese` may be written as `-ds -p cheese` or even `-dsp cheese`. + +Options with an expected option-argument are greedy and will consume the following argument whatever the value. +So `--id -xyz` reads `-xyz` as the option-argument. + +`program.parse(arguments)` processes the arguments, leaving any args not consumed by the program options in the `program.args` array. The parameter is optional and defaults to `process.argv`. + +### Default option value + +You can specify a default value for an option. + +Example file: [options-defaults.js](./examples/options-defaults.js) + +```js +program + .option('-c, --cheese ', 'add the specified type of cheese', 'blue'); + +program.parse(); + +console.log(`cheese: ${program.opts().cheese}`); +``` + +```console +$ pizza-options +cheese: blue +$ pizza-options --cheese stilton +cheese: stilton +``` + +### Other option types, negatable boolean and boolean|value + +You can define a boolean option long name with a leading `no-` to set the option value to false when used. +Defined alone this also makes the option true by default. + +If you define `--foo` first, adding `--no-foo` does not change the default value from what it would +otherwise be. + +Example file: [options-negatable.js](./examples/options-negatable.js) + +```js +program + .option('--no-sauce', 'Remove sauce') + .option('--cheese ', 'cheese flavour', 'mozzarella') + .option('--no-cheese', 'plain with no cheese') + .parse(); + +const options = program.opts(); +const sauceStr = options.sauce ? 'sauce' : 'no sauce'; +const cheeseStr = (options.cheese === false) ? 'no cheese' : `${options.cheese} cheese`; +console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`); +``` + +```console +$ pizza-options +You ordered a pizza with sauce and mozzarella cheese +$ pizza-options --sauce +error: unknown option '--sauce' +$ pizza-options --cheese=blue +You ordered a pizza with sauce and blue cheese +$ pizza-options --no-sauce --no-cheese +You ordered a pizza with no sauce and no cheese +``` + +You can specify an option which may be used as a boolean option but may optionally take an option-argument +(declared with square brackets like `--optional [value]`). + +Example file: [options-boolean-or-value.js](./examples/options-boolean-or-value.js) + +```js +program + .option('-c, --cheese [type]', 'Add cheese with optional type'); + +program.parse(process.argv); + +const options = program.opts(); +if (options.cheese === undefined) console.log('no cheese'); +else if (options.cheese === true) console.log('add cheese'); +else console.log(`add cheese type ${options.cheese}`); +``` + +```console +$ pizza-options +no cheese +$ pizza-options --cheese +add cheese +$ pizza-options --cheese mozzarella +add cheese type mozzarella +``` + +Options with an optional option-argument are not greedy and will ignore arguments starting with a dash. +So `id` behaves as a boolean option for `--id -5`, but you can use a combined form if needed like `--id=-5`. + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md). + +### Required option + +You may specify a required (mandatory) option using `.requiredOption()`. The option must have a value after parsing, usually specified on the command line, or perhaps from a default value (say from environment). The method is otherwise the same as `.option()` in format, taking flags and description, and optional default value or custom processing. + +Example file: [options-required.js](./examples/options-required.js) + +```js +program + .requiredOption('-c, --cheese ', 'pizza must have cheese'); + +program.parse(); +``` + +```console +$ pizza +error: required option '-c, --cheese ' not specified +``` + +### Variadic option + +You may make an option variadic by appending `...` to the value placeholder when declaring the option. On the command line you +can then specify multiple option-arguments, and the parsed option value will be an array. The extra arguments +are read until the first argument starting with a dash. The special argument `--` stops option processing entirely. If a value +is specified in the same argument as the option then no further values are read. + +Example file: [options-variadic.js](./examples/options-variadic.js) + +```js +program + .option('-n, --number ', 'specify numbers') + .option('-l, --letter [letters...]', 'specify letters'); + +program.parse(); + +console.log('Options: ', program.opts()); +console.log('Remaining arguments: ', program.args); +``` + +```console +$ collect -n 1 2 3 --letter a b c +Options: { number: [ '1', '2', '3' ], letter: [ 'a', 'b', 'c' ] } +Remaining arguments: [] +$ collect --letter=A -n80 operand +Options: { number: [ '80' ], letter: [ 'A' ] } +Remaining arguments: [ 'operand' ] +$ collect --letter -n 1 -n 2 3 -- operand +Options: { number: [ '1', '2', '3' ], letter: true } +Remaining arguments: [ 'operand' ] +``` + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md). + +### Version option + +The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits. + +```js +program.version('0.0.1'); +``` + +```console +$ ./examples/pizza -V +0.0.1 +``` + +You may change the flags and description by passing additional parameters to the `version` method, using +the same syntax for flags as the `option` method. + +```js +program.version('0.0.1', '-v, --vers', 'output the current version'); +``` + +### More configuration + +You can add most options using the `.option()` method, but there are some additional features available +by constructing an `Option` explicitly for less common cases. + +Example files: [options-extra.js](./examples/options-extra.js), [options-env.js](./examples/options-env.js), [options-conflicts.js](./examples/options-conflicts.js), [options-implies.js](./examples/options-implies.js) + +```js +program + .addOption(new Option('-s, --secret').hideHelp()) + .addOption(new Option('-t, --timeout ', 'timeout in seconds').default(60, 'one minute')) + .addOption(new Option('-d, --drink ', 'drink size').choices(['small', 'medium', 'large'])) + .addOption(new Option('-p, --port ', 'port number').env('PORT')) + .addOption(new Option('--donate [amount]', 'optional donation in dollars').preset('20').argParser(parseFloat)) + .addOption(new Option('--disable-server', 'disables the server').conflicts('port')) + .addOption(new Option('--free-drink', 'small drink included free ').implies({ drink: 'small' })); +``` + +```console +$ extra --help +Usage: help [options] + +Options: + -t, --timeout timeout in seconds (default: one minute) + -d, --drink drink cup size (choices: "small", "medium", "large") + -p, --port port number (env: PORT) + --donate [amount] optional donation in dollars (preset: "20") + --disable-server disables the server + --free-drink small drink included free + -h, --help display help for command + +$ extra --drink huge +error: option '-d, --drink ' argument 'huge' is invalid. Allowed choices are small, medium, large. + +$ PORT=80 extra --donate --free-drink +Options: { timeout: 60, donate: 20, port: '80', freeDrink: true, drink: 'small' } + +$ extra --disable-server --port 8000 +error: option '--disable-server' cannot be used with option '-p, --port ' +``` + +Specify a required (mandatory) option using the `Option` method `.makeOptionMandatory()`. This matches the `Command` method [.requiredOption()](#required-option). + +### Custom option processing + +You may specify a function to do custom processing of option-arguments. The callback function receives two parameters, +the user specified option-argument and the previous value for the option. It returns the new value for the option. + +This allows you to coerce the option-argument to the desired type, or accumulate values, or do entirely custom processing. + +You can optionally specify the default/starting value for the option after the function parameter. + +Example file: [options-custom-processing.js](./examples/options-custom-processing.js) + +```js +function myParseInt(value, dummyPrevious) { + // parseInt takes a string and a radix + const parsedValue = parseInt(value, 10); + if (isNaN(parsedValue)) { + throw new commander.InvalidArgumentError('Not a number.'); + } + return parsedValue; +} + +function increaseVerbosity(dummyValue, previous) { + return previous + 1; +} + +function collect(value, previous) { + return previous.concat([value]); +} + +function commaSeparatedList(value, dummyPrevious) { + return value.split(','); +} + +program + .option('-f, --float ', 'float argument', parseFloat) + .option('-i, --integer ', 'integer argument', myParseInt) + .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0) + .option('-c, --collect ', 'repeatable value', collect, []) + .option('-l, --list ', 'comma separated list', commaSeparatedList) +; + +program.parse(); + +const options = program.opts(); +if (options.float !== undefined) console.log(`float: ${options.float}`); +if (options.integer !== undefined) console.log(`integer: ${options.integer}`); +if (options.verbose > 0) console.log(`verbosity: ${options.verbose}`); +if (options.collect.length > 0) console.log(options.collect); +if (options.list !== undefined) console.log(options.list); +``` + +```console +$ custom -f 1e2 +float: 100 +$ custom --integer 2 +integer: 2 +$ custom -v -v -v +verbose: 3 +$ custom -c a -c b -c c +[ 'a', 'b', 'c' ] +$ custom --list x,y,z +[ 'x', 'y', 'z' ] +``` + +## Commands + +You can specify (sub)commands using `.command()` or `.addCommand()`. There are two ways these can be implemented: using an action handler attached to the command, or as a stand-alone executable file (described in more detail later). The subcommands may be nested ([example](./examples/nestedCommands.js)). + +In the first parameter to `.command()` you specify the command name. You may append the command-arguments after the command name, or specify them separately using `.argument()`. The arguments may be `` or `[optional]`, and the last argument may also be `variadic...`. + +You can use `.addCommand()` to add an already configured subcommand to the program. + +For example: + +```js +// Command implemented using action handler (description is supplied separately to `.command`) +// Returns new command for configuring. +program + .command('clone [destination]') + .description('clone a repository into a newly created directory') + .action((source, destination) => { + console.log('clone command called'); + }); + +// Command implemented using stand-alone executable file, indicated by adding description as second parameter to `.command`. +// Returns `this` for adding more commands. +program + .command('start ', 'start named service') + .command('stop [service]', 'stop named service, or all if no name supplied'); + +// Command prepared separately. +// Returns `this` for adding more commands. +program + .addCommand(build.makeBuildCommand()); +``` + +Configuration options can be passed with the call to `.command()` and `.addCommand()`. Specifying `hidden: true` will +remove the command from the generated help output. Specifying `isDefault: true` will run the subcommand if no other +subcommand is specified ([example](./examples/defaultCommand.js)). + +You can add alternative names for a command with `.alias()`. ([example](./examples/alias.js)) + +For safety, `.addCommand()` does not automatically copy the inherited settings from the parent command. There is a helper routine `.copyInheritedSettings()` for copying the settings when they are wanted. + +### Command-arguments + +For subcommands, you can specify the argument syntax in the call to `.command()` (as shown above). This +is the only method usable for subcommands implemented using a stand-alone executable, but for other subcommands +you can instead use the following method. + +To configure a command, you can use `.argument()` to specify each expected command-argument. +You supply the argument name and an optional description. The argument may be `` or `[optional]`. +You can specify a default value for an optional command-argument. + +Example file: [argument.js](./examples/argument.js) + +```js +program + .version('0.1.0') + .argument('', 'user to login') + .argument('[password]', 'password for user, if required', 'no password given') + .action((username, password) => { + console.log('username:', username); + console.log('password:', password); + }); +``` + + The last argument of a command can be variadic, and only the last argument. To make an argument variadic you + append `...` to the argument name. A variadic argument is passed to the action handler as an array. For example: + +```js +program + .version('0.1.0') + .command('rmdir') + .argument('') + .action(function (dirs) { + dirs.forEach((dir) => { + console.log('rmdir %s', dir); + }); + }); +``` + +There is a convenience method to add multiple arguments at once, but without descriptions: + +```js +program + .arguments(' '); +``` + +#### More configuration + +There are some additional features available by constructing an `Argument` explicitly for less common cases. + +Example file: [arguments-extra.js](./examples/arguments-extra.js) + +```js +program + .addArgument(new commander.Argument('', 'drink cup size').choices(['small', 'medium', 'large'])) + .addArgument(new commander.Argument('[timeout]', 'timeout in seconds').default(60, 'one minute')) +``` + +#### Custom argument processing + +You may specify a function to do custom processing of command-arguments (like for option-arguments). +The callback function receives two parameters, the user specified command-argument and the previous value for the argument. +It returns the new value for the argument. + +The processed argument values are passed to the action handler, and saved as `.processedArgs`. + +You can optionally specify the default/starting value for the argument after the function parameter. + +Example file: [arguments-custom-processing.js](./examples/arguments-custom-processing.js) + +```js +program + .command('add') + .argument('', 'integer argument', myParseInt) + .argument('[second]', 'integer argument', myParseInt, 1000) + .action((first, second) => { + console.log(`${first} + ${second} = ${first + second}`); + }) +; +``` + +### Action handler + +The action handler gets passed a parameter for each command-argument you declared, and two additional parameters +which are the parsed options and the command object itself. + +Example file: [thank.js](./examples/thank.js) + +```js +program + .argument('') + .option('-t, --title ', 'title to use before name') + .option('-d, --debug', 'display some debugging') + .action((name, options, command) => { + if (options.debug) { + console.error('Called %s with options %o', command.name(), options); + } + const title = options.title ? `${options.title} ` : ''; + console.log(`Thank-you ${title}${name}`); + }); +``` + +If you prefer, you can work with the command directly and skip declaring the parameters for the action handler. The `this` keyword is set to the running command and can be used from a function expression (but not from an arrow function). + +Example file: [action-this.js](./examples/action-this.js) + +```js +program + .command('serve') + .argument('"; +const handler = new DomHandler((error, dom) => { + if (error) { + // Handle error + } else { + // Parsing completed, do something + console.log(dom); + } +}); +const parser = new Parser(handler); +parser.write(rawHtml); +parser.end(); +``` + +Output: + +```javascript +[ + { + data: "Xyz ", + type: "text", + }, + { + type: "script", + name: "script", + attribs: { + language: "javascript", + }, + children: [ + { + data: "var foo = '';<", + type: "text", + }, + ], + }, + { + data: " regexps + let set = this.globParts.map((s, _, __) => { + if (this.isWindows && this.windowsNoMagicRoot) { + // check if it's a drive or unc path. + const isUNC = s[0] === '' && + s[1] === '' && + (s[2] === '?' || !globMagic.test(s[2])) && + !globMagic.test(s[3]); + const isDrive = /^[a-z]:/i.test(s[0]); + if (isUNC) { + return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]; + } + else if (isDrive) { + return [s[0], ...s.slice(1).map(ss => this.parse(ss))]; + } + } + return s.map(ss => this.parse(ss)); + }); + this.debug(this.pattern, set); + // filter out everything that didn't compile properly. + this.set = set.filter(s => s.indexOf(false) === -1); + // do not treat the ? in UNC paths as magic + if (this.isWindows) { + for (let i = 0; i < this.set.length; i++) { + const p = this.set[i]; + if (p[0] === '' && + p[1] === '' && + this.globParts[i][2] === '?' && + typeof p[3] === 'string' && + /^[a-z]:$/i.test(p[3])) { + p[2] = '?'; + } + } + } + this.debug(this.pattern, this.set); + } + // various transforms to equivalent pattern sets that are + // faster to process in a filesystem walk. The goal is to + // eliminate what we can, and push all ** patterns as far + // to the right as possible, even if it increases the number + // of patterns that we have to process. + preprocess(globParts) { + // if we're not in globstar mode, then turn all ** into * + if (this.options.noglobstar) { + for (let i = 0; i < globParts.length; i++) { + for (let j = 0; j < globParts[i].length; j++) { + if (globParts[i][j] === '**') { + globParts[i][j] = '*'; + } + } + } + } + const { optimizationLevel = 1 } = this.options; + if (optimizationLevel >= 2) { + // aggressive optimization for the purpose of fs walking + globParts = this.firstPhasePreProcess(globParts); + globParts = this.secondPhasePreProcess(globParts); + } + else if (optimizationLevel >= 1) { + // just basic optimizations to remove some .. parts + globParts = this.levelOneOptimize(globParts); + } + else { + globParts = this.adjascentGlobstarOptimize(globParts); + } + return globParts; + } + // just get rid of adjascent ** portions + adjascentGlobstarOptimize(globParts) { + return globParts.map(parts => { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let i = gs; + while (parts[i + 1] === '**') { + i++; + } + if (i !== gs) { + parts.splice(gs, i - gs); + } + } + return parts; + }); + } + // get rid of adjascent ** and resolve .. portions + levelOneOptimize(globParts) { + return globParts.map(parts => { + parts = parts.reduce((set, part) => { + const prev = set[set.length - 1]; + if (part === '**' && prev === '**') { + return set; + } + if (part === '..') { + if (prev && prev !== '..' && prev !== '.' && prev !== '**') { + set.pop(); + return set; + } + } + set.push(part); + return set; + }, []); + return parts.length === 0 ? [''] : parts; + }); + } + levelTwoFileOptimize(parts) { + if (!Array.isArray(parts)) { + parts = this.slashSplit(parts); + } + let didSomething = false; + do { + didSomething = false; + //

// -> 
/
+            if (!this.preserveMultipleSlashes) {
+                for (let i = 1; i < parts.length - 1; i++) {
+                    const p = parts[i];
+                    // don't squeeze out UNC patterns
+                    if (i === 1 && p === '' && parts[0] === '')
+                        continue;
+                    if (p === '.' || p === '') {
+                        didSomething = true;
+                        parts.splice(i, 1);
+                        i--;
+                    }
+                }
+                if (parts[0] === '.' &&
+                    parts.length === 2 &&
+                    (parts[1] === '.' || parts[1] === '')) {
+                    didSomething = true;
+                    parts.pop();
+                }
+            }
+            // 
/

/../ ->

/
+            let dd = 0;
+            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
+                const p = parts[dd - 1];
+                if (p && p !== '.' && p !== '..' && p !== '**') {
+                    didSomething = true;
+                    parts.splice(dd - 1, 2);
+                    dd -= 2;
+                }
+            }
+        } while (didSomething);
+        return parts.length === 0 ? [''] : parts;
+    }
+    // First phase: single-pattern processing
+    // 
 is 1 or more portions
+    //  is 1 or more portions
+    // 

is any portion other than ., .., '', or ** + // is . or '' + // + // **/.. is *brutal* for filesystem walking performance, because + // it effectively resets the recursive walk each time it occurs, + // and ** cannot be reduced out by a .. pattern part like a regexp + // or most strings (other than .., ., and '') can be. + // + //

/**/../

/

/ -> {

/../

/

/,

/**/

/

/} + //

// -> 
/
+    // 
/

/../ ->

/
+    // **/**/ -> **/
+    //
+    // **/*/ -> */**/ <== not valid because ** doesn't follow
+    // this WOULD be allowed if ** did follow symlinks, or * didn't
+    firstPhasePreProcess(globParts) {
+        let didSomething = false;
+        do {
+            didSomething = false;
+            // 
/**/../

/

/ -> {

/../

/

/,

/**/

/

/} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + //

/**/**/ -> 
/**/
+                        gss++;
+                    }
+                    // eg, if gs is 2 and gss is 4, that means we have 3 **
+                    // parts, and can remove 2 of them.
+                    if (gss > gs) {
+                        parts.splice(gs + 1, gss - gs);
+                    }
+                    let next = parts[gs + 1];
+                    const p = parts[gs + 2];
+                    const p2 = parts[gs + 3];
+                    if (next !== '..')
+                        continue;
+                    if (!p ||
+                        p === '.' ||
+                        p === '..' ||
+                        !p2 ||
+                        p2 === '.' ||
+                        p2 === '..') {
+                        continue;
+                    }
+                    didSomething = true;
+                    // edit parts in place, and push the new one
+                    parts.splice(gs, 1);
+                    const other = parts.slice(0);
+                    other[gs] = '**';
+                    globParts.push(other);
+                    gs--;
+                }
+                // 
// -> 
/
+                if (!this.preserveMultipleSlashes) {
+                    for (let i = 1; i < parts.length - 1; i++) {
+                        const p = parts[i];
+                        // don't squeeze out UNC patterns
+                        if (i === 1 && p === '' && parts[0] === '')
+                            continue;
+                        if (p === '.' || p === '') {
+                            didSomething = true;
+                            parts.splice(i, 1);
+                            i--;
+                        }
+                    }
+                    if (parts[0] === '.' &&
+                        parts.length === 2 &&
+                        (parts[1] === '.' || parts[1] === '')) {
+                        didSomething = true;
+                        parts.pop();
+                    }
+                }
+                // 
/

/../ ->

/
+                let dd = 0;
+                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
+                    const p = parts[dd - 1];
+                    if (p && p !== '.' && p !== '..' && p !== '**') {
+                        didSomething = true;
+                        const needDot = dd === 1 && parts[dd + 1] === '**';
+                        const splin = needDot ? ['.'] : [];
+                        parts.splice(dd - 1, 2, ...splin);
+                        if (parts.length === 0)
+                            parts.push('');
+                        dd -= 2;
+                    }
+                }
+            }
+        } while (didSomething);
+        return globParts;
+    }
+    // second phase: multi-pattern dedupes
+    // {
/*/,
/

/} ->

/*/
+    // {
/,
/} -> 
/
+    // {
/**/,
/} -> 
/**/
+    //
+    // {
/**/,
/**/

/} ->

/**/
+    // ^-- not valid because ** doens't follow symlinks
+    secondPhasePreProcess(globParts) {
+        for (let i = 0; i < globParts.length - 1; i++) {
+            for (let j = i + 1; j < globParts.length; j++) {
+                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
+                if (!matched)
+                    continue;
+                globParts[i] = matched;
+                globParts[j] = [];
+            }
+        }
+        return globParts.filter(gs => gs.length);
+    }
+    partsMatch(a, b, emptyGSMatch = false) {
+        let ai = 0;
+        let bi = 0;
+        let result = [];
+        let which = '';
+        while (ai < a.length && bi < b.length) {
+            if (a[ai] === b[bi]) {
+                result.push(which === 'b' ? b[bi] : a[ai]);
+                ai++;
+                bi++;
+            }
+            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
+                result.push(a[ai]);
+                ai++;
+            }
+            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
+                result.push(b[bi]);
+                bi++;
+            }
+            else if (a[ai] === '*' &&
+                b[bi] &&
+                (this.options.dot || !b[bi].startsWith('.')) &&
+                b[bi] !== '**') {
+                if (which === 'b')
+                    return false;
+                which = 'a';
+                result.push(a[ai]);
+                ai++;
+                bi++;
+            }
+            else if (b[bi] === '*' &&
+                a[ai] &&
+                (this.options.dot || !a[ai].startsWith('.')) &&
+                a[ai] !== '**') {
+                if (which === 'a')
+                    return false;
+                which = 'b';
+                result.push(b[bi]);
+                ai++;
+                bi++;
+            }
+            else {
+                return false;
+            }
+        }
+        // if we fall out of the loop, it means they two are identical
+        // as long as their lengths match
+        return a.length === b.length && result;
+    }
+    parseNegate() {
+        if (this.nonegate)
+            return;
+        const pattern = this.pattern;
+        let negate = false;
+        let negateOffset = 0;
+        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
+            negate = !negate;
+            negateOffset++;
+        }
+        if (negateOffset)
+            this.pattern = pattern.slice(negateOffset);
+        this.negate = negate;
+    }
+    // set partial to true to test if, for example,
+    // "/a/b" matches the start of "/*/b/*/d"
+    // Partial means, if you run out of file before you run
+    // out of pattern, then that's fine, as long as all
+    // the parts match.
+    matchOne(file, pattern, partial = false) {
+        const options = this.options;
+        // a UNC pattern like //?/c:/* can match a path like c:/x
+        // and vice versa
+        if (this.isWindows) {
+            const fileUNC = file[0] === '' &&
+                file[1] === '' &&
+                file[2] === '?' &&
+                typeof file[3] === 'string' &&
+                /^[a-z]:$/i.test(file[3]);
+            const patternUNC = pattern[0] === '' &&
+                pattern[1] === '' &&
+                pattern[2] === '?' &&
+                typeof pattern[3] === 'string' &&
+                /^[a-z]:$/i.test(pattern[3]);
+            if (fileUNC && patternUNC) {
+                const fd = file[3];
+                const pd = pattern[3];
+                if (fd.toLowerCase() === pd.toLowerCase()) {
+                    file[3] = pd;
+                }
+            }
+            else if (patternUNC && typeof file[0] === 'string') {
+                const pd = pattern[3];
+                const fd = file[0];
+                if (pd.toLowerCase() === fd.toLowerCase()) {
+                    pattern[3] = fd;
+                    pattern = pattern.slice(3);
+                }
+            }
+            else if (fileUNC && typeof pattern[0] === 'string') {
+                const fd = file[3];
+                if (fd.toLowerCase() === pattern[0].toLowerCase()) {
+                    pattern[0] = fd;
+                    file = file.slice(3);
+                }
+            }
+        }
+        // resolve and reduce . and .. portions in the file as well.
+        // dont' need to do the second phase, because it's only one string[]
+        const { optimizationLevel = 1 } = this.options;
+        if (optimizationLevel >= 2) {
+            file = this.levelTwoFileOptimize(file);
+        }
+        this.debug('matchOne', this, { file, pattern });
+        this.debug('matchOne', file.length, pattern.length);
+        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
+            this.debug('matchOne loop');
+            var p = pattern[pi];
+            var f = file[fi];
+            this.debug(pattern, p, f);
+            // should be impossible.
+            // some invalid regexp stuff in the set.
+            /* c8 ignore start */
+            if (p === false) {
+                return false;
+            }
+            /* c8 ignore stop */
+            if (p === exports.GLOBSTAR) {
+                this.debug('GLOBSTAR', [pattern, p, f]);
+                // "**"
+                // a/**/b/**/c would match the following:
+                // a/b/x/y/z/c
+                // a/x/y/z/b/c
+                // a/b/x/b/x/c
+                // a/b/c
+                // To do this, take the rest of the pattern after
+                // the **, and see if it would match the file remainder.
+                // If so, return success.
+                // If not, the ** "swallows" a segment, and try again.
+                // This is recursively awful.
+                //
+                // a/**/b/**/c matching a/b/x/y/z/c
+                // - a matches a
+                // - doublestar
+                //   - matchOne(b/x/y/z/c, b/**/c)
+                //     - b matches b
+                //     - doublestar
+                //       - matchOne(x/y/z/c, c) -> no
+                //       - matchOne(y/z/c, c) -> no
+                //       - matchOne(z/c, c) -> no
+                //       - matchOne(c, c) yes, hit
+                var fr = fi;
+                var pr = pi + 1;
+                if (pr === pl) {
+                    this.debug('** at the end');
+                    // a ** at the end will just swallow the rest.
+                    // We have found a match.
+                    // however, it will not swallow /.x, unless
+                    // options.dot is set.
+                    // . and .. are *never* matched by **, for explosively
+                    // exponential reasons.
+                    for (; fi < fl; fi++) {
+                        if (file[fi] === '.' ||
+                            file[fi] === '..' ||
+                            (!options.dot && file[fi].charAt(0) === '.'))
+                            return false;
+                    }
+                    return true;
+                }
+                // ok, let's see if we can swallow whatever we can.
+                while (fr < fl) {
+                    var swallowee = file[fr];
+                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
+                    // XXX remove this slice.  Just pass the start index.
+                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
+                        this.debug('globstar found match!', fr, fl, swallowee);
+                        // found a match.
+                        return true;
+                    }
+                    else {
+                        // can't swallow "." or ".." ever.
+                        // can only swallow ".foo" when explicitly asked.
+                        if (swallowee === '.' ||
+                            swallowee === '..' ||
+                            (!options.dot && swallowee.charAt(0) === '.')) {
+                            this.debug('dot detected!', file, fr, pattern, pr);
+                            break;
+                        }
+                        // ** swallows a segment, and continue.
+                        this.debug('globstar swallow a segment, and continue');
+                        fr++;
+                    }
+                }
+                // no match was found.
+                // However, in partial mode, we can't say this is necessarily over.
+                /* c8 ignore start */
+                if (partial) {
+                    // ran out of file
+                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
+                    if (fr === fl) {
+                        return true;
+                    }
+                }
+                /* c8 ignore stop */
+                return false;
+            }
+            // something other than **
+            // non-magic patterns just have to match exactly
+            // patterns with magic have been turned into regexps.
+            let hit;
+            if (typeof p === 'string') {
+                hit = f === p;
+                this.debug('string match', p, f, hit);
+            }
+            else {
+                hit = p.test(f);
+                this.debug('pattern match', p, f, hit);
+            }
+            if (!hit)
+                return false;
+        }
+        // Note: ending in / means that we'll get a final ""
+        // at the end of the pattern.  This can only match a
+        // corresponding "" at the end of the file.
+        // If the file ends in /, then it can only match a
+        // a pattern that ends in /, unless the pattern just
+        // doesn't have any more for it. But, a/b/ should *not*
+        // match "a/b/*", even though "" matches against the
+        // [^/]*? pattern, except in partial mode, where it might
+        // simply not be reached yet.
+        // However, a/b/ should still satisfy a/*
+        // now either we fell off the end of the pattern, or we're done.
+        if (fi === fl && pi === pl) {
+            // ran out of pattern and filename at the same time.
+            // an exact hit!
+            return true;
+        }
+        else if (fi === fl) {
+            // ran out of file, but still had pattern left.
+            // this is ok if we're doing the match as part of
+            // a glob fs traversal.
+            return partial;
+        }
+        else if (pi === pl) {
+            // ran out of pattern, still have file left.
+            // this is only acceptable if we're on the very last
+            // empty segment of a file with a trailing slash.
+            // a/* should match a/b/
+            return fi === fl - 1 && file[fi] === '';
+            /* c8 ignore start */
+        }
+        else {
+            // should be unreachable.
+            throw new Error('wtf?');
+        }
+        /* c8 ignore stop */
+    }
+    braceExpand() {
+        return (0, exports.braceExpand)(this.pattern, this.options);
+    }
+    parse(pattern) {
+        (0, assert_valid_pattern_js_1.assertValidPattern)(pattern);
+        const options = this.options;
+        // shortcuts
+        if (pattern === '**')
+            return exports.GLOBSTAR;
+        if (pattern === '')
+            return '';
+        // far and away, the most common glob pattern parts are
+        // *, *.*, and *.  Add a fast check method for those.
+        let m;
+        let fastTest = null;
+        if ((m = pattern.match(starRE))) {
+            fastTest = options.dot ? starTestDot : starTest;
+        }
+        else if ((m = pattern.match(starDotExtRE))) {
+            fastTest = (options.nocase
+                ? options.dot
+                    ? starDotExtTestNocaseDot
+                    : starDotExtTestNocase
+                : options.dot
+                    ? starDotExtTestDot
+                    : starDotExtTest)(m[1]);
+        }
+        else if ((m = pattern.match(qmarksRE))) {
+            fastTest = (options.nocase
+                ? options.dot
+                    ? qmarksTestNocaseDot
+                    : qmarksTestNocase
+                : options.dot
+                    ? qmarksTestDot
+                    : qmarksTest)(m);
+        }
+        else if ((m = pattern.match(starDotStarRE))) {
+            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
+        }
+        else if ((m = pattern.match(dotStarRE))) {
+            fastTest = dotStarTest;
+        }
+        const re = ast_js_1.AST.fromGlob(pattern, this.options).toMMPattern();
+        return fastTest ? Object.assign(re, { test: fastTest }) : re;
+    }
+    makeRe() {
+        if (this.regexp || this.regexp === false)
+            return this.regexp;
+        // at this point, this.set is a 2d array of partial
+        // pattern strings, or "**".
+        //
+        // It's better to use .match().  This function shouldn't
+        // be used, really, but it's pretty convenient sometimes,
+        // when you just want to work with a regex.
+        const set = this.set;
+        if (!set.length) {
+            this.regexp = false;
+            return this.regexp;
+        }
+        const options = this.options;
+        const twoStar = options.noglobstar
+            ? star
+            : options.dot
+                ? twoStarDot
+                : twoStarNoDot;
+        const flags = new Set(options.nocase ? ['i'] : []);
+        // regexpify non-globstar patterns
+        // if ** is only item, then we just do one twoStar
+        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
+        // if ** is last, append (\/twoStar|) to previous
+        // if ** is in the middle, append (\/|\/twoStar\/) to previous
+        // then filter out GLOBSTAR symbols
+        let re = set
+            .map(pattern => {
+            const pp = pattern.map(p => {
+                if (p instanceof RegExp) {
+                    for (const f of p.flags.split(''))
+                        flags.add(f);
+                }
+                return typeof p === 'string'
+                    ? regExpEscape(p)
+                    : p === exports.GLOBSTAR
+                        ? exports.GLOBSTAR
+                        : p._src;
+            });
+            pp.forEach((p, i) => {
+                const next = pp[i + 1];
+                const prev = pp[i - 1];
+                if (p !== exports.GLOBSTAR || prev === exports.GLOBSTAR) {
+                    return;
+                }
+                if (prev === undefined) {
+                    if (next !== undefined && next !== exports.GLOBSTAR) {
+                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
+                    }
+                    else {
+                        pp[i] = twoStar;
+                    }
+                }
+                else if (next === undefined) {
+                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
+                }
+                else if (next !== exports.GLOBSTAR) {
+                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
+                    pp[i + 1] = exports.GLOBSTAR;
+                }
+            });
+            return pp.filter(p => p !== exports.GLOBSTAR).join('/');
+        })
+            .join('|');
+        // need to wrap in parens if we had more than one thing with |,
+        // otherwise only the first will be anchored to ^ and the last to $
+        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
+        // must match entire pattern
+        // ending in a * or ** will make it less strict.
+        re = '^' + open + re + close + '$';
+        // can match anything, as long as it's not this.
+        if (this.negate)
+            re = '^(?!' + re + ').+$';
+        try {
+            this.regexp = new RegExp(re, [...flags].join(''));
+            /* c8 ignore start */
+        }
+        catch (ex) {
+            // should be impossible
+            this.regexp = false;
+        }
+        /* c8 ignore stop */
+        return this.regexp;
+    }
+    slashSplit(p) {
+        // if p starts with // on windows, we preserve that
+        // so that UNC paths aren't broken.  Otherwise, any number of
+        // / characters are coalesced into one, unless
+        // preserveMultipleSlashes is set to true.
+        if (this.preserveMultipleSlashes) {
+            return p.split('/');
+        }
+        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
+            // add an extra '' for the one we lose
+            return ['', ...p.split(/\/+/)];
+        }
+        else {
+            return p.split(/\/+/);
+        }
+    }
+    match(f, partial = this.partial) {
+        this.debug('match', f, this.pattern);
+        // short-circuit in the case of busted things.
+        // comments, etc.
+        if (this.comment) {
+            return false;
+        }
+        if (this.empty) {
+            return f === '';
+        }
+        if (f === '/' && partial) {
+            return true;
+        }
+        const options = this.options;
+        // windows: need to use /, not \
+        if (this.isWindows) {
+            f = f.split('\\').join('/');
+        }
+        // treat the test path as a set of pathparts.
+        const ff = this.slashSplit(f);
+        this.debug(this.pattern, 'split', ff);
+        // just ONE of the pattern sets in this.set needs to match
+        // in order for it to be valid.  If negating, then just one
+        // match means that we have failed.
+        // Either way, return on the first hit.
+        const set = this.set;
+        this.debug(this.pattern, 'set', set);
+        // Find the basename of the path by looking for the last non-empty segment
+        let filename = ff[ff.length - 1];
+        if (!filename) {
+            for (let i = ff.length - 2; !filename && i >= 0; i--) {
+                filename = ff[i];
+            }
+        }
+        for (let i = 0; i < set.length; i++) {
+            const pattern = set[i];
+            let file = ff;
+            if (options.matchBase && pattern.length === 1) {
+                file = [filename];
+            }
+            const hit = this.matchOne(file, pattern, partial);
+            if (hit) {
+                if (options.flipNegate) {
+                    return true;
+                }
+                return !this.negate;
+            }
+        }
+        // didn't get any hits.  this is success if it's a negative
+        // pattern, failure otherwise.
+        if (options.flipNegate) {
+            return false;
+        }
+        return this.negate;
+    }
+    static defaults(def) {
+        return exports.minimatch.defaults(def).Minimatch;
+    }
+}
+exports.Minimatch = Minimatch;
+/* c8 ignore start */
+var ast_js_2 = require("./ast.js");
+Object.defineProperty(exports, "AST", { enumerable: true, get: function () { return ast_js_2.AST; } });
+var escape_js_2 = require("./escape.js");
+Object.defineProperty(exports, "escape", { enumerable: true, get: function () { return escape_js_2.escape; } });
+var unescape_js_2 = require("./unescape.js");
+Object.defineProperty(exports, "unescape", { enumerable: true, get: function () { return unescape_js_2.unescape; } });
+/* c8 ignore stop */
+exports.minimatch.AST = ast_js_1.AST;
+exports.minimatch.Minimatch = Minimatch;
+exports.minimatch.escape = escape_js_1.escape;
+exports.minimatch.unescape = unescape_js_1.unescape;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/cjs/index.js.map b/@capacitor/assets/node_modules/minimatch/dist/cjs/index.js.map
new file mode 100644
index 00000000..19ba7c0b
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/cjs/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,sEAAoC;AACpC,uEAA8D;AAC9D,qCAA2C;AAC3C,2CAAoC;AACpC,+CAAwC;AAsCjC,MAAM,SAAS,GAAG,CACvB,CAAS,EACT,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,IAAA,4CAAkB,EAAC,OAAO,CAAC,CAAA;IAE3B,oCAAoC;IACpC,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;QACnD,OAAO,KAAK,CAAA;KACb;IAED,OAAO,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AACjD,CAAC,CAAA;AAbY,QAAA,SAAS,aAarB;AAED,kBAAe,iBAAS,CAAA;AAExB,wDAAwD;AACxD,MAAM,YAAY,GAAG,uBAAuB,CAAA;AAC5C,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE,CACpD,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACvC,MAAM,iBAAiB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACzE,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3C,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC3E,CAAC,CAAA;AACD,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAE,EAAE;IAC9C,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACrD,CAAC,CAAA;AACD,MAAM,aAAa,GAAG,YAAY,CAAA;AAClC,MAAM,eAAe,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC5E,MAAM,kBAAkB,GAAG,CAAC,CAAS,EAAE,EAAE,CACvC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAC5C,MAAM,SAAS,GAAG,SAAS,CAAA;AAC3B,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC/E,MAAM,MAAM,GAAG,OAAO,CAAA;AACtB,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AACpE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAA;AAC5E,MAAM,QAAQ,GAAG,wBAAwB,CAAA;AACzC,MAAM,gBAAgB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IAC5D,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACtB,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACjE,CAAC,CAAA;AACD,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IAC/D,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,IAAI,CAAC,GAAG;QAAE,OAAO,KAAK,CAAA;IACtB,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AACjE,CAAC,CAAA;AACD,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IACzD,MAAM,KAAK,GAAG,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAClE,CAAC,CAAA;AACD,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAmB,EAAE,EAAE;IACtD,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IACnC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;AAClE,CAAC,CAAA;AACD,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,CAAmB,EAAE,EAAE;IACjD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAA;IACrB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC9D,CAAC,CAAA;AACD,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,CAAmB,EAAE,EAAE;IACpD,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAA;IACrB,OAAO,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,CAAA;AACnE,CAAC,CAAA;AAED,qBAAqB;AACrB,MAAM,eAAe,GAAa,CAChC,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO;IACpC,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ;QAC9B,OAAO,CAAC,GAAG;QACX,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC;QAC7C,OAAO,CAAC,QAAQ;IAClB,CAAC,CAAC,OAAO,CACA,CAAA;AAEb,MAAM,IAAI,GAAkC;IAC1C,KAAK,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE;IACpB,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;CACpB,CAAA;AACD,oBAAoB;AAEP,QAAA,GAAG,GAAG,eAAe,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA;AAChF,iBAAS,CAAC,GAAG,GAAG,WAAG,CAAA;AAEN,QAAA,QAAQ,GAAG,MAAM,CAAC,aAAa,CAAC,CAAA;AAC7C,iBAAS,CAAC,QAAQ,GAAG,gBAAQ,CAAA;AAE7B,gCAAgC;AAChC,iDAAiD;AACjD,MAAM,KAAK,GAAG,MAAM,CAAA;AAEpB,gCAAgC;AAChC,MAAM,IAAI,GAAG,KAAK,GAAG,IAAI,CAAA;AAEzB,4DAA4D;AAC5D,+DAA+D;AAC/D,6CAA6C;AAC7C,MAAM,UAAU,GAAG,yCAAyC,CAAA;AAE5D,kCAAkC;AAClC,6CAA6C;AAC7C,MAAM,YAAY,GAAG,yBAAyB,CAAA;AAEvC,MAAM,MAAM,GACjB,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACpD,CAAC,CAAS,EAAE,EAAE,CACZ,IAAA,iBAAS,EAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;AAHrB,QAAA,MAAM,UAGe;AAClC,iBAAS,CAAC,MAAM,GAAG,cAAM,CAAA;AAEzB,MAAM,GAAG,GAAG,CAAC,CAAmB,EAAE,IAAsB,EAAE,EAAE,EAAE,CAC5D,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;AAElB,MAAM,QAAQ,GAAG,CAAC,GAAqB,EAAoB,EAAE;IAClE,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;QAC/D,OAAO,iBAAS,CAAA;KACjB;IAED,MAAM,IAAI,GAAG,iBAAS,CAAA;IAEtB,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACvE,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;IAErC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE;QACtB,SAAS,EAAE,MAAM,SAAU,SAAQ,IAAI,CAAC,SAAS;YAC/C,YAAY,OAAe,EAAE,UAA4B,EAAE;gBACzD,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACnC,CAAC;YACD,MAAM,CAAC,QAAQ,CAAC,OAAyB;gBACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;YACnD,CAAC;SACF;QAED,GAAG,EAAE,MAAM,GAAI,SAAQ,IAAI,CAAC,GAAG;YAC7B,qBAAqB;YACrB,YACE,IAAwB,EACxB,MAAY,EACZ,UAA4B,EAAE;gBAE9B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACxC,CAAC;YACD,oBAAoB;YAEpB,MAAM,CAAC,QAAQ,CAAC,OAAe,EAAE,UAA4B,EAAE;gBAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACtD,CAAC;SACF;QAED,QAAQ,EAAE,CACR,CAAS,EACT,UAA0D,EAAE,EAC5D,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAExC,MAAM,EAAE,CACN,CAAS,EACT,UAA0D,EAAE,EAC5D,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEtC,MAAM,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEzC,QAAQ,EAAE,CAAC,OAAyB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEzE,MAAM,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC1D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAEzC,WAAW,EAAE,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CAC/D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9C,KAAK,EAAE,CAAC,IAAc,EAAE,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACzE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAE9C,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,QAAQ,EAAE,gBAA2B;KACtC,CAAC,CAAA;AACJ,CAAC,CAAA;AA/DY,QAAA,QAAQ,YA+DpB;AACD,iBAAS,CAAC,QAAQ,GAAG,gBAAQ,CAAA;AAE7B,mBAAmB;AACnB,qBAAqB;AACrB,mBAAmB;AACnB,8BAA8B;AAC9B,mCAAmC;AACnC,2CAA2C;AAC3C,EAAE;AACF,iCAAiC;AACjC,qBAAqB;AACrB,iBAAiB;AACV,MAAM,WAAW,GAAG,CACzB,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,IAAA,4CAAkB,EAAC,OAAO,CAAC,CAAA;IAE3B,wDAAwD;IACxD,wDAAwD;IACxD,IAAI,OAAO,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QACxD,+BAA+B;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAA;KACjB;IAED,OAAO,IAAA,yBAAM,EAAC,OAAO,CAAC,CAAA;AACxB,CAAC,CAAA;AAdY,QAAA,WAAW,eAcvB;AACD,iBAAS,CAAC,WAAW,GAAG,mBAAW,CAAA;AAEnC,yCAAyC;AACzC,kDAAkD;AAClD,oEAAoE;AACpE,oEAAoE;AACpE,6DAA6D;AAC7D,kEAAkE;AAClE,EAAE;AACF,0EAA0E;AAC1E,wEAAwE;AACxE,qEAAqE;AACrE,8DAA8D;AAEvD,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,UAA4B,EAAE,EAAE,EAAE,CACxE,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,MAAM,EAAE,CAAA;AAD7B,QAAA,MAAM,UACuB;AAC1C,iBAAS,CAAC,MAAM,GAAG,cAAM,CAAA;AAElB,MAAM,KAAK,GAAG,CACnB,IAAc,EACd,OAAe,EACf,UAA4B,EAAE,EAC9B,EAAE;IACF,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC1C,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;QACrC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;KACnB;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAXY,QAAA,KAAK,SAWjB;AACD,iBAAS,CAAC,KAAK,GAAG,aAAK,CAAA;AAEvB,+BAA+B;AAC/B,MAAM,SAAS,GAAG,yBAAyB,CAAA;AAC3C,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CACjC,CAAC,CAAC,OAAO,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAA;AAU/C,MAAa,SAAS;IACpB,OAAO,CAAkB;IACzB,GAAG,CAAyB;IAC5B,OAAO,CAAQ;IAEf,oBAAoB,CAAS;IAC7B,QAAQ,CAAS;IACjB,MAAM,CAAS;IACf,OAAO,CAAS;IAChB,KAAK,CAAS;IACd,uBAAuB,CAAS;IAChC,OAAO,CAAS;IAChB,OAAO,CAAU;IACjB,SAAS,CAAY;IACrB,MAAM,CAAS;IAEf,SAAS,CAAS;IAClB,QAAQ,CAAU;IAClB,kBAAkB,CAAS;IAE3B,MAAM,CAAyB;IAC/B,YAAY,OAAe,EAAE,UAA4B,EAAE;QACzD,IAAA,4CAAkB,EAAC,OAAO,CAAC,CAAA;QAE3B,OAAO,GAAG,OAAO,IAAI,EAAE,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,eAAe,CAAA;QACnD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAA;QAC1C,IAAI,CAAC,oBAAoB;YACvB,CAAC,CAAC,OAAO,CAAC,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,KAAK,KAAK,CAAA;QACxE,IAAI,IAAI,CAAC,oBAAoB,EAAE;YAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;SAChD;QACD,IAAI,CAAC,uBAAuB,GAAG,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAA;QAChE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;QACnB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAA;QAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;QAChC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;QACnC,IAAI,CAAC,kBAAkB;YACrB,OAAO,CAAC,kBAAkB,KAAK,SAAS;gBACtC,CAAC,CAAC,OAAO,CAAC,kBAAkB;gBAC5B,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;QAEvC,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;QACjB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,GAAG,GAAG,EAAE,CAAA;QAEb,+BAA+B;QAC/B,IAAI,CAAC,IAAI,EAAE,CAAA;IACb,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;YACrD,OAAO,IAAI,CAAA;SACZ;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE;YAC9B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE;gBAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,OAAO,IAAI,CAAA;aAC1C;SACF;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,GAAG,CAAQ,IAAG,CAAC;IAErB,IAAI;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,6CAA6C;QAC7C,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YACnD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;YACnB,OAAM;SACP;QAED,IAAI,CAAC,OAAO,EAAE;YACZ,IAAI,CAAC,KAAK,GAAG,IAAI,CAAA;YACjB,OAAM;SACP;QAED,oCAAoC;QACpC,IAAI,CAAC,WAAW,EAAE,CAAA;QAElB,wBAAwB;QACxB,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;QAE/C,IAAI,OAAO,CAAC,KAAK,EAAE;YACjB,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAA;SACxD;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QAEtC,+DAA+D;QAC/D,kCAAkC;QAClC,8DAA8D;QAC9D,oDAAoD;QACpD,wCAAwC;QACxC,EAAE;QACF,mEAAmE;QACnE,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QAExC,mBAAmB;QACnB,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;YACxC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,kBAAkB,EAAE;gBAC7C,qCAAqC;gBACrC,MAAM,KAAK,GACT,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACvB,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBACrC,IAAI,KAAK,EAAE;oBACT,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;iBACnE;qBAAM,IAAI,OAAO,EAAE;oBAClB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;iBACvD;aACF;YACD,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QAE7B,sDAAsD;QACtD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CACnB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CACF,CAAA;QAE5B,2CAA2C;QAC3C,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACxC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;gBACrB,IACE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;oBACX,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG;oBAC5B,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;oBACxB,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtB;oBACA,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;iBACX;aACF;SACF;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAA;IACpC,CAAC;IAED,yDAAyD;IACzD,0DAA0D;IAC1D,yDAAyD;IACzD,4DAA4D;IAC5D,uCAAuC;IACvC,UAAU,CAAC,SAAqB;QAC9B,yDAAyD;QACzD,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBAC5C,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;wBAC5B,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAA;qBACtB;iBACF;aACF;SACF;QAED,MAAM,EAAE,iBAAiB,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAE9C,IAAI,iBAAiB,IAAI,CAAC,EAAE;YAC1B,wDAAwD;YACxD,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAA;YAChD,SAAS,GAAG,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAA;SAClD;aAAM,IAAI,iBAAiB,IAAI,CAAC,EAAE;YACjC,mDAAmD;YACnD,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAA;SAC7C;aAAM;YACL,SAAS,GAAG,IAAI,CAAC,yBAAyB,CAAC,SAAS,CAAC,CAAA;SACtD;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,wCAAwC;IACxC,yBAAyB,CAAC,SAAqB;QAC7C,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,IAAI,EAAE,GAAW,CAAC,CAAC,CAAA;YACnB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;gBAChD,IAAI,CAAC,GAAG,EAAE,CAAA;gBACV,OAAO,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;oBAC5B,CAAC,EAAE,CAAA;iBACJ;gBACD,IAAI,CAAC,KAAK,EAAE,EAAE;oBACZ,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAA;iBACzB;aACF;YACD,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,kDAAkD;IAClD,gBAAgB,CAAC,SAAqB;QACpC,OAAO,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC3B,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAa,EAAE,IAAI,EAAE,EAAE;gBAC3C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;gBAChC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE;oBAClC,OAAO,GAAG,CAAA;iBACX;gBACD,IAAI,IAAI,KAAK,IAAI,EAAE;oBACjB,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,EAAE;wBAC1D,GAAG,CAAC,GAAG,EAAE,CAAA;wBACT,OAAO,GAAG,CAAA;qBACX;iBACF;gBACD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACd,OAAO,GAAG,CAAA;YACZ,CAAC,EAAE,EAAE,CAAC,CAAA;YACN,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC1C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,oBAAoB,CAAC,KAAwB;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACzB,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;SAC/B;QACD,IAAI,YAAY,GAAY,KAAK,CAAA;QACjC,GAAG;YACD,YAAY,GAAG,KAAK,CAAA;YACpB,mCAAmC;YACnC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE;gBACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBACzC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;oBAClB,iCAAiC;oBACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;wBAAE,SAAQ;oBACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;wBACzB,YAAY,GAAG,IAAI,CAAA;wBACnB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;wBAClB,CAAC,EAAE,CAAA;qBACJ;iBACF;gBACD,IACE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;oBAChB,KAAK,CAAC,MAAM,KAAK,CAAC;oBAClB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EACrC;oBACA,YAAY,GAAG,IAAI,CAAA;oBACnB,KAAK,CAAC,GAAG,EAAE,CAAA;iBACZ;aACF;YAED,sCAAsC;YACtC,IAAI,EAAE,GAAW,CAAC,CAAA;YAClB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;gBAChD,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;gBACvB,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;oBAC9C,YAAY,GAAG,IAAI,CAAA;oBACnB,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;oBACvB,EAAE,IAAI,CAAC,CAAA;iBACR;aACF;SACF,QAAQ,YAAY,EAAC;QACtB,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;IAC1C,CAAC;IAED,yCAAyC;IACzC,8BAA8B;IAC9B,+BAA+B;IAC/B,iDAAiD;IACjD,iBAAiB;IACjB,EAAE;IACF,gEAAgE;IAChE,gEAAgE;IAChE,kEAAkE;IAClE,qDAAqD;IACrD,EAAE;IACF,kFAAkF;IAClF,mCAAmC;IACnC,sCAAsC;IACtC,4BAA4B;IAC5B,EAAE;IACF,qEAAqE;IACrE,+DAA+D;IAC/D,oBAAoB,CAAC,SAAqB;QACxC,IAAI,YAAY,GAAG,KAAK,CAAA;QACxB,GAAG;YACD,YAAY,GAAG,KAAK,CAAA;YACpB,kFAAkF;YAClF,KAAK,IAAI,KAAK,IAAI,SAAS,EAAE;gBAC3B,IAAI,EAAE,GAAW,CAAC,CAAC,CAAA;gBACnB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;oBAChD,IAAI,GAAG,GAAW,EAAE,CAAA;oBACpB,OAAO,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;wBAC9B,wCAAwC;wBACxC,GAAG,EAAE,CAAA;qBACN;oBACD,uDAAuD;oBACvD,mCAAmC;oBACnC,IAAI,GAAG,GAAG,EAAE,EAAE;wBACZ,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAA;qBAC/B;oBAED,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACxB,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACvB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACxB,IAAI,IAAI,KAAK,IAAI;wBAAE,SAAQ;oBAC3B,IACE,CAAC,CAAC;wBACF,CAAC,KAAK,GAAG;wBACT,CAAC,KAAK,IAAI;wBACV,CAAC,EAAE;wBACH,EAAE,KAAK,GAAG;wBACV,EAAE,KAAK,IAAI,EACX;wBACA,SAAQ;qBACT;oBACD,YAAY,GAAG,IAAI,CAAA;oBACnB,4CAA4C;oBAC5C,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;oBACnB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;oBAC5B,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;oBAChB,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;oBACrB,EAAE,EAAE,CAAA;iBACL;gBAED,mCAAmC;gBACnC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE;oBACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;wBACzC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;wBAClB,iCAAiC;wBACjC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;4BAAE,SAAQ;wBACpD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE;4BACzB,YAAY,GAAG,IAAI,CAAA;4BACnB,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;4BAClB,CAAC,EAAE,CAAA;yBACJ;qBACF;oBACD,IACE,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG;wBAChB,KAAK,CAAC,MAAM,KAAK,CAAC;wBAClB,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EACrC;wBACA,YAAY,GAAG,IAAI,CAAA;wBACnB,KAAK,CAAC,GAAG,EAAE,CAAA;qBACZ;iBACF;gBAED,sCAAsC;gBACtC,IAAI,EAAE,GAAW,CAAC,CAAA;gBAClB,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE;oBAChD,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;oBACvB,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE;wBAC9C,YAAY,GAAG,IAAI,CAAA;wBACnB,MAAM,OAAO,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;wBAClD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;wBAClC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAA;wBACjC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;4BAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;wBACtC,EAAE,IAAI,CAAC,CAAA;qBACR;iBACF;aACF;SACF,QAAQ,YAAY,EAAC;QAEtB,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,sCAAsC;IACtC,sDAAsD;IACtD,8CAA8C;IAC9C,oDAAoD;IACpD,EAAE;IACF,2DAA2D;IAC3D,mDAAmD;IACnD,qBAAqB,CAAC,SAAqB;QACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAC7B,SAAS,CAAC,CAAC,CAAC,EACZ,SAAS,CAAC,CAAC,CAAC,EACZ,CAAC,IAAI,CAAC,uBAAuB,CAC9B,CAAA;gBACD,IAAI,CAAC,OAAO;oBAAE,SAAQ;gBACtB,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;gBACtB,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;aAClB;SACF;QACD,OAAO,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAA;IAC1C,CAAC;IAED,UAAU,CACR,CAAW,EACX,CAAW,EACX,eAAwB,KAAK;QAE7B,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,EAAE,GAAG,CAAC,CAAA;QACV,IAAI,MAAM,GAAa,EAAE,CAAA;QACzB,IAAI,KAAK,GAAW,EAAE,CAAA;QACtB,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE;YACrC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE;gBACnB,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAC1C,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;aACL;iBAAM,IAAI,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;gBAChE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;aACL;iBAAM,IAAI,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;gBAChE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;aACL;iBAAM,IACL,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG;gBACb,CAAC,CAAC,EAAE,CAAC;gBACL,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EACd;gBACA,IAAI,KAAK,KAAK,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAC/B,KAAK,GAAG,GAAG,CAAA;gBACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;aACL;iBAAM,IACL,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG;gBACb,CAAC,CAAC,EAAE,CAAC;gBACL,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;gBAC5C,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,EACd;gBACA,IAAI,KAAK,KAAK,GAAG;oBAAE,OAAO,KAAK,CAAA;gBAC/B,KAAK,GAAG,GAAG,CAAA;gBACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAClB,EAAE,EAAE,CAAA;gBACJ,EAAE,EAAE,CAAA;aACL;iBAAM;gBACL,OAAO,KAAK,CAAA;aACb;SACF;QACD,8DAA8D;QAC9D,iCAAiC;QACjC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,MAAM,CAAA;IACxC,CAAC;IAED,WAAW;QACT,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAM;QAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,IAAI,YAAY,GAAG,CAAC,CAAA;QAEpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,EAAE;YACpE,MAAM,GAAG,CAAC,MAAM,CAAA;YAChB,YAAY,EAAE,CAAA;SACf;QAED,IAAI,YAAY;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;QAC5D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,+CAA+C;IAC/C,yCAAyC;IACzC,uDAAuD;IACvD,mDAAmD;IACnD,mBAAmB;IACnB,QAAQ,CAAC,IAAc,EAAE,OAAsB,EAAE,UAAmB,KAAK;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,yDAAyD;QACzD,iBAAiB;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,MAAM,OAAO,GACX,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;gBACd,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBACf,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC3B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3B,MAAM,UAAU,GACd,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;gBACjB,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;gBACjB,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG;gBAClB,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC9B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;YAE9B,IAAI,OAAO,IAAI,UAAU,EAAE;gBACzB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAW,CAAA;gBAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAW,CAAA;gBAC/B,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE;oBACzC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;iBACb;aACF;iBAAM,IAAI,UAAU,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;gBACpD,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAW,CAAA;gBAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;gBAClB,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE,EAAE;oBACzC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;oBACf,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;iBAC3B;aACF;iBAAM,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;gBACpD,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;gBAClB,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE;oBACjD,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;oBACf,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;iBACrB;aACF;SACF;QAED,4DAA4D;QAC5D,oEAAoE;QACpE,MAAM,EAAE,iBAAiB,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,CAAA;QAC9C,IAAI,iBAAiB,IAAI,CAAC,EAAE;YAC1B,IAAI,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;SACvC;QAED,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;QAC/C,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;QAEnD,KACE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,EACzD,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,EAClB,EAAE,EAAE,EAAE,EAAE,EAAE,EACV;YACA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;YAC3B,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,CAAA;YACnB,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;YAEhB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;YAEzB,wBAAwB;YACxB,wCAAwC;YACxC,qBAAqB;YACrB,IAAI,CAAC,KAAK,KAAK,EAAE;gBACf,OAAO,KAAK,CAAA;aACb;YACD,oBAAoB;YAEpB,IAAI,CAAC,KAAK,gBAAQ,EAAE;gBAClB,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;gBAEvC,OAAO;gBACP,yCAAyC;gBACzC,cAAc;gBACd,cAAc;gBACd,cAAc;gBACd,QAAQ;gBACR,iDAAiD;gBACjD,wDAAwD;gBACxD,yBAAyB;gBACzB,sDAAsD;gBACtD,6BAA6B;gBAC7B,EAAE;gBACF,mCAAmC;gBACnC,gBAAgB;gBAChB,eAAe;gBACf,kCAAkC;gBAClC,oBAAoB;gBACpB,mBAAmB;gBACnB,qCAAqC;gBACrC,mCAAmC;gBACnC,iCAAiC;gBACjC,kCAAkC;gBAClC,IAAI,EAAE,GAAG,EAAE,CAAA;gBACX,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBACf,IAAI,EAAE,KAAK,EAAE,EAAE;oBACb,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;oBAC3B,8CAA8C;oBAC9C,yBAAyB;oBACzB,2CAA2C;oBAC3C,sBAAsB;oBACtB,sDAAsD;oBACtD,uBAAuB;oBACvB,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE;wBACpB,IACE,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG;4BAChB,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI;4BACjB,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC;4BAE5C,OAAO,KAAK,CAAA;qBACf;oBACD,OAAO,IAAI,CAAA;iBACZ;gBAED,mDAAmD;gBACnD,OAAO,EAAE,GAAG,EAAE,EAAE;oBACd,IAAI,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,CAAA;oBAExB,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;oBAEhE,qDAAqD;oBACrD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;wBAC7D,IAAI,CAAC,KAAK,CAAC,uBAAuB,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAA;wBACtD,iBAAiB;wBACjB,OAAO,IAAI,CAAA;qBACZ;yBAAM;wBACL,kCAAkC;wBAClC,iDAAiD;wBACjD,IACE,SAAS,KAAK,GAAG;4BACjB,SAAS,KAAK,IAAI;4BAClB,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAC7C;4BACA,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;4BAClD,MAAK;yBACN;wBAED,uCAAuC;wBACvC,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAA;wBACtD,EAAE,EAAE,CAAA;qBACL;iBACF;gBAED,sBAAsB;gBACtB,mEAAmE;gBACnE,qBAAqB;gBACrB,IAAI,OAAO,EAAE;oBACX,kBAAkB;oBAClB,IAAI,CAAC,KAAK,CAAC,0BAA0B,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;oBAC7D,IAAI,EAAE,KAAK,EAAE,EAAE;wBACb,OAAO,IAAI,CAAA;qBACZ;iBACF;gBACD,oBAAoB;gBACpB,OAAO,KAAK,CAAA;aACb;YAED,0BAA0B;YAC1B,gDAAgD;YAChD,qDAAqD;YACrD,IAAI,GAAY,CAAA;YAChB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;gBACzB,GAAG,GAAG,CAAC,KAAK,CAAC,CAAA;gBACb,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;aACtC;iBAAM;gBACL,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACf,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAA;aACvC;YAED,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAA;SACvB;QAED,oDAAoD;QACpD,oDAAoD;QACpD,2CAA2C;QAC3C,kDAAkD;QAClD,oDAAoD;QACpD,uDAAuD;QACvD,oDAAoD;QACpD,yDAAyD;QACzD,6BAA6B;QAC7B,yCAAyC;QAEzC,gEAAgE;QAChE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;YAC1B,oDAAoD;YACpD,gBAAgB;YAChB,OAAO,IAAI,CAAA;SACZ;aAAM,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,+CAA+C;YAC/C,iDAAiD;YACjD,uBAAuB;YACvB,OAAO,OAAO,CAAA;SACf;aAAM,IAAI,EAAE,KAAK,EAAE,EAAE;YACpB,4CAA4C;YAC5C,oDAAoD;YACpD,iDAAiD;YACjD,wBAAwB;YACxB,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAA;YAEvC,qBAAqB;SACtB;aAAM;YACL,yBAAyB;YACzB,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAA;SACxB;QACD,oBAAoB;IACtB,CAAC;IAED,WAAW;QACT,OAAO,IAAA,mBAAW,EAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC;IAED,KAAK,CAAC,OAAe;QACnB,IAAA,4CAAkB,EAAC,OAAO,CAAC,CAAA;QAE3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,YAAY;QACZ,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,gBAAQ,CAAA;QACrC,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,EAAE,CAAA;QAE7B,uDAAuD;QACvD,0DAA0D;QAC1D,IAAI,CAA0B,CAAA;QAC9B,IAAI,QAAQ,GAAoC,IAAI,CAAA;QACpD,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE;YAC/B,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAA;SAChD;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE;YAC5C,QAAQ,GAAG,CACT,OAAO,CAAC,MAAM;gBACZ,CAAC,CAAC,OAAO,CAAC,GAAG;oBACX,CAAC,CAAC,uBAAuB;oBACzB,CAAC,CAAC,oBAAoB;gBACxB,CAAC,CAAC,OAAO,CAAC,GAAG;oBACb,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,cAAc,CACnB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;SACR;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE;YACxC,QAAQ,GAAG,CACT,OAAO,CAAC,MAAM;gBACZ,CAAC,CAAC,OAAO,CAAC,GAAG;oBACX,CAAC,CAAC,mBAAmB;oBACrB,CAAC,CAAC,gBAAgB;gBACpB,CAAC,CAAC,OAAO,CAAC,GAAG;oBACb,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,UAAU,CACf,CAAC,CAAC,CAAC,CAAA;SACL;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE;YAC7C,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,eAAe,CAAA;SAC9D;aAAM,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE;YACzC,QAAQ,GAAG,WAAW,CAAA;SACvB;QAED,MAAM,EAAE,GAAG,YAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5D,OAAO,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC9D,CAAC;IAED,MAAM;QACJ,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC,MAAM,CAAA;QAE5D,mDAAmD;QACnD,4BAA4B;QAC5B,EAAE;QACF,wDAAwD;QACxD,yDAAyD;QACzD,2CAA2C;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QAEpB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;YACnB,OAAO,IAAI,CAAC,MAAM,CAAA;SACnB;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU;YAChC,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,OAAO,CAAC,GAAG;gBACb,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,YAAY,CAAA;QAChB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAElD,kCAAkC;QAClC,kDAAkD;QAClD,sEAAsE;QACtE,iDAAiD;QACjD,8DAA8D;QAC9D,mCAAmC;QACnC,IAAI,EAAE,GAAG,GAAG;aACT,GAAG,CAAC,OAAO,CAAC,EAAE;YACb,MAAM,EAAE,GAAiC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;gBACvD,IAAI,CAAC,YAAY,MAAM,EAAE;oBACvB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;iBAChD;gBACD,OAAO,OAAO,CAAC,KAAK,QAAQ;oBAC1B,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;oBACjB,CAAC,CAAC,CAAC,KAAK,gBAAQ;wBAChB,CAAC,CAAC,gBAAQ;wBACV,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YACZ,CAAC,CAAiC,CAAA;YAClC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtB,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;gBACtB,IAAI,CAAC,KAAK,gBAAQ,IAAI,IAAI,KAAK,gBAAQ,EAAE;oBACvC,OAAM;iBACP;gBACD,IAAI,IAAI,KAAK,SAAS,EAAE;oBACtB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,gBAAQ,EAAE;wBAC3C,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAA;qBACjD;yBAAM;wBACL,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAA;qBAChB;iBACF;qBAAM,IAAI,IAAI,KAAK,SAAS,EAAE;oBAC7B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAA;iBAC9C;qBAAM,IAAI,IAAI,KAAK,gBAAQ,EAAE;oBAC5B,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;oBACzD,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAQ,CAAA;iBACrB;YACH,CAAC,CAAC,CAAA;YACF,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,gBAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjD,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAA;QAEZ,+DAA+D;QAC/D,mEAAmE;QACnE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC9D,4BAA4B;QAC5B,gDAAgD;QAChD,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,GAAG,KAAK,GAAG,GAAG,CAAA;QAElC,gDAAgD;QAChD,IAAI,IAAI,CAAC,MAAM;YAAE,EAAE,GAAG,MAAM,GAAG,EAAE,GAAG,MAAM,CAAA;QAE1C,IAAI;YACF,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;YACjD,qBAAqB;SACtB;QAAC,OAAO,EAAE,EAAE;YACX,uBAAuB;YACvB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;SACpB;QACD,oBAAoB;QACpB,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,UAAU,CAAC,CAAS;QAClB,mDAAmD;QACnD,6DAA6D;QAC7D,8CAA8C;QAC9C,0CAA0C;QAC1C,IAAI,IAAI,CAAC,uBAAuB,EAAE;YAChC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;SACpB;aAAM,IAAI,IAAI,CAAC,SAAS,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YAClD,sCAAsC;YACtC,OAAO,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;SAC/B;aAAM;YACL,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;SACtB;IACH,CAAC;IAED,KAAK,CAAC,CAAS,EAAE,OAAO,GAAG,IAAI,CAAC,OAAO;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,8CAA8C;QAC9C,iBAAiB;QACjB,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO,KAAK,CAAA;SACb;QACD,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,EAAE,CAAA;SAChB;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,OAAO,EAAE;YACxB,OAAO,IAAI,CAAA;SACZ;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,gCAAgC;QAChC,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;SAC5B;QAED,6CAA6C;QAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;QAErC,0DAA0D;QAC1D,2DAA2D;QAC3D,mCAAmC;QACnC,uCAAuC;QAEvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAA;QACpB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;QAEpC,0EAA0E;QAC1E,IAAI,QAAQ,GAAW,EAAE,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACxC,IAAI,CAAC,QAAQ,EAAE;YACb,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;gBACpD,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;aACjB;SACF;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACnC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;YACtB,IAAI,IAAI,GAAG,EAAE,CAAA;YACb,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC7C,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAA;aAClB;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;YACjD,IAAI,GAAG,EAAE;gBACP,IAAI,OAAO,CAAC,UAAU,EAAE;oBACtB,OAAO,IAAI,CAAA;iBACZ;gBACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAA;aACpB;SACF;QAED,2DAA2D;QAC3D,8BAA8B;QAC9B,IAAI,OAAO,CAAC,UAAU,EAAE;YACtB,OAAO,KAAK,CAAA;SACb;QACD,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAqB;QACnC,OAAO,iBAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,CAAA;IAC1C,CAAC;CACF;AA53BD,8BA43BC;AACD,qBAAqB;AACrB,mCAA8B;AAArB,6FAAA,GAAG,OAAA;AACZ,yCAAoC;AAA3B,mGAAA,MAAM,OAAA;AACf,6CAAwC;AAA/B,uGAAA,QAAQ,OAAA;AACjB,oBAAoB;AACpB,iBAAS,CAAC,GAAG,GAAG,YAAG,CAAA;AACnB,iBAAS,CAAC,SAAS,GAAG,SAAS,CAAA;AAC/B,iBAAS,CAAC,MAAM,GAAG,kBAAM,CAAA;AACzB,iBAAS,CAAC,QAAQ,GAAG,sBAAQ,CAAA","sourcesContent":["import expand from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\ntype Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  nobrace?: boolean\n  nocomment?: boolean\n  nonegate?: boolean\n  debug?: boolean\n  noglobstar?: boolean\n  noext?: boolean\n  nonull?: boolean\n  windowsPathsNoEscape?: boolean\n  allowWindowsEscape?: boolean\n  partial?: boolean\n  dot?: boolean\n  nocase?: boolean\n  nocaseMagicOnly?: boolean\n  magicalBraces?: boolean\n  matchBase?: boolean\n  flipNegate?: boolean\n  preserveMultipleSlashes?: boolean\n  optimizationLevel?: number\n  platform?: Platform\n  windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\nexport default minimatch\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process\n    ? (typeof process.env === 'object' &&\n        process.env &&\n        process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n      process.platform\n    : 'posix'\n) as Platform\ntype Sep = '\\\\' | '/'\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {}\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick = {}\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick = {}\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n      orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li  for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined\n        ? options.windowsNoMagicRoot\n        : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: any[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      this.debug = (...args: any[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn all ** into *\n    if (this.options.noglobstar) {\n      for (let i = 0; i < globParts.length; i++) {\n        for (let j = 0; j < globParts[i].length; j++) {\n          if (globParts[i][j] === '**') {\n            globParts[i][j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n    do {\n      didSomething = false\n      // 
// -> 
/\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // 
/

/../ ->

/\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (p && p !== '.' && p !== '..' && p !== '**') {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // 
 is 1 or more portions\n  //  is 1 or more portions\n  // 

is any portion other than ., .., '', or **\n // is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n //

/**/../

/

/ -> {

/../

/

/,

/**/

/

/}\n //

// -> 
/\n  // 
/

/../ ->

/\n  // **/**/ -> **/\n  //\n  // **/*/ -> */**/ <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // 
/**/../

/

/ -> {

/../

/

/,

/**/

/

/}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n //

/**/**/ -> 
/**/\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // 
// -> 
/\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // 
/

/../ ->

/\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {
/*/,
/

/} ->

/*/\n  // {
/,
/} -> 
/\n  // {
/**/,
/} -> 
/**/\n  //\n  // {
/**/,
/**/

/} ->

/**/\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes\n        )\n        if (!matched) continue\n        globParts[i] = matched\n        globParts[j] = []\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n    const options = this.options\n\n    // a UNC pattern like //?/c:/* can match a path like c:/x\n    // and vice versa\n    if (this.isWindows) {\n      const fileUNC =\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        typeof file[3] === 'string' &&\n        /^[a-z]:$/i.test(file[3])\n      const patternUNC =\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      if (fileUNC && patternUNC) {\n        const fd = file[3] as string\n        const pd = pattern[3] as string\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          file[3] = pd\n        }\n      } else if (patternUNC && typeof file[0] === 'string') {\n        const pd = pattern[3] as string\n        const fd = file[0]\n        if (pd.toLowerCase() === fd.toLowerCase()) {\n          pattern[3] = fd\n          pattern = pattern.slice(3)\n        }\n      } else if (fileUNC && typeof pattern[0] === 'string') {\n        const fd = file[3]\n        if (fd.toLowerCase() === pattern[0].toLowerCase()) {\n          pattern[0] = fd\n          file = file.slice(3)\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // dont' need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    this.debug('matchOne', this, { file, pattern })\n    this.debug('matchOne', file.length, pattern.length)\n\n    for (\n      var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      var p = pattern[pi]\n      var f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      if (p === GLOBSTAR) {\n        this.debug('GLOBSTAR', [pattern, p, f])\n\n        // \"**\"\n        // a/**/b/**/c would match the following:\n        // a/b/x/y/z/c\n        // a/x/y/z/b/c\n        // a/b/x/b/x/c\n        // a/b/c\n        // To do this, take the rest of the pattern after\n        // the **, and see if it would match the file remainder.\n        // If so, return success.\n        // If not, the ** \"swallows\" a segment, and try again.\n        // This is recursively awful.\n        //\n        // a/**/b/**/c matching a/b/x/y/z/c\n        // - a matches a\n        // - doublestar\n        //   - matchOne(b/x/y/z/c, b/**/c)\n        //     - b matches b\n        //     - doublestar\n        //       - matchOne(x/y/z/c, c) -> no\n        //       - matchOne(y/z/c, c) -> no\n        //       - matchOne(z/c, c) -> no\n        //       - matchOne(c, c) yes, hit\n        var fr = fi\n        var pr = pi + 1\n        if (pr === pl) {\n          this.debug('** at the end')\n          // a ** at the end will just swallow the rest.\n          // We have found a match.\n          // however, it will not swallow /.x, unless\n          // options.dot is set.\n          // . and .. are *never* matched by **, for explosively\n          // exponential reasons.\n          for (; fi < fl; fi++) {\n            if (\n              file[fi] === '.' ||\n              file[fi] === '..' ||\n              (!options.dot && file[fi].charAt(0) === '.')\n            )\n              return false\n          }\n          return true\n        }\n\n        // ok, let's see if we can swallow whatever we can.\n        while (fr < fl) {\n          var swallowee = file[fr]\n\n          this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n          // XXX remove this slice.  Just pass the start index.\n          if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n            this.debug('globstar found match!', fr, fl, swallowee)\n            // found a match.\n            return true\n          } else {\n            // can't swallow \".\" or \"..\" ever.\n            // can only swallow \".foo\" when explicitly asked.\n            if (\n              swallowee === '.' ||\n              swallowee === '..' ||\n              (!options.dot && swallowee.charAt(0) === '.')\n            ) {\n              this.debug('dot detected!', file, fr, pattern, pr)\n              break\n            }\n\n            // ** swallows a segment, and continue.\n            this.debug('globstar swallow a segment, and continue')\n            fr++\n          }\n        }\n\n        // no match was found.\n        // However, in partial mode, we can't say this is necessarily over.\n        /* c8 ignore start */\n        if (partial) {\n          // ran out of file\n          this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n          if (fr === fl) {\n            return true\n          }\n        }\n        /* c8 ignore stop */\n        return false\n      }\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? starDotExtTestNocaseDot\n            : starDotExtTestNocase\n          : options.dot\n          ? starDotExtTestDot\n          : starDotExtTest\n      )(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? qmarksTestNocaseDot\n            : qmarksTestNocase\n          : options.dot\n          ? qmarksTestDot\n          : qmarksTest\n      )(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    return fastTest ? Object.assign(re, { test: fastTest }) : re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar = options.noglobstar\n      ? star\n      : options.dot\n      ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return typeof p === 'string'\n            ? regExpEscape(p)\n            : p === GLOBSTAR\n            ? GLOBSTAR\n            : p._src\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        return pp.filter(p => p !== GLOBSTAR).join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch (ex) {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (let i = 0; i < set.length; i++) {\n      const pattern = set[i]\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/cjs/package.json b/@capacitor/assets/node_modules/minimatch/dist/cjs/package.json
new file mode 100644
index 00000000..5bbefffb
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/cjs/package.json
@@ -0,0 +1,3 @@
+{
+  "type": "commonjs"
+}
diff --git a/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.d.ts b/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.d.ts
new file mode 100644
index 00000000..23a7b387
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.d.ts
@@ -0,0 +1,17 @@
+import { MinimatchOptions } from './index.js';
+/**
+ * Un-escape a string that has been escaped with {@link escape}.
+ *
+ * If the {@link windowsPathsNoEscape} option is used, then square-brace
+ * escapes are removed, but not backslash escapes.  For example, it will turn
+ * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
+ * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
+ *
+ * When `windowsPathsNoEscape` is not set, then both brace escapes and
+ * backslash escapes are removed.
+ *
+ * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
+ * or unescaped.
+ */
+export declare const unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
+//# sourceMappingURL=unescape.d.ts.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.d.ts.map b/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.d.ts.map
new file mode 100644
index 00000000..7ace0701
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,MAChB,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAKlD,CAAA"}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.js b/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.js
new file mode 100644
index 00000000..47c36bce
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.js
@@ -0,0 +1,24 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.unescape = void 0;
+/**
+ * Un-escape a string that has been escaped with {@link escape}.
+ *
+ * If the {@link windowsPathsNoEscape} option is used, then square-brace
+ * escapes are removed, but not backslash escapes.  For example, it will turn
+ * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
+ * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
+ *
+ * When `windowsPathsNoEscape` is not set, then both brace escapes and
+ * backslash escapes are removed.
+ *
+ * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
+ * or unescaped.
+ */
+const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
+    return windowsPathsNoEscape
+        ? s.replace(/\[([^\/\\])\]/g, '$1')
+        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
+};
+exports.unescape = unescape;
+//# sourceMappingURL=unescape.js.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.js.map b/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.js.map
new file mode 100644
index 00000000..353d3aa0
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/cjs/unescape.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":";;;AACA;;;;;;;;;;;;;GAaG;AACI,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AAChF,CAAC,CAAA;AATY,QAAA,QAAQ,YASpB","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then square-brace\n * escapes are removed, but not backslash escapes.  For example, it will turn\n * the string `'[*]'` into `*`, but it will not turn `'\\\\*'` into `'*'`,\n * becuase `\\` is a path separator in `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both brace escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n */\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n  }: Pick = {}\n) => {\n  return windowsPathsNoEscape\n    ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n    : s.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2').replace(/\\\\([^\\/])/g, '$1')\n}\n"]}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts b/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts
new file mode 100644
index 00000000..8e318b23
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts
@@ -0,0 +1,2 @@
+export declare const assertValidPattern: (pattern: any) => void;
+//# sourceMappingURL=assert-valid-pattern.d.ts.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts.map
new file mode 100644
index 00000000..c61c0310
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"assert-valid-pattern.d.ts","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,kBAAkB,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAUlD,CAAA"}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.js b/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.js
new file mode 100644
index 00000000..7b534fc3
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.js
@@ -0,0 +1,10 @@
+const MAX_PATTERN_LENGTH = 1024 * 64;
+export const assertValidPattern = (pattern) => {
+    if (typeof pattern !== 'string') {
+        throw new TypeError('invalid pattern');
+    }
+    if (pattern.length > MAX_PATTERN_LENGTH) {
+        throw new TypeError('pattern is too long');
+    }
+};
+//# sourceMappingURL=assert-valid-pattern.js.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.js.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.js.map
new file mode 100644
index 00000000..b1a5a0b9
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/assert-valid-pattern.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"assert-valid-pattern.js","sourceRoot":"","sources":["../../src/assert-valid-pattern.ts"],"names":[],"mappings":"AAAA,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,kBAAkB,GAA2B,CACxD,OAAY,EACe,EAAE;IAC7B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAA;KACvC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE;QACvC,MAAM,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAA;KAC3C;AACH,CAAC,CAAA","sourcesContent":["const MAX_PATTERN_LENGTH = 1024 * 64\nexport const assertValidPattern: (pattern: any) => void = (\n  pattern: any\n): asserts pattern is string => {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('invalid pattern')\n  }\n\n  if (pattern.length > MAX_PATTERN_LENGTH) {\n    throw new TypeError('pattern is too long')\n  }\n}\n"]}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.d.ts b/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.d.ts
new file mode 100644
index 00000000..01596d07
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.d.ts
@@ -0,0 +1,24 @@
+import { MinimatchOptions, MMRegExp } from './index.js';
+export type ExtglobType = '!' | '?' | '+' | '*' | '@';
+export declare class AST {
+    #private;
+    type: ExtglobType | null;
+    constructor(type: ExtglobType | null, parent?: AST, options?: MinimatchOptions);
+    get hasMagic(): boolean | undefined;
+    toString(): string;
+    push(...parts: (string | AST)[]): void;
+    toJSON(): any[];
+    isStart(): boolean;
+    isEnd(): boolean;
+    copyIn(part: AST | string): void;
+    clone(parent: AST): AST;
+    static fromGlob(pattern: string, options?: MinimatchOptions): AST;
+    toMMPattern(): MMRegExp | string;
+    toRegExpSource(): [
+        re: string,
+        body: string,
+        hasMagic: boolean,
+        uflag: boolean
+    ];
+}
+//# sourceMappingURL=ast.d.ts.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.d.ts.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.d.ts.map
new file mode 100644
index 00000000..c9abaaaf
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAyCvD,MAAM,MAAM,WAAW,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAkCrD,qBAAa,GAAG;;IACd,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;gBAiBtB,IAAI,EAAE,WAAW,GAAG,IAAI,EACxB,MAAM,CAAC,EAAE,GAAG,EACZ,OAAO,GAAE,gBAAqB;IAahC,IAAI,QAAQ,IAAI,OAAO,GAAG,SAAS,CAUlC;IAGD,QAAQ,IAAI,MAAM;IA+ClB,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;IAY/B,MAAM;IAgBN,OAAO,IAAI,OAAO;IAgBlB,KAAK,IAAI,OAAO;IAYhB,MAAM,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM;IAKzB,KAAK,CAAC,MAAM,EAAE,GAAG;IAsIjB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAQ/D,WAAW,IAAI,QAAQ,GAAG,MAAM;IAgGhC,cAAc,IAAI;QAChB,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,OAAO;KACf;CAoKF"}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.js b/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.js
new file mode 100644
index 00000000..67008fff
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.js
@@ -0,0 +1,562 @@
+// parse a single path portion
+import { parseClass } from './brace-expressions.js';
+import { unescape } from './unescape.js';
+const types = new Set(['!', '?', '+', '*', '@']);
+const isExtglobType = (c) => types.has(c);
+// Patterns that get prepended to bind to the start of either the
+// entire string, or just a single path portion, to prevent dots
+// and/or traversal patterns, when needed.
+// Exts don't need the ^ or / bit, because the root binds that already.
+const startNoTraversal = '(?!\\.\\.?(?:$|/))';
+const startNoDot = '(?!\\.)';
+// characters that indicate a start of pattern needs the "no dots" bit,
+// because a dot *might* be matched. ( is not in the list, because in
+// the case of a child extglob, it will handle the prevention itself.
+const addPatternStart = new Set(['[', '.']);
+// cases where traversal is A-OK, no dot prevention needed
+const justDots = new Set(['..', '.']);
+const reSpecials = new Set('().*{}+?[]^$\\!');
+const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
+// any single thing other than /
+const qmark = '[^/]';
+// * => any number of characters
+const star = qmark + '*?';
+// use + when we need to ensure that *something* matches, because the * is
+// the only thing in the path portion.
+const starNoEmpty = qmark + '+?';
+// remove the \ chars that we added if we end up doing a nonmagic compare
+// const deslash = (s: string) => s.replace(/\\(.)/g, '$1')
+export class AST {
+    type;
+    #root;
+    #hasMagic;
+    #uflag = false;
+    #parts = [];
+    #parent;
+    #parentIndex;
+    #negs;
+    #filledNegs = false;
+    #options;
+    #toString;
+    // set to true if it's an extglob with no children
+    // (which really means one child of '')
+    #emptyExt = false;
+    constructor(type, parent, options = {}) {
+        this.type = type;
+        // extglobs are inherently magical
+        if (type)
+            this.#hasMagic = true;
+        this.#parent = parent;
+        this.#root = this.#parent ? this.#parent.#root : this;
+        this.#options = this.#root === this ? options : this.#root.#options;
+        this.#negs = this.#root === this ? [] : this.#root.#negs;
+        if (type === '!' && !this.#root.#filledNegs)
+            this.#negs.push(this);
+        this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0;
+    }
+    get hasMagic() {
+        /* c8 ignore start */
+        if (this.#hasMagic !== undefined)
+            return this.#hasMagic;
+        /* c8 ignore stop */
+        for (const p of this.#parts) {
+            if (typeof p === 'string')
+                continue;
+            if (p.type || p.hasMagic)
+                return (this.#hasMagic = true);
+        }
+        // note: will be undefined until we generate the regexp src and find out
+        return this.#hasMagic;
+    }
+    // reconstructs the pattern
+    toString() {
+        if (this.#toString !== undefined)
+            return this.#toString;
+        if (!this.type) {
+            return (this.#toString = this.#parts.map(p => String(p)).join(''));
+        }
+        else {
+            return (this.#toString =
+                this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')');
+        }
+    }
+    #fillNegs() {
+        /* c8 ignore start */
+        if (this !== this.#root)
+            throw new Error('should only call on root');
+        if (this.#filledNegs)
+            return this;
+        /* c8 ignore stop */
+        // call toString() once to fill this out
+        this.toString();
+        this.#filledNegs = true;
+        let n;
+        while ((n = this.#negs.pop())) {
+            if (n.type !== '!')
+                continue;
+            // walk up the tree, appending everthing that comes AFTER parentIndex
+            let p = n;
+            let pp = p.#parent;
+            while (pp) {
+                for (let i = p.#parentIndex + 1; !pp.type && i < pp.#parts.length; i++) {
+                    for (const part of n.#parts) {
+                        /* c8 ignore start */
+                        if (typeof part === 'string') {
+                            throw new Error('string part in extglob AST??');
+                        }
+                        /* c8 ignore stop */
+                        part.copyIn(pp.#parts[i]);
+                    }
+                }
+                p = pp;
+                pp = p.#parent;
+            }
+        }
+        return this;
+    }
+    push(...parts) {
+        for (const p of parts) {
+            if (p === '')
+                continue;
+            /* c8 ignore start */
+            if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {
+                throw new Error('invalid part: ' + p);
+            }
+            /* c8 ignore stop */
+            this.#parts.push(p);
+        }
+    }
+    toJSON() {
+        const ret = this.type === null
+            ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))
+            : [this.type, ...this.#parts.map(p => p.toJSON())];
+        if (this.isStart() && !this.type)
+            ret.unshift([]);
+        if (this.isEnd() &&
+            (this === this.#root ||
+                (this.#root.#filledNegs && this.#parent?.type === '!'))) {
+            ret.push({});
+        }
+        return ret;
+    }
+    isStart() {
+        if (this.#root === this)
+            return true;
+        // if (this.type) return !!this.#parent?.isStart()
+        if (!this.#parent?.isStart())
+            return false;
+        if (this.#parentIndex === 0)
+            return true;
+        // if everything AHEAD of this is a negation, then it's still the "start"
+        const p = this.#parent;
+        for (let i = 0; i < this.#parentIndex; i++) {
+            const pp = p.#parts[i];
+            if (!(pp instanceof AST && pp.type === '!')) {
+                return false;
+            }
+        }
+        return true;
+    }
+    isEnd() {
+        if (this.#root === this)
+            return true;
+        if (this.#parent?.type === '!')
+            return true;
+        if (!this.#parent?.isEnd())
+            return false;
+        if (!this.type)
+            return this.#parent?.isEnd();
+        // if not root, it'll always have a parent
+        /* c8 ignore start */
+        const pl = this.#parent ? this.#parent.#parts.length : 0;
+        /* c8 ignore stop */
+        return this.#parentIndex === pl - 1;
+    }
+    copyIn(part) {
+        if (typeof part === 'string')
+            this.push(part);
+        else
+            this.push(part.clone(this));
+    }
+    clone(parent) {
+        const c = new AST(this.type, parent);
+        for (const p of this.#parts) {
+            c.copyIn(p);
+        }
+        return c;
+    }
+    static #parseAST(str, ast, pos, opt) {
+        let escaping = false;
+        let inBrace = false;
+        let braceStart = -1;
+        let braceNeg = false;
+        if (ast.type === null) {
+            // outside of a extglob, append until we find a start
+            let i = pos;
+            let acc = '';
+            while (i < str.length) {
+                const c = str.charAt(i++);
+                // still accumulate escapes at this point, but we do ignore
+                // starts that are escaped
+                if (escaping || c === '\\') {
+                    escaping = !escaping;
+                    acc += c;
+                    continue;
+                }
+                if (inBrace) {
+                    if (i === braceStart + 1) {
+                        if (c === '^' || c === '!') {
+                            braceNeg = true;
+                        }
+                    }
+                    else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
+                        inBrace = false;
+                    }
+                    acc += c;
+                    continue;
+                }
+                else if (c === '[') {
+                    inBrace = true;
+                    braceStart = i;
+                    braceNeg = false;
+                    acc += c;
+                    continue;
+                }
+                if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {
+                    ast.push(acc);
+                    acc = '';
+                    const ext = new AST(c, ast);
+                    i = AST.#parseAST(str, ext, i, opt);
+                    ast.push(ext);
+                    continue;
+                }
+                acc += c;
+            }
+            ast.push(acc);
+            return i;
+        }
+        // some kind of extglob, pos is at the (
+        // find the next | or )
+        let i = pos + 1;
+        let part = new AST(null, ast);
+        const parts = [];
+        let acc = '';
+        while (i < str.length) {
+            const c = str.charAt(i++);
+            // still accumulate escapes at this point, but we do ignore
+            // starts that are escaped
+            if (escaping || c === '\\') {
+                escaping = !escaping;
+                acc += c;
+                continue;
+            }
+            if (inBrace) {
+                if (i === braceStart + 1) {
+                    if (c === '^' || c === '!') {
+                        braceNeg = true;
+                    }
+                }
+                else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {
+                    inBrace = false;
+                }
+                acc += c;
+                continue;
+            }
+            else if (c === '[') {
+                inBrace = true;
+                braceStart = i;
+                braceNeg = false;
+                acc += c;
+                continue;
+            }
+            if (isExtglobType(c) && str.charAt(i) === '(') {
+                part.push(acc);
+                acc = '';
+                const ext = new AST(c, part);
+                part.push(ext);
+                i = AST.#parseAST(str, ext, i, opt);
+                continue;
+            }
+            if (c === '|') {
+                part.push(acc);
+                acc = '';
+                parts.push(part);
+                part = new AST(null, ast);
+                continue;
+            }
+            if (c === ')') {
+                if (acc === '' && ast.#parts.length === 0) {
+                    ast.#emptyExt = true;
+                }
+                part.push(acc);
+                acc = '';
+                ast.push(...parts, part);
+                return i;
+            }
+            acc += c;
+        }
+        // unfinished extglob
+        // if we got here, it was a malformed extglob! not an extglob, but
+        // maybe something else in there.
+        ast.type = null;
+        ast.#hasMagic = undefined;
+        ast.#parts = [str.substring(pos - 1)];
+        return i;
+    }
+    static fromGlob(pattern, options = {}) {
+        const ast = new AST(null, undefined, options);
+        AST.#parseAST(pattern, ast, 0, options);
+        return ast;
+    }
+    // returns the regular expression if there's magic, or the unescaped
+    // string if not.
+    toMMPattern() {
+        // should only be called on root
+        /* c8 ignore start */
+        if (this !== this.#root)
+            return this.#root.toMMPattern();
+        /* c8 ignore stop */
+        const glob = this.toString();
+        const [re, body, hasMagic, uflag] = this.toRegExpSource();
+        // if we're in nocase mode, and not nocaseMagicOnly, then we do
+        // still need a regular expression if we have to case-insensitively
+        // match capital/lowercase characters.
+        const anyMagic = hasMagic ||
+            this.#hasMagic ||
+            (this.#options.nocase &&
+                !this.#options.nocaseMagicOnly &&
+                glob.toUpperCase() !== glob.toLowerCase());
+        if (!anyMagic) {
+            return body;
+        }
+        const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '');
+        return Object.assign(new RegExp(`^${re}$`, flags), {
+            _src: re,
+            _glob: glob,
+        });
+    }
+    // returns the string match, the regexp source, whether there's magic
+    // in the regexp (so a regular expression is required) and whether or
+    // not the uflag is needed for the regular expression (for posix classes)
+    // TODO: instead of injecting the start/end at this point, just return
+    // the BODY of the regexp, along with the start/end portions suitable
+    // for binding the start/end in either a joined full-path makeRe context
+    // (where we bind to (^|/), or a standalone matchPart context (where
+    // we bind to ^, and not /).  Otherwise slashes get duped!
+    //
+    // In part-matching mode, the start is:
+    // - if not isStart: nothing
+    // - if traversal possible, but not allowed: ^(?!\.\.?$)
+    // - if dots allowed or not possible: ^
+    // - if dots possible and not allowed: ^(?!\.)
+    // end is:
+    // - if not isEnd(): nothing
+    // - else: $
+    //
+    // In full-path matching mode, we put the slash at the START of the
+    // pattern, so start is:
+    // - if first pattern: same as part-matching mode
+    // - if not isStart(): nothing
+    // - if traversal possible, but not allowed: /(?!\.\.?(?:$|/))
+    // - if dots allowed or not possible: /
+    // - if dots possible and not allowed: /(?!\.)
+    // end is:
+    // - if last pattern, same as part-matching mode
+    // - else nothing
+    //
+    // Always put the (?:$|/) on negated tails, though, because that has to be
+    // there to bind the end of the negated pattern portion, and it's easier to
+    // just stick it in now rather than try to inject it later in the middle of
+    // the pattern.
+    //
+    // We can just always return the same end, and leave it up to the caller
+    // to know whether it's going to be used joined or in parts.
+    // And, if the start is adjusted slightly, can do the same there:
+    // - if not isStart: nothing
+    // - if traversal possible, but not allowed: (?:/|^)(?!\.\.?$)
+    // - if dots allowed or not possible: (?:/|^)
+    // - if dots possible and not allowed: (?:/|^)(?!\.)
+    //
+    // But it's better to have a simpler binding without a conditional, for
+    // performance, so probably better to return both start options.
+    //
+    // Then the caller just ignores the end if it's not the first pattern,
+    // and the start always gets applied.
+    //
+    // But that's always going to be $ if it's the ending pattern, or nothing,
+    // so the caller can just attach $ at the end of the pattern when building.
+    //
+    // So the todo is:
+    // - better detect what kind of start is needed
+    // - return both flavors of starting pattern
+    // - attach $ at the end of the pattern when creating the actual RegExp
+    //
+    // Ah, but wait, no, that all only applies to the root when the first pattern
+    // is not an extglob. If the first pattern IS an extglob, then we need all
+    // that dot prevention biz to live in the extglob portions, because eg
+    // +(*|.x*) can match .xy but not .yx.
+    //
+    // So, return the two flavors if it's #root and the first child is not an
+    // AST, otherwise leave it to the child AST to handle it, and there,
+    // use the (?:^|/) style of start binding.
+    //
+    // Even simplified further:
+    // - Since the start for a join is eg /(?!\.) and the start for a part
+    // is ^(?!\.), we can just prepend (?!\.) to the pattern (either root
+    // or start or whatever) and prepend ^ or / at the Regexp construction.
+    toRegExpSource() {
+        if (this.#root === this)
+            this.#fillNegs();
+        if (!this.type) {
+            const noEmpty = this.isStart() && this.isEnd();
+            const src = this.#parts
+                .map(p => {
+                const [re, _, hasMagic, uflag] = typeof p === 'string'
+                    ? AST.#parseGlob(p, this.#hasMagic, noEmpty)
+                    : p.toRegExpSource();
+                this.#hasMagic = this.#hasMagic || hasMagic;
+                this.#uflag = this.#uflag || uflag;
+                return re;
+            })
+                .join('');
+            let start = '';
+            if (this.isStart()) {
+                if (typeof this.#parts[0] === 'string') {
+                    // this is the string that will match the start of the pattern,
+                    // so we need to protect against dots and such.
+                    // '.' and '..' cannot match unless the pattern is that exactly,
+                    // even if it starts with . or dot:true is set.
+                    const dotTravAllowed = this.#parts.length === 1 && justDots.has(this.#parts[0]);
+                    if (!dotTravAllowed) {
+                        const aps = addPatternStart;
+                        // check if we have a possibility of matching . or ..,
+                        // and prevent that.
+                        const needNoTrav = 
+                        // dots are allowed, and the pattern starts with [ or .
+                        (this.#options.dot && aps.has(src.charAt(0))) ||
+                            // the pattern starts with \., and then [ or .
+                            (src.startsWith('\\.') && aps.has(src.charAt(2))) ||
+                            // the pattern starts with \.\., and then [ or .
+                            (src.startsWith('\\.\\.') && aps.has(src.charAt(4)));
+                        // no need to prevent dots if it can't match a dot, or if a
+                        // sub-pattern will be preventing it anyway.
+                        const needNoDot = !this.#options.dot && aps.has(src.charAt(0));
+                        start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : '';
+                    }
+                }
+            }
+            // append the "end of path portion" pattern to negation tails
+            let end = '';
+            if (this.isEnd() &&
+                this.#root.#filledNegs &&
+                this.#parent?.type === '!') {
+                end = '(?:$|\\/)';
+            }
+            const final = start + src + end;
+            return [
+                final,
+                unescape(src),
+                (this.#hasMagic = !!this.#hasMagic),
+                this.#uflag,
+            ];
+        }
+        // some kind of extglob
+        const start = this.type === '!' ? '(?:(?!(?:' : '(?:';
+        const body = this.#parts
+            .map(p => {
+            // extglob ASTs should only contain parent ASTs
+            /* c8 ignore start */
+            if (typeof p === 'string') {
+                throw new Error('string type in extglob ast??');
+            }
+            /* c8 ignore stop */
+            // can ignore hasMagic, because extglobs are already always magic
+            const [re, _, _hasMagic, uflag] = p.toRegExpSource();
+            this.#uflag = this.#uflag || uflag;
+            return re;
+        })
+            .filter(p => !(this.isStart() && this.isEnd()) || !!p)
+            .join('|');
+        if (this.isStart() && this.isEnd() && !body && this.type !== '!') {
+            // invalid extglob, has to at least be *something* present, if it's
+            // the entire path portion.
+            const s = this.toString();
+            this.#parts = [s];
+            this.type = null;
+            this.#hasMagic = undefined;
+            return [s, unescape(this.toString()), false, false];
+        }
+        // an empty !() is exactly equivalent to a starNoEmpty
+        let final = '';
+        if (this.type === '!' && this.#emptyExt) {
+            final =
+                (this.isStart() && !this.#options.dot ? startNoDot : '') + starNoEmpty;
+        }
+        else {
+            const close = this.type === '!'
+                ? // !() must match something,but !(x) can match ''
+                    '))' +
+                        (this.isStart() && !this.#options.dot ? startNoDot : '') +
+                        star +
+                        ')'
+                : this.type === '@'
+                    ? ')'
+                    : `)${this.type}`;
+            final = start + body + close;
+        }
+        return [
+            final,
+            unescape(body),
+            (this.#hasMagic = !!this.#hasMagic),
+            this.#uflag,
+        ];
+    }
+    static #parseGlob(glob, hasMagic, noEmpty = false) {
+        let escaping = false;
+        let re = '';
+        let uflag = false;
+        for (let i = 0; i < glob.length; i++) {
+            const c = glob.charAt(i);
+            if (escaping) {
+                escaping = false;
+                re += (reSpecials.has(c) ? '\\' : '') + c;
+                continue;
+            }
+            if (c === '\\') {
+                if (i === glob.length - 1) {
+                    re += '\\\\';
+                }
+                else {
+                    escaping = true;
+                }
+                continue;
+            }
+            if (c === '[') {
+                const [src, needUflag, consumed, magic] = parseClass(glob, i);
+                if (consumed) {
+                    re += src;
+                    uflag = uflag || needUflag;
+                    i += consumed - 1;
+                    hasMagic = hasMagic || magic;
+                    continue;
+                }
+            }
+            if (c === '*') {
+                if (noEmpty && glob === '*')
+                    re += starNoEmpty;
+                else
+                    re += star;
+                hasMagic = true;
+                continue;
+            }
+            if (c === '?') {
+                re += qmark;
+                hasMagic = true;
+                continue;
+            }
+            re += regExpEscape(c);
+        }
+        return [re, unescape(glob), !!hasMagic, uflag];
+    }
+}
+//# sourceMappingURL=ast.js.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.js.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.js.map
new file mode 100644
index 00000000..fb01783b
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/ast.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"ast.js","sourceRoot":"","sources":["../../src/ast.ts"],"names":[],"mappings":"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","sourcesContent":["// parse a single path portion\n\nimport { MinimatchOptions, MMRegExp } from './index.js'\nimport { parseClass } from './brace-expressions.js'\nimport { unescape } from './unescape.js'\n\n// classes [] are handled by the parseClass method\n// for positive extglobs, we sub-parse the contents, and combine,\n// with the appropriate regexp close.\n// for negative extglobs, we sub-parse the contents, but then\n// have to include the rest of the pattern, then the parent, etc.,\n// as the thing that cannot be because RegExp negative lookaheads\n// are different from globs.\n//\n// So for example:\n// a@(i|w!(x|y)z|j)b => ^a(i|w((!?(x|y)zb).*)z|j)b$\n//   1   2 3   4 5 6      1   2    3   46      5 6\n//\n// Assembling the extglob requires not just the negated patterns themselves,\n// but also anything following the negative patterns up to the boundary\n// of the current pattern, plus anything following in the parent pattern.\n//\n//\n// So, first, we parse the string into an AST of extglobs, without turning\n// anything into regexps yet.\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y']}, 'z'], ['j']]}, 'b']\n//\n// Then, for all the negative extglobs, we append whatever comes after in\n// each parent as their tail\n//\n// ['a', {@ [['i'], ['w', {!['x', 'y'], 'z', 'b'}, 'z'], ['j']]}, 'b']\n//\n// Lastly, we turn each of these pieces into a regexp, and join\n//\n//                                 v----- .* because there's more following,\n//                                 v    v  otherwise, .+ because it must be\n//                                 v    v  *something* there.\n// ['^a', {@ ['i', 'w(?:(!?(?:x|y).*zb$).*)z', 'j' ]}, 'b$']\n//   copy what follows into here--^^^^^\n// ['^a', '(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)', 'b$']\n// ['^a(?:i|w(?:(?!(?:x|y).*zb$).*)z|j)b$']\n\nexport type ExtglobType = '!' | '?' | '+' | '*' | '@'\nconst types = new Set(['!', '?', '+', '*', '@'])\nconst isExtglobType = (c: string): c is ExtglobType =>\n  types.has(c as ExtglobType)\n\n// Patterns that get prepended to bind to the start of either the\n// entire string, or just a single path portion, to prevent dots\n// and/or traversal patterns, when needed.\n// Exts don't need the ^ or / bit, because the root binds that already.\nconst startNoTraversal = '(?!\\\\.\\\\.?(?:$|/))'\nconst startNoDot = '(?!\\\\.)'\n\n// characters that indicate a start of pattern needs the \"no dots\" bit,\n// because a dot *might* be matched. ( is not in the list, because in\n// the case of a child extglob, it will handle the prevention itself.\nconst addPatternStart = new Set(['[', '.'])\n// cases where traversal is A-OK, no dot prevention needed\nconst justDots = new Set(['..', '.'])\nconst reSpecials = new Set('().*{}+?[]^$\\\\!')\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// any single thing other than /\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n// use + when we need to ensure that *something* matches, because the * is\n// the only thing in the path portion.\nconst starNoEmpty = qmark + '+?'\n\n// remove the \\ chars that we added if we end up doing a nonmagic compare\n// const deslash = (s: string) => s.replace(/\\\\(.)/g, '$1')\n\nexport class AST {\n  type: ExtglobType | null\n  readonly #root: AST\n\n  #hasMagic?: boolean\n  #uflag: boolean = false\n  #parts: (string | AST)[] = []\n  readonly #parent?: AST\n  readonly #parentIndex: number\n  #negs: AST[]\n  #filledNegs: boolean = false\n  #options: MinimatchOptions\n  #toString?: string\n  // set to true if it's an extglob with no children\n  // (which really means one child of '')\n  #emptyExt: boolean = false\n\n  constructor(\n    type: ExtglobType | null,\n    parent?: AST,\n    options: MinimatchOptions = {}\n  ) {\n    this.type = type\n    // extglobs are inherently magical\n    if (type) this.#hasMagic = true\n    this.#parent = parent\n    this.#root = this.#parent ? this.#parent.#root : this\n    this.#options = this.#root === this ? options : this.#root.#options\n    this.#negs = this.#root === this ? [] : this.#root.#negs\n    if (type === '!' && !this.#root.#filledNegs) this.#negs.push(this)\n    this.#parentIndex = this.#parent ? this.#parent.#parts.length : 0\n  }\n\n  get hasMagic(): boolean | undefined {\n    /* c8 ignore start */\n    if (this.#hasMagic !== undefined) return this.#hasMagic\n    /* c8 ignore stop */\n    for (const p of this.#parts) {\n      if (typeof p === 'string') continue\n      if (p.type || p.hasMagic) return (this.#hasMagic = true)\n    }\n    // note: will be undefined until we generate the regexp src and find out\n    return this.#hasMagic\n  }\n\n  // reconstructs the pattern\n  toString(): string {\n    if (this.#toString !== undefined) return this.#toString\n    if (!this.type) {\n      return (this.#toString = this.#parts.map(p => String(p)).join(''))\n    } else {\n      return (this.#toString =\n        this.type + '(' + this.#parts.map(p => String(p)).join('|') + ')')\n    }\n  }\n\n  #fillNegs() {\n    /* c8 ignore start */\n    if (this !== this.#root) throw new Error('should only call on root')\n    if (this.#filledNegs) return this\n    /* c8 ignore stop */\n\n    // call toString() once to fill this out\n    this.toString()\n    this.#filledNegs = true\n    let n: AST | undefined\n    while ((n = this.#negs.pop())) {\n      if (n.type !== '!') continue\n      // walk up the tree, appending everthing that comes AFTER parentIndex\n      let p: AST | undefined = n\n      let pp = p.#parent\n      while (pp) {\n        for (\n          let i = p.#parentIndex + 1;\n          !pp.type && i < pp.#parts.length;\n          i++\n        ) {\n          for (const part of n.#parts) {\n            /* c8 ignore start */\n            if (typeof part === 'string') {\n              throw new Error('string part in extglob AST??')\n            }\n            /* c8 ignore stop */\n            part.copyIn(pp.#parts[i])\n          }\n        }\n        p = pp\n        pp = p.#parent\n      }\n    }\n    return this\n  }\n\n  push(...parts: (string | AST)[]) {\n    for (const p of parts) {\n      if (p === '') continue\n      /* c8 ignore start */\n      if (typeof p !== 'string' && !(p instanceof AST && p.#parent === this)) {\n        throw new Error('invalid part: ' + p)\n      }\n      /* c8 ignore stop */\n      this.#parts.push(p)\n    }\n  }\n\n  toJSON() {\n    const ret: any[] =\n      this.type === null\n        ? this.#parts.slice().map(p => (typeof p === 'string' ? p : p.toJSON()))\n        : [this.type, ...this.#parts.map(p => (p as AST).toJSON())]\n    if (this.isStart() && !this.type) ret.unshift([])\n    if (\n      this.isEnd() &&\n      (this === this.#root ||\n        (this.#root.#filledNegs && this.#parent?.type === '!'))\n    ) {\n      ret.push({})\n    }\n    return ret\n  }\n\n  isStart(): boolean {\n    if (this.#root === this) return true\n    // if (this.type) return !!this.#parent?.isStart()\n    if (!this.#parent?.isStart()) return false\n    if (this.#parentIndex === 0) return true\n    // if everything AHEAD of this is a negation, then it's still the \"start\"\n    const p = this.#parent\n    for (let i = 0; i < this.#parentIndex; i++) {\n      const pp = p.#parts[i]\n      if (!(pp instanceof AST && pp.type === '!')) {\n        return false\n      }\n    }\n    return true\n  }\n\n  isEnd(): boolean {\n    if (this.#root === this) return true\n    if (this.#parent?.type === '!') return true\n    if (!this.#parent?.isEnd()) return false\n    if (!this.type) return this.#parent?.isEnd()\n    // if not root, it'll always have a parent\n    /* c8 ignore start */\n    const pl = this.#parent ? this.#parent.#parts.length : 0\n    /* c8 ignore stop */\n    return this.#parentIndex === pl - 1\n  }\n\n  copyIn(part: AST | string) {\n    if (typeof part === 'string') this.push(part)\n    else this.push(part.clone(this))\n  }\n\n  clone(parent: AST) {\n    const c = new AST(this.type, parent)\n    for (const p of this.#parts) {\n      c.copyIn(p)\n    }\n    return c\n  }\n\n  static #parseAST(\n    str: string,\n    ast: AST,\n    pos: number,\n    opt: MinimatchOptions\n  ): number {\n    let escaping = false\n    let inBrace = false\n    let braceStart = -1\n    let braceNeg = false\n    if (ast.type === null) {\n      // outside of a extglob, append until we find a start\n      let i = pos\n      let acc = ''\n      while (i < str.length) {\n        const c = str.charAt(i++)\n        // still accumulate escapes at this point, but we do ignore\n        // starts that are escaped\n        if (escaping || c === '\\\\') {\n          escaping = !escaping\n          acc += c\n          continue\n        }\n\n        if (inBrace) {\n          if (i === braceStart + 1) {\n            if (c === '^' || c === '!') {\n              braceNeg = true\n            }\n          } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n            inBrace = false\n          }\n          acc += c\n          continue\n        } else if (c === '[') {\n          inBrace = true\n          braceStart = i\n          braceNeg = false\n          acc += c\n          continue\n        }\n\n        if (!opt.noext && isExtglobType(c) && str.charAt(i) === '(') {\n          ast.push(acc)\n          acc = ''\n          const ext = new AST(c, ast)\n          i = AST.#parseAST(str, ext, i, opt)\n          ast.push(ext)\n          continue\n        }\n        acc += c\n      }\n      ast.push(acc)\n      return i\n    }\n\n    // some kind of extglob, pos is at the (\n    // find the next | or )\n    let i = pos + 1\n    let part = new AST(null, ast)\n    const parts: AST[] = []\n    let acc = ''\n    while (i < str.length) {\n      const c = str.charAt(i++)\n      // still accumulate escapes at this point, but we do ignore\n      // starts that are escaped\n      if (escaping || c === '\\\\') {\n        escaping = !escaping\n        acc += c\n        continue\n      }\n\n      if (inBrace) {\n        if (i === braceStart + 1) {\n          if (c === '^' || c === '!') {\n            braceNeg = true\n          }\n        } else if (c === ']' && !(i === braceStart + 2 && braceNeg)) {\n          inBrace = false\n        }\n        acc += c\n        continue\n      } else if (c === '[') {\n        inBrace = true\n        braceStart = i\n        braceNeg = false\n        acc += c\n        continue\n      }\n\n      if (isExtglobType(c) && str.charAt(i) === '(') {\n        part.push(acc)\n        acc = ''\n        const ext = new AST(c, part)\n        part.push(ext)\n        i = AST.#parseAST(str, ext, i, opt)\n        continue\n      }\n      if (c === '|') {\n        part.push(acc)\n        acc = ''\n        parts.push(part)\n        part = new AST(null, ast)\n        continue\n      }\n      if (c === ')') {\n        if (acc === '' && ast.#parts.length === 0) {\n          ast.#emptyExt = true\n        }\n        part.push(acc)\n        acc = ''\n        ast.push(...parts, part)\n        return i\n      }\n      acc += c\n    }\n\n    // unfinished extglob\n    // if we got here, it was a malformed extglob! not an extglob, but\n    // maybe something else in there.\n    ast.type = null\n    ast.#hasMagic = undefined\n    ast.#parts = [str.substring(pos - 1)]\n    return i\n  }\n\n  static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n    const ast = new AST(null, undefined, options)\n    AST.#parseAST(pattern, ast, 0, options)\n    return ast\n  }\n\n  // returns the regular expression if there's magic, or the unescaped\n  // string if not.\n  toMMPattern(): MMRegExp | string {\n    // should only be called on root\n    /* c8 ignore start */\n    if (this !== this.#root) return this.#root.toMMPattern()\n    /* c8 ignore stop */\n    const glob = this.toString()\n    const [re, body, hasMagic, uflag] = this.toRegExpSource()\n    // if we're in nocase mode, and not nocaseMagicOnly, then we do\n    // still need a regular expression if we have to case-insensitively\n    // match capital/lowercase characters.\n    const anyMagic =\n      hasMagic ||\n      this.#hasMagic ||\n      (this.#options.nocase &&\n        !this.#options.nocaseMagicOnly &&\n        glob.toUpperCase() !== glob.toLowerCase())\n    if (!anyMagic) {\n      return body\n    }\n\n    const flags = (this.#options.nocase ? 'i' : '') + (uflag ? 'u' : '')\n    return Object.assign(new RegExp(`^${re}$`, flags), {\n      _src: re,\n      _glob: glob,\n    })\n  }\n\n  // returns the string match, the regexp source, whether there's magic\n  // in the regexp (so a regular expression is required) and whether or\n  // not the uflag is needed for the regular expression (for posix classes)\n  // TODO: instead of injecting the start/end at this point, just return\n  // the BODY of the regexp, along with the start/end portions suitable\n  // for binding the start/end in either a joined full-path makeRe context\n  // (where we bind to (^|/), or a standalone matchPart context (where\n  // we bind to ^, and not /).  Otherwise slashes get duped!\n  //\n  // In part-matching mode, the start is:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: ^(?!\\.\\.?$)\n  // - if dots allowed or not possible: ^\n  // - if dots possible and not allowed: ^(?!\\.)\n  // end is:\n  // - if not isEnd(): nothing\n  // - else: $\n  //\n  // In full-path matching mode, we put the slash at the START of the\n  // pattern, so start is:\n  // - if first pattern: same as part-matching mode\n  // - if not isStart(): nothing\n  // - if traversal possible, but not allowed: /(?!\\.\\.?(?:$|/))\n  // - if dots allowed or not possible: /\n  // - if dots possible and not allowed: /(?!\\.)\n  // end is:\n  // - if last pattern, same as part-matching mode\n  // - else nothing\n  //\n  // Always put the (?:$|/) on negated tails, though, because that has to be\n  // there to bind the end of the negated pattern portion, and it's easier to\n  // just stick it in now rather than try to inject it later in the middle of\n  // the pattern.\n  //\n  // We can just always return the same end, and leave it up to the caller\n  // to know whether it's going to be used joined or in parts.\n  // And, if the start is adjusted slightly, can do the same there:\n  // - if not isStart: nothing\n  // - if traversal possible, but not allowed: (?:/|^)(?!\\.\\.?$)\n  // - if dots allowed or not possible: (?:/|^)\n  // - if dots possible and not allowed: (?:/|^)(?!\\.)\n  //\n  // But it's better to have a simpler binding without a conditional, for\n  // performance, so probably better to return both start options.\n  //\n  // Then the caller just ignores the end if it's not the first pattern,\n  // and the start always gets applied.\n  //\n  // But that's always going to be $ if it's the ending pattern, or nothing,\n  // so the caller can just attach $ at the end of the pattern when building.\n  //\n  // So the todo is:\n  // - better detect what kind of start is needed\n  // - return both flavors of starting pattern\n  // - attach $ at the end of the pattern when creating the actual RegExp\n  //\n  // Ah, but wait, no, that all only applies to the root when the first pattern\n  // is not an extglob. If the first pattern IS an extglob, then we need all\n  // that dot prevention biz to live in the extglob portions, because eg\n  // +(*|.x*) can match .xy but not .yx.\n  //\n  // So, return the two flavors if it's #root and the first child is not an\n  // AST, otherwise leave it to the child AST to handle it, and there,\n  // use the (?:^|/) style of start binding.\n  //\n  // Even simplified further:\n  // - Since the start for a join is eg /(?!\\.) and the start for a part\n  // is ^(?!\\.), we can just prepend (?!\\.) to the pattern (either root\n  // or start or whatever) and prepend ^ or / at the Regexp construction.\n  toRegExpSource(): [\n    re: string,\n    body: string,\n    hasMagic: boolean,\n    uflag: boolean\n  ] {\n    if (this.#root === this) this.#fillNegs()\n    if (!this.type) {\n      const noEmpty = this.isStart() && this.isEnd()\n      const src = this.#parts\n        .map(p => {\n          const [re, _, hasMagic, uflag] =\n            typeof p === 'string'\n              ? AST.#parseGlob(p, this.#hasMagic, noEmpty)\n              : p.toRegExpSource()\n          this.#hasMagic = this.#hasMagic || hasMagic\n          this.#uflag = this.#uflag || uflag\n          return re\n        })\n        .join('')\n\n      let start = ''\n      if (this.isStart()) {\n        if (typeof this.#parts[0] === 'string') {\n          // this is the string that will match the start of the pattern,\n          // so we need to protect against dots and such.\n\n          // '.' and '..' cannot match unless the pattern is that exactly,\n          // even if it starts with . or dot:true is set.\n          const dotTravAllowed =\n            this.#parts.length === 1 && justDots.has(this.#parts[0])\n          if (!dotTravAllowed) {\n            const aps = addPatternStart\n            // check if we have a possibility of matching . or ..,\n            // and prevent that.\n            const needNoTrav =\n              // dots are allowed, and the pattern starts with [ or .\n              (this.#options.dot && aps.has(src.charAt(0))) ||\n              // the pattern starts with \\., and then [ or .\n              (src.startsWith('\\\\.') && aps.has(src.charAt(2))) ||\n              // the pattern starts with \\.\\., and then [ or .\n              (src.startsWith('\\\\.\\\\.') && aps.has(src.charAt(4)))\n            // no need to prevent dots if it can't match a dot, or if a\n            // sub-pattern will be preventing it anyway.\n            const needNoDot = !this.#options.dot && aps.has(src.charAt(0))\n\n            start = needNoTrav ? startNoTraversal : needNoDot ? startNoDot : ''\n          }\n        }\n      }\n\n      // append the \"end of path portion\" pattern to negation tails\n      let end = ''\n      if (\n        this.isEnd() &&\n        this.#root.#filledNegs &&\n        this.#parent?.type === '!'\n      ) {\n        end = '(?:$|\\\\/)'\n      }\n      const final = start + src + end\n      return [\n        final,\n        unescape(src),\n        (this.#hasMagic = !!this.#hasMagic),\n        this.#uflag,\n      ]\n    }\n\n    // some kind of extglob\n    const start = this.type === '!' ? '(?:(?!(?:' : '(?:'\n    const body = this.#parts\n      .map(p => {\n        // extglob ASTs should only contain parent ASTs\n        /* c8 ignore start */\n        if (typeof p === 'string') {\n          throw new Error('string type in extglob ast??')\n        }\n        /* c8 ignore stop */\n        // can ignore hasMagic, because extglobs are already always magic\n        const [re, _, _hasMagic, uflag] = p.toRegExpSource()\n        this.#uflag = this.#uflag || uflag\n        return re\n      })\n      .filter(p => !(this.isStart() && this.isEnd()) || !!p)\n      .join('|')\n    if (this.isStart() && this.isEnd() && !body && this.type !== '!') {\n      // invalid extglob, has to at least be *something* present, if it's\n      // the entire path portion.\n      const s = this.toString()\n      this.#parts = [s]\n      this.type = null\n      this.#hasMagic = undefined\n      return [s, unescape(this.toString()), false, false]\n    }\n    // an empty !() is exactly equivalent to a starNoEmpty\n    let final = ''\n    if (this.type === '!' && this.#emptyExt) {\n      final =\n        (this.isStart() && !this.#options.dot ? startNoDot : '') + starNoEmpty\n    } else {\n      const close =\n        this.type === '!'\n          ? // !() must match something,but !(x) can match ''\n            '))' +\n            (this.isStart() && !this.#options.dot ? startNoDot : '') +\n            star +\n            ')'\n          : this.type === '@'\n          ? ')'\n          : `)${this.type}`\n      final = start + body + close\n    }\n    return [\n      final,\n      unescape(body),\n      (this.#hasMagic = !!this.#hasMagic),\n      this.#uflag,\n    ]\n  }\n\n  static #parseGlob(\n    glob: string,\n    hasMagic: boolean | undefined,\n    noEmpty: boolean = false\n  ): [re: string, body: string, hasMagic: boolean, uflag: boolean] {\n    let escaping = false\n    let re = ''\n    let uflag = false\n    for (let i = 0; i < glob.length; i++) {\n      const c = glob.charAt(i)\n      if (escaping) {\n        escaping = false\n        re += (reSpecials.has(c) ? '\\\\' : '') + c\n        continue\n      }\n      if (c === '\\\\') {\n        if (i === glob.length - 1) {\n          re += '\\\\\\\\'\n        } else {\n          escaping = true\n        }\n        continue\n      }\n      if (c === '[') {\n        const [src, needUflag, consumed, magic] = parseClass(glob, i)\n        if (consumed) {\n          re += src\n          uflag = uflag || needUflag\n          i += consumed - 1\n          hasMagic = hasMagic || magic\n          continue\n        }\n      }\n      if (c === '*') {\n        if (noEmpty && glob === '*') re += starNoEmpty\n        else re += star\n        hasMagic = true\n        continue\n      }\n      if (c === '?') {\n        re += qmark\n        hasMagic = true\n        continue\n      }\n      re += regExpEscape(c)\n    }\n    return [re, unescape(glob), !!hasMagic, uflag]\n  }\n}\n"]}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.d.ts b/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.d.ts
new file mode 100644
index 00000000..b1572deb
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.d.ts
@@ -0,0 +1,8 @@
+export type ParseClassResult = [
+    src: string,
+    uFlag: boolean,
+    consumed: number,
+    hasMagic: boolean
+];
+export declare const parseClass: (glob: string, position: number) => ParseClassResult;
+//# sourceMappingURL=brace-expressions.d.ts.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.d.ts.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.d.ts.map
new file mode 100644
index 00000000..d3949648
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"brace-expressions.d.ts","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"AA+BA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM;IACX,KAAK,EAAE,OAAO;IACd,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,OAAO;CAClB,CAAA;AAQD,eAAO,MAAM,UAAU,SACf,MAAM,YACF,MAAM,qBA8HjB,CAAA"}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.js b/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.js
new file mode 100644
index 00000000..c629d6ae
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.js
@@ -0,0 +1,148 @@
+// translate the various posix character classes into unicode properties
+// this works across all unicode locales
+// { : [, /u flag required, negated]
+const posixClasses = {
+    '[:alnum:]': ['\\p{L}\\p{Nl}\\p{Nd}', true],
+    '[:alpha:]': ['\\p{L}\\p{Nl}', true],
+    '[:ascii:]': ['\\x' + '00-\\x' + '7f', false],
+    '[:blank:]': ['\\p{Zs}\\t', true],
+    '[:cntrl:]': ['\\p{Cc}', true],
+    '[:digit:]': ['\\p{Nd}', true],
+    '[:graph:]': ['\\p{Z}\\p{C}', true, true],
+    '[:lower:]': ['\\p{Ll}', true],
+    '[:print:]': ['\\p{C}', true],
+    '[:punct:]': ['\\p{P}', true],
+    '[:space:]': ['\\p{Z}\\t\\r\\n\\v\\f', true],
+    '[:upper:]': ['\\p{Lu}', true],
+    '[:word:]': ['\\p{L}\\p{Nl}\\p{Nd}\\p{Pc}', true],
+    '[:xdigit:]': ['A-Fa-f0-9', false],
+};
+// only need to escape a few things inside of brace expressions
+// escapes: [ \ ] -
+const braceEscape = (s) => s.replace(/[[\]\\-]/g, '\\$&');
+// escape all regexp magic characters
+const regexpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
+// everything has already been escaped, we just have to join
+const rangesToString = (ranges) => ranges.join('');
+// takes a glob string at a posix brace expression, and returns
+// an equivalent regular expression source, and boolean indicating
+// whether the /u flag needs to be applied, and the number of chars
+// consumed to parse the character class.
+// This also removes out of order ranges, and returns ($.) if the
+// entire class just no good.
+export const parseClass = (glob, position) => {
+    const pos = position;
+    /* c8 ignore start */
+    if (glob.charAt(pos) !== '[') {
+        throw new Error('not in a brace expression');
+    }
+    /* c8 ignore stop */
+    const ranges = [];
+    const negs = [];
+    let i = pos + 1;
+    let sawStart = false;
+    let uflag = false;
+    let escaping = false;
+    let negate = false;
+    let endPos = pos;
+    let rangeStart = '';
+    WHILE: while (i < glob.length) {
+        const c = glob.charAt(i);
+        if ((c === '!' || c === '^') && i === pos + 1) {
+            negate = true;
+            i++;
+            continue;
+        }
+        if (c === ']' && sawStart && !escaping) {
+            endPos = i + 1;
+            break;
+        }
+        sawStart = true;
+        if (c === '\\') {
+            if (!escaping) {
+                escaping = true;
+                i++;
+                continue;
+            }
+            // escaped \ char, fall through and treat like normal char
+        }
+        if (c === '[' && !escaping) {
+            // either a posix class, a collation equivalent, or just a [
+            for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {
+                if (glob.startsWith(cls, i)) {
+                    // invalid, [a-[] is fine, but not [a-[:alpha]]
+                    if (rangeStart) {
+                        return ['$.', false, glob.length - pos, true];
+                    }
+                    i += cls.length;
+                    if (neg)
+                        negs.push(unip);
+                    else
+                        ranges.push(unip);
+                    uflag = uflag || u;
+                    continue WHILE;
+                }
+            }
+        }
+        // now it's just a normal character, effectively
+        escaping = false;
+        if (rangeStart) {
+            // throw this range away if it's not valid, but others
+            // can still match.
+            if (c > rangeStart) {
+                ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c));
+            }
+            else if (c === rangeStart) {
+                ranges.push(braceEscape(c));
+            }
+            rangeStart = '';
+            i++;
+            continue;
+        }
+        // now might be the start of a range.
+        // can be either c-d or c-] or c] or c] at this point
+        if (glob.startsWith('-]', i + 1)) {
+            ranges.push(braceEscape(c + '-'));
+            i += 2;
+            continue;
+        }
+        if (glob.startsWith('-', i + 1)) {
+            rangeStart = c;
+            i += 2;
+            continue;
+        }
+        // not the start of a range, just a single character
+        ranges.push(braceEscape(c));
+        i++;
+    }
+    if (endPos < i) {
+        // didn't see the end of the class, not a valid class,
+        // but might still be valid as a literal match.
+        return ['', false, 0, false];
+    }
+    // if we got no ranges and no negates, then we have a range that
+    // cannot possibly match anything, and that poisons the whole glob
+    if (!ranges.length && !negs.length) {
+        return ['$.', false, glob.length - pos, true];
+    }
+    // if we got one positive range, and it's a single character, then that's
+    // not actually a magic pattern, it's just that one literal character.
+    // we should not treat that as "magic", we should just return the literal
+    // character. [_] is a perfectly valid way to escape glob magic chars.
+    if (negs.length === 0 &&
+        ranges.length === 1 &&
+        /^\\?.$/.test(ranges[0]) &&
+        !negate) {
+        const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0];
+        return [regexpEscape(r), false, endPos - pos, false];
+    }
+    const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']';
+    const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']';
+    const comb = ranges.length && negs.length
+        ? '(' + sranges + '|' + snegs + ')'
+        : ranges.length
+            ? sranges
+            : snegs;
+    return [comb, uflag, endPos - pos, true];
+};
+//# sourceMappingURL=brace-expressions.js.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.js.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.js.map
new file mode 100644
index 00000000..cdba30da
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/brace-expressions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"brace-expressions.js","sourceRoot":"","sources":["../../src/brace-expressions.ts"],"names":[],"mappings":"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","sourcesContent":["// translate the various posix character classes into unicode properties\n// this works across all unicode locales\n\n// { : [, /u flag required, negated]\nconst posixClasses: { [k: string]: [e: string, u: boolean, n?: boolean] } = {\n  '[:alnum:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}', true],\n  '[:alpha:]': ['\\\\p{L}\\\\p{Nl}', true],\n  '[:ascii:]': ['\\\\x' + '00-\\\\x' + '7f', false],\n  '[:blank:]': ['\\\\p{Zs}\\\\t', true],\n  '[:cntrl:]': ['\\\\p{Cc}', true],\n  '[:digit:]': ['\\\\p{Nd}', true],\n  '[:graph:]': ['\\\\p{Z}\\\\p{C}', true, true],\n  '[:lower:]': ['\\\\p{Ll}', true],\n  '[:print:]': ['\\\\p{C}', true],\n  '[:punct:]': ['\\\\p{P}', true],\n  '[:space:]': ['\\\\p{Z}\\\\t\\\\r\\\\n\\\\v\\\\f', true],\n  '[:upper:]': ['\\\\p{Lu}', true],\n  '[:word:]': ['\\\\p{L}\\\\p{Nl}\\\\p{Nd}\\\\p{Pc}', true],\n  '[:xdigit:]': ['A-Fa-f0-9', false],\n}\n\n// only need to escape a few things inside of brace expressions\n// escapes: [ \\ ] -\nconst braceEscape = (s: string) => s.replace(/[[\\]\\\\-]/g, '\\\\$&')\n// escape all regexp magic characters\nconst regexpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\n// everything has already been escaped, we just have to join\nconst rangesToString = (ranges: string[]): string => ranges.join('')\n\nexport type ParseClassResult = [\n  src: string,\n  uFlag: boolean,\n  consumed: number,\n  hasMagic: boolean\n]\n\n// takes a glob string at a posix brace expression, and returns\n// an equivalent regular expression source, and boolean indicating\n// whether the /u flag needs to be applied, and the number of chars\n// consumed to parse the character class.\n// This also removes out of order ranges, and returns ($.) if the\n// entire class just no good.\nexport const parseClass = (\n  glob: string,\n  position: number\n): ParseClassResult => {\n  const pos = position\n  /* c8 ignore start */\n  if (glob.charAt(pos) !== '[') {\n    throw new Error('not in a brace expression')\n  }\n  /* c8 ignore stop */\n  const ranges: string[] = []\n  const negs: string[] = []\n\n  let i = pos + 1\n  let sawStart = false\n  let uflag = false\n  let escaping = false\n  let negate = false\n  let endPos = pos\n  let rangeStart = ''\n  WHILE: while (i < glob.length) {\n    const c = glob.charAt(i)\n    if ((c === '!' || c === '^') && i === pos + 1) {\n      negate = true\n      i++\n      continue\n    }\n\n    if (c === ']' && sawStart && !escaping) {\n      endPos = i + 1\n      break\n    }\n\n    sawStart = true\n    if (c === '\\\\') {\n      if (!escaping) {\n        escaping = true\n        i++\n        continue\n      }\n      // escaped \\ char, fall through and treat like normal char\n    }\n    if (c === '[' && !escaping) {\n      // either a posix class, a collation equivalent, or just a [\n      for (const [cls, [unip, u, neg]] of Object.entries(posixClasses)) {\n        if (glob.startsWith(cls, i)) {\n          // invalid, [a-[] is fine, but not [a-[:alpha]]\n          if (rangeStart) {\n            return ['$.', false, glob.length - pos, true]\n          }\n          i += cls.length\n          if (neg) negs.push(unip)\n          else ranges.push(unip)\n          uflag = uflag || u\n          continue WHILE\n        }\n      }\n    }\n\n    // now it's just a normal character, effectively\n    escaping = false\n    if (rangeStart) {\n      // throw this range away if it's not valid, but others\n      // can still match.\n      if (c > rangeStart) {\n        ranges.push(braceEscape(rangeStart) + '-' + braceEscape(c))\n      } else if (c === rangeStart) {\n        ranges.push(braceEscape(c))\n      }\n      rangeStart = ''\n      i++\n      continue\n    }\n\n    // now might be the start of a range.\n    // can be either c-d or c-] or c] or c] at this point\n    if (glob.startsWith('-]', i + 1)) {\n      ranges.push(braceEscape(c + '-'))\n      i += 2\n      continue\n    }\n    if (glob.startsWith('-', i + 1)) {\n      rangeStart = c\n      i += 2\n      continue\n    }\n\n    // not the start of a range, just a single character\n    ranges.push(braceEscape(c))\n    i++\n  }\n\n  if (endPos < i) {\n    // didn't see the end of the class, not a valid class,\n    // but might still be valid as a literal match.\n    return ['', false, 0, false]\n  }\n\n  // if we got no ranges and no negates, then we have a range that\n  // cannot possibly match anything, and that poisons the whole glob\n  if (!ranges.length && !negs.length) {\n    return ['$.', false, glob.length - pos, true]\n  }\n\n  // if we got one positive range, and it's a single character, then that's\n  // not actually a magic pattern, it's just that one literal character.\n  // we should not treat that as \"magic\", we should just return the literal\n  // character. [_] is a perfectly valid way to escape glob magic chars.\n  if (\n    negs.length === 0 &&\n    ranges.length === 1 &&\n    /^\\\\?.$/.test(ranges[0]) &&\n    !negate\n  ) {\n    const r = ranges[0].length === 2 ? ranges[0].slice(-1) : ranges[0]\n    return [regexpEscape(r), false, endPos - pos, false]\n  }\n\n  const sranges = '[' + (negate ? '^' : '') + rangesToString(ranges) + ']'\n  const snegs = '[' + (negate ? '' : '^') + rangesToString(negs) + ']'\n  const comb =\n    ranges.length && negs.length\n      ? '(' + sranges + '|' + snegs + ')'\n      : ranges.length\n      ? sranges\n      : snegs\n\n  return [comb, uflag, endPos - pos, true]\n}\n"]}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.d.ts b/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.d.ts
new file mode 100644
index 00000000..dc3e3163
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.d.ts
@@ -0,0 +1,12 @@
+import { MinimatchOptions } from './index.js';
+/**
+ * Escape all magic characters in a glob pattern.
+ *
+ * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
+ * option is used, then characters are escaped by wrapping in `[]`, because
+ * a magic character wrapped in a character class can only be satisfied by
+ * that exact character.  In this mode, `\` is _not_ escaped, because it is
+ * not interpreted as a magic character, but instead as a path separator.
+ */
+export declare const escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
+//# sourceMappingURL=escape.d.ts.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.d.ts.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.d.ts.map
new file mode 100644
index 00000000..0779dae7
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"escape.d.ts","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,MACd,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAQlD,CAAA"}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.js b/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.js
new file mode 100644
index 00000000..16f7c8c7
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.js
@@ -0,0 +1,18 @@
+/**
+ * Escape all magic characters in a glob pattern.
+ *
+ * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}
+ * option is used, then characters are escaped by wrapping in `[]`, because
+ * a magic character wrapped in a character class can only be satisfied by
+ * that exact character.  In this mode, `\` is _not_ escaped, because it is
+ * not interpreted as a magic character, but instead as a path separator.
+ */
+export const escape = (s, { windowsPathsNoEscape = false, } = {}) => {
+    // don't need to escape +@! because we escape the parens
+    // that make those magic, and escaping ! as [!] isn't valid,
+    // because [!]] is a valid glob class meaning not ']'.
+    return windowsPathsNoEscape
+        ? s.replace(/[?*()[\]]/g, '[$&]')
+        : s.replace(/[?*()[\]\\]/g, '\\$&');
+};
+//# sourceMappingURL=escape.js.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.js.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.js.map
new file mode 100644
index 00000000..170fd1ad
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/escape.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"escape.js","sourceRoot":"","sources":["../../src/escape.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,wDAAwD;IACxD,4DAA4D;IAC5D,sDAAsD;IACtD,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC;QACjC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;AACvC,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Escape all magic characters in a glob pattern.\n *\n * If the {@link windowsPathsNoEscape | GlobOptions.windowsPathsNoEscape}\n * option is used, then characters are escaped by wrapping in `[]`, because\n * a magic character wrapped in a character class can only be satisfied by\n * that exact character.  In this mode, `\\` is _not_ escaped, because it is\n * not interpreted as a magic character, but instead as a path separator.\n */\nexport const escape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n  }: Pick = {}\n) => {\n  // don't need to escape +@! because we escape the parens\n  // that make those magic, and escaping ! as [!] isn't valid,\n  // because [!]] is a valid glob class meaning not ']'.\n  return windowsPathsNoEscape\n    ? s.replace(/[?*()[\\]]/g, '[$&]')\n    : s.replace(/[?*()[\\]\\\\]/g, '\\\\$&')\n}\n"]}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/index.d.ts b/@capacitor/assets/node_modules/minimatch/dist/mjs/index.d.ts
new file mode 100644
index 00000000..9c0e0a33
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/index.d.ts
@@ -0,0 +1,95 @@
+import { AST } from './ast.js';
+type Platform = 'aix' | 'android' | 'darwin' | 'freebsd' | 'haiku' | 'linux' | 'openbsd' | 'sunos' | 'win32' | 'cygwin' | 'netbsd';
+export interface MinimatchOptions {
+    nobrace?: boolean;
+    nocomment?: boolean;
+    nonegate?: boolean;
+    debug?: boolean;
+    noglobstar?: boolean;
+    noext?: boolean;
+    nonull?: boolean;
+    windowsPathsNoEscape?: boolean;
+    allowWindowsEscape?: boolean;
+    partial?: boolean;
+    dot?: boolean;
+    nocase?: boolean;
+    nocaseMagicOnly?: boolean;
+    magicalBraces?: boolean;
+    matchBase?: boolean;
+    flipNegate?: boolean;
+    preserveMultipleSlashes?: boolean;
+    optimizationLevel?: number;
+    platform?: Platform;
+    windowsNoMagicRoot?: boolean;
+}
+export declare const minimatch: {
+    (p: string, pattern: string, options?: MinimatchOptions): boolean;
+    sep: Sep;
+    GLOBSTAR: typeof GLOBSTAR;
+    filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
+    defaults: (def: MinimatchOptions) => typeof minimatch;
+    braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
+    makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
+    match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
+    AST: typeof AST;
+    Minimatch: typeof Minimatch;
+    escape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
+    unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
+};
+export default minimatch;
+type Sep = '\\' | '/';
+export declare const sep: Sep;
+export declare const GLOBSTAR: unique symbol;
+export declare const filter: (pattern: string, options?: MinimatchOptions) => (p: string) => boolean;
+export declare const defaults: (def: MinimatchOptions) => typeof minimatch;
+export declare const braceExpand: (pattern: string, options?: MinimatchOptions) => string[];
+export declare const makeRe: (pattern: string, options?: MinimatchOptions) => false | MMRegExp;
+export declare const match: (list: string[], pattern: string, options?: MinimatchOptions) => string[];
+export type MMRegExp = RegExp & {
+    _src?: string;
+    _glob?: string;
+};
+export type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR;
+export type ParseReturn = ParseReturnFiltered | false;
+export declare class Minimatch {
+    options: MinimatchOptions;
+    set: ParseReturnFiltered[][];
+    pattern: string;
+    windowsPathsNoEscape: boolean;
+    nonegate: boolean;
+    negate: boolean;
+    comment: boolean;
+    empty: boolean;
+    preserveMultipleSlashes: boolean;
+    partial: boolean;
+    globSet: string[];
+    globParts: string[][];
+    nocase: boolean;
+    isWindows: boolean;
+    platform: Platform;
+    windowsNoMagicRoot: boolean;
+    regexp: false | null | MMRegExp;
+    constructor(pattern: string, options?: MinimatchOptions);
+    hasMagic(): boolean;
+    debug(..._: any[]): void;
+    make(): void;
+    preprocess(globParts: string[][]): string[][];
+    adjascentGlobstarOptimize(globParts: string[][]): string[][];
+    levelOneOptimize(globParts: string[][]): string[][];
+    levelTwoFileOptimize(parts: string | string[]): string[];
+    firstPhasePreProcess(globParts: string[][]): string[][];
+    secondPhasePreProcess(globParts: string[][]): string[][];
+    partsMatch(a: string[], b: string[], emptyGSMatch?: boolean): false | string[];
+    parseNegate(): void;
+    matchOne(file: string[], pattern: ParseReturn[], partial?: boolean): boolean;
+    braceExpand(): string[];
+    parse(pattern: string): ParseReturn;
+    makeRe(): false | MMRegExp;
+    slashSplit(p: string): string[];
+    match(f: string, partial?: boolean): boolean;
+    static defaults(def: MinimatchOptions): typeof Minimatch;
+}
+export { AST } from './ast.js';
+export { escape } from './escape.js';
+export { unescape } from './unescape.js';
+//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/index.d.ts.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/index.d.ts.map
new file mode 100644
index 00000000..8ba51430
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/index.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/index.js b/@capacitor/assets/node_modules/minimatch/dist/mjs/index.js
new file mode 100644
index 00000000..28aaf004
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/index.js
@@ -0,0 +1,1000 @@
+import expand from 'brace-expansion';
+import { assertValidPattern } from './assert-valid-pattern.js';
+import { AST } from './ast.js';
+import { escape } from './escape.js';
+import { unescape } from './unescape.js';
+export const minimatch = (p, pattern, options = {}) => {
+    assertValidPattern(pattern);
+    // shortcut: comments match nothing.
+    if (!options.nocomment && pattern.charAt(0) === '#') {
+        return false;
+    }
+    return new Minimatch(pattern, options).match(p);
+};
+export default minimatch;
+// Optimized checking for the most common glob patterns.
+const starDotExtRE = /^\*+([^+@!?\*\[\(]*)$/;
+const starDotExtTest = (ext) => (f) => !f.startsWith('.') && f.endsWith(ext);
+const starDotExtTestDot = (ext) => (f) => f.endsWith(ext);
+const starDotExtTestNocase = (ext) => {
+    ext = ext.toLowerCase();
+    return (f) => !f.startsWith('.') && f.toLowerCase().endsWith(ext);
+};
+const starDotExtTestNocaseDot = (ext) => {
+    ext = ext.toLowerCase();
+    return (f) => f.toLowerCase().endsWith(ext);
+};
+const starDotStarRE = /^\*+\.\*+$/;
+const starDotStarTest = (f) => !f.startsWith('.') && f.includes('.');
+const starDotStarTestDot = (f) => f !== '.' && f !== '..' && f.includes('.');
+const dotStarRE = /^\.\*+$/;
+const dotStarTest = (f) => f !== '.' && f !== '..' && f.startsWith('.');
+const starRE = /^\*+$/;
+const starTest = (f) => f.length !== 0 && !f.startsWith('.');
+const starTestDot = (f) => f.length !== 0 && f !== '.' && f !== '..';
+const qmarksRE = /^\?+([^+@!?\*\[\(]*)?$/;
+const qmarksTestNocase = ([$0, ext = '']) => {
+    const noext = qmarksTestNoExt([$0]);
+    if (!ext)
+        return noext;
+    ext = ext.toLowerCase();
+    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
+};
+const qmarksTestNocaseDot = ([$0, ext = '']) => {
+    const noext = qmarksTestNoExtDot([$0]);
+    if (!ext)
+        return noext;
+    ext = ext.toLowerCase();
+    return (f) => noext(f) && f.toLowerCase().endsWith(ext);
+};
+const qmarksTestDot = ([$0, ext = '']) => {
+    const noext = qmarksTestNoExtDot([$0]);
+    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
+};
+const qmarksTest = ([$0, ext = '']) => {
+    const noext = qmarksTestNoExt([$0]);
+    return !ext ? noext : (f) => noext(f) && f.endsWith(ext);
+};
+const qmarksTestNoExt = ([$0]) => {
+    const len = $0.length;
+    return (f) => f.length === len && !f.startsWith('.');
+};
+const qmarksTestNoExtDot = ([$0]) => {
+    const len = $0.length;
+    return (f) => f.length === len && f !== '.' && f !== '..';
+};
+/* c8 ignore start */
+const defaultPlatform = (typeof process === 'object' && process
+    ? (typeof process.env === 'object' &&
+        process.env &&
+        process.env.__MINIMATCH_TESTING_PLATFORM__) ||
+        process.platform
+    : 'posix');
+const path = {
+    win32: { sep: '\\' },
+    posix: { sep: '/' },
+};
+/* c8 ignore stop */
+export const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep;
+minimatch.sep = sep;
+export const GLOBSTAR = Symbol('globstar **');
+minimatch.GLOBSTAR = GLOBSTAR;
+// any single thing other than /
+// don't need to escape / when using new RegExp()
+const qmark = '[^/]';
+// * => any number of characters
+const star = qmark + '*?';
+// ** when dots are allowed.  Anything goes, except .. and .
+// not (^ or / followed by one or two dots followed by $ or /),
+// followed by anything, any number of times.
+const twoStarDot = '(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?';
+// not a ^ or / followed by a dot,
+// followed by anything, any number of times.
+const twoStarNoDot = '(?:(?!(?:\\/|^)\\.).)*?';
+export const filter = (pattern, options = {}) => (p) => minimatch(p, pattern, options);
+minimatch.filter = filter;
+const ext = (a, b = {}) => Object.assign({}, a, b);
+export const defaults = (def) => {
+    if (!def || typeof def !== 'object' || !Object.keys(def).length) {
+        return minimatch;
+    }
+    const orig = minimatch;
+    const m = (p, pattern, options = {}) => orig(p, pattern, ext(def, options));
+    return Object.assign(m, {
+        Minimatch: class Minimatch extends orig.Minimatch {
+            constructor(pattern, options = {}) {
+                super(pattern, ext(def, options));
+            }
+            static defaults(options) {
+                return orig.defaults(ext(def, options)).Minimatch;
+            }
+        },
+        AST: class AST extends orig.AST {
+            /* c8 ignore start */
+            constructor(type, parent, options = {}) {
+                super(type, parent, ext(def, options));
+            }
+            /* c8 ignore stop */
+            static fromGlob(pattern, options = {}) {
+                return orig.AST.fromGlob(pattern, ext(def, options));
+            }
+        },
+        unescape: (s, options = {}) => orig.unescape(s, ext(def, options)),
+        escape: (s, options = {}) => orig.escape(s, ext(def, options)),
+        filter: (pattern, options = {}) => orig.filter(pattern, ext(def, options)),
+        defaults: (options) => orig.defaults(ext(def, options)),
+        makeRe: (pattern, options = {}) => orig.makeRe(pattern, ext(def, options)),
+        braceExpand: (pattern, options = {}) => orig.braceExpand(pattern, ext(def, options)),
+        match: (list, pattern, options = {}) => orig.match(list, pattern, ext(def, options)),
+        sep: orig.sep,
+        GLOBSTAR: GLOBSTAR,
+    });
+};
+minimatch.defaults = defaults;
+// Brace expansion:
+// a{b,c}d -> abd acd
+// a{b,}c -> abc ac
+// a{0..3}d -> a0d a1d a2d a3d
+// a{b,c{d,e}f}g -> abg acdfg acefg
+// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
+//
+// Invalid sets are not expanded.
+// a{2..}b -> a{2..}b
+// a{b}c -> a{b}c
+export const braceExpand = (pattern, options = {}) => {
+    assertValidPattern(pattern);
+    // Thanks to Yeting Li  for
+    // improving this regexp to avoid a ReDOS vulnerability.
+    if (options.nobrace || !/\{(?:(?!\{).)*\}/.test(pattern)) {
+        // shortcut. no need to expand.
+        return [pattern];
+    }
+    return expand(pattern);
+};
+minimatch.braceExpand = braceExpand;
+// parse a component of the expanded set.
+// At this point, no pattern may contain "/" in it
+// so we're going to return a 2d array, where each entry is the full
+// pattern, split on '/', and then turned into a regular expression.
+// A regexp is made at the end which joins each array with an
+// escaped /, and another full one which joins each regexp with |.
+//
+// Following the lead of Bash 4.1, note that "**" only has special meaning
+// when it is the *only* thing in a path portion.  Otherwise, any series
+// of * is equivalent to a single *.  Globstar behavior is enabled by
+// default, and can be disabled by setting options.noglobstar.
+export const makeRe = (pattern, options = {}) => new Minimatch(pattern, options).makeRe();
+minimatch.makeRe = makeRe;
+export const match = (list, pattern, options = {}) => {
+    const mm = new Minimatch(pattern, options);
+    list = list.filter(f => mm.match(f));
+    if (mm.options.nonull && !list.length) {
+        list.push(pattern);
+    }
+    return list;
+};
+minimatch.match = match;
+// replace stuff like \* with *
+const globMagic = /[?*]|[+@!]\(.*?\)|\[|\]/;
+const regExpEscape = (s) => s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
+export class Minimatch {
+    options;
+    set;
+    pattern;
+    windowsPathsNoEscape;
+    nonegate;
+    negate;
+    comment;
+    empty;
+    preserveMultipleSlashes;
+    partial;
+    globSet;
+    globParts;
+    nocase;
+    isWindows;
+    platform;
+    windowsNoMagicRoot;
+    regexp;
+    constructor(pattern, options = {}) {
+        assertValidPattern(pattern);
+        options = options || {};
+        this.options = options;
+        this.pattern = pattern;
+        this.platform = options.platform || defaultPlatform;
+        this.isWindows = this.platform === 'win32';
+        this.windowsPathsNoEscape =
+            !!options.windowsPathsNoEscape || options.allowWindowsEscape === false;
+        if (this.windowsPathsNoEscape) {
+            this.pattern = this.pattern.replace(/\\/g, '/');
+        }
+        this.preserveMultipleSlashes = !!options.preserveMultipleSlashes;
+        this.regexp = null;
+        this.negate = false;
+        this.nonegate = !!options.nonegate;
+        this.comment = false;
+        this.empty = false;
+        this.partial = !!options.partial;
+        this.nocase = !!this.options.nocase;
+        this.windowsNoMagicRoot =
+            options.windowsNoMagicRoot !== undefined
+                ? options.windowsNoMagicRoot
+                : !!(this.isWindows && this.nocase);
+        this.globSet = [];
+        this.globParts = [];
+        this.set = [];
+        // make the set of regexps etc.
+        this.make();
+    }
+    hasMagic() {
+        if (this.options.magicalBraces && this.set.length > 1) {
+            return true;
+        }
+        for (const pattern of this.set) {
+            for (const part of pattern) {
+                if (typeof part !== 'string')
+                    return true;
+            }
+        }
+        return false;
+    }
+    debug(..._) { }
+    make() {
+        const pattern = this.pattern;
+        const options = this.options;
+        // empty patterns and comments match nothing.
+        if (!options.nocomment && pattern.charAt(0) === '#') {
+            this.comment = true;
+            return;
+        }
+        if (!pattern) {
+            this.empty = true;
+            return;
+        }
+        // step 1: figure out negation, etc.
+        this.parseNegate();
+        // step 2: expand braces
+        this.globSet = [...new Set(this.braceExpand())];
+        if (options.debug) {
+            this.debug = (...args) => console.error(...args);
+        }
+        this.debug(this.pattern, this.globSet);
+        // step 3: now we have a set, so turn each one into a series of
+        // path-portion matching patterns.
+        // These will be regexps, except in the case of "**", which is
+        // set to the GLOBSTAR object for globstar behavior,
+        // and will not contain any / characters
+        //
+        // First, we preprocess to make the glob pattern sets a bit simpler
+        // and deduped.  There are some perf-killing patterns that can cause
+        // problems with a glob walk, but we can simplify them down a bit.
+        const rawGlobParts = this.globSet.map(s => this.slashSplit(s));
+        this.globParts = this.preprocess(rawGlobParts);
+        this.debug(this.pattern, this.globParts);
+        // glob --> regexps
+        let set = this.globParts.map((s, _, __) => {
+            if (this.isWindows && this.windowsNoMagicRoot) {
+                // check if it's a drive or unc path.
+                const isUNC = s[0] === '' &&
+                    s[1] === '' &&
+                    (s[2] === '?' || !globMagic.test(s[2])) &&
+                    !globMagic.test(s[3]);
+                const isDrive = /^[a-z]:/i.test(s[0]);
+                if (isUNC) {
+                    return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))];
+                }
+                else if (isDrive) {
+                    return [s[0], ...s.slice(1).map(ss => this.parse(ss))];
+                }
+            }
+            return s.map(ss => this.parse(ss));
+        });
+        this.debug(this.pattern, set);
+        // filter out everything that didn't compile properly.
+        this.set = set.filter(s => s.indexOf(false) === -1);
+        // do not treat the ? in UNC paths as magic
+        if (this.isWindows) {
+            for (let i = 0; i < this.set.length; i++) {
+                const p = this.set[i];
+                if (p[0] === '' &&
+                    p[1] === '' &&
+                    this.globParts[i][2] === '?' &&
+                    typeof p[3] === 'string' &&
+                    /^[a-z]:$/i.test(p[3])) {
+                    p[2] = '?';
+                }
+            }
+        }
+        this.debug(this.pattern, this.set);
+    }
+    // various transforms to equivalent pattern sets that are
+    // faster to process in a filesystem walk.  The goal is to
+    // eliminate what we can, and push all ** patterns as far
+    // to the right as possible, even if it increases the number
+    // of patterns that we have to process.
+    preprocess(globParts) {
+        // if we're not in globstar mode, then turn all ** into *
+        if (this.options.noglobstar) {
+            for (let i = 0; i < globParts.length; i++) {
+                for (let j = 0; j < globParts[i].length; j++) {
+                    if (globParts[i][j] === '**') {
+                        globParts[i][j] = '*';
+                    }
+                }
+            }
+        }
+        const { optimizationLevel = 1 } = this.options;
+        if (optimizationLevel >= 2) {
+            // aggressive optimization for the purpose of fs walking
+            globParts = this.firstPhasePreProcess(globParts);
+            globParts = this.secondPhasePreProcess(globParts);
+        }
+        else if (optimizationLevel >= 1) {
+            // just basic optimizations to remove some .. parts
+            globParts = this.levelOneOptimize(globParts);
+        }
+        else {
+            globParts = this.adjascentGlobstarOptimize(globParts);
+        }
+        return globParts;
+    }
+    // just get rid of adjascent ** portions
+    adjascentGlobstarOptimize(globParts) {
+        return globParts.map(parts => {
+            let gs = -1;
+            while (-1 !== (gs = parts.indexOf('**', gs + 1))) {
+                let i = gs;
+                while (parts[i + 1] === '**') {
+                    i++;
+                }
+                if (i !== gs) {
+                    parts.splice(gs, i - gs);
+                }
+            }
+            return parts;
+        });
+    }
+    // get rid of adjascent ** and resolve .. portions
+    levelOneOptimize(globParts) {
+        return globParts.map(parts => {
+            parts = parts.reduce((set, part) => {
+                const prev = set[set.length - 1];
+                if (part === '**' && prev === '**') {
+                    return set;
+                }
+                if (part === '..') {
+                    if (prev && prev !== '..' && prev !== '.' && prev !== '**') {
+                        set.pop();
+                        return set;
+                    }
+                }
+                set.push(part);
+                return set;
+            }, []);
+            return parts.length === 0 ? [''] : parts;
+        });
+    }
+    levelTwoFileOptimize(parts) {
+        if (!Array.isArray(parts)) {
+            parts = this.slashSplit(parts);
+        }
+        let didSomething = false;
+        do {
+            didSomething = false;
+            // 
// -> 
/
+            if (!this.preserveMultipleSlashes) {
+                for (let i = 1; i < parts.length - 1; i++) {
+                    const p = parts[i];
+                    // don't squeeze out UNC patterns
+                    if (i === 1 && p === '' && parts[0] === '')
+                        continue;
+                    if (p === '.' || p === '') {
+                        didSomething = true;
+                        parts.splice(i, 1);
+                        i--;
+                    }
+                }
+                if (parts[0] === '.' &&
+                    parts.length === 2 &&
+                    (parts[1] === '.' || parts[1] === '')) {
+                    didSomething = true;
+                    parts.pop();
+                }
+            }
+            // 
/

/../ ->

/
+            let dd = 0;
+            while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
+                const p = parts[dd - 1];
+                if (p && p !== '.' && p !== '..' && p !== '**') {
+                    didSomething = true;
+                    parts.splice(dd - 1, 2);
+                    dd -= 2;
+                }
+            }
+        } while (didSomething);
+        return parts.length === 0 ? [''] : parts;
+    }
+    // First phase: single-pattern processing
+    // 
 is 1 or more portions
+    //  is 1 or more portions
+    // 

is any portion other than ., .., '', or ** + // is . or '' + // + // **/.. is *brutal* for filesystem walking performance, because + // it effectively resets the recursive walk each time it occurs, + // and ** cannot be reduced out by a .. pattern part like a regexp + // or most strings (other than .., ., and '') can be. + // + //

/**/../

/

/ -> {

/../

/

/,

/**/

/

/} + //

// -> 
/
+    // 
/

/../ ->

/
+    // **/**/ -> **/
+    //
+    // **/*/ -> */**/ <== not valid because ** doesn't follow
+    // this WOULD be allowed if ** did follow symlinks, or * didn't
+    firstPhasePreProcess(globParts) {
+        let didSomething = false;
+        do {
+            didSomething = false;
+            // 
/**/../

/

/ -> {

/../

/

/,

/**/

/

/} + for (let parts of globParts) { + let gs = -1; + while (-1 !== (gs = parts.indexOf('**', gs + 1))) { + let gss = gs; + while (parts[gss + 1] === '**') { + //

/**/**/ -> 
/**/
+                        gss++;
+                    }
+                    // eg, if gs is 2 and gss is 4, that means we have 3 **
+                    // parts, and can remove 2 of them.
+                    if (gss > gs) {
+                        parts.splice(gs + 1, gss - gs);
+                    }
+                    let next = parts[gs + 1];
+                    const p = parts[gs + 2];
+                    const p2 = parts[gs + 3];
+                    if (next !== '..')
+                        continue;
+                    if (!p ||
+                        p === '.' ||
+                        p === '..' ||
+                        !p2 ||
+                        p2 === '.' ||
+                        p2 === '..') {
+                        continue;
+                    }
+                    didSomething = true;
+                    // edit parts in place, and push the new one
+                    parts.splice(gs, 1);
+                    const other = parts.slice(0);
+                    other[gs] = '**';
+                    globParts.push(other);
+                    gs--;
+                }
+                // 
// -> 
/
+                if (!this.preserveMultipleSlashes) {
+                    for (let i = 1; i < parts.length - 1; i++) {
+                        const p = parts[i];
+                        // don't squeeze out UNC patterns
+                        if (i === 1 && p === '' && parts[0] === '')
+                            continue;
+                        if (p === '.' || p === '') {
+                            didSomething = true;
+                            parts.splice(i, 1);
+                            i--;
+                        }
+                    }
+                    if (parts[0] === '.' &&
+                        parts.length === 2 &&
+                        (parts[1] === '.' || parts[1] === '')) {
+                        didSomething = true;
+                        parts.pop();
+                    }
+                }
+                // 
/

/../ ->

/
+                let dd = 0;
+                while (-1 !== (dd = parts.indexOf('..', dd + 1))) {
+                    const p = parts[dd - 1];
+                    if (p && p !== '.' && p !== '..' && p !== '**') {
+                        didSomething = true;
+                        const needDot = dd === 1 && parts[dd + 1] === '**';
+                        const splin = needDot ? ['.'] : [];
+                        parts.splice(dd - 1, 2, ...splin);
+                        if (parts.length === 0)
+                            parts.push('');
+                        dd -= 2;
+                    }
+                }
+            }
+        } while (didSomething);
+        return globParts;
+    }
+    // second phase: multi-pattern dedupes
+    // {
/*/,
/

/} ->

/*/
+    // {
/,
/} -> 
/
+    // {
/**/,
/} -> 
/**/
+    //
+    // {
/**/,
/**/

/} ->

/**/
+    // ^-- not valid because ** doens't follow symlinks
+    secondPhasePreProcess(globParts) {
+        for (let i = 0; i < globParts.length - 1; i++) {
+            for (let j = i + 1; j < globParts.length; j++) {
+                const matched = this.partsMatch(globParts[i], globParts[j], !this.preserveMultipleSlashes);
+                if (!matched)
+                    continue;
+                globParts[i] = matched;
+                globParts[j] = [];
+            }
+        }
+        return globParts.filter(gs => gs.length);
+    }
+    partsMatch(a, b, emptyGSMatch = false) {
+        let ai = 0;
+        let bi = 0;
+        let result = [];
+        let which = '';
+        while (ai < a.length && bi < b.length) {
+            if (a[ai] === b[bi]) {
+                result.push(which === 'b' ? b[bi] : a[ai]);
+                ai++;
+                bi++;
+            }
+            else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {
+                result.push(a[ai]);
+                ai++;
+            }
+            else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {
+                result.push(b[bi]);
+                bi++;
+            }
+            else if (a[ai] === '*' &&
+                b[bi] &&
+                (this.options.dot || !b[bi].startsWith('.')) &&
+                b[bi] !== '**') {
+                if (which === 'b')
+                    return false;
+                which = 'a';
+                result.push(a[ai]);
+                ai++;
+                bi++;
+            }
+            else if (b[bi] === '*' &&
+                a[ai] &&
+                (this.options.dot || !a[ai].startsWith('.')) &&
+                a[ai] !== '**') {
+                if (which === 'a')
+                    return false;
+                which = 'b';
+                result.push(b[bi]);
+                ai++;
+                bi++;
+            }
+            else {
+                return false;
+            }
+        }
+        // if we fall out of the loop, it means they two are identical
+        // as long as their lengths match
+        return a.length === b.length && result;
+    }
+    parseNegate() {
+        if (this.nonegate)
+            return;
+        const pattern = this.pattern;
+        let negate = false;
+        let negateOffset = 0;
+        for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {
+            negate = !negate;
+            negateOffset++;
+        }
+        if (negateOffset)
+            this.pattern = pattern.slice(negateOffset);
+        this.negate = negate;
+    }
+    // set partial to true to test if, for example,
+    // "/a/b" matches the start of "/*/b/*/d"
+    // Partial means, if you run out of file before you run
+    // out of pattern, then that's fine, as long as all
+    // the parts match.
+    matchOne(file, pattern, partial = false) {
+        const options = this.options;
+        // a UNC pattern like //?/c:/* can match a path like c:/x
+        // and vice versa
+        if (this.isWindows) {
+            const fileUNC = file[0] === '' &&
+                file[1] === '' &&
+                file[2] === '?' &&
+                typeof file[3] === 'string' &&
+                /^[a-z]:$/i.test(file[3]);
+            const patternUNC = pattern[0] === '' &&
+                pattern[1] === '' &&
+                pattern[2] === '?' &&
+                typeof pattern[3] === 'string' &&
+                /^[a-z]:$/i.test(pattern[3]);
+            if (fileUNC && patternUNC) {
+                const fd = file[3];
+                const pd = pattern[3];
+                if (fd.toLowerCase() === pd.toLowerCase()) {
+                    file[3] = pd;
+                }
+            }
+            else if (patternUNC && typeof file[0] === 'string') {
+                const pd = pattern[3];
+                const fd = file[0];
+                if (pd.toLowerCase() === fd.toLowerCase()) {
+                    pattern[3] = fd;
+                    pattern = pattern.slice(3);
+                }
+            }
+            else if (fileUNC && typeof pattern[0] === 'string') {
+                const fd = file[3];
+                if (fd.toLowerCase() === pattern[0].toLowerCase()) {
+                    pattern[0] = fd;
+                    file = file.slice(3);
+                }
+            }
+        }
+        // resolve and reduce . and .. portions in the file as well.
+        // dont' need to do the second phase, because it's only one string[]
+        const { optimizationLevel = 1 } = this.options;
+        if (optimizationLevel >= 2) {
+            file = this.levelTwoFileOptimize(file);
+        }
+        this.debug('matchOne', this, { file, pattern });
+        this.debug('matchOne', file.length, pattern.length);
+        for (var fi = 0, pi = 0, fl = file.length, pl = pattern.length; fi < fl && pi < pl; fi++, pi++) {
+            this.debug('matchOne loop');
+            var p = pattern[pi];
+            var f = file[fi];
+            this.debug(pattern, p, f);
+            // should be impossible.
+            // some invalid regexp stuff in the set.
+            /* c8 ignore start */
+            if (p === false) {
+                return false;
+            }
+            /* c8 ignore stop */
+            if (p === GLOBSTAR) {
+                this.debug('GLOBSTAR', [pattern, p, f]);
+                // "**"
+                // a/**/b/**/c would match the following:
+                // a/b/x/y/z/c
+                // a/x/y/z/b/c
+                // a/b/x/b/x/c
+                // a/b/c
+                // To do this, take the rest of the pattern after
+                // the **, and see if it would match the file remainder.
+                // If so, return success.
+                // If not, the ** "swallows" a segment, and try again.
+                // This is recursively awful.
+                //
+                // a/**/b/**/c matching a/b/x/y/z/c
+                // - a matches a
+                // - doublestar
+                //   - matchOne(b/x/y/z/c, b/**/c)
+                //     - b matches b
+                //     - doublestar
+                //       - matchOne(x/y/z/c, c) -> no
+                //       - matchOne(y/z/c, c) -> no
+                //       - matchOne(z/c, c) -> no
+                //       - matchOne(c, c) yes, hit
+                var fr = fi;
+                var pr = pi + 1;
+                if (pr === pl) {
+                    this.debug('** at the end');
+                    // a ** at the end will just swallow the rest.
+                    // We have found a match.
+                    // however, it will not swallow /.x, unless
+                    // options.dot is set.
+                    // . and .. are *never* matched by **, for explosively
+                    // exponential reasons.
+                    for (; fi < fl; fi++) {
+                        if (file[fi] === '.' ||
+                            file[fi] === '..' ||
+                            (!options.dot && file[fi].charAt(0) === '.'))
+                            return false;
+                    }
+                    return true;
+                }
+                // ok, let's see if we can swallow whatever we can.
+                while (fr < fl) {
+                    var swallowee = file[fr];
+                    this.debug('\nglobstar while', file, fr, pattern, pr, swallowee);
+                    // XXX remove this slice.  Just pass the start index.
+                    if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
+                        this.debug('globstar found match!', fr, fl, swallowee);
+                        // found a match.
+                        return true;
+                    }
+                    else {
+                        // can't swallow "." or ".." ever.
+                        // can only swallow ".foo" when explicitly asked.
+                        if (swallowee === '.' ||
+                            swallowee === '..' ||
+                            (!options.dot && swallowee.charAt(0) === '.')) {
+                            this.debug('dot detected!', file, fr, pattern, pr);
+                            break;
+                        }
+                        // ** swallows a segment, and continue.
+                        this.debug('globstar swallow a segment, and continue');
+                        fr++;
+                    }
+                }
+                // no match was found.
+                // However, in partial mode, we can't say this is necessarily over.
+                /* c8 ignore start */
+                if (partial) {
+                    // ran out of file
+                    this.debug('\n>>> no match, partial?', file, fr, pattern, pr);
+                    if (fr === fl) {
+                        return true;
+                    }
+                }
+                /* c8 ignore stop */
+                return false;
+            }
+            // something other than **
+            // non-magic patterns just have to match exactly
+            // patterns with magic have been turned into regexps.
+            let hit;
+            if (typeof p === 'string') {
+                hit = f === p;
+                this.debug('string match', p, f, hit);
+            }
+            else {
+                hit = p.test(f);
+                this.debug('pattern match', p, f, hit);
+            }
+            if (!hit)
+                return false;
+        }
+        // Note: ending in / means that we'll get a final ""
+        // at the end of the pattern.  This can only match a
+        // corresponding "" at the end of the file.
+        // If the file ends in /, then it can only match a
+        // a pattern that ends in /, unless the pattern just
+        // doesn't have any more for it. But, a/b/ should *not*
+        // match "a/b/*", even though "" matches against the
+        // [^/]*? pattern, except in partial mode, where it might
+        // simply not be reached yet.
+        // However, a/b/ should still satisfy a/*
+        // now either we fell off the end of the pattern, or we're done.
+        if (fi === fl && pi === pl) {
+            // ran out of pattern and filename at the same time.
+            // an exact hit!
+            return true;
+        }
+        else if (fi === fl) {
+            // ran out of file, but still had pattern left.
+            // this is ok if we're doing the match as part of
+            // a glob fs traversal.
+            return partial;
+        }
+        else if (pi === pl) {
+            // ran out of pattern, still have file left.
+            // this is only acceptable if we're on the very last
+            // empty segment of a file with a trailing slash.
+            // a/* should match a/b/
+            return fi === fl - 1 && file[fi] === '';
+            /* c8 ignore start */
+        }
+        else {
+            // should be unreachable.
+            throw new Error('wtf?');
+        }
+        /* c8 ignore stop */
+    }
+    braceExpand() {
+        return braceExpand(this.pattern, this.options);
+    }
+    parse(pattern) {
+        assertValidPattern(pattern);
+        const options = this.options;
+        // shortcuts
+        if (pattern === '**')
+            return GLOBSTAR;
+        if (pattern === '')
+            return '';
+        // far and away, the most common glob pattern parts are
+        // *, *.*, and *.  Add a fast check method for those.
+        let m;
+        let fastTest = null;
+        if ((m = pattern.match(starRE))) {
+            fastTest = options.dot ? starTestDot : starTest;
+        }
+        else if ((m = pattern.match(starDotExtRE))) {
+            fastTest = (options.nocase
+                ? options.dot
+                    ? starDotExtTestNocaseDot
+                    : starDotExtTestNocase
+                : options.dot
+                    ? starDotExtTestDot
+                    : starDotExtTest)(m[1]);
+        }
+        else if ((m = pattern.match(qmarksRE))) {
+            fastTest = (options.nocase
+                ? options.dot
+                    ? qmarksTestNocaseDot
+                    : qmarksTestNocase
+                : options.dot
+                    ? qmarksTestDot
+                    : qmarksTest)(m);
+        }
+        else if ((m = pattern.match(starDotStarRE))) {
+            fastTest = options.dot ? starDotStarTestDot : starDotStarTest;
+        }
+        else if ((m = pattern.match(dotStarRE))) {
+            fastTest = dotStarTest;
+        }
+        const re = AST.fromGlob(pattern, this.options).toMMPattern();
+        return fastTest ? Object.assign(re, { test: fastTest }) : re;
+    }
+    makeRe() {
+        if (this.regexp || this.regexp === false)
+            return this.regexp;
+        // at this point, this.set is a 2d array of partial
+        // pattern strings, or "**".
+        //
+        // It's better to use .match().  This function shouldn't
+        // be used, really, but it's pretty convenient sometimes,
+        // when you just want to work with a regex.
+        const set = this.set;
+        if (!set.length) {
+            this.regexp = false;
+            return this.regexp;
+        }
+        const options = this.options;
+        const twoStar = options.noglobstar
+            ? star
+            : options.dot
+                ? twoStarDot
+                : twoStarNoDot;
+        const flags = new Set(options.nocase ? ['i'] : []);
+        // regexpify non-globstar patterns
+        // if ** is only item, then we just do one twoStar
+        // if ** is first, and there are more, prepend (\/|twoStar\/)? to next
+        // if ** is last, append (\/twoStar|) to previous
+        // if ** is in the middle, append (\/|\/twoStar\/) to previous
+        // then filter out GLOBSTAR symbols
+        let re = set
+            .map(pattern => {
+            const pp = pattern.map(p => {
+                if (p instanceof RegExp) {
+                    for (const f of p.flags.split(''))
+                        flags.add(f);
+                }
+                return typeof p === 'string'
+                    ? regExpEscape(p)
+                    : p === GLOBSTAR
+                        ? GLOBSTAR
+                        : p._src;
+            });
+            pp.forEach((p, i) => {
+                const next = pp[i + 1];
+                const prev = pp[i - 1];
+                if (p !== GLOBSTAR || prev === GLOBSTAR) {
+                    return;
+                }
+                if (prev === undefined) {
+                    if (next !== undefined && next !== GLOBSTAR) {
+                        pp[i + 1] = '(?:\\/|' + twoStar + '\\/)?' + next;
+                    }
+                    else {
+                        pp[i] = twoStar;
+                    }
+                }
+                else if (next === undefined) {
+                    pp[i - 1] = prev + '(?:\\/|' + twoStar + ')?';
+                }
+                else if (next !== GLOBSTAR) {
+                    pp[i - 1] = prev + '(?:\\/|\\/' + twoStar + '\\/)' + next;
+                    pp[i + 1] = GLOBSTAR;
+                }
+            });
+            return pp.filter(p => p !== GLOBSTAR).join('/');
+        })
+            .join('|');
+        // need to wrap in parens if we had more than one thing with |,
+        // otherwise only the first will be anchored to ^ and the last to $
+        const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', ''];
+        // must match entire pattern
+        // ending in a * or ** will make it less strict.
+        re = '^' + open + re + close + '$';
+        // can match anything, as long as it's not this.
+        if (this.negate)
+            re = '^(?!' + re + ').+$';
+        try {
+            this.regexp = new RegExp(re, [...flags].join(''));
+            /* c8 ignore start */
+        }
+        catch (ex) {
+            // should be impossible
+            this.regexp = false;
+        }
+        /* c8 ignore stop */
+        return this.regexp;
+    }
+    slashSplit(p) {
+        // if p starts with // on windows, we preserve that
+        // so that UNC paths aren't broken.  Otherwise, any number of
+        // / characters are coalesced into one, unless
+        // preserveMultipleSlashes is set to true.
+        if (this.preserveMultipleSlashes) {
+            return p.split('/');
+        }
+        else if (this.isWindows && /^\/\/[^\/]+/.test(p)) {
+            // add an extra '' for the one we lose
+            return ['', ...p.split(/\/+/)];
+        }
+        else {
+            return p.split(/\/+/);
+        }
+    }
+    match(f, partial = this.partial) {
+        this.debug('match', f, this.pattern);
+        // short-circuit in the case of busted things.
+        // comments, etc.
+        if (this.comment) {
+            return false;
+        }
+        if (this.empty) {
+            return f === '';
+        }
+        if (f === '/' && partial) {
+            return true;
+        }
+        const options = this.options;
+        // windows: need to use /, not \
+        if (this.isWindows) {
+            f = f.split('\\').join('/');
+        }
+        // treat the test path as a set of pathparts.
+        const ff = this.slashSplit(f);
+        this.debug(this.pattern, 'split', ff);
+        // just ONE of the pattern sets in this.set needs to match
+        // in order for it to be valid.  If negating, then just one
+        // match means that we have failed.
+        // Either way, return on the first hit.
+        const set = this.set;
+        this.debug(this.pattern, 'set', set);
+        // Find the basename of the path by looking for the last non-empty segment
+        let filename = ff[ff.length - 1];
+        if (!filename) {
+            for (let i = ff.length - 2; !filename && i >= 0; i--) {
+                filename = ff[i];
+            }
+        }
+        for (let i = 0; i < set.length; i++) {
+            const pattern = set[i];
+            let file = ff;
+            if (options.matchBase && pattern.length === 1) {
+                file = [filename];
+            }
+            const hit = this.matchOne(file, pattern, partial);
+            if (hit) {
+                if (options.flipNegate) {
+                    return true;
+                }
+                return !this.negate;
+            }
+        }
+        // didn't get any hits.  this is success if it's a negative
+        // pattern, failure otherwise.
+        if (options.flipNegate) {
+            return false;
+        }
+        return this.negate;
+    }
+    static defaults(def) {
+        return minimatch.defaults(def).Minimatch;
+    }
+}
+/* c8 ignore start */
+export { AST } from './ast.js';
+export { escape } from './escape.js';
+export { unescape } from './unescape.js';
+/* c8 ignore stop */
+minimatch.AST = AST;
+minimatch.Minimatch = Minimatch;
+minimatch.escape = escape;
+minimatch.unescape = unescape;
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/index.js.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/index.js.map
new file mode 100644
index 00000000..777972e2
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import expand from 'brace-expansion'\nimport { assertValidPattern } from './assert-valid-pattern.js'\nimport { AST, ExtglobType } from './ast.js'\nimport { escape } from './escape.js'\nimport { unescape } from './unescape.js'\n\ntype Platform =\n  | 'aix'\n  | 'android'\n  | 'darwin'\n  | 'freebsd'\n  | 'haiku'\n  | 'linux'\n  | 'openbsd'\n  | 'sunos'\n  | 'win32'\n  | 'cygwin'\n  | 'netbsd'\n\nexport interface MinimatchOptions {\n  nobrace?: boolean\n  nocomment?: boolean\n  nonegate?: boolean\n  debug?: boolean\n  noglobstar?: boolean\n  noext?: boolean\n  nonull?: boolean\n  windowsPathsNoEscape?: boolean\n  allowWindowsEscape?: boolean\n  partial?: boolean\n  dot?: boolean\n  nocase?: boolean\n  nocaseMagicOnly?: boolean\n  magicalBraces?: boolean\n  matchBase?: boolean\n  flipNegate?: boolean\n  preserveMultipleSlashes?: boolean\n  optimizationLevel?: number\n  platform?: Platform\n  windowsNoMagicRoot?: boolean\n}\n\nexport const minimatch = (\n  p: string,\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  return new Minimatch(pattern, options).match(p)\n}\n\nexport default minimatch\n\n// Optimized checking for the most common glob patterns.\nconst starDotExtRE = /^\\*+([^+@!?\\*\\[\\(]*)$/\nconst starDotExtTest = (ext: string) => (f: string) =>\n  !f.startsWith('.') && f.endsWith(ext)\nconst starDotExtTestDot = (ext: string) => (f: string) => f.endsWith(ext)\nconst starDotExtTestNocase = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => !f.startsWith('.') && f.toLowerCase().endsWith(ext)\n}\nconst starDotExtTestNocaseDot = (ext: string) => {\n  ext = ext.toLowerCase()\n  return (f: string) => f.toLowerCase().endsWith(ext)\n}\nconst starDotStarRE = /^\\*+\\.\\*+$/\nconst starDotStarTest = (f: string) => !f.startsWith('.') && f.includes('.')\nconst starDotStarTestDot = (f: string) =>\n  f !== '.' && f !== '..' && f.includes('.')\nconst dotStarRE = /^\\.\\*+$/\nconst dotStarTest = (f: string) => f !== '.' && f !== '..' && f.startsWith('.')\nconst starRE = /^\\*+$/\nconst starTest = (f: string) => f.length !== 0 && !f.startsWith('.')\nconst starTestDot = (f: string) => f.length !== 0 && f !== '.' && f !== '..'\nconst qmarksRE = /^\\?+([^+@!?\\*\\[\\(]*)?$/\nconst qmarksTestNocase = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestNocaseDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  if (!ext) return noext\n  ext = ext.toLowerCase()\n  return (f: string) => noext(f) && f.toLowerCase().endsWith(ext)\n}\nconst qmarksTestDot = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExtDot([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTest = ([$0, ext = '']: RegExpMatchArray) => {\n  const noext = qmarksTestNoExt([$0])\n  return !ext ? noext : (f: string) => noext(f) && f.endsWith(ext)\n}\nconst qmarksTestNoExt = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && !f.startsWith('.')\n}\nconst qmarksTestNoExtDot = ([$0]: RegExpMatchArray) => {\n  const len = $0.length\n  return (f: string) => f.length === len && f !== '.' && f !== '..'\n}\n\n/* c8 ignore start */\nconst defaultPlatform: Platform = (\n  typeof process === 'object' && process\n    ? (typeof process.env === 'object' &&\n        process.env &&\n        process.env.__MINIMATCH_TESTING_PLATFORM__) ||\n      process.platform\n    : 'posix'\n) as Platform\ntype Sep = '\\\\' | '/'\nconst path: { [k: string]: { sep: Sep } } = {\n  win32: { sep: '\\\\' },\n  posix: { sep: '/' },\n}\n/* c8 ignore stop */\n\nexport const sep = defaultPlatform === 'win32' ? path.win32.sep : path.posix.sep\nminimatch.sep = sep\n\nexport const GLOBSTAR = Symbol('globstar **')\nminimatch.GLOBSTAR = GLOBSTAR\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nconst qmark = '[^/]'\n\n// * => any number of characters\nconst star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nconst twoStarDot = '(?:(?!(?:\\\\/|^)(?:\\\\.{1,2})($|\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nconst twoStarNoDot = '(?:(?!(?:\\\\/|^)\\\\.).)*?'\n\nexport const filter =\n  (pattern: string, options: MinimatchOptions = {}) =>\n  (p: string) =>\n    minimatch(p, pattern, options)\nminimatch.filter = filter\n\nconst ext = (a: MinimatchOptions, b: MinimatchOptions = {}) =>\n  Object.assign({}, a, b)\n\nexport const defaults = (def: MinimatchOptions): typeof minimatch => {\n  if (!def || typeof def !== 'object' || !Object.keys(def).length) {\n    return minimatch\n  }\n\n  const orig = minimatch\n\n  const m = (p: string, pattern: string, options: MinimatchOptions = {}) =>\n    orig(p, pattern, ext(def, options))\n\n  return Object.assign(m, {\n    Minimatch: class Minimatch extends orig.Minimatch {\n      constructor(pattern: string, options: MinimatchOptions = {}) {\n        super(pattern, ext(def, options))\n      }\n      static defaults(options: MinimatchOptions) {\n        return orig.defaults(ext(def, options)).Minimatch\n      }\n    },\n\n    AST: class AST extends orig.AST {\n      /* c8 ignore start */\n      constructor(\n        type: ExtglobType | null,\n        parent?: AST,\n        options: MinimatchOptions = {}\n      ) {\n        super(type, parent, ext(def, options))\n      }\n      /* c8 ignore stop */\n\n      static fromGlob(pattern: string, options: MinimatchOptions = {}) {\n        return orig.AST.fromGlob(pattern, ext(def, options))\n      }\n    },\n\n    unescape: (\n      s: string,\n      options: Pick = {}\n    ) => orig.unescape(s, ext(def, options)),\n\n    escape: (\n      s: string,\n      options: Pick = {}\n    ) => orig.escape(s, ext(def, options)),\n\n    filter: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.filter(pattern, ext(def, options)),\n\n    defaults: (options: MinimatchOptions) => orig.defaults(ext(def, options)),\n\n    makeRe: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.makeRe(pattern, ext(def, options)),\n\n    braceExpand: (pattern: string, options: MinimatchOptions = {}) =>\n      orig.braceExpand(pattern, ext(def, options)),\n\n    match: (list: string[], pattern: string, options: MinimatchOptions = {}) =>\n      orig.match(list, pattern, ext(def, options)),\n\n    sep: orig.sep,\n    GLOBSTAR: GLOBSTAR as typeof GLOBSTAR,\n  })\n}\nminimatch.defaults = defaults\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nexport const braceExpand = (\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  assertValidPattern(pattern)\n\n  // Thanks to Yeting Li  for\n  // improving this regexp to avoid a ReDOS vulnerability.\n  if (options.nobrace || !/\\{(?:(?!\\{).)*\\}/.test(pattern)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern)\n}\nminimatch.braceExpand = braceExpand\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\n\nexport const makeRe = (pattern: string, options: MinimatchOptions = {}) =>\n  new Minimatch(pattern, options).makeRe()\nminimatch.makeRe = makeRe\n\nexport const match = (\n  list: string[],\n  pattern: string,\n  options: MinimatchOptions = {}\n) => {\n  const mm = new Minimatch(pattern, options)\n  list = list.filter(f => mm.match(f))\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\nminimatch.match = match\n\n// replace stuff like \\* with *\nconst globMagic = /[?*]|[+@!]\\(.*?\\)|\\[|\\]/\nconst regExpEscape = (s: string) =>\n  s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n\nexport type MMRegExp = RegExp & {\n  _src?: string\n  _glob?: string\n}\n\nexport type ParseReturnFiltered = string | MMRegExp | typeof GLOBSTAR\nexport type ParseReturn = ParseReturnFiltered | false\n\nexport class Minimatch {\n  options: MinimatchOptions\n  set: ParseReturnFiltered[][]\n  pattern: string\n\n  windowsPathsNoEscape: boolean\n  nonegate: boolean\n  negate: boolean\n  comment: boolean\n  empty: boolean\n  preserveMultipleSlashes: boolean\n  partial: boolean\n  globSet: string[]\n  globParts: string[][]\n  nocase: boolean\n\n  isWindows: boolean\n  platform: Platform\n  windowsNoMagicRoot: boolean\n\n  regexp: false | null | MMRegExp\n  constructor(pattern: string, options: MinimatchOptions = {}) {\n    assertValidPattern(pattern)\n\n    options = options || {}\n    this.options = options\n    this.pattern = pattern\n    this.platform = options.platform || defaultPlatform\n    this.isWindows = this.platform === 'win32'\n    this.windowsPathsNoEscape =\n      !!options.windowsPathsNoEscape || options.allowWindowsEscape === false\n    if (this.windowsPathsNoEscape) {\n      this.pattern = this.pattern.replace(/\\\\/g, '/')\n    }\n    this.preserveMultipleSlashes = !!options.preserveMultipleSlashes\n    this.regexp = null\n    this.negate = false\n    this.nonegate = !!options.nonegate\n    this.comment = false\n    this.empty = false\n    this.partial = !!options.partial\n    this.nocase = !!this.options.nocase\n    this.windowsNoMagicRoot =\n      options.windowsNoMagicRoot !== undefined\n        ? options.windowsNoMagicRoot\n        : !!(this.isWindows && this.nocase)\n\n    this.globSet = []\n    this.globParts = []\n    this.set = []\n\n    // make the set of regexps etc.\n    this.make()\n  }\n\n  hasMagic(): boolean {\n    if (this.options.magicalBraces && this.set.length > 1) {\n      return true\n    }\n    for (const pattern of this.set) {\n      for (const part of pattern) {\n        if (typeof part !== 'string') return true\n      }\n    }\n    return false\n  }\n\n  debug(..._: any[]) {}\n\n  make() {\n    const pattern = this.pattern\n    const options = this.options\n\n    // empty patterns and comments match nothing.\n    if (!options.nocomment && pattern.charAt(0) === '#') {\n      this.comment = true\n      return\n    }\n\n    if (!pattern) {\n      this.empty = true\n      return\n    }\n\n    // step 1: figure out negation, etc.\n    this.parseNegate()\n\n    // step 2: expand braces\n    this.globSet = [...new Set(this.braceExpand())]\n\n    if (options.debug) {\n      this.debug = (...args: any[]) => console.error(...args)\n    }\n\n    this.debug(this.pattern, this.globSet)\n\n    // step 3: now we have a set, so turn each one into a series of\n    // path-portion matching patterns.\n    // These will be regexps, except in the case of \"**\", which is\n    // set to the GLOBSTAR object for globstar behavior,\n    // and will not contain any / characters\n    //\n    // First, we preprocess to make the glob pattern sets a bit simpler\n    // and deduped.  There are some perf-killing patterns that can cause\n    // problems with a glob walk, but we can simplify them down a bit.\n    const rawGlobParts = this.globSet.map(s => this.slashSplit(s))\n    this.globParts = this.preprocess(rawGlobParts)\n    this.debug(this.pattern, this.globParts)\n\n    // glob --> regexps\n    let set = this.globParts.map((s, _, __) => {\n      if (this.isWindows && this.windowsNoMagicRoot) {\n        // check if it's a drive or unc path.\n        const isUNC =\n          s[0] === '' &&\n          s[1] === '' &&\n          (s[2] === '?' || !globMagic.test(s[2])) &&\n          !globMagic.test(s[3])\n        const isDrive = /^[a-z]:/i.test(s[0])\n        if (isUNC) {\n          return [...s.slice(0, 4), ...s.slice(4).map(ss => this.parse(ss))]\n        } else if (isDrive) {\n          return [s[0], ...s.slice(1).map(ss => this.parse(ss))]\n        }\n      }\n      return s.map(ss => this.parse(ss))\n    })\n\n    this.debug(this.pattern, set)\n\n    // filter out everything that didn't compile properly.\n    this.set = set.filter(\n      s => s.indexOf(false) === -1\n    ) as ParseReturnFiltered[][]\n\n    // do not treat the ? in UNC paths as magic\n    if (this.isWindows) {\n      for (let i = 0; i < this.set.length; i++) {\n        const p = this.set[i]\n        if (\n          p[0] === '' &&\n          p[1] === '' &&\n          this.globParts[i][2] === '?' &&\n          typeof p[3] === 'string' &&\n          /^[a-z]:$/i.test(p[3])\n        ) {\n          p[2] = '?'\n        }\n      }\n    }\n\n    this.debug(this.pattern, this.set)\n  }\n\n  // various transforms to equivalent pattern sets that are\n  // faster to process in a filesystem walk.  The goal is to\n  // eliminate what we can, and push all ** patterns as far\n  // to the right as possible, even if it increases the number\n  // of patterns that we have to process.\n  preprocess(globParts: string[][]) {\n    // if we're not in globstar mode, then turn all ** into *\n    if (this.options.noglobstar) {\n      for (let i = 0; i < globParts.length; i++) {\n        for (let j = 0; j < globParts[i].length; j++) {\n          if (globParts[i][j] === '**') {\n            globParts[i][j] = '*'\n          }\n        }\n      }\n    }\n\n    const { optimizationLevel = 1 } = this.options\n\n    if (optimizationLevel >= 2) {\n      // aggressive optimization for the purpose of fs walking\n      globParts = this.firstPhasePreProcess(globParts)\n      globParts = this.secondPhasePreProcess(globParts)\n    } else if (optimizationLevel >= 1) {\n      // just basic optimizations to remove some .. parts\n      globParts = this.levelOneOptimize(globParts)\n    } else {\n      globParts = this.adjascentGlobstarOptimize(globParts)\n    }\n\n    return globParts\n  }\n\n  // just get rid of adjascent ** portions\n  adjascentGlobstarOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      let gs: number = -1\n      while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n        let i = gs\n        while (parts[i + 1] === '**') {\n          i++\n        }\n        if (i !== gs) {\n          parts.splice(gs, i - gs)\n        }\n      }\n      return parts\n    })\n  }\n\n  // get rid of adjascent ** and resolve .. portions\n  levelOneOptimize(globParts: string[][]) {\n    return globParts.map(parts => {\n      parts = parts.reduce((set: string[], part) => {\n        const prev = set[set.length - 1]\n        if (part === '**' && prev === '**') {\n          return set\n        }\n        if (part === '..') {\n          if (prev && prev !== '..' && prev !== '.' && prev !== '**') {\n            set.pop()\n            return set\n          }\n        }\n        set.push(part)\n        return set\n      }, [])\n      return parts.length === 0 ? [''] : parts\n    })\n  }\n\n  levelTwoFileOptimize(parts: string | string[]) {\n    if (!Array.isArray(parts)) {\n      parts = this.slashSplit(parts)\n    }\n    let didSomething: boolean = false\n    do {\n      didSomething = false\n      // 
// -> 
/\n      if (!this.preserveMultipleSlashes) {\n        for (let i = 1; i < parts.length - 1; i++) {\n          const p = parts[i]\n          // don't squeeze out UNC patterns\n          if (i === 1 && p === '' && parts[0] === '') continue\n          if (p === '.' || p === '') {\n            didSomething = true\n            parts.splice(i, 1)\n            i--\n          }\n        }\n        if (\n          parts[0] === '.' &&\n          parts.length === 2 &&\n          (parts[1] === '.' || parts[1] === '')\n        ) {\n          didSomething = true\n          parts.pop()\n        }\n      }\n\n      // 
/

/../ ->

/\n      let dd: number = 0\n      while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n        const p = parts[dd - 1]\n        if (p && p !== '.' && p !== '..' && p !== '**') {\n          didSomething = true\n          parts.splice(dd - 1, 2)\n          dd -= 2\n        }\n      }\n    } while (didSomething)\n    return parts.length === 0 ? [''] : parts\n  }\n\n  // First phase: single-pattern processing\n  // 
 is 1 or more portions\n  //  is 1 or more portions\n  // 

is any portion other than ., .., '', or **\n // is . or ''\n //\n // **/.. is *brutal* for filesystem walking performance, because\n // it effectively resets the recursive walk each time it occurs,\n // and ** cannot be reduced out by a .. pattern part like a regexp\n // or most strings (other than .., ., and '') can be.\n //\n //

/**/../

/

/ -> {

/../

/

/,

/**/

/

/}\n //

// -> 
/\n  // 
/

/../ ->

/\n  // **/**/ -> **/\n  //\n  // **/*/ -> */**/ <== not valid because ** doesn't follow\n  // this WOULD be allowed if ** did follow symlinks, or * didn't\n  firstPhasePreProcess(globParts: string[][]) {\n    let didSomething = false\n    do {\n      didSomething = false\n      // 
/**/../

/

/ -> {

/../

/

/,

/**/

/

/}\n for (let parts of globParts) {\n let gs: number = -1\n while (-1 !== (gs = parts.indexOf('**', gs + 1))) {\n let gss: number = gs\n while (parts[gss + 1] === '**') {\n //

/**/**/ -> 
/**/\n            gss++\n          }\n          // eg, if gs is 2 and gss is 4, that means we have 3 **\n          // parts, and can remove 2 of them.\n          if (gss > gs) {\n            parts.splice(gs + 1, gss - gs)\n          }\n\n          let next = parts[gs + 1]\n          const p = parts[gs + 2]\n          const p2 = parts[gs + 3]\n          if (next !== '..') continue\n          if (\n            !p ||\n            p === '.' ||\n            p === '..' ||\n            !p2 ||\n            p2 === '.' ||\n            p2 === '..'\n          ) {\n            continue\n          }\n          didSomething = true\n          // edit parts in place, and push the new one\n          parts.splice(gs, 1)\n          const other = parts.slice(0)\n          other[gs] = '**'\n          globParts.push(other)\n          gs--\n        }\n\n        // 
// -> 
/\n        if (!this.preserveMultipleSlashes) {\n          for (let i = 1; i < parts.length - 1; i++) {\n            const p = parts[i]\n            // don't squeeze out UNC patterns\n            if (i === 1 && p === '' && parts[0] === '') continue\n            if (p === '.' || p === '') {\n              didSomething = true\n              parts.splice(i, 1)\n              i--\n            }\n          }\n          if (\n            parts[0] === '.' &&\n            parts.length === 2 &&\n            (parts[1] === '.' || parts[1] === '')\n          ) {\n            didSomething = true\n            parts.pop()\n          }\n        }\n\n        // 
/

/../ ->

/\n        let dd: number = 0\n        while (-1 !== (dd = parts.indexOf('..', dd + 1))) {\n          const p = parts[dd - 1]\n          if (p && p !== '.' && p !== '..' && p !== '**') {\n            didSomething = true\n            const needDot = dd === 1 && parts[dd + 1] === '**'\n            const splin = needDot ? ['.'] : []\n            parts.splice(dd - 1, 2, ...splin)\n            if (parts.length === 0) parts.push('')\n            dd -= 2\n          }\n        }\n      }\n    } while (didSomething)\n\n    return globParts\n  }\n\n  // second phase: multi-pattern dedupes\n  // {
/*/,
/

/} ->

/*/\n  // {
/,
/} -> 
/\n  // {
/**/,
/} -> 
/**/\n  //\n  // {
/**/,
/**/

/} ->

/**/\n  // ^-- not valid because ** doens't follow symlinks\n  secondPhasePreProcess(globParts: string[][]): string[][] {\n    for (let i = 0; i < globParts.length - 1; i++) {\n      for (let j = i + 1; j < globParts.length; j++) {\n        const matched = this.partsMatch(\n          globParts[i],\n          globParts[j],\n          !this.preserveMultipleSlashes\n        )\n        if (!matched) continue\n        globParts[i] = matched\n        globParts[j] = []\n      }\n    }\n    return globParts.filter(gs => gs.length)\n  }\n\n  partsMatch(\n    a: string[],\n    b: string[],\n    emptyGSMatch: boolean = false\n  ): false | string[] {\n    let ai = 0\n    let bi = 0\n    let result: string[] = []\n    let which: string = ''\n    while (ai < a.length && bi < b.length) {\n      if (a[ai] === b[bi]) {\n        result.push(which === 'b' ? b[bi] : a[ai])\n        ai++\n        bi++\n      } else if (emptyGSMatch && a[ai] === '**' && b[bi] === a[ai + 1]) {\n        result.push(a[ai])\n        ai++\n      } else if (emptyGSMatch && b[bi] === '**' && a[ai] === b[bi + 1]) {\n        result.push(b[bi])\n        bi++\n      } else if (\n        a[ai] === '*' &&\n        b[bi] &&\n        (this.options.dot || !b[bi].startsWith('.')) &&\n        b[bi] !== '**'\n      ) {\n        if (which === 'b') return false\n        which = 'a'\n        result.push(a[ai])\n        ai++\n        bi++\n      } else if (\n        b[bi] === '*' &&\n        a[ai] &&\n        (this.options.dot || !a[ai].startsWith('.')) &&\n        a[ai] !== '**'\n      ) {\n        if (which === 'a') return false\n        which = 'b'\n        result.push(b[bi])\n        ai++\n        bi++\n      } else {\n        return false\n      }\n    }\n    // if we fall out of the loop, it means they two are identical\n    // as long as their lengths match\n    return a.length === b.length && result\n  }\n\n  parseNegate() {\n    if (this.nonegate) return\n\n    const pattern = this.pattern\n    let negate = false\n    let negateOffset = 0\n\n    for (let i = 0; i < pattern.length && pattern.charAt(i) === '!'; i++) {\n      negate = !negate\n      negateOffset++\n    }\n\n    if (negateOffset) this.pattern = pattern.slice(negateOffset)\n    this.negate = negate\n  }\n\n  // set partial to true to test if, for example,\n  // \"/a/b\" matches the start of \"/*/b/*/d\"\n  // Partial means, if you run out of file before you run\n  // out of pattern, then that's fine, as long as all\n  // the parts match.\n  matchOne(file: string[], pattern: ParseReturn[], partial: boolean = false) {\n    const options = this.options\n\n    // a UNC pattern like //?/c:/* can match a path like c:/x\n    // and vice versa\n    if (this.isWindows) {\n      const fileUNC =\n        file[0] === '' &&\n        file[1] === '' &&\n        file[2] === '?' &&\n        typeof file[3] === 'string' &&\n        /^[a-z]:$/i.test(file[3])\n      const patternUNC =\n        pattern[0] === '' &&\n        pattern[1] === '' &&\n        pattern[2] === '?' &&\n        typeof pattern[3] === 'string' &&\n        /^[a-z]:$/i.test(pattern[3])\n\n      if (fileUNC && patternUNC) {\n        const fd = file[3] as string\n        const pd = pattern[3] as string\n        if (fd.toLowerCase() === pd.toLowerCase()) {\n          file[3] = pd\n        }\n      } else if (patternUNC && typeof file[0] === 'string') {\n        const pd = pattern[3] as string\n        const fd = file[0]\n        if (pd.toLowerCase() === fd.toLowerCase()) {\n          pattern[3] = fd\n          pattern = pattern.slice(3)\n        }\n      } else if (fileUNC && typeof pattern[0] === 'string') {\n        const fd = file[3]\n        if (fd.toLowerCase() === pattern[0].toLowerCase()) {\n          pattern[0] = fd\n          file = file.slice(3)\n        }\n      }\n    }\n\n    // resolve and reduce . and .. portions in the file as well.\n    // dont' need to do the second phase, because it's only one string[]\n    const { optimizationLevel = 1 } = this.options\n    if (optimizationLevel >= 2) {\n      file = this.levelTwoFileOptimize(file)\n    }\n\n    this.debug('matchOne', this, { file, pattern })\n    this.debug('matchOne', file.length, pattern.length)\n\n    for (\n      var fi = 0, pi = 0, fl = file.length, pl = pattern.length;\n      fi < fl && pi < pl;\n      fi++, pi++\n    ) {\n      this.debug('matchOne loop')\n      var p = pattern[pi]\n      var f = file[fi]\n\n      this.debug(pattern, p, f)\n\n      // should be impossible.\n      // some invalid regexp stuff in the set.\n      /* c8 ignore start */\n      if (p === false) {\n        return false\n      }\n      /* c8 ignore stop */\n\n      if (p === GLOBSTAR) {\n        this.debug('GLOBSTAR', [pattern, p, f])\n\n        // \"**\"\n        // a/**/b/**/c would match the following:\n        // a/b/x/y/z/c\n        // a/x/y/z/b/c\n        // a/b/x/b/x/c\n        // a/b/c\n        // To do this, take the rest of the pattern after\n        // the **, and see if it would match the file remainder.\n        // If so, return success.\n        // If not, the ** \"swallows\" a segment, and try again.\n        // This is recursively awful.\n        //\n        // a/**/b/**/c matching a/b/x/y/z/c\n        // - a matches a\n        // - doublestar\n        //   - matchOne(b/x/y/z/c, b/**/c)\n        //     - b matches b\n        //     - doublestar\n        //       - matchOne(x/y/z/c, c) -> no\n        //       - matchOne(y/z/c, c) -> no\n        //       - matchOne(z/c, c) -> no\n        //       - matchOne(c, c) yes, hit\n        var fr = fi\n        var pr = pi + 1\n        if (pr === pl) {\n          this.debug('** at the end')\n          // a ** at the end will just swallow the rest.\n          // We have found a match.\n          // however, it will not swallow /.x, unless\n          // options.dot is set.\n          // . and .. are *never* matched by **, for explosively\n          // exponential reasons.\n          for (; fi < fl; fi++) {\n            if (\n              file[fi] === '.' ||\n              file[fi] === '..' ||\n              (!options.dot && file[fi].charAt(0) === '.')\n            )\n              return false\n          }\n          return true\n        }\n\n        // ok, let's see if we can swallow whatever we can.\n        while (fr < fl) {\n          var swallowee = file[fr]\n\n          this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n          // XXX remove this slice.  Just pass the start index.\n          if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n            this.debug('globstar found match!', fr, fl, swallowee)\n            // found a match.\n            return true\n          } else {\n            // can't swallow \".\" or \"..\" ever.\n            // can only swallow \".foo\" when explicitly asked.\n            if (\n              swallowee === '.' ||\n              swallowee === '..' ||\n              (!options.dot && swallowee.charAt(0) === '.')\n            ) {\n              this.debug('dot detected!', file, fr, pattern, pr)\n              break\n            }\n\n            // ** swallows a segment, and continue.\n            this.debug('globstar swallow a segment, and continue')\n            fr++\n          }\n        }\n\n        // no match was found.\n        // However, in partial mode, we can't say this is necessarily over.\n        /* c8 ignore start */\n        if (partial) {\n          // ran out of file\n          this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n          if (fr === fl) {\n            return true\n          }\n        }\n        /* c8 ignore stop */\n        return false\n      }\n\n      // something other than **\n      // non-magic patterns just have to match exactly\n      // patterns with magic have been turned into regexps.\n      let hit: boolean\n      if (typeof p === 'string') {\n        hit = f === p\n        this.debug('string match', p, f, hit)\n      } else {\n        hit = p.test(f)\n        this.debug('pattern match', p, f, hit)\n      }\n\n      if (!hit) return false\n    }\n\n    // Note: ending in / means that we'll get a final \"\"\n    // at the end of the pattern.  This can only match a\n    // corresponding \"\" at the end of the file.\n    // If the file ends in /, then it can only match a\n    // a pattern that ends in /, unless the pattern just\n    // doesn't have any more for it. But, a/b/ should *not*\n    // match \"a/b/*\", even though \"\" matches against the\n    // [^/]*? pattern, except in partial mode, where it might\n    // simply not be reached yet.\n    // However, a/b/ should still satisfy a/*\n\n    // now either we fell off the end of the pattern, or we're done.\n    if (fi === fl && pi === pl) {\n      // ran out of pattern and filename at the same time.\n      // an exact hit!\n      return true\n    } else if (fi === fl) {\n      // ran out of file, but still had pattern left.\n      // this is ok if we're doing the match as part of\n      // a glob fs traversal.\n      return partial\n    } else if (pi === pl) {\n      // ran out of pattern, still have file left.\n      // this is only acceptable if we're on the very last\n      // empty segment of a file with a trailing slash.\n      // a/* should match a/b/\n      return fi === fl - 1 && file[fi] === ''\n\n      /* c8 ignore start */\n    } else {\n      // should be unreachable.\n      throw new Error('wtf?')\n    }\n    /* c8 ignore stop */\n  }\n\n  braceExpand() {\n    return braceExpand(this.pattern, this.options)\n  }\n\n  parse(pattern: string): ParseReturn {\n    assertValidPattern(pattern)\n\n    const options = this.options\n\n    // shortcuts\n    if (pattern === '**') return GLOBSTAR\n    if (pattern === '') return ''\n\n    // far and away, the most common glob pattern parts are\n    // *, *.*, and *.  Add a fast check method for those.\n    let m: RegExpMatchArray | null\n    let fastTest: null | ((f: string) => boolean) = null\n    if ((m = pattern.match(starRE))) {\n      fastTest = options.dot ? starTestDot : starTest\n    } else if ((m = pattern.match(starDotExtRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? starDotExtTestNocaseDot\n            : starDotExtTestNocase\n          : options.dot\n          ? starDotExtTestDot\n          : starDotExtTest\n      )(m[1])\n    } else if ((m = pattern.match(qmarksRE))) {\n      fastTest = (\n        options.nocase\n          ? options.dot\n            ? qmarksTestNocaseDot\n            : qmarksTestNocase\n          : options.dot\n          ? qmarksTestDot\n          : qmarksTest\n      )(m)\n    } else if ((m = pattern.match(starDotStarRE))) {\n      fastTest = options.dot ? starDotStarTestDot : starDotStarTest\n    } else if ((m = pattern.match(dotStarRE))) {\n      fastTest = dotStarTest\n    }\n\n    const re = AST.fromGlob(pattern, this.options).toMMPattern()\n    return fastTest ? Object.assign(re, { test: fastTest }) : re\n  }\n\n  makeRe() {\n    if (this.regexp || this.regexp === false) return this.regexp\n\n    // at this point, this.set is a 2d array of partial\n    // pattern strings, or \"**\".\n    //\n    // It's better to use .match().  This function shouldn't\n    // be used, really, but it's pretty convenient sometimes,\n    // when you just want to work with a regex.\n    const set = this.set\n\n    if (!set.length) {\n      this.regexp = false\n      return this.regexp\n    }\n    const options = this.options\n\n    const twoStar = options.noglobstar\n      ? star\n      : options.dot\n      ? twoStarDot\n      : twoStarNoDot\n    const flags = new Set(options.nocase ? ['i'] : [])\n\n    // regexpify non-globstar patterns\n    // if ** is only item, then we just do one twoStar\n    // if ** is first, and there are more, prepend (\\/|twoStar\\/)? to next\n    // if ** is last, append (\\/twoStar|) to previous\n    // if ** is in the middle, append (\\/|\\/twoStar\\/) to previous\n    // then filter out GLOBSTAR symbols\n    let re = set\n      .map(pattern => {\n        const pp: (string | typeof GLOBSTAR)[] = pattern.map(p => {\n          if (p instanceof RegExp) {\n            for (const f of p.flags.split('')) flags.add(f)\n          }\n          return typeof p === 'string'\n            ? regExpEscape(p)\n            : p === GLOBSTAR\n            ? GLOBSTAR\n            : p._src\n        }) as (string | typeof GLOBSTAR)[]\n        pp.forEach((p, i) => {\n          const next = pp[i + 1]\n          const prev = pp[i - 1]\n          if (p !== GLOBSTAR || prev === GLOBSTAR) {\n            return\n          }\n          if (prev === undefined) {\n            if (next !== undefined && next !== GLOBSTAR) {\n              pp[i + 1] = '(?:\\\\/|' + twoStar + '\\\\/)?' + next\n            } else {\n              pp[i] = twoStar\n            }\n          } else if (next === undefined) {\n            pp[i - 1] = prev + '(?:\\\\/|' + twoStar + ')?'\n          } else if (next !== GLOBSTAR) {\n            pp[i - 1] = prev + '(?:\\\\/|\\\\/' + twoStar + '\\\\/)' + next\n            pp[i + 1] = GLOBSTAR\n          }\n        })\n        return pp.filter(p => p !== GLOBSTAR).join('/')\n      })\n      .join('|')\n\n    // need to wrap in parens if we had more than one thing with |,\n    // otherwise only the first will be anchored to ^ and the last to $\n    const [open, close] = set.length > 1 ? ['(?:', ')'] : ['', '']\n    // must match entire pattern\n    // ending in a * or ** will make it less strict.\n    re = '^' + open + re + close + '$'\n\n    // can match anything, as long as it's not this.\n    if (this.negate) re = '^(?!' + re + ').+$'\n\n    try {\n      this.regexp = new RegExp(re, [...flags].join(''))\n      /* c8 ignore start */\n    } catch (ex) {\n      // should be impossible\n      this.regexp = false\n    }\n    /* c8 ignore stop */\n    return this.regexp\n  }\n\n  slashSplit(p: string) {\n    // if p starts with // on windows, we preserve that\n    // so that UNC paths aren't broken.  Otherwise, any number of\n    // / characters are coalesced into one, unless\n    // preserveMultipleSlashes is set to true.\n    if (this.preserveMultipleSlashes) {\n      return p.split('/')\n    } else if (this.isWindows && /^\\/\\/[^\\/]+/.test(p)) {\n      // add an extra '' for the one we lose\n      return ['', ...p.split(/\\/+/)]\n    } else {\n      return p.split(/\\/+/)\n    }\n  }\n\n  match(f: string, partial = this.partial) {\n    this.debug('match', f, this.pattern)\n    // short-circuit in the case of busted things.\n    // comments, etc.\n    if (this.comment) {\n      return false\n    }\n    if (this.empty) {\n      return f === ''\n    }\n\n    if (f === '/' && partial) {\n      return true\n    }\n\n    const options = this.options\n\n    // windows: need to use /, not \\\n    if (this.isWindows) {\n      f = f.split('\\\\').join('/')\n    }\n\n    // treat the test path as a set of pathparts.\n    const ff = this.slashSplit(f)\n    this.debug(this.pattern, 'split', ff)\n\n    // just ONE of the pattern sets in this.set needs to match\n    // in order for it to be valid.  If negating, then just one\n    // match means that we have failed.\n    // Either way, return on the first hit.\n\n    const set = this.set\n    this.debug(this.pattern, 'set', set)\n\n    // Find the basename of the path by looking for the last non-empty segment\n    let filename: string = ff[ff.length - 1]\n    if (!filename) {\n      for (let i = ff.length - 2; !filename && i >= 0; i--) {\n        filename = ff[i]\n      }\n    }\n\n    for (let i = 0; i < set.length; i++) {\n      const pattern = set[i]\n      let file = ff\n      if (options.matchBase && pattern.length === 1) {\n        file = [filename]\n      }\n      const hit = this.matchOne(file, pattern, partial)\n      if (hit) {\n        if (options.flipNegate) {\n          return true\n        }\n        return !this.negate\n      }\n    }\n\n    // didn't get any hits.  this is success if it's a negative\n    // pattern, failure otherwise.\n    if (options.flipNegate) {\n      return false\n    }\n    return this.negate\n  }\n\n  static defaults(def: MinimatchOptions) {\n    return minimatch.defaults(def).Minimatch\n  }\n}\n/* c8 ignore start */\nexport { AST } from './ast.js'\nexport { escape } from './escape.js'\nexport { unescape } from './unescape.js'\n/* c8 ignore stop */\nminimatch.AST = AST\nminimatch.Minimatch = Minimatch\nminimatch.escape = escape\nminimatch.unescape = unescape\n"]}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/package.json b/@capacitor/assets/node_modules/minimatch/dist/mjs/package.json
new file mode 100644
index 00000000..3dbc1ca5
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/package.json
@@ -0,0 +1,3 @@
+{
+  "type": "module"
+}
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.d.ts b/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.d.ts
new file mode 100644
index 00000000..23a7b387
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.d.ts
@@ -0,0 +1,17 @@
+import { MinimatchOptions } from './index.js';
+/**
+ * Un-escape a string that has been escaped with {@link escape}.
+ *
+ * If the {@link windowsPathsNoEscape} option is used, then square-brace
+ * escapes are removed, but not backslash escapes.  For example, it will turn
+ * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
+ * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
+ *
+ * When `windowsPathsNoEscape` is not set, then both brace escapes and
+ * backslash escapes are removed.
+ *
+ * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
+ * or unescaped.
+ */
+export declare const unescape: (s: string, { windowsPathsNoEscape, }?: Pick) => string;
+//# sourceMappingURL=unescape.d.ts.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.d.ts.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.d.ts.map
new file mode 100644
index 00000000..7ace0701
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.d.ts.map
@@ -0,0 +1 @@
+{"version":3,"file":"unescape.d.ts","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,MAChB,MAAM,8BAGN,KAAK,gBAAgB,EAAE,sBAAsB,CAAC,WAKlD,CAAA"}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.js b/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.js
new file mode 100644
index 00000000..0faf9a2b
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.js
@@ -0,0 +1,20 @@
+/**
+ * Un-escape a string that has been escaped with {@link escape}.
+ *
+ * If the {@link windowsPathsNoEscape} option is used, then square-brace
+ * escapes are removed, but not backslash escapes.  For example, it will turn
+ * the string `'[*]'` into `*`, but it will not turn `'\\*'` into `'*'`,
+ * becuase `\` is a path separator in `windowsPathsNoEscape` mode.
+ *
+ * When `windowsPathsNoEscape` is not set, then both brace escapes and
+ * backslash escapes are removed.
+ *
+ * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped
+ * or unescaped.
+ */
+export const unescape = (s, { windowsPathsNoEscape = false, } = {}) => {
+    return windowsPathsNoEscape
+        ? s.replace(/\[([^\/\\])\]/g, '$1')
+        : s.replace(/((?!\\).|^)\[([^\/\\])\]/g, '$1$2').replace(/\\([^\/])/g, '$1');
+};
+//# sourceMappingURL=unescape.js.map
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.js.map b/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.js.map
new file mode 100644
index 00000000..eb146c20
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/dist/mjs/unescape.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"unescape.js","sourceRoot":"","sources":["../../src/unescape.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,CAAS,EACT,EACE,oBAAoB,GAAG,KAAK,MACsB,EAAE,EACtD,EAAE;IACF,OAAO,oBAAoB;QACzB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,2BAA2B,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;AAChF,CAAC,CAAA","sourcesContent":["import { MinimatchOptions } from './index.js'\n/**\n * Un-escape a string that has been escaped with {@link escape}.\n *\n * If the {@link windowsPathsNoEscape} option is used, then square-brace\n * escapes are removed, but not backslash escapes.  For example, it will turn\n * the string `'[*]'` into `*`, but it will not turn `'\\\\*'` into `'*'`,\n * becuase `\\` is a path separator in `windowsPathsNoEscape` mode.\n *\n * When `windowsPathsNoEscape` is not set, then both brace escapes and\n * backslash escapes are removed.\n *\n * Slashes (and backslashes in `windowsPathsNoEscape` mode) cannot be escaped\n * or unescaped.\n */\nexport const unescape = (\n  s: string,\n  {\n    windowsPathsNoEscape = false,\n  }: Pick = {}\n) => {\n  return windowsPathsNoEscape\n    ? s.replace(/\\[([^\\/\\\\])\\]/g, '$1')\n    : s.replace(/((?!\\\\).|^)\\[([^\\/\\\\])\\]/g, '$1$2').replace(/\\\\([^\\/])/g, '$1')\n}\n"]}
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/minimatch/package.json b/@capacitor/assets/node_modules/minimatch/package.json
new file mode 100644
index 00000000..76d1a076
--- /dev/null
+++ b/@capacitor/assets/node_modules/minimatch/package.json
@@ -0,0 +1,86 @@
+{
+  "author": "Isaac Z. Schlueter  (http://blog.izs.me)",
+  "name": "minimatch",
+  "description": "a glob matcher in javascript",
+  "version": "8.0.4",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/isaacs/minimatch.git"
+  },
+  "main": "./dist/cjs/index-cjs.js",
+  "module": "./dist/mjs/index.js",
+  "types": "./dist/cjs/index.d.ts",
+  "exports": {
+    ".": {
+      "import": {
+        "types": "./dist/mjs/index.d.ts",
+        "default": "./dist/mjs/index.js"
+      },
+      "require": {
+        "types": "./dist/cjs/index.d.ts",
+        "default": "./dist/cjs/index-cjs.js"
+      }
+    }
+  },
+  "files": [
+    "dist"
+  ],
+  "scripts": {
+    "preversion": "npm test",
+    "postversion": "npm publish",
+    "prepublishOnly": "git push origin --follow-tags",
+    "preprepare": "rm -rf dist",
+    "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json",
+    "postprepare": "bash fixup.sh",
+    "pretest": "npm run prepare",
+    "presnap": "npm run prepare",
+    "test": "c8 tap",
+    "snap": "c8 tap",
+    "format": "prettier --write . --loglevel warn",
+    "benchmark": "node benchmark/index.js",
+    "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts"
+  },
+  "prettier": {
+    "semi": false,
+    "printWidth": 80,
+    "tabWidth": 2,
+    "useTabs": false,
+    "singleQuote": true,
+    "jsxSingleQuote": false,
+    "bracketSameLine": true,
+    "arrowParens": "avoid",
+    "endOfLine": "lf"
+  },
+  "engines": {
+    "node": ">=16 || 14 >=14.17"
+  },
+  "dependencies": {
+    "brace-expansion": "^2.0.1"
+  },
+  "devDependencies": {
+    "@types/brace-expansion": "^1.1.0",
+    "@types/node": "^18.15.11",
+    "@types/tap": "^15.0.7",
+    "c8": "^7.12.0",
+    "eslint-config-prettier": "^8.6.0",
+    "mkdirp": "1",
+    "prettier": "^2.8.2",
+    "tap": "^16.3.3",
+    "ts-node": "^10.9.1",
+    "typedoc": "^0.23.21",
+    "typescript": "^4.9.3"
+  },
+  "tap": {
+    "coverage": false,
+    "node-arg": [
+      "--no-warnings",
+      "--loader",
+      "ts-node/esm"
+    ],
+    "ts": false
+  },
+  "funding": {
+    "url": "https://github.com/sponsors/isaacs"
+  },
+  "license": "ISC"
+}
diff --git a/@capacitor/assets/node_modules/minipass/LICENSE b/@capacitor/assets/node_modules/minipass/LICENSE
new file mode 100644
index 00000000..97f8e32e
--- /dev/null
+++ b/@capacitor/assets/node_modules/minipass/LICENSE
@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2017-2023 npm, Inc., Isaac Z. Schlueter, and Contributors
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/@capacitor/assets/node_modules/minipass/README.md b/@capacitor/assets/node_modules/minipass/README.md
new file mode 100644
index 00000000..3cb71e35
--- /dev/null
+++ b/@capacitor/assets/node_modules/minipass/README.md
@@ -0,0 +1,769 @@
+# minipass
+
+A _very_ minimal implementation of a [PassThrough
+stream](https://nodejs.org/api/stream.html#stream_class_stream_passthrough)
+
+[It's very
+fast](https://docs.google.com/spreadsheets/d/1K_HR5oh3r80b8WVMWCPPjfuWXUgfkmhlX7FGI6JJ8tY/edit?usp=sharing)
+for objects, strings, and buffers.
+
+Supports `pipe()`ing (including multi-`pipe()` and backpressure
+transmission), buffering data until either a `data` event handler
+or `pipe()` is added (so you don't lose the first chunk), and
+most other cases where PassThrough is a good idea.
+
+There is a `read()` method, but it's much more efficient to
+consume data from this stream via `'data'` events or by calling
+`pipe()` into some other stream. Calling `read()` requires the
+buffer to be flattened in some cases, which requires copying
+memory.
+
+If you set `objectMode: true` in the options, then whatever is
+written will be emitted. Otherwise, it'll do a minimal amount of
+Buffer copying to ensure proper Streams semantics when `read(n)`
+is called.
+
+`objectMode` can also be set by doing `stream.objectMode = true`,
+or by writing any non-string/non-buffer data. `objectMode` cannot
+be set to false once it is set.
+
+This is not a `through` or `through2` stream. It doesn't
+transform the data, it just passes it right through. If you want
+to transform the data, extend the class, and override the
+`write()` method. Once you're done transforming the data however
+you want, call `super.write()` with the transform output.
+
+For some examples of streams that extend Minipass in various
+ways, check out:
+
+- [minizlib](http://npm.im/minizlib)
+- [fs-minipass](http://npm.im/fs-minipass)
+- [tar](http://npm.im/tar)
+- [minipass-collect](http://npm.im/minipass-collect)
+- [minipass-flush](http://npm.im/minipass-flush)
+- [minipass-pipeline](http://npm.im/minipass-pipeline)
+- [tap](http://npm.im/tap)
+- [tap-parser](http://npm.im/tap-parser)
+- [treport](http://npm.im/treport)
+- [minipass-fetch](http://npm.im/minipass-fetch)
+- [pacote](http://npm.im/pacote)
+- [make-fetch-happen](http://npm.im/make-fetch-happen)
+- [cacache](http://npm.im/cacache)
+- [ssri](http://npm.im/ssri)
+- [npm-registry-fetch](http://npm.im/npm-registry-fetch)
+- [minipass-json-stream](http://npm.im/minipass-json-stream)
+- [minipass-sized](http://npm.im/minipass-sized)
+
+## Differences from Node.js Streams
+
+There are several things that make Minipass streams different
+from (and in some ways superior to) Node.js core streams.
+
+Please read these caveats if you are familiar with node-core
+streams and intend to use Minipass streams in your programs.
+
+You can avoid most of these differences entirely (for a very
+small performance penalty) by setting `{async: true}` in the
+constructor options.
+
+### Timing
+
+Minipass streams are designed to support synchronous use-cases.
+Thus, data is emitted as soon as it is available, always. It is
+buffered until read, but no longer. Another way to look at it is
+that Minipass streams are exactly as synchronous as the logic
+that writes into them.
+
+This can be surprising if your code relies on
+`PassThrough.write()` always providing data on the next tick
+rather than the current one, or being able to call `resume()` and
+not have the entire buffer disappear immediately.
+
+However, without this synchronicity guarantee, there would be no
+way for Minipass to achieve the speeds it does, or support the
+synchronous use cases that it does. Simply put, waiting takes
+time.
+
+This non-deferring approach makes Minipass streams much easier to
+reason about, especially in the context of Promises and other
+flow-control mechanisms.
+
+Example:
+
+```js
+// hybrid module, either works
+import Minipass from 'minipass'
+// or:
+const Minipass = require('minipass')
+
+const stream = new Minipass()
+stream.on('data', () => console.log('data event'))
+console.log('before write')
+stream.write('hello')
+console.log('after write')
+// output:
+// before write
+// data event
+// after write
+```
+
+### Exception: Async Opt-In
+
+If you wish to have a Minipass stream with behavior that more
+closely mimics Node.js core streams, you can set the stream in
+async mode either by setting `async: true` in the constructor
+options, or by setting `stream.async = true` later on.
+
+```js
+// hybrid module, either works
+import Minipass from 'minipass'
+// or:
+const Minipass = require('minipass')
+
+const asyncStream = new Minipass({ async: true })
+asyncStream.on('data', () => console.log('data event'))
+console.log('before write')
+asyncStream.write('hello')
+console.log('after write')
+// output:
+// before write
+// after write
+// data event <-- this is deferred until the next tick
+```
+
+Switching _out_ of async mode is unsafe, as it could cause data
+corruption, and so is not enabled. Example:
+
+```js
+import Minipass from 'minipass'
+const stream = new Minipass({ encoding: 'utf8' })
+stream.on('data', chunk => console.log(chunk))
+stream.async = true
+console.log('before writes')
+stream.write('hello')
+setStreamSyncAgainSomehow(stream) // <-- this doesn't actually exist!
+stream.write('world')
+console.log('after writes')
+// hypothetical output would be:
+// before writes
+// world
+// after writes
+// hello
+// NOT GOOD!
+```
+
+To avoid this problem, once set into async mode, any attempt to
+make the stream sync again will be ignored.
+
+```js
+const Minipass = require('minipass')
+const stream = new Minipass({ encoding: 'utf8' })
+stream.on('data', chunk => console.log(chunk))
+stream.async = true
+console.log('before writes')
+stream.write('hello')
+stream.async = false // <-- no-op, stream already async
+stream.write('world')
+console.log('after writes')
+// actual output:
+// before writes
+// after writes
+// hello
+// world
+```
+
+### No High/Low Water Marks
+
+Node.js core streams will optimistically fill up a buffer,
+returning `true` on all writes until the limit is hit, even if
+the data has nowhere to go. Then, they will not attempt to draw
+more data in until the buffer size dips below a minimum value.
+
+Minipass streams are much simpler. The `write()` method will
+return `true` if the data has somewhere to go (which is to say,
+given the timing guarantees, that the data is already there by
+the time `write()` returns).
+
+If the data has nowhere to go, then `write()` returns false, and
+the data sits in a buffer, to be drained out immediately as soon
+as anyone consumes it.
+
+Since nothing is ever buffered unnecessarily, there is much less
+copying data, and less bookkeeping about buffer capacity levels.
+
+### Hazards of Buffering (or: Why Minipass Is So Fast)
+
+Since data written to a Minipass stream is immediately written
+all the way through the pipeline, and `write()` always returns
+true/false based on whether the data was fully flushed,
+backpressure is communicated immediately to the upstream caller.
+This minimizes buffering.
+
+Consider this case:
+
+```js
+const { PassThrough } = require('stream')
+const p1 = new PassThrough({ highWaterMark: 1024 })
+const p2 = new PassThrough({ highWaterMark: 1024 })
+const p3 = new PassThrough({ highWaterMark: 1024 })
+const p4 = new PassThrough({ highWaterMark: 1024 })
+
+p1.pipe(p2).pipe(p3).pipe(p4)
+p4.on('data', () => console.log('made it through'))
+
+// this returns false and buffers, then writes to p2 on next tick (1)
+// p2 returns false and buffers, pausing p1, then writes to p3 on next tick (2)
+// p3 returns false and buffers, pausing p2, then writes to p4 on next tick (3)
+// p4 returns false and buffers, pausing p3, then emits 'data' and 'drain'
+// on next tick (4)
+// p3 sees p4's 'drain' event, and calls resume(), emitting 'resume' and
+// 'drain' on next tick (5)
+// p2 sees p3's 'drain', calls resume(), emits 'resume' and 'drain' on next tick (6)
+// p1 sees p2's 'drain', calls resume(), emits 'resume' and 'drain' on next
+// tick (7)
+
+p1.write(Buffer.alloc(2048)) // returns false
+```
+
+Along the way, the data was buffered and deferred at each stage,
+and multiple event deferrals happened, for an unblocked pipeline
+where it was perfectly safe to write all the way through!
+
+Furthermore, setting a `highWaterMark` of `1024` might lead
+someone reading the code to think an advisory maximum of 1KiB is
+being set for the pipeline. However, the actual advisory
+buffering level is the _sum_ of `highWaterMark` values, since
+each one has its own bucket.
+
+Consider the Minipass case:
+
+```js
+const m1 = new Minipass()
+const m2 = new Minipass()
+const m3 = new Minipass()
+const m4 = new Minipass()
+
+m1.pipe(m2).pipe(m3).pipe(m4)
+m4.on('data', () => console.log('made it through'))
+
+// m1 is flowing, so it writes the data to m2 immediately
+// m2 is flowing, so it writes the data to m3 immediately
+// m3 is flowing, so it writes the data to m4 immediately
+// m4 is flowing, so it fires the 'data' event immediately, returns true
+// m4's write returned true, so m3 is still flowing, returns true
+// m3's write returned true, so m2 is still flowing, returns true
+// m2's write returned true, so m1 is still flowing, returns true
+// No event deferrals or buffering along the way!
+
+m1.write(Buffer.alloc(2048)) // returns true
+```
+
+It is extremely unlikely that you _don't_ want to buffer any data
+written, or _ever_ buffer data that can be flushed all the way
+through. Neither node-core streams nor Minipass ever fail to
+buffer written data, but node-core streams do a lot of
+unnecessary buffering and pausing.
+
+As always, the faster implementation is the one that does less
+stuff and waits less time to do it.
+
+### Immediately emit `end` for empty streams (when not paused)
+
+If a stream is not paused, and `end()` is called before writing
+any data into it, then it will emit `end` immediately.
+
+If you have logic that occurs on the `end` event which you don't
+want to potentially happen immediately (for example, closing file
+descriptors, moving on to the next entry in an archive parse
+stream, etc.) then be sure to call `stream.pause()` on creation,
+and then `stream.resume()` once you are ready to respond to the
+`end` event.
+
+However, this is _usually_ not a problem because:
+
+### Emit `end` When Asked
+
+One hazard of immediately emitting `'end'` is that you may not
+yet have had a chance to add a listener. In order to avoid this
+hazard, Minipass streams safely re-emit the `'end'` event if a
+new listener is added after `'end'` has been emitted.
+
+Ie, if you do `stream.on('end', someFunction)`, and the stream
+has already emitted `end`, then it will call the handler right
+away. (You can think of this somewhat like attaching a new
+`.then(fn)` to a previously-resolved Promise.)
+
+To prevent calling handlers multiple times who would not expect
+multiple ends to occur, all listeners are removed from the
+`'end'` event whenever it is emitted.
+
+### Emit `error` When Asked
+
+The most recent error object passed to the `'error'` event is
+stored on the stream. If a new `'error'` event handler is added,
+and an error was previously emitted, then the event handler will
+be called immediately (or on `process.nextTick` in the case of
+async streams).
+
+This makes it much more difficult to end up trying to interact
+with a broken stream, if the error handler is added after an
+error was previously emitted.
+
+### Impact of "immediate flow" on Tee-streams
+
+A "tee stream" is a stream piping to multiple destinations:
+
+```js
+const tee = new Minipass()
+t.pipe(dest1)
+t.pipe(dest2)
+t.write('foo') // goes to both destinations
+```
+
+Since Minipass streams _immediately_ process any pending data
+through the pipeline when a new pipe destination is added, this
+can have surprising effects, especially when a stream comes in
+from some other function and may or may not have data in its
+buffer.
+
+```js
+// WARNING! WILL LOSE DATA!
+const src = new Minipass()
+src.write('foo')
+src.pipe(dest1) // 'foo' chunk flows to dest1 immediately, and is gone
+src.pipe(dest2) // gets nothing!
+```
+
+One solution is to create a dedicated tee-stream junction that
+pipes to both locations, and then pipe to _that_ instead.
+
+```js
+// Safe example: tee to both places
+const src = new Minipass()
+src.write('foo')
+const tee = new Minipass()
+tee.pipe(dest1)
+tee.pipe(dest2)
+src.pipe(tee) // tee gets 'foo', pipes to both locations
+```
+
+The same caveat applies to `on('data')` event listeners. The
+first one added will _immediately_ receive all of the data,
+leaving nothing for the second:
+
+```js
+// WARNING! WILL LOSE DATA!
+const src = new Minipass()
+src.write('foo')
+src.on('data', handler1) // receives 'foo' right away
+src.on('data', handler2) // nothing to see here!
+```
+
+Using a dedicated tee-stream can be used in this case as well:
+
+```js
+// Safe example: tee to both data handlers
+const src = new Minipass()
+src.write('foo')
+const tee = new Minipass()
+tee.on('data', handler1)
+tee.on('data', handler2)
+src.pipe(tee)
+```
+
+All of the hazards in this section are avoided by setting `{
+async: true }` in the Minipass constructor, or by setting
+`stream.async = true` afterwards. Note that this does add some
+overhead, so should only be done in cases where you are willing
+to lose a bit of performance in order to avoid having to refactor
+program logic.
+
+## USAGE
+
+It's a stream! Use it like a stream and it'll most likely do what
+you want.
+
+```js
+import Minipass from 'minipass'
+const mp = new Minipass(options) // optional: { encoding, objectMode }
+mp.write('foo')
+mp.pipe(someOtherStream)
+mp.end('bar')
+```
+
+### OPTIONS
+
+- `encoding` How would you like the data coming _out_ of the
+  stream to be encoded? Accepts any values that can be passed to
+  `Buffer.toString()`.
+- `objectMode` Emit data exactly as it comes in. This will be
+  flipped on by default if you write() something other than a
+  string or Buffer at any point. Setting `objectMode: true` will
+  prevent setting any encoding value.
+- `async` Defaults to `false`. Set to `true` to defer data
+  emission until next tick. This reduces performance slightly,
+  but makes Minipass streams use timing behavior closer to Node
+  core streams. See [Timing](#timing) for more details.
+- `signal` An `AbortSignal` that will cause the stream to unhook
+  itself from everything and become as inert as possible. Note
+  that providing a `signal` parameter will make `'error'` events
+  no longer throw if they are unhandled, but they will still be
+  emitted to handlers if any are attached.
+
+### API
+
+Implements the user-facing portions of Node.js's `Readable` and
+`Writable` streams.
+
+### Methods
+
+- `write(chunk, [encoding], [callback])` - Put data in. (Note
+  that, in the base Minipass class, the same data will come out.)
+  Returns `false` if the stream will buffer the next write, or
+  true if it's still in "flowing" mode.
+- `end([chunk, [encoding]], [callback])` - Signal that you have
+  no more data to write. This will queue an `end` event to be
+  fired when all the data has been consumed.
+- `setEncoding(encoding)` - Set the encoding for data coming of
+  the stream. This can only be done once.
+- `pause()` - No more data for a while, please. This also
+  prevents `end` from being emitted for empty streams until the
+  stream is resumed.
+- `resume()` - Resume the stream. If there's data in the buffer,
+  it is all discarded. Any buffered events are immediately
+  emitted.
+- `pipe(dest)` - Send all output to the stream provided. When
+  data is emitted, it is immediately written to any and all pipe
+  destinations. (Or written on next tick in `async` mode.)
+- `unpipe(dest)` - Stop piping to the destination stream. This is
+  immediate, meaning that any asynchronously queued data will
+  _not_ make it to the destination when running in `async` mode.
+  - `options.end` - Boolean, end the destination stream when the
+    source stream ends. Default `true`.
+  - `options.proxyErrors` - Boolean, proxy `error` events from
+    the source stream to the destination stream. Note that errors
+    are _not_ proxied after the pipeline terminates, either due
+    to the source emitting `'end'` or manually unpiping with
+    `src.unpipe(dest)`. Default `false`.
+- `on(ev, fn)`, `emit(ev, fn)` - Minipass streams are
+  EventEmitters. Some events are given special treatment,
+  however. (See below under "events".)
+- `promise()` - Returns a Promise that resolves when the stream
+  emits `end`, or rejects if the stream emits `error`.
+- `collect()` - Return a Promise that resolves on `end` with an
+  array containing each chunk of data that was emitted, or
+  rejects if the stream emits `error`. Note that this consumes
+  the stream data.
+- `concat()` - Same as `collect()`, but concatenates the data
+  into a single Buffer object. Will reject the returned promise
+  if the stream is in objectMode, or if it goes into objectMode
+  by the end of the data.
+- `read(n)` - Consume `n` bytes of data out of the buffer. If `n`
+  is not provided, then consume all of it. If `n` bytes are not
+  available, then it returns null. **Note** consuming streams in
+  this way is less efficient, and can lead to unnecessary Buffer
+  copying.
+- `destroy([er])` - Destroy the stream. If an error is provided,
+  then an `'error'` event is emitted. If the stream has a
+  `close()` method, and has not emitted a `'close'` event yet,
+  then `stream.close()` will be called. Any Promises returned by
+  `.promise()`, `.collect()` or `.concat()` will be rejected.
+  After being destroyed, writing to the stream will emit an
+  error. No more data will be emitted if the stream is destroyed,
+  even if it was previously buffered.
+
+### Properties
+
+- `bufferLength` Read-only. Total number of bytes buffered, or in
+  the case of objectMode, the total number of objects.
+- `encoding` The encoding that has been set. (Setting this is
+  equivalent to calling `setEncoding(enc)` and has the same
+  prohibition against setting multiple times.)
+- `flowing` Read-only. Boolean indicating whether a chunk written
+  to the stream will be immediately emitted.
+- `emittedEnd` Read-only. Boolean indicating whether the end-ish
+  events (ie, `end`, `prefinish`, `finish`) have been emitted.
+  Note that listening on any end-ish event will immediateyl
+  re-emit it if it has already been emitted.
+- `writable` Whether the stream is writable. Default `true`. Set
+  to `false` when `end()`
+- `readable` Whether the stream is readable. Default `true`.
+- `pipes` An array of Pipe objects referencing streams that this
+  stream is piping into.
+- `destroyed` A getter that indicates whether the stream was
+  destroyed.
+- `paused` True if the stream has been explicitly paused,
+  otherwise false.
+- `objectMode` Indicates whether the stream is in `objectMode`.
+  Once set to `true`, it cannot be set to `false`.
+- `aborted` Readonly property set when the `AbortSignal`
+  dispatches an `abort` event.
+
+### Events
+
+- `data` Emitted when there's data to read. Argument is the data
+  to read. This is never emitted while not flowing. If a listener
+  is attached, that will resume the stream.
+- `end` Emitted when there's no more data to read. This will be
+  emitted immediately for empty streams when `end()` is called.
+  If a listener is attached, and `end` was already emitted, then
+  it will be emitted again. All listeners are removed when `end`
+  is emitted.
+- `prefinish` An end-ish event that follows the same logic as
+  `end` and is emitted in the same conditions where `end` is
+  emitted. Emitted after `'end'`.
+- `finish` An end-ish event that follows the same logic as `end`
+  and is emitted in the same conditions where `end` is emitted.
+  Emitted after `'prefinish'`.
+- `close` An indication that an underlying resource has been
+  released. Minipass does not emit this event, but will defer it
+  until after `end` has been emitted, since it throws off some
+  stream libraries otherwise.
+- `drain` Emitted when the internal buffer empties, and it is
+  again suitable to `write()` into the stream.
+- `readable` Emitted when data is buffered and ready to be read
+  by a consumer.
+- `resume` Emitted when stream changes state from buffering to
+  flowing mode. (Ie, when `resume` is called, `pipe` is called,
+  or a `data` event listener is added.)
+
+### Static Methods
+
+- `Minipass.isStream(stream)` Returns `true` if the argument is a
+  stream, and false otherwise. To be considered a stream, the
+  object must be either an instance of Minipass, or an
+  EventEmitter that has either a `pipe()` method, or both
+  `write()` and `end()` methods. (Pretty much any stream in
+  node-land will return `true` for this.)
+
+## EXAMPLES
+
+Here are some examples of things you can do with Minipass
+streams.
+
+### simple "are you done yet" promise
+
+```js
+mp.promise().then(
+  () => {
+    // stream is finished
+  },
+  er => {
+    // stream emitted an error
+  }
+)
+```
+
+### collecting
+
+```js
+mp.collect().then(all => {
+  // all is an array of all the data emitted
+  // encoding is supported in this case, so
+  // so the result will be a collection of strings if
+  // an encoding is specified, or buffers/objects if not.
+  //
+  // In an async function, you may do
+  // const data = await stream.collect()
+})
+```
+
+### collecting into a single blob
+
+This is a bit slower because it concatenates the data into one
+chunk for you, but if you're going to do it yourself anyway, it's
+convenient this way:
+
+```js
+mp.concat().then(onebigchunk => {
+  // onebigchunk is a string if the stream
+  // had an encoding set, or a buffer otherwise.
+})
+```
+
+### iteration
+
+You can iterate over streams synchronously or asynchronously in
+platforms that support it.
+
+Synchronous iteration will end when the currently available data
+is consumed, even if the `end` event has not been reached. In
+string and buffer mode, the data is concatenated, so unless
+multiple writes are occurring in the same tick as the `read()`,
+sync iteration loops will generally only have a single iteration.
+
+To consume chunks in this way exactly as they have been written,
+with no flattening, create the stream with the `{ objectMode:
+true }` option.
+
+```js
+const mp = new Minipass({ objectMode: true })
+mp.write('a')
+mp.write('b')
+for (let letter of mp) {
+  console.log(letter) // a, b
+}
+mp.write('c')
+mp.write('d')
+for (let letter of mp) {
+  console.log(letter) // c, d
+}
+mp.write('e')
+mp.end()
+for (let letter of mp) {
+  console.log(letter) // e
+}
+for (let letter of mp) {
+  console.log(letter) // nothing
+}
+```
+
+Asynchronous iteration will continue until the end event is reached,
+consuming all of the data.
+
+```js
+const mp = new Minipass({ encoding: 'utf8' })
+
+// some source of some data
+let i = 5
+const inter = setInterval(() => {
+  if (i-- > 0) mp.write(Buffer.from('foo\n', 'utf8'))
+  else {
+    mp.end()
+    clearInterval(inter)
+  }
+}, 100)
+
+// consume the data with asynchronous iteration
+async function consume() {
+  for await (let chunk of mp) {
+    console.log(chunk)
+  }
+  return 'ok'
+}
+
+consume().then(res => console.log(res))
+// logs `foo\n` 5 times, and then `ok`
+```
+
+### subclass that `console.log()`s everything written into it
+
+```js
+class Logger extends Minipass {
+  write(chunk, encoding, callback) {
+    console.log('WRITE', chunk, encoding)
+    return super.write(chunk, encoding, callback)
+  }
+  end(chunk, encoding, callback) {
+    console.log('END', chunk, encoding)
+    return super.end(chunk, encoding, callback)
+  }
+}
+
+someSource.pipe(new Logger()).pipe(someDest)
+```
+
+### same thing, but using an inline anonymous class
+
+```js
+// js classes are fun
+someSource
+  .pipe(
+    new (class extends Minipass {
+      emit(ev, ...data) {
+        // let's also log events, because debugging some weird thing
+        console.log('EMIT', ev)
+        return super.emit(ev, ...data)
+      }
+      write(chunk, encoding, callback) {
+        console.log('WRITE', chunk, encoding)
+        return super.write(chunk, encoding, callback)
+      }
+      end(chunk, encoding, callback) {
+        console.log('END', chunk, encoding)
+        return super.end(chunk, encoding, callback)
+      }
+    })()
+  )
+  .pipe(someDest)
+```
+
+### subclass that defers 'end' for some reason
+
+```js
+class SlowEnd extends Minipass {
+  emit(ev, ...args) {
+    if (ev === 'end') {
+      console.log('going to end, hold on a sec')
+      setTimeout(() => {
+        console.log('ok, ready to end now')
+        super.emit('end', ...args)
+      }, 100)
+    } else {
+      return super.emit(ev, ...args)
+    }
+  }
+}
+```
+
+### transform that creates newline-delimited JSON
+
+```js
+class NDJSONEncode extends Minipass {
+  write(obj, cb) {
+    try {
+      // JSON.stringify can throw, emit an error on that
+      return super.write(JSON.stringify(obj) + '\n', 'utf8', cb)
+    } catch (er) {
+      this.emit('error', er)
+    }
+  }
+  end(obj, cb) {
+    if (typeof obj === 'function') {
+      cb = obj
+      obj = undefined
+    }
+    if (obj !== undefined) {
+      this.write(obj)
+    }
+    return super.end(cb)
+  }
+}
+```
+
+### transform that parses newline-delimited JSON
+
+```js
+class NDJSONDecode extends Minipass {
+  constructor (options) {
+    // always be in object mode, as far as Minipass is concerned
+    super({ objectMode: true })
+    this._jsonBuffer = ''
+  }
+  write (chunk, encoding, cb) {
+    if (typeof chunk === 'string' &&
+        typeof encoding === 'string' &&
+        encoding !== 'utf8') {
+      chunk = Buffer.from(chunk, encoding).toString()
+    } else if (Buffer.isBuffer(chunk)) {
+      chunk = chunk.toString()
+    }
+    if (typeof encoding === 'function') {
+      cb = encoding
+    }
+    const jsonData = (this._jsonBuffer + chunk).split('\n')
+    this._jsonBuffer = jsonData.pop()
+    for (let i = 0; i < jsonData.length; i++) {
+      try {
+        // JSON.parse can throw, emit an error on that
+        super.write(JSON.parse(jsonData[i]))
+      } catch (er) {
+        this.emit('error', er)
+        continue
+      }
+    }
+    if (cb)
+      cb()
+  }
+}
+```
diff --git a/@capacitor/assets/node_modules/minipass/index.d.ts b/@capacitor/assets/node_modules/minipass/index.d.ts
new file mode 100644
index 00000000..539fbca5
--- /dev/null
+++ b/@capacitor/assets/node_modules/minipass/index.d.ts
@@ -0,0 +1,150 @@
+/// 
+
+// Note: marking anything protected or private in the exported
+// class will limit Minipass's ability to be used as the base
+// for mixin classes.
+import { EventEmitter } from 'events'
+import { Stream } from 'stream'
+
+declare namespace Minipass {
+  type Encoding = BufferEncoding | 'buffer' | null
+
+  interface Writable extends EventEmitter {
+    end(): any
+    write(chunk: any, ...args: any[]): any
+  }
+
+  interface Readable extends EventEmitter {
+    pause(): any
+    resume(): any
+    pipe(): any
+  }
+
+  type DualIterable = Iterable & AsyncIterable
+
+  type ContiguousData = Buffer | ArrayBufferLike | ArrayBufferView | string
+
+  type BufferOrString = Buffer | string
+
+  interface SharedOptions {
+    async?: boolean
+    signal?: AbortSignal
+  }
+
+  interface StringOptions extends SharedOptions {
+    encoding: BufferEncoding
+    objectMode?: boolean
+  }
+
+  interface BufferOptions extends SharedOptions {
+    encoding?: null | 'buffer'
+    objectMode?: boolean
+  }
+
+  interface ObjectModeOptions extends SharedOptions {
+    objectMode: true
+  }
+
+  interface PipeOptions {
+    end?: boolean
+    proxyErrors?: boolean
+  }
+
+  type Options = T extends string
+    ? StringOptions
+    : T extends Buffer
+    ? BufferOptions
+    : ObjectModeOptions
+}
+
+declare class Minipass<
+    RType extends any = Buffer,
+    WType extends any = RType extends Minipass.BufferOrString
+      ? Minipass.ContiguousData
+      : RType
+  >
+  extends Stream
+  implements Minipass.DualIterable
+{
+  static isStream(stream: any): stream is Minipass.Readable | Minipass.Writable
+
+  readonly bufferLength: number
+  readonly flowing: boolean
+  readonly writable: boolean
+  readonly readable: boolean
+  readonly aborted: boolean
+  readonly paused: boolean
+  readonly emittedEnd: boolean
+  readonly destroyed: boolean
+
+  /**
+   * Technically writable, but mutating it can change the type,
+   * so is not safe to do in TypeScript.
+   */
+  readonly objectMode: boolean
+  async: boolean
+
+  /**
+   * Note: encoding is not actually read-only, and setEncoding(enc)
+   * exists. However, this type definition will insist that TypeScript
+   * programs declare the type of a Minipass stream up front, and if
+   * that type is string, then an encoding MUST be set in the ctor. If
+   * the type is Buffer, then the encoding must be missing, or set to
+   * 'buffer' or null. If the type is anything else, then objectMode
+   * must be set in the constructor options.  So there is effectively
+   * no allowed way that a TS program can set the encoding after
+   * construction, as doing so will destroy any hope of type safety.
+   * TypeScript does not provide many options for changing the type of
+   * an object at run-time, which is what changing the encoding does.
+   */
+  readonly encoding: Minipass.Encoding
+  // setEncoding(encoding: Encoding): void
+
+  // Options required if not reading buffers
+  constructor(
+    ...args: RType extends Buffer
+      ? [] | [Minipass.Options]
+      : [Minipass.Options]
+  )
+
+  write(chunk: WType, cb?: () => void): boolean
+  write(chunk: WType, encoding?: Minipass.Encoding, cb?: () => void): boolean
+  read(size?: number): RType
+  end(cb?: () => void): this
+  end(chunk: any, cb?: () => void): this
+  end(chunk: any, encoding?: Minipass.Encoding, cb?: () => void): this
+  pause(): void
+  resume(): void
+  promise(): Promise
+  collect(): Promise
+
+  concat(): RType extends Minipass.BufferOrString ? Promise : never
+  destroy(er?: any): void
+  pipe(dest: W, opts?: Minipass.PipeOptions): W
+  unpipe(dest: W): void
+
+  /**
+   * alias for on()
+   */
+  addEventHandler(event: string, listener: (...args: any[]) => any): this
+
+  on(event: string, listener: (...args: any[]) => any): this
+  on(event: 'data', listener: (chunk: RType) => any): this
+  on(event: 'error', listener: (error: any) => any): this
+  on(
+    event:
+      | 'readable'
+      | 'drain'
+      | 'resume'
+      | 'end'
+      | 'prefinish'
+      | 'finish'
+      | 'close',
+    listener: () => any
+  ): this
+
+  [Symbol.iterator](): Generator
+  [Symbol.asyncIterator](): AsyncGenerator
+}
+
+export = Minipass
diff --git a/@capacitor/assets/node_modules/minipass/index.js b/@capacitor/assets/node_modules/minipass/index.js
new file mode 100644
index 00000000..5e192c28
--- /dev/null
+++ b/@capacitor/assets/node_modules/minipass/index.js
@@ -0,0 +1,702 @@
+'use strict'
+const proc =
+  typeof process === 'object' && process
+    ? process
+    : {
+        stdout: null,
+        stderr: null,
+      }
+const EE = require('events')
+const Stream = require('stream')
+const stringdecoder = require('string_decoder')
+const SD = stringdecoder.StringDecoder
+
+const EOF = Symbol('EOF')
+const MAYBE_EMIT_END = Symbol('maybeEmitEnd')
+const EMITTED_END = Symbol('emittedEnd')
+const EMITTING_END = Symbol('emittingEnd')
+const EMITTED_ERROR = Symbol('emittedError')
+const CLOSED = Symbol('closed')
+const READ = Symbol('read')
+const FLUSH = Symbol('flush')
+const FLUSHCHUNK = Symbol('flushChunk')
+const ENCODING = Symbol('encoding')
+const DECODER = Symbol('decoder')
+const FLOWING = Symbol('flowing')
+const PAUSED = Symbol('paused')
+const RESUME = Symbol('resume')
+const BUFFER = Symbol('buffer')
+const PIPES = Symbol('pipes')
+const BUFFERLENGTH = Symbol('bufferLength')
+const BUFFERPUSH = Symbol('bufferPush')
+const BUFFERSHIFT = Symbol('bufferShift')
+const OBJECTMODE = Symbol('objectMode')
+// internal event when stream is destroyed
+const DESTROYED = Symbol('destroyed')
+// internal event when stream has an error
+const ERROR = Symbol('error')
+const EMITDATA = Symbol('emitData')
+const EMITEND = Symbol('emitEnd')
+const EMITEND2 = Symbol('emitEnd2')
+const ASYNC = Symbol('async')
+const ABORT = Symbol('abort')
+const ABORTED = Symbol('aborted')
+const SIGNAL = Symbol('signal')
+
+const defer = fn => Promise.resolve().then(fn)
+
+// TODO remove when Node v8 support drops
+const doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== '1'
+const ASYNCITERATOR =
+  (doIter && Symbol.asyncIterator) || Symbol('asyncIterator not implemented')
+const ITERATOR =
+  (doIter && Symbol.iterator) || Symbol('iterator not implemented')
+
+// events that mean 'the stream is over'
+// these are treated specially, and re-emitted
+// if they are listened for after emitting.
+const isEndish = ev => ev === 'end' || ev === 'finish' || ev === 'prefinish'
+
+const isArrayBuffer = b =>
+  b instanceof ArrayBuffer ||
+  (typeof b === 'object' &&
+    b.constructor &&
+    b.constructor.name === 'ArrayBuffer' &&
+    b.byteLength >= 0)
+
+const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b)
+
+class Pipe {
+  constructor(src, dest, opts) {
+    this.src = src
+    this.dest = dest
+    this.opts = opts
+    this.ondrain = () => src[RESUME]()
+    dest.on('drain', this.ondrain)
+  }
+  unpipe() {
+    this.dest.removeListener('drain', this.ondrain)
+  }
+  // istanbul ignore next - only here for the prototype
+  proxyErrors() {}
+  end() {
+    this.unpipe()
+    if (this.opts.end) this.dest.end()
+  }
+}
+
+class PipeProxyErrors extends Pipe {
+  unpipe() {
+    this.src.removeListener('error', this.proxyErrors)
+    super.unpipe()
+  }
+  constructor(src, dest, opts) {
+    super(src, dest, opts)
+    this.proxyErrors = er => dest.emit('error', er)
+    src.on('error', this.proxyErrors)
+  }
+}
+
+class Minipass extends Stream {
+  constructor(options) {
+    super()
+    this[FLOWING] = false
+    // whether we're explicitly paused
+    this[PAUSED] = false
+    this[PIPES] = []
+    this[BUFFER] = []
+    this[OBJECTMODE] = (options && options.objectMode) || false
+    if (this[OBJECTMODE]) this[ENCODING] = null
+    else this[ENCODING] = (options && options.encoding) || null
+    if (this[ENCODING] === 'buffer') this[ENCODING] = null
+    this[ASYNC] = (options && !!options.async) || false
+    this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null
+    this[EOF] = false
+    this[EMITTED_END] = false
+    this[EMITTING_END] = false
+    this[CLOSED] = false
+    this[EMITTED_ERROR] = null
+    this.writable = true
+    this.readable = true
+    this[BUFFERLENGTH] = 0
+    this[DESTROYED] = false
+    if (options && options.debugExposeBuffer === true) {
+      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })
+    }
+    if (options && options.debugExposePipes === true) {
+      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })
+    }
+    this[SIGNAL] = options && options.signal
+    this[ABORTED] = false
+    if (this[SIGNAL]) {
+      this[SIGNAL].addEventListener('abort', () => this[ABORT]())
+      if (this[SIGNAL].aborted) {
+        this[ABORT]()
+      }
+    }
+  }
+
+  get bufferLength() {
+    return this[BUFFERLENGTH]
+  }
+
+  get encoding() {
+    return this[ENCODING]
+  }
+  set encoding(enc) {
+    if (this[OBJECTMODE]) throw new Error('cannot set encoding in objectMode')
+
+    if (
+      this[ENCODING] &&
+      enc !== this[ENCODING] &&
+      ((this[DECODER] && this[DECODER].lastNeed) || this[BUFFERLENGTH])
+    )
+      throw new Error('cannot change encoding')
+
+    if (this[ENCODING] !== enc) {
+      this[DECODER] = enc ? new SD(enc) : null
+      if (this[BUFFER].length)
+        this[BUFFER] = this[BUFFER].map(chunk => this[DECODER].write(chunk))
+    }
+
+    this[ENCODING] = enc
+  }
+
+  setEncoding(enc) {
+    this.encoding = enc
+  }
+
+  get objectMode() {
+    return this[OBJECTMODE]
+  }
+  set objectMode(om) {
+    this[OBJECTMODE] = this[OBJECTMODE] || !!om
+  }
+
+  get ['async']() {
+    return this[ASYNC]
+  }
+  set ['async'](a) {
+    this[ASYNC] = this[ASYNC] || !!a
+  }
+
+  // drop everything and get out of the flow completely
+  [ABORT]() {
+    this[ABORTED] = true
+    this.emit('abort', this[SIGNAL].reason)
+    this.destroy(this[SIGNAL].reason)
+  }
+
+  get aborted() {
+    return this[ABORTED]
+  }
+  set aborted(_) {}
+
+  write(chunk, encoding, cb) {
+    if (this[ABORTED]) return false
+    if (this[EOF]) throw new Error('write after end')
+
+    if (this[DESTROYED]) {
+      this.emit(
+        'error',
+        Object.assign(
+          new Error('Cannot call write after a stream was destroyed'),
+          { code: 'ERR_STREAM_DESTROYED' }
+        )
+      )
+      return true
+    }
+
+    if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8')
+
+    if (!encoding) encoding = 'utf8'
+
+    const fn = this[ASYNC] ? defer : f => f()
+
+    // convert array buffers and typed array views into buffers
+    // at some point in the future, we may want to do the opposite!
+    // leave strings and buffers as-is
+    // anything else switches us into object mode
+    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
+      if (isArrayBufferView(chunk))
+        chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
+      else if (isArrayBuffer(chunk)) chunk = Buffer.from(chunk)
+      else if (typeof chunk !== 'string')
+        // use the setter so we throw if we have encoding set
+        this.objectMode = true
+    }
+
+    // handle object mode up front, since it's simpler
+    // this yields better performance, fewer checks later.
+    if (this[OBJECTMODE]) {
+      /* istanbul ignore if - maybe impossible? */
+      if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true)
+
+      if (this.flowing) this.emit('data', chunk)
+      else this[BUFFERPUSH](chunk)
+
+      if (this[BUFFERLENGTH] !== 0) this.emit('readable')
+
+      if (cb) fn(cb)
+
+      return this.flowing
+    }
+
+    // at this point the chunk is a buffer or string
+    // don't buffer it up or send it to the decoder
+    if (!chunk.length) {
+      if (this[BUFFERLENGTH] !== 0) this.emit('readable')
+      if (cb) fn(cb)
+      return this.flowing
+    }
+
+    // fast-path writing strings of same encoding to a stream with
+    // an empty buffer, skipping the buffer/decoder dance
+    if (
+      typeof chunk === 'string' &&
+      // unless it is a string already ready for us to use
+      !(encoding === this[ENCODING] && !this[DECODER].lastNeed)
+    ) {
+      chunk = Buffer.from(chunk, encoding)
+    }
+
+    if (Buffer.isBuffer(chunk) && this[ENCODING])
+      chunk = this[DECODER].write(chunk)
+
+    // Note: flushing CAN potentially switch us into not-flowing mode
+    if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true)
+
+    if (this.flowing) this.emit('data', chunk)
+    else this[BUFFERPUSH](chunk)
+
+    if (this[BUFFERLENGTH] !== 0) this.emit('readable')
+
+    if (cb) fn(cb)
+
+    return this.flowing
+  }
+
+  read(n) {
+    if (this[DESTROYED]) return null
+
+    if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) {
+      this[MAYBE_EMIT_END]()
+      return null
+    }
+
+    if (this[OBJECTMODE]) n = null
+
+    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
+      if (this.encoding) this[BUFFER] = [this[BUFFER].join('')]
+      else this[BUFFER] = [Buffer.concat(this[BUFFER], this[BUFFERLENGTH])]
+    }
+
+    const ret = this[READ](n || null, this[BUFFER][0])
+    this[MAYBE_EMIT_END]()
+    return ret
+  }
+
+  [READ](n, chunk) {
+    if (n === chunk.length || n === null) this[BUFFERSHIFT]()
+    else {
+      this[BUFFER][0] = chunk.slice(n)
+      chunk = chunk.slice(0, n)
+      this[BUFFERLENGTH] -= n
+    }
+
+    this.emit('data', chunk)
+
+    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')
+
+    return chunk
+  }
+
+  end(chunk, encoding, cb) {
+    if (typeof chunk === 'function') (cb = chunk), (chunk = null)
+    if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8')
+    if (chunk) this.write(chunk, encoding)
+    if (cb) this.once('end', cb)
+    this[EOF] = true
+    this.writable = false
+
+    // if we haven't written anything, then go ahead and emit,
+    // even if we're not reading.
+    // we'll re-emit if a new 'end' listener is added anyway.
+    // This makes MP more suitable to write-only use cases.
+    if (this.flowing || !this[PAUSED]) this[MAYBE_EMIT_END]()
+    return this
+  }
+
+  // don't let the internal resume be overwritten
+  [RESUME]() {
+    if (this[DESTROYED]) return
+
+    this[PAUSED] = false
+    this[FLOWING] = true
+    this.emit('resume')
+    if (this[BUFFER].length) this[FLUSH]()
+    else if (this[EOF]) this[MAYBE_EMIT_END]()
+    else this.emit('drain')
+  }
+
+  resume() {
+    return this[RESUME]()
+  }
+
+  pause() {
+    this[FLOWING] = false
+    this[PAUSED] = true
+  }
+
+  get destroyed() {
+    return this[DESTROYED]
+  }
+
+  get flowing() {
+    return this[FLOWING]
+  }
+
+  get paused() {
+    return this[PAUSED]
+  }
+
+  [BUFFERPUSH](chunk) {
+    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1
+    else this[BUFFERLENGTH] += chunk.length
+    this[BUFFER].push(chunk)
+  }
+
+  [BUFFERSHIFT]() {
+    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1
+    else this[BUFFERLENGTH] -= this[BUFFER][0].length
+    return this[BUFFER].shift()
+  }
+
+  [FLUSH](noDrain) {
+    do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && this[BUFFER].length)
+
+    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')
+  }
+
+  [FLUSHCHUNK](chunk) {
+    this.emit('data', chunk)
+    return this.flowing
+  }
+
+  pipe(dest, opts) {
+    if (this[DESTROYED]) return
+
+    const ended = this[EMITTED_END]
+    opts = opts || {}
+    if (dest === proc.stdout || dest === proc.stderr) opts.end = false
+    else opts.end = opts.end !== false
+    opts.proxyErrors = !!opts.proxyErrors
+
+    // piping an ended stream ends immediately
+    if (ended) {
+      if (opts.end) dest.end()
+    } else {
+      this[PIPES].push(
+        !opts.proxyErrors
+          ? new Pipe(this, dest, opts)
+          : new PipeProxyErrors(this, dest, opts)
+      )
+      if (this[ASYNC]) defer(() => this[RESUME]())
+      else this[RESUME]()
+    }
+
+    return dest
+  }
+
+  unpipe(dest) {
+    const p = this[PIPES].find(p => p.dest === dest)
+    if (p) {
+      this[PIPES].splice(this[PIPES].indexOf(p), 1)
+      p.unpipe()
+    }
+  }
+
+  addListener(ev, fn) {
+    return this.on(ev, fn)
+  }
+
+  on(ev, fn) {
+    const ret = super.on(ev, fn)
+    if (ev === 'data' && !this[PIPES].length && !this.flowing) this[RESUME]()
+    else if (ev === 'readable' && this[BUFFERLENGTH] !== 0)
+      super.emit('readable')
+    else if (isEndish(ev) && this[EMITTED_END]) {
+      super.emit(ev)
+      this.removeAllListeners(ev)
+    } else if (ev === 'error' && this[EMITTED_ERROR]) {
+      if (this[ASYNC]) defer(() => fn.call(this, this[EMITTED_ERROR]))
+      else fn.call(this, this[EMITTED_ERROR])
+    }
+    return ret
+  }
+
+  get emittedEnd() {
+    return this[EMITTED_END]
+  }
+
+  [MAYBE_EMIT_END]() {
+    if (
+      !this[EMITTING_END] &&
+      !this[EMITTED_END] &&
+      !this[DESTROYED] &&
+      this[BUFFER].length === 0 &&
+      this[EOF]
+    ) {
+      this[EMITTING_END] = true
+      this.emit('end')
+      this.emit('prefinish')
+      this.emit('finish')
+      if (this[CLOSED]) this.emit('close')
+      this[EMITTING_END] = false
+    }
+  }
+
+  emit(ev, data, ...extra) {
+    // error and close are only events allowed after calling destroy()
+    if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED])
+      return
+    else if (ev === 'data') {
+      return !this[OBJECTMODE] && !data
+        ? false
+        : this[ASYNC]
+        ? defer(() => this[EMITDATA](data))
+        : this[EMITDATA](data)
+    } else if (ev === 'end') {
+      return this[EMITEND]()
+    } else if (ev === 'close') {
+      this[CLOSED] = true
+      // don't emit close before 'end' and 'finish'
+      if (!this[EMITTED_END] && !this[DESTROYED]) return
+      const ret = super.emit('close')
+      this.removeAllListeners('close')
+      return ret
+    } else if (ev === 'error') {
+      this[EMITTED_ERROR] = data
+      super.emit(ERROR, data)
+      const ret =
+        !this[SIGNAL] || this.listeners('error').length
+          ? super.emit('error', data)
+          : false
+      this[MAYBE_EMIT_END]()
+      return ret
+    } else if (ev === 'resume') {
+      const ret = super.emit('resume')
+      this[MAYBE_EMIT_END]()
+      return ret
+    } else if (ev === 'finish' || ev === 'prefinish') {
+      const ret = super.emit(ev)
+      this.removeAllListeners(ev)
+      return ret
+    }
+
+    // Some other unknown event
+    const ret = super.emit(ev, data, ...extra)
+    this[MAYBE_EMIT_END]()
+    return ret
+  }
+
+  [EMITDATA](data) {
+    for (const p of this[PIPES]) {
+      if (p.dest.write(data) === false) this.pause()
+    }
+    const ret = super.emit('data', data)
+    this[MAYBE_EMIT_END]()
+    return ret
+  }
+
+  [EMITEND]() {
+    if (this[EMITTED_END]) return
+
+    this[EMITTED_END] = true
+    this.readable = false
+    if (this[ASYNC]) defer(() => this[EMITEND2]())
+    else this[EMITEND2]()
+  }
+
+  [EMITEND2]() {
+    if (this[DECODER]) {
+      const data = this[DECODER].end()
+      if (data) {
+        for (const p of this[PIPES]) {
+          p.dest.write(data)
+        }
+        super.emit('data', data)
+      }
+    }
+
+    for (const p of this[PIPES]) {
+      p.end()
+    }
+    const ret = super.emit('end')
+    this.removeAllListeners('end')
+    return ret
+  }
+
+  // const all = await stream.collect()
+  collect() {
+    const buf = []
+    if (!this[OBJECTMODE]) buf.dataLength = 0
+    // set the promise first, in case an error is raised
+    // by triggering the flow here.
+    const p = this.promise()
+    this.on('data', c => {
+      buf.push(c)
+      if (!this[OBJECTMODE]) buf.dataLength += c.length
+    })
+    return p.then(() => buf)
+  }
+
+  // const data = await stream.concat()
+  concat() {
+    return this[OBJECTMODE]
+      ? Promise.reject(new Error('cannot concat in objectMode'))
+      : this.collect().then(buf =>
+          this[OBJECTMODE]
+            ? Promise.reject(new Error('cannot concat in objectMode'))
+            : this[ENCODING]
+            ? buf.join('')
+            : Buffer.concat(buf, buf.dataLength)
+        )
+  }
+
+  // stream.promise().then(() => done, er => emitted error)
+  promise() {
+    return new Promise((resolve, reject) => {
+      this.on(DESTROYED, () => reject(new Error('stream destroyed')))
+      this.on('error', er => reject(er))
+      this.on('end', () => resolve())
+    })
+  }
+
+  // for await (let chunk of stream)
+  [ASYNCITERATOR]() {
+    let stopped = false
+    const stop = () => {
+      this.pause()
+      stopped = true
+      return Promise.resolve({ done: true })
+    }
+    const next = () => {
+      if (stopped) return stop()
+      const res = this.read()
+      if (res !== null) return Promise.resolve({ done: false, value: res })
+
+      if (this[EOF]) return stop()
+
+      let resolve = null
+      let reject = null
+      const onerr = er => {
+        this.removeListener('data', ondata)
+        this.removeListener('end', onend)
+        this.removeListener(DESTROYED, ondestroy)
+        stop()
+        reject(er)
+      }
+      const ondata = value => {
+        this.removeListener('error', onerr)
+        this.removeListener('end', onend)
+        this.removeListener(DESTROYED, ondestroy)
+        this.pause()
+        resolve({ value: value, done: !!this[EOF] })
+      }
+      const onend = () => {
+        this.removeListener('error', onerr)
+        this.removeListener('data', ondata)
+        this.removeListener(DESTROYED, ondestroy)
+        stop()
+        resolve({ done: true })
+      }
+      const ondestroy = () => onerr(new Error('stream destroyed'))
+      return new Promise((res, rej) => {
+        reject = rej
+        resolve = res
+        this.once(DESTROYED, ondestroy)
+        this.once('error', onerr)
+        this.once('end', onend)
+        this.once('data', ondata)
+      })
+    }
+
+    return {
+      next,
+      throw: stop,
+      return: stop,
+      [ASYNCITERATOR]() {
+        return this
+      },
+    }
+  }
+
+  // for (let chunk of stream)
+  [ITERATOR]() {
+    let stopped = false
+    const stop = () => {
+      this.pause()
+      this.removeListener(ERROR, stop)
+      this.removeListener(DESTROYED, stop)
+      this.removeListener('end', stop)
+      stopped = true
+      return { done: true }
+    }
+
+    const next = () => {
+      if (stopped) return stop()
+      const value = this.read()
+      return value === null ? stop() : { value }
+    }
+    this.once('end', stop)
+    this.once(ERROR, stop)
+    this.once(DESTROYED, stop)
+
+    return {
+      next,
+      throw: stop,
+      return: stop,
+      [ITERATOR]() {
+        return this
+      },
+    }
+  }
+
+  destroy(er) {
+    if (this[DESTROYED]) {
+      if (er) this.emit('error', er)
+      else this.emit(DESTROYED)
+      return this
+    }
+
+    this[DESTROYED] = true
+
+    // throw away all buffered data, it's never coming out
+    this[BUFFER].length = 0
+    this[BUFFERLENGTH] = 0
+
+    if (typeof this.close === 'function' && !this[CLOSED]) this.close()
+
+    if (er) this.emit('error', er)
+    // if no error to emit, still reject pending promises
+    else this.emit(DESTROYED)
+
+    return this
+  }
+
+  static isStream(s) {
+    return (
+      !!s &&
+      (s instanceof Minipass ||
+        s instanceof Stream ||
+        (s instanceof EE &&
+          // readable
+          (typeof s.pipe === 'function' ||
+            // writable
+            (typeof s.write === 'function' && typeof s.end === 'function'))))
+    )
+  }
+}
+
+module.exports = Minipass
diff --git a/@capacitor/assets/node_modules/minipass/index.mjs b/@capacitor/assets/node_modules/minipass/index.mjs
new file mode 100644
index 00000000..d5c58fc9
--- /dev/null
+++ b/@capacitor/assets/node_modules/minipass/index.mjs
@@ -0,0 +1,702 @@
+'use strict'
+const proc =
+  typeof process === 'object' && process
+    ? process
+    : {
+        stdout: null,
+        stderr: null,
+      }
+import EE from 'events'
+import Stream from 'stream'
+import stringdecoder from 'string_decoder'
+const SD = stringdecoder.StringDecoder
+
+const EOF = Symbol('EOF')
+const MAYBE_EMIT_END = Symbol('maybeEmitEnd')
+const EMITTED_END = Symbol('emittedEnd')
+const EMITTING_END = Symbol('emittingEnd')
+const EMITTED_ERROR = Symbol('emittedError')
+const CLOSED = Symbol('closed')
+const READ = Symbol('read')
+const FLUSH = Symbol('flush')
+const FLUSHCHUNK = Symbol('flushChunk')
+const ENCODING = Symbol('encoding')
+const DECODER = Symbol('decoder')
+const FLOWING = Symbol('flowing')
+const PAUSED = Symbol('paused')
+const RESUME = Symbol('resume')
+const BUFFER = Symbol('buffer')
+const PIPES = Symbol('pipes')
+const BUFFERLENGTH = Symbol('bufferLength')
+const BUFFERPUSH = Symbol('bufferPush')
+const BUFFERSHIFT = Symbol('bufferShift')
+const OBJECTMODE = Symbol('objectMode')
+// internal event when stream is destroyed
+const DESTROYED = Symbol('destroyed')
+// internal event when stream has an error
+const ERROR = Symbol('error')
+const EMITDATA = Symbol('emitData')
+const EMITEND = Symbol('emitEnd')
+const EMITEND2 = Symbol('emitEnd2')
+const ASYNC = Symbol('async')
+const ABORT = Symbol('abort')
+const ABORTED = Symbol('aborted')
+const SIGNAL = Symbol('signal')
+
+const defer = fn => Promise.resolve().then(fn)
+
+// TODO remove when Node v8 support drops
+const doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== '1'
+const ASYNCITERATOR =
+  (doIter && Symbol.asyncIterator) || Symbol('asyncIterator not implemented')
+const ITERATOR =
+  (doIter && Symbol.iterator) || Symbol('iterator not implemented')
+
+// events that mean 'the stream is over'
+// these are treated specially, and re-emitted
+// if they are listened for after emitting.
+const isEndish = ev => ev === 'end' || ev === 'finish' || ev === 'prefinish'
+
+const isArrayBuffer = b =>
+  b instanceof ArrayBuffer ||
+  (typeof b === 'object' &&
+    b.constructor &&
+    b.constructor.name === 'ArrayBuffer' &&
+    b.byteLength >= 0)
+
+const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b)
+
+class Pipe {
+  constructor(src, dest, opts) {
+    this.src = src
+    this.dest = dest
+    this.opts = opts
+    this.ondrain = () => src[RESUME]()
+    dest.on('drain', this.ondrain)
+  }
+  unpipe() {
+    this.dest.removeListener('drain', this.ondrain)
+  }
+  // istanbul ignore next - only here for the prototype
+  proxyErrors() {}
+  end() {
+    this.unpipe()
+    if (this.opts.end) this.dest.end()
+  }
+}
+
+class PipeProxyErrors extends Pipe {
+  unpipe() {
+    this.src.removeListener('error', this.proxyErrors)
+    super.unpipe()
+  }
+  constructor(src, dest, opts) {
+    super(src, dest, opts)
+    this.proxyErrors = er => dest.emit('error', er)
+    src.on('error', this.proxyErrors)
+  }
+}
+
+class Minipass extends Stream {
+  constructor(options) {
+    super()
+    this[FLOWING] = false
+    // whether we're explicitly paused
+    this[PAUSED] = false
+    this[PIPES] = []
+    this[BUFFER] = []
+    this[OBJECTMODE] = (options && options.objectMode) || false
+    if (this[OBJECTMODE]) this[ENCODING] = null
+    else this[ENCODING] = (options && options.encoding) || null
+    if (this[ENCODING] === 'buffer') this[ENCODING] = null
+    this[ASYNC] = (options && !!options.async) || false
+    this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null
+    this[EOF] = false
+    this[EMITTED_END] = false
+    this[EMITTING_END] = false
+    this[CLOSED] = false
+    this[EMITTED_ERROR] = null
+    this.writable = true
+    this.readable = true
+    this[BUFFERLENGTH] = 0
+    this[DESTROYED] = false
+    if (options && options.debugExposeBuffer === true) {
+      Object.defineProperty(this, 'buffer', { get: () => this[BUFFER] })
+    }
+    if (options && options.debugExposePipes === true) {
+      Object.defineProperty(this, 'pipes', { get: () => this[PIPES] })
+    }
+    this[SIGNAL] = options && options.signal
+    this[ABORTED] = false
+    if (this[SIGNAL]) {
+      this[SIGNAL].addEventListener('abort', () => this[ABORT]())
+      if (this[SIGNAL].aborted) {
+        this[ABORT]()
+      }
+    }
+  }
+
+  get bufferLength() {
+    return this[BUFFERLENGTH]
+  }
+
+  get encoding() {
+    return this[ENCODING]
+  }
+  set encoding(enc) {
+    if (this[OBJECTMODE]) throw new Error('cannot set encoding in objectMode')
+
+    if (
+      this[ENCODING] &&
+      enc !== this[ENCODING] &&
+      ((this[DECODER] && this[DECODER].lastNeed) || this[BUFFERLENGTH])
+    )
+      throw new Error('cannot change encoding')
+
+    if (this[ENCODING] !== enc) {
+      this[DECODER] = enc ? new SD(enc) : null
+      if (this[BUFFER].length)
+        this[BUFFER] = this[BUFFER].map(chunk => this[DECODER].write(chunk))
+    }
+
+    this[ENCODING] = enc
+  }
+
+  setEncoding(enc) {
+    this.encoding = enc
+  }
+
+  get objectMode() {
+    return this[OBJECTMODE]
+  }
+  set objectMode(om) {
+    this[OBJECTMODE] = this[OBJECTMODE] || !!om
+  }
+
+  get ['async']() {
+    return this[ASYNC]
+  }
+  set ['async'](a) {
+    this[ASYNC] = this[ASYNC] || !!a
+  }
+
+  // drop everything and get out of the flow completely
+  [ABORT]() {
+    this[ABORTED] = true
+    this.emit('abort', this[SIGNAL].reason)
+    this.destroy(this[SIGNAL].reason)
+  }
+
+  get aborted() {
+    return this[ABORTED]
+  }
+  set aborted(_) {}
+
+  write(chunk, encoding, cb) {
+    if (this[ABORTED]) return false
+    if (this[EOF]) throw new Error('write after end')
+
+    if (this[DESTROYED]) {
+      this.emit(
+        'error',
+        Object.assign(
+          new Error('Cannot call write after a stream was destroyed'),
+          { code: 'ERR_STREAM_DESTROYED' }
+        )
+      )
+      return true
+    }
+
+    if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8')
+
+    if (!encoding) encoding = 'utf8'
+
+    const fn = this[ASYNC] ? defer : f => f()
+
+    // convert array buffers and typed array views into buffers
+    // at some point in the future, we may want to do the opposite!
+    // leave strings and buffers as-is
+    // anything else switches us into object mode
+    if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) {
+      if (isArrayBufferView(chunk))
+        chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength)
+      else if (isArrayBuffer(chunk)) chunk = Buffer.from(chunk)
+      else if (typeof chunk !== 'string')
+        // use the setter so we throw if we have encoding set
+        this.objectMode = true
+    }
+
+    // handle object mode up front, since it's simpler
+    // this yields better performance, fewer checks later.
+    if (this[OBJECTMODE]) {
+      /* istanbul ignore if - maybe impossible? */
+      if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true)
+
+      if (this.flowing) this.emit('data', chunk)
+      else this[BUFFERPUSH](chunk)
+
+      if (this[BUFFERLENGTH] !== 0) this.emit('readable')
+
+      if (cb) fn(cb)
+
+      return this.flowing
+    }
+
+    // at this point the chunk is a buffer or string
+    // don't buffer it up or send it to the decoder
+    if (!chunk.length) {
+      if (this[BUFFERLENGTH] !== 0) this.emit('readable')
+      if (cb) fn(cb)
+      return this.flowing
+    }
+
+    // fast-path writing strings of same encoding to a stream with
+    // an empty buffer, skipping the buffer/decoder dance
+    if (
+      typeof chunk === 'string' &&
+      // unless it is a string already ready for us to use
+      !(encoding === this[ENCODING] && !this[DECODER].lastNeed)
+    ) {
+      chunk = Buffer.from(chunk, encoding)
+    }
+
+    if (Buffer.isBuffer(chunk) && this[ENCODING])
+      chunk = this[DECODER].write(chunk)
+
+    // Note: flushing CAN potentially switch us into not-flowing mode
+    if (this.flowing && this[BUFFERLENGTH] !== 0) this[FLUSH](true)
+
+    if (this.flowing) this.emit('data', chunk)
+    else this[BUFFERPUSH](chunk)
+
+    if (this[BUFFERLENGTH] !== 0) this.emit('readable')
+
+    if (cb) fn(cb)
+
+    return this.flowing
+  }
+
+  read(n) {
+    if (this[DESTROYED]) return null
+
+    if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) {
+      this[MAYBE_EMIT_END]()
+      return null
+    }
+
+    if (this[OBJECTMODE]) n = null
+
+    if (this[BUFFER].length > 1 && !this[OBJECTMODE]) {
+      if (this.encoding) this[BUFFER] = [this[BUFFER].join('')]
+      else this[BUFFER] = [Buffer.concat(this[BUFFER], this[BUFFERLENGTH])]
+    }
+
+    const ret = this[READ](n || null, this[BUFFER][0])
+    this[MAYBE_EMIT_END]()
+    return ret
+  }
+
+  [READ](n, chunk) {
+    if (n === chunk.length || n === null) this[BUFFERSHIFT]()
+    else {
+      this[BUFFER][0] = chunk.slice(n)
+      chunk = chunk.slice(0, n)
+      this[BUFFERLENGTH] -= n
+    }
+
+    this.emit('data', chunk)
+
+    if (!this[BUFFER].length && !this[EOF]) this.emit('drain')
+
+    return chunk
+  }
+
+  end(chunk, encoding, cb) {
+    if (typeof chunk === 'function') (cb = chunk), (chunk = null)
+    if (typeof encoding === 'function') (cb = encoding), (encoding = 'utf8')
+    if (chunk) this.write(chunk, encoding)
+    if (cb) this.once('end', cb)
+    this[EOF] = true
+    this.writable = false
+
+    // if we haven't written anything, then go ahead and emit,
+    // even if we're not reading.
+    // we'll re-emit if a new 'end' listener is added anyway.
+    // This makes MP more suitable to write-only use cases.
+    if (this.flowing || !this[PAUSED]) this[MAYBE_EMIT_END]()
+    return this
+  }
+
+  // don't let the internal resume be overwritten
+  [RESUME]() {
+    if (this[DESTROYED]) return
+
+    this[PAUSED] = false
+    this[FLOWING] = true
+    this.emit('resume')
+    if (this[BUFFER].length) this[FLUSH]()
+    else if (this[EOF]) this[MAYBE_EMIT_END]()
+    else this.emit('drain')
+  }
+
+  resume() {
+    return this[RESUME]()
+  }
+
+  pause() {
+    this[FLOWING] = false
+    this[PAUSED] = true
+  }
+
+  get destroyed() {
+    return this[DESTROYED]
+  }
+
+  get flowing() {
+    return this[FLOWING]
+  }
+
+  get paused() {
+    return this[PAUSED]
+  }
+
+  [BUFFERPUSH](chunk) {
+    if (this[OBJECTMODE]) this[BUFFERLENGTH] += 1
+    else this[BUFFERLENGTH] += chunk.length
+    this[BUFFER].push(chunk)
+  }
+
+  [BUFFERSHIFT]() {
+    if (this[OBJECTMODE]) this[BUFFERLENGTH] -= 1
+    else this[BUFFERLENGTH] -= this[BUFFER][0].length
+    return this[BUFFER].shift()
+  }
+
+  [FLUSH](noDrain) {
+    do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]()) && this[BUFFER].length)
+
+    if (!noDrain && !this[BUFFER].length && !this[EOF]) this.emit('drain')
+  }
+
+  [FLUSHCHUNK](chunk) {
+    this.emit('data', chunk)
+    return this.flowing
+  }
+
+  pipe(dest, opts) {
+    if (this[DESTROYED]) return
+
+    const ended = this[EMITTED_END]
+    opts = opts || {}
+    if (dest === proc.stdout || dest === proc.stderr) opts.end = false
+    else opts.end = opts.end !== false
+    opts.proxyErrors = !!opts.proxyErrors
+
+    // piping an ended stream ends immediately
+    if (ended) {
+      if (opts.end) dest.end()
+    } else {
+      this[PIPES].push(
+        !opts.proxyErrors
+          ? new Pipe(this, dest, opts)
+          : new PipeProxyErrors(this, dest, opts)
+      )
+      if (this[ASYNC]) defer(() => this[RESUME]())
+      else this[RESUME]()
+    }
+
+    return dest
+  }
+
+  unpipe(dest) {
+    const p = this[PIPES].find(p => p.dest === dest)
+    if (p) {
+      this[PIPES].splice(this[PIPES].indexOf(p), 1)
+      p.unpipe()
+    }
+  }
+
+  addListener(ev, fn) {
+    return this.on(ev, fn)
+  }
+
+  on(ev, fn) {
+    const ret = super.on(ev, fn)
+    if (ev === 'data' && !this[PIPES].length && !this.flowing) this[RESUME]()
+    else if (ev === 'readable' && this[BUFFERLENGTH] !== 0)
+      super.emit('readable')
+    else if (isEndish(ev) && this[EMITTED_END]) {
+      super.emit(ev)
+      this.removeAllListeners(ev)
+    } else if (ev === 'error' && this[EMITTED_ERROR]) {
+      if (this[ASYNC]) defer(() => fn.call(this, this[EMITTED_ERROR]))
+      else fn.call(this, this[EMITTED_ERROR])
+    }
+    return ret
+  }
+
+  get emittedEnd() {
+    return this[EMITTED_END]
+  }
+
+  [MAYBE_EMIT_END]() {
+    if (
+      !this[EMITTING_END] &&
+      !this[EMITTED_END] &&
+      !this[DESTROYED] &&
+      this[BUFFER].length === 0 &&
+      this[EOF]
+    ) {
+      this[EMITTING_END] = true
+      this.emit('end')
+      this.emit('prefinish')
+      this.emit('finish')
+      if (this[CLOSED]) this.emit('close')
+      this[EMITTING_END] = false
+    }
+  }
+
+  emit(ev, data, ...extra) {
+    // error and close are only events allowed after calling destroy()
+    if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED])
+      return
+    else if (ev === 'data') {
+      return !this[OBJECTMODE] && !data
+        ? false
+        : this[ASYNC]
+        ? defer(() => this[EMITDATA](data))
+        : this[EMITDATA](data)
+    } else if (ev === 'end') {
+      return this[EMITEND]()
+    } else if (ev === 'close') {
+      this[CLOSED] = true
+      // don't emit close before 'end' and 'finish'
+      if (!this[EMITTED_END] && !this[DESTROYED]) return
+      const ret = super.emit('close')
+      this.removeAllListeners('close')
+      return ret
+    } else if (ev === 'error') {
+      this[EMITTED_ERROR] = data
+      super.emit(ERROR, data)
+      const ret =
+        !this[SIGNAL] || this.listeners('error').length
+          ? super.emit('error', data)
+          : false
+      this[MAYBE_EMIT_END]()
+      return ret
+    } else if (ev === 'resume') {
+      const ret = super.emit('resume')
+      this[MAYBE_EMIT_END]()
+      return ret
+    } else if (ev === 'finish' || ev === 'prefinish') {
+      const ret = super.emit(ev)
+      this.removeAllListeners(ev)
+      return ret
+    }
+
+    // Some other unknown event
+    const ret = super.emit(ev, data, ...extra)
+    this[MAYBE_EMIT_END]()
+    return ret
+  }
+
+  [EMITDATA](data) {
+    for (const p of this[PIPES]) {
+      if (p.dest.write(data) === false) this.pause()
+    }
+    const ret = super.emit('data', data)
+    this[MAYBE_EMIT_END]()
+    return ret
+  }
+
+  [EMITEND]() {
+    if (this[EMITTED_END]) return
+
+    this[EMITTED_END] = true
+    this.readable = false
+    if (this[ASYNC]) defer(() => this[EMITEND2]())
+    else this[EMITEND2]()
+  }
+
+  [EMITEND2]() {
+    if (this[DECODER]) {
+      const data = this[DECODER].end()
+      if (data) {
+        for (const p of this[PIPES]) {
+          p.dest.write(data)
+        }
+        super.emit('data', data)
+      }
+    }
+
+    for (const p of this[PIPES]) {
+      p.end()
+    }
+    const ret = super.emit('end')
+    this.removeAllListeners('end')
+    return ret
+  }
+
+  // const all = await stream.collect()
+  collect() {
+    const buf = []
+    if (!this[OBJECTMODE]) buf.dataLength = 0
+    // set the promise first, in case an error is raised
+    // by triggering the flow here.
+    const p = this.promise()
+    this.on('data', c => {
+      buf.push(c)
+      if (!this[OBJECTMODE]) buf.dataLength += c.length
+    })
+    return p.then(() => buf)
+  }
+
+  // const data = await stream.concat()
+  concat() {
+    return this[OBJECTMODE]
+      ? Promise.reject(new Error('cannot concat in objectMode'))
+      : this.collect().then(buf =>
+          this[OBJECTMODE]
+            ? Promise.reject(new Error('cannot concat in objectMode'))
+            : this[ENCODING]
+            ? buf.join('')
+            : Buffer.concat(buf, buf.dataLength)
+        )
+  }
+
+  // stream.promise().then(() => done, er => emitted error)
+  promise() {
+    return new Promise((resolve, reject) => {
+      this.on(DESTROYED, () => reject(new Error('stream destroyed')))
+      this.on('error', er => reject(er))
+      this.on('end', () => resolve())
+    })
+  }
+
+  // for await (let chunk of stream)
+  [ASYNCITERATOR]() {
+    let stopped = false
+    const stop = () => {
+      this.pause()
+      stopped = true
+      return Promise.resolve({ done: true })
+    }
+    const next = () => {
+      if (stopped) return stop()
+      const res = this.read()
+      if (res !== null) return Promise.resolve({ done: false, value: res })
+
+      if (this[EOF]) return stop()
+
+      let resolve = null
+      let reject = null
+      const onerr = er => {
+        this.removeListener('data', ondata)
+        this.removeListener('end', onend)
+        this.removeListener(DESTROYED, ondestroy)
+        stop()
+        reject(er)
+      }
+      const ondata = value => {
+        this.removeListener('error', onerr)
+        this.removeListener('end', onend)
+        this.removeListener(DESTROYED, ondestroy)
+        this.pause()
+        resolve({ value: value, done: !!this[EOF] })
+      }
+      const onend = () => {
+        this.removeListener('error', onerr)
+        this.removeListener('data', ondata)
+        this.removeListener(DESTROYED, ondestroy)
+        stop()
+        resolve({ done: true })
+      }
+      const ondestroy = () => onerr(new Error('stream destroyed'))
+      return new Promise((res, rej) => {
+        reject = rej
+        resolve = res
+        this.once(DESTROYED, ondestroy)
+        this.once('error', onerr)
+        this.once('end', onend)
+        this.once('data', ondata)
+      })
+    }
+
+    return {
+      next,
+      throw: stop,
+      return: stop,
+      [ASYNCITERATOR]() {
+        return this
+      },
+    }
+  }
+
+  // for (let chunk of stream)
+  [ITERATOR]() {
+    let stopped = false
+    const stop = () => {
+      this.pause()
+      this.removeListener(ERROR, stop)
+      this.removeListener(DESTROYED, stop)
+      this.removeListener('end', stop)
+      stopped = true
+      return { done: true }
+    }
+
+    const next = () => {
+      if (stopped) return stop()
+      const value = this.read()
+      return value === null ? stop() : { value }
+    }
+    this.once('end', stop)
+    this.once(ERROR, stop)
+    this.once(DESTROYED, stop)
+
+    return {
+      next,
+      throw: stop,
+      return: stop,
+      [ITERATOR]() {
+        return this
+      },
+    }
+  }
+
+  destroy(er) {
+    if (this[DESTROYED]) {
+      if (er) this.emit('error', er)
+      else this.emit(DESTROYED)
+      return this
+    }
+
+    this[DESTROYED] = true
+
+    // throw away all buffered data, it's never coming out
+    this[BUFFER].length = 0
+    this[BUFFERLENGTH] = 0
+
+    if (typeof this.close === 'function' && !this[CLOSED]) this.close()
+
+    if (er) this.emit('error', er)
+    // if no error to emit, still reject pending promises
+    else this.emit(DESTROYED)
+
+    return this
+  }
+
+  static isStream(s) {
+    return (
+      !!s &&
+      (s instanceof Minipass ||
+        s instanceof Stream ||
+        (s instanceof EE &&
+          // readable
+          (typeof s.pipe === 'function' ||
+            // writable
+            (typeof s.write === 'function' && typeof s.end === 'function'))))
+    )
+  }
+}
+
+export default Minipass
diff --git a/@capacitor/assets/node_modules/minipass/package.json b/@capacitor/assets/node_modules/minipass/package.json
new file mode 100644
index 00000000..243c82c8
--- /dev/null
+++ b/@capacitor/assets/node_modules/minipass/package.json
@@ -0,0 +1,79 @@
+{
+  "name": "minipass",
+  "version": "4.2.8",
+  "publishConfig": {
+    "tag": "legacy-v4"
+  },
+  "description": "minimal implementation of a PassThrough stream",
+  "main": "./index.js",
+  "module": "./index.mjs",
+  "types": "./index.d.ts",
+  "exports": {
+    ".": {
+      "import": {
+        "types": "./index.d.ts",
+        "default": "./index.mjs"
+      },
+      "require": {
+        "types": "./index.d.ts",
+        "default": "./index.js"
+      }
+    },
+    "./package.json": "./package.json"
+  },
+  "devDependencies": {
+    "@types/node": "^17.0.41",
+    "end-of-stream": "^1.4.0",
+    "node-abort-controller": "^3.1.1",
+    "prettier": "^2.6.2",
+    "tap": "^16.2.0",
+    "through2": "^2.0.3",
+    "ts-node": "^10.8.1",
+    "typedoc": "^0.23.24",
+    "typescript": "^4.7.3"
+  },
+  "scripts": {
+    "pretest": "npm run prepare",
+    "presnap": "npm run prepare",
+    "prepare": "node ./scripts/transpile-to-esm.js",
+    "snap": "tap",
+    "test": "tap",
+    "preversion": "npm test",
+    "postversion": "npm publish",
+    "postpublish": "git push origin --follow-tags",
+    "typedoc": "typedoc ./index.d.ts",
+    "format": "prettier --write . --loglevel warn"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/isaacs/minipass.git"
+  },
+  "keywords": [
+    "passthrough",
+    "stream"
+  ],
+  "author": "Isaac Z. Schlueter  (http://blog.izs.me/)",
+  "license": "ISC",
+  "files": [
+    "index.d.ts",
+    "index.js",
+    "index.mjs"
+  ],
+  "tap": {
+    "check-coverage": true
+  },
+  "engines": {
+    "node": ">=8"
+  },
+  "prettier": {
+    "semi": false,
+    "printWidth": 80,
+    "tabWidth": 2,
+    "useTabs": false,
+    "singleQuote": true,
+    "jsxSingleQuote": false,
+    "bracketSameLine": true,
+    "arrowParens": "avoid",
+    "endOfLine": "lf"
+  }
+}
diff --git a/@capacitor/assets/node_modules/node-fetch/LICENSE.md b/@capacitor/assets/node_modules/node-fetch/LICENSE.md
new file mode 100644
index 00000000..660ffecb
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-fetch/LICENSE.md
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 David Frank
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/@capacitor/assets/node_modules/node-fetch/README.md b/@capacitor/assets/node_modules/node-fetch/README.md
new file mode 100644
index 00000000..55f09b7f
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-fetch/README.md
@@ -0,0 +1,634 @@
+node-fetch
+==========
+
+[![npm version][npm-image]][npm-url]
+[![build status][travis-image]][travis-url]
+[![coverage status][codecov-image]][codecov-url]
+[![install size][install-size-image]][install-size-url]
+[![Discord][discord-image]][discord-url]
+
+A light-weight module that brings `window.fetch` to Node.js
+
+(We are looking for [v2 maintainers and collaborators](https://github.com/bitinn/node-fetch/issues/567))
+
+[![Backers][opencollective-image]][opencollective-url]
+
+
+
+- [Motivation](#motivation)
+- [Features](#features)
+- [Difference from client-side fetch](#difference-from-client-side-fetch)
+- [Installation](#installation)
+- [Loading and configuring the module](#loading-and-configuring-the-module)
+- [Common Usage](#common-usage)
+    - [Plain text or HTML](#plain-text-or-html)
+    - [JSON](#json)
+    - [Simple Post](#simple-post)
+    - [Post with JSON](#post-with-json)
+    - [Post with form parameters](#post-with-form-parameters)
+    - [Handling exceptions](#handling-exceptions)
+    - [Handling client and server errors](#handling-client-and-server-errors)
+- [Advanced Usage](#advanced-usage)
+    - [Streams](#streams)
+    - [Buffer](#buffer)
+    - [Accessing Headers and other Meta data](#accessing-headers-and-other-meta-data)
+    - [Extract Set-Cookie Header](#extract-set-cookie-header)
+    - [Post data using a file stream](#post-data-using-a-file-stream)
+    - [Post with form-data (detect multipart)](#post-with-form-data-detect-multipart)
+    - [Request cancellation with AbortSignal](#request-cancellation-with-abortsignal)
+- [API](#api)
+    - [fetch(url[, options])](#fetchurl-options)
+    - [Options](#options)
+    - [Class: Request](#class-request)
+    - [Class: Response](#class-response)
+    - [Class: Headers](#class-headers)
+    - [Interface: Body](#interface-body)
+    - [Class: FetchError](#class-fetcherror)
+- [License](#license)
+- [Acknowledgement](#acknowledgement)
+
+
+
+## Motivation
+
+Instead of implementing `XMLHttpRequest` in Node.js to run browser-specific [Fetch polyfill](https://github.com/github/fetch), why not go from native `http` to `fetch` API directly? Hence, `node-fetch`, minimal code for a `window.fetch` compatible API on Node.js runtime.
+
+See Matt Andrews' [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch) or Leonardo Quixada's [cross-fetch](https://github.com/lquixada/cross-fetch) for isomorphic usage (exports `node-fetch` for server-side, `whatwg-fetch` for client-side).
+
+## Features
+
+- Stay consistent with `window.fetch` API.
+- Make conscious trade-off when following [WHATWG fetch spec][whatwg-fetch] and [stream spec](https://streams.spec.whatwg.org/) implementation details, document known differences.
+- Use native promise but allow substituting it with [insert your favorite promise library].
+- Use native Node streams for body on both request and response.
+- Decode content encoding (gzip/deflate) properly and convert string output (such as `res.text()` and `res.json()`) to UTF-8 automatically.
+- Useful extensions such as timeout, redirect limit, response size limit, [explicit errors](ERROR-HANDLING.md) for troubleshooting.
+
+## Difference from client-side fetch
+
+- See [Known Differences](LIMITS.md) for details.
+- If you happen to use a missing feature that `window.fetch` offers, feel free to open an issue.
+- Pull requests are welcomed too!
+
+## Installation
+
+Current stable release (`2.x`)
+
+```sh
+$ npm install node-fetch
+```
+
+## Loading and configuring the module
+We suggest you load the module via `require` until the stabilization of ES modules in node:
+```js
+const fetch = require('node-fetch');
+```
+
+If you are using a Promise library other than native, set it through `fetch.Promise`:
+```js
+const Bluebird = require('bluebird');
+
+fetch.Promise = Bluebird;
+```
+
+## Common Usage
+
+NOTE: The documentation below is up-to-date with `2.x` releases; see the [`1.x` readme](https://github.com/bitinn/node-fetch/blob/1.x/README.md), [changelog](https://github.com/bitinn/node-fetch/blob/1.x/CHANGELOG.md) and [2.x upgrade guide](UPGRADE-GUIDE.md) for the differences.
+
+#### Plain text or HTML
+```js
+fetch('https://github.com/')
+    .then(res => res.text())
+    .then(body => console.log(body));
+```
+
+#### JSON
+
+```js
+
+fetch('https://api.github.com/users/github')
+    .then(res => res.json())
+    .then(json => console.log(json));
+```
+
+#### Simple Post
+```js
+fetch('https://httpbin.org/post', { method: 'POST', body: 'a=1' })
+    .then(res => res.json()) // expecting a json response
+    .then(json => console.log(json));
+```
+
+#### Post with JSON
+
+```js
+const body = { a: 1 };
+
+fetch('https://httpbin.org/post', {
+        method: 'post',
+        body:    JSON.stringify(body),
+        headers: { 'Content-Type': 'application/json' },
+    })
+    .then(res => res.json())
+    .then(json => console.log(json));
+```
+
+#### Post with form parameters
+`URLSearchParams` is available in Node.js as of v7.5.0. See [official documentation](https://nodejs.org/api/url.html#url_class_urlsearchparams) for more usage methods.
+
+NOTE: The `Content-Type` header is only set automatically to `x-www-form-urlencoded` when an instance of `URLSearchParams` is given as such:
+
+```js
+const { URLSearchParams } = require('url');
+
+const params = new URLSearchParams();
+params.append('a', 1);
+
+fetch('https://httpbin.org/post', { method: 'POST', body: params })
+    .then(res => res.json())
+    .then(json => console.log(json));
+```
+
+#### Handling exceptions
+NOTE: 3xx-5xx responses are *NOT* exceptions and should be handled in `then()`; see the next section for more information.
+
+Adding a catch to the fetch promise chain will catch *all* exceptions, such as errors originating from node core libraries, network errors and operational errors, which are instances of FetchError. See the [error handling document](ERROR-HANDLING.md)  for more details.
+
+```js
+fetch('https://domain.invalid/')
+    .catch(err => console.error(err));
+```
+
+#### Handling client and server errors
+It is common to create a helper function to check that the response contains no client (4xx) or server (5xx) error responses:
+
+```js
+function checkStatus(res) {
+    if (res.ok) { // res.status >= 200 && res.status < 300
+        return res;
+    } else {
+        throw MyCustomError(res.statusText);
+    }
+}
+
+fetch('https://httpbin.org/status/400')
+    .then(checkStatus)
+    .then(res => console.log('will not get here...'))
+```
+
+## Advanced Usage
+
+#### Streams
+The "Node.js way" is to use streams when possible:
+
+```js
+fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png')
+    .then(res => {
+        const dest = fs.createWriteStream('./octocat.png');
+        res.body.pipe(dest);
+    });
+```
+
+In Node.js 14 you can also use async iterators to read `body`; however, be careful to catch
+errors -- the longer a response runs, the more likely it is to encounter an error.
+
+```js
+const fetch = require('node-fetch');
+const response = await fetch('https://httpbin.org/stream/3');
+try {
+	for await (const chunk of response.body) {
+		console.dir(JSON.parse(chunk.toString()));
+	}
+} catch (err) {
+	console.error(err.stack);
+}
+```
+
+In Node.js 12 you can also use async iterators to read `body`; however, async iterators with streams
+did not mature until Node.js 14, so you need to do some extra work to ensure you handle errors
+directly from the stream and wait on it response to fully close.
+
+```js
+const fetch = require('node-fetch');
+const read = async body => {
+    let error;
+    body.on('error', err => {
+        error = err;
+    });
+    for await (const chunk of body) {
+        console.dir(JSON.parse(chunk.toString()));
+    }
+    return new Promise((resolve, reject) => {
+        body.on('close', () => {
+            error ? reject(error) : resolve();
+        });
+    });
+};
+try {
+    const response = await fetch('https://httpbin.org/stream/3');
+    await read(response.body);
+} catch (err) {
+    console.error(err.stack);
+}
+```
+
+#### Buffer
+If you prefer to cache binary data in full, use buffer(). (NOTE: `buffer()` is a `node-fetch`-only API)
+
+```js
+const fileType = require('file-type');
+
+fetch('https://assets-cdn.github.com/images/modules/logos_page/Octocat.png')
+    .then(res => res.buffer())
+    .then(buffer => fileType(buffer))
+    .then(type => { /* ... */ });
+```
+
+#### Accessing Headers and other Meta data
+```js
+fetch('https://github.com/')
+    .then(res => {
+        console.log(res.ok);
+        console.log(res.status);
+        console.log(res.statusText);
+        console.log(res.headers.raw());
+        console.log(res.headers.get('content-type'));
+    });
+```
+
+#### Extract Set-Cookie Header
+
+Unlike browsers, you can access raw `Set-Cookie` headers manually using `Headers.raw()`. This is a `node-fetch` only API.
+
+```js
+fetch(url).then(res => {
+    // returns an array of values, instead of a string of comma-separated values
+    console.log(res.headers.raw()['set-cookie']);
+});
+```
+
+#### Post data using a file stream
+
+```js
+const { createReadStream } = require('fs');
+
+const stream = createReadStream('input.txt');
+
+fetch('https://httpbin.org/post', { method: 'POST', body: stream })
+    .then(res => res.json())
+    .then(json => console.log(json));
+```
+
+#### Post with form-data (detect multipart)
+
+```js
+const FormData = require('form-data');
+
+const form = new FormData();
+form.append('a', 1);
+
+fetch('https://httpbin.org/post', { method: 'POST', body: form })
+    .then(res => res.json())
+    .then(json => console.log(json));
+
+// OR, using custom headers
+// NOTE: getHeaders() is non-standard API
+
+const form = new FormData();
+form.append('a', 1);
+
+const options = {
+    method: 'POST',
+    body: form,
+    headers: form.getHeaders()
+}
+
+fetch('https://httpbin.org/post', options)
+    .then(res => res.json())
+    .then(json => console.log(json));
+```
+
+#### Request cancellation with AbortSignal
+
+> NOTE: You may cancel streamed requests only on Node >= v8.0.0
+
+You may cancel requests with `AbortController`. A suggested implementation is [`abort-controller`](https://www.npmjs.com/package/abort-controller).
+
+An example of timing out a request after 150ms could be achieved as the following:
+
+```js
+import AbortController from 'abort-controller';
+
+const controller = new AbortController();
+const timeout = setTimeout(
+  () => { controller.abort(); },
+  150,
+);
+
+fetch(url, { signal: controller.signal })
+  .then(res => res.json())
+  .then(
+    data => {
+      useData(data)
+    },
+    err => {
+      if (err.name === 'AbortError') {
+        // request was aborted
+      }
+    },
+  )
+  .finally(() => {
+    clearTimeout(timeout);
+  });
+```
+
+See [test cases](https://github.com/bitinn/node-fetch/blob/master/test/test.js) for more examples.
+
+
+## API
+
+### fetch(url[, options])
+
+- `url` A string representing the URL for fetching
+- `options` [Options](#fetch-options) for the HTTP(S) request
+- Returns: Promise<[Response](#class-response)>
+
+Perform an HTTP(S) fetch.
+
+`url` should be an absolute url, such as `https://example.com/`. A path-relative URL (`/file/under/root`) or protocol-relative URL (`//can-be-http-or-https.com/`) will result in a rejected `Promise`.
+
+
+### Options
+
+The default values are shown after each option key.
+
+```js
+{
+    // These properties are part of the Fetch Standard
+    method: 'GET',
+    headers: {},        // request headers. format is the identical to that accepted by the Headers constructor (see below)
+    body: null,         // request body. can be null, a string, a Buffer, a Blob, or a Node.js Readable stream
+    redirect: 'follow', // set to `manual` to extract redirect headers, `error` to reject redirect
+    signal: null,       // pass an instance of AbortSignal to optionally abort requests
+
+    // The following properties are node-fetch extensions
+    follow: 20,         // maximum redirect count. 0 to not follow redirect
+    timeout: 0,         // req/res timeout in ms, it resets on redirect. 0 to disable (OS limit applies). Signal is recommended instead.
+    compress: true,     // support gzip/deflate content encoding. false to disable
+    size: 0,            // maximum response body size in bytes. 0 to disable
+    agent: null         // http(s).Agent instance or function that returns an instance (see below)
+}
+```
+
+##### Default Headers
+
+If no values are set, the following request headers will be sent automatically:
+
+Header              | Value
+------------------- | --------------------------------------------------------
+`Accept-Encoding`   | `gzip,deflate` _(when `options.compress === true`)_
+`Accept`            | `*/*`
+`Content-Length`    | _(automatically calculated, if possible)_
+`Transfer-Encoding` | `chunked` _(when `req.body` is a stream)_
+`User-Agent`        | `node-fetch/1.0 (+https://github.com/bitinn/node-fetch)`
+
+Note: when `body` is a `Stream`, `Content-Length` is not set automatically.
+
+##### Custom Agent
+
+The `agent` option allows you to specify networking related options which are out of the scope of Fetch, including and not limited to the following:
+
+- Support self-signed certificate
+- Use only IPv4 or IPv6
+- Custom DNS Lookup
+
+See [`http.Agent`](https://nodejs.org/api/http.html#http_new_agent_options) for more information.
+
+If no agent is specified, the default agent provided by Node.js is used. Note that [this changed in Node.js 19](https://github.com/nodejs/node/blob/4267b92604ad78584244488e7f7508a690cb80d0/lib/_http_agent.js#L564) to have `keepalive` true by default. If you wish to enable `keepalive` in an earlier version of Node.js, you can override the agent as per the following code sample. 
+
+In addition, the `agent` option accepts a function that returns `http`(s)`.Agent` instance given current [URL](https://nodejs.org/api/url.html), this is useful during a redirection chain across HTTP and HTTPS protocol.
+
+```js
+const httpAgent = new http.Agent({
+    keepAlive: true
+});
+const httpsAgent = new https.Agent({
+    keepAlive: true
+});
+
+const options = {
+    agent: function (_parsedURL) {
+        if (_parsedURL.protocol == 'http:') {
+            return httpAgent;
+        } else {
+            return httpsAgent;
+        }
+    }
+}
+```
+
+
+### Class: Request
+
+An HTTP(S) request containing information about URL, method, headers, and the body. This class implements the [Body](#iface-body) interface.
+
+Due to the nature of Node.js, the following properties are not implemented at this moment:
+
+- `type`
+- `destination`
+- `referrer`
+- `referrerPolicy`
+- `mode`
+- `credentials`
+- `cache`
+- `integrity`
+- `keepalive`
+
+The following node-fetch extension properties are provided:
+
+- `follow`
+- `compress`
+- `counter`
+- `agent`
+
+See [options](#fetch-options) for exact meaning of these extensions.
+
+#### new Request(input[, options])
+
+*(spec-compliant)*
+
+- `input` A string representing a URL, or another `Request` (which will be cloned)
+- `options` [Options][#fetch-options] for the HTTP(S) request
+
+Constructs a new `Request` object. The constructor is identical to that in the [browser](https://developer.mozilla.org/en-US/docs/Web/API/Request/Request).
+
+In most cases, directly `fetch(url, options)` is simpler than creating a `Request` object.
+
+
+### Class: Response
+
+An HTTP(S) response. This class implements the [Body](#iface-body) interface.
+
+The following properties are not implemented in node-fetch at this moment:
+
+- `Response.error()`
+- `Response.redirect()`
+- `type`
+- `trailer`
+
+#### new Response([body[, options]])
+
+*(spec-compliant)*
+
+- `body` A `String` or [`Readable` stream][node-readable]
+- `options` A [`ResponseInit`][response-init] options dictionary
+
+Constructs a new `Response` object. The constructor is identical to that in the [browser](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response).
+
+Because Node.js does not implement service workers (for which this class was designed), one rarely has to construct a `Response` directly.
+
+#### response.ok
+
+*(spec-compliant)*
+
+Convenience property representing if the request ended normally. Will evaluate to true if the response status was greater than or equal to 200 but smaller than 300.
+
+#### response.redirected
+
+*(spec-compliant)*
+
+Convenience property representing if the request has been redirected at least once. Will evaluate to true if the internal redirect counter is greater than 0.
+
+
+### Class: Headers
+
+This class allows manipulating and iterating over a set of HTTP headers. All methods specified in the [Fetch Standard][whatwg-fetch] are implemented.
+
+#### new Headers([init])
+
+*(spec-compliant)*
+
+- `init` Optional argument to pre-fill the `Headers` object
+
+Construct a new `Headers` object. `init` can be either `null`, a `Headers` object, an key-value map object or any iterable object.
+
+```js
+// Example adapted from https://fetch.spec.whatwg.org/#example-headers-class
+
+const meta = {
+  'Content-Type': 'text/xml',
+  'Breaking-Bad': '<3'
+};
+const headers = new Headers(meta);
+
+// The above is equivalent to
+const meta = [
+  [ 'Content-Type', 'text/xml' ],
+  [ 'Breaking-Bad', '<3' ]
+];
+const headers = new Headers(meta);
+
+// You can in fact use any iterable objects, like a Map or even another Headers
+const meta = new Map();
+meta.set('Content-Type', 'text/xml');
+meta.set('Breaking-Bad', '<3');
+const headers = new Headers(meta);
+const copyOfHeaders = new Headers(headers);
+```
+
+
+### Interface: Body
+
+`Body` is an abstract interface with methods that are applicable to both `Request` and `Response` classes.
+
+The following methods are not yet implemented in node-fetch at this moment:
+
+- `formData()`
+
+#### body.body
+
+*(deviation from spec)*
+
+* Node.js [`Readable` stream][node-readable]
+
+Data are encapsulated in the `Body` object. Note that while the [Fetch Standard][whatwg-fetch] requires the property to always be a WHATWG `ReadableStream`, in node-fetch it is a Node.js [`Readable` stream][node-readable].
+
+#### body.bodyUsed
+
+*(spec-compliant)*
+
+* `Boolean`
+
+A boolean property for if this body has been consumed. Per the specs, a consumed body cannot be used again.
+
+#### body.arrayBuffer()
+#### body.blob()
+#### body.json()
+#### body.text()
+
+*(spec-compliant)*
+
+* Returns: Promise
+
+Consume the body and return a promise that will resolve to one of these formats.
+
+#### body.buffer()
+
+*(node-fetch extension)*
+
+* Returns: Promise<Buffer>
+
+Consume the body and return a promise that will resolve to a Buffer.
+
+#### body.textConverted()
+
+*(node-fetch extension)*
+
+* Returns: Promise<String>
+
+Identical to `body.text()`, except instead of always converting to UTF-8, encoding sniffing will be performed and text converted to UTF-8 if possible.
+
+(This API requires an optional dependency of the npm package [encoding](https://www.npmjs.com/package/encoding), which you need to install manually. `webpack` users may see [a warning message](https://github.com/bitinn/node-fetch/issues/412#issuecomment-379007792) due to this optional dependency.)
+
+
+### Class: FetchError
+
+*(node-fetch extension)*
+
+An operational error in the fetching process. See [ERROR-HANDLING.md][] for more info.
+
+
+### Class: AbortError
+
+*(node-fetch extension)*
+
+An Error thrown when the request is aborted in response to an `AbortSignal`'s `abort` event. It has a `name` property of `AbortError`. See [ERROR-HANDLING.MD][] for more info.
+
+## Acknowledgement
+
+Thanks to [github/fetch](https://github.com/github/fetch) for providing a solid implementation reference.
+
+`node-fetch` v1 was maintained by [@bitinn](https://github.com/bitinn); v2 was maintained by [@TimothyGu](https://github.com/timothygu), [@bitinn](https://github.com/bitinn) and [@jimmywarting](https://github.com/jimmywarting); v2 readme is written by [@jkantr](https://github.com/jkantr).
+
+## License
+
+MIT
+
+[npm-image]: https://flat.badgen.net/npm/v/node-fetch
+[npm-url]: https://www.npmjs.com/package/node-fetch
+[travis-image]: https://flat.badgen.net/travis/bitinn/node-fetch
+[travis-url]: https://travis-ci.org/bitinn/node-fetch
+[codecov-image]: https://flat.badgen.net/codecov/c/github/bitinn/node-fetch/master
+[codecov-url]: https://codecov.io/gh/bitinn/node-fetch
+[install-size-image]: https://flat.badgen.net/packagephobia/install/node-fetch
+[install-size-url]: https://packagephobia.now.sh/result?p=node-fetch
+[discord-image]: https://img.shields.io/discord/619915844268326952?color=%237289DA&label=Discord&style=flat-square
+[discord-url]: https://discord.gg/Zxbndcm
+[opencollective-image]: https://opencollective.com/node-fetch/backers.svg
+[opencollective-url]: https://opencollective.com/node-fetch
+[whatwg-fetch]: https://fetch.spec.whatwg.org/
+[response-init]: https://fetch.spec.whatwg.org/#responseinit
+[node-readable]: https://nodejs.org/api/stream.html#stream_readable_streams
+[mdn-headers]: https://developer.mozilla.org/en-US/docs/Web/API/Headers
+[LIMITS.md]: https://github.com/bitinn/node-fetch/blob/master/LIMITS.md
+[ERROR-HANDLING.md]: https://github.com/bitinn/node-fetch/blob/master/ERROR-HANDLING.md
+[UPGRADE-GUIDE.md]: https://github.com/bitinn/node-fetch/blob/master/UPGRADE-GUIDE.md
diff --git a/@capacitor/assets/node_modules/node-fetch/browser.js b/@capacitor/assets/node_modules/node-fetch/browser.js
new file mode 100644
index 00000000..ee86265a
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-fetch/browser.js
@@ -0,0 +1,25 @@
+"use strict";
+
+// ref: https://github.com/tc39/proposal-global
+var getGlobal = function () {
+	// the only reliable means to get the global object is
+	// `Function('return this')()`
+	// However, this causes CSP violations in Chrome apps.
+	if (typeof self !== 'undefined') { return self; }
+	if (typeof window !== 'undefined') { return window; }
+	if (typeof global !== 'undefined') { return global; }
+	throw new Error('unable to locate global object');
+}
+
+var globalObject = getGlobal();
+
+module.exports = exports = globalObject.fetch;
+
+// Needed for TypeScript and Webpack.
+if (globalObject.fetch) {
+	exports.default = globalObject.fetch.bind(globalObject);
+}
+
+exports.Headers = globalObject.Headers;
+exports.Request = globalObject.Request;
+exports.Response = globalObject.Response;
diff --git a/@capacitor/assets/node_modules/node-fetch/lib/index.es.js b/@capacitor/assets/node_modules/node-fetch/lib/index.es.js
new file mode 100644
index 00000000..aae9799c
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-fetch/lib/index.es.js
@@ -0,0 +1,1777 @@
+process.emitWarning("The .es.js file is deprecated. Use .mjs instead.");
+
+import Stream from 'stream';
+import http from 'http';
+import Url from 'url';
+import whatwgUrl from 'whatwg-url';
+import https from 'https';
+import zlib from 'zlib';
+
+// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
+
+// fix for "Readable" isn't a named export issue
+const Readable = Stream.Readable;
+
+const BUFFER = Symbol('buffer');
+const TYPE = Symbol('type');
+
+class Blob {
+	constructor() {
+		this[TYPE] = '';
+
+		const blobParts = arguments[0];
+		const options = arguments[1];
+
+		const buffers = [];
+		let size = 0;
+
+		if (blobParts) {
+			const a = blobParts;
+			const length = Number(a.length);
+			for (let i = 0; i < length; i++) {
+				const element = a[i];
+				let buffer;
+				if (element instanceof Buffer) {
+					buffer = element;
+				} else if (ArrayBuffer.isView(element)) {
+					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
+				} else if (element instanceof ArrayBuffer) {
+					buffer = Buffer.from(element);
+				} else if (element instanceof Blob) {
+					buffer = element[BUFFER];
+				} else {
+					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
+				}
+				size += buffer.length;
+				buffers.push(buffer);
+			}
+		}
+
+		this[BUFFER] = Buffer.concat(buffers);
+
+		let type = options && options.type !== undefined && String(options.type).toLowerCase();
+		if (type && !/[^\u0020-\u007E]/.test(type)) {
+			this[TYPE] = type;
+		}
+	}
+	get size() {
+		return this[BUFFER].length;
+	}
+	get type() {
+		return this[TYPE];
+	}
+	text() {
+		return Promise.resolve(this[BUFFER].toString());
+	}
+	arrayBuffer() {
+		const buf = this[BUFFER];
+		const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+		return Promise.resolve(ab);
+	}
+	stream() {
+		const readable = new Readable();
+		readable._read = function () {};
+		readable.push(this[BUFFER]);
+		readable.push(null);
+		return readable;
+	}
+	toString() {
+		return '[object Blob]';
+	}
+	slice() {
+		const size = this.size;
+
+		const start = arguments[0];
+		const end = arguments[1];
+		let relativeStart, relativeEnd;
+		if (start === undefined) {
+			relativeStart = 0;
+		} else if (start < 0) {
+			relativeStart = Math.max(size + start, 0);
+		} else {
+			relativeStart = Math.min(start, size);
+		}
+		if (end === undefined) {
+			relativeEnd = size;
+		} else if (end < 0) {
+			relativeEnd = Math.max(size + end, 0);
+		} else {
+			relativeEnd = Math.min(end, size);
+		}
+		const span = Math.max(relativeEnd - relativeStart, 0);
+
+		const buffer = this[BUFFER];
+		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
+		const blob = new Blob([], { type: arguments[2] });
+		blob[BUFFER] = slicedBuffer;
+		return blob;
+	}
+}
+
+Object.defineProperties(Blob.prototype, {
+	size: { enumerable: true },
+	type: { enumerable: true },
+	slice: { enumerable: true }
+});
+
+Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
+	value: 'Blob',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+/**
+ * fetch-error.js
+ *
+ * FetchError interface for operational errors
+ */
+
+/**
+ * Create FetchError instance
+ *
+ * @param   String      message      Error message for human
+ * @param   String      type         Error type for machine
+ * @param   String      systemError  For Node.js system error
+ * @return  FetchError
+ */
+function FetchError(message, type, systemError) {
+  Error.call(this, message);
+
+  this.message = message;
+  this.type = type;
+
+  // when err.type is `system`, err.code contains system error code
+  if (systemError) {
+    this.code = this.errno = systemError.code;
+  }
+
+  // hide custom error implementation details from end-users
+  Error.captureStackTrace(this, this.constructor);
+}
+
+FetchError.prototype = Object.create(Error.prototype);
+FetchError.prototype.constructor = FetchError;
+FetchError.prototype.name = 'FetchError';
+
+let convert;
+try {
+	convert = require('encoding').convert;
+} catch (e) {}
+
+const INTERNALS = Symbol('Body internals');
+
+// fix an issue where "PassThrough" isn't a named export for node <10
+const PassThrough = Stream.PassThrough;
+
+/**
+ * Body mixin
+ *
+ * Ref: https://fetch.spec.whatwg.org/#body
+ *
+ * @param   Stream  body  Readable stream
+ * @param   Object  opts  Response options
+ * @return  Void
+ */
+function Body(body) {
+	var _this = this;
+
+	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+	    _ref$size = _ref.size;
+
+	let size = _ref$size === undefined ? 0 : _ref$size;
+	var _ref$timeout = _ref.timeout;
+	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;
+
+	if (body == null) {
+		// body is undefined or null
+		body = null;
+	} else if (isURLSearchParams(body)) {
+		// body is a URLSearchParams
+		body = Buffer.from(body.toString());
+	} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
+		// body is ArrayBuffer
+		body = Buffer.from(body);
+	} else if (ArrayBuffer.isView(body)) {
+		// body is ArrayBufferView
+		body = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
+	} else if (body instanceof Stream) ; else {
+		// none of the above
+		// coerce to string then buffer
+		body = Buffer.from(String(body));
+	}
+	this[INTERNALS] = {
+		body,
+		disturbed: false,
+		error: null
+	};
+	this.size = size;
+	this.timeout = timeout;
+
+	if (body instanceof Stream) {
+		body.on('error', function (err) {
+			const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
+			_this[INTERNALS].error = error;
+		});
+	}
+}
+
+Body.prototype = {
+	get body() {
+		return this[INTERNALS].body;
+	},
+
+	get bodyUsed() {
+		return this[INTERNALS].disturbed;
+	},
+
+	/**
+  * Decode response as ArrayBuffer
+  *
+  * @return  Promise
+  */
+	arrayBuffer() {
+		return consumeBody.call(this).then(function (buf) {
+			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+		});
+	},
+
+	/**
+  * Return raw response as Blob
+  *
+  * @return Promise
+  */
+	blob() {
+		let ct = this.headers && this.headers.get('content-type') || '';
+		return consumeBody.call(this).then(function (buf) {
+			return Object.assign(
+			// Prevent copying
+			new Blob([], {
+				type: ct.toLowerCase()
+			}), {
+				[BUFFER]: buf
+			});
+		});
+	},
+
+	/**
+  * Decode response as json
+  *
+  * @return  Promise
+  */
+	json() {
+		var _this2 = this;
+
+		return consumeBody.call(this).then(function (buffer) {
+			try {
+				return JSON.parse(buffer.toString());
+			} catch (err) {
+				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
+			}
+		});
+	},
+
+	/**
+  * Decode response as text
+  *
+  * @return  Promise
+  */
+	text() {
+		return consumeBody.call(this).then(function (buffer) {
+			return buffer.toString();
+		});
+	},
+
+	/**
+  * Decode response as buffer (non-spec api)
+  *
+  * @return  Promise
+  */
+	buffer() {
+		return consumeBody.call(this);
+	},
+
+	/**
+  * Decode response as text, while automatically detecting the encoding and
+  * trying to decode to UTF-8 (non-spec api)
+  *
+  * @return  Promise
+  */
+	textConverted() {
+		var _this3 = this;
+
+		return consumeBody.call(this).then(function (buffer) {
+			return convertBody(buffer, _this3.headers);
+		});
+	}
+};
+
+// In browsers, all properties are enumerable.
+Object.defineProperties(Body.prototype, {
+	body: { enumerable: true },
+	bodyUsed: { enumerable: true },
+	arrayBuffer: { enumerable: true },
+	blob: { enumerable: true },
+	json: { enumerable: true },
+	text: { enumerable: true }
+});
+
+Body.mixIn = function (proto) {
+	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
+		// istanbul ignore else: future proof
+		if (!(name in proto)) {
+			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
+			Object.defineProperty(proto, name, desc);
+		}
+	}
+};
+
+/**
+ * Consume and convert an entire Body to a Buffer.
+ *
+ * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
+ *
+ * @return  Promise
+ */
+function consumeBody() {
+	var _this4 = this;
+
+	if (this[INTERNALS].disturbed) {
+		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
+	}
+
+	this[INTERNALS].disturbed = true;
+
+	if (this[INTERNALS].error) {
+		return Body.Promise.reject(this[INTERNALS].error);
+	}
+
+	let body = this.body;
+
+	// body is null
+	if (body === null) {
+		return Body.Promise.resolve(Buffer.alloc(0));
+	}
+
+	// body is blob
+	if (isBlob(body)) {
+		body = body.stream();
+	}
+
+	// body is buffer
+	if (Buffer.isBuffer(body)) {
+		return Body.Promise.resolve(body);
+	}
+
+	// istanbul ignore if: should never happen
+	if (!(body instanceof Stream)) {
+		return Body.Promise.resolve(Buffer.alloc(0));
+	}
+
+	// body is stream
+	// get ready to actually consume the body
+	let accum = [];
+	let accumBytes = 0;
+	let abort = false;
+
+	return new Body.Promise(function (resolve, reject) {
+		let resTimeout;
+
+		// allow timeout on slow response body
+		if (_this4.timeout) {
+			resTimeout = setTimeout(function () {
+				abort = true;
+				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
+			}, _this4.timeout);
+		}
+
+		// handle stream errors
+		body.on('error', function (err) {
+			if (err.name === 'AbortError') {
+				// if the request was aborted, reject with this Error
+				abort = true;
+				reject(err);
+			} else {
+				// other errors, such as incorrect content-encoding
+				reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
+			}
+		});
+
+		body.on('data', function (chunk) {
+			if (abort || chunk === null) {
+				return;
+			}
+
+			if (_this4.size && accumBytes + chunk.length > _this4.size) {
+				abort = true;
+				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
+				return;
+			}
+
+			accumBytes += chunk.length;
+			accum.push(chunk);
+		});
+
+		body.on('end', function () {
+			if (abort) {
+				return;
+			}
+
+			clearTimeout(resTimeout);
+
+			try {
+				resolve(Buffer.concat(accum, accumBytes));
+			} catch (err) {
+				// handle streams that have accumulated too much data (issue #414)
+				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
+			}
+		});
+	});
+}
+
+/**
+ * Detect buffer encoding and convert to target encoding
+ * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
+ *
+ * @param   Buffer  buffer    Incoming buffer
+ * @param   String  encoding  Target encoding
+ * @return  String
+ */
+function convertBody(buffer, headers) {
+	if (typeof convert !== 'function') {
+		throw new Error('The package `encoding` must be installed to use the textConverted() function');
+	}
+
+	const ct = headers.get('content-type');
+	let charset = 'utf-8';
+	let res, str;
+
+	// header
+	if (ct) {
+		res = /charset=([^;]*)/i.exec(ct);
+	}
+
+	// no charset in content type, peek at response body for at most 1024 bytes
+	str = buffer.slice(0, 1024).toString();
+
+	// html5
+	if (!res && str) {
+		res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined;
+
+		this[MAP] = Object.create(null);
+
+		if (init instanceof Headers) {
+			const rawHeaders = init.raw();
+			const headerNames = Object.keys(rawHeaders);
+
+			for (const headerName of headerNames) {
+				for (const value of rawHeaders[headerName]) {
+					this.append(headerName, value);
+				}
+			}
+
+			return;
+		}
+
+		// We don't worry about converting prop to ByteString here as append()
+		// will handle it.
+		if (init == null) ; else if (typeof init === 'object') {
+			const method = init[Symbol.iterator];
+			if (method != null) {
+				if (typeof method !== 'function') {
+					throw new TypeError('Header pairs must be iterable');
+				}
+
+				// sequence>
+				// Note: per spec we have to first exhaust the lists then process them
+				const pairs = [];
+				for (const pair of init) {
+					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
+						throw new TypeError('Each header pair must be iterable');
+					}
+					pairs.push(Array.from(pair));
+				}
+
+				for (const pair of pairs) {
+					if (pair.length !== 2) {
+						throw new TypeError('Each header pair must be a name/value tuple');
+					}
+					this.append(pair[0], pair[1]);
+				}
+			} else {
+				// record
+				for (const key of Object.keys(init)) {
+					const value = init[key];
+					this.append(key, value);
+				}
+			}
+		} else {
+			throw new TypeError('Provided initializer must be an object');
+		}
+	}
+
+	/**
+  * Return combined header value given name
+  *
+  * @param   String  name  Header name
+  * @return  Mixed
+  */
+	get(name) {
+		name = `${name}`;
+		validateName(name);
+		const key = find(this[MAP], name);
+		if (key === undefined) {
+			return null;
+		}
+
+		return this[MAP][key].join(', ');
+	}
+
+	/**
+  * Iterate over all headers
+  *
+  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
+  * @param   Boolean   thisArg   `this` context for callback function
+  * @return  Void
+  */
+	forEach(callback) {
+		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
+
+		let pairs = getHeaders(this);
+		let i = 0;
+		while (i < pairs.length) {
+			var _pairs$i = pairs[i];
+			const name = _pairs$i[0],
+			      value = _pairs$i[1];
+
+			callback.call(thisArg, value, name, this);
+			pairs = getHeaders(this);
+			i++;
+		}
+	}
+
+	/**
+  * Overwrite header values given name
+  *
+  * @param   String  name   Header name
+  * @param   String  value  Header value
+  * @return  Void
+  */
+	set(name, value) {
+		name = `${name}`;
+		value = `${value}`;
+		validateName(name);
+		validateValue(value);
+		const key = find(this[MAP], name);
+		this[MAP][key !== undefined ? key : name] = [value];
+	}
+
+	/**
+  * Append a value onto existing header
+  *
+  * @param   String  name   Header name
+  * @param   String  value  Header value
+  * @return  Void
+  */
+	append(name, value) {
+		name = `${name}`;
+		value = `${value}`;
+		validateName(name);
+		validateValue(value);
+		const key = find(this[MAP], name);
+		if (key !== undefined) {
+			this[MAP][key].push(value);
+		} else {
+			this[MAP][name] = [value];
+		}
+	}
+
+	/**
+  * Check for header name existence
+  *
+  * @param   String   name  Header name
+  * @return  Boolean
+  */
+	has(name) {
+		name = `${name}`;
+		validateName(name);
+		return find(this[MAP], name) !== undefined;
+	}
+
+	/**
+  * Delete all header values given name
+  *
+  * @param   String  name  Header name
+  * @return  Void
+  */
+	delete(name) {
+		name = `${name}`;
+		validateName(name);
+		const key = find(this[MAP], name);
+		if (key !== undefined) {
+			delete this[MAP][key];
+		}
+	}
+
+	/**
+  * Return raw headers (non-spec api)
+  *
+  * @return  Object
+  */
+	raw() {
+		return this[MAP];
+	}
+
+	/**
+  * Get an iterator on keys.
+  *
+  * @return  Iterator
+  */
+	keys() {
+		return createHeadersIterator(this, 'key');
+	}
+
+	/**
+  * Get an iterator on values.
+  *
+  * @return  Iterator
+  */
+	values() {
+		return createHeadersIterator(this, 'value');
+	}
+
+	/**
+  * Get an iterator on entries.
+  *
+  * This is the default iterator of the Headers object.
+  *
+  * @return  Iterator
+  */
+	[Symbol.iterator]() {
+		return createHeadersIterator(this, 'key+value');
+	}
+}
+Headers.prototype.entries = Headers.prototype[Symbol.iterator];
+
+Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
+	value: 'Headers',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+Object.defineProperties(Headers.prototype, {
+	get: { enumerable: true },
+	forEach: { enumerable: true },
+	set: { enumerable: true },
+	append: { enumerable: true },
+	has: { enumerable: true },
+	delete: { enumerable: true },
+	keys: { enumerable: true },
+	values: { enumerable: true },
+	entries: { enumerable: true }
+});
+
+function getHeaders(headers) {
+	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';
+
+	const keys = Object.keys(headers[MAP]).sort();
+	return keys.map(kind === 'key' ? function (k) {
+		return k.toLowerCase();
+	} : kind === 'value' ? function (k) {
+		return headers[MAP][k].join(', ');
+	} : function (k) {
+		return [k.toLowerCase(), headers[MAP][k].join(', ')];
+	});
+}
+
+const INTERNAL = Symbol('internal');
+
+function createHeadersIterator(target, kind) {
+	const iterator = Object.create(HeadersIteratorPrototype);
+	iterator[INTERNAL] = {
+		target,
+		kind,
+		index: 0
+	};
+	return iterator;
+}
+
+const HeadersIteratorPrototype = Object.setPrototypeOf({
+	next() {
+		// istanbul ignore if
+		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
+			throw new TypeError('Value of `this` is not a HeadersIterator');
+		}
+
+		var _INTERNAL = this[INTERNAL];
+		const target = _INTERNAL.target,
+		      kind = _INTERNAL.kind,
+		      index = _INTERNAL.index;
+
+		const values = getHeaders(target, kind);
+		const len = values.length;
+		if (index >= len) {
+			return {
+				value: undefined,
+				done: true
+			};
+		}
+
+		this[INTERNAL].index = index + 1;
+
+		return {
+			value: values[index],
+			done: false
+		};
+	}
+}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));
+
+Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
+	value: 'HeadersIterator',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+/**
+ * Export the Headers object in a form that Node.js can consume.
+ *
+ * @param   Headers  headers
+ * @return  Object
+ */
+function exportNodeCompatibleHeaders(headers) {
+	const obj = Object.assign({ __proto__: null }, headers[MAP]);
+
+	// http.request() only supports string as Host header. This hack makes
+	// specifying custom Host header possible.
+	const hostHeaderKey = find(headers[MAP], 'Host');
+	if (hostHeaderKey !== undefined) {
+		obj[hostHeaderKey] = obj[hostHeaderKey][0];
+	}
+
+	return obj;
+}
+
+/**
+ * Create a Headers object from an object of headers, ignoring those that do
+ * not conform to HTTP grammar productions.
+ *
+ * @param   Object  obj  Object of headers
+ * @return  Headers
+ */
+function createHeadersLenient(obj) {
+	const headers = new Headers();
+	for (const name of Object.keys(obj)) {
+		if (invalidTokenRegex.test(name)) {
+			continue;
+		}
+		if (Array.isArray(obj[name])) {
+			for (const val of obj[name]) {
+				if (invalidHeaderCharRegex.test(val)) {
+					continue;
+				}
+				if (headers[MAP][name] === undefined) {
+					headers[MAP][name] = [val];
+				} else {
+					headers[MAP][name].push(val);
+				}
+			}
+		} else if (!invalidHeaderCharRegex.test(obj[name])) {
+			headers[MAP][name] = [obj[name]];
+		}
+	}
+	return headers;
+}
+
+const INTERNALS$1 = Symbol('Response internals');
+
+// fix an issue where "STATUS_CODES" aren't a named export for node <10
+const STATUS_CODES = http.STATUS_CODES;
+
+/**
+ * Response class
+ *
+ * @param   Stream  body  Readable stream
+ * @param   Object  opts  Response options
+ * @return  Void
+ */
+class Response {
+	constructor() {
+		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+		Body.call(this, body, opts);
+
+		const status = opts.status || 200;
+		const headers = new Headers(opts.headers);
+
+		if (body != null && !headers.has('Content-Type')) {
+			const contentType = extractContentType(body);
+			if (contentType) {
+				headers.append('Content-Type', contentType);
+			}
+		}
+
+		this[INTERNALS$1] = {
+			url: opts.url,
+			status,
+			statusText: opts.statusText || STATUS_CODES[status],
+			headers,
+			counter: opts.counter
+		};
+	}
+
+	get url() {
+		return this[INTERNALS$1].url || '';
+	}
+
+	get status() {
+		return this[INTERNALS$1].status;
+	}
+
+	/**
+  * Convenience property representing if the request ended normally
+  */
+	get ok() {
+		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
+	}
+
+	get redirected() {
+		return this[INTERNALS$1].counter > 0;
+	}
+
+	get statusText() {
+		return this[INTERNALS$1].statusText;
+	}
+
+	get headers() {
+		return this[INTERNALS$1].headers;
+	}
+
+	/**
+  * Clone this response
+  *
+  * @return  Response
+  */
+	clone() {
+		return new Response(clone(this), {
+			url: this.url,
+			status: this.status,
+			statusText: this.statusText,
+			headers: this.headers,
+			ok: this.ok,
+			redirected: this.redirected
+		});
+	}
+}
+
+Body.mixIn(Response.prototype);
+
+Object.defineProperties(Response.prototype, {
+	url: { enumerable: true },
+	status: { enumerable: true },
+	ok: { enumerable: true },
+	redirected: { enumerable: true },
+	statusText: { enumerable: true },
+	headers: { enumerable: true },
+	clone: { enumerable: true }
+});
+
+Object.defineProperty(Response.prototype, Symbol.toStringTag, {
+	value: 'Response',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+const INTERNALS$2 = Symbol('Request internals');
+const URL = Url.URL || whatwgUrl.URL;
+
+// fix an issue where "format", "parse" aren't a named export for node <10
+const parse_url = Url.parse;
+const format_url = Url.format;
+
+/**
+ * Wrapper around `new URL` to handle arbitrary URLs
+ *
+ * @param  {string} urlStr
+ * @return {void}
+ */
+function parseURL(urlStr) {
+	/*
+ 	Check whether the URL is absolute or not
+ 		Scheme: https://tools.ietf.org/html/rfc3986#section-3.1
+ 	Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3
+ */
+	if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) {
+		urlStr = new URL(urlStr).toString();
+	}
+
+	// Fallback to old implementation for arbitrary URLs
+	return parse_url(urlStr);
+}
+
+const streamDestructionSupported = 'destroy' in Stream.Readable.prototype;
+
+/**
+ * Check if a value is an instance of Request.
+ *
+ * @param   Mixed   input
+ * @return  Boolean
+ */
+function isRequest(input) {
+	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
+}
+
+function isAbortSignal(signal) {
+	const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
+	return !!(proto && proto.constructor.name === 'AbortSignal');
+}
+
+/**
+ * Request class
+ *
+ * @param   Mixed   input  Url or Request instance
+ * @param   Object  init   Custom options
+ * @return  Void
+ */
+class Request {
+	constructor(input) {
+		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+		let parsedURL;
+
+		// normalize input
+		if (!isRequest(input)) {
+			if (input && input.href) {
+				// in order to support Node.js' Url objects; though WHATWG's URL objects
+				// will fall into this branch also (since their `toString()` will return
+				// `href` property anyway)
+				parsedURL = parseURL(input.href);
+			} else {
+				// coerce input to a string before attempting to parse
+				parsedURL = parseURL(`${input}`);
+			}
+			input = {};
+		} else {
+			parsedURL = parseURL(input.url);
+		}
+
+		let method = init.method || input.method || 'GET';
+		method = method.toUpperCase();
+
+		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
+			throw new TypeError('Request with GET/HEAD method cannot have body');
+		}
+
+		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;
+
+		Body.call(this, inputBody, {
+			timeout: init.timeout || input.timeout || 0,
+			size: init.size || input.size || 0
+		});
+
+		const headers = new Headers(init.headers || input.headers || {});
+
+		if (inputBody != null && !headers.has('Content-Type')) {
+			const contentType = extractContentType(inputBody);
+			if (contentType) {
+				headers.append('Content-Type', contentType);
+			}
+		}
+
+		let signal = isRequest(input) ? input.signal : null;
+		if ('signal' in init) signal = init.signal;
+
+		if (signal != null && !isAbortSignal(signal)) {
+			throw new TypeError('Expected signal to be an instanceof AbortSignal');
+		}
+
+		this[INTERNALS$2] = {
+			method,
+			redirect: init.redirect || input.redirect || 'follow',
+			headers,
+			parsedURL,
+			signal
+		};
+
+		// node-fetch-only options
+		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
+		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
+		this.counter = init.counter || input.counter || 0;
+		this.agent = init.agent || input.agent;
+	}
+
+	get method() {
+		return this[INTERNALS$2].method;
+	}
+
+	get url() {
+		return format_url(this[INTERNALS$2].parsedURL);
+	}
+
+	get headers() {
+		return this[INTERNALS$2].headers;
+	}
+
+	get redirect() {
+		return this[INTERNALS$2].redirect;
+	}
+
+	get signal() {
+		return this[INTERNALS$2].signal;
+	}
+
+	/**
+  * Clone this request
+  *
+  * @return  Request
+  */
+	clone() {
+		return new Request(this);
+	}
+}
+
+Body.mixIn(Request.prototype);
+
+Object.defineProperty(Request.prototype, Symbol.toStringTag, {
+	value: 'Request',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+Object.defineProperties(Request.prototype, {
+	method: { enumerable: true },
+	url: { enumerable: true },
+	headers: { enumerable: true },
+	redirect: { enumerable: true },
+	clone: { enumerable: true },
+	signal: { enumerable: true }
+});
+
+/**
+ * Convert a Request to Node.js http request options.
+ *
+ * @param   Request  A Request instance
+ * @return  Object   The options object to be passed to http.request
+ */
+function getNodeRequestOptions(request) {
+	const parsedURL = request[INTERNALS$2].parsedURL;
+	const headers = new Headers(request[INTERNALS$2].headers);
+
+	// fetch step 1.3
+	if (!headers.has('Accept')) {
+		headers.set('Accept', '*/*');
+	}
+
+	// Basic fetch
+	if (!parsedURL.protocol || !parsedURL.hostname) {
+		throw new TypeError('Only absolute URLs are supported');
+	}
+
+	if (!/^https?:$/.test(parsedURL.protocol)) {
+		throw new TypeError('Only HTTP(S) protocols are supported');
+	}
+
+	if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {
+		throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');
+	}
+
+	// HTTP-network-or-cache fetch steps 2.4-2.7
+	let contentLengthValue = null;
+	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
+		contentLengthValue = '0';
+	}
+	if (request.body != null) {
+		const totalBytes = getTotalBytes(request);
+		if (typeof totalBytes === 'number') {
+			contentLengthValue = String(totalBytes);
+		}
+	}
+	if (contentLengthValue) {
+		headers.set('Content-Length', contentLengthValue);
+	}
+
+	// HTTP-network-or-cache fetch step 2.11
+	if (!headers.has('User-Agent')) {
+		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
+	}
+
+	// HTTP-network-or-cache fetch step 2.15
+	if (request.compress && !headers.has('Accept-Encoding')) {
+		headers.set('Accept-Encoding', 'gzip,deflate');
+	}
+
+	let agent = request.agent;
+	if (typeof agent === 'function') {
+		agent = agent(parsedURL);
+	}
+
+	// HTTP-network fetch step 4.2
+	// chunked encoding is handled by Node.js
+
+	return Object.assign({}, parsedURL, {
+		method: request.method,
+		headers: exportNodeCompatibleHeaders(headers),
+		agent
+	});
+}
+
+/**
+ * abort-error.js
+ *
+ * AbortError interface for cancelled requests
+ */
+
+/**
+ * Create AbortError instance
+ *
+ * @param   String      message      Error message for human
+ * @return  AbortError
+ */
+function AbortError(message) {
+  Error.call(this, message);
+
+  this.type = 'aborted';
+  this.message = message;
+
+  // hide custom error implementation details from end-users
+  Error.captureStackTrace(this, this.constructor);
+}
+
+AbortError.prototype = Object.create(Error.prototype);
+AbortError.prototype.constructor = AbortError;
+AbortError.prototype.name = 'AbortError';
+
+const URL$1 = Url.URL || whatwgUrl.URL;
+
+// fix an issue where "PassThrough", "resolve" aren't a named export for node <10
+const PassThrough$1 = Stream.PassThrough;
+
+const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {
+	const orig = new URL$1(original).hostname;
+	const dest = new URL$1(destination).hostname;
+
+	return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);
+};
+
+/**
+ * isSameProtocol reports whether the two provided URLs use the same protocol.
+ *
+ * Both domains must already be in canonical form.
+ * @param {string|URL} original
+ * @param {string|URL} destination
+ */
+const isSameProtocol = function isSameProtocol(destination, original) {
+	const orig = new URL$1(original).protocol;
+	const dest = new URL$1(destination).protocol;
+
+	return orig === dest;
+};
+
+/**
+ * Fetch function
+ *
+ * @param   Mixed    url   Absolute url or Request instance
+ * @param   Object   opts  Fetch options
+ * @return  Promise
+ */
+function fetch(url, opts) {
+
+	// allow custom promise
+	if (!fetch.Promise) {
+		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
+	}
+
+	Body.Promise = fetch.Promise;
+
+	// wrap http.request into fetch
+	return new fetch.Promise(function (resolve, reject) {
+		// build request object
+		const request = new Request(url, opts);
+		const options = getNodeRequestOptions(request);
+
+		const send = (options.protocol === 'https:' ? https : http).request;
+		const signal = request.signal;
+
+		let response = null;
+
+		const abort = function abort() {
+			let error = new AbortError('The user aborted a request.');
+			reject(error);
+			if (request.body && request.body instanceof Stream.Readable) {
+				destroyStream(request.body, error);
+			}
+			if (!response || !response.body) return;
+			response.body.emit('error', error);
+		};
+
+		if (signal && signal.aborted) {
+			abort();
+			return;
+		}
+
+		const abortAndFinalize = function abortAndFinalize() {
+			abort();
+			finalize();
+		};
+
+		// send request
+		const req = send(options);
+		let reqTimeout;
+
+		if (signal) {
+			signal.addEventListener('abort', abortAndFinalize);
+		}
+
+		function finalize() {
+			req.abort();
+			if (signal) signal.removeEventListener('abort', abortAndFinalize);
+			clearTimeout(reqTimeout);
+		}
+
+		if (request.timeout) {
+			req.once('socket', function (socket) {
+				reqTimeout = setTimeout(function () {
+					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
+					finalize();
+				}, request.timeout);
+			});
+		}
+
+		req.on('error', function (err) {
+			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
+
+			if (response && response.body) {
+				destroyStream(response.body, err);
+			}
+
+			finalize();
+		});
+
+		fixResponseChunkedTransferBadEnding(req, function (err) {
+			if (signal && signal.aborted) {
+				return;
+			}
+
+			if (response && response.body) {
+				destroyStream(response.body, err);
+			}
+		});
+
+		/* c8 ignore next 18 */
+		if (parseInt(process.version.substring(1)) < 14) {
+			// Before Node.js 14, pipeline() does not fully support async iterators and does not always
+			// properly handle when the socket close/end events are out of order.
+			req.on('socket', function (s) {
+				s.addListener('close', function (hadError) {
+					// if a data listener is still present we didn't end cleanly
+					const hasDataListener = s.listenerCount('data') > 0;
+
+					// if end happened before close but the socket didn't emit an error, do it now
+					if (response && hasDataListener && !hadError && !(signal && signal.aborted)) {
+						const err = new Error('Premature close');
+						err.code = 'ERR_STREAM_PREMATURE_CLOSE';
+						response.body.emit('error', err);
+					}
+				});
+			});
+		}
+
+		req.on('response', function (res) {
+			clearTimeout(reqTimeout);
+
+			const headers = createHeadersLenient(res.headers);
+
+			// HTTP fetch step 5
+			if (fetch.isRedirect(res.statusCode)) {
+				// HTTP fetch step 5.2
+				const location = headers.get('Location');
+
+				// HTTP fetch step 5.3
+				let locationURL = null;
+				try {
+					locationURL = location === null ? null : new URL$1(location, request.url).toString();
+				} catch (err) {
+					// error here can only be invalid URL in Location: header
+					// do not throw when options.redirect == manual
+					// let the user extract the errorneous redirect URL
+					if (request.redirect !== 'manual') {
+						reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));
+						finalize();
+						return;
+					}
+				}
+
+				// HTTP fetch step 5.5
+				switch (request.redirect) {
+					case 'error':
+						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
+						finalize();
+						return;
+					case 'manual':
+						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
+						if (locationURL !== null) {
+							// handle corrupted header
+							try {
+								headers.set('Location', locationURL);
+							} catch (err) {
+								// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request
+								reject(err);
+							}
+						}
+						break;
+					case 'follow':
+						// HTTP-redirect fetch step 2
+						if (locationURL === null) {
+							break;
+						}
+
+						// HTTP-redirect fetch step 5
+						if (request.counter >= request.follow) {
+							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
+							finalize();
+							return;
+						}
+
+						// HTTP-redirect fetch step 6 (counter increment)
+						// Create a new Request object.
+						const requestOpts = {
+							headers: new Headers(request.headers),
+							follow: request.follow,
+							counter: request.counter + 1,
+							agent: request.agent,
+							compress: request.compress,
+							method: request.method,
+							body: request.body,
+							signal: request.signal,
+							timeout: request.timeout,
+							size: request.size
+						};
+
+						if (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) {
+							for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {
+								requestOpts.headers.delete(name);
+							}
+						}
+
+						// HTTP-redirect fetch step 9
+						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
+							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
+							finalize();
+							return;
+						}
+
+						// HTTP-redirect fetch step 11
+						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
+							requestOpts.method = 'GET';
+							requestOpts.body = undefined;
+							requestOpts.headers.delete('content-length');
+						}
+
+						// HTTP-redirect fetch step 15
+						resolve(fetch(new Request(locationURL, requestOpts)));
+						finalize();
+						return;
+				}
+			}
+
+			// prepare response
+			res.once('end', function () {
+				if (signal) signal.removeEventListener('abort', abortAndFinalize);
+			});
+			let body = res.pipe(new PassThrough$1());
+
+			const response_options = {
+				url: request.url,
+				status: res.statusCode,
+				statusText: res.statusMessage,
+				headers: headers,
+				size: request.size,
+				timeout: request.timeout,
+				counter: request.counter
+			};
+
+			// HTTP-network fetch step 12.1.1.3
+			const codings = headers.get('Content-Encoding');
+
+			// HTTP-network fetch step 12.1.1.4: handle content codings
+
+			// in following scenarios we ignore compression support
+			// 1. compression support is disabled
+			// 2. HEAD request
+			// 3. no Content-Encoding header
+			// 4. no content response (204)
+			// 5. content not modified response (304)
+			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// For Node v6+
+			// Be less strict when decoding compressed responses, since sometimes
+			// servers send slightly invalid responses that are still accepted
+			// by common browsers.
+			// Always using Z_SYNC_FLUSH is what cURL does.
+			const zlibOptions = {
+				flush: zlib.Z_SYNC_FLUSH,
+				finishFlush: zlib.Z_SYNC_FLUSH
+			};
+
+			// for gzip
+			if (codings == 'gzip' || codings == 'x-gzip') {
+				body = body.pipe(zlib.createGunzip(zlibOptions));
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// for deflate
+			if (codings == 'deflate' || codings == 'x-deflate') {
+				// handle the infamous raw deflate response from old servers
+				// a hack for old IIS and Apache servers
+				const raw = res.pipe(new PassThrough$1());
+				raw.once('data', function (chunk) {
+					// see http://stackoverflow.com/questions/37519828
+					if ((chunk[0] & 0x0F) === 0x08) {
+						body = body.pipe(zlib.createInflate());
+					} else {
+						body = body.pipe(zlib.createInflateRaw());
+					}
+					response = new Response(body, response_options);
+					resolve(response);
+				});
+				raw.on('end', function () {
+					// some old IIS servers return zero-length OK deflate responses, so 'data' is never emitted.
+					if (!response) {
+						response = new Response(body, response_options);
+						resolve(response);
+					}
+				});
+				return;
+			}
+
+			// for br
+			if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {
+				body = body.pipe(zlib.createBrotliDecompress());
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// otherwise, use response as-is
+			response = new Response(body, response_options);
+			resolve(response);
+		});
+
+		writeToStream(req, request);
+	});
+}
+function fixResponseChunkedTransferBadEnding(request, errorCallback) {
+	let socket;
+
+	request.on('socket', function (s) {
+		socket = s;
+	});
+
+	request.on('response', function (response) {
+		const headers = response.headers;
+
+		if (headers['transfer-encoding'] === 'chunked' && !headers['content-length']) {
+			response.once('close', function (hadError) {
+				// tests for socket presence, as in some situations the
+				// the 'socket' event is not triggered for the request
+				// (happens in deno), avoids `TypeError`
+				// if a data listener is still present we didn't end cleanly
+				const hasDataListener = socket && socket.listenerCount('data') > 0;
+
+				if (hasDataListener && !hadError) {
+					const err = new Error('Premature close');
+					err.code = 'ERR_STREAM_PREMATURE_CLOSE';
+					errorCallback(err);
+				}
+			});
+		}
+	});
+}
+
+function destroyStream(stream, err) {
+	if (stream.destroy) {
+		stream.destroy(err);
+	} else {
+		// node < 8
+		stream.emit('error', err);
+		stream.end();
+	}
+}
+
+/**
+ * Redirect code matching
+ *
+ * @param   Number   code  Status code
+ * @return  Boolean
+ */
+fetch.isRedirect = function (code) {
+	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
+};
+
+// expose Promise
+fetch.Promise = global.Promise;
+
+export default fetch;
+export { Headers, Request, Response, FetchError, AbortError };
diff --git a/@capacitor/assets/node_modules/node-fetch/lib/index.js b/@capacitor/assets/node_modules/node-fetch/lib/index.js
new file mode 100644
index 00000000..567ff5da
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-fetch/lib/index.js
@@ -0,0 +1,1787 @@
+'use strict';
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
+
+var Stream = _interopDefault(require('stream'));
+var http = _interopDefault(require('http'));
+var Url = _interopDefault(require('url'));
+var whatwgUrl = _interopDefault(require('whatwg-url'));
+var https = _interopDefault(require('https'));
+var zlib = _interopDefault(require('zlib'));
+
+// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
+
+// fix for "Readable" isn't a named export issue
+const Readable = Stream.Readable;
+
+const BUFFER = Symbol('buffer');
+const TYPE = Symbol('type');
+
+class Blob {
+	constructor() {
+		this[TYPE] = '';
+
+		const blobParts = arguments[0];
+		const options = arguments[1];
+
+		const buffers = [];
+		let size = 0;
+
+		if (blobParts) {
+			const a = blobParts;
+			const length = Number(a.length);
+			for (let i = 0; i < length; i++) {
+				const element = a[i];
+				let buffer;
+				if (element instanceof Buffer) {
+					buffer = element;
+				} else if (ArrayBuffer.isView(element)) {
+					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
+				} else if (element instanceof ArrayBuffer) {
+					buffer = Buffer.from(element);
+				} else if (element instanceof Blob) {
+					buffer = element[BUFFER];
+				} else {
+					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
+				}
+				size += buffer.length;
+				buffers.push(buffer);
+			}
+		}
+
+		this[BUFFER] = Buffer.concat(buffers);
+
+		let type = options && options.type !== undefined && String(options.type).toLowerCase();
+		if (type && !/[^\u0020-\u007E]/.test(type)) {
+			this[TYPE] = type;
+		}
+	}
+	get size() {
+		return this[BUFFER].length;
+	}
+	get type() {
+		return this[TYPE];
+	}
+	text() {
+		return Promise.resolve(this[BUFFER].toString());
+	}
+	arrayBuffer() {
+		const buf = this[BUFFER];
+		const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+		return Promise.resolve(ab);
+	}
+	stream() {
+		const readable = new Readable();
+		readable._read = function () {};
+		readable.push(this[BUFFER]);
+		readable.push(null);
+		return readable;
+	}
+	toString() {
+		return '[object Blob]';
+	}
+	slice() {
+		const size = this.size;
+
+		const start = arguments[0];
+		const end = arguments[1];
+		let relativeStart, relativeEnd;
+		if (start === undefined) {
+			relativeStart = 0;
+		} else if (start < 0) {
+			relativeStart = Math.max(size + start, 0);
+		} else {
+			relativeStart = Math.min(start, size);
+		}
+		if (end === undefined) {
+			relativeEnd = size;
+		} else if (end < 0) {
+			relativeEnd = Math.max(size + end, 0);
+		} else {
+			relativeEnd = Math.min(end, size);
+		}
+		const span = Math.max(relativeEnd - relativeStart, 0);
+
+		const buffer = this[BUFFER];
+		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
+		const blob = new Blob([], { type: arguments[2] });
+		blob[BUFFER] = slicedBuffer;
+		return blob;
+	}
+}
+
+Object.defineProperties(Blob.prototype, {
+	size: { enumerable: true },
+	type: { enumerable: true },
+	slice: { enumerable: true }
+});
+
+Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
+	value: 'Blob',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+/**
+ * fetch-error.js
+ *
+ * FetchError interface for operational errors
+ */
+
+/**
+ * Create FetchError instance
+ *
+ * @param   String      message      Error message for human
+ * @param   String      type         Error type for machine
+ * @param   String      systemError  For Node.js system error
+ * @return  FetchError
+ */
+function FetchError(message, type, systemError) {
+  Error.call(this, message);
+
+  this.message = message;
+  this.type = type;
+
+  // when err.type is `system`, err.code contains system error code
+  if (systemError) {
+    this.code = this.errno = systemError.code;
+  }
+
+  // hide custom error implementation details from end-users
+  Error.captureStackTrace(this, this.constructor);
+}
+
+FetchError.prototype = Object.create(Error.prototype);
+FetchError.prototype.constructor = FetchError;
+FetchError.prototype.name = 'FetchError';
+
+let convert;
+try {
+	convert = require('encoding').convert;
+} catch (e) {}
+
+const INTERNALS = Symbol('Body internals');
+
+// fix an issue where "PassThrough" isn't a named export for node <10
+const PassThrough = Stream.PassThrough;
+
+/**
+ * Body mixin
+ *
+ * Ref: https://fetch.spec.whatwg.org/#body
+ *
+ * @param   Stream  body  Readable stream
+ * @param   Object  opts  Response options
+ * @return  Void
+ */
+function Body(body) {
+	var _this = this;
+
+	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+	    _ref$size = _ref.size;
+
+	let size = _ref$size === undefined ? 0 : _ref$size;
+	var _ref$timeout = _ref.timeout;
+	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;
+
+	if (body == null) {
+		// body is undefined or null
+		body = null;
+	} else if (isURLSearchParams(body)) {
+		// body is a URLSearchParams
+		body = Buffer.from(body.toString());
+	} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
+		// body is ArrayBuffer
+		body = Buffer.from(body);
+	} else if (ArrayBuffer.isView(body)) {
+		// body is ArrayBufferView
+		body = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
+	} else if (body instanceof Stream) ; else {
+		// none of the above
+		// coerce to string then buffer
+		body = Buffer.from(String(body));
+	}
+	this[INTERNALS] = {
+		body,
+		disturbed: false,
+		error: null
+	};
+	this.size = size;
+	this.timeout = timeout;
+
+	if (body instanceof Stream) {
+		body.on('error', function (err) {
+			const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
+			_this[INTERNALS].error = error;
+		});
+	}
+}
+
+Body.prototype = {
+	get body() {
+		return this[INTERNALS].body;
+	},
+
+	get bodyUsed() {
+		return this[INTERNALS].disturbed;
+	},
+
+	/**
+  * Decode response as ArrayBuffer
+  *
+  * @return  Promise
+  */
+	arrayBuffer() {
+		return consumeBody.call(this).then(function (buf) {
+			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+		});
+	},
+
+	/**
+  * Return raw response as Blob
+  *
+  * @return Promise
+  */
+	blob() {
+		let ct = this.headers && this.headers.get('content-type') || '';
+		return consumeBody.call(this).then(function (buf) {
+			return Object.assign(
+			// Prevent copying
+			new Blob([], {
+				type: ct.toLowerCase()
+			}), {
+				[BUFFER]: buf
+			});
+		});
+	},
+
+	/**
+  * Decode response as json
+  *
+  * @return  Promise
+  */
+	json() {
+		var _this2 = this;
+
+		return consumeBody.call(this).then(function (buffer) {
+			try {
+				return JSON.parse(buffer.toString());
+			} catch (err) {
+				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
+			}
+		});
+	},
+
+	/**
+  * Decode response as text
+  *
+  * @return  Promise
+  */
+	text() {
+		return consumeBody.call(this).then(function (buffer) {
+			return buffer.toString();
+		});
+	},
+
+	/**
+  * Decode response as buffer (non-spec api)
+  *
+  * @return  Promise
+  */
+	buffer() {
+		return consumeBody.call(this);
+	},
+
+	/**
+  * Decode response as text, while automatically detecting the encoding and
+  * trying to decode to UTF-8 (non-spec api)
+  *
+  * @return  Promise
+  */
+	textConverted() {
+		var _this3 = this;
+
+		return consumeBody.call(this).then(function (buffer) {
+			return convertBody(buffer, _this3.headers);
+		});
+	}
+};
+
+// In browsers, all properties are enumerable.
+Object.defineProperties(Body.prototype, {
+	body: { enumerable: true },
+	bodyUsed: { enumerable: true },
+	arrayBuffer: { enumerable: true },
+	blob: { enumerable: true },
+	json: { enumerable: true },
+	text: { enumerable: true }
+});
+
+Body.mixIn = function (proto) {
+	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
+		// istanbul ignore else: future proof
+		if (!(name in proto)) {
+			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
+			Object.defineProperty(proto, name, desc);
+		}
+	}
+};
+
+/**
+ * Consume and convert an entire Body to a Buffer.
+ *
+ * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
+ *
+ * @return  Promise
+ */
+function consumeBody() {
+	var _this4 = this;
+
+	if (this[INTERNALS].disturbed) {
+		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
+	}
+
+	this[INTERNALS].disturbed = true;
+
+	if (this[INTERNALS].error) {
+		return Body.Promise.reject(this[INTERNALS].error);
+	}
+
+	let body = this.body;
+
+	// body is null
+	if (body === null) {
+		return Body.Promise.resolve(Buffer.alloc(0));
+	}
+
+	// body is blob
+	if (isBlob(body)) {
+		body = body.stream();
+	}
+
+	// body is buffer
+	if (Buffer.isBuffer(body)) {
+		return Body.Promise.resolve(body);
+	}
+
+	// istanbul ignore if: should never happen
+	if (!(body instanceof Stream)) {
+		return Body.Promise.resolve(Buffer.alloc(0));
+	}
+
+	// body is stream
+	// get ready to actually consume the body
+	let accum = [];
+	let accumBytes = 0;
+	let abort = false;
+
+	return new Body.Promise(function (resolve, reject) {
+		let resTimeout;
+
+		// allow timeout on slow response body
+		if (_this4.timeout) {
+			resTimeout = setTimeout(function () {
+				abort = true;
+				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
+			}, _this4.timeout);
+		}
+
+		// handle stream errors
+		body.on('error', function (err) {
+			if (err.name === 'AbortError') {
+				// if the request was aborted, reject with this Error
+				abort = true;
+				reject(err);
+			} else {
+				// other errors, such as incorrect content-encoding
+				reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
+			}
+		});
+
+		body.on('data', function (chunk) {
+			if (abort || chunk === null) {
+				return;
+			}
+
+			if (_this4.size && accumBytes + chunk.length > _this4.size) {
+				abort = true;
+				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
+				return;
+			}
+
+			accumBytes += chunk.length;
+			accum.push(chunk);
+		});
+
+		body.on('end', function () {
+			if (abort) {
+				return;
+			}
+
+			clearTimeout(resTimeout);
+
+			try {
+				resolve(Buffer.concat(accum, accumBytes));
+			} catch (err) {
+				// handle streams that have accumulated too much data (issue #414)
+				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
+			}
+		});
+	});
+}
+
+/**
+ * Detect buffer encoding and convert to target encoding
+ * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
+ *
+ * @param   Buffer  buffer    Incoming buffer
+ * @param   String  encoding  Target encoding
+ * @return  String
+ */
+function convertBody(buffer, headers) {
+	if (typeof convert !== 'function') {
+		throw new Error('The package `encoding` must be installed to use the textConverted() function');
+	}
+
+	const ct = headers.get('content-type');
+	let charset = 'utf-8';
+	let res, str;
+
+	// header
+	if (ct) {
+		res = /charset=([^;]*)/i.exec(ct);
+	}
+
+	// no charset in content type, peek at response body for at most 1024 bytes
+	str = buffer.slice(0, 1024).toString();
+
+	// html5
+	if (!res && str) {
+		res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined;
+
+		this[MAP] = Object.create(null);
+
+		if (init instanceof Headers) {
+			const rawHeaders = init.raw();
+			const headerNames = Object.keys(rawHeaders);
+
+			for (const headerName of headerNames) {
+				for (const value of rawHeaders[headerName]) {
+					this.append(headerName, value);
+				}
+			}
+
+			return;
+		}
+
+		// We don't worry about converting prop to ByteString here as append()
+		// will handle it.
+		if (init == null) ; else if (typeof init === 'object') {
+			const method = init[Symbol.iterator];
+			if (method != null) {
+				if (typeof method !== 'function') {
+					throw new TypeError('Header pairs must be iterable');
+				}
+
+				// sequence>
+				// Note: per spec we have to first exhaust the lists then process them
+				const pairs = [];
+				for (const pair of init) {
+					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
+						throw new TypeError('Each header pair must be iterable');
+					}
+					pairs.push(Array.from(pair));
+				}
+
+				for (const pair of pairs) {
+					if (pair.length !== 2) {
+						throw new TypeError('Each header pair must be a name/value tuple');
+					}
+					this.append(pair[0], pair[1]);
+				}
+			} else {
+				// record
+				for (const key of Object.keys(init)) {
+					const value = init[key];
+					this.append(key, value);
+				}
+			}
+		} else {
+			throw new TypeError('Provided initializer must be an object');
+		}
+	}
+
+	/**
+  * Return combined header value given name
+  *
+  * @param   String  name  Header name
+  * @return  Mixed
+  */
+	get(name) {
+		name = `${name}`;
+		validateName(name);
+		const key = find(this[MAP], name);
+		if (key === undefined) {
+			return null;
+		}
+
+		return this[MAP][key].join(', ');
+	}
+
+	/**
+  * Iterate over all headers
+  *
+  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
+  * @param   Boolean   thisArg   `this` context for callback function
+  * @return  Void
+  */
+	forEach(callback) {
+		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
+
+		let pairs = getHeaders(this);
+		let i = 0;
+		while (i < pairs.length) {
+			var _pairs$i = pairs[i];
+			const name = _pairs$i[0],
+			      value = _pairs$i[1];
+
+			callback.call(thisArg, value, name, this);
+			pairs = getHeaders(this);
+			i++;
+		}
+	}
+
+	/**
+  * Overwrite header values given name
+  *
+  * @param   String  name   Header name
+  * @param   String  value  Header value
+  * @return  Void
+  */
+	set(name, value) {
+		name = `${name}`;
+		value = `${value}`;
+		validateName(name);
+		validateValue(value);
+		const key = find(this[MAP], name);
+		this[MAP][key !== undefined ? key : name] = [value];
+	}
+
+	/**
+  * Append a value onto existing header
+  *
+  * @param   String  name   Header name
+  * @param   String  value  Header value
+  * @return  Void
+  */
+	append(name, value) {
+		name = `${name}`;
+		value = `${value}`;
+		validateName(name);
+		validateValue(value);
+		const key = find(this[MAP], name);
+		if (key !== undefined) {
+			this[MAP][key].push(value);
+		} else {
+			this[MAP][name] = [value];
+		}
+	}
+
+	/**
+  * Check for header name existence
+  *
+  * @param   String   name  Header name
+  * @return  Boolean
+  */
+	has(name) {
+		name = `${name}`;
+		validateName(name);
+		return find(this[MAP], name) !== undefined;
+	}
+
+	/**
+  * Delete all header values given name
+  *
+  * @param   String  name  Header name
+  * @return  Void
+  */
+	delete(name) {
+		name = `${name}`;
+		validateName(name);
+		const key = find(this[MAP], name);
+		if (key !== undefined) {
+			delete this[MAP][key];
+		}
+	}
+
+	/**
+  * Return raw headers (non-spec api)
+  *
+  * @return  Object
+  */
+	raw() {
+		return this[MAP];
+	}
+
+	/**
+  * Get an iterator on keys.
+  *
+  * @return  Iterator
+  */
+	keys() {
+		return createHeadersIterator(this, 'key');
+	}
+
+	/**
+  * Get an iterator on values.
+  *
+  * @return  Iterator
+  */
+	values() {
+		return createHeadersIterator(this, 'value');
+	}
+
+	/**
+  * Get an iterator on entries.
+  *
+  * This is the default iterator of the Headers object.
+  *
+  * @return  Iterator
+  */
+	[Symbol.iterator]() {
+		return createHeadersIterator(this, 'key+value');
+	}
+}
+Headers.prototype.entries = Headers.prototype[Symbol.iterator];
+
+Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
+	value: 'Headers',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+Object.defineProperties(Headers.prototype, {
+	get: { enumerable: true },
+	forEach: { enumerable: true },
+	set: { enumerable: true },
+	append: { enumerable: true },
+	has: { enumerable: true },
+	delete: { enumerable: true },
+	keys: { enumerable: true },
+	values: { enumerable: true },
+	entries: { enumerable: true }
+});
+
+function getHeaders(headers) {
+	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';
+
+	const keys = Object.keys(headers[MAP]).sort();
+	return keys.map(kind === 'key' ? function (k) {
+		return k.toLowerCase();
+	} : kind === 'value' ? function (k) {
+		return headers[MAP][k].join(', ');
+	} : function (k) {
+		return [k.toLowerCase(), headers[MAP][k].join(', ')];
+	});
+}
+
+const INTERNAL = Symbol('internal');
+
+function createHeadersIterator(target, kind) {
+	const iterator = Object.create(HeadersIteratorPrototype);
+	iterator[INTERNAL] = {
+		target,
+		kind,
+		index: 0
+	};
+	return iterator;
+}
+
+const HeadersIteratorPrototype = Object.setPrototypeOf({
+	next() {
+		// istanbul ignore if
+		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
+			throw new TypeError('Value of `this` is not a HeadersIterator');
+		}
+
+		var _INTERNAL = this[INTERNAL];
+		const target = _INTERNAL.target,
+		      kind = _INTERNAL.kind,
+		      index = _INTERNAL.index;
+
+		const values = getHeaders(target, kind);
+		const len = values.length;
+		if (index >= len) {
+			return {
+				value: undefined,
+				done: true
+			};
+		}
+
+		this[INTERNAL].index = index + 1;
+
+		return {
+			value: values[index],
+			done: false
+		};
+	}
+}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));
+
+Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
+	value: 'HeadersIterator',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+/**
+ * Export the Headers object in a form that Node.js can consume.
+ *
+ * @param   Headers  headers
+ * @return  Object
+ */
+function exportNodeCompatibleHeaders(headers) {
+	const obj = Object.assign({ __proto__: null }, headers[MAP]);
+
+	// http.request() only supports string as Host header. This hack makes
+	// specifying custom Host header possible.
+	const hostHeaderKey = find(headers[MAP], 'Host');
+	if (hostHeaderKey !== undefined) {
+		obj[hostHeaderKey] = obj[hostHeaderKey][0];
+	}
+
+	return obj;
+}
+
+/**
+ * Create a Headers object from an object of headers, ignoring those that do
+ * not conform to HTTP grammar productions.
+ *
+ * @param   Object  obj  Object of headers
+ * @return  Headers
+ */
+function createHeadersLenient(obj) {
+	const headers = new Headers();
+	for (const name of Object.keys(obj)) {
+		if (invalidTokenRegex.test(name)) {
+			continue;
+		}
+		if (Array.isArray(obj[name])) {
+			for (const val of obj[name]) {
+				if (invalidHeaderCharRegex.test(val)) {
+					continue;
+				}
+				if (headers[MAP][name] === undefined) {
+					headers[MAP][name] = [val];
+				} else {
+					headers[MAP][name].push(val);
+				}
+			}
+		} else if (!invalidHeaderCharRegex.test(obj[name])) {
+			headers[MAP][name] = [obj[name]];
+		}
+	}
+	return headers;
+}
+
+const INTERNALS$1 = Symbol('Response internals');
+
+// fix an issue where "STATUS_CODES" aren't a named export for node <10
+const STATUS_CODES = http.STATUS_CODES;
+
+/**
+ * Response class
+ *
+ * @param   Stream  body  Readable stream
+ * @param   Object  opts  Response options
+ * @return  Void
+ */
+class Response {
+	constructor() {
+		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+		Body.call(this, body, opts);
+
+		const status = opts.status || 200;
+		const headers = new Headers(opts.headers);
+
+		if (body != null && !headers.has('Content-Type')) {
+			const contentType = extractContentType(body);
+			if (contentType) {
+				headers.append('Content-Type', contentType);
+			}
+		}
+
+		this[INTERNALS$1] = {
+			url: opts.url,
+			status,
+			statusText: opts.statusText || STATUS_CODES[status],
+			headers,
+			counter: opts.counter
+		};
+	}
+
+	get url() {
+		return this[INTERNALS$1].url || '';
+	}
+
+	get status() {
+		return this[INTERNALS$1].status;
+	}
+
+	/**
+  * Convenience property representing if the request ended normally
+  */
+	get ok() {
+		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
+	}
+
+	get redirected() {
+		return this[INTERNALS$1].counter > 0;
+	}
+
+	get statusText() {
+		return this[INTERNALS$1].statusText;
+	}
+
+	get headers() {
+		return this[INTERNALS$1].headers;
+	}
+
+	/**
+  * Clone this response
+  *
+  * @return  Response
+  */
+	clone() {
+		return new Response(clone(this), {
+			url: this.url,
+			status: this.status,
+			statusText: this.statusText,
+			headers: this.headers,
+			ok: this.ok,
+			redirected: this.redirected
+		});
+	}
+}
+
+Body.mixIn(Response.prototype);
+
+Object.defineProperties(Response.prototype, {
+	url: { enumerable: true },
+	status: { enumerable: true },
+	ok: { enumerable: true },
+	redirected: { enumerable: true },
+	statusText: { enumerable: true },
+	headers: { enumerable: true },
+	clone: { enumerable: true }
+});
+
+Object.defineProperty(Response.prototype, Symbol.toStringTag, {
+	value: 'Response',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+const INTERNALS$2 = Symbol('Request internals');
+const URL = Url.URL || whatwgUrl.URL;
+
+// fix an issue where "format", "parse" aren't a named export for node <10
+const parse_url = Url.parse;
+const format_url = Url.format;
+
+/**
+ * Wrapper around `new URL` to handle arbitrary URLs
+ *
+ * @param  {string} urlStr
+ * @return {void}
+ */
+function parseURL(urlStr) {
+	/*
+ 	Check whether the URL is absolute or not
+ 		Scheme: https://tools.ietf.org/html/rfc3986#section-3.1
+ 	Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3
+ */
+	if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) {
+		urlStr = new URL(urlStr).toString();
+	}
+
+	// Fallback to old implementation for arbitrary URLs
+	return parse_url(urlStr);
+}
+
+const streamDestructionSupported = 'destroy' in Stream.Readable.prototype;
+
+/**
+ * Check if a value is an instance of Request.
+ *
+ * @param   Mixed   input
+ * @return  Boolean
+ */
+function isRequest(input) {
+	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
+}
+
+function isAbortSignal(signal) {
+	const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
+	return !!(proto && proto.constructor.name === 'AbortSignal');
+}
+
+/**
+ * Request class
+ *
+ * @param   Mixed   input  Url or Request instance
+ * @param   Object  init   Custom options
+ * @return  Void
+ */
+class Request {
+	constructor(input) {
+		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+		let parsedURL;
+
+		// normalize input
+		if (!isRequest(input)) {
+			if (input && input.href) {
+				// in order to support Node.js' Url objects; though WHATWG's URL objects
+				// will fall into this branch also (since their `toString()` will return
+				// `href` property anyway)
+				parsedURL = parseURL(input.href);
+			} else {
+				// coerce input to a string before attempting to parse
+				parsedURL = parseURL(`${input}`);
+			}
+			input = {};
+		} else {
+			parsedURL = parseURL(input.url);
+		}
+
+		let method = init.method || input.method || 'GET';
+		method = method.toUpperCase();
+
+		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
+			throw new TypeError('Request with GET/HEAD method cannot have body');
+		}
+
+		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;
+
+		Body.call(this, inputBody, {
+			timeout: init.timeout || input.timeout || 0,
+			size: init.size || input.size || 0
+		});
+
+		const headers = new Headers(init.headers || input.headers || {});
+
+		if (inputBody != null && !headers.has('Content-Type')) {
+			const contentType = extractContentType(inputBody);
+			if (contentType) {
+				headers.append('Content-Type', contentType);
+			}
+		}
+
+		let signal = isRequest(input) ? input.signal : null;
+		if ('signal' in init) signal = init.signal;
+
+		if (signal != null && !isAbortSignal(signal)) {
+			throw new TypeError('Expected signal to be an instanceof AbortSignal');
+		}
+
+		this[INTERNALS$2] = {
+			method,
+			redirect: init.redirect || input.redirect || 'follow',
+			headers,
+			parsedURL,
+			signal
+		};
+
+		// node-fetch-only options
+		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
+		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
+		this.counter = init.counter || input.counter || 0;
+		this.agent = init.agent || input.agent;
+	}
+
+	get method() {
+		return this[INTERNALS$2].method;
+	}
+
+	get url() {
+		return format_url(this[INTERNALS$2].parsedURL);
+	}
+
+	get headers() {
+		return this[INTERNALS$2].headers;
+	}
+
+	get redirect() {
+		return this[INTERNALS$2].redirect;
+	}
+
+	get signal() {
+		return this[INTERNALS$2].signal;
+	}
+
+	/**
+  * Clone this request
+  *
+  * @return  Request
+  */
+	clone() {
+		return new Request(this);
+	}
+}
+
+Body.mixIn(Request.prototype);
+
+Object.defineProperty(Request.prototype, Symbol.toStringTag, {
+	value: 'Request',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+Object.defineProperties(Request.prototype, {
+	method: { enumerable: true },
+	url: { enumerable: true },
+	headers: { enumerable: true },
+	redirect: { enumerable: true },
+	clone: { enumerable: true },
+	signal: { enumerable: true }
+});
+
+/**
+ * Convert a Request to Node.js http request options.
+ *
+ * @param   Request  A Request instance
+ * @return  Object   The options object to be passed to http.request
+ */
+function getNodeRequestOptions(request) {
+	const parsedURL = request[INTERNALS$2].parsedURL;
+	const headers = new Headers(request[INTERNALS$2].headers);
+
+	// fetch step 1.3
+	if (!headers.has('Accept')) {
+		headers.set('Accept', '*/*');
+	}
+
+	// Basic fetch
+	if (!parsedURL.protocol || !parsedURL.hostname) {
+		throw new TypeError('Only absolute URLs are supported');
+	}
+
+	if (!/^https?:$/.test(parsedURL.protocol)) {
+		throw new TypeError('Only HTTP(S) protocols are supported');
+	}
+
+	if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {
+		throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');
+	}
+
+	// HTTP-network-or-cache fetch steps 2.4-2.7
+	let contentLengthValue = null;
+	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
+		contentLengthValue = '0';
+	}
+	if (request.body != null) {
+		const totalBytes = getTotalBytes(request);
+		if (typeof totalBytes === 'number') {
+			contentLengthValue = String(totalBytes);
+		}
+	}
+	if (contentLengthValue) {
+		headers.set('Content-Length', contentLengthValue);
+	}
+
+	// HTTP-network-or-cache fetch step 2.11
+	if (!headers.has('User-Agent')) {
+		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
+	}
+
+	// HTTP-network-or-cache fetch step 2.15
+	if (request.compress && !headers.has('Accept-Encoding')) {
+		headers.set('Accept-Encoding', 'gzip,deflate');
+	}
+
+	let agent = request.agent;
+	if (typeof agent === 'function') {
+		agent = agent(parsedURL);
+	}
+
+	// HTTP-network fetch step 4.2
+	// chunked encoding is handled by Node.js
+
+	return Object.assign({}, parsedURL, {
+		method: request.method,
+		headers: exportNodeCompatibleHeaders(headers),
+		agent
+	});
+}
+
+/**
+ * abort-error.js
+ *
+ * AbortError interface for cancelled requests
+ */
+
+/**
+ * Create AbortError instance
+ *
+ * @param   String      message      Error message for human
+ * @return  AbortError
+ */
+function AbortError(message) {
+  Error.call(this, message);
+
+  this.type = 'aborted';
+  this.message = message;
+
+  // hide custom error implementation details from end-users
+  Error.captureStackTrace(this, this.constructor);
+}
+
+AbortError.prototype = Object.create(Error.prototype);
+AbortError.prototype.constructor = AbortError;
+AbortError.prototype.name = 'AbortError';
+
+const URL$1 = Url.URL || whatwgUrl.URL;
+
+// fix an issue where "PassThrough", "resolve" aren't a named export for node <10
+const PassThrough$1 = Stream.PassThrough;
+
+const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {
+	const orig = new URL$1(original).hostname;
+	const dest = new URL$1(destination).hostname;
+
+	return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);
+};
+
+/**
+ * isSameProtocol reports whether the two provided URLs use the same protocol.
+ *
+ * Both domains must already be in canonical form.
+ * @param {string|URL} original
+ * @param {string|URL} destination
+ */
+const isSameProtocol = function isSameProtocol(destination, original) {
+	const orig = new URL$1(original).protocol;
+	const dest = new URL$1(destination).protocol;
+
+	return orig === dest;
+};
+
+/**
+ * Fetch function
+ *
+ * @param   Mixed    url   Absolute url or Request instance
+ * @param   Object   opts  Fetch options
+ * @return  Promise
+ */
+function fetch(url, opts) {
+
+	// allow custom promise
+	if (!fetch.Promise) {
+		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
+	}
+
+	Body.Promise = fetch.Promise;
+
+	// wrap http.request into fetch
+	return new fetch.Promise(function (resolve, reject) {
+		// build request object
+		const request = new Request(url, opts);
+		const options = getNodeRequestOptions(request);
+
+		const send = (options.protocol === 'https:' ? https : http).request;
+		const signal = request.signal;
+
+		let response = null;
+
+		const abort = function abort() {
+			let error = new AbortError('The user aborted a request.');
+			reject(error);
+			if (request.body && request.body instanceof Stream.Readable) {
+				destroyStream(request.body, error);
+			}
+			if (!response || !response.body) return;
+			response.body.emit('error', error);
+		};
+
+		if (signal && signal.aborted) {
+			abort();
+			return;
+		}
+
+		const abortAndFinalize = function abortAndFinalize() {
+			abort();
+			finalize();
+		};
+
+		// send request
+		const req = send(options);
+		let reqTimeout;
+
+		if (signal) {
+			signal.addEventListener('abort', abortAndFinalize);
+		}
+
+		function finalize() {
+			req.abort();
+			if (signal) signal.removeEventListener('abort', abortAndFinalize);
+			clearTimeout(reqTimeout);
+		}
+
+		if (request.timeout) {
+			req.once('socket', function (socket) {
+				reqTimeout = setTimeout(function () {
+					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
+					finalize();
+				}, request.timeout);
+			});
+		}
+
+		req.on('error', function (err) {
+			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
+
+			if (response && response.body) {
+				destroyStream(response.body, err);
+			}
+
+			finalize();
+		});
+
+		fixResponseChunkedTransferBadEnding(req, function (err) {
+			if (signal && signal.aborted) {
+				return;
+			}
+
+			if (response && response.body) {
+				destroyStream(response.body, err);
+			}
+		});
+
+		/* c8 ignore next 18 */
+		if (parseInt(process.version.substring(1)) < 14) {
+			// Before Node.js 14, pipeline() does not fully support async iterators and does not always
+			// properly handle when the socket close/end events are out of order.
+			req.on('socket', function (s) {
+				s.addListener('close', function (hadError) {
+					// if a data listener is still present we didn't end cleanly
+					const hasDataListener = s.listenerCount('data') > 0;
+
+					// if end happened before close but the socket didn't emit an error, do it now
+					if (response && hasDataListener && !hadError && !(signal && signal.aborted)) {
+						const err = new Error('Premature close');
+						err.code = 'ERR_STREAM_PREMATURE_CLOSE';
+						response.body.emit('error', err);
+					}
+				});
+			});
+		}
+
+		req.on('response', function (res) {
+			clearTimeout(reqTimeout);
+
+			const headers = createHeadersLenient(res.headers);
+
+			// HTTP fetch step 5
+			if (fetch.isRedirect(res.statusCode)) {
+				// HTTP fetch step 5.2
+				const location = headers.get('Location');
+
+				// HTTP fetch step 5.3
+				let locationURL = null;
+				try {
+					locationURL = location === null ? null : new URL$1(location, request.url).toString();
+				} catch (err) {
+					// error here can only be invalid URL in Location: header
+					// do not throw when options.redirect == manual
+					// let the user extract the errorneous redirect URL
+					if (request.redirect !== 'manual') {
+						reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));
+						finalize();
+						return;
+					}
+				}
+
+				// HTTP fetch step 5.5
+				switch (request.redirect) {
+					case 'error':
+						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
+						finalize();
+						return;
+					case 'manual':
+						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
+						if (locationURL !== null) {
+							// handle corrupted header
+							try {
+								headers.set('Location', locationURL);
+							} catch (err) {
+								// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request
+								reject(err);
+							}
+						}
+						break;
+					case 'follow':
+						// HTTP-redirect fetch step 2
+						if (locationURL === null) {
+							break;
+						}
+
+						// HTTP-redirect fetch step 5
+						if (request.counter >= request.follow) {
+							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
+							finalize();
+							return;
+						}
+
+						// HTTP-redirect fetch step 6 (counter increment)
+						// Create a new Request object.
+						const requestOpts = {
+							headers: new Headers(request.headers),
+							follow: request.follow,
+							counter: request.counter + 1,
+							agent: request.agent,
+							compress: request.compress,
+							method: request.method,
+							body: request.body,
+							signal: request.signal,
+							timeout: request.timeout,
+							size: request.size
+						};
+
+						if (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) {
+							for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {
+								requestOpts.headers.delete(name);
+							}
+						}
+
+						// HTTP-redirect fetch step 9
+						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
+							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
+							finalize();
+							return;
+						}
+
+						// HTTP-redirect fetch step 11
+						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
+							requestOpts.method = 'GET';
+							requestOpts.body = undefined;
+							requestOpts.headers.delete('content-length');
+						}
+
+						// HTTP-redirect fetch step 15
+						resolve(fetch(new Request(locationURL, requestOpts)));
+						finalize();
+						return;
+				}
+			}
+
+			// prepare response
+			res.once('end', function () {
+				if (signal) signal.removeEventListener('abort', abortAndFinalize);
+			});
+			let body = res.pipe(new PassThrough$1());
+
+			const response_options = {
+				url: request.url,
+				status: res.statusCode,
+				statusText: res.statusMessage,
+				headers: headers,
+				size: request.size,
+				timeout: request.timeout,
+				counter: request.counter
+			};
+
+			// HTTP-network fetch step 12.1.1.3
+			const codings = headers.get('Content-Encoding');
+
+			// HTTP-network fetch step 12.1.1.4: handle content codings
+
+			// in following scenarios we ignore compression support
+			// 1. compression support is disabled
+			// 2. HEAD request
+			// 3. no Content-Encoding header
+			// 4. no content response (204)
+			// 5. content not modified response (304)
+			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// For Node v6+
+			// Be less strict when decoding compressed responses, since sometimes
+			// servers send slightly invalid responses that are still accepted
+			// by common browsers.
+			// Always using Z_SYNC_FLUSH is what cURL does.
+			const zlibOptions = {
+				flush: zlib.Z_SYNC_FLUSH,
+				finishFlush: zlib.Z_SYNC_FLUSH
+			};
+
+			// for gzip
+			if (codings == 'gzip' || codings == 'x-gzip') {
+				body = body.pipe(zlib.createGunzip(zlibOptions));
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// for deflate
+			if (codings == 'deflate' || codings == 'x-deflate') {
+				// handle the infamous raw deflate response from old servers
+				// a hack for old IIS and Apache servers
+				const raw = res.pipe(new PassThrough$1());
+				raw.once('data', function (chunk) {
+					// see http://stackoverflow.com/questions/37519828
+					if ((chunk[0] & 0x0F) === 0x08) {
+						body = body.pipe(zlib.createInflate());
+					} else {
+						body = body.pipe(zlib.createInflateRaw());
+					}
+					response = new Response(body, response_options);
+					resolve(response);
+				});
+				raw.on('end', function () {
+					// some old IIS servers return zero-length OK deflate responses, so 'data' is never emitted.
+					if (!response) {
+						response = new Response(body, response_options);
+						resolve(response);
+					}
+				});
+				return;
+			}
+
+			// for br
+			if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {
+				body = body.pipe(zlib.createBrotliDecompress());
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// otherwise, use response as-is
+			response = new Response(body, response_options);
+			resolve(response);
+		});
+
+		writeToStream(req, request);
+	});
+}
+function fixResponseChunkedTransferBadEnding(request, errorCallback) {
+	let socket;
+
+	request.on('socket', function (s) {
+		socket = s;
+	});
+
+	request.on('response', function (response) {
+		const headers = response.headers;
+
+		if (headers['transfer-encoding'] === 'chunked' && !headers['content-length']) {
+			response.once('close', function (hadError) {
+				// tests for socket presence, as in some situations the
+				// the 'socket' event is not triggered for the request
+				// (happens in deno), avoids `TypeError`
+				// if a data listener is still present we didn't end cleanly
+				const hasDataListener = socket && socket.listenerCount('data') > 0;
+
+				if (hasDataListener && !hadError) {
+					const err = new Error('Premature close');
+					err.code = 'ERR_STREAM_PREMATURE_CLOSE';
+					errorCallback(err);
+				}
+			});
+		}
+	});
+}
+
+function destroyStream(stream, err) {
+	if (stream.destroy) {
+		stream.destroy(err);
+	} else {
+		// node < 8
+		stream.emit('error', err);
+		stream.end();
+	}
+}
+
+/**
+ * Redirect code matching
+ *
+ * @param   Number   code  Status code
+ * @return  Boolean
+ */
+fetch.isRedirect = function (code) {
+	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
+};
+
+// expose Promise
+fetch.Promise = global.Promise;
+
+module.exports = exports = fetch;
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.default = exports;
+exports.Headers = Headers;
+exports.Request = Request;
+exports.Response = Response;
+exports.FetchError = FetchError;
+exports.AbortError = AbortError;
diff --git a/@capacitor/assets/node_modules/node-fetch/lib/index.mjs b/@capacitor/assets/node_modules/node-fetch/lib/index.mjs
new file mode 100644
index 00000000..2863dd9c
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-fetch/lib/index.mjs
@@ -0,0 +1,1775 @@
+import Stream from 'stream';
+import http from 'http';
+import Url from 'url';
+import whatwgUrl from 'whatwg-url';
+import https from 'https';
+import zlib from 'zlib';
+
+// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js
+
+// fix for "Readable" isn't a named export issue
+const Readable = Stream.Readable;
+
+const BUFFER = Symbol('buffer');
+const TYPE = Symbol('type');
+
+class Blob {
+	constructor() {
+		this[TYPE] = '';
+
+		const blobParts = arguments[0];
+		const options = arguments[1];
+
+		const buffers = [];
+		let size = 0;
+
+		if (blobParts) {
+			const a = blobParts;
+			const length = Number(a.length);
+			for (let i = 0; i < length; i++) {
+				const element = a[i];
+				let buffer;
+				if (element instanceof Buffer) {
+					buffer = element;
+				} else if (ArrayBuffer.isView(element)) {
+					buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength);
+				} else if (element instanceof ArrayBuffer) {
+					buffer = Buffer.from(element);
+				} else if (element instanceof Blob) {
+					buffer = element[BUFFER];
+				} else {
+					buffer = Buffer.from(typeof element === 'string' ? element : String(element));
+				}
+				size += buffer.length;
+				buffers.push(buffer);
+			}
+		}
+
+		this[BUFFER] = Buffer.concat(buffers);
+
+		let type = options && options.type !== undefined && String(options.type).toLowerCase();
+		if (type && !/[^\u0020-\u007E]/.test(type)) {
+			this[TYPE] = type;
+		}
+	}
+	get size() {
+		return this[BUFFER].length;
+	}
+	get type() {
+		return this[TYPE];
+	}
+	text() {
+		return Promise.resolve(this[BUFFER].toString());
+	}
+	arrayBuffer() {
+		const buf = this[BUFFER];
+		const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+		return Promise.resolve(ab);
+	}
+	stream() {
+		const readable = new Readable();
+		readable._read = function () {};
+		readable.push(this[BUFFER]);
+		readable.push(null);
+		return readable;
+	}
+	toString() {
+		return '[object Blob]';
+	}
+	slice() {
+		const size = this.size;
+
+		const start = arguments[0];
+		const end = arguments[1];
+		let relativeStart, relativeEnd;
+		if (start === undefined) {
+			relativeStart = 0;
+		} else if (start < 0) {
+			relativeStart = Math.max(size + start, 0);
+		} else {
+			relativeStart = Math.min(start, size);
+		}
+		if (end === undefined) {
+			relativeEnd = size;
+		} else if (end < 0) {
+			relativeEnd = Math.max(size + end, 0);
+		} else {
+			relativeEnd = Math.min(end, size);
+		}
+		const span = Math.max(relativeEnd - relativeStart, 0);
+
+		const buffer = this[BUFFER];
+		const slicedBuffer = buffer.slice(relativeStart, relativeStart + span);
+		const blob = new Blob([], { type: arguments[2] });
+		blob[BUFFER] = slicedBuffer;
+		return blob;
+	}
+}
+
+Object.defineProperties(Blob.prototype, {
+	size: { enumerable: true },
+	type: { enumerable: true },
+	slice: { enumerable: true }
+});
+
+Object.defineProperty(Blob.prototype, Symbol.toStringTag, {
+	value: 'Blob',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+/**
+ * fetch-error.js
+ *
+ * FetchError interface for operational errors
+ */
+
+/**
+ * Create FetchError instance
+ *
+ * @param   String      message      Error message for human
+ * @param   String      type         Error type for machine
+ * @param   String      systemError  For Node.js system error
+ * @return  FetchError
+ */
+function FetchError(message, type, systemError) {
+  Error.call(this, message);
+
+  this.message = message;
+  this.type = type;
+
+  // when err.type is `system`, err.code contains system error code
+  if (systemError) {
+    this.code = this.errno = systemError.code;
+  }
+
+  // hide custom error implementation details from end-users
+  Error.captureStackTrace(this, this.constructor);
+}
+
+FetchError.prototype = Object.create(Error.prototype);
+FetchError.prototype.constructor = FetchError;
+FetchError.prototype.name = 'FetchError';
+
+let convert;
+try {
+	convert = require('encoding').convert;
+} catch (e) {}
+
+const INTERNALS = Symbol('Body internals');
+
+// fix an issue where "PassThrough" isn't a named export for node <10
+const PassThrough = Stream.PassThrough;
+
+/**
+ * Body mixin
+ *
+ * Ref: https://fetch.spec.whatwg.org/#body
+ *
+ * @param   Stream  body  Readable stream
+ * @param   Object  opts  Response options
+ * @return  Void
+ */
+function Body(body) {
+	var _this = this;
+
+	var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+	    _ref$size = _ref.size;
+
+	let size = _ref$size === undefined ? 0 : _ref$size;
+	var _ref$timeout = _ref.timeout;
+	let timeout = _ref$timeout === undefined ? 0 : _ref$timeout;
+
+	if (body == null) {
+		// body is undefined or null
+		body = null;
+	} else if (isURLSearchParams(body)) {
+		// body is a URLSearchParams
+		body = Buffer.from(body.toString());
+	} else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') {
+		// body is ArrayBuffer
+		body = Buffer.from(body);
+	} else if (ArrayBuffer.isView(body)) {
+		// body is ArrayBufferView
+		body = Buffer.from(body.buffer, body.byteOffset, body.byteLength);
+	} else if (body instanceof Stream) ; else {
+		// none of the above
+		// coerce to string then buffer
+		body = Buffer.from(String(body));
+	}
+	this[INTERNALS] = {
+		body,
+		disturbed: false,
+		error: null
+	};
+	this.size = size;
+	this.timeout = timeout;
+
+	if (body instanceof Stream) {
+		body.on('error', function (err) {
+			const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err);
+			_this[INTERNALS].error = error;
+		});
+	}
+}
+
+Body.prototype = {
+	get body() {
+		return this[INTERNALS].body;
+	},
+
+	get bodyUsed() {
+		return this[INTERNALS].disturbed;
+	},
+
+	/**
+  * Decode response as ArrayBuffer
+  *
+  * @return  Promise
+  */
+	arrayBuffer() {
+		return consumeBody.call(this).then(function (buf) {
+			return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
+		});
+	},
+
+	/**
+  * Return raw response as Blob
+  *
+  * @return Promise
+  */
+	blob() {
+		let ct = this.headers && this.headers.get('content-type') || '';
+		return consumeBody.call(this).then(function (buf) {
+			return Object.assign(
+			// Prevent copying
+			new Blob([], {
+				type: ct.toLowerCase()
+			}), {
+				[BUFFER]: buf
+			});
+		});
+	},
+
+	/**
+  * Decode response as json
+  *
+  * @return  Promise
+  */
+	json() {
+		var _this2 = this;
+
+		return consumeBody.call(this).then(function (buffer) {
+			try {
+				return JSON.parse(buffer.toString());
+			} catch (err) {
+				return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json'));
+			}
+		});
+	},
+
+	/**
+  * Decode response as text
+  *
+  * @return  Promise
+  */
+	text() {
+		return consumeBody.call(this).then(function (buffer) {
+			return buffer.toString();
+		});
+	},
+
+	/**
+  * Decode response as buffer (non-spec api)
+  *
+  * @return  Promise
+  */
+	buffer() {
+		return consumeBody.call(this);
+	},
+
+	/**
+  * Decode response as text, while automatically detecting the encoding and
+  * trying to decode to UTF-8 (non-spec api)
+  *
+  * @return  Promise
+  */
+	textConverted() {
+		var _this3 = this;
+
+		return consumeBody.call(this).then(function (buffer) {
+			return convertBody(buffer, _this3.headers);
+		});
+	}
+};
+
+// In browsers, all properties are enumerable.
+Object.defineProperties(Body.prototype, {
+	body: { enumerable: true },
+	bodyUsed: { enumerable: true },
+	arrayBuffer: { enumerable: true },
+	blob: { enumerable: true },
+	json: { enumerable: true },
+	text: { enumerable: true }
+});
+
+Body.mixIn = function (proto) {
+	for (const name of Object.getOwnPropertyNames(Body.prototype)) {
+		// istanbul ignore else: future proof
+		if (!(name in proto)) {
+			const desc = Object.getOwnPropertyDescriptor(Body.prototype, name);
+			Object.defineProperty(proto, name, desc);
+		}
+	}
+};
+
+/**
+ * Consume and convert an entire Body to a Buffer.
+ *
+ * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body
+ *
+ * @return  Promise
+ */
+function consumeBody() {
+	var _this4 = this;
+
+	if (this[INTERNALS].disturbed) {
+		return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`));
+	}
+
+	this[INTERNALS].disturbed = true;
+
+	if (this[INTERNALS].error) {
+		return Body.Promise.reject(this[INTERNALS].error);
+	}
+
+	let body = this.body;
+
+	// body is null
+	if (body === null) {
+		return Body.Promise.resolve(Buffer.alloc(0));
+	}
+
+	// body is blob
+	if (isBlob(body)) {
+		body = body.stream();
+	}
+
+	// body is buffer
+	if (Buffer.isBuffer(body)) {
+		return Body.Promise.resolve(body);
+	}
+
+	// istanbul ignore if: should never happen
+	if (!(body instanceof Stream)) {
+		return Body.Promise.resolve(Buffer.alloc(0));
+	}
+
+	// body is stream
+	// get ready to actually consume the body
+	let accum = [];
+	let accumBytes = 0;
+	let abort = false;
+
+	return new Body.Promise(function (resolve, reject) {
+		let resTimeout;
+
+		// allow timeout on slow response body
+		if (_this4.timeout) {
+			resTimeout = setTimeout(function () {
+				abort = true;
+				reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout'));
+			}, _this4.timeout);
+		}
+
+		// handle stream errors
+		body.on('error', function (err) {
+			if (err.name === 'AbortError') {
+				// if the request was aborted, reject with this Error
+				abort = true;
+				reject(err);
+			} else {
+				// other errors, such as incorrect content-encoding
+				reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err));
+			}
+		});
+
+		body.on('data', function (chunk) {
+			if (abort || chunk === null) {
+				return;
+			}
+
+			if (_this4.size && accumBytes + chunk.length > _this4.size) {
+				abort = true;
+				reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size'));
+				return;
+			}
+
+			accumBytes += chunk.length;
+			accum.push(chunk);
+		});
+
+		body.on('end', function () {
+			if (abort) {
+				return;
+			}
+
+			clearTimeout(resTimeout);
+
+			try {
+				resolve(Buffer.concat(accum, accumBytes));
+			} catch (err) {
+				// handle streams that have accumulated too much data (issue #414)
+				reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err));
+			}
+		});
+	});
+}
+
+/**
+ * Detect buffer encoding and convert to target encoding
+ * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding
+ *
+ * @param   Buffer  buffer    Incoming buffer
+ * @param   String  encoding  Target encoding
+ * @return  String
+ */
+function convertBody(buffer, headers) {
+	if (typeof convert !== 'function') {
+		throw new Error('The package `encoding` must be installed to use the textConverted() function');
+	}
+
+	const ct = headers.get('content-type');
+	let charset = 'utf-8';
+	let res, str;
+
+	// header
+	if (ct) {
+		res = /charset=([^;]*)/i.exec(ct);
+	}
+
+	// no charset in content type, peek at response body for at most 1024 bytes
+	str = buffer.slice(0, 1024).toString();
+
+	// html5
+	if (!res && str) {
+		res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined;
+
+		this[MAP] = Object.create(null);
+
+		if (init instanceof Headers) {
+			const rawHeaders = init.raw();
+			const headerNames = Object.keys(rawHeaders);
+
+			for (const headerName of headerNames) {
+				for (const value of rawHeaders[headerName]) {
+					this.append(headerName, value);
+				}
+			}
+
+			return;
+		}
+
+		// We don't worry about converting prop to ByteString here as append()
+		// will handle it.
+		if (init == null) ; else if (typeof init === 'object') {
+			const method = init[Symbol.iterator];
+			if (method != null) {
+				if (typeof method !== 'function') {
+					throw new TypeError('Header pairs must be iterable');
+				}
+
+				// sequence>
+				// Note: per spec we have to first exhaust the lists then process them
+				const pairs = [];
+				for (const pair of init) {
+					if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') {
+						throw new TypeError('Each header pair must be iterable');
+					}
+					pairs.push(Array.from(pair));
+				}
+
+				for (const pair of pairs) {
+					if (pair.length !== 2) {
+						throw new TypeError('Each header pair must be a name/value tuple');
+					}
+					this.append(pair[0], pair[1]);
+				}
+			} else {
+				// record
+				for (const key of Object.keys(init)) {
+					const value = init[key];
+					this.append(key, value);
+				}
+			}
+		} else {
+			throw new TypeError('Provided initializer must be an object');
+		}
+	}
+
+	/**
+  * Return combined header value given name
+  *
+  * @param   String  name  Header name
+  * @return  Mixed
+  */
+	get(name) {
+		name = `${name}`;
+		validateName(name);
+		const key = find(this[MAP], name);
+		if (key === undefined) {
+			return null;
+		}
+
+		return this[MAP][key].join(', ');
+	}
+
+	/**
+  * Iterate over all headers
+  *
+  * @param   Function  callback  Executed for each item with parameters (value, name, thisArg)
+  * @param   Boolean   thisArg   `this` context for callback function
+  * @return  Void
+  */
+	forEach(callback) {
+		let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
+
+		let pairs = getHeaders(this);
+		let i = 0;
+		while (i < pairs.length) {
+			var _pairs$i = pairs[i];
+			const name = _pairs$i[0],
+			      value = _pairs$i[1];
+
+			callback.call(thisArg, value, name, this);
+			pairs = getHeaders(this);
+			i++;
+		}
+	}
+
+	/**
+  * Overwrite header values given name
+  *
+  * @param   String  name   Header name
+  * @param   String  value  Header value
+  * @return  Void
+  */
+	set(name, value) {
+		name = `${name}`;
+		value = `${value}`;
+		validateName(name);
+		validateValue(value);
+		const key = find(this[MAP], name);
+		this[MAP][key !== undefined ? key : name] = [value];
+	}
+
+	/**
+  * Append a value onto existing header
+  *
+  * @param   String  name   Header name
+  * @param   String  value  Header value
+  * @return  Void
+  */
+	append(name, value) {
+		name = `${name}`;
+		value = `${value}`;
+		validateName(name);
+		validateValue(value);
+		const key = find(this[MAP], name);
+		if (key !== undefined) {
+			this[MAP][key].push(value);
+		} else {
+			this[MAP][name] = [value];
+		}
+	}
+
+	/**
+  * Check for header name existence
+  *
+  * @param   String   name  Header name
+  * @return  Boolean
+  */
+	has(name) {
+		name = `${name}`;
+		validateName(name);
+		return find(this[MAP], name) !== undefined;
+	}
+
+	/**
+  * Delete all header values given name
+  *
+  * @param   String  name  Header name
+  * @return  Void
+  */
+	delete(name) {
+		name = `${name}`;
+		validateName(name);
+		const key = find(this[MAP], name);
+		if (key !== undefined) {
+			delete this[MAP][key];
+		}
+	}
+
+	/**
+  * Return raw headers (non-spec api)
+  *
+  * @return  Object
+  */
+	raw() {
+		return this[MAP];
+	}
+
+	/**
+  * Get an iterator on keys.
+  *
+  * @return  Iterator
+  */
+	keys() {
+		return createHeadersIterator(this, 'key');
+	}
+
+	/**
+  * Get an iterator on values.
+  *
+  * @return  Iterator
+  */
+	values() {
+		return createHeadersIterator(this, 'value');
+	}
+
+	/**
+  * Get an iterator on entries.
+  *
+  * This is the default iterator of the Headers object.
+  *
+  * @return  Iterator
+  */
+	[Symbol.iterator]() {
+		return createHeadersIterator(this, 'key+value');
+	}
+}
+Headers.prototype.entries = Headers.prototype[Symbol.iterator];
+
+Object.defineProperty(Headers.prototype, Symbol.toStringTag, {
+	value: 'Headers',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+Object.defineProperties(Headers.prototype, {
+	get: { enumerable: true },
+	forEach: { enumerable: true },
+	set: { enumerable: true },
+	append: { enumerable: true },
+	has: { enumerable: true },
+	delete: { enumerable: true },
+	keys: { enumerable: true },
+	values: { enumerable: true },
+	entries: { enumerable: true }
+});
+
+function getHeaders(headers) {
+	let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value';
+
+	const keys = Object.keys(headers[MAP]).sort();
+	return keys.map(kind === 'key' ? function (k) {
+		return k.toLowerCase();
+	} : kind === 'value' ? function (k) {
+		return headers[MAP][k].join(', ');
+	} : function (k) {
+		return [k.toLowerCase(), headers[MAP][k].join(', ')];
+	});
+}
+
+const INTERNAL = Symbol('internal');
+
+function createHeadersIterator(target, kind) {
+	const iterator = Object.create(HeadersIteratorPrototype);
+	iterator[INTERNAL] = {
+		target,
+		kind,
+		index: 0
+	};
+	return iterator;
+}
+
+const HeadersIteratorPrototype = Object.setPrototypeOf({
+	next() {
+		// istanbul ignore if
+		if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) {
+			throw new TypeError('Value of `this` is not a HeadersIterator');
+		}
+
+		var _INTERNAL = this[INTERNAL];
+		const target = _INTERNAL.target,
+		      kind = _INTERNAL.kind,
+		      index = _INTERNAL.index;
+
+		const values = getHeaders(target, kind);
+		const len = values.length;
+		if (index >= len) {
+			return {
+				value: undefined,
+				done: true
+			};
+		}
+
+		this[INTERNAL].index = index + 1;
+
+		return {
+			value: values[index],
+			done: false
+		};
+	}
+}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())));
+
+Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, {
+	value: 'HeadersIterator',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+/**
+ * Export the Headers object in a form that Node.js can consume.
+ *
+ * @param   Headers  headers
+ * @return  Object
+ */
+function exportNodeCompatibleHeaders(headers) {
+	const obj = Object.assign({ __proto__: null }, headers[MAP]);
+
+	// http.request() only supports string as Host header. This hack makes
+	// specifying custom Host header possible.
+	const hostHeaderKey = find(headers[MAP], 'Host');
+	if (hostHeaderKey !== undefined) {
+		obj[hostHeaderKey] = obj[hostHeaderKey][0];
+	}
+
+	return obj;
+}
+
+/**
+ * Create a Headers object from an object of headers, ignoring those that do
+ * not conform to HTTP grammar productions.
+ *
+ * @param   Object  obj  Object of headers
+ * @return  Headers
+ */
+function createHeadersLenient(obj) {
+	const headers = new Headers();
+	for (const name of Object.keys(obj)) {
+		if (invalidTokenRegex.test(name)) {
+			continue;
+		}
+		if (Array.isArray(obj[name])) {
+			for (const val of obj[name]) {
+				if (invalidHeaderCharRegex.test(val)) {
+					continue;
+				}
+				if (headers[MAP][name] === undefined) {
+					headers[MAP][name] = [val];
+				} else {
+					headers[MAP][name].push(val);
+				}
+			}
+		} else if (!invalidHeaderCharRegex.test(obj[name])) {
+			headers[MAP][name] = [obj[name]];
+		}
+	}
+	return headers;
+}
+
+const INTERNALS$1 = Symbol('Response internals');
+
+// fix an issue where "STATUS_CODES" aren't a named export for node <10
+const STATUS_CODES = http.STATUS_CODES;
+
+/**
+ * Response class
+ *
+ * @param   Stream  body  Readable stream
+ * @param   Object  opts  Response options
+ * @return  Void
+ */
+class Response {
+	constructor() {
+		let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
+		let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+		Body.call(this, body, opts);
+
+		const status = opts.status || 200;
+		const headers = new Headers(opts.headers);
+
+		if (body != null && !headers.has('Content-Type')) {
+			const contentType = extractContentType(body);
+			if (contentType) {
+				headers.append('Content-Type', contentType);
+			}
+		}
+
+		this[INTERNALS$1] = {
+			url: opts.url,
+			status,
+			statusText: opts.statusText || STATUS_CODES[status],
+			headers,
+			counter: opts.counter
+		};
+	}
+
+	get url() {
+		return this[INTERNALS$1].url || '';
+	}
+
+	get status() {
+		return this[INTERNALS$1].status;
+	}
+
+	/**
+  * Convenience property representing if the request ended normally
+  */
+	get ok() {
+		return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300;
+	}
+
+	get redirected() {
+		return this[INTERNALS$1].counter > 0;
+	}
+
+	get statusText() {
+		return this[INTERNALS$1].statusText;
+	}
+
+	get headers() {
+		return this[INTERNALS$1].headers;
+	}
+
+	/**
+  * Clone this response
+  *
+  * @return  Response
+  */
+	clone() {
+		return new Response(clone(this), {
+			url: this.url,
+			status: this.status,
+			statusText: this.statusText,
+			headers: this.headers,
+			ok: this.ok,
+			redirected: this.redirected
+		});
+	}
+}
+
+Body.mixIn(Response.prototype);
+
+Object.defineProperties(Response.prototype, {
+	url: { enumerable: true },
+	status: { enumerable: true },
+	ok: { enumerable: true },
+	redirected: { enumerable: true },
+	statusText: { enumerable: true },
+	headers: { enumerable: true },
+	clone: { enumerable: true }
+});
+
+Object.defineProperty(Response.prototype, Symbol.toStringTag, {
+	value: 'Response',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+const INTERNALS$2 = Symbol('Request internals');
+const URL = Url.URL || whatwgUrl.URL;
+
+// fix an issue where "format", "parse" aren't a named export for node <10
+const parse_url = Url.parse;
+const format_url = Url.format;
+
+/**
+ * Wrapper around `new URL` to handle arbitrary URLs
+ *
+ * @param  {string} urlStr
+ * @return {void}
+ */
+function parseURL(urlStr) {
+	/*
+ 	Check whether the URL is absolute or not
+ 		Scheme: https://tools.ietf.org/html/rfc3986#section-3.1
+ 	Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3
+ */
+	if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) {
+		urlStr = new URL(urlStr).toString();
+	}
+
+	// Fallback to old implementation for arbitrary URLs
+	return parse_url(urlStr);
+}
+
+const streamDestructionSupported = 'destroy' in Stream.Readable.prototype;
+
+/**
+ * Check if a value is an instance of Request.
+ *
+ * @param   Mixed   input
+ * @return  Boolean
+ */
+function isRequest(input) {
+	return typeof input === 'object' && typeof input[INTERNALS$2] === 'object';
+}
+
+function isAbortSignal(signal) {
+	const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal);
+	return !!(proto && proto.constructor.name === 'AbortSignal');
+}
+
+/**
+ * Request class
+ *
+ * @param   Mixed   input  Url or Request instance
+ * @param   Object  init   Custom options
+ * @return  Void
+ */
+class Request {
+	constructor(input) {
+		let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+		let parsedURL;
+
+		// normalize input
+		if (!isRequest(input)) {
+			if (input && input.href) {
+				// in order to support Node.js' Url objects; though WHATWG's URL objects
+				// will fall into this branch also (since their `toString()` will return
+				// `href` property anyway)
+				parsedURL = parseURL(input.href);
+			} else {
+				// coerce input to a string before attempting to parse
+				parsedURL = parseURL(`${input}`);
+			}
+			input = {};
+		} else {
+			parsedURL = parseURL(input.url);
+		}
+
+		let method = init.method || input.method || 'GET';
+		method = method.toUpperCase();
+
+		if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) {
+			throw new TypeError('Request with GET/HEAD method cannot have body');
+		}
+
+		let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null;
+
+		Body.call(this, inputBody, {
+			timeout: init.timeout || input.timeout || 0,
+			size: init.size || input.size || 0
+		});
+
+		const headers = new Headers(init.headers || input.headers || {});
+
+		if (inputBody != null && !headers.has('Content-Type')) {
+			const contentType = extractContentType(inputBody);
+			if (contentType) {
+				headers.append('Content-Type', contentType);
+			}
+		}
+
+		let signal = isRequest(input) ? input.signal : null;
+		if ('signal' in init) signal = init.signal;
+
+		if (signal != null && !isAbortSignal(signal)) {
+			throw new TypeError('Expected signal to be an instanceof AbortSignal');
+		}
+
+		this[INTERNALS$2] = {
+			method,
+			redirect: init.redirect || input.redirect || 'follow',
+			headers,
+			parsedURL,
+			signal
+		};
+
+		// node-fetch-only options
+		this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20;
+		this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true;
+		this.counter = init.counter || input.counter || 0;
+		this.agent = init.agent || input.agent;
+	}
+
+	get method() {
+		return this[INTERNALS$2].method;
+	}
+
+	get url() {
+		return format_url(this[INTERNALS$2].parsedURL);
+	}
+
+	get headers() {
+		return this[INTERNALS$2].headers;
+	}
+
+	get redirect() {
+		return this[INTERNALS$2].redirect;
+	}
+
+	get signal() {
+		return this[INTERNALS$2].signal;
+	}
+
+	/**
+  * Clone this request
+  *
+  * @return  Request
+  */
+	clone() {
+		return new Request(this);
+	}
+}
+
+Body.mixIn(Request.prototype);
+
+Object.defineProperty(Request.prototype, Symbol.toStringTag, {
+	value: 'Request',
+	writable: false,
+	enumerable: false,
+	configurable: true
+});
+
+Object.defineProperties(Request.prototype, {
+	method: { enumerable: true },
+	url: { enumerable: true },
+	headers: { enumerable: true },
+	redirect: { enumerable: true },
+	clone: { enumerable: true },
+	signal: { enumerable: true }
+});
+
+/**
+ * Convert a Request to Node.js http request options.
+ *
+ * @param   Request  A Request instance
+ * @return  Object   The options object to be passed to http.request
+ */
+function getNodeRequestOptions(request) {
+	const parsedURL = request[INTERNALS$2].parsedURL;
+	const headers = new Headers(request[INTERNALS$2].headers);
+
+	// fetch step 1.3
+	if (!headers.has('Accept')) {
+		headers.set('Accept', '*/*');
+	}
+
+	// Basic fetch
+	if (!parsedURL.protocol || !parsedURL.hostname) {
+		throw new TypeError('Only absolute URLs are supported');
+	}
+
+	if (!/^https?:$/.test(parsedURL.protocol)) {
+		throw new TypeError('Only HTTP(S) protocols are supported');
+	}
+
+	if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) {
+		throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8');
+	}
+
+	// HTTP-network-or-cache fetch steps 2.4-2.7
+	let contentLengthValue = null;
+	if (request.body == null && /^(POST|PUT)$/i.test(request.method)) {
+		contentLengthValue = '0';
+	}
+	if (request.body != null) {
+		const totalBytes = getTotalBytes(request);
+		if (typeof totalBytes === 'number') {
+			contentLengthValue = String(totalBytes);
+		}
+	}
+	if (contentLengthValue) {
+		headers.set('Content-Length', contentLengthValue);
+	}
+
+	// HTTP-network-or-cache fetch step 2.11
+	if (!headers.has('User-Agent')) {
+		headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)');
+	}
+
+	// HTTP-network-or-cache fetch step 2.15
+	if (request.compress && !headers.has('Accept-Encoding')) {
+		headers.set('Accept-Encoding', 'gzip,deflate');
+	}
+
+	let agent = request.agent;
+	if (typeof agent === 'function') {
+		agent = agent(parsedURL);
+	}
+
+	// HTTP-network fetch step 4.2
+	// chunked encoding is handled by Node.js
+
+	return Object.assign({}, parsedURL, {
+		method: request.method,
+		headers: exportNodeCompatibleHeaders(headers),
+		agent
+	});
+}
+
+/**
+ * abort-error.js
+ *
+ * AbortError interface for cancelled requests
+ */
+
+/**
+ * Create AbortError instance
+ *
+ * @param   String      message      Error message for human
+ * @return  AbortError
+ */
+function AbortError(message) {
+  Error.call(this, message);
+
+  this.type = 'aborted';
+  this.message = message;
+
+  // hide custom error implementation details from end-users
+  Error.captureStackTrace(this, this.constructor);
+}
+
+AbortError.prototype = Object.create(Error.prototype);
+AbortError.prototype.constructor = AbortError;
+AbortError.prototype.name = 'AbortError';
+
+const URL$1 = Url.URL || whatwgUrl.URL;
+
+// fix an issue where "PassThrough", "resolve" aren't a named export for node <10
+const PassThrough$1 = Stream.PassThrough;
+
+const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) {
+	const orig = new URL$1(original).hostname;
+	const dest = new URL$1(destination).hostname;
+
+	return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest);
+};
+
+/**
+ * isSameProtocol reports whether the two provided URLs use the same protocol.
+ *
+ * Both domains must already be in canonical form.
+ * @param {string|URL} original
+ * @param {string|URL} destination
+ */
+const isSameProtocol = function isSameProtocol(destination, original) {
+	const orig = new URL$1(original).protocol;
+	const dest = new URL$1(destination).protocol;
+
+	return orig === dest;
+};
+
+/**
+ * Fetch function
+ *
+ * @param   Mixed    url   Absolute url or Request instance
+ * @param   Object   opts  Fetch options
+ * @return  Promise
+ */
+function fetch(url, opts) {
+
+	// allow custom promise
+	if (!fetch.Promise) {
+		throw new Error('native promise missing, set fetch.Promise to your favorite alternative');
+	}
+
+	Body.Promise = fetch.Promise;
+
+	// wrap http.request into fetch
+	return new fetch.Promise(function (resolve, reject) {
+		// build request object
+		const request = new Request(url, opts);
+		const options = getNodeRequestOptions(request);
+
+		const send = (options.protocol === 'https:' ? https : http).request;
+		const signal = request.signal;
+
+		let response = null;
+
+		const abort = function abort() {
+			let error = new AbortError('The user aborted a request.');
+			reject(error);
+			if (request.body && request.body instanceof Stream.Readable) {
+				destroyStream(request.body, error);
+			}
+			if (!response || !response.body) return;
+			response.body.emit('error', error);
+		};
+
+		if (signal && signal.aborted) {
+			abort();
+			return;
+		}
+
+		const abortAndFinalize = function abortAndFinalize() {
+			abort();
+			finalize();
+		};
+
+		// send request
+		const req = send(options);
+		let reqTimeout;
+
+		if (signal) {
+			signal.addEventListener('abort', abortAndFinalize);
+		}
+
+		function finalize() {
+			req.abort();
+			if (signal) signal.removeEventListener('abort', abortAndFinalize);
+			clearTimeout(reqTimeout);
+		}
+
+		if (request.timeout) {
+			req.once('socket', function (socket) {
+				reqTimeout = setTimeout(function () {
+					reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout'));
+					finalize();
+				}, request.timeout);
+			});
+		}
+
+		req.on('error', function (err) {
+			reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err));
+
+			if (response && response.body) {
+				destroyStream(response.body, err);
+			}
+
+			finalize();
+		});
+
+		fixResponseChunkedTransferBadEnding(req, function (err) {
+			if (signal && signal.aborted) {
+				return;
+			}
+
+			if (response && response.body) {
+				destroyStream(response.body, err);
+			}
+		});
+
+		/* c8 ignore next 18 */
+		if (parseInt(process.version.substring(1)) < 14) {
+			// Before Node.js 14, pipeline() does not fully support async iterators and does not always
+			// properly handle when the socket close/end events are out of order.
+			req.on('socket', function (s) {
+				s.addListener('close', function (hadError) {
+					// if a data listener is still present we didn't end cleanly
+					const hasDataListener = s.listenerCount('data') > 0;
+
+					// if end happened before close but the socket didn't emit an error, do it now
+					if (response && hasDataListener && !hadError && !(signal && signal.aborted)) {
+						const err = new Error('Premature close');
+						err.code = 'ERR_STREAM_PREMATURE_CLOSE';
+						response.body.emit('error', err);
+					}
+				});
+			});
+		}
+
+		req.on('response', function (res) {
+			clearTimeout(reqTimeout);
+
+			const headers = createHeadersLenient(res.headers);
+
+			// HTTP fetch step 5
+			if (fetch.isRedirect(res.statusCode)) {
+				// HTTP fetch step 5.2
+				const location = headers.get('Location');
+
+				// HTTP fetch step 5.3
+				let locationURL = null;
+				try {
+					locationURL = location === null ? null : new URL$1(location, request.url).toString();
+				} catch (err) {
+					// error here can only be invalid URL in Location: header
+					// do not throw when options.redirect == manual
+					// let the user extract the errorneous redirect URL
+					if (request.redirect !== 'manual') {
+						reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect'));
+						finalize();
+						return;
+					}
+				}
+
+				// HTTP fetch step 5.5
+				switch (request.redirect) {
+					case 'error':
+						reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect'));
+						finalize();
+						return;
+					case 'manual':
+						// node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL.
+						if (locationURL !== null) {
+							// handle corrupted header
+							try {
+								headers.set('Location', locationURL);
+							} catch (err) {
+								// istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request
+								reject(err);
+							}
+						}
+						break;
+					case 'follow':
+						// HTTP-redirect fetch step 2
+						if (locationURL === null) {
+							break;
+						}
+
+						// HTTP-redirect fetch step 5
+						if (request.counter >= request.follow) {
+							reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect'));
+							finalize();
+							return;
+						}
+
+						// HTTP-redirect fetch step 6 (counter increment)
+						// Create a new Request object.
+						const requestOpts = {
+							headers: new Headers(request.headers),
+							follow: request.follow,
+							counter: request.counter + 1,
+							agent: request.agent,
+							compress: request.compress,
+							method: request.method,
+							body: request.body,
+							signal: request.signal,
+							timeout: request.timeout,
+							size: request.size
+						};
+
+						if (!isDomainOrSubdomain(request.url, locationURL) || !isSameProtocol(request.url, locationURL)) {
+							for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) {
+								requestOpts.headers.delete(name);
+							}
+						}
+
+						// HTTP-redirect fetch step 9
+						if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) {
+							reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect'));
+							finalize();
+							return;
+						}
+
+						// HTTP-redirect fetch step 11
+						if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') {
+							requestOpts.method = 'GET';
+							requestOpts.body = undefined;
+							requestOpts.headers.delete('content-length');
+						}
+
+						// HTTP-redirect fetch step 15
+						resolve(fetch(new Request(locationURL, requestOpts)));
+						finalize();
+						return;
+				}
+			}
+
+			// prepare response
+			res.once('end', function () {
+				if (signal) signal.removeEventListener('abort', abortAndFinalize);
+			});
+			let body = res.pipe(new PassThrough$1());
+
+			const response_options = {
+				url: request.url,
+				status: res.statusCode,
+				statusText: res.statusMessage,
+				headers: headers,
+				size: request.size,
+				timeout: request.timeout,
+				counter: request.counter
+			};
+
+			// HTTP-network fetch step 12.1.1.3
+			const codings = headers.get('Content-Encoding');
+
+			// HTTP-network fetch step 12.1.1.4: handle content codings
+
+			// in following scenarios we ignore compression support
+			// 1. compression support is disabled
+			// 2. HEAD request
+			// 3. no Content-Encoding header
+			// 4. no content response (204)
+			// 5. content not modified response (304)
+			if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) {
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// For Node v6+
+			// Be less strict when decoding compressed responses, since sometimes
+			// servers send slightly invalid responses that are still accepted
+			// by common browsers.
+			// Always using Z_SYNC_FLUSH is what cURL does.
+			const zlibOptions = {
+				flush: zlib.Z_SYNC_FLUSH,
+				finishFlush: zlib.Z_SYNC_FLUSH
+			};
+
+			// for gzip
+			if (codings == 'gzip' || codings == 'x-gzip') {
+				body = body.pipe(zlib.createGunzip(zlibOptions));
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// for deflate
+			if (codings == 'deflate' || codings == 'x-deflate') {
+				// handle the infamous raw deflate response from old servers
+				// a hack for old IIS and Apache servers
+				const raw = res.pipe(new PassThrough$1());
+				raw.once('data', function (chunk) {
+					// see http://stackoverflow.com/questions/37519828
+					if ((chunk[0] & 0x0F) === 0x08) {
+						body = body.pipe(zlib.createInflate());
+					} else {
+						body = body.pipe(zlib.createInflateRaw());
+					}
+					response = new Response(body, response_options);
+					resolve(response);
+				});
+				raw.on('end', function () {
+					// some old IIS servers return zero-length OK deflate responses, so 'data' is never emitted.
+					if (!response) {
+						response = new Response(body, response_options);
+						resolve(response);
+					}
+				});
+				return;
+			}
+
+			// for br
+			if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') {
+				body = body.pipe(zlib.createBrotliDecompress());
+				response = new Response(body, response_options);
+				resolve(response);
+				return;
+			}
+
+			// otherwise, use response as-is
+			response = new Response(body, response_options);
+			resolve(response);
+		});
+
+		writeToStream(req, request);
+	});
+}
+function fixResponseChunkedTransferBadEnding(request, errorCallback) {
+	let socket;
+
+	request.on('socket', function (s) {
+		socket = s;
+	});
+
+	request.on('response', function (response) {
+		const headers = response.headers;
+
+		if (headers['transfer-encoding'] === 'chunked' && !headers['content-length']) {
+			response.once('close', function (hadError) {
+				// tests for socket presence, as in some situations the
+				// the 'socket' event is not triggered for the request
+				// (happens in deno), avoids `TypeError`
+				// if a data listener is still present we didn't end cleanly
+				const hasDataListener = socket && socket.listenerCount('data') > 0;
+
+				if (hasDataListener && !hadError) {
+					const err = new Error('Premature close');
+					err.code = 'ERR_STREAM_PREMATURE_CLOSE';
+					errorCallback(err);
+				}
+			});
+		}
+	});
+}
+
+function destroyStream(stream, err) {
+	if (stream.destroy) {
+		stream.destroy(err);
+	} else {
+		// node < 8
+		stream.emit('error', err);
+		stream.end();
+	}
+}
+
+/**
+ * Redirect code matching
+ *
+ * @param   Number   code  Status code
+ * @return  Boolean
+ */
+fetch.isRedirect = function (code) {
+	return code === 301 || code === 302 || code === 303 || code === 307 || code === 308;
+};
+
+// expose Promise
+fetch.Promise = global.Promise;
+
+export default fetch;
+export { Headers, Request, Response, FetchError, AbortError };
diff --git a/@capacitor/assets/node_modules/node-fetch/package.json b/@capacitor/assets/node_modules/node-fetch/package.json
new file mode 100644
index 00000000..e0be1768
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-fetch/package.json
@@ -0,0 +1,89 @@
+{
+    "name": "node-fetch",
+    "version": "2.7.0",
+    "description": "A light-weight module that brings window.fetch to node.js",
+    "main": "lib/index.js",
+    "browser": "./browser.js",
+    "module": "lib/index.mjs",
+    "files": [
+        "lib/index.js",
+        "lib/index.mjs",
+        "lib/index.es.js",
+        "browser.js"
+    ],
+    "engines": {
+        "node": "4.x || >=6.0.0"
+    },
+    "scripts": {
+        "build": "cross-env BABEL_ENV=rollup rollup -c",
+        "prepare": "npm run build",
+        "test": "cross-env BABEL_ENV=test mocha --require babel-register --throw-deprecation test/test.js",
+        "report": "cross-env BABEL_ENV=coverage nyc --reporter lcov --reporter text mocha -R spec test/test.js",
+        "coverage": "cross-env BABEL_ENV=coverage nyc --reporter json --reporter text mocha -R spec test/test.js && codecov -f coverage/coverage-final.json"
+    },
+    "repository": {
+        "type": "git",
+        "url": "https://github.com/bitinn/node-fetch.git"
+    },
+    "keywords": [
+        "fetch",
+        "http",
+        "promise"
+    ],
+    "author": "David Frank",
+    "license": "MIT",
+    "bugs": {
+        "url": "https://github.com/bitinn/node-fetch/issues"
+    },
+    "homepage": "https://github.com/bitinn/node-fetch",
+    "dependencies": {
+        "whatwg-url": "^5.0.0"
+    },
+    "peerDependencies": {
+        "encoding": "^0.1.0"
+    },
+    "peerDependenciesMeta": {
+        "encoding": {
+            "optional": true
+        }
+    },
+    "devDependencies": {
+        "@ungap/url-search-params": "^0.1.2",
+        "abort-controller": "^1.1.0",
+        "abortcontroller-polyfill": "^1.3.0",
+        "babel-core": "^6.26.3",
+        "babel-plugin-istanbul": "^4.1.6",
+        "babel-plugin-transform-async-generator-functions": "^6.24.1",
+        "babel-polyfill": "^6.26.0",
+        "babel-preset-env": "1.4.0",
+        "babel-register": "^6.16.3",
+        "chai": "^3.5.0",
+        "chai-as-promised": "^7.1.1",
+        "chai-iterator": "^1.1.1",
+        "chai-string": "~1.3.0",
+        "codecov": "3.3.0",
+        "cross-env": "^5.2.0",
+        "form-data": "^2.3.3",
+        "is-builtin-module": "^1.0.0",
+        "mocha": "^5.0.0",
+        "nyc": "11.9.0",
+        "parted": "^0.1.1",
+        "promise": "^8.0.3",
+        "resumer": "0.0.0",
+        "rollup": "^0.63.4",
+        "rollup-plugin-babel": "^3.0.7",
+        "string-to-arraybuffer": "^1.0.2",
+        "teeny-request": "3.7.0"
+    },
+    "release": {
+        "branches": [
+            "+([0-9]).x",
+            "main",
+            "next",
+            {
+                "name": "beta",
+                "prerelease": true
+            }
+        ]
+    }
+}
diff --git a/@capacitor/assets/node_modules/node-html-parser/CHANGELOG.md b/@capacitor/assets/node_modules/node-html-parser/CHANGELOG.md
new file mode 100755
index 00000000..2de37018
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-html-parser/CHANGELOG.md
@@ -0,0 +1,30 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+### [5.4.2](https://github.com/taoqf/node-fast-html-parser/compare/v5.4.2-0...v5.4.2) (2022-08-30)
+
+## [5.1.0](https://github.com/taoqf/node-fast-html-parser/compare/v4.1.5...v5.1.0) (2021-10-28)
+
+### Features
+
+* Exposed `HTMLElement#rawAttrs` (made public) ([34f1595](https://github.com/taoqf/node-fast-html-parser/commit/34f1595756c0974b6ae7ef5755a615f09e421f32))
+
+## [5.0.0](https://github.com/taoqf/node-fast-html-parser/compare/v4.1.5...v5.0.0) (2021-10-10)
+
+
+### ⚠ BREAKING CHANGES
+
+* Added esm named export support ([0d4b922](https://github.com/taoqf/node-fast-html-parser/commit/0d4b922eefd6210fe802991e464b21b0c69d5f63))
+
+### Features
+
+* Added esm named export support (closes [#160](https://github.com/taoqf/node-fast-html-parser/issues/160) closes [#139](https://github.com/taoqf/node-fast-html-parser/issues/139)) ([0d4b922](https://github.com/taoqf/node-fast-html-parser/commit/0d4b922eefd6210fe802991e464b21b0c69d5f63))
+* Added HTMLElement#getElementsByTagName ([d462e44](https://github.com/taoqf/node-fast-html-parser/commit/d462e449e7ebb00a5a43fb574133681ad5a62475))
+* Improved parsing performance + matching (closes [#164](https://github.com/taoqf/node-fast-html-parser/issues/164)) ([3c5b8e2](https://github.com/taoqf/node-fast-html-parser/commit/3c5b8e2a9104b01a8ca899a7970507463e42adaf))
+
+
+### Bug Fixes
+
+* Add null to return type for HTMLElement#querySelector (closes [#157](https://github.com/taoqf/node-fast-html-parser/issues/157)) ([2b65583](https://github.com/taoqf/node-fast-html-parser/commit/2b655839bd3868c41fb19cae5786ca097565bc7f))
+* blockTextElements incorrectly matching partial tag (detail) (fixes [#156](https://github.com/taoqf/node-fast-html-parser/issues/156) fixes [#124](https://github.com/taoqf/node-fast-html-parser/issues/124)) ([6823349](https://github.com/taoqf/node-fast-html-parser/commit/6823349fdf1809c7484c70d948aa24930ef4983f))
diff --git a/@capacitor/assets/node_modules/node-html-parser/LICENSE b/@capacitor/assets/node_modules/node-html-parser/LICENSE
new file mode 100644
index 00000000..ac22f779
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-html-parser/LICENSE
@@ -0,0 +1,7 @@
+Copyright 2019 Tao Qiufeng
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/@capacitor/assets/node_modules/node-html-parser/README.md b/@capacitor/assets/node_modules/node-html-parser/README.md
new file mode 100644
index 00000000..c2c6c0b0
--- /dev/null
+++ b/@capacitor/assets/node_modules/node-html-parser/README.md
@@ -0,0 +1,286 @@
+# Fast HTML Parser [![NPM version](https://badge.fury.io/js/node-html-parser.png)](http://badge.fury.io/js/node-html-parser) [![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Ftaoqf%2Fnode-html-parser%2Fbadge%3Fref%3Dmain&style=flat)](https://actions-badge.atrox.dev/taoqf/node-html-parser/goto?ref=main)
+
+Fast HTML Parser is a _very fast_ HTML parser. Which will generate a simplified
+DOM tree, with element query support.
+
+Per the design, it intends to parse massive HTML files in lowest price, thus the
+performance is the top priority.  For this reason, some malformatted HTML may not
+be able to parse correctly, but most usual errors are covered (eg. HTML4 style
+no closing `
  • `, `` etc). + +## Install + + +```shell +npm install --save node-html-parser +``` + +> Note: when using Fast HTML Parser in a Typescript project the minimum Typescript version supported is `^4.1.2`. + +## Performance + +-- 2022-08-10 + +```shell +html-parser :24.1595 ms/file ± 18.7667 +htmljs-parser :4.72064 ms/file ± 5.67689 +html-dom-parser :2.18055 ms/file ± 2.96136 +html5parser :1.69639 ms/file ± 2.17111 +cheerio :12.2122 ms/file ± 8.10916 +parse5 :6.50626 ms/file ± 4.02352 +htmlparser2 :2.38179 ms/file ± 3.42389 +htmlparser :17.4820 ms/file ± 128.041 +high5 :3.95188 ms/file ± 2.52313 +node-html-parser:2.04288 ms/file ± 1.25203 +node-html-parser (last release):2.00527 ms/file ± 1.21317 +``` + +Tested with [htmlparser-benchmark](https://github.com/AndreasMadsen/htmlparser-benchmark). + +## Usage + +```ts +import { parse } from 'node-html-parser'; + +const root = parse('
    • Hello World
    '); + +console.log(root.firstChild.structure); +// ul#list +// li +// #text + +console.log(root.querySelector('#list')); +// { tagName: 'ul', +// rawAttrs: 'id="list"', +// childNodes: +// [ { tagName: 'li', +// rawAttrs: '', +// childNodes: [Object], +// classNames: [] } ], +// id: 'list', +// classNames: [] } +console.log(root.toString()); +//
    • Hello World
    +root.set_content('
  • Hello World
  • '); +root.toString(); //
  • Hello World
  • +``` + +```js +var HTMLParser = require('node-html-parser'); + +var root = HTMLParser.parse('
    • Hello World
    '); +``` + +## Global Methods + +### parse(data[, options]) + +Parse the data provided, and return the root of the generated DOM. + +- **data**, data to parse +- **options**, parse options + + ```js + { + lowerCaseTagName: false, // convert tag name to lower case (hurts performance heavily) + comment: false, // retrieve comments (hurts performance slightly) + voidTag:{ + tags: ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'], // optional and case insensitive, default value is ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'] + addClosingSlash: true // optional, default false. void tag serialisation, add a final slash
    + }, + blockTextElements: { + script: true, // keep text content when parsing + noscript: true, // keep text content when parsing + style: true, // keep text content when parsing + pre: true // keep text content when parsing + } + } + ``` + +### valid(data[, options]) + +Parse the data provided, return true if the given data is valid, and return false if not. + +## HTMLElement Methods + +### HTMLElement#trimRight() + +Trim element from right (in block) after seeing pattern in a TextNode. + +### HTMLElement#removeWhitespace() + +Remove whitespaces in this sub tree. + +### HTMLElement#querySelectorAll(selector) + +Query CSS selector to find matching nodes. + +Note: Full range of CSS3 selectors supported since v3.0.0. + +### HTMLElement#querySelector(selector) + +Query CSS Selector to find matching node. + +### HTMLElement#getElementsByTagName(tagName) + +Get all elements with the specified tagName. + +Note: Use * for all elements. + +### HTMLElement#closest(selector) + +Query closest element by css selector. + +### HTMLElement#appendChild(node) + +Append a child node to childNodes + +### HTMLElement#insertAdjacentHTML(where, html) + +Parses the specified text as HTML and inserts the resulting nodes into the DOM tree at a specified position. + +### HTMLElement#setAttribute(key: string, value: string) + +Set `value` to `key` attribute. + +### HTMLElement#setAttributes(attrs: Record) + +Set attributes of the element. + +### HTMLElement#removeAttribute(key: string) + +Remove `key` attribute. + +### HTMLElement#getAttribute(key: string) + +Get `key` attribute. + +### HTMLElement#exchangeChild(oldNode: Node, newNode: Node) + +Exchanges given child with new child. + +### HTMLElement#removeChild(node: Node) + +Remove child node. + +### HTMLElement#toString() + +Same as [outerHTML](#htmlelementouterhtml) + +### HTMLElement#set_content(content: string | Node | Node[]) + +Set content. **Notice**: Do not set content of the **root** node. + +### HTMLElement#remove() + +Remove current element. + +### HTMLElement#replaceWith(...nodes: (string | Node)[]) + +Replace current element with other node(s). + +### HTMLElement#classList + +#### HTMLElement#classList.add + +Add class name. + +#### HTMLElement#classList.replace(old: string, new: string) + +Replace class name with another one. + +#### HTMLElement#classList.remove() + +Remove class name. + +#### HTMLElement#classList.toggle(className: string):void + +Toggle class. Remove it if it is already included, otherwise add. + +#### HTMLElement#classList.contains(className: string): boolean + +Returns true if the classname is already in the classList. + +#### HTMLElement#classList.values() + +Get class names. + +#### Node#clone() + +Clone a node. + +#### Node#getElementById(id: string): HTMLElement; + +Get element by it's ID. + +## HTMLElement Properties + +### HTMLElement#text + +Get unescaped text value of current node and its children. Like `innerText`. +(slow for the first time) + +### HTMLElement#rawText + +Get escaped (as-is) text value of current node and its children. May have +`&` in it. (fast) + +### HTMLElement#tagName + +Get or Set tag name of HTMLElement. Notice: the returned value would be an uppercase string. + +### HTMLElement#structuredText + +Get structured Text. + +### HTMLElement#structure + +Get DOM structure. + +### HTMLElement#firstChild + +Get first child node. + +### HTMLElement#lastChild + +Get last child node. + +### HTMLElement#innerHTML + +Set or Get innerHTML. + +### HTMLElement#outerHTML + +Get outerHTML. + +### HTMLElement#nextSibling + +Returns a reference to the next child node of the current element's parent. + +### HTMLElement#nextElementSibling + +Returns a reference to the next child element of the current element's parent. + +### HTMLElement#previousSibling + +Returns a reference to the previous child node of the current element's parent. + +### HTMLElement#previousElementSibling + +Returns a reference to the previous child element of the current element's parent. + +### HTMLElement#textContent + +Get or Set textContent of current element, more efficient than [set_content](#htmlelementset_contentcontent-string--node--node). + +### HTMLElement#attributes + +Get all attributes of current element. **Notice: do not try to change the returned value.** + +### HTMLElement#classList + +Get all attributes of current element. **Notice: do not try to change the returned value.** + +### HTMLElement#range + +Corresponding source code start and end indexes (ie [ 0, 40 ]) diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/back.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/back.d.ts new file mode 100644 index 00000000..a04d14be --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/back.d.ts @@ -0,0 +1 @@ +export default function arr_back(arr: T[]): T; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/back.js b/@capacitor/assets/node_modules/node-html-parser/dist/back.js new file mode 100644 index 00000000..ba0664a0 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/back.js @@ -0,0 +1,6 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function arr_back(arr) { + return arr[arr.length - 1]; +} +exports.default = arr_back; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/index.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/index.d.ts new file mode 100644 index 00000000..db0354e4 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/index.d.ts @@ -0,0 +1,20 @@ +import CommentNode from './nodes/comment'; +import HTMLElement, { Options } from './nodes/html'; +import Node from './nodes/node'; +import TextNode from './nodes/text'; +import NodeType from './nodes/type'; +import baseParse from './parse'; +import valid from './valid'; +export { Options } from './nodes/html'; +export { parse, HTMLElement, CommentNode, valid, Node, TextNode, NodeType }; +declare function parse(data: string, options?: Partial): HTMLElement; +declare namespace parse { + var parse: typeof baseParse; + var HTMLElement: typeof import("./nodes/html").default; + var CommentNode: typeof import("./nodes/comment").default; + var valid: typeof import("./valid").default; + var Node: typeof import("./nodes/node").default; + var TextNode: typeof import("./nodes/text").default; + var NodeType: typeof import("./nodes/type").default; +} +export default parse; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/index.js b/@capacitor/assets/node_modules/node-html-parser/dist/index.js new file mode 100644 index 00000000..5993360e --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/index.js @@ -0,0 +1,35 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.NodeType = exports.TextNode = exports.Node = exports.valid = exports.CommentNode = exports.HTMLElement = exports.parse = void 0; +var comment_1 = __importDefault(require("./nodes/comment")); +exports.CommentNode = comment_1.default; +var html_1 = __importDefault(require("./nodes/html")); +exports.HTMLElement = html_1.default; +var node_1 = __importDefault(require("./nodes/node")); +exports.Node = node_1.default; +var text_1 = __importDefault(require("./nodes/text")); +exports.TextNode = text_1.default; +var type_1 = __importDefault(require("./nodes/type")); +exports.NodeType = type_1.default; +var parse_1 = __importDefault(require("./parse")); +var valid_1 = __importDefault(require("./valid")); +exports.valid = valid_1.default; +function parse(data, options) { + if (options === void 0) { options = { + lowerCaseTagName: false, + comment: false + }; } + return (0, parse_1.default)(data, options); +} +exports.default = parse; +exports.parse = parse; +parse.parse = parse_1.default; +parse.HTMLElement = html_1.default; +parse.CommentNode = comment_1.default; +parse.valid = valid_1.default; +parse.Node = node_1.default; +parse.TextNode = text_1.default; +parse.NodeType = type_1.default; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/main.js b/@capacitor/assets/node_modules/node-html-parser/dist/main.js new file mode 100644 index 00000000..d38360f1 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/main.js @@ -0,0 +1,1664 @@ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +define("back", ["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + function arr_back(arr) { + return arr[arr.length - 1]; + } + exports.default = arr_back; +}); +define("nodes/type", ["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var NodeType; + (function (NodeType) { + NodeType[NodeType["ELEMENT_NODE"] = 1] = "ELEMENT_NODE"; + NodeType[NodeType["TEXT_NODE"] = 3] = "TEXT_NODE"; + NodeType[NodeType["COMMENT_NODE"] = 8] = "COMMENT_NODE"; + })(NodeType || (NodeType = {})); + exports.default = NodeType; +}); +define("nodes/node", ["require", "exports", "he"], function (require, exports, he_1) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + /** + * Node Class as base class for TextNode and HTMLElement. + */ + var Node = /** @class */ (function () { + function Node(parentNode, range) { + if (parentNode === void 0) { parentNode = null; } + this.parentNode = parentNode; + this.childNodes = []; + Object.defineProperty(this, 'range', { + enumerable: false, + writable: true, + configurable: true, + value: range !== null && range !== void 0 ? range : [-1, -1] + }); + } + /** + * Remove current node + */ + Node.prototype.remove = function () { + var _this = this; + if (this.parentNode) { + var children = this.parentNode.childNodes; + this.parentNode.childNodes = children.filter(function (child) { + return _this !== child; + }); + this.parentNode = null; + } + return this; + }; + Object.defineProperty(Node.prototype, "innerText", { + get: function () { + return this.rawText; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Node.prototype, "textContent", { + get: function () { + return (0, he_1.decode)(this.rawText); + }, + set: function (val) { + this.rawText = (0, he_1.encode)(val); + }, + enumerable: false, + configurable: true + }); + return Node; + }()); + exports.default = Node; +}); +define("matcher", ["require", "exports", "nodes/type"], function (require, exports, type_1) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + type_1 = __importDefault(type_1); + function isTag(node) { + return node && node.nodeType === type_1.default.ELEMENT_NODE; + } + function getAttributeValue(elem, name) { + return isTag(elem) ? elem.getAttribute(name) : undefined; + } + function getName(elem) { + return ((elem && elem.rawTagName) || '').toLowerCase(); + } + function getChildren(node) { + return node && node.childNodes; + } + function getParent(node) { + return node ? node.parentNode : null; + } + function getText(node) { + return node.text; + } + function removeSubsets(nodes) { + var idx = nodes.length; + var node; + var ancestor; + var replace; + // Check if each node (or one of its ancestors) is already contained in the + // array. + while (--idx > -1) { + node = ancestor = nodes[idx]; + // Temporarily remove the node under consideration + nodes[idx] = null; + replace = true; + while (ancestor) { + if (nodes.indexOf(ancestor) > -1) { + replace = false; + nodes.splice(idx, 1); + break; + } + ancestor = getParent(ancestor); + } + // If the node has been found to be unique, re-insert it. + if (replace) { + nodes[idx] = node; + } + } + return nodes; + } + function existsOne(test, elems) { + return elems.some(function (elem) { + return isTag(elem) ? test(elem) || existsOne(test, getChildren(elem)) : false; + }); + } + function getSiblings(node) { + var parent = getParent(node); + return parent && getChildren(parent); + } + function hasAttrib(elem, name) { + return getAttributeValue(elem, name) !== undefined; + } + function findOne(test, elems) { + var elem = null; + for (var i = 0, l = elems.length; i < l && !elem; i++) { + var el = elems[i]; + if (test(el)) { + elem = el; + } + else { + var childs = getChildren(el); + if (childs && childs.length > 0) { + elem = findOne(test, childs); + } + } + } + return elem; + } + function findAll(test, nodes) { + var result = []; + for (var i = 0, j = nodes.length; i < j; i++) { + if (!isTag(nodes[i])) + continue; + if (test(nodes[i])) + result.push(nodes[i]); + var childs = getChildren(nodes[i]); + if (childs) + result = result.concat(findAll(test, childs)); + } + return result; + } + exports.default = { + isTag: isTag, + getAttributeValue: getAttributeValue, + getName: getName, + getChildren: getChildren, + getParent: getParent, + getText: getText, + removeSubsets: removeSubsets, + existsOne: existsOne, + getSiblings: getSiblings, + hasAttrib: hasAttrib, + findOne: findOne, + findAll: findAll + }; +}); +define("void-tag", ["require", "exports"], function (require, exports) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + var VoidTag = /** @class */ (function () { + function VoidTag(addClosingSlash, tags) { + if (addClosingSlash === void 0) { addClosingSlash = false; } + this.addClosingSlash = addClosingSlash; + if (Array.isArray(tags)) { + this.voidTags = tags.reduce(function (set, tag) { + return set.add(tag.toLowerCase()); + }, new Set()); + } + else { + this.voidTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'].reduce(function (set, tag) { + return set.add(tag); + }, new Set()); + } + } + VoidTag.prototype.formatNode = function (tag, attrs, innerHTML) { + var addClosingSlash = this.addClosingSlash; + var closingSpace = (addClosingSlash && attrs && !attrs.endsWith(' ')) ? ' ' : ''; + var closingSlash = addClosingSlash ? "".concat(closingSpace, "/") : ''; + return this.isVoidElement(tag.toLowerCase()) ? "<".concat(tag).concat(attrs).concat(closingSlash, ">") : "<".concat(tag).concat(attrs, ">").concat(innerHTML, ""); + }; + VoidTag.prototype.isVoidElement = function (tag) { + return this.voidTags.has(tag); + }; + return VoidTag; + }()); + exports.default = VoidTag; +}); +define("nodes/text", ["require", "exports", "he", "nodes/node", "nodes/type"], function (require, exports, he_2, node_1, type_2) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + node_1 = __importDefault(node_1); + type_2 = __importDefault(type_2); + /** + * TextNode to contain a text element in DOM tree. + * @param {string} value [description] + */ + var TextNode = /** @class */ (function (_super) { + __extends(TextNode, _super); + function TextNode(rawText, parentNode, range) { + var _this = _super.call(this, parentNode, range) || this; + /** + * Node Type declaration. + * @type {Number} + */ + _this.nodeType = type_2.default.TEXT_NODE; + _this._rawText = rawText; + return _this; + } + TextNode.prototype.clone = function () { + return new TextNode(this._rawText, null); + }; + Object.defineProperty(TextNode.prototype, "rawText", { + get: function () { + return this._rawText; + }, + /** + * Set rawText and invalidate trimmed caches + */ + set: function (text) { + this._rawText = text; + this._trimmedRawText = void 0; + this._trimmedText = void 0; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(TextNode.prototype, "trimmedRawText", { + /** + * Returns raw text with all whitespace trimmed except single leading/trailing non-breaking space + */ + get: function () { + if (this._trimmedRawText !== undefined) + return this._trimmedRawText; + this._trimmedRawText = trimText(this.rawText); + return this._trimmedRawText; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(TextNode.prototype, "trimmedText", { + /** + * Returns text with all whitespace trimmed except single leading/trailing non-breaking space + */ + get: function () { + if (this._trimmedText !== undefined) + return this._trimmedText; + this._trimmedText = trimText(this.text); + return this._trimmedText; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(TextNode.prototype, "text", { + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get: function () { + return (0, he_2.decode)(this.rawText); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(TextNode.prototype, "isWhitespace", { + /** + * Detect if the node contains only white space. + * @return {boolean} + */ + get: function () { + return /^(\s| )*$/.test(this.rawText); + }, + enumerable: false, + configurable: true + }); + TextNode.prototype.toString = function () { + return this.rawText; + }; + return TextNode; + }(node_1.default)); + exports.default = TextNode; + /** + * Trim whitespace except single leading/trailing non-breaking space + */ + function trimText(text) { + var i = 0; + var startPos; + var endPos; + while (i >= 0 && i < text.length) { + if (/\S/.test(text[i])) { + if (startPos === undefined) { + startPos = i; + i = text.length; + } + else { + endPos = i; + i = void 0; + } + } + if (startPos === undefined) + i++; + else + i--; + } + if (startPos === undefined) + startPos = 0; + if (endPos === undefined) + endPos = text.length - 1; + var hasLeadingSpace = startPos > 0 && /[^\S\r\n]/.test(text[startPos - 1]); + var hasTrailingSpace = endPos < (text.length - 1) && /[^\S\r\n]/.test(text[endPos + 1]); + return (hasLeadingSpace ? ' ' : '') + text.slice(startPos, endPos + 1) + (hasTrailingSpace ? ' ' : ''); + } +}); +define("nodes/html", ["require", "exports", "css-select", "he", "back", "matcher", "void-tag", "nodes/comment", "nodes/node", "nodes/text", "nodes/type"], function (require, exports, css_select_1, he_3, back_1, matcher_1, void_tag_1, comment_1, node_2, text_1, type_3) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.parse = exports.base_parse = void 0; + he_3 = __importDefault(he_3); + back_1 = __importDefault(back_1); + matcher_1 = __importDefault(matcher_1); + void_tag_1 = __importDefault(void_tag_1); + comment_1 = __importDefault(comment_1); + node_2 = __importDefault(node_2); + text_1 = __importDefault(text_1); + type_3 = __importDefault(type_3); + function decode(val) { + // clone string + return JSON.parse(JSON.stringify(he_3.default.decode(val))); + } + // https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements + var Htags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup']; + var Dtags = ['details', 'dialog', 'dd', 'div', 'dt']; + var Ftags = ['fieldset', 'figcaption', 'figure', 'footer', 'form']; + var tableTags = ['table', 'td', 'tr']; + var htmlTags = ['address', 'article', 'aside', 'blockquote', 'br', 'hr', 'li', 'main', 'nav', 'ol', 'p', 'pre', 'section', 'ul']; + var kBlockElements = new Set(); + function addToKBlockElement() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var addToSet = function (array) { + for (var index = 0; index < array.length; index++) { + var element = array[index]; + kBlockElements.add(element); + kBlockElements.add(element.toUpperCase()); + } + }; + for (var _a = 0, args_1 = args; _a < args_1.length; _a++) { + var arg = args_1[_a]; + addToSet(arg); + } + } + addToKBlockElement(Htags, Dtags, Ftags, tableTags, htmlTags); + var DOMTokenList = /** @class */ (function () { + function DOMTokenList(valuesInit, afterUpdate) { + if (valuesInit === void 0) { valuesInit = []; } + if (afterUpdate === void 0) { afterUpdate = function () { return null; }; } + this._set = new Set(valuesInit); + this._afterUpdate = afterUpdate; + } + DOMTokenList.prototype._validate = function (c) { + if (/\s/.test(c)) { + throw new Error("DOMException in DOMTokenList.add: The token '".concat(c, "' contains HTML space characters, which are not valid in tokens.")); + } + }; + DOMTokenList.prototype.add = function (c) { + this._validate(c); + this._set.add(c); + this._afterUpdate(this); // eslint-disable-line @typescript-eslint/no-unsafe-call + }; + DOMTokenList.prototype.replace = function (c1, c2) { + this._validate(c2); + this._set.delete(c1); + this._set.add(c2); + this._afterUpdate(this); // eslint-disable-line @typescript-eslint/no-unsafe-call + }; + DOMTokenList.prototype.remove = function (c) { + this._set.delete(c) && this._afterUpdate(this); // eslint-disable-line @typescript-eslint/no-unsafe-call + }; + DOMTokenList.prototype.toggle = function (c) { + this._validate(c); + if (this._set.has(c)) + this._set.delete(c); + else + this._set.add(c); + this._afterUpdate(this); // eslint-disable-line @typescript-eslint/no-unsafe-call + }; + DOMTokenList.prototype.contains = function (c) { + return this._set.has(c); + }; + Object.defineProperty(DOMTokenList.prototype, "length", { + get: function () { + return this._set.size; + }, + enumerable: false, + configurable: true + }); + DOMTokenList.prototype.values = function () { + return this._set.values(); + }; + Object.defineProperty(DOMTokenList.prototype, "value", { + get: function () { + return Array.from(this._set.values()); + }, + enumerable: false, + configurable: true + }); + DOMTokenList.prototype.toString = function () { + return Array.from(this._set.values()).join(' '); + }; + return DOMTokenList; + }()); + /** + * HTMLElement, which contains a set of children. + * + * Note: this is a minimalist implementation, no complete tree + * structure provided (no parentNode, nextSibling, + * previousSibling etc). + * @class HTMLElement + * @extends {Node} + */ + var HTMLElement = /** @class */ (function (_super) { + __extends(HTMLElement, _super); + /** + * Creates an instance of HTMLElement. + * @param keyAttrs id and class attribute + * @param [rawAttrs] attributes in string + * + * @memberof HTMLElement + */ + function HTMLElement(tagName, keyAttrs, rawAttrs, parentNode, range, voidTag) { + if (rawAttrs === void 0) { rawAttrs = ''; } + if (voidTag === void 0) { voidTag = new void_tag_1.default(); } + var _this = _super.call(this, parentNode, range) || this; + _this.rawAttrs = rawAttrs; + _this.voidTag = voidTag; + /** + * Node Type declaration. + */ + _this.nodeType = type_3.default.ELEMENT_NODE; + _this.rawTagName = tagName; + _this.rawAttrs = rawAttrs || ''; + _this.id = keyAttrs.id || ''; + _this.childNodes = []; + _this.classList = new DOMTokenList(keyAttrs.class ? keyAttrs.class.split(/\s+/) : [], function (classList) { return _this.setAttribute('class', classList.toString()); } // eslint-disable-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + ); + if (keyAttrs.id) { + if (!rawAttrs) { + _this.rawAttrs = "id=\"".concat(keyAttrs.id, "\""); + } + } + if (keyAttrs.class) { + if (!rawAttrs) { + var cls = "class=\"".concat(_this.classList.toString(), "\""); + if (_this.rawAttrs) { + _this.rawAttrs += " ".concat(cls); + } + else { + _this.rawAttrs = cls; + } + } + } + return _this; + } + /** + * Quote attribute values + * @param attr attribute value + * @returns {string} quoted value + */ + HTMLElement.prototype.quoteAttribute = function (attr) { + if (attr == null) { + return 'null'; + } + return JSON.stringify(attr.replace(/"/g, '"')); + }; + /** + * Remove Child element from childNodes array + * @param {HTMLElement} node node to remove + */ + HTMLElement.prototype.removeChild = function (node) { + this.childNodes = this.childNodes.filter(function (child) { + return child !== node; + }); + return this; + }; + /** + * Exchanges given child with new child + * @param {HTMLElement} oldNode node to exchange + * @param {HTMLElement} newNode new node + */ + HTMLElement.prototype.exchangeChild = function (oldNode, newNode) { + var children = this.childNodes; + this.childNodes = children.map(function (child) { + if (child === oldNode) { + return newNode; + } + return child; + }); + return this; + }; + Object.defineProperty(HTMLElement.prototype, "tagName", { + get: function () { + return this.rawTagName ? this.rawTagName.toUpperCase() : this.rawTagName; + }, + set: function (newname) { + this.rawTagName = newname.toLowerCase(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "localName", { + get: function () { + return this.rawTagName.toLowerCase(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "isVoidElement", { + get: function () { + return this.voidTag.isVoidElement(this.localName); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "rawText", { + /** + * Get escpaed (as-it) text value of current node and its children. + * @return {string} text content + */ + get: function () { + return this.childNodes.reduce(function (pre, cur) { + return (pre += cur.rawText); + }, ''); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "textContent", { + get: function () { + return decode(this.rawText); + }, + set: function (val) { + var content = [new text_1.default(val, this)]; + this.childNodes = content; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "text", { + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get: function () { + return decode(this.rawText); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "structuredText", { + /** + * Get structured Text (with '\n' etc.) + * @return {string} structured text + */ + get: function () { + var currentBlock = []; + var blocks = [currentBlock]; + function dfs(node) { + if (node.nodeType === type_3.default.ELEMENT_NODE) { + if (kBlockElements.has(node.rawTagName)) { + if (currentBlock.length > 0) { + blocks.push((currentBlock = [])); + } + node.childNodes.forEach(dfs); + if (currentBlock.length > 0) { + blocks.push((currentBlock = [])); + } + } + else { + node.childNodes.forEach(dfs); + } + } + else if (node.nodeType === type_3.default.TEXT_NODE) { + if (node.isWhitespace) { + // Whitespace node, postponed output + currentBlock.prependWhitespace = true; + } + else { + var text = node.trimmedText; + if (currentBlock.prependWhitespace) { + text = " ".concat(text); + currentBlock.prependWhitespace = false; + } + currentBlock.push(text); + } + } + } + dfs(this); + return blocks + .map(function (block) { + return block.join('').replace(/\s{2,}/g, ' '); // Normalize each line's whitespace + }) + .join('\n') + .replace(/\s+$/, ''); // trimRight; + }, + enumerable: false, + configurable: true + }); + HTMLElement.prototype.toString = function () { + var tag = this.rawTagName; + if (tag) { + var attrs = this.rawAttrs ? " ".concat(this.rawAttrs) : ''; + return this.voidTag.formatNode(tag, attrs, this.innerHTML); + } + return this.innerHTML; + }; + Object.defineProperty(HTMLElement.prototype, "innerHTML", { + get: function () { + return this.childNodes + .map(function (child) { + return child.toString(); + }) + .join(''); + }, + set: function (content) { + //const r = parse(content, global.options); // TODO global.options ? + var r = parse(content); + var nodes = r.childNodes.length ? r.childNodes : [new text_1.default(content, this)]; + resetParent(nodes, this); + resetParent(this.childNodes, null); + this.childNodes = nodes; + }, + enumerable: false, + configurable: true + }); + HTMLElement.prototype.set_content = function (content, options) { + if (options === void 0) { options = {}; } + if (content instanceof node_2.default) { + content = [content]; + } + else if (typeof content == 'string') { + var r = parse(content, options); + content = r.childNodes.length ? r.childNodes : [new text_1.default(content, this)]; + } + resetParent(this.childNodes, null); + resetParent(content, this); + this.childNodes = content; + return this; + }; + HTMLElement.prototype.replaceWith = function () { + var _this = this; + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + var parent = this.parentNode; + var content = nodes + .map(function (node) { + if (node instanceof node_2.default) { + return [node]; + } + else if (typeof node == 'string') { + // const r = parse(content, global.options); // TODO global.options ? + var r = parse(node); + return r.childNodes.length ? r.childNodes : [new text_1.default(node, _this)]; + } + return []; + }) + .flat(); + var idx = parent.childNodes.findIndex(function (child) { + return child === _this; + }); + resetParent([this], null); + parent.childNodes = __spreadArray(__spreadArray(__spreadArray([], parent.childNodes.slice(0, idx), true), resetParent(content, parent), true), parent.childNodes.slice(idx + 1), true); + }; + Object.defineProperty(HTMLElement.prototype, "outerHTML", { + get: function () { + return this.toString(); + }, + enumerable: false, + configurable: true + }); + /** + * Trim element from right (in block) after seeing pattern in a TextNode. + * @param {RegExp} pattern pattern to find + * @return {HTMLElement} reference to current node + */ + HTMLElement.prototype.trimRight = function (pattern) { + for (var i = 0; i < this.childNodes.length; i++) { + var childNode = this.childNodes[i]; + if (childNode.nodeType === type_3.default.ELEMENT_NODE) { + childNode.trimRight(pattern); + } + else { + var index = childNode.rawText.search(pattern); + if (index > -1) { + childNode.rawText = childNode.rawText.substr(0, index); + // trim all following nodes. + this.childNodes.length = i + 1; + } + } + } + return this; + }; + Object.defineProperty(HTMLElement.prototype, "structure", { + /** + * Get DOM structure + * @return {string} strucutre + */ + get: function () { + var res = []; + var indention = 0; + function write(str) { + res.push(' '.repeat(indention) + str); + } + function dfs(node) { + var idStr = node.id ? "#".concat(node.id) : ''; + var classStr = node.classList.length ? ".".concat(node.classList.value.join('.')) : ''; // eslint-disable-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-call + write("".concat(node.rawTagName).concat(idStr).concat(classStr)); + indention++; + node.childNodes.forEach(function (childNode) { + if (childNode.nodeType === type_3.default.ELEMENT_NODE) { + dfs(childNode); + } + else if (childNode.nodeType === type_3.default.TEXT_NODE) { + if (!childNode.isWhitespace) { + write('#text'); + } + } + }); + indention--; + } + dfs(this); + return res.join('\n'); + }, + enumerable: false, + configurable: true + }); + /** + * Remove whitespaces in this sub tree. + * @return {HTMLElement} pointer to this + */ + HTMLElement.prototype.removeWhitespace = function () { + var _this = this; + var o = 0; + this.childNodes.forEach(function (node) { + if (node.nodeType === type_3.default.TEXT_NODE) { + if (node.isWhitespace) { + return; + } + node.rawText = node.trimmedRawText; + } + else if (node.nodeType === type_3.default.ELEMENT_NODE) { + node.removeWhitespace(); + } + _this.childNodes[o++] = node; + }); + this.childNodes.length = o; + return this; + }; + /** + * Query CSS selector to find matching nodes. + * @param {string} selector Simplified CSS selector + * @return {HTMLElement[]} matching elements + */ + HTMLElement.prototype.querySelectorAll = function (selector) { + return (0, css_select_1.selectAll)(selector, this, { + xmlMode: true, + adapter: matcher_1.default, + }); + }; + /** + * Query CSS Selector to find matching node. + * @param {string} selector Simplified CSS selector + * @return {(HTMLElement|null)} matching node + */ + HTMLElement.prototype.querySelector = function (selector) { + return (0, css_select_1.selectOne)(selector, this, { + xmlMode: true, + adapter: matcher_1.default, + }); + }; + /** + * find elements by their tagName + * @param {string} tagName the tagName of the elements to select + */ + HTMLElement.prototype.getElementsByTagName = function (tagName) { + var upperCasedTagName = tagName.toUpperCase(); + var re = []; + var stack = []; + var currentNodeReference = this; + var index = 0; + // index turns to undefined once the stack is empty and the first condition occurs + // which happens once all relevant children are searched through + while (index !== undefined) { + var child = void 0; + // make it work with sparse arrays + do { + child = currentNodeReference.childNodes[index++]; + } while (index < currentNodeReference.childNodes.length && child === undefined); + // if the child does not exist we move on with the last provided index (which belongs to the parentNode) + if (child === undefined) { + currentNodeReference = currentNodeReference.parentNode; + index = stack.pop(); + continue; + } + if (child.nodeType === type_3.default.ELEMENT_NODE) { + // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName#syntax + if (tagName === '*' || child.tagName === upperCasedTagName) + re.push(child); + // if children are existing push the current status to the stack and keep searching for elements in the level below + if (child.childNodes.length > 0) { + stack.push(index); + currentNodeReference = child; + index = 0; + } + } + } + return re; + }; + /** + * find element by it's id + * @param {string} id the id of the element to select + */ + HTMLElement.prototype.getElementById = function (id) { + var stack = []; + var currentNodeReference = this; + var index = 0; + // index turns to undefined once the stack is empty and the first condition occurs + // which happens once all relevant children are searched through + while (index !== undefined) { + var child = void 0; + // make it work with sparse arrays + do { + child = currentNodeReference.childNodes[index++]; + } while (index < currentNodeReference.childNodes.length && child === undefined); + // if the child does not exist we move on with the last provided index (which belongs to the parentNode) + if (child === undefined) { + currentNodeReference = currentNodeReference.parentNode; + index = stack.pop(); + continue; + } + if (child.nodeType === type_3.default.ELEMENT_NODE) { + if (child.id === id) { + return child; + } + ; + // if children are existing push the current status to the stack and keep searching for elements in the level below + if (child.childNodes.length > 0) { + stack.push(index); + currentNodeReference = child; + index = 0; + } + } + } + return null; + }; + /** + * traverses the Element and its parents (heading toward the document root) until it finds a node that matches the provided selector string. Will return itself or the matching ancestor. If no such element exists, it returns null. + * @param selector a DOMString containing a selector list + */ + HTMLElement.prototype.closest = function (selector) { + var mapChild = new Map(); + var el = this; + var old = null; + function findOne(test, elems) { + var elem = null; + for (var i = 0, l = elems.length; i < l && !elem; i++) { + var el_1 = elems[i]; + if (test(el_1)) { + elem = el_1; + } + else { + var child = mapChild.get(el_1); + if (child) { + elem = findOne(test, [child]); + } + } + } + return elem; + } + while (el) { + mapChild.set(el, old); + old = el; + el = el.parentNode; + } + el = this; + while (el) { + var e = (0, css_select_1.selectOne)(selector, el, { + xmlMode: true, + adapter: __assign(__assign({}, matcher_1.default), { getChildren: function (node) { + var child = mapChild.get(node); + return child && [child]; + }, getSiblings: function (node) { + return [node]; + }, findOne: findOne, findAll: function () { + return []; + } }), + }); + if (e) { + return e; + } + el = el.parentNode; + } + return null; + }; + /** + * Append a child node to childNodes + * @param {Node} node node to append + * @return {Node} node appended + */ + HTMLElement.prototype.appendChild = function (node) { + // remove the node from it's parent + node.remove(); + this.childNodes.push(node); + node.parentNode = this; + return node; + }; + Object.defineProperty(HTMLElement.prototype, "firstChild", { + /** + * Get first child node + * @return {Node} first child node + */ + get: function () { + return this.childNodes[0]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "lastChild", { + /** + * Get last child node + * @return {Node} last child node + */ + get: function () { + return (0, back_1.default)(this.childNodes); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "attrs", { + /** + * Get attributes + * @access private + * @return {Object} parsed and unescaped attributes + */ + get: function () { + if (this._attrs) { + return this._attrs; + } + this._attrs = {}; + var attrs = this.rawAttributes; + for (var key in attrs) { + var val = attrs[key] || ''; + this._attrs[key.toLowerCase()] = decode(val); + } + return this._attrs; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "attributes", { + get: function () { + var ret_attrs = {}; + var attrs = this.rawAttributes; + for (var key in attrs) { + var val = attrs[key] || ''; + ret_attrs[key] = decode(val); + } + return ret_attrs; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "rawAttributes", { + /** + * Get escaped (as-is) attributes + * @return {Object} parsed attributes + */ + get: function () { + if (this._rawAttrs) { + return this._rawAttrs; + } + var attrs = {}; + if (this.rawAttrs) { + var re = /([a-zA-Z()[\]#@][a-zA-Z0-9-_:()[\]#]*)(?:\s*=\s*((?:'[^']*')|(?:"[^"]*")|\S+))?/g; + var match = void 0; + while ((match = re.exec(this.rawAttrs))) { + var key = match[1]; + var val = match[2] || null; + if (val && (val[0] === "'" || val[0] === "\"")) + val = val.slice(1, val.length - 1); + attrs[key] = val; + } + } + this._rawAttrs = attrs; + return attrs; + }, + enumerable: false, + configurable: true + }); + HTMLElement.prototype.removeAttribute = function (key) { + var attrs = this.rawAttributes; + delete attrs[key]; + // Update this.attribute + if (this._attrs) { + delete this._attrs[key]; + } + // Update rawString + this.rawAttrs = Object.keys(attrs) + .map(function (name) { + var val = JSON.stringify(attrs[name]); + if (val === undefined || val === 'null') { + return name; + } + return "".concat(name, "=").concat(val); + }) + .join(' '); + // Update this.id + if (key === 'id') { + this.id = ''; + } + return this; + }; + HTMLElement.prototype.hasAttribute = function (key) { + return key.toLowerCase() in this.attrs; + }; + /** + * Get an attribute + * @return {string} value of the attribute + */ + HTMLElement.prototype.getAttribute = function (key) { + return this.attrs[key.toLowerCase()]; + }; + /** + * Set an attribute value to the HTMLElement + * @param {string} key The attribute name + * @param {string} value The value to set, or null / undefined to remove an attribute + */ + HTMLElement.prototype.setAttribute = function (key, value) { + var _this = this; + if (arguments.length < 2) { + throw new Error("Failed to execute 'setAttribute' on 'Element'"); + } + var k2 = key.toLowerCase(); + var attrs = this.rawAttributes; + for (var k in attrs) { + if (k.toLowerCase() === k2) { + key = k; + break; + } + } + attrs[key] = String(value); + // update this.attrs + if (this._attrs) { + this._attrs[k2] = decode(attrs[key]); + } + // Update rawString + this.rawAttrs = Object.keys(attrs) + .map(function (name) { + var val = _this.quoteAttribute(attrs[name]); + if (val === 'null' || val === '""') + return name; + return "".concat(name, "=").concat(val); + }) + .join(' '); + // Update this.id + if (key === 'id') { + this.id = value; + } + }; + /** + * Replace all the attributes of the HTMLElement by the provided attributes + * @param {Attributes} attributes the new attribute set + */ + HTMLElement.prototype.setAttributes = function (attributes) { + var _this = this; + // Invalidate current this.attributes + if (this._attrs) { + delete this._attrs; + } + // Invalidate current this.rawAttributes + if (this._rawAttrs) { + delete this._rawAttrs; + } + // Update rawString + this.rawAttrs = Object.keys(attributes) + .map(function (name) { + var val = attributes[name]; + if (val === 'null' || val === '""') + return name; + return "".concat(name, "=").concat(_this.quoteAttribute(String(val))); + }) + .join(' '); + return this; + }; + HTMLElement.prototype.insertAdjacentHTML = function (where, html) { + var _a, _b, _c; + var _this = this; + if (arguments.length < 2) { + throw new Error('2 arguments required'); + } + var p = parse(html); + if (where === 'afterend') { + var idx = this.parentNode.childNodes.findIndex(function (child) { + return child === _this; + }); + resetParent(p.childNodes, this.parentNode); + (_a = this.parentNode.childNodes).splice.apply(_a, __spreadArray([idx + 1, 0], p.childNodes, false)); + } + else if (where === 'afterbegin') { + resetParent(p.childNodes, this); + (_b = this.childNodes).unshift.apply(_b, p.childNodes); + } + else if (where === 'beforeend') { + p.childNodes.forEach(function (n) { + _this.appendChild(n); + }); + } + else if (where === 'beforebegin') { + var idx = this.parentNode.childNodes.findIndex(function (child) { + return child === _this; + }); + resetParent(p.childNodes, this.parentNode); + (_c = this.parentNode.childNodes).splice.apply(_c, __spreadArray([idx, 0], p.childNodes, false)); + } + else { + throw new Error("The value provided ('".concat(where, "') is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'")); + } + return this; + // if (!where || html === undefined || html === null) { + // return; + // } + }; + Object.defineProperty(HTMLElement.prototype, "nextSibling", { + get: function () { + if (this.parentNode) { + var children = this.parentNode.childNodes; + var i = 0; + while (i < children.length) { + var child = children[i++]; + if (this === child) + return children[i] || null; + } + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "nextElementSibling", { + get: function () { + if (this.parentNode) { + var children = this.parentNode.childNodes; + var i = 0; + var find = false; + while (i < children.length) { + var child = children[i++]; + if (find) { + if (child instanceof HTMLElement) { + return child || null; + } + } + else if (this === child) { + find = true; + } + } + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "previousSibling", { + get: function () { + if (this.parentNode) { + var children = this.parentNode.childNodes; + var i = children.length; + while (i > 0) { + var child = children[--i]; + if (this === child) + return children[i - 1] || null; + } + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "previousElementSibling", { + get: function () { + if (this.parentNode) { + var children = this.parentNode.childNodes; + var i = children.length; + var find = false; + while (i > 0) { + var child = children[--i]; + if (find) { + if (child instanceof HTMLElement) { + return child || null; + } + } + else if (this === child) { + find = true; + } + } + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "classNames", { + get: function () { + return this.classList.toString(); + }, + enumerable: false, + configurable: true + }); + /** + * Clone this Node + */ + HTMLElement.prototype.clone = function () { + return parse(this.toString()).firstChild; + }; + return HTMLElement; + }(node_2.default)); + exports.default = HTMLElement; + // https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name + var kMarkupPattern = /|<(\/?)([a-zA-Z][-.:0-9_a-zA-Z]*)((?:\s+[^>]*?(?:(?:'[^']*')|(?:"[^"]*"))?)*)\s*(\/?)>/g; + var kAttributePattern = /(?:^|\s)(id|class)\s*=\s*((?:'[^']*')|(?:"[^"]*")|\S+)/gi; + var kSelfClosingElements = { + area: true, + AREA: true, + base: true, + BASE: true, + br: true, + BR: true, + col: true, + COL: true, + hr: true, + HR: true, + img: true, + IMG: true, + input: true, + INPUT: true, + link: true, + LINK: true, + meta: true, + META: true, + source: true, + SOURCE: true, + embed: true, + EMBED: true, + param: true, + PARAM: true, + track: true, + TRACK: true, + wbr: true, + WBR: true, + }; + var kElementsClosedByOpening = { + li: { li: true, LI: true }, + LI: { li: true, LI: true }, + p: { p: true, div: true, P: true, DIV: true }, + P: { p: true, div: true, P: true, DIV: true }, + b: { div: true, DIV: true }, + B: { div: true, DIV: true }, + td: { td: true, th: true, TD: true, TH: true }, + TD: { td: true, th: true, TD: true, TH: true }, + th: { td: true, th: true, TD: true, TH: true }, + TH: { td: true, th: true, TD: true, TH: true }, + h1: { h1: true, H1: true }, + H1: { h1: true, H1: true }, + h2: { h2: true, H2: true }, + H2: { h2: true, H2: true }, + h3: { h3: true, H3: true }, + H3: { h3: true, H3: true }, + h4: { h4: true, H4: true }, + H4: { h4: true, H4: true }, + h5: { h5: true, H5: true }, + H5: { h5: true, H5: true }, + h6: { h6: true, H6: true }, + H6: { h6: true, H6: true }, + }; + var kElementsClosedByClosing = { + li: { ul: true, ol: true, UL: true, OL: true }, + LI: { ul: true, ol: true, UL: true, OL: true }, + a: { div: true, DIV: true }, + A: { div: true, DIV: true }, + b: { div: true, DIV: true }, + B: { div: true, DIV: true }, + i: { div: true, DIV: true }, + I: { div: true, DIV: true }, + p: { div: true, DIV: true }, + P: { div: true, DIV: true }, + td: { tr: true, table: true, TR: true, TABLE: true }, + TD: { tr: true, table: true, TR: true, TABLE: true }, + th: { tr: true, table: true, TR: true, TABLE: true }, + TH: { tr: true, table: true, TR: true, TABLE: true }, + }; + var frameflag = 'documentfragmentcontainer'; + /** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + * @param {string} data html + * @return {HTMLElement} root element + */ + function base_parse(data, options) { + var _a, _b; + if (options === void 0) { options = { lowerCaseTagName: false, comment: false }; } + var voidTag = new void_tag_1.default((_a = options === null || options === void 0 ? void 0 : options.voidTag) === null || _a === void 0 ? void 0 : _a.closingSlash, (_b = options === null || options === void 0 ? void 0 : options.voidTag) === null || _b === void 0 ? void 0 : _b.tags); + var elements = options.blockTextElements || { + script: true, + noscript: true, + style: true, + pre: true, + }; + var element_names = Object.keys(elements); + var kBlockTextElements = element_names.map(function (it) { return new RegExp("^".concat(it, "$"), 'i'); }); + var kIgnoreElements = element_names.filter(function (it) { return elements[it]; }).map(function (it) { return new RegExp("^".concat(it, "$"), 'i'); }); + function element_should_be_ignore(tag) { + return kIgnoreElements.some(function (it) { return it.test(tag); }); + } + function is_block_text_element(tag) { + return kBlockTextElements.some(function (it) { return it.test(tag); }); + } + var createRange = function (startPos, endPos) { return [startPos - frameFlagOffset, endPos - frameFlagOffset]; }; + var root = new HTMLElement(null, {}, '', null, [0, data.length], voidTag); + var currentParent = root; + var stack = [root]; + var lastTextPos = -1; + var noNestedTagIndex = undefined; + var match; + // https://github.com/taoqf/node-html-parser/issues/38 + data = "<".concat(frameflag, ">").concat(data, ""); + var lowerCaseTagName = options.lowerCaseTagName; + var dataEndPos = data.length - (frameflag.length + 2); + var frameFlagOffset = frameflag.length + 2; + while ((match = kMarkupPattern.exec(data))) { + // Note: Object destructuring here consistently tests as higher performance than array destructuring + // eslint-disable-next-line prefer-const + var matchText = match[0], leadingSlash = match[1], tagName = match[2], attributes = match[3], closingSlash = match[4]; + var matchLength = matchText.length; + var tagStartPos = kMarkupPattern.lastIndex - matchLength; + var tagEndPos = kMarkupPattern.lastIndex; + // Add TextNode if content + if (lastTextPos > -1) { + if (lastTextPos + matchLength < tagEndPos) { + var text = data.substring(lastTextPos, tagStartPos); + currentParent.appendChild(new text_1.default(text, currentParent, createRange(lastTextPos, tagStartPos))); + } + } + lastTextPos = kMarkupPattern.lastIndex; + // https://github.com/taoqf/node-html-parser/issues/38 + // Skip frameflag node + if (tagName === frameflag) + continue; + // Handle comments + if (matchText[1] === '!') { + if (options.comment) { + // Only keep what is in between + var text = data.substring(tagStartPos + 4, tagEndPos - 3); + currentParent.appendChild(new comment_1.default(text, currentParent, createRange(tagStartPos, tagEndPos))); + } + continue; + } + /* -- Handle tag matching -- */ + // Fix tag casing if necessary + if (lowerCaseTagName) + tagName = tagName.toLowerCase(); + // Handle opening tags (ie. not ) + if (!leadingSlash) { + /* Populate attributes */ + var attrs = {}; + for (var attMatch = void 0; (attMatch = kAttributePattern.exec(attributes));) { + var key = attMatch[1], val = attMatch[2]; + var isQuoted = val[0] === "'" || val[0] === "\""; + attrs[key.toLowerCase()] = isQuoted ? val.slice(1, val.length - 1) : val; + } + var parentTagName = currentParent.rawTagName; + if (!closingSlash && kElementsClosedByOpening[parentTagName]) { + if (kElementsClosedByOpening[parentTagName][tagName]) { + stack.pop(); + currentParent = (0, back_1.default)(stack); + } + } + // Prevent nested A tags by terminating the last A and starting a new one : see issue #144 + if (tagName === 'a' || tagName === 'A') { + if (noNestedTagIndex !== undefined) { + stack.splice(noNestedTagIndex); + currentParent = (0, back_1.default)(stack); + } + noNestedTagIndex = stack.length; + } + var tagEndPos_1 = kMarkupPattern.lastIndex; + var tagStartPos_1 = tagEndPos_1 - matchLength; + currentParent = currentParent.appendChild( + // Initialize range (end position updated later for closed tags) + new HTMLElement(tagName, attrs, attributes.slice(1), null, createRange(tagStartPos_1, tagEndPos_1), voidTag)); + stack.push(currentParent); + if (is_block_text_element(tagName)) { + // Find closing tag + var closeMarkup = ""); + var closeIndex = lowerCaseTagName + ? data.toLocaleLowerCase().indexOf(closeMarkup, kMarkupPattern.lastIndex) + : data.indexOf(closeMarkup, kMarkupPattern.lastIndex); + var textEndPos = closeIndex === -1 ? dataEndPos : closeIndex; + if (element_should_be_ignore(tagName)) { + var text = data.substring(tagEndPos_1, textEndPos); + if (text.length > 0 && /\S/.test(text)) { + currentParent.appendChild(new text_1.default(text, currentParent, createRange(tagEndPos_1, textEndPos))); + } + } + if (closeIndex === -1) { + lastTextPos = kMarkupPattern.lastIndex = data.length + 1; + } + else { + lastTextPos = kMarkupPattern.lastIndex = closeIndex + closeMarkup.length; + // Cause to be treated as self-closing, because no close found + leadingSlash = '/'; + } + } + } + // Handle closing tags or self-closed elements (ie or
    ) + if (leadingSlash || closingSlash || kSelfClosingElements[tagName]) { + while (true) { + if (tagName === 'a' || tagName === 'A') + noNestedTagIndex = undefined; + if (currentParent.rawTagName === tagName) { + // Update range end for closed tag + currentParent.range[1] = createRange(-1, Math.max(lastTextPos, tagEndPos))[1]; + stack.pop(); + currentParent = (0, back_1.default)(stack); + break; + } + else { + var parentTagName = currentParent.tagName; + // Trying to close current tag, and move on + if (kElementsClosedByClosing[parentTagName]) { + if (kElementsClosedByClosing[parentTagName][tagName]) { + stack.pop(); + currentParent = (0, back_1.default)(stack); + continue; + } + } + // Use aggressive strategy to handle unmatching markups. + break; + } + } + } + } + return stack; + } + exports.base_parse = base_parse; + /** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + */ + function parse(data, options) { + if (options === void 0) { options = { lowerCaseTagName: false, comment: false }; } + var stack = base_parse(data, options); + var root = stack[0]; + var _loop_1 = function () { + // Handle each error elements. + var last = stack.pop(); + var oneBefore = (0, back_1.default)(stack); + if (last.parentNode && last.parentNode.parentNode) { + if (last.parentNode === oneBefore && last.tagName === oneBefore.tagName) { + // Pair error case

    handle : Fixes to

    + // this is wrong, becouse this will put the H3 outside the current right position which should be inside the current Html Element, see issue 152 for more info + if (options.parseNoneClosedTags !== true) { + oneBefore.removeChild(last); + last.childNodes.forEach(function (child) { + oneBefore.parentNode.appendChild(child); + }); + stack.pop(); + } + } + else { + // Single error

    handle: Just removes

    + // Why remove? this is already a HtmlElement and the missing

    is already added in this case. see issue 152 for more info + // eslint-disable-next-line no-lonely-if + if (options.parseNoneClosedTags !== true) { + oneBefore.removeChild(last); + last.childNodes.forEach(function (child) { + oneBefore.appendChild(child); + }); + } + } + } + else { + // If it's final element just skip. + } + }; + while (stack.length > 1) { + _loop_1(); + } + // response.childNodes.forEach((node) => { + // if (node instanceof HTMLElement) { + // node.parentNode = null; + // } + // }); + return root; + } + exports.parse = parse; + function resetParent(nodes, parent) { + return nodes.map(function (node) { + node.parentNode = parent; + return node; + }); + } +}); +define("nodes/comment", ["require", "exports", "nodes/node", "nodes/type"], function (require, exports, node_3, type_4) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + node_3 = __importDefault(node_3); + type_4 = __importDefault(type_4); + var CommentNode = /** @class */ (function (_super) { + __extends(CommentNode, _super); + function CommentNode(rawText, parentNode, range) { + var _this = _super.call(this, parentNode, range) || this; + _this.rawText = rawText; + /** + * Node Type declaration. + * @type {Number} + */ + _this.nodeType = type_4.default.COMMENT_NODE; + return _this; + } + CommentNode.prototype.clone = function () { + return new CommentNode(this.rawText, null); + }; + Object.defineProperty(CommentNode.prototype, "text", { + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get: function () { + return this.rawText; + }, + enumerable: false, + configurable: true + }); + CommentNode.prototype.toString = function () { + return ""); + }; + return CommentNode; + }(node_3.default)); + exports.default = CommentNode; +}); +define("parse", ["require", "exports", "nodes/html"], function (require, exports, html_1) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.default = void 0; + Object.defineProperty(exports, "default", { enumerable: true, get: function () { return html_1.parse; } }); +}); +define("valid", ["require", "exports", "nodes/html"], function (require, exports, html_2) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + /** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + */ + function valid(data, options) { + if (options === void 0) { options = { lowerCaseTagName: false, comment: false }; } + var stack = (0, html_2.base_parse)(data, options); + return Boolean(stack.length === 1); + } + exports.default = valid; +}); +define("index", ["require", "exports", "nodes/comment", "nodes/html", "nodes/node", "nodes/text", "nodes/type", "parse", "valid"], function (require, exports, comment_2, html_3, node_4, text_2, type_5, parse_1, valid_1) { + "use strict"; + Object.defineProperty(exports, "__esModule", { value: true }); + exports.NodeType = exports.TextNode = exports.Node = exports.valid = exports.CommentNode = exports.HTMLElement = exports.parse = void 0; + comment_2 = __importDefault(comment_2); + html_3 = __importDefault(html_3); + node_4 = __importDefault(node_4); + text_2 = __importDefault(text_2); + type_5 = __importDefault(type_5); + parse_1 = __importDefault(parse_1); + valid_1 = __importDefault(valid_1); + exports.CommentNode = comment_2.default; + exports.HTMLElement = html_3.default; + exports.Node = node_4.default; + exports.TextNode = text_2.default; + exports.NodeType = type_5.default; + exports.valid = valid_1.default; + function parse(data, options) { + if (options === void 0) { options = { + lowerCaseTagName: false, + comment: false + }; } + return (0, parse_1.default)(data, options); + } + exports.default = parse; + exports.parse = parse; + parse.parse = parse_1.default; + parse.HTMLElement = html_3.default; + parse.CommentNode = comment_2.default; + parse.valid = valid_1.default; + parse.Node = node_4.default; + parse.TextNode = text_2.default; + parse.NodeType = type_5.default; +}); diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/matcher.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/matcher.d.ts new file mode 100644 index 00000000..6eb4d7dd --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/matcher.d.ts @@ -0,0 +1,6 @@ +import { Adapter } from 'css-select/lib/types'; +import HTMLElement from './nodes/html'; +import Node from './nodes/node'; +export declare type Predicate = (node: Node) => node is HTMLElement; +declare const _default: Adapter; +export default _default; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/matcher.js b/@capacitor/assets/node_modules/node-html-parser/dist/matcher.js new file mode 100644 index 00000000..6cb4c5cb --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/matcher.js @@ -0,0 +1,106 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var type_1 = __importDefault(require("./nodes/type")); +function isTag(node) { + return node && node.nodeType === type_1.default.ELEMENT_NODE; +} +function getAttributeValue(elem, name) { + return isTag(elem) ? elem.getAttribute(name) : undefined; +} +function getName(elem) { + return ((elem && elem.rawTagName) || '').toLowerCase(); +} +function getChildren(node) { + return node && node.childNodes; +} +function getParent(node) { + return node ? node.parentNode : null; +} +function getText(node) { + return node.text; +} +function removeSubsets(nodes) { + var idx = nodes.length; + var node; + var ancestor; + var replace; + // Check if each node (or one of its ancestors) is already contained in the + // array. + while (--idx > -1) { + node = ancestor = nodes[idx]; + // Temporarily remove the node under consideration + nodes[idx] = null; + replace = true; + while (ancestor) { + if (nodes.indexOf(ancestor) > -1) { + replace = false; + nodes.splice(idx, 1); + break; + } + ancestor = getParent(ancestor); + } + // If the node has been found to be unique, re-insert it. + if (replace) { + nodes[idx] = node; + } + } + return nodes; +} +function existsOne(test, elems) { + return elems.some(function (elem) { + return isTag(elem) ? test(elem) || existsOne(test, getChildren(elem)) : false; + }); +} +function getSiblings(node) { + var parent = getParent(node); + return parent && getChildren(parent); +} +function hasAttrib(elem, name) { + return getAttributeValue(elem, name) !== undefined; +} +function findOne(test, elems) { + var elem = null; + for (var i = 0, l = elems.length; i < l && !elem; i++) { + var el = elems[i]; + if (test(el)) { + elem = el; + } + else { + var childs = getChildren(el); + if (childs && childs.length > 0) { + elem = findOne(test, childs); + } + } + } + return elem; +} +function findAll(test, nodes) { + var result = []; + for (var i = 0, j = nodes.length; i < j; i++) { + if (!isTag(nodes[i])) + continue; + if (test(nodes[i])) + result.push(nodes[i]); + var childs = getChildren(nodes[i]); + if (childs) + result = result.concat(findAll(test, childs)); + } + return result; +} +exports.default = { + isTag: isTag, + getAttributeValue: getAttributeValue, + getName: getName, + getChildren: getChildren, + getParent: getParent, + getText: getText, + removeSubsets: removeSubsets, + existsOne: existsOne, + getSiblings: getSiblings, + hasAttrib: hasAttrib, + findOne: findOne, + findAll: findAll +}; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/comment.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/comment.d.ts new file mode 100644 index 00000000..2c4adaf9 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/comment.d.ts @@ -0,0 +1,19 @@ +import HTMLElement from './html'; +import Node from './node'; +import NodeType from './type'; +export default class CommentNode extends Node { + rawText: string; + clone(): CommentNode; + constructor(rawText: string, parentNode: HTMLElement, range?: [number, number]); + /** + * Node Type declaration. + * @type {Number} + */ + nodeType: NodeType; + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get text(): string; + toString(): string; +} diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/comment.js b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/comment.js new file mode 100644 index 00000000..defc78f6 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/comment.js @@ -0,0 +1,54 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var node_1 = __importDefault(require("./node")); +var type_1 = __importDefault(require("./type")); +var CommentNode = /** @class */ (function (_super) { + __extends(CommentNode, _super); + function CommentNode(rawText, parentNode, range) { + var _this = _super.call(this, parentNode, range) || this; + _this.rawText = rawText; + /** + * Node Type declaration. + * @type {Number} + */ + _this.nodeType = type_1.default.COMMENT_NODE; + return _this; + } + CommentNode.prototype.clone = function () { + return new CommentNode(this.rawText, null); + }; + Object.defineProperty(CommentNode.prototype, "text", { + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get: function () { + return this.rawText; + }, + enumerable: false, + configurable: true + }); + CommentNode.prototype.toString = function () { + return ""); + }; + return CommentNode; +}(node_1.default)); +exports.default = CommentNode; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/html.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/html.d.ts new file mode 100644 index 00000000..a9687ccb --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/html.d.ts @@ -0,0 +1,233 @@ +import VoidTag from '../void-tag'; +import Node from './node'; +import NodeType from './type'; +export interface KeyAttributes { + id?: string; + class?: string; +} +export interface Attributes { + [key: string]: string; +} +export interface RawAttributes { + [key: string]: string; +} +export declare type InsertPosition = 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend'; +declare class DOMTokenList { + private _set; + private _afterUpdate; + private _validate; + constructor(valuesInit?: string[], afterUpdate?: (t: DOMTokenList) => void); + add(c: string): void; + replace(c1: string, c2: string): void; + remove(c: string): void; + toggle(c: string): void; + contains(c: string): boolean; + get length(): number; + values(): IterableIterator; + get value(): string[]; + toString(): string; +} +/** + * HTMLElement, which contains a set of children. + * + * Note: this is a minimalist implementation, no complete tree + * structure provided (no parentNode, nextSibling, + * previousSibling etc). + * @class HTMLElement + * @extends {Node} + */ +export default class HTMLElement extends Node { + rawAttrs: string; + private voidTag; + private _attrs; + private _rawAttrs; + rawTagName: string; + id: string; + classList: DOMTokenList; + /** + * Node Type declaration. + */ + nodeType: NodeType; + /** + * Quote attribute values + * @param attr attribute value + * @returns {string} quoted value + */ + private quoteAttribute; + /** + * Creates an instance of HTMLElement. + * @param keyAttrs id and class attribute + * @param [rawAttrs] attributes in string + * + * @memberof HTMLElement + */ + constructor(tagName: string, keyAttrs: KeyAttributes, rawAttrs: string, parentNode: HTMLElement | null, range: [number, number], voidTag?: VoidTag); + /** + * Remove Child element from childNodes array + * @param {HTMLElement} node node to remove + */ + removeChild(node: Node): this; + /** + * Exchanges given child with new child + * @param {HTMLElement} oldNode node to exchange + * @param {HTMLElement} newNode new node + */ + exchangeChild(oldNode: Node, newNode: Node): this; + get tagName(): string; + set tagName(newname: string); + get localName(): string; + get isVoidElement(): boolean; + /** + * Get escpaed (as-it) text value of current node and its children. + * @return {string} text content + */ + get rawText(): string; + get textContent(): string; + set textContent(val: string); + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get text(): string; + /** + * Get structured Text (with '\n' etc.) + * @return {string} structured text + */ + get structuredText(): string; + toString(): string; + get innerHTML(): string; + set innerHTML(content: string); + set_content(content: string | Node | Node[], options?: Partial): this; + replaceWith(...nodes: (string | Node)[]): void; + get outerHTML(): string; + /** + * Trim element from right (in block) after seeing pattern in a TextNode. + * @param {RegExp} pattern pattern to find + * @return {HTMLElement} reference to current node + */ + trimRight(pattern: RegExp): this; + /** + * Get DOM structure + * @return {string} strucutre + */ + get structure(): string; + /** + * Remove whitespaces in this sub tree. + * @return {HTMLElement} pointer to this + */ + removeWhitespace(): this; + /** + * Query CSS selector to find matching nodes. + * @param {string} selector Simplified CSS selector + * @return {HTMLElement[]} matching elements + */ + querySelectorAll(selector: string): HTMLElement[]; + /** + * Query CSS Selector to find matching node. + * @param {string} selector Simplified CSS selector + * @return {(HTMLElement|null)} matching node + */ + querySelector(selector: string): HTMLElement | null; + /** + * find elements by their tagName + * @param {string} tagName the tagName of the elements to select + */ + getElementsByTagName(tagName: string): Array; + /** + * find element by it's id + * @param {string} id the id of the element to select + */ + getElementById(id: string): HTMLElement; + /** + * traverses the Element and its parents (heading toward the document root) until it finds a node that matches the provided selector string. Will return itself or the matching ancestor. If no such element exists, it returns null. + * @param selector a DOMString containing a selector list + */ + closest(selector: string): Node; + /** + * Append a child node to childNodes + * @param {Node} node node to append + * @return {Node} node appended + */ + appendChild(node: T): T; + /** + * Get first child node + * @return {Node} first child node + */ + get firstChild(): Node; + /** + * Get last child node + * @return {Node} last child node + */ + get lastChild(): Node; + /** + * Get attributes + * @access private + * @return {Object} parsed and unescaped attributes + */ + get attrs(): Attributes; + get attributes(): Record; + /** + * Get escaped (as-is) attributes + * @return {Object} parsed attributes + */ + get rawAttributes(): RawAttributes; + removeAttribute(key: string): this; + hasAttribute(key: string): boolean; + /** + * Get an attribute + * @return {string} value of the attribute + */ + getAttribute(key: string): string | undefined; + /** + * Set an attribute value to the HTMLElement + * @param {string} key The attribute name + * @param {string} value The value to set, or null / undefined to remove an attribute + */ + setAttribute(key: string, value: string): void; + /** + * Replace all the attributes of the HTMLElement by the provided attributes + * @param {Attributes} attributes the new attribute set + */ + setAttributes(attributes: Attributes): this; + insertAdjacentHTML(where: InsertPosition, html: string): this; + get nextSibling(): Node; + get nextElementSibling(): HTMLElement; + get previousSibling(): Node; + get previousElementSibling(): HTMLElement; + get classNames(): string; + /** + * Clone this Node + */ + clone(): Node; +} +export interface Options { + lowerCaseTagName: boolean; + comment: boolean; + parseNoneClosedTags?: boolean; + blockTextElements: { + [tag: string]: boolean; + }; + voidTag?: { + /** + * options, default value is ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'] + */ + tags?: string[]; + /** + * void tag serialisation, add a final slash
    + */ + closingSlash?: boolean; + }; +} +/** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + * @param {string} data html + * @return {HTMLElement} root element + */ +export declare function base_parse(data: string, options?: Partial): HTMLElement[]; +/** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + */ +export declare function parse(data: string, options?: Partial): HTMLElement; +export {}; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/html.js b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/html.js new file mode 100644 index 00000000..0bf26b07 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/html.js @@ -0,0 +1,1238 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parse = exports.base_parse = void 0; +var css_select_1 = require("css-select"); +var he_1 = __importDefault(require("he")); +var back_1 = __importDefault(require("../back")); +var matcher_1 = __importDefault(require("../matcher")); +var void_tag_1 = __importDefault(require("../void-tag")); +var comment_1 = __importDefault(require("./comment")); +var node_1 = __importDefault(require("./node")); +var text_1 = __importDefault(require("./text")); +var type_1 = __importDefault(require("./type")); +function decode(val) { + // clone string + return JSON.parse(JSON.stringify(he_1.default.decode(val))); +} +// https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements +var Htags = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'hgroup']; +var Dtags = ['details', 'dialog', 'dd', 'div', 'dt']; +var Ftags = ['fieldset', 'figcaption', 'figure', 'footer', 'form']; +var tableTags = ['table', 'td', 'tr']; +var htmlTags = ['address', 'article', 'aside', 'blockquote', 'br', 'hr', 'li', 'main', 'nav', 'ol', 'p', 'pre', 'section', 'ul']; +var kBlockElements = new Set(); +function addToKBlockElement() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var addToSet = function (array) { + for (var index = 0; index < array.length; index++) { + var element = array[index]; + kBlockElements.add(element); + kBlockElements.add(element.toUpperCase()); + } + }; + for (var _a = 0, args_1 = args; _a < args_1.length; _a++) { + var arg = args_1[_a]; + addToSet(arg); + } +} +addToKBlockElement(Htags, Dtags, Ftags, tableTags, htmlTags); +var DOMTokenList = /** @class */ (function () { + function DOMTokenList(valuesInit, afterUpdate) { + if (valuesInit === void 0) { valuesInit = []; } + if (afterUpdate === void 0) { afterUpdate = function () { return null; }; } + this._set = new Set(valuesInit); + this._afterUpdate = afterUpdate; + } + DOMTokenList.prototype._validate = function (c) { + if (/\s/.test(c)) { + throw new Error("DOMException in DOMTokenList.add: The token '".concat(c, "' contains HTML space characters, which are not valid in tokens.")); + } + }; + DOMTokenList.prototype.add = function (c) { + this._validate(c); + this._set.add(c); + this._afterUpdate(this); // eslint-disable-line @typescript-eslint/no-unsafe-call + }; + DOMTokenList.prototype.replace = function (c1, c2) { + this._validate(c2); + this._set.delete(c1); + this._set.add(c2); + this._afterUpdate(this); // eslint-disable-line @typescript-eslint/no-unsafe-call + }; + DOMTokenList.prototype.remove = function (c) { + this._set.delete(c) && this._afterUpdate(this); // eslint-disable-line @typescript-eslint/no-unsafe-call + }; + DOMTokenList.prototype.toggle = function (c) { + this._validate(c); + if (this._set.has(c)) + this._set.delete(c); + else + this._set.add(c); + this._afterUpdate(this); // eslint-disable-line @typescript-eslint/no-unsafe-call + }; + DOMTokenList.prototype.contains = function (c) { + return this._set.has(c); + }; + Object.defineProperty(DOMTokenList.prototype, "length", { + get: function () { + return this._set.size; + }, + enumerable: false, + configurable: true + }); + DOMTokenList.prototype.values = function () { + return this._set.values(); + }; + Object.defineProperty(DOMTokenList.prototype, "value", { + get: function () { + return Array.from(this._set.values()); + }, + enumerable: false, + configurable: true + }); + DOMTokenList.prototype.toString = function () { + return Array.from(this._set.values()).join(' '); + }; + return DOMTokenList; +}()); +/** + * HTMLElement, which contains a set of children. + * + * Note: this is a minimalist implementation, no complete tree + * structure provided (no parentNode, nextSibling, + * previousSibling etc). + * @class HTMLElement + * @extends {Node} + */ +var HTMLElement = /** @class */ (function (_super) { + __extends(HTMLElement, _super); + /** + * Creates an instance of HTMLElement. + * @param keyAttrs id and class attribute + * @param [rawAttrs] attributes in string + * + * @memberof HTMLElement + */ + function HTMLElement(tagName, keyAttrs, rawAttrs, parentNode, range, voidTag) { + if (rawAttrs === void 0) { rawAttrs = ''; } + if (voidTag === void 0) { voidTag = new void_tag_1.default(); } + var _this = _super.call(this, parentNode, range) || this; + _this.rawAttrs = rawAttrs; + _this.voidTag = voidTag; + /** + * Node Type declaration. + */ + _this.nodeType = type_1.default.ELEMENT_NODE; + _this.rawTagName = tagName; + _this.rawAttrs = rawAttrs || ''; + _this.id = keyAttrs.id || ''; + _this.childNodes = []; + _this.classList = new DOMTokenList(keyAttrs.class ? keyAttrs.class.split(/\s+/) : [], function (classList) { return _this.setAttribute('class', classList.toString()); } // eslint-disable-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + ); + if (keyAttrs.id) { + if (!rawAttrs) { + _this.rawAttrs = "id=\"".concat(keyAttrs.id, "\""); + } + } + if (keyAttrs.class) { + if (!rawAttrs) { + var cls = "class=\"".concat(_this.classList.toString(), "\""); + if (_this.rawAttrs) { + _this.rawAttrs += " ".concat(cls); + } + else { + _this.rawAttrs = cls; + } + } + } + return _this; + } + /** + * Quote attribute values + * @param attr attribute value + * @returns {string} quoted value + */ + HTMLElement.prototype.quoteAttribute = function (attr) { + if (attr == null) { + return 'null'; + } + return JSON.stringify(attr.replace(/"/g, '"')); + }; + /** + * Remove Child element from childNodes array + * @param {HTMLElement} node node to remove + */ + HTMLElement.prototype.removeChild = function (node) { + this.childNodes = this.childNodes.filter(function (child) { + return child !== node; + }); + return this; + }; + /** + * Exchanges given child with new child + * @param {HTMLElement} oldNode node to exchange + * @param {HTMLElement} newNode new node + */ + HTMLElement.prototype.exchangeChild = function (oldNode, newNode) { + var children = this.childNodes; + this.childNodes = children.map(function (child) { + if (child === oldNode) { + return newNode; + } + return child; + }); + return this; + }; + Object.defineProperty(HTMLElement.prototype, "tagName", { + get: function () { + return this.rawTagName ? this.rawTagName.toUpperCase() : this.rawTagName; + }, + set: function (newname) { + this.rawTagName = newname.toLowerCase(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "localName", { + get: function () { + return this.rawTagName.toLowerCase(); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "isVoidElement", { + get: function () { + return this.voidTag.isVoidElement(this.localName); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "rawText", { + /** + * Get escpaed (as-it) text value of current node and its children. + * @return {string} text content + */ + get: function () { + return this.childNodes.reduce(function (pre, cur) { + return (pre += cur.rawText); + }, ''); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "textContent", { + get: function () { + return decode(this.rawText); + }, + set: function (val) { + var content = [new text_1.default(val, this)]; + this.childNodes = content; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "text", { + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get: function () { + return decode(this.rawText); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "structuredText", { + /** + * Get structured Text (with '\n' etc.) + * @return {string} structured text + */ + get: function () { + var currentBlock = []; + var blocks = [currentBlock]; + function dfs(node) { + if (node.nodeType === type_1.default.ELEMENT_NODE) { + if (kBlockElements.has(node.rawTagName)) { + if (currentBlock.length > 0) { + blocks.push((currentBlock = [])); + } + node.childNodes.forEach(dfs); + if (currentBlock.length > 0) { + blocks.push((currentBlock = [])); + } + } + else { + node.childNodes.forEach(dfs); + } + } + else if (node.nodeType === type_1.default.TEXT_NODE) { + if (node.isWhitespace) { + // Whitespace node, postponed output + currentBlock.prependWhitespace = true; + } + else { + var text = node.trimmedText; + if (currentBlock.prependWhitespace) { + text = " ".concat(text); + currentBlock.prependWhitespace = false; + } + currentBlock.push(text); + } + } + } + dfs(this); + return blocks + .map(function (block) { + return block.join('').replace(/\s{2,}/g, ' '); // Normalize each line's whitespace + }) + .join('\n') + .replace(/\s+$/, ''); // trimRight; + }, + enumerable: false, + configurable: true + }); + HTMLElement.prototype.toString = function () { + var tag = this.rawTagName; + if (tag) { + var attrs = this.rawAttrs ? " ".concat(this.rawAttrs) : ''; + return this.voidTag.formatNode(tag, attrs, this.innerHTML); + } + return this.innerHTML; + }; + Object.defineProperty(HTMLElement.prototype, "innerHTML", { + get: function () { + return this.childNodes + .map(function (child) { + return child.toString(); + }) + .join(''); + }, + set: function (content) { + //const r = parse(content, global.options); // TODO global.options ? + var r = parse(content); + var nodes = r.childNodes.length ? r.childNodes : [new text_1.default(content, this)]; + resetParent(nodes, this); + resetParent(this.childNodes, null); + this.childNodes = nodes; + }, + enumerable: false, + configurable: true + }); + HTMLElement.prototype.set_content = function (content, options) { + if (options === void 0) { options = {}; } + if (content instanceof node_1.default) { + content = [content]; + } + else if (typeof content == 'string') { + var r = parse(content, options); + content = r.childNodes.length ? r.childNodes : [new text_1.default(content, this)]; + } + resetParent(this.childNodes, null); + resetParent(content, this); + this.childNodes = content; + return this; + }; + HTMLElement.prototype.replaceWith = function () { + var _this = this; + var nodes = []; + for (var _i = 0; _i < arguments.length; _i++) { + nodes[_i] = arguments[_i]; + } + var parent = this.parentNode; + var content = nodes + .map(function (node) { + if (node instanceof node_1.default) { + return [node]; + } + else if (typeof node == 'string') { + // const r = parse(content, global.options); // TODO global.options ? + var r = parse(node); + return r.childNodes.length ? r.childNodes : [new text_1.default(node, _this)]; + } + return []; + }) + .flat(); + var idx = parent.childNodes.findIndex(function (child) { + return child === _this; + }); + resetParent([this], null); + parent.childNodes = __spreadArray(__spreadArray(__spreadArray([], parent.childNodes.slice(0, idx), true), resetParent(content, parent), true), parent.childNodes.slice(idx + 1), true); + }; + Object.defineProperty(HTMLElement.prototype, "outerHTML", { + get: function () { + return this.toString(); + }, + enumerable: false, + configurable: true + }); + /** + * Trim element from right (in block) after seeing pattern in a TextNode. + * @param {RegExp} pattern pattern to find + * @return {HTMLElement} reference to current node + */ + HTMLElement.prototype.trimRight = function (pattern) { + for (var i = 0; i < this.childNodes.length; i++) { + var childNode = this.childNodes[i]; + if (childNode.nodeType === type_1.default.ELEMENT_NODE) { + childNode.trimRight(pattern); + } + else { + var index = childNode.rawText.search(pattern); + if (index > -1) { + childNode.rawText = childNode.rawText.substr(0, index); + // trim all following nodes. + this.childNodes.length = i + 1; + } + } + } + return this; + }; + Object.defineProperty(HTMLElement.prototype, "structure", { + /** + * Get DOM structure + * @return {string} strucutre + */ + get: function () { + var res = []; + var indention = 0; + function write(str) { + res.push(' '.repeat(indention) + str); + } + function dfs(node) { + var idStr = node.id ? "#".concat(node.id) : ''; + var classStr = node.classList.length ? ".".concat(node.classList.value.join('.')) : ''; // eslint-disable-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/restrict-template-expressions, @typescript-eslint/no-unsafe-call + write("".concat(node.rawTagName).concat(idStr).concat(classStr)); + indention++; + node.childNodes.forEach(function (childNode) { + if (childNode.nodeType === type_1.default.ELEMENT_NODE) { + dfs(childNode); + } + else if (childNode.nodeType === type_1.default.TEXT_NODE) { + if (!childNode.isWhitespace) { + write('#text'); + } + } + }); + indention--; + } + dfs(this); + return res.join('\n'); + }, + enumerable: false, + configurable: true + }); + /** + * Remove whitespaces in this sub tree. + * @return {HTMLElement} pointer to this + */ + HTMLElement.prototype.removeWhitespace = function () { + var _this = this; + var o = 0; + this.childNodes.forEach(function (node) { + if (node.nodeType === type_1.default.TEXT_NODE) { + if (node.isWhitespace) { + return; + } + node.rawText = node.trimmedRawText; + } + else if (node.nodeType === type_1.default.ELEMENT_NODE) { + node.removeWhitespace(); + } + _this.childNodes[o++] = node; + }); + this.childNodes.length = o; + return this; + }; + /** + * Query CSS selector to find matching nodes. + * @param {string} selector Simplified CSS selector + * @return {HTMLElement[]} matching elements + */ + HTMLElement.prototype.querySelectorAll = function (selector) { + return (0, css_select_1.selectAll)(selector, this, { + xmlMode: true, + adapter: matcher_1.default, + }); + }; + /** + * Query CSS Selector to find matching node. + * @param {string} selector Simplified CSS selector + * @return {(HTMLElement|null)} matching node + */ + HTMLElement.prototype.querySelector = function (selector) { + return (0, css_select_1.selectOne)(selector, this, { + xmlMode: true, + adapter: matcher_1.default, + }); + }; + /** + * find elements by their tagName + * @param {string} tagName the tagName of the elements to select + */ + HTMLElement.prototype.getElementsByTagName = function (tagName) { + var upperCasedTagName = tagName.toUpperCase(); + var re = []; + var stack = []; + var currentNodeReference = this; + var index = 0; + // index turns to undefined once the stack is empty and the first condition occurs + // which happens once all relevant children are searched through + while (index !== undefined) { + var child = void 0; + // make it work with sparse arrays + do { + child = currentNodeReference.childNodes[index++]; + } while (index < currentNodeReference.childNodes.length && child === undefined); + // if the child does not exist we move on with the last provided index (which belongs to the parentNode) + if (child === undefined) { + currentNodeReference = currentNodeReference.parentNode; + index = stack.pop(); + continue; + } + if (child.nodeType === type_1.default.ELEMENT_NODE) { + // https://developer.mozilla.org/en-US/docs/Web/API/Element/getElementsByTagName#syntax + if (tagName === '*' || child.tagName === upperCasedTagName) + re.push(child); + // if children are existing push the current status to the stack and keep searching for elements in the level below + if (child.childNodes.length > 0) { + stack.push(index); + currentNodeReference = child; + index = 0; + } + } + } + return re; + }; + /** + * find element by it's id + * @param {string} id the id of the element to select + */ + HTMLElement.prototype.getElementById = function (id) { + var stack = []; + var currentNodeReference = this; + var index = 0; + // index turns to undefined once the stack is empty and the first condition occurs + // which happens once all relevant children are searched through + while (index !== undefined) { + var child = void 0; + // make it work with sparse arrays + do { + child = currentNodeReference.childNodes[index++]; + } while (index < currentNodeReference.childNodes.length && child === undefined); + // if the child does not exist we move on with the last provided index (which belongs to the parentNode) + if (child === undefined) { + currentNodeReference = currentNodeReference.parentNode; + index = stack.pop(); + continue; + } + if (child.nodeType === type_1.default.ELEMENT_NODE) { + if (child.id === id) { + return child; + } + ; + // if children are existing push the current status to the stack and keep searching for elements in the level below + if (child.childNodes.length > 0) { + stack.push(index); + currentNodeReference = child; + index = 0; + } + } + } + return null; + }; + /** + * traverses the Element and its parents (heading toward the document root) until it finds a node that matches the provided selector string. Will return itself or the matching ancestor. If no such element exists, it returns null. + * @param selector a DOMString containing a selector list + */ + HTMLElement.prototype.closest = function (selector) { + var mapChild = new Map(); + var el = this; + var old = null; + function findOne(test, elems) { + var elem = null; + for (var i = 0, l = elems.length; i < l && !elem; i++) { + var el_1 = elems[i]; + if (test(el_1)) { + elem = el_1; + } + else { + var child = mapChild.get(el_1); + if (child) { + elem = findOne(test, [child]); + } + } + } + return elem; + } + while (el) { + mapChild.set(el, old); + old = el; + el = el.parentNode; + } + el = this; + while (el) { + var e = (0, css_select_1.selectOne)(selector, el, { + xmlMode: true, + adapter: __assign(__assign({}, matcher_1.default), { getChildren: function (node) { + var child = mapChild.get(node); + return child && [child]; + }, getSiblings: function (node) { + return [node]; + }, findOne: findOne, findAll: function () { + return []; + } }), + }); + if (e) { + return e; + } + el = el.parentNode; + } + return null; + }; + /** + * Append a child node to childNodes + * @param {Node} node node to append + * @return {Node} node appended + */ + HTMLElement.prototype.appendChild = function (node) { + // remove the node from it's parent + node.remove(); + this.childNodes.push(node); + node.parentNode = this; + return node; + }; + Object.defineProperty(HTMLElement.prototype, "firstChild", { + /** + * Get first child node + * @return {Node} first child node + */ + get: function () { + return this.childNodes[0]; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "lastChild", { + /** + * Get last child node + * @return {Node} last child node + */ + get: function () { + return (0, back_1.default)(this.childNodes); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "attrs", { + /** + * Get attributes + * @access private + * @return {Object} parsed and unescaped attributes + */ + get: function () { + if (this._attrs) { + return this._attrs; + } + this._attrs = {}; + var attrs = this.rawAttributes; + for (var key in attrs) { + var val = attrs[key] || ''; + this._attrs[key.toLowerCase()] = decode(val); + } + return this._attrs; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "attributes", { + get: function () { + var ret_attrs = {}; + var attrs = this.rawAttributes; + for (var key in attrs) { + var val = attrs[key] || ''; + ret_attrs[key] = decode(val); + } + return ret_attrs; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "rawAttributes", { + /** + * Get escaped (as-is) attributes + * @return {Object} parsed attributes + */ + get: function () { + if (this._rawAttrs) { + return this._rawAttrs; + } + var attrs = {}; + if (this.rawAttrs) { + var re = /([a-zA-Z()[\]#@][a-zA-Z0-9-_:()[\]#]*)(?:\s*=\s*((?:'[^']*')|(?:"[^"]*")|\S+))?/g; + var match = void 0; + while ((match = re.exec(this.rawAttrs))) { + var key = match[1]; + var val = match[2] || null; + if (val && (val[0] === "'" || val[0] === "\"")) + val = val.slice(1, val.length - 1); + attrs[key] = val; + } + } + this._rawAttrs = attrs; + return attrs; + }, + enumerable: false, + configurable: true + }); + HTMLElement.prototype.removeAttribute = function (key) { + var attrs = this.rawAttributes; + delete attrs[key]; + // Update this.attribute + if (this._attrs) { + delete this._attrs[key]; + } + // Update rawString + this.rawAttrs = Object.keys(attrs) + .map(function (name) { + var val = JSON.stringify(attrs[name]); + if (val === undefined || val === 'null') { + return name; + } + return "".concat(name, "=").concat(val); + }) + .join(' '); + // Update this.id + if (key === 'id') { + this.id = ''; + } + return this; + }; + HTMLElement.prototype.hasAttribute = function (key) { + return key.toLowerCase() in this.attrs; + }; + /** + * Get an attribute + * @return {string} value of the attribute + */ + HTMLElement.prototype.getAttribute = function (key) { + return this.attrs[key.toLowerCase()]; + }; + /** + * Set an attribute value to the HTMLElement + * @param {string} key The attribute name + * @param {string} value The value to set, or null / undefined to remove an attribute + */ + HTMLElement.prototype.setAttribute = function (key, value) { + var _this = this; + if (arguments.length < 2) { + throw new Error("Failed to execute 'setAttribute' on 'Element'"); + } + var k2 = key.toLowerCase(); + var attrs = this.rawAttributes; + for (var k in attrs) { + if (k.toLowerCase() === k2) { + key = k; + break; + } + } + attrs[key] = String(value); + // update this.attrs + if (this._attrs) { + this._attrs[k2] = decode(attrs[key]); + } + // Update rawString + this.rawAttrs = Object.keys(attrs) + .map(function (name) { + var val = _this.quoteAttribute(attrs[name]); + if (val === 'null' || val === '""') + return name; + return "".concat(name, "=").concat(val); + }) + .join(' '); + // Update this.id + if (key === 'id') { + this.id = value; + } + }; + /** + * Replace all the attributes of the HTMLElement by the provided attributes + * @param {Attributes} attributes the new attribute set + */ + HTMLElement.prototype.setAttributes = function (attributes) { + var _this = this; + // Invalidate current this.attributes + if (this._attrs) { + delete this._attrs; + } + // Invalidate current this.rawAttributes + if (this._rawAttrs) { + delete this._rawAttrs; + } + // Update rawString + this.rawAttrs = Object.keys(attributes) + .map(function (name) { + var val = attributes[name]; + if (val === 'null' || val === '""') + return name; + return "".concat(name, "=").concat(_this.quoteAttribute(String(val))); + }) + .join(' '); + return this; + }; + HTMLElement.prototype.insertAdjacentHTML = function (where, html) { + var _a, _b, _c; + var _this = this; + if (arguments.length < 2) { + throw new Error('2 arguments required'); + } + var p = parse(html); + if (where === 'afterend') { + var idx = this.parentNode.childNodes.findIndex(function (child) { + return child === _this; + }); + resetParent(p.childNodes, this.parentNode); + (_a = this.parentNode.childNodes).splice.apply(_a, __spreadArray([idx + 1, 0], p.childNodes, false)); + } + else if (where === 'afterbegin') { + resetParent(p.childNodes, this); + (_b = this.childNodes).unshift.apply(_b, p.childNodes); + } + else if (where === 'beforeend') { + p.childNodes.forEach(function (n) { + _this.appendChild(n); + }); + } + else if (where === 'beforebegin') { + var idx = this.parentNode.childNodes.findIndex(function (child) { + return child === _this; + }); + resetParent(p.childNodes, this.parentNode); + (_c = this.parentNode.childNodes).splice.apply(_c, __spreadArray([idx, 0], p.childNodes, false)); + } + else { + throw new Error("The value provided ('".concat(where, "') is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'")); + } + return this; + // if (!where || html === undefined || html === null) { + // return; + // } + }; + Object.defineProperty(HTMLElement.prototype, "nextSibling", { + get: function () { + if (this.parentNode) { + var children = this.parentNode.childNodes; + var i = 0; + while (i < children.length) { + var child = children[i++]; + if (this === child) + return children[i] || null; + } + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "nextElementSibling", { + get: function () { + if (this.parentNode) { + var children = this.parentNode.childNodes; + var i = 0; + var find = false; + while (i < children.length) { + var child = children[i++]; + if (find) { + if (child instanceof HTMLElement) { + return child || null; + } + } + else if (this === child) { + find = true; + } + } + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "previousSibling", { + get: function () { + if (this.parentNode) { + var children = this.parentNode.childNodes; + var i = children.length; + while (i > 0) { + var child = children[--i]; + if (this === child) + return children[i - 1] || null; + } + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "previousElementSibling", { + get: function () { + if (this.parentNode) { + var children = this.parentNode.childNodes; + var i = children.length; + var find = false; + while (i > 0) { + var child = children[--i]; + if (find) { + if (child instanceof HTMLElement) { + return child || null; + } + } + else if (this === child) { + find = true; + } + } + return null; + } + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(HTMLElement.prototype, "classNames", { + get: function () { + return this.classList.toString(); + }, + enumerable: false, + configurable: true + }); + /** + * Clone this Node + */ + HTMLElement.prototype.clone = function () { + return parse(this.toString()).firstChild; + }; + return HTMLElement; +}(node_1.default)); +exports.default = HTMLElement; +// https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name +var kMarkupPattern = /|<(\/?)([a-zA-Z][-.:0-9_a-zA-Z]*)((?:\s+[^>]*?(?:(?:'[^']*')|(?:"[^"]*"))?)*)\s*(\/?)>/g; +var kAttributePattern = /(?:^|\s)(id|class)\s*=\s*((?:'[^']*')|(?:"[^"]*")|\S+)/gi; +var kSelfClosingElements = { + area: true, + AREA: true, + base: true, + BASE: true, + br: true, + BR: true, + col: true, + COL: true, + hr: true, + HR: true, + img: true, + IMG: true, + input: true, + INPUT: true, + link: true, + LINK: true, + meta: true, + META: true, + source: true, + SOURCE: true, + embed: true, + EMBED: true, + param: true, + PARAM: true, + track: true, + TRACK: true, + wbr: true, + WBR: true, +}; +var kElementsClosedByOpening = { + li: { li: true, LI: true }, + LI: { li: true, LI: true }, + p: { p: true, div: true, P: true, DIV: true }, + P: { p: true, div: true, P: true, DIV: true }, + b: { div: true, DIV: true }, + B: { div: true, DIV: true }, + td: { td: true, th: true, TD: true, TH: true }, + TD: { td: true, th: true, TD: true, TH: true }, + th: { td: true, th: true, TD: true, TH: true }, + TH: { td: true, th: true, TD: true, TH: true }, + h1: { h1: true, H1: true }, + H1: { h1: true, H1: true }, + h2: { h2: true, H2: true }, + H2: { h2: true, H2: true }, + h3: { h3: true, H3: true }, + H3: { h3: true, H3: true }, + h4: { h4: true, H4: true }, + H4: { h4: true, H4: true }, + h5: { h5: true, H5: true }, + H5: { h5: true, H5: true }, + h6: { h6: true, H6: true }, + H6: { h6: true, H6: true }, +}; +var kElementsClosedByClosing = { + li: { ul: true, ol: true, UL: true, OL: true }, + LI: { ul: true, ol: true, UL: true, OL: true }, + a: { div: true, DIV: true }, + A: { div: true, DIV: true }, + b: { div: true, DIV: true }, + B: { div: true, DIV: true }, + i: { div: true, DIV: true }, + I: { div: true, DIV: true }, + p: { div: true, DIV: true }, + P: { div: true, DIV: true }, + td: { tr: true, table: true, TR: true, TABLE: true }, + TD: { tr: true, table: true, TR: true, TABLE: true }, + th: { tr: true, table: true, TR: true, TABLE: true }, + TH: { tr: true, table: true, TR: true, TABLE: true }, +}; +var frameflag = 'documentfragmentcontainer'; +/** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + * @param {string} data html + * @return {HTMLElement} root element + */ +function base_parse(data, options) { + var _a, _b; + if (options === void 0) { options = { lowerCaseTagName: false, comment: false }; } + var voidTag = new void_tag_1.default((_a = options === null || options === void 0 ? void 0 : options.voidTag) === null || _a === void 0 ? void 0 : _a.closingSlash, (_b = options === null || options === void 0 ? void 0 : options.voidTag) === null || _b === void 0 ? void 0 : _b.tags); + var elements = options.blockTextElements || { + script: true, + noscript: true, + style: true, + pre: true, + }; + var element_names = Object.keys(elements); + var kBlockTextElements = element_names.map(function (it) { return new RegExp("^".concat(it, "$"), 'i'); }); + var kIgnoreElements = element_names.filter(function (it) { return elements[it]; }).map(function (it) { return new RegExp("^".concat(it, "$"), 'i'); }); + function element_should_be_ignore(tag) { + return kIgnoreElements.some(function (it) { return it.test(tag); }); + } + function is_block_text_element(tag) { + return kBlockTextElements.some(function (it) { return it.test(tag); }); + } + var createRange = function (startPos, endPos) { return [startPos - frameFlagOffset, endPos - frameFlagOffset]; }; + var root = new HTMLElement(null, {}, '', null, [0, data.length], voidTag); + var currentParent = root; + var stack = [root]; + var lastTextPos = -1; + var noNestedTagIndex = undefined; + var match; + // https://github.com/taoqf/node-html-parser/issues/38 + data = "<".concat(frameflag, ">").concat(data, ""); + var lowerCaseTagName = options.lowerCaseTagName; + var dataEndPos = data.length - (frameflag.length + 2); + var frameFlagOffset = frameflag.length + 2; + while ((match = kMarkupPattern.exec(data))) { + // Note: Object destructuring here consistently tests as higher performance than array destructuring + // eslint-disable-next-line prefer-const + var matchText = match[0], leadingSlash = match[1], tagName = match[2], attributes = match[3], closingSlash = match[4]; + var matchLength = matchText.length; + var tagStartPos = kMarkupPattern.lastIndex - matchLength; + var tagEndPos = kMarkupPattern.lastIndex; + // Add TextNode if content + if (lastTextPos > -1) { + if (lastTextPos + matchLength < tagEndPos) { + var text = data.substring(lastTextPos, tagStartPos); + currentParent.appendChild(new text_1.default(text, currentParent, createRange(lastTextPos, tagStartPos))); + } + } + lastTextPos = kMarkupPattern.lastIndex; + // https://github.com/taoqf/node-html-parser/issues/38 + // Skip frameflag node + if (tagName === frameflag) + continue; + // Handle comments + if (matchText[1] === '!') { + if (options.comment) { + // Only keep what is in between + var text = data.substring(tagStartPos + 4, tagEndPos - 3); + currentParent.appendChild(new comment_1.default(text, currentParent, createRange(tagStartPos, tagEndPos))); + } + continue; + } + /* -- Handle tag matching -- */ + // Fix tag casing if necessary + if (lowerCaseTagName) + tagName = tagName.toLowerCase(); + // Handle opening tags (ie. not ) + if (!leadingSlash) { + /* Populate attributes */ + var attrs = {}; + for (var attMatch = void 0; (attMatch = kAttributePattern.exec(attributes));) { + var key = attMatch[1], val = attMatch[2]; + var isQuoted = val[0] === "'" || val[0] === "\""; + attrs[key.toLowerCase()] = isQuoted ? val.slice(1, val.length - 1) : val; + } + var parentTagName = currentParent.rawTagName; + if (!closingSlash && kElementsClosedByOpening[parentTagName]) { + if (kElementsClosedByOpening[parentTagName][tagName]) { + stack.pop(); + currentParent = (0, back_1.default)(stack); + } + } + // Prevent nested A tags by terminating the last A and starting a new one : see issue #144 + if (tagName === 'a' || tagName === 'A') { + if (noNestedTagIndex !== undefined) { + stack.splice(noNestedTagIndex); + currentParent = (0, back_1.default)(stack); + } + noNestedTagIndex = stack.length; + } + var tagEndPos_1 = kMarkupPattern.lastIndex; + var tagStartPos_1 = tagEndPos_1 - matchLength; + currentParent = currentParent.appendChild( + // Initialize range (end position updated later for closed tags) + new HTMLElement(tagName, attrs, attributes.slice(1), null, createRange(tagStartPos_1, tagEndPos_1), voidTag)); + stack.push(currentParent); + if (is_block_text_element(tagName)) { + // Find closing tag + var closeMarkup = ""); + var closeIndex = lowerCaseTagName + ? data.toLocaleLowerCase().indexOf(closeMarkup, kMarkupPattern.lastIndex) + : data.indexOf(closeMarkup, kMarkupPattern.lastIndex); + var textEndPos = closeIndex === -1 ? dataEndPos : closeIndex; + if (element_should_be_ignore(tagName)) { + var text = data.substring(tagEndPos_1, textEndPos); + if (text.length > 0 && /\S/.test(text)) { + currentParent.appendChild(new text_1.default(text, currentParent, createRange(tagEndPos_1, textEndPos))); + } + } + if (closeIndex === -1) { + lastTextPos = kMarkupPattern.lastIndex = data.length + 1; + } + else { + lastTextPos = kMarkupPattern.lastIndex = closeIndex + closeMarkup.length; + // Cause to be treated as self-closing, because no close found + leadingSlash = '/'; + } + } + } + // Handle closing tags or self-closed elements (ie or
    ) + if (leadingSlash || closingSlash || kSelfClosingElements[tagName]) { + while (true) { + if (tagName === 'a' || tagName === 'A') + noNestedTagIndex = undefined; + if (currentParent.rawTagName === tagName) { + // Update range end for closed tag + currentParent.range[1] = createRange(-1, Math.max(lastTextPos, tagEndPos))[1]; + stack.pop(); + currentParent = (0, back_1.default)(stack); + break; + } + else { + var parentTagName = currentParent.tagName; + // Trying to close current tag, and move on + if (kElementsClosedByClosing[parentTagName]) { + if (kElementsClosedByClosing[parentTagName][tagName]) { + stack.pop(); + currentParent = (0, back_1.default)(stack); + continue; + } + } + // Use aggressive strategy to handle unmatching markups. + break; + } + } + } + } + return stack; +} +exports.base_parse = base_parse; +/** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + */ +function parse(data, options) { + if (options === void 0) { options = { lowerCaseTagName: false, comment: false }; } + var stack = base_parse(data, options); + var root = stack[0]; + var _loop_1 = function () { + // Handle each error elements. + var last = stack.pop(); + var oneBefore = (0, back_1.default)(stack); + if (last.parentNode && last.parentNode.parentNode) { + if (last.parentNode === oneBefore && last.tagName === oneBefore.tagName) { + // Pair error case

    handle : Fixes to

    + // this is wrong, becouse this will put the H3 outside the current right position which should be inside the current Html Element, see issue 152 for more info + if (options.parseNoneClosedTags !== true) { + oneBefore.removeChild(last); + last.childNodes.forEach(function (child) { + oneBefore.parentNode.appendChild(child); + }); + stack.pop(); + } + } + else { + // Single error

    handle: Just removes

    + // Why remove? this is already a HtmlElement and the missing

    is already added in this case. see issue 152 for more info + // eslint-disable-next-line no-lonely-if + if (options.parseNoneClosedTags !== true) { + oneBefore.removeChild(last); + last.childNodes.forEach(function (child) { + oneBefore.appendChild(child); + }); + } + } + } + else { + // If it's final element just skip. + } + }; + while (stack.length > 1) { + _loop_1(); + } + // response.childNodes.forEach((node) => { + // if (node instanceof HTMLElement) { + // node.parentNode = null; + // } + // }); + return root; +} +exports.parse = parse; +function resetParent(nodes, parent) { + return nodes.map(function (node) { + node.parentNode = parent; + return node; + }); +} diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/node.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/node.d.ts new file mode 100644 index 00000000..11f6881a --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/node.d.ts @@ -0,0 +1,23 @@ +import NodeType from './type'; +import HTMLElement from './html'; +/** + * Node Class as base class for TextNode and HTMLElement. + */ +export default abstract class Node { + parentNode: HTMLElement; + abstract nodeType: NodeType; + childNodes: Node[]; + range: readonly [number, number]; + abstract text: string; + abstract rawText: string; + abstract toString(): string; + abstract clone(): Node; + constructor(parentNode?: HTMLElement, range?: [number, number]); + /** + * Remove current node + */ + remove(): this; + get innerText(): string; + get textContent(): string; + set textContent(val: string); +} diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/node.js b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/node.js new file mode 100644 index 00000000..54026ad7 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/node.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var he_1 = require("he"); +/** + * Node Class as base class for TextNode and HTMLElement. + */ +var Node = /** @class */ (function () { + function Node(parentNode, range) { + if (parentNode === void 0) { parentNode = null; } + this.parentNode = parentNode; + this.childNodes = []; + Object.defineProperty(this, 'range', { + enumerable: false, + writable: true, + configurable: true, + value: range !== null && range !== void 0 ? range : [-1, -1] + }); + } + /** + * Remove current node + */ + Node.prototype.remove = function () { + var _this = this; + if (this.parentNode) { + var children = this.parentNode.childNodes; + this.parentNode.childNodes = children.filter(function (child) { + return _this !== child; + }); + this.parentNode = null; + } + return this; + }; + Object.defineProperty(Node.prototype, "innerText", { + get: function () { + return this.rawText; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(Node.prototype, "textContent", { + get: function () { + return (0, he_1.decode)(this.rawText); + }, + set: function (val) { + this.rawText = (0, he_1.encode)(val); + }, + enumerable: false, + configurable: true + }); + return Node; +}()); +exports.default = Node; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/text.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/text.d.ts new file mode 100644 index 00000000..84a60f90 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/text.d.ts @@ -0,0 +1,43 @@ +import HTMLElement from './html'; +import Node from './node'; +import NodeType from './type'; +/** + * TextNode to contain a text element in DOM tree. + * @param {string} value [description] + */ +export default class TextNode extends Node { + clone(): TextNode; + constructor(rawText: string, parentNode: HTMLElement, range?: [number, number]); + /** + * Node Type declaration. + * @type {Number} + */ + nodeType: NodeType; + private _rawText; + private _trimmedRawText?; + private _trimmedText?; + get rawText(): string; + /** + * Set rawText and invalidate trimmed caches + */ + set rawText(text: string); + /** + * Returns raw text with all whitespace trimmed except single leading/trailing non-breaking space + */ + get trimmedRawText(): string; + /** + * Returns text with all whitespace trimmed except single leading/trailing non-breaking space + */ + get trimmedText(): string; + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get text(): string; + /** + * Detect if the node contains only white space. + * @return {boolean} + */ + get isWhitespace(): boolean; + toString(): string; +} diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/text.js b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/text.js new file mode 100644 index 00000000..4cbbbd42 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/text.js @@ -0,0 +1,142 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +var he_1 = require("he"); +var node_1 = __importDefault(require("./node")); +var type_1 = __importDefault(require("./type")); +/** + * TextNode to contain a text element in DOM tree. + * @param {string} value [description] + */ +var TextNode = /** @class */ (function (_super) { + __extends(TextNode, _super); + function TextNode(rawText, parentNode, range) { + var _this = _super.call(this, parentNode, range) || this; + /** + * Node Type declaration. + * @type {Number} + */ + _this.nodeType = type_1.default.TEXT_NODE; + _this._rawText = rawText; + return _this; + } + TextNode.prototype.clone = function () { + return new TextNode(this._rawText, null); + }; + Object.defineProperty(TextNode.prototype, "rawText", { + get: function () { + return this._rawText; + }, + /** + * Set rawText and invalidate trimmed caches + */ + set: function (text) { + this._rawText = text; + this._trimmedRawText = void 0; + this._trimmedText = void 0; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(TextNode.prototype, "trimmedRawText", { + /** + * Returns raw text with all whitespace trimmed except single leading/trailing non-breaking space + */ + get: function () { + if (this._trimmedRawText !== undefined) + return this._trimmedRawText; + this._trimmedRawText = trimText(this.rawText); + return this._trimmedRawText; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(TextNode.prototype, "trimmedText", { + /** + * Returns text with all whitespace trimmed except single leading/trailing non-breaking space + */ + get: function () { + if (this._trimmedText !== undefined) + return this._trimmedText; + this._trimmedText = trimText(this.text); + return this._trimmedText; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(TextNode.prototype, "text", { + /** + * Get unescaped text value of current node and its children. + * @return {string} text content + */ + get: function () { + return (0, he_1.decode)(this.rawText); + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(TextNode.prototype, "isWhitespace", { + /** + * Detect if the node contains only white space. + * @return {boolean} + */ + get: function () { + return /^(\s| )*$/.test(this.rawText); + }, + enumerable: false, + configurable: true + }); + TextNode.prototype.toString = function () { + return this.rawText; + }; + return TextNode; +}(node_1.default)); +exports.default = TextNode; +/** + * Trim whitespace except single leading/trailing non-breaking space + */ +function trimText(text) { + var i = 0; + var startPos; + var endPos; + while (i >= 0 && i < text.length) { + if (/\S/.test(text[i])) { + if (startPos === undefined) { + startPos = i; + i = text.length; + } + else { + endPos = i; + i = void 0; + } + } + if (startPos === undefined) + i++; + else + i--; + } + if (startPos === undefined) + startPos = 0; + if (endPos === undefined) + endPos = text.length - 1; + var hasLeadingSpace = startPos > 0 && /[^\S\r\n]/.test(text[startPos - 1]); + var hasTrailingSpace = endPos < (text.length - 1) && /[^\S\r\n]/.test(text[endPos + 1]); + return (hasLeadingSpace ? ' ' : '') + text.slice(startPos, endPos + 1) + (hasTrailingSpace ? ' ' : ''); +} diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/type.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/type.d.ts new file mode 100644 index 00000000..32cc815b --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/type.d.ts @@ -0,0 +1,6 @@ +declare enum NodeType { + ELEMENT_NODE = 1, + TEXT_NODE = 3, + COMMENT_NODE = 8 +} +export default NodeType; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/nodes/type.js b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/type.js new file mode 100644 index 00000000..d3848b6f --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/nodes/type.js @@ -0,0 +1,9 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var NodeType; +(function (NodeType) { + NodeType[NodeType["ELEMENT_NODE"] = 1] = "ELEMENT_NODE"; + NodeType[NodeType["TEXT_NODE"] = 3] = "TEXT_NODE"; + NodeType[NodeType["COMMENT_NODE"] = 8] = "COMMENT_NODE"; +})(NodeType || (NodeType = {})); +exports.default = NodeType; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/parse.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/parse.d.ts new file mode 100644 index 00000000..0ef09572 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/parse.d.ts @@ -0,0 +1 @@ +export { parse as default } from './nodes/html'; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/parse.js b/@capacitor/assets/node_modules/node-html-parser/dist/parse.js new file mode 100644 index 00000000..b016f8b4 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/parse.js @@ -0,0 +1,5 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = void 0; +var html_1 = require("./nodes/html"); +Object.defineProperty(exports, "default", { enumerable: true, get: function () { return html_1.parse; } }); diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/valid.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/valid.d.ts new file mode 100644 index 00000000..c834dd95 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/valid.d.ts @@ -0,0 +1,6 @@ +import { Options } from './nodes/html'; +/** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + */ +export default function valid(data: string, options?: Partial): boolean; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/valid.js b/@capacitor/assets/node_modules/node-html-parser/dist/valid.js new file mode 100644 index 00000000..4c38157e --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/valid.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var html_1 = require("./nodes/html"); +/** + * Parses HTML and returns a root element + * Parse a chuck of HTML source. + */ +function valid(data, options) { + if (options === void 0) { options = { lowerCaseTagName: false, comment: false }; } + var stack = (0, html_1.base_parse)(data, options); + return Boolean(stack.length === 1); +} +exports.default = valid; diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/void-tag.d.ts b/@capacitor/assets/node_modules/node-html-parser/dist/void-tag.d.ts new file mode 100644 index 00000000..49860310 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/void-tag.d.ts @@ -0,0 +1,7 @@ +export default class VoidTag { + addClosingSlash: boolean; + private voidTags; + constructor(addClosingSlash?: boolean, tags?: string[]); + formatNode(tag: string, attrs: string, innerHTML: string): string; + isVoidElement(tag: string): boolean; +} diff --git a/@capacitor/assets/node_modules/node-html-parser/dist/void-tag.js b/@capacitor/assets/node_modules/node-html-parser/dist/void-tag.js new file mode 100644 index 00000000..02ebdee1 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/dist/void-tag.js @@ -0,0 +1,29 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var VoidTag = /** @class */ (function () { + function VoidTag(addClosingSlash, tags) { + if (addClosingSlash === void 0) { addClosingSlash = false; } + this.addClosingSlash = addClosingSlash; + if (Array.isArray(tags)) { + this.voidTags = tags.reduce(function (set, tag) { + return set.add(tag.toLowerCase()); + }, new Set()); + } + else { + this.voidTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'].reduce(function (set, tag) { + return set.add(tag); + }, new Set()); + } + } + VoidTag.prototype.formatNode = function (tag, attrs, innerHTML) { + var addClosingSlash = this.addClosingSlash; + var closingSpace = (addClosingSlash && attrs && !attrs.endsWith(' ')) ? ' ' : ''; + var closingSlash = addClosingSlash ? "".concat(closingSpace, "/") : ''; + return this.isVoidElement(tag.toLowerCase()) ? "<".concat(tag).concat(attrs).concat(closingSlash, ">") : "<".concat(tag).concat(attrs, ">").concat(innerHTML, ""); + }; + VoidTag.prototype.isVoidElement = function (tag) { + return this.voidTags.has(tag); + }; + return VoidTag; +}()); +exports.default = VoidTag; diff --git a/@capacitor/assets/node_modules/node-html-parser/package.json b/@capacitor/assets/node_modules/node-html-parser/package.json new file mode 100644 index 00000000..1edb2120 --- /dev/null +++ b/@capacitor/assets/node_modules/node-html-parser/package.json @@ -0,0 +1,111 @@ +{ + "name": "node-html-parser", + "version": "5.4.2", + "description": "A very fast HTML parser, generating a simplified DOM, with basic element query support.", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "compile": "tsc", + "build": "npm run lint && npm run clean && npm run compile:cjs && npm run compile:amd", + "compile:cjs": "tsc -m commonjs", + "compile:amd": "tsc -t es5 -m amd -d false --outFile ./dist/main.js", + "lint": "eslint ./src/*.ts ./src/**/*.ts", + "---------------": "", + "test": "yarn run test:target", + "test:src": "cross-env TEST_TARGET=src yarn run test", + "test:dist": "cross-env TEST_TARGET=dist yarn run test", + "benchmark": "node ./test/benchmark/compare.mjs", + "--------------- ": "", + "clean": "npx rimraf ./dist/", + "clean:global": "yarn run clean && npx rimraf yarn.lock test/yarn.lock test/node_modules node_modules", + "reset": "yarn run clean:global && yarn install && yarn build", + "--------------- ": "", + "test:target": "mocha --recursive \"./test/tests\"", + "test:ci": "cross-env TEST_TARGET=dist yarn run test:target", + "posttest": "yarn run benchmark", + "prepare": "cd test && yarn install" + }, + "keywords": [ + "html", + "parser", + "nodejs", + "typescript" + ], + "files": [ + "dist", + "README.md", + "LICENSE", + "CHANGELOG.md" + ], + "author": "Xiaoyi Shi ", + "contributors": [ + "taoqf ", + "Ron S. " + ], + "license": "MIT", + "publishConfig": { + "registry": "https://registry.npmjs.org" + }, + "dependencies": { + "css-select": "^4.2.1", + "he": "1.2.0" + }, + "devDependencies": { + "@types/entities": "latest", + "@types/he": "latest", + "@types/node": "latest", + "@typescript-eslint/eslint-plugin": "latest", + "@typescript-eslint/eslint-plugin-tslint": "latest", + "@typescript-eslint/parser": "latest", + "blanket": "latest", + "cheerio": "^1.0.0-rc.5", + "cross-env": "^7.0.3", + "eslint": "^7.32.0", + "eslint-config-prettier": "latest", + "eslint-plugin-import": "latest", + "high5": "^1.0.0", + "html-dom-parser": "^1.0.4", + "html-parser": "^0.11.0", + "html5parser": "^2.0.2", + "htmljs-parser": "^2.11.1", + "htmlparser": "^1.7.7", + "htmlparser-benchmark": "^1.1.3", + "htmlparser2": "^6.0.0", + "mocha": "latest", + "mocha-each": "^2.0.1", + "neutron-html5parser": "^0.2.0", + "np": "latest", + "parse5": "^6.0.1", + "rimraf": "^3.0.2", + "saxes": "^6.0.0", + "should": "latest", + "spec": "latest", + "standard-version": "^9.3.1", + "travis-cov": "latest", + "ts-node": "^10.2.1", + "typescript": "latest" + }, + "config": { + "blanket": { + "pattern": "./dist/index.js", + "data-cover-never": [ + "node_modules" + ] + }, + "travis-cov": { + "threshold": 70 + } + }, + "directories": { + "test": "test" + }, + "repository": { + "type": "git", + "url": "https://github.com/taoqf/node-fast-html-parser.git" + }, + "bugs": { + "url": "https://github.com/taoqf/node-fast-html-parser/issues" + }, + "homepage": "https://github.com/taoqf/node-fast-html-parser", + "sideEffects": false +} diff --git a/@capacitor/assets/node_modules/rimraf/LICENSE b/@capacitor/assets/node_modules/rimraf/LICENSE new file mode 100644 index 00000000..1493534e --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) 2011-2023 Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/@capacitor/assets/node_modules/rimraf/README.md b/@capacitor/assets/node_modules/rimraf/README.md new file mode 100644 index 00000000..0f57b053 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/README.md @@ -0,0 +1,214 @@ +The [UNIX command]() `rm -rf` for node. + +Install with `npm install rimraf`. + +## Major Changes from v3 to v4 + +- The function returns a `Promise` instead of taking a callback. +- Globbing requires the `--glob` option to be set. (Removed in + 4.0 and 4.1, opt-in support added in 4.2.) +- Functions take arrays of paths, as well as a single path. +- Native implementation used by default when available, except on + Windows, where this implementation is faster and more reliable. +- New implementation on Windows, falling back to "move then + remove" strategy when exponential backoff for `EBUSY` fails to + resolve the situation. +- Simplified implementation on Posix, since the Windows + affordances are not necessary there. +- As of 4.3, return/resolve value is boolean instead of undefined + +## API + +Hybrid module, load either with `import` or `require()`. + +```js +// default export is the main rimraf function, or use named imports +import rimraf from 'rimraf' +// or +const rimraf = require('rimraf') + +// other strategies exported as well +import { rimraf, rimrafSync, native, nativeSync } from 'rimraf' +// or +const { rimraf, rimrafSync, native, nativeSync } = require('rimraf') +``` + +All removal functions return a boolean indicating that all +entries were successfully removed. + +The only case in which this will not return `true` is if +something was omitted from the removal via a `filter` option. + +### `rimraf(f, [opts]) -> Promise` + +This first parameter is a path or array of paths. The second +argument is an options object. + +Options: + +- `preserveRoot`: If set to boolean `false`, then allow the + recursive removal of the root directory. Otherwise, this is + not allowed. +- `tmp`: Windows only. Temp folder to use to place files and + folders for the "move then remove" fallback. Must be on the + same physical device as the path being deleted. Defaults to + `os.tmpdir()` when that is on the same drive letter as the path + being deleted, or `${drive}:\temp` if present, or `${drive}:\` + if not. +- `maxRetries`: Windows and Native only. Maximum number of + retry attempts in case of `EBUSY`, `EMFILE`, and `ENFILE` + errors. Default `10` for Windows implementation, `0` for Native + implementation. +- `backoff`: Windows only. Rate of exponential backoff for async + removal in case of `EBUSY`, `EMFILE`, and `ENFILE` errors. + Should be a number greater than 1. Default `1.2` +- `maxBackoff`: Windows only. Maximum total backoff time in ms to + attempt asynchronous retries in case of `EBUSY`, `EMFILE`, and + `ENFILE` errors. Default `200`. With the default `1.2` backoff + rate, this results in 14 retries, with the final retry being + delayed 33ms. +- `retryDelay`: Native only. Time to wait between retries, using + linear backoff. Default `100`. +- `signal` Pass in an AbortSignal to cancel the directory + removal. This is useful when removing large folder structures, + if you'd like to limit the amount of time spent. + + Using a `signal` option prevents the use of Node's built-in + `fs.rm` because that implementation does not support abort + signals. + +- `filter` Method that returns a boolean indicating whether that + path should be deleted. With async rimraf methods, this may + return a Promise that resolves to a boolean. (Since Promises + are truthy, returning a Promise from a sync filter is the same + as just not filtering anything.) + + The first argument to the filter is the path string. The + second argument is either a `Dirent` or `Stats` object for that + path. (The first path explored will be a `Stats`, the rest + will be `Dirent`.) + + If a filter method is provided, it will _only_ remove entries + if the filter returns (or resolves to) a truthy value. Omitting + a directory will still allow its children to be removed, unless + they are also filtered out, but any parents of a filtered entry + will not be removed, since the directory would not be empty in + that case. + + Using a filter method prevents the use of Node's built-in + `fs.rm` because that implementation does not support filtering. + +Any other options are provided to the native Node.js `fs.rm` implementation +when that is used. + +This will attempt to choose the best implementation, based on Node.js +version and `process.platform`. To force a specific implementation, use +one of the other functions provided. + +### `rimraf.sync(f, [opts])` `rimraf.rimrafSync(f, [opts])` + +Synchronous form of `rimraf()` + +Note that, unlike many file system operations, the synchronous form will +typically be significantly _slower_ than the async form, because recursive +deletion is extremely parallelizable. + +### `rimraf.native(f, [opts])` + +Uses the built-in `fs.rm` implementation that Node.js provides. This is +used by default on Node.js versions greater than or equal to `14.14.0`. + +### `rimraf.nativeSync(f, [opts])` `rimraf.native.sync(f, [opts])` + +Synchronous form of `rimraf.native` + +### `rimraf.manual(f, [opts])` + +Use the JavaScript implementation appropriate for your operating system. + +### `rimraf.manualSync(f, [opts])` `rimraf.manualSync(f, opts)` + +Synchronous form of `rimraf.manual()` + +### `rimraf.windows(f, [opts])` + +JavaScript implementation of file removal appropriate for Windows +platforms. Works around `unlink` and `rmdir` not being atomic +operations, and `EPERM` when deleting files with certain +permission modes. + +First deletes all non-directory files within the tree, and then +removes all directories, which should ideally be empty by that +time. When an `ENOTEMPTY` is raised in the second pass, falls +back to the `rimraf.moveRemove` strategy as needed. + +### `rimraf.windows.sync(path, [opts])` `rimraf.windowsSync(path, [opts])` + +Synchronous form of `rimraf.windows()` + +### `rimraf.moveRemove(path, [opts])` + +Moves all files and folders to the parent directory of `path` +with a temporary filename prior to attempting to remove them. + +Note that, in cases where the operation fails, this _may_ leave +files lying around in the parent directory with names like +`.file-basename.txt.0.123412341`. Until the Windows kernel +provides a way to perform atomic `unlink` and `rmdir` operations, +this is unfortunately unavoidable. + +To move files to a different temporary directory other than the +parent, provide `opts.tmp`. Note that this _must_ be on the same +physical device as the folder being deleted, or else the +operation will fail. + +This is the slowest strategy, but most reliable on Windows +platforms. Used as a last-ditch fallback by `rimraf.windows()`. + +### `rimraf.moveRemove.sync(path, [opts])` `rimraf.moveRemoveSync(path, [opts])` + +Synchronous form of `rimraf.moveRemove()` + +### Command Line Interface + +``` +rimraf version 4.3.0 + +Usage: rimraf [ ...] +Deletes all files and folders at "path", recursively. + +Options: + -- Treat all subsequent arguments as paths + -h --help Display this usage info + --preserve-root Do not remove '/' recursively (default) + --no-preserve-root Do not treat '/' specially + -G --no-glob Treat arguments as literal paths, not globs (default) + -g --glob Treat arguments as glob patterns + -v --verbose Be verbose when deleting files, showing them as + they are removed. Not compatible with --impl=native + -V --no-verbose Be silent when deleting files, showing nothing as + they are removed (default) + -i --interactive Ask for confirmation before deleting anything + Not compatible with --impl=native + -I --no-interactive Do not ask for confirmation before deleting + + --impl= Specify the implementation to use: + rimraf: choose the best option (default) + native: the built-in implementation in Node.js + manual: the platform-specific JS implementation + posix: the Posix JS implementation + windows: the Windows JS implementation (falls back to + move-remove on ENOTEMPTY) + move-remove: a slow reliable Windows fallback + +Implementation-specific options: + --tmp= Temp file folder for 'move-remove' implementation + --max-retries= maxRetries for 'native' and 'windows' implementations + --retry-delay= retryDelay for 'native' implementation, default 100 + --backoff= Exponential backoff factor for retries (default: 1.2) +``` + +## mkdirp + +If you need to _create_ a directory recursively, check out +[mkdirp](https://github.com/isaacs/node-mkdirp). diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/package.json b/@capacitor/assets/node_modules/rimraf/dist/cjs/package.json new file mode 100644 index 00000000..ea8c28b0 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/package.json @@ -0,0 +1,84 @@ +{ + "name": "rimraf", + "version": "4.4.1", + "main": "./dist/cjs/src/index-cjs.js", + "module": "./dist/mjs/index.js", + "types": "./dist/mjs/index.d.ts", + "bin": "./dist/cjs/src/bin.js", + "exports": { + ".": { + "import": { + "types": "./dist/mjs/index.d.ts", + "default": "./dist/mjs/index.js" + }, + "require": { + "types": "./dist/cjs/src/index.d.ts", + "default": "./dist/cjs/src/index-cjs.js" + } + } + }, + "files": [ + "dist" + ], + "description": "A deep deletion module for node (like `rm -rf`)", + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC", + "repository": "git://github.com/isaacs/rimraf.git", + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "preprepare": "rm -rf dist", + "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json", + "postprepare": "bash fixup.sh", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "c8 tap", + "snap": "c8 tap", + "format": "prettier --write . --loglevel warn", + "benchmark": "node benchmark/index.js", + "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts" + }, + "prettier": { + "semi": false, + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + }, + "devDependencies": { + "@types/node": "^18.11.9", + "@types/tap": "^15.0.7", + "c8": "^7.12.0", + "eslint-config-prettier": "^8.6.0", + "mkdirp": "1", + "prettier": "^2.8.2", + "tap": "^16.3.4", + "ts-node": "^10.9.1", + "typedoc": "^0.23.21", + "typescript": "^4.9.3" + }, + "tap": { + "coverage": false, + "libtap-settings": "libtap-settings.js", + "node-arg": [ + "--no-warnings", + "--loader", + "ts-node/esm" + ], + "ts": false + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "engines": { + "node": ">=14" + }, + "dependencies": { + "glob": "^9.2.0" + } +} diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.d.ts new file mode 100644 index 00000000..ecc2fcb2 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.d.ts @@ -0,0 +1,8 @@ +#!/usr/bin/env node +export declare const help: string; +declare const main: { + (...args: string[]): Promise<1 | 0>; + help: string; +}; +export default main; +//# sourceMappingURL=bin.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.d.ts.map new file mode 100644 index 00000000..7f1fee63 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":";AAQA,eAAO,MAAM,IAAI,QAkChB,CAAA;AA6ED,QAAA,MAAM,IAAI;cAAmB,MAAM,EAAE;;CAoIpC,CAAA;AAGD,eAAe,IAAI,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.js new file mode 100755 index 00000000..bbff722a --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.js @@ -0,0 +1,260 @@ +#!/usr/bin/env node +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.help = void 0; +const package_json_1 = require("../package.json"); +const index_cjs_js_1 = __importDefault(require("./index-cjs.js")); +const runHelpForUsage = () => console.error('run `rimraf --help` for usage information'); +exports.help = `rimraf version ${package_json_1.version} + +Usage: rimraf [ ...] +Deletes all files and folders at "path", recursively. + +Options: + -- Treat all subsequent arguments as paths + -h --help Display this usage info + --preserve-root Do not remove '/' recursively (default) + --no-preserve-root Do not treat '/' specially + -G --no-glob Treat arguments as literal paths, not globs (default) + -g --glob Treat arguments as glob patterns + -v --verbose Be verbose when deleting files, showing them as + they are removed. Not compatible with --impl=native + -V --no-verbose Be silent when deleting files, showing nothing as + they are removed (default) + -i --interactive Ask for confirmation before deleting anything + Not compatible with --impl=native + -I --no-interactive Do not ask for confirmation before deleting + + --impl= Specify the implementation to use: + rimraf: choose the best option (default) + native: the built-in implementation in Node.js + manual: the platform-specific JS implementation + posix: the Posix JS implementation + windows: the Windows JS implementation (falls back to + move-remove on ENOTEMPTY) + move-remove: a slow reliable Windows fallback + +Implementation-specific options: + --tmp= Temp file folder for 'move-remove' implementation + --max-retries= maxRetries for 'native' and 'windows' implementations + --retry-delay= retryDelay for 'native' implementation, default 100 + --backoff= Exponential backoff factor for retries (default: 1.2) +`; +const path_1 = require("path"); +const cwd = process.cwd(); +const readline_1 = require("readline"); +const prompt = async (rl, q) => new Promise(res => rl.question(q, res)); +const interactiveRimraf = async (impl, paths, opt) => { + const existingFilter = opt.filter || (() => true); + let allRemaining = false; + let noneRemaining = false; + const queue = []; + let processing = false; + const processQueue = async () => { + if (processing) + return; + processing = true; + let next; + while ((next = queue.shift())) { + await next(); + } + processing = false; + }; + const oneAtATime = (fn) => async (s, e) => { + const p = new Promise(res => { + queue.push(async () => { + const result = await fn(s, e); + res(result); + return result; + }); + }); + processQueue(); + return p; + }; + const rl = (0, readline_1.createInterface)({ + input: process.stdin, + output: process.stdout, + }); + opt.filter = oneAtATime(async (path, ent) => { + if (noneRemaining) { + return false; + } + while (!allRemaining) { + const a = (await prompt(rl, `rm? ${(0, path_1.relative)(cwd, path)}\n[(Yes)/No/All/Quit] > `)).trim(); + if (/^n/i.test(a)) { + return false; + } + else if (/^a/i.test(a)) { + allRemaining = true; + break; + } + else if (/^q/i.test(a)) { + noneRemaining = true; + return false; + } + else if (a === '' || /^y/i.test(a)) { + break; + } + else { + continue; + } + } + return existingFilter(path, ent); + }); + await impl(paths, opt); + rl.close(); +}; +const main = async (...args) => { + const verboseFilter = (s) => { + console.log((0, path_1.relative)(cwd, s)); + return true; + }; + if (process.env.__RIMRAF_TESTING_BIN_FAIL__ === '1') { + throw new Error('simulated rimraf failure'); + } + const opt = {}; + const paths = []; + let dashdash = false; + let impl = index_cjs_js_1.default; + let interactive = false; + for (const arg of args) { + if (dashdash) { + paths.push(arg); + continue; + } + if (arg === '--') { + dashdash = true; + continue; + } + else if (arg === '-rf' || arg === '-fr') { + // this never did anything, but people put it there I guess + continue; + } + else if (arg === '-h' || arg === '--help') { + console.log(exports.help); + return 0; + } + else if (arg === '--interactive' || arg === '-i') { + interactive = true; + continue; + } + else if (arg === '--no-interactive' || arg === '-I') { + interactive = false; + continue; + } + else if (arg === '--verbose' || arg === '-v') { + opt.filter = verboseFilter; + continue; + } + else if (arg === '--no-verbose' || arg === '-V') { + opt.filter = undefined; + continue; + } + else if (arg === '-g' || arg === '--glob') { + opt.glob = true; + continue; + } + else if (arg === '-G' || arg === '--no-glob') { + opt.glob = false; + continue; + } + else if (arg === '--preserve-root') { + opt.preserveRoot = true; + continue; + } + else if (arg === '--no-preserve-root') { + opt.preserveRoot = false; + continue; + } + else if (/^--tmp=/.test(arg)) { + const val = arg.substring('--tmp='.length); + opt.tmp = val; + continue; + } + else if (/^--max-retries=/.test(arg)) { + const val = +arg.substring('--max-retries='.length); + opt.maxRetries = val; + continue; + } + else if (/^--retry-delay=/.test(arg)) { + const val = +arg.substring('--retry-delay='.length); + opt.retryDelay = val; + continue; + } + else if (/^--backoff=/.test(arg)) { + const val = +arg.substring('--backoff='.length); + opt.backoff = val; + continue; + } + else if (/^--impl=/.test(arg)) { + const val = arg.substring('--impl='.length); + switch (val) { + case 'rimraf': + impl = index_cjs_js_1.default; + continue; + case 'native': + case 'manual': + case 'posix': + case 'windows': + impl = index_cjs_js_1.default[val]; + continue; + case 'move-remove': + impl = index_cjs_js_1.default.moveRemove; + continue; + default: + console.error(`unknown implementation: ${val}`); + runHelpForUsage(); + return 1; + } + } + else if (/^-/.test(arg)) { + console.error(`unknown option: ${arg}`); + runHelpForUsage(); + return 1; + } + else { + paths.push(arg); + } + } + if (opt.preserveRoot !== false) { + for (const path of paths.map(p => (0, path_1.resolve)(p))) { + if (path === (0, path_1.parse)(path).root) { + console.error(`rimraf: it is dangerous to operate recursively on '/'`); + console.error('use --no-preserve-root to override this failsafe'); + return 1; + } + } + } + if (!paths.length) { + console.error('rimraf: must provide a path to remove'); + runHelpForUsage(); + return 1; + } + if (impl === index_cjs_js_1.default.native && (interactive || opt.filter)) { + console.error('native implementation does not support -v or -i'); + runHelpForUsage(); + return 1; + } + if (interactive) { + await interactiveRimraf(impl, paths, opt); + } + else { + await impl(paths, opt); + } + return 0; +}; +main.help = exports.help; +exports.default = main; +if (typeof require === 'function' && + typeof module === 'object' && + require.main === module) { + const args = process.argv.slice(2); + main(...args).then(code => process.exit(code), er => { + console.error(er); + process.exit(1); + }); +} +//# sourceMappingURL=bin.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.js.map new file mode 100644 index 00000000..cef95f1f --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/bin.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bin.js","sourceRoot":"","sources":["../../../src/bin.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { version } from '../package.json'\nimport rimraf from './index-cjs.js'\nimport type { RimrafAsyncOptions } from './index.js'\n\nconst runHelpForUsage = () =>\n console.error('run `rimraf --help` for usage information')\n\nexport const help = `rimraf version ${version}\n\nUsage: rimraf [ ...]\nDeletes all files and folders at \"path\", recursively.\n\nOptions:\n -- Treat all subsequent arguments as paths\n -h --help Display this usage info\n --preserve-root Do not remove '/' recursively (default)\n --no-preserve-root Do not treat '/' specially\n -G --no-glob Treat arguments as literal paths, not globs (default)\n -g --glob Treat arguments as glob patterns\n -v --verbose Be verbose when deleting files, showing them as\n they are removed. Not compatible with --impl=native\n -V --no-verbose Be silent when deleting files, showing nothing as\n they are removed (default)\n -i --interactive Ask for confirmation before deleting anything\n Not compatible with --impl=native\n -I --no-interactive Do not ask for confirmation before deleting\n\n --impl= Specify the implementation to use:\n rimraf: choose the best option (default)\n native: the built-in implementation in Node.js\n manual: the platform-specific JS implementation\n posix: the Posix JS implementation\n windows: the Windows JS implementation (falls back to\n move-remove on ENOTEMPTY)\n move-remove: a slow reliable Windows fallback\n\nImplementation-specific options:\n --tmp= Temp file folder for 'move-remove' implementation\n --max-retries= maxRetries for 'native' and 'windows' implementations\n --retry-delay= retryDelay for 'native' implementation, default 100\n --backoff= Exponential backoff factor for retries (default: 1.2)\n`\n\nimport { parse, relative, resolve } from 'path'\nconst cwd = process.cwd()\n\nimport { createInterface, Interface } from 'readline'\nimport { Dirent, Stats } from 'fs'\n\nconst prompt = async (rl: Interface, q: string) =>\n new Promise(res => rl.question(q, res))\n\nconst interactiveRimraf = async (\n impl: (path: string | string[], opt?: RimrafAsyncOptions) => Promise,\n paths: string[],\n opt: RimrafAsyncOptions\n) => {\n const existingFilter = opt.filter || (() => true)\n let allRemaining = false\n let noneRemaining = false\n const queue: (() => Promise)[] = []\n let processing = false\n const processQueue = async () => {\n if (processing) return\n processing = true\n let next: (() => Promise) | undefined\n while ((next = queue.shift())) {\n await next()\n }\n processing = false\n }\n const oneAtATime =\n (fn: (s: string, e: Dirent | Stats) => Promise) =>\n async (s: string, e: Dirent | Stats): Promise => {\n const p = new Promise(res => {\n queue.push(async () => {\n const result = await fn(s, e)\n res(result)\n return result\n })\n })\n processQueue()\n return p\n }\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n })\n opt.filter = oneAtATime(\n async (path: string, ent: Dirent | Stats): Promise => {\n if (noneRemaining) {\n return false\n }\n while (!allRemaining) {\n const a = (\n await prompt(rl, `rm? ${relative(cwd, path)}\\n[(Yes)/No/All/Quit] > `)\n ).trim()\n if (/^n/i.test(a)) {\n return false\n } else if (/^a/i.test(a)) {\n allRemaining = true\n break\n } else if (/^q/i.test(a)) {\n noneRemaining = true\n return false\n } else if (a === '' || /^y/i.test(a)) {\n break\n } else {\n continue\n }\n }\n return existingFilter(path, ent)\n }\n )\n await impl(paths, opt)\n rl.close()\n}\n\nconst main = async (...args: string[]) => {\n const verboseFilter = (s: string) => {\n console.log(relative(cwd, s))\n return true\n }\n\n if (process.env.__RIMRAF_TESTING_BIN_FAIL__ === '1') {\n throw new Error('simulated rimraf failure')\n }\n\n const opt: RimrafAsyncOptions = {}\n const paths: string[] = []\n let dashdash = false\n let impl: (\n path: string | string[],\n opt?: RimrafAsyncOptions\n ) => Promise = rimraf\n\n let interactive = false\n\n for (const arg of args) {\n if (dashdash) {\n paths.push(arg)\n continue\n }\n if (arg === '--') {\n dashdash = true\n continue\n } else if (arg === '-rf' || arg === '-fr') {\n // this never did anything, but people put it there I guess\n continue\n } else if (arg === '-h' || arg === '--help') {\n console.log(help)\n return 0\n } else if (arg === '--interactive' || arg === '-i') {\n interactive = true\n continue\n } else if (arg === '--no-interactive' || arg === '-I') {\n interactive = false\n continue\n } else if (arg === '--verbose' || arg === '-v') {\n opt.filter = verboseFilter\n continue\n } else if (arg === '--no-verbose' || arg === '-V') {\n opt.filter = undefined\n continue\n } else if (arg === '-g' || arg === '--glob') {\n opt.glob = true\n continue\n } else if (arg === '-G' || arg === '--no-glob') {\n opt.glob = false\n continue\n } else if (arg === '--preserve-root') {\n opt.preserveRoot = true\n continue\n } else if (arg === '--no-preserve-root') {\n opt.preserveRoot = false\n continue\n } else if (/^--tmp=/.test(arg)) {\n const val = arg.substring('--tmp='.length)\n opt.tmp = val\n continue\n } else if (/^--max-retries=/.test(arg)) {\n const val = +arg.substring('--max-retries='.length)\n opt.maxRetries = val\n continue\n } else if (/^--retry-delay=/.test(arg)) {\n const val = +arg.substring('--retry-delay='.length)\n opt.retryDelay = val\n continue\n } else if (/^--backoff=/.test(arg)) {\n const val = +arg.substring('--backoff='.length)\n opt.backoff = val\n continue\n } else if (/^--impl=/.test(arg)) {\n const val = arg.substring('--impl='.length)\n switch (val) {\n case 'rimraf':\n impl = rimraf\n continue\n case 'native':\n case 'manual':\n case 'posix':\n case 'windows':\n impl = rimraf[val]\n continue\n case 'move-remove':\n impl = rimraf.moveRemove\n continue\n default:\n console.error(`unknown implementation: ${val}`)\n runHelpForUsage()\n return 1\n }\n } else if (/^-/.test(arg)) {\n console.error(`unknown option: ${arg}`)\n runHelpForUsage()\n return 1\n } else {\n paths.push(arg)\n }\n }\n\n if (opt.preserveRoot !== false) {\n for (const path of paths.map(p => resolve(p))) {\n if (path === parse(path).root) {\n console.error(`rimraf: it is dangerous to operate recursively on '/'`)\n console.error('use --no-preserve-root to override this failsafe')\n return 1\n }\n }\n }\n\n if (!paths.length) {\n console.error('rimraf: must provide a path to remove')\n runHelpForUsage()\n return 1\n }\n\n if (impl === rimraf.native && (interactive || opt.filter)) {\n console.error('native implementation does not support -v or -i')\n runHelpForUsage()\n return 1\n }\n\n if (interactive) {\n await interactiveRimraf(impl, paths, opt)\n } else {\n await impl(paths, opt)\n }\n\n return 0\n}\nmain.help = help\n\nexport default main\n\nif (\n typeof require === 'function' &&\n typeof module === 'object' &&\n require.main === module\n) {\n const args = process.argv.slice(2)\n main(...args).then(\n code => process.exit(code),\n er => {\n console.error(er)\n process.exit(1)\n }\n )\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts new file mode 100644 index 00000000..a68e925b --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts @@ -0,0 +1,3 @@ +export declare const defaultTmp: (path: string) => Promise; +export declare const defaultTmpSync: (path: string) => string; +//# sourceMappingURL=default-tmp.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts.map new file mode 100644 index 00000000..91a1672d --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"default-tmp.d.ts","sourceRoot":"","sources":["../../../src/default-tmp.ts"],"names":[],"mappings":"AAiEA,eAAO,MAAM,UAAU,SAnCc,MAAM,oBAoCe,CAAA;AAC1D,eAAO,MAAM,cAAc,SArBQ,MAAM,WAsByB,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.js new file mode 100644 index 00000000..ae908788 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.js @@ -0,0 +1,61 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.defaultTmpSync = exports.defaultTmp = void 0; +// The default temporary folder location for use in the windows algorithm. +// It's TEMPting to use dirname(path), since that's guaranteed to be on the +// same device. However, this means that: +// rimraf(path).then(() => rimraf(dirname(path))) +// will often fail with EBUSY, because the parent dir contains +// marked-for-deletion directory entries (which do not show up in readdir). +// The approach here is to use os.tmpdir() if it's on the same drive letter, +// or resolve(path, '\\temp') if it exists, or the root of the drive if not. +// On Posix (not that you'd be likely to use the windows algorithm there), +// it uses os.tmpdir() always. +const os_1 = require("os"); +const path_1 = require("path"); +const fs_js_1 = require("./fs.js"); +const platform_js_1 = __importDefault(require("./platform.js")); +const { stat } = fs_js_1.promises; +const isDirSync = (path) => { + try { + return (0, fs_js_1.statSync)(path).isDirectory(); + } + catch (er) { + return false; + } +}; +const isDir = (path) => stat(path).then(st => st.isDirectory(), () => false); +const win32DefaultTmp = async (path) => { + const { root } = (0, path_1.parse)(path); + const tmp = (0, os_1.tmpdir)(); + const { root: tmpRoot } = (0, path_1.parse)(tmp); + if (root.toLowerCase() === tmpRoot.toLowerCase()) { + return tmp; + } + const driveTmp = (0, path_1.resolve)(root, '/temp'); + if (await isDir(driveTmp)) { + return driveTmp; + } + return root; +}; +const win32DefaultTmpSync = (path) => { + const { root } = (0, path_1.parse)(path); + const tmp = (0, os_1.tmpdir)(); + const { root: tmpRoot } = (0, path_1.parse)(tmp); + if (root.toLowerCase() === tmpRoot.toLowerCase()) { + return tmp; + } + const driveTmp = (0, path_1.resolve)(root, '/temp'); + if (isDirSync(driveTmp)) { + return driveTmp; + } + return root; +}; +const posixDefaultTmp = async () => (0, os_1.tmpdir)(); +const posixDefaultTmpSync = () => (0, os_1.tmpdir)(); +exports.defaultTmp = platform_js_1.default === 'win32' ? win32DefaultTmp : posixDefaultTmp; +exports.defaultTmpSync = platform_js_1.default === 'win32' ? win32DefaultTmpSync : posixDefaultTmpSync; +//# sourceMappingURL=default-tmp.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.js.map new file mode 100644 index 00000000..e16a510e --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/default-tmp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"default-tmp.js","sourceRoot":"","sources":["../../../src/default-tmp.ts"],"names":[],"mappings":";;;;;;AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,0CAA0C;AAC1C,iDAAiD;AACjD,8DAA8D;AAC9D,2EAA2E;AAC3E,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,8BAA8B;AAC9B,2BAA2B;AAC3B,+BAAqC;AACrC,mCAA4C;AAC5C,gEAAoC;AACpC,MAAM,EAAE,IAAI,EAAE,GAAG,gBAAQ,CAAA;AAEzB,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;IACjC,IAAI;QACF,OAAO,IAAA,gBAAQ,EAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;KACpC;IAAC,OAAO,EAAE,EAAE;QACX,OAAO,KAAK,CAAA;KACb;AACH,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7B,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CACb,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EACtB,GAAG,EAAE,CAAC,KAAK,CACZ,CAAA;AAEH,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,YAAK,EAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,GAAG,GAAG,IAAA,WAAM,GAAE,CAAA;IACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAA,YAAK,EAAC,GAAG,CAAC,CAAA;IACpC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE;QAChD,OAAO,GAAG,CAAA;KACX;IAED,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE;QACzB,OAAO,QAAQ,CAAA;KAChB;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,EAAE;IAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,YAAK,EAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,GAAG,GAAG,IAAA,WAAM,GAAE,CAAA;IACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAA,YAAK,EAAC,GAAG,CAAC,CAAA;IACpC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE;QAChD,OAAO,GAAG,CAAA;KACX;IAED,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;QACvB,OAAO,QAAQ,CAAA;KAChB;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC,IAAA,WAAM,GAAE,CAAA;AAC5C,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,IAAA,WAAM,GAAE,CAAA;AAE7B,QAAA,UAAU,GACrB,qBAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAA;AAC7C,QAAA,cAAc,GACzB,qBAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAA","sourcesContent":["// The default temporary folder location for use in the windows algorithm.\n// It's TEMPting to use dirname(path), since that's guaranteed to be on the\n// same device. However, this means that:\n// rimraf(path).then(() => rimraf(dirname(path)))\n// will often fail with EBUSY, because the parent dir contains\n// marked-for-deletion directory entries (which do not show up in readdir).\n// The approach here is to use os.tmpdir() if it's on the same drive letter,\n// or resolve(path, '\\\\temp') if it exists, or the root of the drive if not.\n// On Posix (not that you'd be likely to use the windows algorithm there),\n// it uses os.tmpdir() always.\nimport { tmpdir } from 'os'\nimport { parse, resolve } from 'path'\nimport { promises, statSync } from './fs.js'\nimport platform from './platform.js'\nconst { stat } = promises\n\nconst isDirSync = (path: string) => {\n try {\n return statSync(path).isDirectory()\n } catch (er) {\n return false\n }\n}\n\nconst isDir = (path: string) =>\n stat(path).then(\n st => st.isDirectory(),\n () => false\n )\n\nconst win32DefaultTmp = async (path: string) => {\n const { root } = parse(path)\n const tmp = tmpdir()\n const { root: tmpRoot } = parse(tmp)\n if (root.toLowerCase() === tmpRoot.toLowerCase()) {\n return tmp\n }\n\n const driveTmp = resolve(root, '/temp')\n if (await isDir(driveTmp)) {\n return driveTmp\n }\n\n return root\n}\n\nconst win32DefaultTmpSync = (path: string) => {\n const { root } = parse(path)\n const tmp = tmpdir()\n const { root: tmpRoot } = parse(tmp)\n if (root.toLowerCase() === tmpRoot.toLowerCase()) {\n return tmp\n }\n\n const driveTmp = resolve(root, '/temp')\n if (isDirSync(driveTmp)) {\n return driveTmp\n }\n\n return root\n}\n\nconst posixDefaultTmp = async () => tmpdir()\nconst posixDefaultTmpSync = () => tmpdir()\n\nexport const defaultTmp =\n platform === 'win32' ? win32DefaultTmp : posixDefaultTmp\nexport const defaultTmpSync =\n platform === 'win32' ? win32DefaultTmpSync : posixDefaultTmpSync\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts new file mode 100644 index 00000000..20e76a82 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts @@ -0,0 +1,3 @@ +export declare const fixEPERM: (fn: (path: string) => Promise) => (path: string) => Promise; +export declare const fixEPERMSync: (fn: (path: string) => any) => (path: string) => any; +//# sourceMappingURL=fix-eperm.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts.map new file mode 100644 index 00000000..5b265306 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"fix-eperm.d.ts","sourceRoot":"","sources":["../../../src/fix-eperm.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,cACP,MAAM,KAAK,QAAQ,GAAG,CAAC,YAAkB,MAAM,iBAsB1D,CAAA;AAEH,eAAO,MAAM,YAAY,cAAe,MAAM,KAAK,GAAG,YAAY,MAAM,QAsBvE,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.js new file mode 100644 index 00000000..7baecb7c --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.js @@ -0,0 +1,58 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.fixEPERMSync = exports.fixEPERM = void 0; +const fs_js_1 = require("./fs.js"); +const { chmod } = fs_js_1.promises; +const fixEPERM = (fn) => async (path) => { + try { + return await fn(path); + } + catch (er) { + const fer = er; + if (fer?.code === 'ENOENT') { + return; + } + if (fer?.code === 'EPERM') { + try { + await chmod(path, 0o666); + } + catch (er2) { + const fer2 = er2; + if (fer2?.code === 'ENOENT') { + return; + } + throw er; + } + return await fn(path); + } + throw er; + } +}; +exports.fixEPERM = fixEPERM; +const fixEPERMSync = (fn) => (path) => { + try { + return fn(path); + } + catch (er) { + const fer = er; + if (fer?.code === 'ENOENT') { + return; + } + if (fer?.code === 'EPERM') { + try { + (0, fs_js_1.chmodSync)(path, 0o666); + } + catch (er2) { + const fer2 = er2; + if (fer2?.code === 'ENOENT') { + return; + } + throw er; + } + return fn(path); + } + throw er; + } +}; +exports.fixEPERMSync = fixEPERMSync; +//# sourceMappingURL=fix-eperm.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.js.map new file mode 100644 index 00000000..c5eb902e --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fix-eperm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fix-eperm.js","sourceRoot":"","sources":["../../../src/fix-eperm.ts"],"names":[],"mappings":";;;AAAA,mCAA6C;AAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,gBAAQ,CAAA;AAEnB,MAAM,QAAQ,GACnB,CAAC,EAAkC,EAAE,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7D,IAAI;QACF,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;KACtB;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE;YAC1B,OAAM;SACP;QACD,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE;YACzB,IAAI;gBACF,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;aACzB;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,IAAI,GAAG,GAA4B,CAAA;gBACzC,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE;oBAC3B,OAAM;iBACP;gBACD,MAAM,EAAE,CAAA;aACT;YACD,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;SACtB;QACD,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAvBU,QAAA,QAAQ,YAuBlB;AAEI,MAAM,YAAY,GAAG,CAAC,EAAyB,EAAE,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE;IAC1E,IAAI;QACF,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;KAChB;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE;YAC1B,OAAM;SACP;QACD,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE;YACzB,IAAI;gBACF,IAAA,iBAAS,EAAC,IAAI,EAAE,KAAK,CAAC,CAAA;aACvB;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,IAAI,GAAG,GAA4B,CAAA;gBACzC,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE;oBAC3B,OAAM;iBACP;gBACD,MAAM,EAAE,CAAA;aACT;YACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;SAChB;QACD,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAtBY,QAAA,YAAY,gBAsBxB","sourcesContent":["import { chmodSync, promises } from './fs.js'\nconst { chmod } = promises\n\nexport const fixEPERM =\n (fn: (path: string) => Promise) => async (path: string) => {\n try {\n return await fn(path)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer?.code === 'ENOENT') {\n return\n }\n if (fer?.code === 'EPERM') {\n try {\n await chmod(path, 0o666)\n } catch (er2) {\n const fer2 = er2 as NodeJS.ErrnoException\n if (fer2?.code === 'ENOENT') {\n return\n }\n throw er\n }\n return await fn(path)\n }\n throw er\n }\n }\n\nexport const fixEPERMSync = (fn: (path: string) => any) => (path: string) => {\n try {\n return fn(path)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer?.code === 'ENOENT') {\n return\n }\n if (fer?.code === 'EPERM') {\n try {\n chmodSync(path, 0o666)\n } catch (er2) {\n const fer2 = er2 as NodeJS.ErrnoException\n if (fer2?.code === 'ENOENT') {\n return\n }\n throw er\n }\n return fn(path)\n }\n throw er\n }\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.d.ts new file mode 100644 index 00000000..9e4e95b4 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.d.ts @@ -0,0 +1,17 @@ +import fs, { Dirent } from 'fs'; +export { chmodSync, mkdirSync, renameSync, rmdirSync, rmSync, statSync, lstatSync, unlinkSync, } from 'fs'; +export declare const readdirSync: (path: fs.PathLike) => Dirent[]; +export declare const promises: { + chmod: (path: fs.PathLike, mode: fs.Mode) => Promise; + mkdir: (path: fs.PathLike, options?: fs.Mode | (fs.MakeDirectoryOptions & { + recursive?: boolean | null; + }) | undefined | null) => Promise; + readdir: (path: fs.PathLike) => Promise; + rename: (oldPath: fs.PathLike, newPath: fs.PathLike) => Promise; + rm: (path: fs.PathLike, options: fs.RmOptions) => Promise; + rmdir: (path: fs.PathLike) => Promise; + stat: (path: fs.PathLike) => Promise; + lstat: (path: fs.PathLike) => Promise; + unlink: (path: fs.PathLike) => Promise; +}; +//# sourceMappingURL=fs.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.d.ts.map new file mode 100644 index 00000000..cfa05e25 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/fs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAG/B,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,MAAM,EACN,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,IAAI,CAAA;AAGX,eAAO,MAAM,WAAW,SAAU,GAAG,QAAQ,KAAG,MAAM,EACf,CAAA;AA6DvC,eAAO,MAAM,QAAQ;kBAtDA,GAAG,QAAQ,QAAQ,GAAG,IAAI,KAAG,QAAQ,IAAI,CAAC;kBAMvD,GAAG,QAAQ,YAEb,GAAG,IAAI,GACP,CAAC,GAAG,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC,GAC1D,SAAS,GACT,IAAI,KACP,QAAQ,MAAM,GAAG,SAAS,CAAC;oBAKP,GAAG,QAAQ,KAAG,QAAQ,MAAM,EAAE,CAAC;sBAO7B,GAAG,QAAQ,WAAW,GAAG,QAAQ,KAAG,QAAQ,IAAI,CAAC;eAKxD,GAAG,QAAQ,WAAW,GAAG,SAAS,KAAG,QAAQ,IAAI,CAAC;kBAK/C,GAAG,QAAQ,KAAG,QAAQ,IAAI,CAAC;iBAK5B,GAAG,QAAQ,KAAG,QAAQ,GAAG,KAAK,CAAC;kBAK9B,GAAG,QAAQ,KAAG,QAAQ,GAAG,KAAK,CAAC;mBAK9B,GAAG,QAAQ,KAAG,QAAQ,IAAI,CAAC;CAehD,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.js new file mode 100644 index 00000000..df79f9b1 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.js @@ -0,0 +1,46 @@ +"use strict"; +// promisify ourselves, because older nodes don't have fs.promises +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.promises = exports.readdirSync = exports.unlinkSync = exports.lstatSync = exports.statSync = exports.rmSync = exports.rmdirSync = exports.renameSync = exports.mkdirSync = exports.chmodSync = void 0; +const fs_1 = __importDefault(require("fs")); +// sync ones just take the sync version from node +var fs_2 = require("fs"); +Object.defineProperty(exports, "chmodSync", { enumerable: true, get: function () { return fs_2.chmodSync; } }); +Object.defineProperty(exports, "mkdirSync", { enumerable: true, get: function () { return fs_2.mkdirSync; } }); +Object.defineProperty(exports, "renameSync", { enumerable: true, get: function () { return fs_2.renameSync; } }); +Object.defineProperty(exports, "rmdirSync", { enumerable: true, get: function () { return fs_2.rmdirSync; } }); +Object.defineProperty(exports, "rmSync", { enumerable: true, get: function () { return fs_2.rmSync; } }); +Object.defineProperty(exports, "statSync", { enumerable: true, get: function () { return fs_2.statSync; } }); +Object.defineProperty(exports, "lstatSync", { enumerable: true, get: function () { return fs_2.lstatSync; } }); +Object.defineProperty(exports, "unlinkSync", { enumerable: true, get: function () { return fs_2.unlinkSync; } }); +const fs_3 = require("fs"); +const readdirSync = (path) => (0, fs_3.readdirSync)(path, { withFileTypes: true }); +exports.readdirSync = readdirSync; +// unrolled for better inlining, this seems to get better performance +// than something like: +// const makeCb = (res, rej) => (er, ...d) => er ? rej(er) : res(...d) +// which would be a bit cleaner. +const chmod = (path, mode) => new Promise((res, rej) => fs_1.default.chmod(path, mode, (er, ...d) => (er ? rej(er) : res(...d)))); +const mkdir = (path, options) => new Promise((res, rej) => fs_1.default.mkdir(path, options, (er, made) => (er ? rej(er) : res(made)))); +const readdir = (path) => new Promise((res, rej) => fs_1.default.readdir(path, { withFileTypes: true }, (er, data) => er ? rej(er) : res(data))); +const rename = (oldPath, newPath) => new Promise((res, rej) => fs_1.default.rename(oldPath, newPath, (er, ...d) => (er ? rej(er) : res(...d)))); +const rm = (path, options) => new Promise((res, rej) => fs_1.default.rm(path, options, (er, ...d) => (er ? rej(er) : res(...d)))); +const rmdir = (path) => new Promise((res, rej) => fs_1.default.rmdir(path, (er, ...d) => (er ? rej(er) : res(...d)))); +const stat = (path) => new Promise((res, rej) => fs_1.default.stat(path, (er, data) => (er ? rej(er) : res(data)))); +const lstat = (path) => new Promise((res, rej) => fs_1.default.lstat(path, (er, data) => (er ? rej(er) : res(data)))); +const unlink = (path) => new Promise((res, rej) => fs_1.default.unlink(path, (er, ...d) => (er ? rej(er) : res(...d)))); +exports.promises = { + chmod, + mkdir, + readdir, + rename, + rm, + rmdir, + stat, + lstat, + unlink, +}; +//# sourceMappingURL=fs.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.js.map new file mode 100644 index 00000000..96dacf6a --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/fs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../../src/fs.ts"],"names":[],"mappings":";AAAA,kEAAkE;;;;;;AAElE,4CAA+B;AAE/B,iDAAiD;AACjD,yBASW;AART,+FAAA,SAAS,OAAA;AACT,+FAAA,SAAS,OAAA;AACT,gGAAA,UAAU,OAAA;AACV,+FAAA,SAAS,OAAA;AACT,4FAAA,MAAM,OAAA;AACN,8FAAA,QAAQ,OAAA;AACR,+FAAA,SAAS,OAAA;AACT,gGAAA,UAAU,OAAA;AAGZ,2BAA0C;AACnC,MAAM,WAAW,GAAG,CAAC,IAAiB,EAAY,EAAE,CACzD,IAAA,gBAAM,EAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;AAD1B,QAAA,WAAW,eACe;AAEvC,qEAAqE;AACrE,uBAAuB;AACvB,sEAAsE;AACtE,gCAAgC;AAEhC,MAAM,KAAK,GAAG,CAAC,IAAiB,EAAE,IAAa,EAAiB,EAAE,CAChE,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,YAAE,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,CAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACtE,CAAA;AAEH,MAAM,KAAK,GAAG,CACZ,IAAiB,EACjB,OAIQ,EACqB,EAAE,CAC/B,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,YAAE,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAClE,CAAA;AAEH,MAAM,OAAO,GAAG,CAAC,IAAiB,EAAqB,EAAE,CACvD,IAAI,OAAO,CAAW,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACjC,YAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CACrD,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CACzB,CACF,CAAA;AAEH,MAAM,MAAM,GAAG,CAAC,OAAoB,EAAE,OAAoB,EAAiB,EAAE,CAC3E,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,YAAE,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAC7E,CAAA;AAEH,MAAM,EAAE,GAAG,CAAC,IAAiB,EAAE,OAAqB,EAAiB,EAAE,CACrE,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,YAAE,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,GAAG,CAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACtE,CAAA;AAEH,MAAM,KAAK,GAAG,CAAC,IAAiB,EAAiB,EAAE,CACjD,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,YAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,CAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAChE,CAAA;AAEH,MAAM,IAAI,GAAG,CAAC,IAAiB,EAAqB,EAAE,CACpD,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,YAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CACxD,CAAA;AAEH,MAAM,KAAK,GAAG,CAAC,IAAiB,EAAqB,EAAE,CACrD,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,YAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CACzD,CAAA;AAEH,MAAM,MAAM,GAAG,CAAC,IAAiB,EAAiB,EAAE,CAClD,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CACvB,YAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,CAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACjE,CAAA;AAEU,QAAA,QAAQ,GAAG;IACtB,KAAK;IACL,KAAK;IACL,OAAO;IACP,MAAM;IACN,EAAE;IACF,KAAK;IACL,IAAI;IACJ,KAAK;IACL,MAAM;CACP,CAAA","sourcesContent":["// promisify ourselves, because older nodes don't have fs.promises\n\nimport fs, { Dirent } from 'fs'\n\n// sync ones just take the sync version from node\nexport {\n chmodSync,\n mkdirSync,\n renameSync,\n rmdirSync,\n rmSync,\n statSync,\n lstatSync,\n unlinkSync,\n} from 'fs'\n\nimport { readdirSync as rdSync } from 'fs'\nexport const readdirSync = (path: fs.PathLike): Dirent[] =>\n rdSync(path, { withFileTypes: true })\n\n// unrolled for better inlining, this seems to get better performance\n// than something like:\n// const makeCb = (res, rej) => (er, ...d) => er ? rej(er) : res(...d)\n// which would be a bit cleaner.\n\nconst chmod = (path: fs.PathLike, mode: fs.Mode): Promise =>\n new Promise((res, rej) =>\n fs.chmod(path, mode, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nconst mkdir = (\n path: fs.PathLike,\n options?:\n | fs.Mode\n | (fs.MakeDirectoryOptions & { recursive?: boolean | null })\n | undefined\n | null\n): Promise =>\n new Promise((res, rej) =>\n fs.mkdir(path, options, (er, made) => (er ? rej(er) : res(made)))\n )\n\nconst readdir = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.readdir(path, { withFileTypes: true }, (er, data) =>\n er ? rej(er) : res(data)\n )\n )\n\nconst rename = (oldPath: fs.PathLike, newPath: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.rename(oldPath, newPath, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nconst rm = (path: fs.PathLike, options: fs.RmOptions): Promise =>\n new Promise((res, rej) =>\n fs.rm(path, options, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nconst rmdir = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.rmdir(path, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nconst stat = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.stat(path, (er, data) => (er ? rej(er) : res(data)))\n )\n\nconst lstat = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.lstat(path, (er, data) => (er ? rej(er) : res(data)))\n )\n\nconst unlink = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.unlink(path, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nexport const promises = {\n chmod,\n mkdir,\n readdir,\n rename,\n rm,\n rmdir,\n stat,\n lstat,\n unlink,\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts new file mode 100644 index 00000000..f158cc27 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts @@ -0,0 +1,3 @@ +export declare const ignoreENOENT: (p: Promise) => Promise; +export declare const ignoreENOENTSync: (fn: () => any) => any; +//# sourceMappingURL=ignore-enoent.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts.map new file mode 100644 index 00000000..f1845129 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ignore-enoent.d.ts","sourceRoot":"","sources":["../../../src/ignore-enoent.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,MAAa,QAAQ,GAAG,CAAC,iBAK9C,CAAA;AAEJ,eAAO,MAAM,gBAAgB,OAAQ,MAAM,GAAG,QAQ7C,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.js new file mode 100644 index 00000000..02595342 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ignoreENOENTSync = exports.ignoreENOENT = void 0; +const ignoreENOENT = async (p) => p.catch(er => { + if (er.code !== 'ENOENT') { + throw er; + } +}); +exports.ignoreENOENT = ignoreENOENT; +const ignoreENOENTSync = (fn) => { + try { + return fn(); + } + catch (er) { + if (er?.code !== 'ENOENT') { + throw er; + } + } +}; +exports.ignoreENOENTSync = ignoreENOENTSync; +//# sourceMappingURL=ignore-enoent.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.js.map new file mode 100644 index 00000000..18503260 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/ignore-enoent.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ignore-enoent.js","sourceRoot":"","sources":["../../../src/ignore-enoent.ts"],"names":[],"mappings":";;;AAAO,MAAM,YAAY,GAAG,KAAK,EAAE,CAAe,EAAE,EAAE,CACpD,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;IACX,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;QACxB,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAC,CAAA;AALS,QAAA,YAAY,gBAKrB;AAEG,MAAM,gBAAgB,GAAG,CAAC,EAAa,EAAE,EAAE;IAChD,IAAI;QACF,OAAO,EAAE,EAAE,CAAA;KACZ;IAAC,OAAO,EAAE,EAAE;QACX,IAAK,EAA4B,EAAE,IAAI,KAAK,QAAQ,EAAE;YACpD,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA;AARY,QAAA,gBAAgB,oBAQ5B","sourcesContent":["export const ignoreENOENT = async (p: Promise) =>\n p.catch(er => {\n if (er.code !== 'ENOENT') {\n throw er\n }\n })\n\nexport const ignoreENOENTSync = (fn: () => any) => {\n try {\n return fn()\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code !== 'ENOENT') {\n throw er\n }\n }\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts new file mode 100644 index 00000000..82e25cdf --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts @@ -0,0 +1,57 @@ +declare const _default: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + rimraf: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + rimrafSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + manual: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + manualSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + native: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + nativeSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + posix: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + posixSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + windows: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + windowsSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + moveRemove: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + moveRemoveSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; +} & { + default: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + rimraf: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + rimrafSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + manual: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + manualSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + native: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + nativeSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + posix: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + posixSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + windows: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + windowsSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + moveRemove: ((path: string | string[], opt?: import("./index.js").RimrafAsyncOptions | undefined) => Promise) & { + sync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; + moveRemoveSync: (path: string | string[], opt?: import("./index.js").RimrafSyncOptions | undefined) => boolean; + }; +}; +export = _default; +//# sourceMappingURL=index-cjs.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts.map new file mode 100644 index 00000000..f9581c85 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index-cjs.d.ts","sourceRoot":"","sources":["../../../src/index-cjs.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,kBAAmD"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.js new file mode 100644 index 00000000..e96e51a5 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.js @@ -0,0 +1,7 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +const index_js_1 = __importDefault(require("./index.js")); +module.exports = Object.assign(index_js_1.default, { default: index_js_1.default }); +//# sourceMappingURL=index-cjs.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.js.map new file mode 100644 index 00000000..c0feb8b8 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index-cjs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-cjs.js","sourceRoot":"","sources":["../../../src/index-cjs.ts"],"names":[],"mappings":";;;;AAAA,0DAA+B;AAE/B,iBAAS,MAAM,CAAC,MAAM,CAAC,kBAAM,EAAE,EAAE,OAAO,EAAE,kBAAM,EAAE,CAAC,CAAA","sourcesContent":["import rimraf from './index.js'\n\nexport = Object.assign(rimraf, { default: rimraf })\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.d.ts new file mode 100644 index 00000000..2b659f29 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.d.ts @@ -0,0 +1,71 @@ +/// +import { GlobOptions } from 'glob'; +export interface RimrafAsyncOptions { + preserveRoot?: boolean; + tmp?: string; + maxRetries?: number; + retryDelay?: number; + backoff?: number; + maxBackoff?: number; + signal?: AbortSignal; + glob?: boolean | GlobOptions; + filter?: ((path: string, ent: Dirent | Stats) => boolean) | ((path: string, ent: Dirent | Stats) => Promise); +} +export interface RimrafSyncOptions extends RimrafAsyncOptions { + filter?: (path: string, ent: Dirent | Stats) => boolean; +} +export type RimrafOptions = RimrafSyncOptions | RimrafAsyncOptions; +export declare const isRimrafOptions: (o: any) => o is RimrafOptions; +export declare const assertRimrafOptions: (o: any) => void; +import { Dirent, Stats } from 'fs'; +export declare const nativeSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const native: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const manualSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const manual: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const windowsSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const windows: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const posixSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const posix: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const moveRemoveSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const moveRemove: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const rimrafSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const rimraf: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + rimraf: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + rimrafSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + manual: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + manualSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + native: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + nativeSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + posix: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + posixSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + windows: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + windowsSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + moveRemove: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + moveRemoveSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export default rimraf; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.d.ts.map new file mode 100644 index 00000000..bd2c8a2d --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.js new file mode 100644 index 00000000..da9f4a3b --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.js @@ -0,0 +1,92 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.rimraf = exports.sync = exports.rimrafSync = exports.moveRemove = exports.moveRemoveSync = exports.posix = exports.posixSync = exports.windows = exports.windowsSync = exports.manual = exports.manualSync = exports.native = exports.nativeSync = exports.assertRimrafOptions = exports.isRimrafOptions = void 0; +const opt_arg_js_1 = require("./opt-arg.js"); +const path_arg_js_1 = __importDefault(require("./path-arg.js")); +const glob_1 = require("glob"); +const typeOrUndef = (val, t) => typeof val === 'undefined' || typeof val === t; +const isRimrafOptions = (o) => !!o && + typeof o === 'object' && + typeOrUndef(o.preserveRoot, 'boolean') && + typeOrUndef(o.tmp, 'string') && + typeOrUndef(o.maxRetries, 'number') && + typeOrUndef(o.retryDelay, 'number') && + typeOrUndef(o.backoff, 'number') && + typeOrUndef(o.maxBackoff, 'number') && + (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) && + typeOrUndef(o.filter, 'function'); +exports.isRimrafOptions = isRimrafOptions; +const assertRimrafOptions = (o) => { + if (!(0, exports.isRimrafOptions)(o)) { + throw new Error('invalid rimraf options'); + } +}; +exports.assertRimrafOptions = assertRimrafOptions; +const rimraf_manual_js_1 = require("./rimraf-manual.js"); +const rimraf_move_remove_js_1 = require("./rimraf-move-remove.js"); +const rimraf_native_js_1 = require("./rimraf-native.js"); +const rimraf_posix_js_1 = require("./rimraf-posix.js"); +const rimraf_windows_js_1 = require("./rimraf-windows.js"); +const use_native_js_1 = require("./use-native.js"); +const wrap = (fn) => async (path, opt) => { + const options = (0, opt_arg_js_1.optArg)(opt); + if (options.glob) { + path = await (0, glob_1.glob)(path, options.glob); + } + if (Array.isArray(path)) { + return !!(await Promise.all(path.map(p => fn((0, path_arg_js_1.default)(p, options), options)))).reduce((a, b) => a && b, true); + } + else { + return !!(await fn((0, path_arg_js_1.default)(path, options), options)); + } +}; +const wrapSync = (fn) => (path, opt) => { + const options = (0, opt_arg_js_1.optArgSync)(opt); + if (options.glob) { + path = (0, glob_1.globSync)(path, options.glob); + } + if (Array.isArray(path)) { + return !!path + .map(p => fn((0, path_arg_js_1.default)(p, options), options)) + .reduce((a, b) => a && b, true); + } + else { + return !!fn((0, path_arg_js_1.default)(path, options), options); + } +}; +exports.nativeSync = wrapSync(rimraf_native_js_1.rimrafNativeSync); +exports.native = Object.assign(wrap(rimraf_native_js_1.rimrafNative), { sync: exports.nativeSync }); +exports.manualSync = wrapSync(rimraf_manual_js_1.rimrafManualSync); +exports.manual = Object.assign(wrap(rimraf_manual_js_1.rimrafManual), { sync: exports.manualSync }); +exports.windowsSync = wrapSync(rimraf_windows_js_1.rimrafWindowsSync); +exports.windows = Object.assign(wrap(rimraf_windows_js_1.rimrafWindows), { sync: exports.windowsSync }); +exports.posixSync = wrapSync(rimraf_posix_js_1.rimrafPosixSync); +exports.posix = Object.assign(wrap(rimraf_posix_js_1.rimrafPosix), { sync: exports.posixSync }); +exports.moveRemoveSync = wrapSync(rimraf_move_remove_js_1.rimrafMoveRemoveSync); +exports.moveRemove = Object.assign(wrap(rimraf_move_remove_js_1.rimrafMoveRemove), { + sync: exports.moveRemoveSync, +}); +exports.rimrafSync = wrapSync((path, opt) => (0, use_native_js_1.useNativeSync)(opt) ? (0, rimraf_native_js_1.rimrafNativeSync)(path, opt) : (0, rimraf_manual_js_1.rimrafManualSync)(path, opt)); +exports.sync = exports.rimrafSync; +exports.rimraf = Object.assign(wrap((path, opt) => (0, use_native_js_1.useNative)(opt) ? (0, rimraf_native_js_1.rimrafNative)(path, opt) : (0, rimraf_manual_js_1.rimrafManual)(path, opt)), { + // this weirdness because it's easier than explicitly declaring + rimraf: exports.manual, + sync: exports.rimrafSync, + rimrafSync: exports.rimrafSync, + manual: exports.manual, + manualSync: exports.manualSync, + native: exports.native, + nativeSync: exports.nativeSync, + posix: exports.posix, + posixSync: exports.posixSync, + windows: exports.windows, + windowsSync: exports.windowsSync, + moveRemove: exports.moveRemove, + moveRemoveSync: exports.moveRemoveSync, +}); +exports.rimraf.rimraf = exports.rimraf; +exports.default = exports.rimraf; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.js.map new file mode 100644 index 00000000..fedfb497 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAiD;AACjD,gEAAmC;AAEnC,+BAAkD;AAsBlD,MAAM,WAAW,GAAG,CAAC,GAAQ,EAAE,CAAS,EAAE,EAAE,CAC1C,OAAO,GAAG,KAAK,WAAW,IAAI,OAAO,GAAG,KAAK,CAAC,CAAA;AAEzC,MAAM,eAAe,GAAG,CAAC,CAAM,EAAsB,EAAE,CAC5D,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,QAAQ;IACrB,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,SAAS,CAAC;IACtC,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC;IAC5B,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC;IACnC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC;IACnC,WAAW,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC;IAChC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC;IACnC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC1E,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AAVtB,QAAA,eAAe,mBAUO;AAE5B,MAAM,mBAAmB,GAAqB,CACnD,CAAM,EACsB,EAAE;IAC9B,IAAI,CAAC,IAAA,uBAAe,EAAC,CAAC,CAAC,EAAE;QACvB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;KAC1C;AACH,CAAC,CAAA;AANY,QAAA,mBAAmB,uBAM/B;AAGD,yDAAmE;AACnE,mEAAgF;AAChF,yDAAmE;AACnE,uDAAgE;AAChE,2DAAsE;AACtE,mDAA0D;AAE1D,MAAM,IAAI,GACR,CAAC,EAA0D,EAAE,EAAE,CAC/D,KAAK,EACH,IAAuB,EACvB,GAAwB,EACN,EAAE;IACpB,MAAM,OAAO,GAAG,IAAA,mBAAM,EAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,OAAO,CAAC,IAAI,EAAE;QAChB,IAAI,GAAG,MAAM,IAAA,WAAI,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KACtC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,OAAO,CAAC,CAAC,CACP,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAA,qBAAO,EAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CACnE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;KACjC;SAAM;QACL,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,IAAA,qBAAO,EAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAA;KACrD;AACH,CAAC,CAAA;AAEH,MAAM,QAAQ,GACZ,CAAC,EAAgD,EAAE,EAAE,CACrD,CAAC,IAAuB,EAAE,GAAuB,EAAW,EAAE;IAC5D,MAAM,OAAO,GAAG,IAAA,uBAAU,EAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,OAAO,CAAC,IAAI,EAAE;QAChB,IAAI,GAAG,IAAA,eAAQ,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;KACpC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,OAAO,CAAC,CAAC,IAAI;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAA,qBAAO,EAAC,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;aAC1C,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;KAClC;SAAM;QACL,OAAO,CAAC,CAAC,EAAE,CAAC,IAAA,qBAAO,EAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAA;KAC7C;AACH,CAAC,CAAA;AAEU,QAAA,UAAU,GAAG,QAAQ,CAAC,mCAAgB,CAAC,CAAA;AACvC,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,+BAAY,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAU,EAAE,CAAC,CAAA;AAEhE,QAAA,UAAU,GAAG,QAAQ,CAAC,mCAAgB,CAAC,CAAA;AACvC,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,+BAAY,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAU,EAAE,CAAC,CAAA;AAEhE,QAAA,WAAW,GAAG,QAAQ,CAAC,qCAAiB,CAAC,CAAA;AACzC,QAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,iCAAa,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAW,EAAE,CAAC,CAAA;AAEnE,QAAA,SAAS,GAAG,QAAQ,CAAC,iCAAe,CAAC,CAAA;AACrC,QAAA,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,6BAAW,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAS,EAAE,CAAC,CAAA;AAE7D,QAAA,cAAc,GAAG,QAAQ,CAAC,4CAAoB,CAAC,CAAA;AAC/C,QAAA,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,wCAAgB,CAAC,EAAE;IAC9D,IAAI,EAAE,sBAAc;CACrB,CAAC,CAAA;AAEW,QAAA,UAAU,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAC/C,IAAA,6BAAa,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,EAAE,GAAG,CAAC,CAC/E,CAAA;AACY,QAAA,IAAI,GAAG,kBAAU,CAAA;AAEjB,QAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CACjC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CACjB,IAAA,yBAAS,EAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,+BAAY,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,+BAAY,EAAC,IAAI,EAAE,GAAG,CAAC,CACnE,EACD;IACE,+DAA+D;IAC/D,MAAM,EAAE,cAAM;IACd,IAAI,EAAE,kBAAU;IAChB,UAAU,EAAE,kBAAU;IACtB,MAAM,EAAN,cAAM;IACN,UAAU,EAAV,kBAAU;IACV,MAAM,EAAN,cAAM;IACN,UAAU,EAAV,kBAAU;IACV,KAAK,EAAL,aAAK;IACL,SAAS,EAAT,iBAAS;IACT,OAAO,EAAP,eAAO;IACP,WAAW,EAAX,mBAAW;IACX,UAAU,EAAV,kBAAU;IACV,cAAc,EAAd,sBAAc;CACf,CACF,CAAA;AACD,cAAM,CAAC,MAAM,GAAG,cAAM,CAAA;AAEtB,kBAAe,cAAM,CAAA","sourcesContent":["import { optArg, optArgSync } from './opt-arg.js'\nimport pathArg from './path-arg.js'\n\nimport { glob, GlobOptions, globSync } from 'glob'\n\nexport interface RimrafAsyncOptions {\n preserveRoot?: boolean\n tmp?: string\n maxRetries?: number\n retryDelay?: number\n backoff?: number\n maxBackoff?: number\n signal?: AbortSignal\n glob?: boolean | GlobOptions\n filter?:\n | ((path: string, ent: Dirent | Stats) => boolean)\n | ((path: string, ent: Dirent | Stats) => Promise)\n}\n\nexport interface RimrafSyncOptions extends RimrafAsyncOptions {\n filter?: (path: string, ent: Dirent | Stats) => boolean\n}\n\nexport type RimrafOptions = RimrafSyncOptions | RimrafAsyncOptions\n\nconst typeOrUndef = (val: any, t: string) =>\n typeof val === 'undefined' || typeof val === t\n\nexport const isRimrafOptions = (o: any): o is RimrafOptions =>\n !!o &&\n typeof o === 'object' &&\n typeOrUndef(o.preserveRoot, 'boolean') &&\n typeOrUndef(o.tmp, 'string') &&\n typeOrUndef(o.maxRetries, 'number') &&\n typeOrUndef(o.retryDelay, 'number') &&\n typeOrUndef(o.backoff, 'number') &&\n typeOrUndef(o.maxBackoff, 'number') &&\n (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) &&\n typeOrUndef(o.filter, 'function')\n\nexport const assertRimrafOptions: (o: any) => void = (\n o: any\n): asserts o is RimrafOptions => {\n if (!isRimrafOptions(o)) {\n throw new Error('invalid rimraf options')\n }\n}\n\nimport { Dirent, Stats } from 'fs'\nimport { rimrafManual, rimrafManualSync } from './rimraf-manual.js'\nimport { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js'\nimport { rimrafNative, rimrafNativeSync } from './rimraf-native.js'\nimport { rimrafPosix, rimrafPosixSync } from './rimraf-posix.js'\nimport { rimrafWindows, rimrafWindowsSync } from './rimraf-windows.js'\nimport { useNative, useNativeSync } from './use-native.js'\n\nconst wrap =\n (fn: (p: string, o: RimrafAsyncOptions) => Promise) =>\n async (\n path: string | string[],\n opt?: RimrafAsyncOptions\n ): Promise => {\n const options = optArg(opt)\n if (options.glob) {\n path = await glob(path, options.glob)\n }\n if (Array.isArray(path)) {\n return !!(\n await Promise.all(path.map(p => fn(pathArg(p, options), options)))\n ).reduce((a, b) => a && b, true)\n } else {\n return !!(await fn(pathArg(path, options), options))\n }\n }\n\nconst wrapSync =\n (fn: (p: string, o: RimrafSyncOptions) => boolean) =>\n (path: string | string[], opt?: RimrafSyncOptions): boolean => {\n const options = optArgSync(opt)\n if (options.glob) {\n path = globSync(path, options.glob)\n }\n if (Array.isArray(path)) {\n return !!path\n .map(p => fn(pathArg(p, options), options))\n .reduce((a, b) => a && b, true)\n } else {\n return !!fn(pathArg(path, options), options)\n }\n }\n\nexport const nativeSync = wrapSync(rimrafNativeSync)\nexport const native = Object.assign(wrap(rimrafNative), { sync: nativeSync })\n\nexport const manualSync = wrapSync(rimrafManualSync)\nexport const manual = Object.assign(wrap(rimrafManual), { sync: manualSync })\n\nexport const windowsSync = wrapSync(rimrafWindowsSync)\nexport const windows = Object.assign(wrap(rimrafWindows), { sync: windowsSync })\n\nexport const posixSync = wrapSync(rimrafPosixSync)\nexport const posix = Object.assign(wrap(rimrafPosix), { sync: posixSync })\n\nexport const moveRemoveSync = wrapSync(rimrafMoveRemoveSync)\nexport const moveRemove = Object.assign(wrap(rimrafMoveRemove), {\n sync: moveRemoveSync,\n})\n\nexport const rimrafSync = wrapSync((path, opt) =>\n useNativeSync(opt) ? rimrafNativeSync(path, opt) : rimrafManualSync(path, opt)\n)\nexport const sync = rimrafSync\n\nexport const rimraf = Object.assign(\n wrap((path, opt) =>\n useNative(opt) ? rimrafNative(path, opt) : rimrafManual(path, opt)\n ),\n {\n // this weirdness because it's easier than explicitly declaring\n rimraf: manual,\n sync: rimrafSync,\n rimrafSync: rimrafSync,\n manual,\n manualSync,\n native,\n nativeSync,\n posix,\n posixSync,\n windows,\n windowsSync,\n moveRemove,\n moveRemoveSync,\n }\n)\nrimraf.rimraf = rimraf\n\nexport default rimraf\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts new file mode 100644 index 00000000..220b6417 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts @@ -0,0 +1,17 @@ +import { GlobOptions } from 'glob'; +import { RimrafAsyncOptions, RimrafSyncOptions } from './index.js'; +export declare const optArg: (opt?: RimrafAsyncOptions) => (RimrafAsyncOptions & { + glob: GlobOptions & { + withFileTypes: false; + }; +}) | (RimrafAsyncOptions & { + glob: undefined; +}); +export declare const optArgSync: (opt?: RimrafSyncOptions) => (RimrafSyncOptions & { + glob: GlobOptions & { + withFileTypes: false; + }; +}) | (RimrafSyncOptions & { + glob: undefined; +}); +//# sourceMappingURL=opt-arg.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts.map new file mode 100644 index 00000000..2e6adf1a --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"opt-arg.d.ts","sourceRoot":"","sources":["../../../src/opt-arg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,EAEL,kBAAkB,EAElB,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAqCnB,eAAO,MAAM,MAAM,SAAS,kBAAkB;UA/BlC,WAAW,GAAG;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE;;UAEjC,SAAS;EA6B0C,CAAA;AACpE,eAAO,MAAM,UAAU,SAAS,iBAAiB;UAhCrC,WAAW,GAAG;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE;;UAEjC,SAAS;EA8B6C,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.js new file mode 100644 index 00000000..e7d84e7f --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.js @@ -0,0 +1,36 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.optArgSync = exports.optArg = void 0; +const index_js_1 = require("./index.js"); +const optArgT = (opt) => { + (0, index_js_1.assertRimrafOptions)(opt); + const { glob, ...options } = opt; + if (!glob) { + return options; + } + const globOpt = glob === true + ? opt.signal + ? { signal: opt.signal } + : {} + : opt.signal + ? { + signal: opt.signal, + ...glob, + } + : glob; + return { + ...options, + glob: { + ...globOpt, + // always get absolute paths from glob, to ensure + // that we are referencing the correct thing. + absolute: true, + withFileTypes: false, + }, + }; +}; +const optArg = (opt = {}) => optArgT(opt); +exports.optArg = optArg; +const optArgSync = (opt = {}) => optArgT(opt); +exports.optArgSync = optArgSync; +//# sourceMappingURL=opt-arg.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.js.map new file mode 100644 index 00000000..b2dda3d0 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/opt-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"opt-arg.js","sourceRoot":"","sources":["../../../src/opt-arg.ts"],"names":[],"mappings":";;;AACA,yCAKmB;AAEnB,MAAM,OAAO,GAAG,CACd,GAAM,EAKsB,EAAE;IAC9B,IAAA,8BAAmB,EAAC,GAAG,CAAC,CAAA;IACxB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAA;IAChC,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,OAAkC,CAAA;KAC1C;IACD,MAAM,OAAO,GACX,IAAI,KAAK,IAAI;QACX,CAAC,CAAC,GAAG,CAAC,MAAM;YACV,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;YACxB,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,GAAG,CAAC,MAAM;YACZ,CAAC,CAAC;gBACE,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,GAAG,IAAI;aACR;YACH,CAAC,CAAC,IAAI,CAAA;IACV,OAAO;QACL,GAAG,OAAO;QACV,IAAI,EAAE;YACJ,GAAG,OAAO;YACV,iDAAiD;YACjD,6CAA6C;YAC7C,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,KAAK;SACrB;KACsD,CAAA;AAC3D,CAAC,CAAA;AAEM,MAAM,MAAM,GAAG,CAAC,MAA0B,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AAAvD,QAAA,MAAM,UAAiD;AAC7D,MAAM,UAAU,GAAG,CAAC,MAAyB,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AAA1D,QAAA,UAAU,cAAgD","sourcesContent":["import { GlobOptions } from 'glob'\nimport {\n assertRimrafOptions,\n RimrafAsyncOptions,\n RimrafOptions,\n RimrafSyncOptions,\n} from './index.js'\n\nconst optArgT = (\n opt: T\n):\n | (T & {\n glob: GlobOptions & { withFileTypes: false }\n })\n | (T & { glob: undefined }) => {\n assertRimrafOptions(opt)\n const { glob, ...options } = opt\n if (!glob) {\n return options as T & { glob: undefined }\n }\n const globOpt =\n glob === true\n ? opt.signal\n ? { signal: opt.signal }\n : {}\n : opt.signal\n ? {\n signal: opt.signal,\n ...glob,\n }\n : glob\n return {\n ...options,\n glob: {\n ...globOpt,\n // always get absolute paths from glob, to ensure\n // that we are referencing the correct thing.\n absolute: true,\n withFileTypes: false,\n },\n } as T & { glob: GlobOptions & { withFileTypes: false } }\n}\n\nexport const optArg = (opt: RimrafAsyncOptions = {}) => optArgT(opt)\nexport const optArgSync = (opt: RimrafSyncOptions = {}) => optArgT(opt)\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.d.ts new file mode 100644 index 00000000..c0b7e7cb --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions } from './index.js'; +declare const pathArg: (path: string, opt?: RimrafAsyncOptions) => string; +export default pathArg; +//# sourceMappingURL=path-arg.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.d.ts.map new file mode 100644 index 00000000..08a24613 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.d.ts","sourceRoot":"","sources":["../../../src/path-arg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAG/C,QAAA,MAAM,OAAO,SAAU,MAAM,QAAO,kBAAkB,WAkDrD,CAAA;AAED,eAAe,OAAO,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.js new file mode 100644 index 00000000..1d8487c8 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.js @@ -0,0 +1,54 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const path_1 = require("path"); +const util_1 = require("util"); +const platform_js_1 = __importDefault(require("./platform.js")); +const pathArg = (path, opt = {}) => { + const type = typeof path; + if (type !== 'string') { + const ctor = path && type === 'object' && path.constructor; + const received = ctor && ctor.name + ? `an instance of ${ctor.name}` + : type === 'object' + ? (0, util_1.inspect)(path) + : `type ${type} ${path}`; + const msg = 'The "path" argument must be of type string. ' + `Received ${received}`; + throw Object.assign(new TypeError(msg), { + path, + code: 'ERR_INVALID_ARG_TYPE', + }); + } + if (/\0/.test(path)) { + // simulate same failure that node raises + const msg = 'path must be a string without null bytes'; + throw Object.assign(new TypeError(msg), { + path, + code: 'ERR_INVALID_ARG_VALUE', + }); + } + path = (0, path_1.resolve)(path); + const { root } = (0, path_1.parse)(path); + if (path === root && opt.preserveRoot !== false) { + const msg = 'refusing to remove root directory without preserveRoot:false'; + throw Object.assign(new Error(msg), { + path, + code: 'ERR_PRESERVE_ROOT', + }); + } + if (platform_js_1.default === 'win32') { + const badWinChars = /[*|"<>?:]/; + const { root } = (0, path_1.parse)(path); + if (badWinChars.test(path.substring(root.length))) { + throw Object.assign(new Error('Illegal characters in path.'), { + path, + code: 'EINVAL', + }); + } + } + return path; +}; +exports.default = pathArg; +//# sourceMappingURL=path-arg.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.js.map new file mode 100644 index 00000000..67e1e7ce --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/path-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.js","sourceRoot":"","sources":["../../../src/path-arg.ts"],"names":[],"mappings":";;;;;AAAA,+BAAqC;AACrC,+BAA8B;AAE9B,gEAAoC;AAEpC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAA0B,EAAE,EAAE,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO,IAAI,CAAA;IACxB,IAAI,IAAI,KAAK,QAAQ,EAAE;QACrB,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAA;QAC1D,MAAM,QAAQ,GACZ,IAAI,IAAI,IAAI,CAAC,IAAI;YACf,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE;YAC/B,CAAC,CAAC,IAAI,KAAK,QAAQ;gBACnB,CAAC,CAAC,IAAA,cAAO,EAAC,IAAI,CAAC;gBACf,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,EAAE,CAAA;QAC5B,MAAM,GAAG,GACP,8CAA8C,GAAG,YAAY,QAAQ,EAAE,CAAA;QACzE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE;YACtC,IAAI;YACJ,IAAI,EAAE,sBAAsB;SAC7B,CAAC,CAAA;KACH;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnB,yCAAyC;QACzC,MAAM,GAAG,GAAG,0CAA0C,CAAA;QACtD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE;YACtC,IAAI;YACJ,IAAI,EAAE,uBAAuB;SAC9B,CAAC,CAAA;KACH;IAED,IAAI,GAAG,IAAA,cAAO,EAAC,IAAI,CAAC,CAAA;IACpB,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,YAAK,EAAC,IAAI,CAAC,CAAA;IAE5B,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK,EAAE;QAC/C,MAAM,GAAG,GAAG,8DAA8D,CAAA;QAC1E,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YAClC,IAAI;YACJ,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAA;KACH;IAED,IAAI,qBAAQ,KAAK,OAAO,EAAE;QACxB,MAAM,WAAW,GAAG,WAAW,CAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,IAAA,YAAK,EAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE;gBAC5D,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,kBAAe,OAAO,CAAA","sourcesContent":["import { parse, resolve } from 'path'\nimport { inspect } from 'util'\nimport { RimrafAsyncOptions } from './index.js'\nimport platform from './platform.js'\n\nconst pathArg = (path: string, opt: RimrafAsyncOptions = {}) => {\n const type = typeof path\n if (type !== 'string') {\n const ctor = path && type === 'object' && path.constructor\n const received =\n ctor && ctor.name\n ? `an instance of ${ctor.name}`\n : type === 'object'\n ? inspect(path)\n : `type ${type} ${path}`\n const msg =\n 'The \"path\" argument must be of type string. ' + `Received ${received}`\n throw Object.assign(new TypeError(msg), {\n path,\n code: 'ERR_INVALID_ARG_TYPE',\n })\n }\n\n if (/\\0/.test(path)) {\n // simulate same failure that node raises\n const msg = 'path must be a string without null bytes'\n throw Object.assign(new TypeError(msg), {\n path,\n code: 'ERR_INVALID_ARG_VALUE',\n })\n }\n\n path = resolve(path)\n const { root } = parse(path)\n\n if (path === root && opt.preserveRoot !== false) {\n const msg = 'refusing to remove root directory without preserveRoot:false'\n throw Object.assign(new Error(msg), {\n path,\n code: 'ERR_PRESERVE_ROOT',\n })\n }\n\n if (platform === 'win32') {\n const badWinChars = /[*|\"<>?:]/\n const { root } = parse(path)\n if (badWinChars.test(path.substring(root.length))) {\n throw Object.assign(new Error('Illegal characters in path.'), {\n path,\n code: 'EINVAL',\n })\n }\n }\n\n return path\n}\n\nexport default pathArg\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.d.ts new file mode 100644 index 00000000..e127a8e5 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.d.ts @@ -0,0 +1,3 @@ +declare const _default: string; +export default _default; +//# sourceMappingURL=platform.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.d.ts.map new file mode 100644 index 00000000..557e92ff --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../src/platform.ts"],"names":[],"mappings":";AAAA,wBAA0E"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.js new file mode 100644 index 00000000..58f197ff --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.js @@ -0,0 +1,4 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform; +//# sourceMappingURL=platform.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.js.map new file mode 100644 index 00000000..f85afd7e --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/platform.js.map @@ -0,0 +1 @@ +{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../src/platform.ts"],"names":[],"mappings":";;AAAA,kBAAe,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,QAAQ,CAAA","sourcesContent":["export default process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts new file mode 100644 index 00000000..8b7d6c91 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts @@ -0,0 +1,5 @@ +/// +/// +export declare const readdirOrError: (path: string) => Promise; +export declare const readdirOrErrorSync: (path: string) => import("fs").Dirent[] | NodeJS.ErrnoException; +//# sourceMappingURL=readdir-or-error.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts.map new file mode 100644 index 00000000..6d1b9976 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"readdir-or-error.d.ts","sourceRoot":"","sources":["../../../src/readdir-or-error.ts"],"names":[],"mappings":";;AAIA,eAAO,MAAM,cAAc,SAAU,MAAM,2DACa,CAAA;AACxD,eAAO,MAAM,kBAAkB,SAAU,MAAM,kDAM9C,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.js new file mode 100644 index 00000000..75330cb3 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.readdirOrErrorSync = exports.readdirOrError = void 0; +// returns an array of entries if readdir() works, +// or the error that readdir() raised if not. +const fs_js_1 = require("./fs.js"); +const { readdir } = fs_js_1.promises; +const readdirOrError = (path) => readdir(path).catch(er => er); +exports.readdirOrError = readdirOrError; +const readdirOrErrorSync = (path) => { + try { + return (0, fs_js_1.readdirSync)(path); + } + catch (er) { + return er; + } +}; +exports.readdirOrErrorSync = readdirOrErrorSync; +//# sourceMappingURL=readdir-or-error.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.js.map new file mode 100644 index 00000000..e205085a --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/readdir-or-error.js.map @@ -0,0 +1 @@ +{"version":3,"file":"readdir-or-error.js","sourceRoot":"","sources":["../../../src/readdir-or-error.ts"],"names":[],"mappings":";;;AAAA,kDAAkD;AAClD,6CAA6C;AAC7C,mCAA+C;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,gBAAQ,CAAA;AACrB,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAA2B,CAAC,CAAA;AAD3C,QAAA,cAAc,kBAC6B;AACjD,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,EAAE;IACjD,IAAI;QACF,OAAO,IAAA,mBAAW,EAAC,IAAI,CAAC,CAAA;KACzB;IAAC,OAAO,EAAE,EAAE;QACX,OAAO,EAA2B,CAAA;KACnC;AACH,CAAC,CAAA;AANY,QAAA,kBAAkB,sBAM9B","sourcesContent":["// returns an array of entries if readdir() works,\n// or the error that readdir() raised if not.\nimport { promises, readdirSync } from './fs.js'\nconst { readdir } = promises\nexport const readdirOrError = (path: string) =>\n readdir(path).catch(er => er as NodeJS.ErrnoException)\nexport const readdirOrErrorSync = (path: string) => {\n try {\n return readdirSync(path)\n } catch (er) {\n return er as NodeJS.ErrnoException\n }\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts new file mode 100644 index 00000000..8df88e9b --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts @@ -0,0 +1,8 @@ +import { RimrafAsyncOptions, RimrafOptions } from '.'; +export declare const MAXBACKOFF = 200; +export declare const RATE = 1.2; +export declare const MAXRETRIES = 10; +export declare const codes: Set; +export declare const retryBusy: (fn: (path: string) => Promise) => (path: string, opt: RimrafAsyncOptions, backoff?: number, total?: number) => Promise; +export declare const retryBusySync: (fn: (path: string) => any) => (path: string, opt: RimrafOptions) => any; +//# sourceMappingURL=retry-busy.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts.map new file mode 100644 index 00000000..f89bb0af --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"retry-busy.d.ts","sourceRoot":"","sources":["../../../src/retry-busy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,GAAG,CAAA;AAErD,eAAO,MAAM,UAAU,MAAM,CAAA;AAC7B,eAAO,MAAM,IAAI,MAAM,CAAA;AACvB,eAAO,MAAM,UAAU,KAAK,CAAA;AAC5B,eAAO,MAAM,KAAK,aAAyC,CAAA;AAE3D,eAAO,MAAM,SAAS,cAAe,MAAM,KAAK,QAAQ,GAAG,CAAC,YAElD,MAAM,OACP,kBAAkB,mDAkC1B,CAAA;AAGD,eAAO,MAAM,aAAa,cAAe,MAAM,KAAK,GAAG,YAC/B,MAAM,OAAO,aAAa,QAsBjD,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.js new file mode 100644 index 00000000..5f9d1525 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.js @@ -0,0 +1,68 @@ +"use strict"; +// note: max backoff is the maximum that any *single* backoff will do +Object.defineProperty(exports, "__esModule", { value: true }); +exports.retryBusySync = exports.retryBusy = exports.codes = exports.MAXRETRIES = exports.RATE = exports.MAXBACKOFF = void 0; +exports.MAXBACKOFF = 200; +exports.RATE = 1.2; +exports.MAXRETRIES = 10; +exports.codes = new Set(['EMFILE', 'ENFILE', 'EBUSY']); +const retryBusy = (fn) => { + const method = async (path, opt, backoff = 1, total = 0) => { + const mbo = opt.maxBackoff || exports.MAXBACKOFF; + const rate = opt.backoff || exports.RATE; + const max = opt.maxRetries || exports.MAXRETRIES; + let retries = 0; + while (true) { + try { + return await fn(path); + } + catch (er) { + const fer = er; + if (fer?.path === path && fer?.code && exports.codes.has(fer.code)) { + backoff = Math.ceil(backoff * rate); + total = backoff + total; + if (total < mbo) { + return new Promise((res, rej) => { + setTimeout(() => { + method(path, opt, backoff, total).then(res, rej); + }, backoff); + }); + } + if (retries < max) { + retries++; + continue; + } + } + throw er; + } + } + }; + return method; +}; +exports.retryBusy = retryBusy; +// just retries, no async so no backoff +const retryBusySync = (fn) => { + const method = (path, opt) => { + const max = opt.maxRetries || exports.MAXRETRIES; + let retries = 0; + while (true) { + try { + return fn(path); + } + catch (er) { + const fer = er; + if (fer?.path === path && + fer?.code && + exports.codes.has(fer.code) && + retries < max) { + retries++; + continue; + } + throw er; + } + } + }; + return method; +}; +exports.retryBusySync = retryBusySync; +//# sourceMappingURL=retry-busy.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.js.map new file mode 100644 index 00000000..80638ffe --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/retry-busy.js.map @@ -0,0 +1 @@ +{"version":3,"file":"retry-busy.js","sourceRoot":"","sources":["../../../src/retry-busy.ts"],"names":[],"mappings":";AAAA,qEAAqE;;;AAIxD,QAAA,UAAU,GAAG,GAAG,CAAA;AAChB,QAAA,IAAI,GAAG,GAAG,CAAA;AACV,QAAA,UAAU,GAAG,EAAE,CAAA;AACf,QAAA,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;AAEpD,MAAM,SAAS,GAAG,CAAC,EAAkC,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,KAAK,EAClB,IAAY,EACZ,GAAuB,EACvB,OAAO,GAAG,CAAC,EACX,KAAK,GAAG,CAAC,EACT,EAAE;QACF,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,kBAAU,CAAA;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,YAAI,CAAA;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,kBAAU,CAAA;QACxC,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE;YACX,IAAI;gBACF,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;aACtB;YAAC,OAAO,EAAE,EAAE;gBACX,MAAM,GAAG,GAAG,EAA2B,CAAA;gBACvC,IAAI,GAAG,EAAE,IAAI,KAAK,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,aAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAC1D,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;oBACnC,KAAK,GAAG,OAAO,GAAG,KAAK,CAAA;oBACvB,IAAI,KAAK,GAAG,GAAG,EAAE;wBACf,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;4BAC9B,UAAU,CAAC,GAAG,EAAE;gCACd,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;4BAClD,CAAC,EAAE,OAAO,CAAC,CAAA;wBACb,CAAC,CAAC,CAAA;qBACH;oBACD,IAAI,OAAO,GAAG,GAAG,EAAE;wBACjB,OAAO,EAAE,CAAA;wBACT,SAAQ;qBACT;iBACF;gBACD,MAAM,EAAE,CAAA;aACT;SACF;IACH,CAAC,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AArCY,QAAA,SAAS,aAqCrB;AAED,uCAAuC;AAChC,MAAM,aAAa,GAAG,CAAC,EAAyB,EAAE,EAAE;IACzD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,GAAkB,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,kBAAU,CAAA;QACxC,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE;YACX,IAAI;gBACF,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;aAChB;YAAC,OAAO,EAAE,EAAE;gBACX,MAAM,GAAG,GAAG,EAA2B,CAAA;gBACvC,IACE,GAAG,EAAE,IAAI,KAAK,IAAI;oBAClB,GAAG,EAAE,IAAI;oBACT,aAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;oBACnB,OAAO,GAAG,GAAG,EACb;oBACA,OAAO,EAAE,CAAA;oBACT,SAAQ;iBACT;gBACD,MAAM,EAAE,CAAA;aACT;SACF;IACH,CAAC,CAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAvBY,QAAA,aAAa,iBAuBzB","sourcesContent":["// note: max backoff is the maximum that any *single* backoff will do\n\nimport { RimrafAsyncOptions, RimrafOptions } from '.'\n\nexport const MAXBACKOFF = 200\nexport const RATE = 1.2\nexport const MAXRETRIES = 10\nexport const codes = new Set(['EMFILE', 'ENFILE', 'EBUSY'])\n\nexport const retryBusy = (fn: (path: string) => Promise) => {\n const method = async (\n path: string,\n opt: RimrafAsyncOptions,\n backoff = 1,\n total = 0\n ) => {\n const mbo = opt.maxBackoff || MAXBACKOFF\n const rate = opt.backoff || RATE\n const max = opt.maxRetries || MAXRETRIES\n let retries = 0\n while (true) {\n try {\n return await fn(path)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer?.path === path && fer?.code && codes.has(fer.code)) {\n backoff = Math.ceil(backoff * rate)\n total = backoff + total\n if (total < mbo) {\n return new Promise((res, rej) => {\n setTimeout(() => {\n method(path, opt, backoff, total).then(res, rej)\n }, backoff)\n })\n }\n if (retries < max) {\n retries++\n continue\n }\n }\n throw er\n }\n }\n }\n\n return method\n}\n\n// just retries, no async so no backoff\nexport const retryBusySync = (fn: (path: string) => any) => {\n const method = (path: string, opt: RimrafOptions) => {\n const max = opt.maxRetries || MAXRETRIES\n let retries = 0\n while (true) {\n try {\n return fn(path)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (\n fer?.path === path &&\n fer?.code &&\n codes.has(fer.code) &&\n retries < max\n ) {\n retries++\n continue\n }\n throw er\n }\n }\n }\n return method\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts new file mode 100644 index 00000000..5b143434 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts @@ -0,0 +1,3 @@ +export declare const rimrafManual: (path: string, opt: import("./index.js").RimrafAsyncOptions) => Promise; +export declare const rimrafManualSync: (path: string, opt: import("./index.js").RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-manual.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts.map new file mode 100644 index 00000000..c737d446 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-manual.d.ts","sourceRoot":"","sources":["../../../src/rimraf-manual.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY,kFAAqD,CAAA;AAC9E,eAAO,MAAM,gBAAgB,wEAC+B,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.js new file mode 100644 index 00000000..1c95ae23 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.js @@ -0,0 +1,12 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.rimrafManualSync = exports.rimrafManual = void 0; +const platform_js_1 = __importDefault(require("./platform.js")); +const rimraf_posix_js_1 = require("./rimraf-posix.js"); +const rimraf_windows_js_1 = require("./rimraf-windows.js"); +exports.rimrafManual = platform_js_1.default === 'win32' ? rimraf_windows_js_1.rimrafWindows : rimraf_posix_js_1.rimrafPosix; +exports.rimrafManualSync = platform_js_1.default === 'win32' ? rimraf_windows_js_1.rimrafWindowsSync : rimraf_posix_js_1.rimrafPosixSync; +//# sourceMappingURL=rimraf-manual.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.js.map new file mode 100644 index 00000000..ff26aee2 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-manual.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-manual.js","sourceRoot":"","sources":["../../../src/rimraf-manual.ts"],"names":[],"mappings":";;;;;;AAAA,gEAAoC;AAEpC,uDAAgE;AAChE,2DAAsE;AAEzD,QAAA,YAAY,GAAG,qBAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,iCAAa,CAAC,CAAC,CAAC,6BAAW,CAAA;AACjE,QAAA,gBAAgB,GAC3B,qBAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,qCAAiB,CAAC,CAAC,CAAC,iCAAe,CAAA","sourcesContent":["import platform from './platform.js'\n\nimport { rimrafPosix, rimrafPosixSync } from './rimraf-posix.js'\nimport { rimrafWindows, rimrafWindowsSync } from './rimraf-windows.js'\n\nexport const rimrafManual = platform === 'win32' ? rimrafWindows : rimrafPosix\nexport const rimrafManualSync =\n platform === 'win32' ? rimrafWindowsSync : rimrafPosixSync\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts new file mode 100644 index 00000000..da5b6b65 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafSyncOptions } from '.'; +export declare const rimrafMoveRemove: (path: string, opt: RimrafAsyncOptions) => Promise; +export declare const rimrafMoveRemoveSync: (path: string, opt: RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-move-remove.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts.map new file mode 100644 index 00000000..9bf1d75a --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-move-remove.d.ts","sourceRoot":"","sources":["../../../src/rimraf-move-remove.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAA;AA4CzD,eAAO,MAAM,gBAAgB,SACrB,MAAM,OACP,kBAAkB,qBAWxB,CAAA;AA0ED,eAAO,MAAM,oBAAoB,SAAU,MAAM,OAAO,iBAAiB,YAUxE,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js new file mode 100644 index 00000000..ac668d1c --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js @@ -0,0 +1,192 @@ +"use strict"; +// https://youtu.be/uhRWMGBjlO8?t=537 +// +// 1. readdir +// 2. for each entry +// a. if a non-empty directory, recurse +// b. if an empty directory, move to random hidden file name in $TEMP +// c. unlink/rmdir $TEMP +// +// This works around the fact that unlink/rmdir is non-atomic and takes +// a non-deterministic amount of time to complete. +// +// However, it is HELLA SLOW, like 2-10x slower than a naive recursive rm. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.rimrafMoveRemoveSync = exports.rimrafMoveRemove = void 0; +const path_1 = require("path"); +const default_tmp_js_1 = require("./default-tmp.js"); +const ignore_enoent_js_1 = require("./ignore-enoent.js"); +const fs_js_1 = require("./fs.js"); +const { lstat, rename, unlink, rmdir, chmod } = fs_js_1.promises; +const readdir_or_error_js_1 = require("./readdir-or-error.js"); +// crypto.randomBytes is much slower, and Math.random() is enough here +const uniqueFilename = (path) => `.${(0, path_1.basename)(path)}.${Math.random()}`; +const unlinkFixEPERM = async (path) => unlink(path).catch((er) => { + if (er.code === 'EPERM') { + return chmod(path, 0o666).then(() => unlink(path), er2 => { + if (er2.code === 'ENOENT') { + return; + } + throw er; + }); + } + else if (er.code === 'ENOENT') { + return; + } + throw er; +}); +const unlinkFixEPERMSync = (path) => { + try { + (0, fs_js_1.unlinkSync)(path); + } + catch (er) { + if (er?.code === 'EPERM') { + try { + return (0, fs_js_1.chmodSync)(path, 0o666); + } + catch (er2) { + if (er2?.code === 'ENOENT') { + return; + } + throw er; + } + } + else if (er?.code === 'ENOENT') { + return; + } + throw er; + } +}; +const rimrafMoveRemove = async (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return await rimrafMoveRemoveDir(path, opt, await lstat(path)); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +exports.rimrafMoveRemove = rimrafMoveRemove; +const rimrafMoveRemoveDir = async (path, opt, ent) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + if (!opt.tmp) { + return rimrafMoveRemoveDir(path, { ...opt, tmp: await (0, default_tmp_js_1.defaultTmp)(path) }, ent); + } + if (path === opt.tmp && (0, path_1.parse)(path).root !== path) { + throw new Error('cannot delete temp directory used for deletion'); + } + const entries = ent.isDirectory() ? await (0, readdir_or_error_js_1.readdirOrError)(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await (0, ignore_enoent_js_1.ignoreENOENT)(tmpUnlink(path, opt.tmp, unlinkFixEPERM)); + return true; + } + const removedAll = (await Promise.all(entries.map(ent => rimrafMoveRemoveDir((0, path_1.resolve)(path, ent.name), opt, ent)))).reduce((a, b) => a && b, true); + if (!removedAll) { + return false; + } + // we don't ever ACTUALLY try to unlink /, because that can never work + // but when preserveRoot is false, we could be operating on it. + // No need to check if preserveRoot is not false. + if (opt.preserveRoot === false && path === (0, path_1.parse)(path).root) { + return false; + } + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await (0, ignore_enoent_js_1.ignoreENOENT)(tmpUnlink(path, opt.tmp, rmdir)); + return true; +}; +const tmpUnlink = async (path, tmp, rm) => { + const tmpFile = (0, path_1.resolve)(tmp, uniqueFilename(path)); + await rename(path, tmpFile); + return await rm(tmpFile); +}; +const rimrafMoveRemoveSync = (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return rimrafMoveRemoveDirSync(path, opt, (0, fs_js_1.lstatSync)(path)); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +exports.rimrafMoveRemoveSync = rimrafMoveRemoveSync; +const rimrafMoveRemoveDirSync = (path, opt, ent) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + if (!opt.tmp) { + return rimrafMoveRemoveDirSync(path, { ...opt, tmp: (0, default_tmp_js_1.defaultTmpSync)(path) }, ent); + } + const tmp = opt.tmp; + if (path === opt.tmp && (0, path_1.parse)(path).root !== path) { + throw new Error('cannot delete temp directory used for deletion'); + } + const entries = ent.isDirectory() ? (0, readdir_or_error_js_1.readdirOrErrorSync)(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + (0, ignore_enoent_js_1.ignoreENOENTSync)(() => tmpUnlinkSync(path, tmp, unlinkFixEPERMSync)); + return true; + } + let removedAll = true; + for (const ent of entries) { + const p = (0, path_1.resolve)(path, ent.name); + removedAll = rimrafMoveRemoveDirSync(p, opt, ent) && removedAll; + } + if (!removedAll) { + return false; + } + if (opt.preserveRoot === false && path === (0, path_1.parse)(path).root) { + return false; + } + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + (0, ignore_enoent_js_1.ignoreENOENTSync)(() => tmpUnlinkSync(path, tmp, fs_js_1.rmdirSync)); + return true; +}; +const tmpUnlinkSync = (path, tmp, rmSync) => { + const tmpFile = (0, path_1.resolve)(tmp, uniqueFilename(path)); + (0, fs_js_1.renameSync)(path, tmpFile); + return rmSync(tmpFile); +}; +//# sourceMappingURL=rimraf-move-remove.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js.map new file mode 100644 index 00000000..7aef8e62 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-move-remove.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-move-remove.js","sourceRoot":"","sources":["../../../src/rimraf-move-remove.ts"],"names":[],"mappings":"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","sourcesContent":["// https://youtu.be/uhRWMGBjlO8?t=537\n//\n// 1. readdir\n// 2. for each entry\n// a. if a non-empty directory, recurse\n// b. if an empty directory, move to random hidden file name in $TEMP\n// c. unlink/rmdir $TEMP\n//\n// This works around the fact that unlink/rmdir is non-atomic and takes\n// a non-deterministic amount of time to complete.\n//\n// However, it is HELLA SLOW, like 2-10x slower than a naive recursive rm.\n\nimport { basename, parse, resolve } from 'path'\nimport { defaultTmp, defaultTmpSync } from './default-tmp.js'\n\nimport { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'\n\nimport {\n chmodSync,\n lstatSync,\n promises as fsPromises,\n renameSync,\n rmdirSync,\n unlinkSync,\n} from './fs.js'\nconst { lstat, rename, unlink, rmdir, chmod } = fsPromises\n\nimport { Dirent, Stats } from 'fs'\nimport { RimrafAsyncOptions, RimrafSyncOptions } from '.'\nimport { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'\n\n// crypto.randomBytes is much slower, and Math.random() is enough here\nconst uniqueFilename = (path: string) => `.${basename(path)}.${Math.random()}`\n\nconst unlinkFixEPERM = async (path: string) =>\n unlink(path).catch((er: Error & { code?: string }) => {\n if (er.code === 'EPERM') {\n return chmod(path, 0o666).then(\n () => unlink(path),\n er2 => {\n if (er2.code === 'ENOENT') {\n return\n }\n throw er\n }\n )\n } else if (er.code === 'ENOENT') {\n return\n }\n throw er\n })\n\nconst unlinkFixEPERMSync = (path: string) => {\n try {\n unlinkSync(path)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'EPERM') {\n try {\n return chmodSync(path, 0o666)\n } catch (er2) {\n if ((er2 as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return\n }\n throw er\n }\n } else if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return\n }\n throw er\n }\n}\n\nexport const rimrafMoveRemove = async (\n path: string,\n opt: RimrafAsyncOptions\n) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return await rimrafMoveRemoveDir(path, opt, await lstat(path))\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nconst rimrafMoveRemoveDir = async (\n path: string,\n opt: RimrafAsyncOptions,\n ent: Dirent | Stats\n): Promise => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n if (!opt.tmp) {\n return rimrafMoveRemoveDir(\n path,\n { ...opt, tmp: await defaultTmp(path) },\n ent\n )\n }\n if (path === opt.tmp && parse(path).root !== path) {\n throw new Error('cannot delete temp directory used for deletion')\n }\n\n const entries = ent.isDirectory() ? await readdirOrError(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n await ignoreENOENT(tmpUnlink(path, opt.tmp, unlinkFixEPERM))\n return true\n }\n\n const removedAll = (\n await Promise.all(\n entries.map(ent => rimrafMoveRemoveDir(resolve(path, ent.name), opt, ent))\n )\n ).reduce((a, b) => a && b, true)\n if (!removedAll) {\n return false\n }\n\n // we don't ever ACTUALLY try to unlink /, because that can never work\n // but when preserveRoot is false, we could be operating on it.\n // No need to check if preserveRoot is not false.\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n await ignoreENOENT(tmpUnlink(path, opt.tmp, rmdir))\n return true\n}\n\nconst tmpUnlink = async (\n path: string,\n tmp: string,\n rm: (p: string) => Promise\n) => {\n const tmpFile = resolve(tmp, uniqueFilename(path))\n await rename(path, tmpFile)\n return await rm(tmpFile)\n}\n\nexport const rimrafMoveRemoveSync = (path: string, opt: RimrafSyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return rimrafMoveRemoveDirSync(path, opt, lstatSync(path))\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nconst rimrafMoveRemoveDirSync = (\n path: string,\n opt: RimrafSyncOptions,\n ent: Dirent | Stats\n): boolean => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n if (!opt.tmp) {\n return rimrafMoveRemoveDirSync(\n path,\n { ...opt, tmp: defaultTmpSync(path) },\n ent\n )\n }\n const tmp: string = opt.tmp\n\n if (path === opt.tmp && parse(path).root !== path) {\n throw new Error('cannot delete temp directory used for deletion')\n }\n\n const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n ignoreENOENTSync(() => tmpUnlinkSync(path, tmp, unlinkFixEPERMSync))\n return true\n }\n\n let removedAll = true\n for (const ent of entries) {\n const p = resolve(path, ent.name)\n removedAll = rimrafMoveRemoveDirSync(p, opt, ent) && removedAll\n }\n if (!removedAll) {\n return false\n }\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n ignoreENOENTSync(() => tmpUnlinkSync(path, tmp, rmdirSync))\n return true\n}\n\nconst tmpUnlinkSync = (\n path: string,\n tmp: string,\n rmSync: (p: string) => void\n) => {\n const tmpFile = resolve(tmp, uniqueFilename(path))\n renameSync(path, tmpFile)\n return rmSync(tmpFile)\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts new file mode 100644 index 00000000..9c08af09 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafSyncOptions } from '.'; +export declare const rimrafNative: (path: string, opt: RimrafAsyncOptions) => Promise; +export declare const rimrafNativeSync: (path: string, opt: RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-native.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts.map new file mode 100644 index 00000000..b470dc9d --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-native.d.ts","sourceRoot":"","sources":["../../../src/rimraf-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAA;AAIzD,eAAO,MAAM,YAAY,SACjB,MAAM,OACP,kBAAkB,KACtB,QAAQ,OAAO,CAOjB,CAAA;AAED,eAAO,MAAM,gBAAgB,SACrB,MAAM,OACP,iBAAiB,KACrB,OAOF,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.js new file mode 100644 index 00000000..ab9f633d --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.rimrafNativeSync = exports.rimrafNative = void 0; +const fs_js_1 = require("./fs.js"); +const { rm } = fs_js_1.promises; +const rimrafNative = async (path, opt) => { + await rm(path, { + ...opt, + force: true, + recursive: true, + }); + return true; +}; +exports.rimrafNative = rimrafNative; +const rimrafNativeSync = (path, opt) => { + (0, fs_js_1.rmSync)(path, { + ...opt, + force: true, + recursive: true, + }); + return true; +}; +exports.rimrafNativeSync = rimrafNativeSync; +//# sourceMappingURL=rimraf-native.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.js.map new file mode 100644 index 00000000..6a6bded0 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-native.js","sourceRoot":"","sources":["../../../src/rimraf-native.ts"],"names":[],"mappings":";;;AACA,mCAA0C;AAC1C,MAAM,EAAE,EAAE,EAAE,GAAG,gBAAQ,CAAA;AAEhB,MAAM,YAAY,GAAG,KAAK,EAC/B,IAAY,EACZ,GAAuB,EACL,EAAE;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE;QACb,GAAG,GAAG;QACN,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAVY,QAAA,YAAY,gBAUxB;AAEM,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,GAAsB,EACb,EAAE;IACX,IAAA,cAAM,EAAC,IAAI,EAAE;QACX,GAAG,GAAG;QACN,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAVY,QAAA,gBAAgB,oBAU5B","sourcesContent":["import { RimrafAsyncOptions, RimrafSyncOptions } from '.'\nimport { promises, rmSync } from './fs.js'\nconst { rm } = promises\n\nexport const rimrafNative = async (\n path: string,\n opt: RimrafAsyncOptions\n): Promise => {\n await rm(path, {\n ...opt,\n force: true,\n recursive: true,\n })\n return true\n}\n\nexport const rimrafNativeSync = (\n path: string,\n opt: RimrafSyncOptions\n): boolean => {\n rmSync(path, {\n ...opt,\n force: true,\n recursive: true,\n })\n return true\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts new file mode 100644 index 00000000..fd4c83c3 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafSyncOptions } from '.'; +export declare const rimrafPosix: (path: string, opt: RimrafAsyncOptions) => Promise; +export declare const rimrafPosixSync: (path: string, opt: RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-posix.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts.map new file mode 100644 index 00000000..3112847c --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-posix.d.ts","sourceRoot":"","sources":["../../../src/rimraf-posix.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAA;AAGzD,eAAO,MAAM,WAAW,SAAgB,MAAM,OAAO,kBAAkB,qBAUtE,CAAA;AAED,eAAO,MAAM,eAAe,SAAU,MAAM,OAAO,iBAAiB,YAUnE,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.js new file mode 100644 index 00000000..eb0e7f11 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.js @@ -0,0 +1,123 @@ +"use strict"; +// the simple recursive removal, where unlink and rmdir are atomic +// Note that this approach does NOT work on Windows! +// We stat first and only unlink if the Dirent isn't a directory, +// because sunos will let root unlink a directory, and some +// SUPER weird breakage happens as a result. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.rimrafPosixSync = exports.rimrafPosix = void 0; +const fs_js_1 = require("./fs.js"); +const { lstat, rmdir, unlink } = fs_js_1.promises; +const path_1 = require("path"); +const readdir_or_error_js_1 = require("./readdir-or-error.js"); +const ignore_enoent_js_1 = require("./ignore-enoent.js"); +const rimrafPosix = async (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return await rimrafPosixDir(path, opt, await lstat(path)); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +exports.rimrafPosix = rimrafPosix; +const rimrafPosixSync = (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return rimrafPosixDirSync(path, opt, (0, fs_js_1.lstatSync)(path)); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +exports.rimrafPosixSync = rimrafPosixSync; +const rimrafPosixDir = async (path, opt, ent) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + const entries = ent.isDirectory() ? await (0, readdir_or_error_js_1.readdirOrError)(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await (0, ignore_enoent_js_1.ignoreENOENT)(unlink(path)); + return true; + } + const removedAll = (await Promise.all(entries.map(ent => rimrafPosixDir((0, path_1.resolve)(path, ent.name), opt, ent)))).reduce((a, b) => a && b, true); + if (!removedAll) { + return false; + } + // we don't ever ACTUALLY try to unlink /, because that can never work + // but when preserveRoot is false, we could be operating on it. + // No need to check if preserveRoot is not false. + if (opt.preserveRoot === false && path === (0, path_1.parse)(path).root) { + return false; + } + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await (0, ignore_enoent_js_1.ignoreENOENT)(rmdir(path)); + return true; +}; +const rimrafPosixDirSync = (path, opt, ent) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + const entries = ent.isDirectory() ? (0, readdir_or_error_js_1.readdirOrErrorSync)(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + (0, ignore_enoent_js_1.ignoreENOENTSync)(() => (0, fs_js_1.unlinkSync)(path)); + return true; + } + let removedAll = true; + for (const ent of entries) { + const p = (0, path_1.resolve)(path, ent.name); + removedAll = rimrafPosixDirSync(p, opt, ent) && removedAll; + } + if (opt.preserveRoot === false && path === (0, path_1.parse)(path).root) { + return false; + } + if (!removedAll) { + return false; + } + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + (0, ignore_enoent_js_1.ignoreENOENTSync)(() => (0, fs_js_1.rmdirSync)(path)); + return true; +}; +//# sourceMappingURL=rimraf-posix.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.js.map new file mode 100644 index 00000000..b470ce41 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-posix.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-posix.js","sourceRoot":"","sources":["../../../src/rimraf-posix.ts"],"names":[],"mappings":"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","sourcesContent":["// the simple recursive removal, where unlink and rmdir are atomic\n// Note that this approach does NOT work on Windows!\n// We stat first and only unlink if the Dirent isn't a directory,\n// because sunos will let root unlink a directory, and some\n// SUPER weird breakage happens as a result.\n\nimport { lstatSync, promises, rmdirSync, unlinkSync } from './fs.js'\nconst { lstat, rmdir, unlink } = promises\n\nimport { parse, resolve } from 'path'\n\nimport { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'\n\nimport { Dirent, Stats } from 'fs'\nimport { RimrafAsyncOptions, RimrafSyncOptions } from '.'\nimport { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'\n\nexport const rimrafPosix = async (path: string, opt: RimrafAsyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return await rimrafPosixDir(path, opt, await lstat(path))\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nexport const rimrafPosixSync = (path: string, opt: RimrafSyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return rimrafPosixDirSync(path, opt, lstatSync(path))\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nconst rimrafPosixDir = async (\n path: string,\n opt: RimrafAsyncOptions,\n ent: Dirent | Stats\n): Promise => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n const entries = ent.isDirectory() ? await readdirOrError(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n await ignoreENOENT(unlink(path))\n return true\n }\n\n const removedAll = (\n await Promise.all(\n entries.map(ent => rimrafPosixDir(resolve(path, ent.name), opt, ent))\n )\n ).reduce((a, b) => a && b, true)\n\n if (!removedAll) {\n return false\n }\n\n // we don't ever ACTUALLY try to unlink /, because that can never work\n // but when preserveRoot is false, we could be operating on it.\n // No need to check if preserveRoot is not false.\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n\n await ignoreENOENT(rmdir(path))\n return true\n}\n\nconst rimrafPosixDirSync = (\n path: string,\n opt: RimrafSyncOptions,\n ent: Dirent | Stats\n): boolean => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n ignoreENOENTSync(() => unlinkSync(path))\n return true\n }\n let removedAll: boolean = true\n for (const ent of entries) {\n const p = resolve(path, ent.name)\n removedAll = rimrafPosixDirSync(p, opt, ent) && removedAll\n }\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n\n if (!removedAll) {\n return false\n }\n\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n\n ignoreENOENTSync(() => rmdirSync(path))\n return true\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts new file mode 100644 index 00000000..94129878 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafSyncOptions } from '.'; +export declare const rimrafWindows: (path: string, opt: RimrafAsyncOptions) => Promise; +export declare const rimrafWindowsSync: (path: string, opt: RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-windows.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts.map new file mode 100644 index 00000000..c94ed664 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-windows.d.ts","sourceRoot":"","sources":["../../../src/rimraf-windows.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAA;AA2DzD,eAAO,MAAM,aAAa,SAAgB,MAAM,OAAO,kBAAkB,qBAUxE,CAAA;AAED,eAAO,MAAM,iBAAiB,SAAU,MAAM,OAAO,iBAAiB,YAUrE,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.js new file mode 100644 index 00000000..8d19f98f --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.js @@ -0,0 +1,182 @@ +"use strict"; +// This is the same as rimrafPosix, with the following changes: +// +// 1. EBUSY, ENFILE, EMFILE trigger retries and/or exponential backoff +// 2. All non-directories are removed first and then all directories are +// removed in a second sweep. +// 3. If we hit ENOTEMPTY in the second sweep, fall back to move-remove on +// the that folder. +// +// Note: "move then remove" is 2-10 times slower, and just as unreliable. +Object.defineProperty(exports, "__esModule", { value: true }); +exports.rimrafWindowsSync = exports.rimrafWindows = void 0; +const path_1 = require("path"); +const fix_eperm_js_1 = require("./fix-eperm.js"); +const fs_js_1 = require("./fs.js"); +const ignore_enoent_js_1 = require("./ignore-enoent.js"); +const readdir_or_error_js_1 = require("./readdir-or-error.js"); +const retry_busy_js_1 = require("./retry-busy.js"); +const rimraf_move_remove_js_1 = require("./rimraf-move-remove.js"); +const { unlink, rmdir, lstat } = fs_js_1.promises; +const rimrafWindowsFile = (0, retry_busy_js_1.retryBusy)((0, fix_eperm_js_1.fixEPERM)(unlink)); +const rimrafWindowsFileSync = (0, retry_busy_js_1.retryBusySync)((0, fix_eperm_js_1.fixEPERMSync)(fs_js_1.unlinkSync)); +const rimrafWindowsDirRetry = (0, retry_busy_js_1.retryBusy)((0, fix_eperm_js_1.fixEPERM)(rmdir)); +const rimrafWindowsDirRetrySync = (0, retry_busy_js_1.retryBusySync)((0, fix_eperm_js_1.fixEPERMSync)(fs_js_1.rmdirSync)); +const rimrafWindowsDirMoveRemoveFallback = async (path, opt) => { + /* c8 ignore start */ + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + /* c8 ignore stop */ + // already filtered, remove from options so we don't call unnecessarily + const { filter, ...options } = opt; + try { + return await rimrafWindowsDirRetry(path, options); + } + catch (er) { + if (er?.code === 'ENOTEMPTY') { + return await (0, rimraf_move_remove_js_1.rimrafMoveRemove)(path, options); + } + throw er; + } +}; +const rimrafWindowsDirMoveRemoveFallbackSync = (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + // already filtered, remove from options so we don't call unnecessarily + const { filter, ...options } = opt; + try { + return rimrafWindowsDirRetrySync(path, options); + } + catch (er) { + const fer = er; + if (fer?.code === 'ENOTEMPTY') { + return (0, rimraf_move_remove_js_1.rimrafMoveRemoveSync)(path, options); + } + throw er; + } +}; +const START = Symbol('start'); +const CHILD = Symbol('child'); +const FINISH = Symbol('finish'); +const rimrafWindows = async (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return await rimrafWindowsDir(path, opt, await lstat(path), START); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +exports.rimrafWindows = rimrafWindows; +const rimrafWindowsSync = (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return rimrafWindowsDirSync(path, opt, (0, fs_js_1.lstatSync)(path), START); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +exports.rimrafWindowsSync = rimrafWindowsSync; +const rimrafWindowsDir = async (path, opt, ent, state = START) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + const entries = ent.isDirectory() ? await (0, readdir_or_error_js_1.readdirOrError)(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + // is a file + await (0, ignore_enoent_js_1.ignoreENOENT)(rimrafWindowsFile(path, opt)); + return true; + } + const s = state === START ? CHILD : state; + const removedAll = (await Promise.all(entries.map(ent => rimrafWindowsDir((0, path_1.resolve)(path, ent.name), opt, ent, s)))).reduce((a, b) => a && b, true); + if (state === START) { + return rimrafWindowsDir(path, opt, ent, FINISH); + } + else if (state === FINISH) { + if (opt.preserveRoot === false && path === (0, path_1.parse)(path).root) { + return false; + } + if (!removedAll) { + return false; + } + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await (0, ignore_enoent_js_1.ignoreENOENT)(rimrafWindowsDirMoveRemoveFallback(path, opt)); + } + return true; +}; +const rimrafWindowsDirSync = (path, opt, ent, state = START) => { + const entries = ent.isDirectory() ? (0, readdir_or_error_js_1.readdirOrErrorSync)(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + // is a file + (0, ignore_enoent_js_1.ignoreENOENTSync)(() => rimrafWindowsFileSync(path, opt)); + return true; + } + let removedAll = true; + for (const ent of entries) { + const s = state === START ? CHILD : state; + const p = (0, path_1.resolve)(path, ent.name); + removedAll = rimrafWindowsDirSync(p, opt, ent, s) && removedAll; + } + if (state === START) { + return rimrafWindowsDirSync(path, opt, ent, FINISH); + } + else if (state === FINISH) { + if (opt.preserveRoot === false && path === (0, path_1.parse)(path).root) { + return false; + } + if (!removedAll) { + return false; + } + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + (0, ignore_enoent_js_1.ignoreENOENTSync)(() => { + rimrafWindowsDirMoveRemoveFallbackSync(path, opt); + }); + } + return true; +}; +//# sourceMappingURL=rimraf-windows.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.js.map new file mode 100644 index 00000000..31b18947 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/rimraf-windows.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-windows.js","sourceRoot":"","sources":["../../../src/rimraf-windows.ts"],"names":[],"mappings":"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","sourcesContent":["// This is the same as rimrafPosix, with the following changes:\n//\n// 1. EBUSY, ENFILE, EMFILE trigger retries and/or exponential backoff\n// 2. All non-directories are removed first and then all directories are\n// removed in a second sweep.\n// 3. If we hit ENOTEMPTY in the second sweep, fall back to move-remove on\n// the that folder.\n//\n// Note: \"move then remove\" is 2-10 times slower, and just as unreliable.\n\nimport { Dirent, Stats } from 'fs'\nimport { parse, resolve } from 'path'\nimport { RimrafAsyncOptions, RimrafSyncOptions } from '.'\nimport { fixEPERM, fixEPERMSync } from './fix-eperm.js'\nimport { lstatSync, promises, rmdirSync, unlinkSync } from './fs.js'\nimport { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'\nimport { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'\nimport { retryBusy, retryBusySync } from './retry-busy.js'\nimport { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js'\nconst { unlink, rmdir, lstat } = promises\n\nconst rimrafWindowsFile = retryBusy(fixEPERM(unlink))\nconst rimrafWindowsFileSync = retryBusySync(fixEPERMSync(unlinkSync))\nconst rimrafWindowsDirRetry = retryBusy(fixEPERM(rmdir))\nconst rimrafWindowsDirRetrySync = retryBusySync(fixEPERMSync(rmdirSync))\n\nconst rimrafWindowsDirMoveRemoveFallback = async (\n path: string,\n opt: RimrafAsyncOptions\n): Promise => {\n /* c8 ignore start */\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n /* c8 ignore stop */\n // already filtered, remove from options so we don't call unnecessarily\n const { filter, ...options } = opt\n try {\n return await rimrafWindowsDirRetry(path, options)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOTEMPTY') {\n return await rimrafMoveRemove(path, options)\n }\n throw er\n }\n}\n\nconst rimrafWindowsDirMoveRemoveFallbackSync = (\n path: string,\n opt: RimrafSyncOptions\n): boolean => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n // already filtered, remove from options so we don't call unnecessarily\n const { filter, ...options } = opt\n try {\n return rimrafWindowsDirRetrySync(path, options)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer?.code === 'ENOTEMPTY') {\n return rimrafMoveRemoveSync(path, options)\n }\n throw er\n }\n}\n\nconst START = Symbol('start')\nconst CHILD = Symbol('child')\nconst FINISH = Symbol('finish')\n\nexport const rimrafWindows = async (path: string, opt: RimrafAsyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return await rimrafWindowsDir(path, opt, await lstat(path), START)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nexport const rimrafWindowsSync = (path: string, opt: RimrafSyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return rimrafWindowsDirSync(path, opt, lstatSync(path), START)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nconst rimrafWindowsDir = async (\n path: string,\n opt: RimrafAsyncOptions,\n ent: Dirent | Stats,\n state = START\n): Promise => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n\n const entries = ent.isDirectory() ? await readdirOrError(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n // is a file\n await ignoreENOENT(rimrafWindowsFile(path, opt))\n return true\n }\n\n const s = state === START ? CHILD : state\n const removedAll = (\n await Promise.all(\n entries.map(ent => rimrafWindowsDir(resolve(path, ent.name), opt, ent, s))\n )\n ).reduce((a, b) => a && b, true)\n\n if (state === START) {\n return rimrafWindowsDir(path, opt, ent, FINISH)\n } else if (state === FINISH) {\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n if (!removedAll) {\n return false\n }\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n await ignoreENOENT(rimrafWindowsDirMoveRemoveFallback(path, opt))\n }\n return true\n}\n\nconst rimrafWindowsDirSync = (\n path: string,\n opt: RimrafSyncOptions,\n ent: Dirent | Stats,\n state = START\n): boolean => {\n const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n // is a file\n ignoreENOENTSync(() => rimrafWindowsFileSync(path, opt))\n return true\n }\n\n let removedAll = true\n for (const ent of entries) {\n const s = state === START ? CHILD : state\n const p = resolve(path, ent.name)\n removedAll = rimrafWindowsDirSync(p, opt, ent, s) && removedAll\n }\n\n if (state === START) {\n return rimrafWindowsDirSync(path, opt, ent, FINISH)\n } else if (state === FINISH) {\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n if (!removedAll) {\n return false\n }\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n ignoreENOENTSync(() => {\n rimrafWindowsDirMoveRemoveFallbackSync(path, opt)\n })\n }\n return true\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.d.ts b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.d.ts new file mode 100644 index 00000000..e191fd90 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafOptions } from './index.js'; +export declare const useNative: (opt?: RimrafAsyncOptions) => boolean; +export declare const useNativeSync: (opt?: RimrafOptions) => boolean; +//# sourceMappingURL=use-native.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.d.ts.map new file mode 100644 index 00000000..2ae57a4e --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.d.ts","sourceRoot":"","sources":["../../../src/use-native.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAI9D,eAAO,MAAM,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,kBAAkB,KAAK,OAGb,CAAA;AACzC,eAAO,MAAM,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,aAAa,KAAK,OAGZ,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.js b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.js new file mode 100644 index 00000000..3d83c596 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.js @@ -0,0 +1,19 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.useNativeSync = exports.useNative = void 0; +const version = process.env.__TESTING_RIMRAF_NODE_VERSION__ || process.version; +const versArr = version.replace(/^v/, '').split('.'); +const hasNative = +versArr[0] > 14 || (+versArr[0] === 14 && +versArr[1] >= 14); +// we do NOT use native by default on Windows, because Node's native +// rm implementation is less advanced. Change this code if that changes. +const platform_js_1 = __importDefault(require("./platform.js")); +exports.useNative = !hasNative || platform_js_1.default === 'win32' + ? () => false + : opt => !opt?.signal && !opt?.filter; +exports.useNativeSync = !hasNative || platform_js_1.default === 'win32' + ? () => false + : opt => !opt?.signal && !opt?.filter; +//# sourceMappingURL=use-native.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.js.map b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.js.map new file mode 100644 index 00000000..3e872bd5 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/cjs/src/use-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.js","sourceRoot":"","sources":["../../../src/use-native.ts"],"names":[],"mappings":";;;;;;AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAA;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAE/E,oEAAoE;AACpE,yEAAyE;AACzE,gEAAoC;AACvB,QAAA,SAAS,GACpB,CAAC,SAAS,IAAI,qBAAQ,KAAK,OAAO;IAChC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,CAAA;AAC5B,QAAA,aAAa,GACxB,CAAC,SAAS,IAAI,qBAAQ,KAAK,OAAO;IAChC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,CAAA","sourcesContent":["const version = process.env.__TESTING_RIMRAF_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 14 || (+versArr[0] === 14 && +versArr[1] >= 14)\nimport { RimrafAsyncOptions, RimrafOptions } from './index.js'\n// we do NOT use native by default on Windows, because Node's native\n// rm implementation is less advanced. Change this code if that changes.\nimport platform from './platform.js'\nexport const useNative: (opt?: RimrafAsyncOptions) => boolean =\n !hasNative || platform === 'win32'\n ? () => false\n : opt => !opt?.signal && !opt?.filter\nexport const useNativeSync: (opt?: RimrafOptions) => boolean =\n !hasNative || platform === 'win32'\n ? () => false\n : opt => !opt?.signal && !opt?.filter\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.d.ts new file mode 100644 index 00000000..a68e925b --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.d.ts @@ -0,0 +1,3 @@ +export declare const defaultTmp: (path: string) => Promise; +export declare const defaultTmpSync: (path: string) => string; +//# sourceMappingURL=default-tmp.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.d.ts.map new file mode 100644 index 00000000..d0b35f27 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"default-tmp.d.ts","sourceRoot":"","sources":["../../src/default-tmp.ts"],"names":[],"mappings":"AAiEA,eAAO,MAAM,UAAU,SAnCc,MAAM,oBAoCe,CAAA;AAC1D,eAAO,MAAM,cAAc,SArBQ,MAAM,WAsByB,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.js new file mode 100644 index 00000000..fb0846af --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.js @@ -0,0 +1,55 @@ +// The default temporary folder location for use in the windows algorithm. +// It's TEMPting to use dirname(path), since that's guaranteed to be on the +// same device. However, this means that: +// rimraf(path).then(() => rimraf(dirname(path))) +// will often fail with EBUSY, because the parent dir contains +// marked-for-deletion directory entries (which do not show up in readdir). +// The approach here is to use os.tmpdir() if it's on the same drive letter, +// or resolve(path, '\\temp') if it exists, or the root of the drive if not. +// On Posix (not that you'd be likely to use the windows algorithm there), +// it uses os.tmpdir() always. +import { tmpdir } from 'os'; +import { parse, resolve } from 'path'; +import { promises, statSync } from './fs.js'; +import platform from './platform.js'; +const { stat } = promises; +const isDirSync = (path) => { + try { + return statSync(path).isDirectory(); + } + catch (er) { + return false; + } +}; +const isDir = (path) => stat(path).then(st => st.isDirectory(), () => false); +const win32DefaultTmp = async (path) => { + const { root } = parse(path); + const tmp = tmpdir(); + const { root: tmpRoot } = parse(tmp); + if (root.toLowerCase() === tmpRoot.toLowerCase()) { + return tmp; + } + const driveTmp = resolve(root, '/temp'); + if (await isDir(driveTmp)) { + return driveTmp; + } + return root; +}; +const win32DefaultTmpSync = (path) => { + const { root } = parse(path); + const tmp = tmpdir(); + const { root: tmpRoot } = parse(tmp); + if (root.toLowerCase() === tmpRoot.toLowerCase()) { + return tmp; + } + const driveTmp = resolve(root, '/temp'); + if (isDirSync(driveTmp)) { + return driveTmp; + } + return root; +}; +const posixDefaultTmp = async () => tmpdir(); +const posixDefaultTmpSync = () => tmpdir(); +export const defaultTmp = platform === 'win32' ? win32DefaultTmp : posixDefaultTmp; +export const defaultTmpSync = platform === 'win32' ? win32DefaultTmpSync : posixDefaultTmpSync; +//# sourceMappingURL=default-tmp.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.js.map new file mode 100644 index 00000000..50bf5fc9 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/default-tmp.js.map @@ -0,0 +1 @@ +{"version":3,"file":"default-tmp.js","sourceRoot":"","sources":["../../src/default-tmp.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,2EAA2E;AAC3E,0CAA0C;AAC1C,iDAAiD;AACjD,8DAA8D;AAC9D,2EAA2E;AAC3E,4EAA4E;AAC5E,4EAA4E;AAC5E,0EAA0E;AAC1E,8BAA8B;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAC3B,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC5C,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAA;AAEzB,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;IACjC,IAAI;QACF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;KACpC;IAAC,OAAO,EAAE,EAAE;QACX,OAAO,KAAK,CAAA;KACb;AACH,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7B,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CACb,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,EACtB,GAAG,EAAE,CAAC,KAAK,CACZ,CAAA;AAEH,MAAM,eAAe,GAAG,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACpC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE;QAChD,OAAO,GAAG,CAAA;KACX;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,MAAM,KAAK,CAAC,QAAQ,CAAC,EAAE;QACzB,OAAO,QAAQ,CAAA;KAChB;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,EAAE;IAC3C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;IACpC,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,EAAE;QAChD,OAAO,GAAG,CAAA;KACX;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE;QACvB,OAAO,QAAQ,CAAA;KAChB;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAA;AAC5C,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,MAAM,EAAE,CAAA;AAE1C,MAAM,CAAC,MAAM,UAAU,GACrB,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAAe,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GACzB,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAA","sourcesContent":["// The default temporary folder location for use in the windows algorithm.\n// It's TEMPting to use dirname(path), since that's guaranteed to be on the\n// same device. However, this means that:\n// rimraf(path).then(() => rimraf(dirname(path)))\n// will often fail with EBUSY, because the parent dir contains\n// marked-for-deletion directory entries (which do not show up in readdir).\n// The approach here is to use os.tmpdir() if it's on the same drive letter,\n// or resolve(path, '\\\\temp') if it exists, or the root of the drive if not.\n// On Posix (not that you'd be likely to use the windows algorithm there),\n// it uses os.tmpdir() always.\nimport { tmpdir } from 'os'\nimport { parse, resolve } from 'path'\nimport { promises, statSync } from './fs.js'\nimport platform from './platform.js'\nconst { stat } = promises\n\nconst isDirSync = (path: string) => {\n try {\n return statSync(path).isDirectory()\n } catch (er) {\n return false\n }\n}\n\nconst isDir = (path: string) =>\n stat(path).then(\n st => st.isDirectory(),\n () => false\n )\n\nconst win32DefaultTmp = async (path: string) => {\n const { root } = parse(path)\n const tmp = tmpdir()\n const { root: tmpRoot } = parse(tmp)\n if (root.toLowerCase() === tmpRoot.toLowerCase()) {\n return tmp\n }\n\n const driveTmp = resolve(root, '/temp')\n if (await isDir(driveTmp)) {\n return driveTmp\n }\n\n return root\n}\n\nconst win32DefaultTmpSync = (path: string) => {\n const { root } = parse(path)\n const tmp = tmpdir()\n const { root: tmpRoot } = parse(tmp)\n if (root.toLowerCase() === tmpRoot.toLowerCase()) {\n return tmp\n }\n\n const driveTmp = resolve(root, '/temp')\n if (isDirSync(driveTmp)) {\n return driveTmp\n }\n\n return root\n}\n\nconst posixDefaultTmp = async () => tmpdir()\nconst posixDefaultTmpSync = () => tmpdir()\n\nexport const defaultTmp =\n platform === 'win32' ? win32DefaultTmp : posixDefaultTmp\nexport const defaultTmpSync =\n platform === 'win32' ? win32DefaultTmpSync : posixDefaultTmpSync\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.d.ts new file mode 100644 index 00000000..20e76a82 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.d.ts @@ -0,0 +1,3 @@ +export declare const fixEPERM: (fn: (path: string) => Promise) => (path: string) => Promise; +export declare const fixEPERMSync: (fn: (path: string) => any) => (path: string) => any; +//# sourceMappingURL=fix-eperm.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.d.ts.map new file mode 100644 index 00000000..d4029732 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"fix-eperm.d.ts","sourceRoot":"","sources":["../../src/fix-eperm.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,cACP,MAAM,KAAK,QAAQ,GAAG,CAAC,YAAkB,MAAM,iBAsB1D,CAAA;AAEH,eAAO,MAAM,YAAY,cAAe,MAAM,KAAK,GAAG,YAAY,MAAM,QAsBvE,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.js new file mode 100644 index 00000000..633c0e11 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.js @@ -0,0 +1,53 @@ +import { chmodSync, promises } from './fs.js'; +const { chmod } = promises; +export const fixEPERM = (fn) => async (path) => { + try { + return await fn(path); + } + catch (er) { + const fer = er; + if (fer?.code === 'ENOENT') { + return; + } + if (fer?.code === 'EPERM') { + try { + await chmod(path, 0o666); + } + catch (er2) { + const fer2 = er2; + if (fer2?.code === 'ENOENT') { + return; + } + throw er; + } + return await fn(path); + } + throw er; + } +}; +export const fixEPERMSync = (fn) => (path) => { + try { + return fn(path); + } + catch (er) { + const fer = er; + if (fer?.code === 'ENOENT') { + return; + } + if (fer?.code === 'EPERM') { + try { + chmodSync(path, 0o666); + } + catch (er2) { + const fer2 = er2; + if (fer2?.code === 'ENOENT') { + return; + } + throw er; + } + return fn(path); + } + throw er; + } +}; +//# sourceMappingURL=fix-eperm.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.js.map new file mode 100644 index 00000000..75d838d0 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/fix-eperm.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fix-eperm.js","sourceRoot":"","sources":["../../src/fix-eperm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC7C,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAA;AAE1B,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,EAAkC,EAAE,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;IAC7D,IAAI;QACF,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;KACtB;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE;YAC1B,OAAM;SACP;QACD,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE;YACzB,IAAI;gBACF,MAAM,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;aACzB;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,IAAI,GAAG,GAA4B,CAAA;gBACzC,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE;oBAC3B,OAAM;iBACP;gBACD,MAAM,EAAE,CAAA;aACT;YACD,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;SACtB;QACD,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAyB,EAAE,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE;IAC1E,IAAI;QACF,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;KAChB;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE;YAC1B,OAAM;SACP;QACD,IAAI,GAAG,EAAE,IAAI,KAAK,OAAO,EAAE;YACzB,IAAI;gBACF,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;aACvB;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,IAAI,GAAG,GAA4B,CAAA;gBACzC,IAAI,IAAI,EAAE,IAAI,KAAK,QAAQ,EAAE;oBAC3B,OAAM;iBACP;gBACD,MAAM,EAAE,CAAA;aACT;YACD,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;SAChB;QACD,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA","sourcesContent":["import { chmodSync, promises } from './fs.js'\nconst { chmod } = promises\n\nexport const fixEPERM =\n (fn: (path: string) => Promise) => async (path: string) => {\n try {\n return await fn(path)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer?.code === 'ENOENT') {\n return\n }\n if (fer?.code === 'EPERM') {\n try {\n await chmod(path, 0o666)\n } catch (er2) {\n const fer2 = er2 as NodeJS.ErrnoException\n if (fer2?.code === 'ENOENT') {\n return\n }\n throw er\n }\n return await fn(path)\n }\n throw er\n }\n }\n\nexport const fixEPERMSync = (fn: (path: string) => any) => (path: string) => {\n try {\n return fn(path)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer?.code === 'ENOENT') {\n return\n }\n if (fer?.code === 'EPERM') {\n try {\n chmodSync(path, 0o666)\n } catch (er2) {\n const fer2 = er2 as NodeJS.ErrnoException\n if (fer2?.code === 'ENOENT') {\n return\n }\n throw er\n }\n return fn(path)\n }\n throw er\n }\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.d.ts new file mode 100644 index 00000000..9e4e95b4 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.d.ts @@ -0,0 +1,17 @@ +import fs, { Dirent } from 'fs'; +export { chmodSync, mkdirSync, renameSync, rmdirSync, rmSync, statSync, lstatSync, unlinkSync, } from 'fs'; +export declare const readdirSync: (path: fs.PathLike) => Dirent[]; +export declare const promises: { + chmod: (path: fs.PathLike, mode: fs.Mode) => Promise; + mkdir: (path: fs.PathLike, options?: fs.Mode | (fs.MakeDirectoryOptions & { + recursive?: boolean | null; + }) | undefined | null) => Promise; + readdir: (path: fs.PathLike) => Promise; + rename: (oldPath: fs.PathLike, newPath: fs.PathLike) => Promise; + rm: (path: fs.PathLike, options: fs.RmOptions) => Promise; + rmdir: (path: fs.PathLike) => Promise; + stat: (path: fs.PathLike) => Promise; + lstat: (path: fs.PathLike) => Promise; + unlink: (path: fs.PathLike) => Promise; +}; +//# sourceMappingURL=fs.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.d.ts.map new file mode 100644 index 00000000..da72b88a --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/fs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,IAAI,CAAA;AAG/B,OAAO,EACL,SAAS,EACT,SAAS,EACT,UAAU,EACV,SAAS,EACT,MAAM,EACN,QAAQ,EACR,SAAS,EACT,UAAU,GACX,MAAM,IAAI,CAAA;AAGX,eAAO,MAAM,WAAW,SAAU,GAAG,QAAQ,KAAG,MAAM,EACf,CAAA;AA6DvC,eAAO,MAAM,QAAQ;kBAtDA,GAAG,QAAQ,QAAQ,GAAG,IAAI,KAAG,QAAQ,IAAI,CAAC;kBAMvD,GAAG,QAAQ,YAEb,GAAG,IAAI,GACP,CAAC,GAAG,oBAAoB,GAAG;QAAE,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,CAAA;KAAE,CAAC,GAC1D,SAAS,GACT,IAAI,KACP,QAAQ,MAAM,GAAG,SAAS,CAAC;oBAKP,GAAG,QAAQ,KAAG,QAAQ,MAAM,EAAE,CAAC;sBAO7B,GAAG,QAAQ,WAAW,GAAG,QAAQ,KAAG,QAAQ,IAAI,CAAC;eAKxD,GAAG,QAAQ,WAAW,GAAG,SAAS,KAAG,QAAQ,IAAI,CAAC;kBAK/C,GAAG,QAAQ,KAAG,QAAQ,IAAI,CAAC;iBAK5B,GAAG,QAAQ,KAAG,QAAQ,GAAG,KAAK,CAAC;kBAK9B,GAAG,QAAQ,KAAG,QAAQ,GAAG,KAAK,CAAC;mBAK9B,GAAG,QAAQ,KAAG,QAAQ,IAAI,CAAC;CAehD,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.js new file mode 100644 index 00000000..7df28cdd --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.js @@ -0,0 +1,31 @@ +// promisify ourselves, because older nodes don't have fs.promises +import fs from 'fs'; +// sync ones just take the sync version from node +export { chmodSync, mkdirSync, renameSync, rmdirSync, rmSync, statSync, lstatSync, unlinkSync, } from 'fs'; +import { readdirSync as rdSync } from 'fs'; +export const readdirSync = (path) => rdSync(path, { withFileTypes: true }); +// unrolled for better inlining, this seems to get better performance +// than something like: +// const makeCb = (res, rej) => (er, ...d) => er ? rej(er) : res(...d) +// which would be a bit cleaner. +const chmod = (path, mode) => new Promise((res, rej) => fs.chmod(path, mode, (er, ...d) => (er ? rej(er) : res(...d)))); +const mkdir = (path, options) => new Promise((res, rej) => fs.mkdir(path, options, (er, made) => (er ? rej(er) : res(made)))); +const readdir = (path) => new Promise((res, rej) => fs.readdir(path, { withFileTypes: true }, (er, data) => er ? rej(er) : res(data))); +const rename = (oldPath, newPath) => new Promise((res, rej) => fs.rename(oldPath, newPath, (er, ...d) => (er ? rej(er) : res(...d)))); +const rm = (path, options) => new Promise((res, rej) => fs.rm(path, options, (er, ...d) => (er ? rej(er) : res(...d)))); +const rmdir = (path) => new Promise((res, rej) => fs.rmdir(path, (er, ...d) => (er ? rej(er) : res(...d)))); +const stat = (path) => new Promise((res, rej) => fs.stat(path, (er, data) => (er ? rej(er) : res(data)))); +const lstat = (path) => new Promise((res, rej) => fs.lstat(path, (er, data) => (er ? rej(er) : res(data)))); +const unlink = (path) => new Promise((res, rej) => fs.unlink(path, (er, ...d) => (er ? rej(er) : res(...d)))); +export const promises = { + chmod, + mkdir, + readdir, + rename, + rm, + rmdir, + stat, + lstat, + unlink, +}; +//# sourceMappingURL=fs.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.js.map new file mode 100644 index 00000000..89504b4f --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/fs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/fs.ts"],"names":[],"mappings":"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","sourcesContent":["// promisify ourselves, because older nodes don't have fs.promises\n\nimport fs, { Dirent } from 'fs'\n\n// sync ones just take the sync version from node\nexport {\n chmodSync,\n mkdirSync,\n renameSync,\n rmdirSync,\n rmSync,\n statSync,\n lstatSync,\n unlinkSync,\n} from 'fs'\n\nimport { readdirSync as rdSync } from 'fs'\nexport const readdirSync = (path: fs.PathLike): Dirent[] =>\n rdSync(path, { withFileTypes: true })\n\n// unrolled for better inlining, this seems to get better performance\n// than something like:\n// const makeCb = (res, rej) => (er, ...d) => er ? rej(er) : res(...d)\n// which would be a bit cleaner.\n\nconst chmod = (path: fs.PathLike, mode: fs.Mode): Promise =>\n new Promise((res, rej) =>\n fs.chmod(path, mode, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nconst mkdir = (\n path: fs.PathLike,\n options?:\n | fs.Mode\n | (fs.MakeDirectoryOptions & { recursive?: boolean | null })\n | undefined\n | null\n): Promise =>\n new Promise((res, rej) =>\n fs.mkdir(path, options, (er, made) => (er ? rej(er) : res(made)))\n )\n\nconst readdir = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.readdir(path, { withFileTypes: true }, (er, data) =>\n er ? rej(er) : res(data)\n )\n )\n\nconst rename = (oldPath: fs.PathLike, newPath: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.rename(oldPath, newPath, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nconst rm = (path: fs.PathLike, options: fs.RmOptions): Promise =>\n new Promise((res, rej) =>\n fs.rm(path, options, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nconst rmdir = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.rmdir(path, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nconst stat = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.stat(path, (er, data) => (er ? rej(er) : res(data)))\n )\n\nconst lstat = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.lstat(path, (er, data) => (er ? rej(er) : res(data)))\n )\n\nconst unlink = (path: fs.PathLike): Promise =>\n new Promise((res, rej) =>\n fs.unlink(path, (er, ...d: any[]) => (er ? rej(er) : res(...d)))\n )\n\nexport const promises = {\n chmod,\n mkdir,\n readdir,\n rename,\n rm,\n rmdir,\n stat,\n lstat,\n unlink,\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts new file mode 100644 index 00000000..f158cc27 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts @@ -0,0 +1,3 @@ +export declare const ignoreENOENT: (p: Promise) => Promise; +export declare const ignoreENOENTSync: (fn: () => any) => any; +//# sourceMappingURL=ignore-enoent.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts.map new file mode 100644 index 00000000..e3f6d4e0 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"ignore-enoent.d.ts","sourceRoot":"","sources":["../../src/ignore-enoent.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,MAAa,QAAQ,GAAG,CAAC,iBAK9C,CAAA;AAEJ,eAAO,MAAM,gBAAgB,OAAQ,MAAM,GAAG,QAQ7C,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.js new file mode 100644 index 00000000..753f4811 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.js @@ -0,0 +1,16 @@ +export const ignoreENOENT = async (p) => p.catch(er => { + if (er.code !== 'ENOENT') { + throw er; + } +}); +export const ignoreENOENTSync = (fn) => { + try { + return fn(); + } + catch (er) { + if (er?.code !== 'ENOENT') { + throw er; + } + } +}; +//# sourceMappingURL=ignore-enoent.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.js.map new file mode 100644 index 00000000..469ccafe --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/ignore-enoent.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ignore-enoent.js","sourceRoot":"","sources":["../../src/ignore-enoent.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,CAAe,EAAE,EAAE,CACpD,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;IACX,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,EAAE;QACxB,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAa,EAAE,EAAE;IAChD,IAAI;QACF,OAAO,EAAE,EAAE,CAAA;KACZ;IAAC,OAAO,EAAE,EAAE;QACX,IAAK,EAA4B,EAAE,IAAI,KAAK,QAAQ,EAAE;YACpD,MAAM,EAAE,CAAA;SACT;KACF;AACH,CAAC,CAAA","sourcesContent":["export const ignoreENOENT = async (p: Promise) =>\n p.catch(er => {\n if (er.code !== 'ENOENT') {\n throw er\n }\n })\n\nexport const ignoreENOENTSync = (fn: () => any) => {\n try {\n return fn()\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code !== 'ENOENT') {\n throw er\n }\n }\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/index.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/index.d.ts new file mode 100644 index 00000000..2b659f29 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/index.d.ts @@ -0,0 +1,71 @@ +/// +import { GlobOptions } from 'glob'; +export interface RimrafAsyncOptions { + preserveRoot?: boolean; + tmp?: string; + maxRetries?: number; + retryDelay?: number; + backoff?: number; + maxBackoff?: number; + signal?: AbortSignal; + glob?: boolean | GlobOptions; + filter?: ((path: string, ent: Dirent | Stats) => boolean) | ((path: string, ent: Dirent | Stats) => Promise); +} +export interface RimrafSyncOptions extends RimrafAsyncOptions { + filter?: (path: string, ent: Dirent | Stats) => boolean; +} +export type RimrafOptions = RimrafSyncOptions | RimrafAsyncOptions; +export declare const isRimrafOptions: (o: any) => o is RimrafOptions; +export declare const assertRimrafOptions: (o: any) => void; +import { Dirent, Stats } from 'fs'; +export declare const nativeSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const native: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const manualSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const manual: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const windowsSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const windows: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const posixSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const posix: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const moveRemoveSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const moveRemove: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export declare const rimrafSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +export declare const rimraf: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + rimraf: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + rimrafSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + manual: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + manualSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + native: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + nativeSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + posix: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + posixSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + windows: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + windowsSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + moveRemove: ((path: string | string[], opt?: RimrafAsyncOptions) => Promise) & { + sync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; + }; + moveRemoveSync: (path: string | string[], opt?: RimrafSyncOptions) => boolean; +}; +export default rimraf; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/index.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/index.d.ts.map new file mode 100644 index 00000000..2463e9b2 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/index.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/index.js new file mode 100644 index 00000000..339b912c --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/index.js @@ -0,0 +1,84 @@ +import { optArg, optArgSync } from './opt-arg.js'; +import pathArg from './path-arg.js'; +import { glob, globSync } from 'glob'; +const typeOrUndef = (val, t) => typeof val === 'undefined' || typeof val === t; +export const isRimrafOptions = (o) => !!o && + typeof o === 'object' && + typeOrUndef(o.preserveRoot, 'boolean') && + typeOrUndef(o.tmp, 'string') && + typeOrUndef(o.maxRetries, 'number') && + typeOrUndef(o.retryDelay, 'number') && + typeOrUndef(o.backoff, 'number') && + typeOrUndef(o.maxBackoff, 'number') && + (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) && + typeOrUndef(o.filter, 'function'); +export const assertRimrafOptions = (o) => { + if (!isRimrafOptions(o)) { + throw new Error('invalid rimraf options'); + } +}; +import { rimrafManual, rimrafManualSync } from './rimraf-manual.js'; +import { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js'; +import { rimrafNative, rimrafNativeSync } from './rimraf-native.js'; +import { rimrafPosix, rimrafPosixSync } from './rimraf-posix.js'; +import { rimrafWindows, rimrafWindowsSync } from './rimraf-windows.js'; +import { useNative, useNativeSync } from './use-native.js'; +const wrap = (fn) => async (path, opt) => { + const options = optArg(opt); + if (options.glob) { + path = await glob(path, options.glob); + } + if (Array.isArray(path)) { + return !!(await Promise.all(path.map(p => fn(pathArg(p, options), options)))).reduce((a, b) => a && b, true); + } + else { + return !!(await fn(pathArg(path, options), options)); + } +}; +const wrapSync = (fn) => (path, opt) => { + const options = optArgSync(opt); + if (options.glob) { + path = globSync(path, options.glob); + } + if (Array.isArray(path)) { + return !!path + .map(p => fn(pathArg(p, options), options)) + .reduce((a, b) => a && b, true); + } + else { + return !!fn(pathArg(path, options), options); + } +}; +export const nativeSync = wrapSync(rimrafNativeSync); +export const native = Object.assign(wrap(rimrafNative), { sync: nativeSync }); +export const manualSync = wrapSync(rimrafManualSync); +export const manual = Object.assign(wrap(rimrafManual), { sync: manualSync }); +export const windowsSync = wrapSync(rimrafWindowsSync); +export const windows = Object.assign(wrap(rimrafWindows), { sync: windowsSync }); +export const posixSync = wrapSync(rimrafPosixSync); +export const posix = Object.assign(wrap(rimrafPosix), { sync: posixSync }); +export const moveRemoveSync = wrapSync(rimrafMoveRemoveSync); +export const moveRemove = Object.assign(wrap(rimrafMoveRemove), { + sync: moveRemoveSync, +}); +export const rimrafSync = wrapSync((path, opt) => useNativeSync(opt) ? rimrafNativeSync(path, opt) : rimrafManualSync(path, opt)); +export const sync = rimrafSync; +export const rimraf = Object.assign(wrap((path, opt) => useNative(opt) ? rimrafNative(path, opt) : rimrafManual(path, opt)), { + // this weirdness because it's easier than explicitly declaring + rimraf: manual, + sync: rimrafSync, + rimrafSync: rimrafSync, + manual, + manualSync, + native, + nativeSync, + posix, + posixSync, + windows, + windowsSync, + moveRemove, + moveRemoveSync, +}); +rimraf.rimraf = rimraf; +export default rimraf; +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/index.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/index.js.map new file mode 100644 index 00000000..e5b6a8e3 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { optArg, optArgSync } from './opt-arg.js'\nimport pathArg from './path-arg.js'\n\nimport { glob, GlobOptions, globSync } from 'glob'\n\nexport interface RimrafAsyncOptions {\n preserveRoot?: boolean\n tmp?: string\n maxRetries?: number\n retryDelay?: number\n backoff?: number\n maxBackoff?: number\n signal?: AbortSignal\n glob?: boolean | GlobOptions\n filter?:\n | ((path: string, ent: Dirent | Stats) => boolean)\n | ((path: string, ent: Dirent | Stats) => Promise)\n}\n\nexport interface RimrafSyncOptions extends RimrafAsyncOptions {\n filter?: (path: string, ent: Dirent | Stats) => boolean\n}\n\nexport type RimrafOptions = RimrafSyncOptions | RimrafAsyncOptions\n\nconst typeOrUndef = (val: any, t: string) =>\n typeof val === 'undefined' || typeof val === t\n\nexport const isRimrafOptions = (o: any): o is RimrafOptions =>\n !!o &&\n typeof o === 'object' &&\n typeOrUndef(o.preserveRoot, 'boolean') &&\n typeOrUndef(o.tmp, 'string') &&\n typeOrUndef(o.maxRetries, 'number') &&\n typeOrUndef(o.retryDelay, 'number') &&\n typeOrUndef(o.backoff, 'number') &&\n typeOrUndef(o.maxBackoff, 'number') &&\n (typeOrUndef(o.glob, 'boolean') || (o.glob && typeof o.glob === 'object')) &&\n typeOrUndef(o.filter, 'function')\n\nexport const assertRimrafOptions: (o: any) => void = (\n o: any\n): asserts o is RimrafOptions => {\n if (!isRimrafOptions(o)) {\n throw new Error('invalid rimraf options')\n }\n}\n\nimport { Dirent, Stats } from 'fs'\nimport { rimrafManual, rimrafManualSync } from './rimraf-manual.js'\nimport { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js'\nimport { rimrafNative, rimrafNativeSync } from './rimraf-native.js'\nimport { rimrafPosix, rimrafPosixSync } from './rimraf-posix.js'\nimport { rimrafWindows, rimrafWindowsSync } from './rimraf-windows.js'\nimport { useNative, useNativeSync } from './use-native.js'\n\nconst wrap =\n (fn: (p: string, o: RimrafAsyncOptions) => Promise) =>\n async (\n path: string | string[],\n opt?: RimrafAsyncOptions\n ): Promise => {\n const options = optArg(opt)\n if (options.glob) {\n path = await glob(path, options.glob)\n }\n if (Array.isArray(path)) {\n return !!(\n await Promise.all(path.map(p => fn(pathArg(p, options), options)))\n ).reduce((a, b) => a && b, true)\n } else {\n return !!(await fn(pathArg(path, options), options))\n }\n }\n\nconst wrapSync =\n (fn: (p: string, o: RimrafSyncOptions) => boolean) =>\n (path: string | string[], opt?: RimrafSyncOptions): boolean => {\n const options = optArgSync(opt)\n if (options.glob) {\n path = globSync(path, options.glob)\n }\n if (Array.isArray(path)) {\n return !!path\n .map(p => fn(pathArg(p, options), options))\n .reduce((a, b) => a && b, true)\n } else {\n return !!fn(pathArg(path, options), options)\n }\n }\n\nexport const nativeSync = wrapSync(rimrafNativeSync)\nexport const native = Object.assign(wrap(rimrafNative), { sync: nativeSync })\n\nexport const manualSync = wrapSync(rimrafManualSync)\nexport const manual = Object.assign(wrap(rimrafManual), { sync: manualSync })\n\nexport const windowsSync = wrapSync(rimrafWindowsSync)\nexport const windows = Object.assign(wrap(rimrafWindows), { sync: windowsSync })\n\nexport const posixSync = wrapSync(rimrafPosixSync)\nexport const posix = Object.assign(wrap(rimrafPosix), { sync: posixSync })\n\nexport const moveRemoveSync = wrapSync(rimrafMoveRemoveSync)\nexport const moveRemove = Object.assign(wrap(rimrafMoveRemove), {\n sync: moveRemoveSync,\n})\n\nexport const rimrafSync = wrapSync((path, opt) =>\n useNativeSync(opt) ? rimrafNativeSync(path, opt) : rimrafManualSync(path, opt)\n)\nexport const sync = rimrafSync\n\nexport const rimraf = Object.assign(\n wrap((path, opt) =>\n useNative(opt) ? rimrafNative(path, opt) : rimrafManual(path, opt)\n ),\n {\n // this weirdness because it's easier than explicitly declaring\n rimraf: manual,\n sync: rimrafSync,\n rimrafSync: rimrafSync,\n manual,\n manualSync,\n native,\n nativeSync,\n posix,\n posixSync,\n windows,\n windowsSync,\n moveRemove,\n moveRemoveSync,\n }\n)\nrimraf.rimraf = rimraf\n\nexport default rimraf\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.d.ts new file mode 100644 index 00000000..220b6417 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.d.ts @@ -0,0 +1,17 @@ +import { GlobOptions } from 'glob'; +import { RimrafAsyncOptions, RimrafSyncOptions } from './index.js'; +export declare const optArg: (opt?: RimrafAsyncOptions) => (RimrafAsyncOptions & { + glob: GlobOptions & { + withFileTypes: false; + }; +}) | (RimrafAsyncOptions & { + glob: undefined; +}); +export declare const optArgSync: (opt?: RimrafSyncOptions) => (RimrafSyncOptions & { + glob: GlobOptions & { + withFileTypes: false; + }; +}) | (RimrafSyncOptions & { + glob: undefined; +}); +//# sourceMappingURL=opt-arg.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.d.ts.map new file mode 100644 index 00000000..da4c98b5 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"opt-arg.d.ts","sourceRoot":"","sources":["../../src/opt-arg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAClC,OAAO,EAEL,kBAAkB,EAElB,iBAAiB,EAClB,MAAM,YAAY,CAAA;AAqCnB,eAAO,MAAM,MAAM,SAAS,kBAAkB;UA/BlC,WAAW,GAAG;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE;;UAEjC,SAAS;EA6B0C,CAAA;AACpE,eAAO,MAAM,UAAU,SAAS,iBAAiB;UAhCrC,WAAW,GAAG;QAAE,aAAa,EAAE,KAAK,CAAA;KAAE;;UAEjC,SAAS;EA8B6C,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.js new file mode 100644 index 00000000..1eb63129 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.js @@ -0,0 +1,31 @@ +import { assertRimrafOptions, } from './index.js'; +const optArgT = (opt) => { + assertRimrafOptions(opt); + const { glob, ...options } = opt; + if (!glob) { + return options; + } + const globOpt = glob === true + ? opt.signal + ? { signal: opt.signal } + : {} + : opt.signal + ? { + signal: opt.signal, + ...glob, + } + : glob; + return { + ...options, + glob: { + ...globOpt, + // always get absolute paths from glob, to ensure + // that we are referencing the correct thing. + absolute: true, + withFileTypes: false, + }, + }; +}; +export const optArg = (opt = {}) => optArgT(opt); +export const optArgSync = (opt = {}) => optArgT(opt); +//# sourceMappingURL=opt-arg.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.js.map new file mode 100644 index 00000000..910c201d --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/opt-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"opt-arg.js","sourceRoot":"","sources":["../../src/opt-arg.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,GAIpB,MAAM,YAAY,CAAA;AAEnB,MAAM,OAAO,GAAG,CACd,GAAM,EAKsB,EAAE;IAC9B,mBAAmB,CAAC,GAAG,CAAC,CAAA;IACxB,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAA;IAChC,IAAI,CAAC,IAAI,EAAE;QACT,OAAO,OAAkC,CAAA;KAC1C;IACD,MAAM,OAAO,GACX,IAAI,KAAK,IAAI;QACX,CAAC,CAAC,GAAG,CAAC,MAAM;YACV,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;YACxB,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,GAAG,CAAC,MAAM;YACZ,CAAC,CAAC;gBACE,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,GAAG,IAAI;aACR;YACH,CAAC,CAAC,IAAI,CAAA;IACV,OAAO;QACL,GAAG,OAAO;QACV,IAAI,EAAE;YACJ,GAAG,OAAO;YACV,iDAAiD;YACjD,6CAA6C;YAC7C,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,KAAK;SACrB;KACsD,CAAA;AAC3D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAA0B,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAyB,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA","sourcesContent":["import { GlobOptions } from 'glob'\nimport {\n assertRimrafOptions,\n RimrafAsyncOptions,\n RimrafOptions,\n RimrafSyncOptions,\n} from './index.js'\n\nconst optArgT = (\n opt: T\n):\n | (T & {\n glob: GlobOptions & { withFileTypes: false }\n })\n | (T & { glob: undefined }) => {\n assertRimrafOptions(opt)\n const { glob, ...options } = opt\n if (!glob) {\n return options as T & { glob: undefined }\n }\n const globOpt =\n glob === true\n ? opt.signal\n ? { signal: opt.signal }\n : {}\n : opt.signal\n ? {\n signal: opt.signal,\n ...glob,\n }\n : glob\n return {\n ...options,\n glob: {\n ...globOpt,\n // always get absolute paths from glob, to ensure\n // that we are referencing the correct thing.\n absolute: true,\n withFileTypes: false,\n },\n } as T & { glob: GlobOptions & { withFileTypes: false } }\n}\n\nexport const optArg = (opt: RimrafAsyncOptions = {}) => optArgT(opt)\nexport const optArgSync = (opt: RimrafSyncOptions = {}) => optArgT(opt)\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/package.json b/@capacitor/assets/node_modules/rimraf/dist/mjs/package.json new file mode 100644 index 00000000..106cd7fb --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/package.json @@ -0,0 +1,4 @@ +{ + "version": "4.4.0", + "type": "module" +} diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.d.ts new file mode 100644 index 00000000..c0b7e7cb --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions } from './index.js'; +declare const pathArg: (path: string, opt?: RimrafAsyncOptions) => string; +export default pathArg; +//# sourceMappingURL=path-arg.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.d.ts.map new file mode 100644 index 00000000..86aaf3d7 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.d.ts","sourceRoot":"","sources":["../../src/path-arg.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAG/C,QAAA,MAAM,OAAO,SAAU,MAAM,QAAO,kBAAkB,WAkDrD,CAAA;AAED,eAAe,OAAO,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.js new file mode 100644 index 00000000..a8da8852 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.js @@ -0,0 +1,49 @@ +import { parse, resolve } from 'path'; +import { inspect } from 'util'; +import platform from './platform.js'; +const pathArg = (path, opt = {}) => { + const type = typeof path; + if (type !== 'string') { + const ctor = path && type === 'object' && path.constructor; + const received = ctor && ctor.name + ? `an instance of ${ctor.name}` + : type === 'object' + ? inspect(path) + : `type ${type} ${path}`; + const msg = 'The "path" argument must be of type string. ' + `Received ${received}`; + throw Object.assign(new TypeError(msg), { + path, + code: 'ERR_INVALID_ARG_TYPE', + }); + } + if (/\0/.test(path)) { + // simulate same failure that node raises + const msg = 'path must be a string without null bytes'; + throw Object.assign(new TypeError(msg), { + path, + code: 'ERR_INVALID_ARG_VALUE', + }); + } + path = resolve(path); + const { root } = parse(path); + if (path === root && opt.preserveRoot !== false) { + const msg = 'refusing to remove root directory without preserveRoot:false'; + throw Object.assign(new Error(msg), { + path, + code: 'ERR_PRESERVE_ROOT', + }); + } + if (platform === 'win32') { + const badWinChars = /[*|"<>?:]/; + const { root } = parse(path); + if (badWinChars.test(path.substring(root.length))) { + throw Object.assign(new Error('Illegal characters in path.'), { + path, + code: 'EINVAL', + }); + } + } + return path; +}; +export default pathArg; +//# sourceMappingURL=path-arg.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.js.map new file mode 100644 index 00000000..3b0f3e62 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/path-arg.js.map @@ -0,0 +1 @@ +{"version":3,"file":"path-arg.js","sourceRoot":"","sources":["../../src/path-arg.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAE9B,OAAO,QAAQ,MAAM,eAAe,CAAA;AAEpC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAA0B,EAAE,EAAE,EAAE;IAC7D,MAAM,IAAI,GAAG,OAAO,IAAI,CAAA;IACxB,IAAI,IAAI,KAAK,QAAQ,EAAE;QACrB,MAAM,IAAI,GAAG,IAAI,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAA;QAC1D,MAAM,QAAQ,GACZ,IAAI,IAAI,IAAI,CAAC,IAAI;YACf,CAAC,CAAC,kBAAkB,IAAI,CAAC,IAAI,EAAE;YAC/B,CAAC,CAAC,IAAI,KAAK,QAAQ;gBACnB,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;gBACf,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,EAAE,CAAA;QAC5B,MAAM,GAAG,GACP,8CAA8C,GAAG,YAAY,QAAQ,EAAE,CAAA;QACzE,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE;YACtC,IAAI;YACJ,IAAI,EAAE,sBAAsB;SAC7B,CAAC,CAAA;KACH;IAED,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACnB,yCAAyC;QACzC,MAAM,GAAG,GAAG,0CAA0C,CAAA;QACtD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE;YACtC,IAAI;YACJ,IAAI,EAAE,uBAAuB;SAC9B,CAAC,CAAA;KACH;IAED,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACpB,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;IAE5B,IAAI,IAAI,KAAK,IAAI,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK,EAAE;QAC/C,MAAM,GAAG,GAAG,8DAA8D,CAAA;QAC1E,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE;YAClC,IAAI;YACJ,IAAI,EAAE,mBAAmB;SAC1B,CAAC,CAAA;KACH;IAED,IAAI,QAAQ,KAAK,OAAO,EAAE;QACxB,MAAM,WAAW,GAAG,WAAW,CAAA;QAC/B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE;YACjD,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,EAAE;gBAC5D,IAAI;gBACJ,IAAI,EAAE,QAAQ;aACf,CAAC,CAAA;SACH;KACF;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,eAAe,OAAO,CAAA","sourcesContent":["import { parse, resolve } from 'path'\nimport { inspect } from 'util'\nimport { RimrafAsyncOptions } from './index.js'\nimport platform from './platform.js'\n\nconst pathArg = (path: string, opt: RimrafAsyncOptions = {}) => {\n const type = typeof path\n if (type !== 'string') {\n const ctor = path && type === 'object' && path.constructor\n const received =\n ctor && ctor.name\n ? `an instance of ${ctor.name}`\n : type === 'object'\n ? inspect(path)\n : `type ${type} ${path}`\n const msg =\n 'The \"path\" argument must be of type string. ' + `Received ${received}`\n throw Object.assign(new TypeError(msg), {\n path,\n code: 'ERR_INVALID_ARG_TYPE',\n })\n }\n\n if (/\\0/.test(path)) {\n // simulate same failure that node raises\n const msg = 'path must be a string without null bytes'\n throw Object.assign(new TypeError(msg), {\n path,\n code: 'ERR_INVALID_ARG_VALUE',\n })\n }\n\n path = resolve(path)\n const { root } = parse(path)\n\n if (path === root && opt.preserveRoot !== false) {\n const msg = 'refusing to remove root directory without preserveRoot:false'\n throw Object.assign(new Error(msg), {\n path,\n code: 'ERR_PRESERVE_ROOT',\n })\n }\n\n if (platform === 'win32') {\n const badWinChars = /[*|\"<>?:]/\n const { root } = parse(path)\n if (badWinChars.test(path.substring(root.length))) {\n throw Object.assign(new Error('Illegal characters in path.'), {\n path,\n code: 'EINVAL',\n })\n }\n }\n\n return path\n}\n\nexport default pathArg\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.d.ts new file mode 100644 index 00000000..e127a8e5 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.d.ts @@ -0,0 +1,3 @@ +declare const _default: string; +export default _default; +//# sourceMappingURL=platform.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.d.ts.map new file mode 100644 index 00000000..ef2e6734 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":";AAAA,wBAA0E"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.js new file mode 100644 index 00000000..a2641721 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.js @@ -0,0 +1,2 @@ +export default process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform; +//# sourceMappingURL=platform.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.js.map new file mode 100644 index 00000000..c5fdaf9c --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/platform.js.map @@ -0,0 +1 @@ +{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/platform.ts"],"names":[],"mappings":"AAAA,eAAe,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,QAAQ,CAAA","sourcesContent":["export default process.env.__TESTING_RIMRAF_PLATFORM__ || process.platform\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts new file mode 100644 index 00000000..8b7d6c91 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts @@ -0,0 +1,5 @@ +/// +/// +export declare const readdirOrError: (path: string) => Promise; +export declare const readdirOrErrorSync: (path: string) => import("fs").Dirent[] | NodeJS.ErrnoException; +//# sourceMappingURL=readdir-or-error.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts.map new file mode 100644 index 00000000..d239053a --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"readdir-or-error.d.ts","sourceRoot":"","sources":["../../src/readdir-or-error.ts"],"names":[],"mappings":";;AAIA,eAAO,MAAM,cAAc,SAAU,MAAM,2DACa,CAAA;AACxD,eAAO,MAAM,kBAAkB,SAAU,MAAM,kDAM9C,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.js new file mode 100644 index 00000000..71235135 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.js @@ -0,0 +1,14 @@ +// returns an array of entries if readdir() works, +// or the error that readdir() raised if not. +import { promises, readdirSync } from './fs.js'; +const { readdir } = promises; +export const readdirOrError = (path) => readdir(path).catch(er => er); +export const readdirOrErrorSync = (path) => { + try { + return readdirSync(path); + } + catch (er) { + return er; + } +}; +//# sourceMappingURL=readdir-or-error.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.js.map new file mode 100644 index 00000000..9523487e --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/readdir-or-error.js.map @@ -0,0 +1 @@ +{"version":3,"file":"readdir-or-error.js","sourceRoot":"","sources":["../../src/readdir-or-error.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,6CAA6C;AAC7C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAA;AAC5B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAE,EAAE,CAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAA2B,CAAC,CAAA;AACxD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAE,EAAE;IACjD,IAAI;QACF,OAAO,WAAW,CAAC,IAAI,CAAC,CAAA;KACzB;IAAC,OAAO,EAAE,EAAE;QACX,OAAO,EAA2B,CAAA;KACnC;AACH,CAAC,CAAA","sourcesContent":["// returns an array of entries if readdir() works,\n// or the error that readdir() raised if not.\nimport { promises, readdirSync } from './fs.js'\nconst { readdir } = promises\nexport const readdirOrError = (path: string) =>\n readdir(path).catch(er => er as NodeJS.ErrnoException)\nexport const readdirOrErrorSync = (path: string) => {\n try {\n return readdirSync(path)\n } catch (er) {\n return er as NodeJS.ErrnoException\n }\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.d.ts new file mode 100644 index 00000000..8df88e9b --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.d.ts @@ -0,0 +1,8 @@ +import { RimrafAsyncOptions, RimrafOptions } from '.'; +export declare const MAXBACKOFF = 200; +export declare const RATE = 1.2; +export declare const MAXRETRIES = 10; +export declare const codes: Set; +export declare const retryBusy: (fn: (path: string) => Promise) => (path: string, opt: RimrafAsyncOptions, backoff?: number, total?: number) => Promise; +export declare const retryBusySync: (fn: (path: string) => any) => (path: string, opt: RimrafOptions) => any; +//# sourceMappingURL=retry-busy.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.d.ts.map new file mode 100644 index 00000000..bf974f68 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"retry-busy.d.ts","sourceRoot":"","sources":["../../src/retry-busy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,GAAG,CAAA;AAErD,eAAO,MAAM,UAAU,MAAM,CAAA;AAC7B,eAAO,MAAM,IAAI,MAAM,CAAA;AACvB,eAAO,MAAM,UAAU,KAAK,CAAA;AAC5B,eAAO,MAAM,KAAK,aAAyC,CAAA;AAE3D,eAAO,MAAM,SAAS,cAAe,MAAM,KAAK,QAAQ,GAAG,CAAC,YAElD,MAAM,OACP,kBAAkB,mDAkC1B,CAAA;AAGD,eAAO,MAAM,aAAa,cAAe,MAAM,KAAK,GAAG,YAC/B,MAAM,OAAO,aAAa,QAsBjD,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.js new file mode 100644 index 00000000..17e336a4 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.js @@ -0,0 +1,63 @@ +// note: max backoff is the maximum that any *single* backoff will do +export const MAXBACKOFF = 200; +export const RATE = 1.2; +export const MAXRETRIES = 10; +export const codes = new Set(['EMFILE', 'ENFILE', 'EBUSY']); +export const retryBusy = (fn) => { + const method = async (path, opt, backoff = 1, total = 0) => { + const mbo = opt.maxBackoff || MAXBACKOFF; + const rate = opt.backoff || RATE; + const max = opt.maxRetries || MAXRETRIES; + let retries = 0; + while (true) { + try { + return await fn(path); + } + catch (er) { + const fer = er; + if (fer?.path === path && fer?.code && codes.has(fer.code)) { + backoff = Math.ceil(backoff * rate); + total = backoff + total; + if (total < mbo) { + return new Promise((res, rej) => { + setTimeout(() => { + method(path, opt, backoff, total).then(res, rej); + }, backoff); + }); + } + if (retries < max) { + retries++; + continue; + } + } + throw er; + } + } + }; + return method; +}; +// just retries, no async so no backoff +export const retryBusySync = (fn) => { + const method = (path, opt) => { + const max = opt.maxRetries || MAXRETRIES; + let retries = 0; + while (true) { + try { + return fn(path); + } + catch (er) { + const fer = er; + if (fer?.path === path && + fer?.code && + codes.has(fer.code) && + retries < max) { + retries++; + continue; + } + throw er; + } + } + }; + return method; +}; +//# sourceMappingURL=retry-busy.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.js.map new file mode 100644 index 00000000..ead22bcd --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/retry-busy.js.map @@ -0,0 +1 @@ +{"version":3,"file":"retry-busy.js","sourceRoot":"","sources":["../../src/retry-busy.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAIrE,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAA;AAC7B,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAA;AACvB,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,CAAA;AAC5B,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;AAE3D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,EAAkC,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,KAAK,EAClB,IAAY,EACZ,GAAuB,EACvB,OAAO,GAAG,CAAC,EACX,KAAK,GAAG,CAAC,EACT,EAAE;QACF,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,UAAU,CAAA;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,IAAI,IAAI,CAAA;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,UAAU,CAAA;QACxC,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE;YACX,IAAI;gBACF,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAA;aACtB;YAAC,OAAO,EAAE,EAAE;gBACX,MAAM,GAAG,GAAG,EAA2B,CAAA;gBACvC,IAAI,GAAG,EAAE,IAAI,KAAK,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBAC1D,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;oBACnC,KAAK,GAAG,OAAO,GAAG,KAAK,CAAA;oBACvB,IAAI,KAAK,GAAG,GAAG,EAAE;wBACf,OAAO,IAAI,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;4BAC9B,UAAU,CAAC,GAAG,EAAE;gCACd,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;4BAClD,CAAC,EAAE,OAAO,CAAC,CAAA;wBACb,CAAC,CAAC,CAAA;qBACH;oBACD,IAAI,OAAO,GAAG,GAAG,EAAE;wBACjB,OAAO,EAAE,CAAA;wBACT,SAAQ;qBACT;iBACF;gBACD,MAAM,EAAE,CAAA;aACT;SACF;IACH,CAAC,CAAA;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,uCAAuC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAyB,EAAE,EAAE;IACzD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,GAAkB,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,IAAI,UAAU,CAAA;QACxC,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE;YACX,IAAI;gBACF,OAAO,EAAE,CAAC,IAAI,CAAC,CAAA;aAChB;YAAC,OAAO,EAAE,EAAE;gBACX,MAAM,GAAG,GAAG,EAA2B,CAAA;gBACvC,IACE,GAAG,EAAE,IAAI,KAAK,IAAI;oBAClB,GAAG,EAAE,IAAI;oBACT,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;oBACnB,OAAO,GAAG,GAAG,EACb;oBACA,OAAO,EAAE,CAAA;oBACT,SAAQ;iBACT;gBACD,MAAM,EAAE,CAAA;aACT;SACF;IACH,CAAC,CAAA;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA","sourcesContent":["// note: max backoff is the maximum that any *single* backoff will do\n\nimport { RimrafAsyncOptions, RimrafOptions } from '.'\n\nexport const MAXBACKOFF = 200\nexport const RATE = 1.2\nexport const MAXRETRIES = 10\nexport const codes = new Set(['EMFILE', 'ENFILE', 'EBUSY'])\n\nexport const retryBusy = (fn: (path: string) => Promise) => {\n const method = async (\n path: string,\n opt: RimrafAsyncOptions,\n backoff = 1,\n total = 0\n ) => {\n const mbo = opt.maxBackoff || MAXBACKOFF\n const rate = opt.backoff || RATE\n const max = opt.maxRetries || MAXRETRIES\n let retries = 0\n while (true) {\n try {\n return await fn(path)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer?.path === path && fer?.code && codes.has(fer.code)) {\n backoff = Math.ceil(backoff * rate)\n total = backoff + total\n if (total < mbo) {\n return new Promise((res, rej) => {\n setTimeout(() => {\n method(path, opt, backoff, total).then(res, rej)\n }, backoff)\n })\n }\n if (retries < max) {\n retries++\n continue\n }\n }\n throw er\n }\n }\n }\n\n return method\n}\n\n// just retries, no async so no backoff\nexport const retryBusySync = (fn: (path: string) => any) => {\n const method = (path: string, opt: RimrafOptions) => {\n const max = opt.maxRetries || MAXRETRIES\n let retries = 0\n while (true) {\n try {\n return fn(path)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (\n fer?.path === path &&\n fer?.code &&\n codes.has(fer.code) &&\n retries < max\n ) {\n retries++\n continue\n }\n throw er\n }\n }\n }\n return method\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts new file mode 100644 index 00000000..5b143434 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts @@ -0,0 +1,3 @@ +export declare const rimrafManual: (path: string, opt: import("./index.js").RimrafAsyncOptions) => Promise; +export declare const rimrafManualSync: (path: string, opt: import("./index.js").RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-manual.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts.map new file mode 100644 index 00000000..2a502fa4 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-manual.d.ts","sourceRoot":"","sources":["../../src/rimraf-manual.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,YAAY,kFAAqD,CAAA;AAC9E,eAAO,MAAM,gBAAgB,wEAC+B,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.js new file mode 100644 index 00000000..132708ff --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.js @@ -0,0 +1,6 @@ +import platform from './platform.js'; +import { rimrafPosix, rimrafPosixSync } from './rimraf-posix.js'; +import { rimrafWindows, rimrafWindowsSync } from './rimraf-windows.js'; +export const rimrafManual = platform === 'win32' ? rimrafWindows : rimrafPosix; +export const rimrafManualSync = platform === 'win32' ? rimrafWindowsSync : rimrafPosixSync; +//# sourceMappingURL=rimraf-manual.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.js.map new file mode 100644 index 00000000..212c815d --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-manual.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-manual.js","sourceRoot":"","sources":["../../src/rimraf-manual.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAA;AAEpC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEtE,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAA;AAC9E,MAAM,CAAC,MAAM,gBAAgB,GAC3B,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,eAAe,CAAA","sourcesContent":["import platform from './platform.js'\n\nimport { rimrafPosix, rimrafPosixSync } from './rimraf-posix.js'\nimport { rimrafWindows, rimrafWindowsSync } from './rimraf-windows.js'\n\nexport const rimrafManual = platform === 'win32' ? rimrafWindows : rimrafPosix\nexport const rimrafManualSync =\n platform === 'win32' ? rimrafWindowsSync : rimrafPosixSync\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts new file mode 100644 index 00000000..da5b6b65 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafSyncOptions } from '.'; +export declare const rimrafMoveRemove: (path: string, opt: RimrafAsyncOptions) => Promise; +export declare const rimrafMoveRemoveSync: (path: string, opt: RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-move-remove.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts.map new file mode 100644 index 00000000..1c64ddf8 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-move-remove.d.ts","sourceRoot":"","sources":["../../src/rimraf-move-remove.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAA;AA4CzD,eAAO,MAAM,gBAAgB,SACrB,MAAM,OACP,kBAAkB,qBAWxB,CAAA;AA0ED,eAAO,MAAM,oBAAoB,SAAU,MAAM,OAAO,iBAAiB,YAUxE,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.js new file mode 100644 index 00000000..093e40f4 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.js @@ -0,0 +1,187 @@ +// https://youtu.be/uhRWMGBjlO8?t=537 +// +// 1. readdir +// 2. for each entry +// a. if a non-empty directory, recurse +// b. if an empty directory, move to random hidden file name in $TEMP +// c. unlink/rmdir $TEMP +// +// This works around the fact that unlink/rmdir is non-atomic and takes +// a non-deterministic amount of time to complete. +// +// However, it is HELLA SLOW, like 2-10x slower than a naive recursive rm. +import { basename, parse, resolve } from 'path'; +import { defaultTmp, defaultTmpSync } from './default-tmp.js'; +import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'; +import { chmodSync, lstatSync, promises as fsPromises, renameSync, rmdirSync, unlinkSync, } from './fs.js'; +const { lstat, rename, unlink, rmdir, chmod } = fsPromises; +import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'; +// crypto.randomBytes is much slower, and Math.random() is enough here +const uniqueFilename = (path) => `.${basename(path)}.${Math.random()}`; +const unlinkFixEPERM = async (path) => unlink(path).catch((er) => { + if (er.code === 'EPERM') { + return chmod(path, 0o666).then(() => unlink(path), er2 => { + if (er2.code === 'ENOENT') { + return; + } + throw er; + }); + } + else if (er.code === 'ENOENT') { + return; + } + throw er; +}); +const unlinkFixEPERMSync = (path) => { + try { + unlinkSync(path); + } + catch (er) { + if (er?.code === 'EPERM') { + try { + return chmodSync(path, 0o666); + } + catch (er2) { + if (er2?.code === 'ENOENT') { + return; + } + throw er; + } + } + else if (er?.code === 'ENOENT') { + return; + } + throw er; + } +}; +export const rimrafMoveRemove = async (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return await rimrafMoveRemoveDir(path, opt, await lstat(path)); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +const rimrafMoveRemoveDir = async (path, opt, ent) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + if (!opt.tmp) { + return rimrafMoveRemoveDir(path, { ...opt, tmp: await defaultTmp(path) }, ent); + } + if (path === opt.tmp && parse(path).root !== path) { + throw new Error('cannot delete temp directory used for deletion'); + } + const entries = ent.isDirectory() ? await readdirOrError(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await ignoreENOENT(tmpUnlink(path, opt.tmp, unlinkFixEPERM)); + return true; + } + const removedAll = (await Promise.all(entries.map(ent => rimrafMoveRemoveDir(resolve(path, ent.name), opt, ent)))).reduce((a, b) => a && b, true); + if (!removedAll) { + return false; + } + // we don't ever ACTUALLY try to unlink /, because that can never work + // but when preserveRoot is false, we could be operating on it. + // No need to check if preserveRoot is not false. + if (opt.preserveRoot === false && path === parse(path).root) { + return false; + } + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await ignoreENOENT(tmpUnlink(path, opt.tmp, rmdir)); + return true; +}; +const tmpUnlink = async (path, tmp, rm) => { + const tmpFile = resolve(tmp, uniqueFilename(path)); + await rename(path, tmpFile); + return await rm(tmpFile); +}; +export const rimrafMoveRemoveSync = (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return rimrafMoveRemoveDirSync(path, opt, lstatSync(path)); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +const rimrafMoveRemoveDirSync = (path, opt, ent) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + if (!opt.tmp) { + return rimrafMoveRemoveDirSync(path, { ...opt, tmp: defaultTmpSync(path) }, ent); + } + const tmp = opt.tmp; + if (path === opt.tmp && parse(path).root !== path) { + throw new Error('cannot delete temp directory used for deletion'); + } + const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + ignoreENOENTSync(() => tmpUnlinkSync(path, tmp, unlinkFixEPERMSync)); + return true; + } + let removedAll = true; + for (const ent of entries) { + const p = resolve(path, ent.name); + removedAll = rimrafMoveRemoveDirSync(p, opt, ent) && removedAll; + } + if (!removedAll) { + return false; + } + if (opt.preserveRoot === false && path === parse(path).root) { + return false; + } + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + ignoreENOENTSync(() => tmpUnlinkSync(path, tmp, rmdirSync)); + return true; +}; +const tmpUnlinkSync = (path, tmp, rmSync) => { + const tmpFile = resolve(tmp, uniqueFilename(path)); + renameSync(path, tmpFile); + return rmSync(tmpFile); +}; +//# sourceMappingURL=rimraf-move-remove.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.js.map new file mode 100644 index 00000000..f017a061 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-move-remove.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-move-remove.js","sourceRoot":"","sources":["../../src/rimraf-move-remove.ts"],"names":[],"mappings":"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","sourcesContent":["// https://youtu.be/uhRWMGBjlO8?t=537\n//\n// 1. readdir\n// 2. for each entry\n// a. if a non-empty directory, recurse\n// b. if an empty directory, move to random hidden file name in $TEMP\n// c. unlink/rmdir $TEMP\n//\n// This works around the fact that unlink/rmdir is non-atomic and takes\n// a non-deterministic amount of time to complete.\n//\n// However, it is HELLA SLOW, like 2-10x slower than a naive recursive rm.\n\nimport { basename, parse, resolve } from 'path'\nimport { defaultTmp, defaultTmpSync } from './default-tmp.js'\n\nimport { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'\n\nimport {\n chmodSync,\n lstatSync,\n promises as fsPromises,\n renameSync,\n rmdirSync,\n unlinkSync,\n} from './fs.js'\nconst { lstat, rename, unlink, rmdir, chmod } = fsPromises\n\nimport { Dirent, Stats } from 'fs'\nimport { RimrafAsyncOptions, RimrafSyncOptions } from '.'\nimport { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'\n\n// crypto.randomBytes is much slower, and Math.random() is enough here\nconst uniqueFilename = (path: string) => `.${basename(path)}.${Math.random()}`\n\nconst unlinkFixEPERM = async (path: string) =>\n unlink(path).catch((er: Error & { code?: string }) => {\n if (er.code === 'EPERM') {\n return chmod(path, 0o666).then(\n () => unlink(path),\n er2 => {\n if (er2.code === 'ENOENT') {\n return\n }\n throw er\n }\n )\n } else if (er.code === 'ENOENT') {\n return\n }\n throw er\n })\n\nconst unlinkFixEPERMSync = (path: string) => {\n try {\n unlinkSync(path)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'EPERM') {\n try {\n return chmodSync(path, 0o666)\n } catch (er2) {\n if ((er2 as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return\n }\n throw er\n }\n } else if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') {\n return\n }\n throw er\n }\n}\n\nexport const rimrafMoveRemove = async (\n path: string,\n opt: RimrafAsyncOptions\n) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return await rimrafMoveRemoveDir(path, opt, await lstat(path))\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nconst rimrafMoveRemoveDir = async (\n path: string,\n opt: RimrafAsyncOptions,\n ent: Dirent | Stats\n): Promise => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n if (!opt.tmp) {\n return rimrafMoveRemoveDir(\n path,\n { ...opt, tmp: await defaultTmp(path) },\n ent\n )\n }\n if (path === opt.tmp && parse(path).root !== path) {\n throw new Error('cannot delete temp directory used for deletion')\n }\n\n const entries = ent.isDirectory() ? await readdirOrError(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n await ignoreENOENT(tmpUnlink(path, opt.tmp, unlinkFixEPERM))\n return true\n }\n\n const removedAll = (\n await Promise.all(\n entries.map(ent => rimrafMoveRemoveDir(resolve(path, ent.name), opt, ent))\n )\n ).reduce((a, b) => a && b, true)\n if (!removedAll) {\n return false\n }\n\n // we don't ever ACTUALLY try to unlink /, because that can never work\n // but when preserveRoot is false, we could be operating on it.\n // No need to check if preserveRoot is not false.\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n await ignoreENOENT(tmpUnlink(path, opt.tmp, rmdir))\n return true\n}\n\nconst tmpUnlink = async (\n path: string,\n tmp: string,\n rm: (p: string) => Promise\n) => {\n const tmpFile = resolve(tmp, uniqueFilename(path))\n await rename(path, tmpFile)\n return await rm(tmpFile)\n}\n\nexport const rimrafMoveRemoveSync = (path: string, opt: RimrafSyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return rimrafMoveRemoveDirSync(path, opt, lstatSync(path))\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nconst rimrafMoveRemoveDirSync = (\n path: string,\n opt: RimrafSyncOptions,\n ent: Dirent | Stats\n): boolean => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n if (!opt.tmp) {\n return rimrafMoveRemoveDirSync(\n path,\n { ...opt, tmp: defaultTmpSync(path) },\n ent\n )\n }\n const tmp: string = opt.tmp\n\n if (path === opt.tmp && parse(path).root !== path) {\n throw new Error('cannot delete temp directory used for deletion')\n }\n\n const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n ignoreENOENTSync(() => tmpUnlinkSync(path, tmp, unlinkFixEPERMSync))\n return true\n }\n\n let removedAll = true\n for (const ent of entries) {\n const p = resolve(path, ent.name)\n removedAll = rimrafMoveRemoveDirSync(p, opt, ent) && removedAll\n }\n if (!removedAll) {\n return false\n }\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n ignoreENOENTSync(() => tmpUnlinkSync(path, tmp, rmdirSync))\n return true\n}\n\nconst tmpUnlinkSync = (\n path: string,\n tmp: string,\n rmSync: (p: string) => void\n) => {\n const tmpFile = resolve(tmp, uniqueFilename(path))\n renameSync(path, tmpFile)\n return rmSync(tmpFile)\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.d.ts new file mode 100644 index 00000000..9c08af09 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafSyncOptions } from '.'; +export declare const rimrafNative: (path: string, opt: RimrafAsyncOptions) => Promise; +export declare const rimrafNativeSync: (path: string, opt: RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-native.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.d.ts.map new file mode 100644 index 00000000..9c256812 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-native.d.ts","sourceRoot":"","sources":["../../src/rimraf-native.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAA;AAIzD,eAAO,MAAM,YAAY,SACjB,MAAM,OACP,kBAAkB,KACtB,QAAQ,OAAO,CAOjB,CAAA;AAED,eAAO,MAAM,gBAAgB,SACrB,MAAM,OACP,iBAAiB,KACrB,OAOF,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.js new file mode 100644 index 00000000..719161fc --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.js @@ -0,0 +1,19 @@ +import { promises, rmSync } from './fs.js'; +const { rm } = promises; +export const rimrafNative = async (path, opt) => { + await rm(path, { + ...opt, + force: true, + recursive: true, + }); + return true; +}; +export const rimrafNativeSync = (path, opt) => { + rmSync(path, { + ...opt, + force: true, + recursive: true, + }); + return true; +}; +//# sourceMappingURL=rimraf-native.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.js.map new file mode 100644 index 00000000..88eda68b --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-native.js","sourceRoot":"","sources":["../../src/rimraf-native.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAC1C,MAAM,EAAE,EAAE,EAAE,GAAG,QAAQ,CAAA;AAEvB,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,IAAY,EACZ,GAAuB,EACL,EAAE;IACpB,MAAM,EAAE,CAAC,IAAI,EAAE;QACb,GAAG,GAAG;QACN,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,GAAsB,EACb,EAAE;IACX,MAAM,CAAC,IAAI,EAAE;QACX,GAAG,GAAG;QACN,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;KAChB,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC,CAAA","sourcesContent":["import { RimrafAsyncOptions, RimrafSyncOptions } from '.'\nimport { promises, rmSync } from './fs.js'\nconst { rm } = promises\n\nexport const rimrafNative = async (\n path: string,\n opt: RimrafAsyncOptions\n): Promise => {\n await rm(path, {\n ...opt,\n force: true,\n recursive: true,\n })\n return true\n}\n\nexport const rimrafNativeSync = (\n path: string,\n opt: RimrafSyncOptions\n): boolean => {\n rmSync(path, {\n ...opt,\n force: true,\n recursive: true,\n })\n return true\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts new file mode 100644 index 00000000..fd4c83c3 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafSyncOptions } from '.'; +export declare const rimrafPosix: (path: string, opt: RimrafAsyncOptions) => Promise; +export declare const rimrafPosixSync: (path: string, opt: RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-posix.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts.map new file mode 100644 index 00000000..397a9c5b --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-posix.d.ts","sourceRoot":"","sources":["../../src/rimraf-posix.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAA;AAGzD,eAAO,MAAM,WAAW,SAAgB,MAAM,OAAO,kBAAkB,qBAUtE,CAAA;AAED,eAAO,MAAM,eAAe,SAAU,MAAM,OAAO,iBAAiB,YAUnE,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.js new file mode 100644 index 00000000..356a4777 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.js @@ -0,0 +1,118 @@ +// the simple recursive removal, where unlink and rmdir are atomic +// Note that this approach does NOT work on Windows! +// We stat first and only unlink if the Dirent isn't a directory, +// because sunos will let root unlink a directory, and some +// SUPER weird breakage happens as a result. +import { lstatSync, promises, rmdirSync, unlinkSync } from './fs.js'; +const { lstat, rmdir, unlink } = promises; +import { parse, resolve } from 'path'; +import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'; +import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'; +export const rimrafPosix = async (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return await rimrafPosixDir(path, opt, await lstat(path)); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +export const rimrafPosixSync = (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return rimrafPosixDirSync(path, opt, lstatSync(path)); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +const rimrafPosixDir = async (path, opt, ent) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + const entries = ent.isDirectory() ? await readdirOrError(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await ignoreENOENT(unlink(path)); + return true; + } + const removedAll = (await Promise.all(entries.map(ent => rimrafPosixDir(resolve(path, ent.name), opt, ent)))).reduce((a, b) => a && b, true); + if (!removedAll) { + return false; + } + // we don't ever ACTUALLY try to unlink /, because that can never work + // but when preserveRoot is false, we could be operating on it. + // No need to check if preserveRoot is not false. + if (opt.preserveRoot === false && path === parse(path).root) { + return false; + } + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await ignoreENOENT(rmdir(path)); + return true; +}; +const rimrafPosixDirSync = (path, opt, ent) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + ignoreENOENTSync(() => unlinkSync(path)); + return true; + } + let removedAll = true; + for (const ent of entries) { + const p = resolve(path, ent.name); + removedAll = rimrafPosixDirSync(p, opt, ent) && removedAll; + } + if (opt.preserveRoot === false && path === parse(path).root) { + return false; + } + if (!removedAll) { + return false; + } + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + ignoreENOENTSync(() => rmdirSync(path)); + return true; +}; +//# sourceMappingURL=rimraf-posix.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.js.map new file mode 100644 index 00000000..ef64c636 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-posix.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-posix.js","sourceRoot":"","sources":["../../src/rimraf-posix.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,oDAAoD;AACpD,iEAAiE;AACjE,2DAA2D;AAC3D,4CAA4C;AAE5C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;AAEzC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAErC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAI1E,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAEnE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,IAAY,EAAE,GAAuB,EAAE,EAAE;IACzE,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IACD,IAAI;QACF,OAAO,MAAM,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;KAC1D;IAAC,OAAO,EAAE,EAAE;QACX,IAAK,EAA4B,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACjE,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,GAAsB,EAAE,EAAE;IACtE,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IACD,IAAI;QACF,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;KACtD;IAAC,OAAO,EAAE,EAAE;QACX,IAAK,EAA4B,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACjE,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,KAAK,EAC1B,IAAY,EACZ,GAAuB,EACvB,GAAmB,EACD,EAAE;IACpB,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,gEAAgE;QAChE,oDAAoD;QACpD,qBAAqB;QACrB,IAAI,OAAO,EAAE;YACX,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC7B,OAAO,IAAI,CAAA;aACZ;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC9B,MAAM,OAAO,CAAA;aACd;SACF;QACD,oBAAoB;QACpB,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE;YAChD,OAAO,KAAK,CAAA;SACb;QACD,MAAM,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;QAChC,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,UAAU,GAAG,CACjB,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CACtE,CACF,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;IAEhC,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,KAAK,CAAA;KACb;IAED,sEAAsE;IACtE,+DAA+D;IAC/D,iDAAiD;IACjD,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QAC3D,OAAO,KAAK,CAAA;KACb;IAED,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE;QAChD,OAAO,KAAK,CAAA;KACb;IAED,MAAM,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/B,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,kBAAkB,GAAG,CACzB,IAAY,EACZ,GAAsB,EACtB,GAAmB,EACV,EAAE;IACX,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,gEAAgE;QAChE,oDAAoD;QACpD,qBAAqB;QACrB,IAAI,OAAO,EAAE;YACX,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC7B,OAAO,IAAI,CAAA;aACZ;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC9B,MAAM,OAAO,CAAA;aACd;SACF;QACD,oBAAoB;QACpB,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YACxC,OAAO,KAAK,CAAA;SACb;QACD,gBAAgB,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QACxC,OAAO,IAAI,CAAA;KACZ;IACD,IAAI,UAAU,GAAY,IAAI,CAAA;IAC9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;QACzB,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QACjC,UAAU,GAAG,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,UAAU,CAAA;KAC3D;IACD,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QAC3D,OAAO,KAAK,CAAA;KACb;IAED,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,KAAK,CAAA;KACb;IAED,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;QACxC,OAAO,KAAK,CAAA;KACb;IAED,gBAAgB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;IACvC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA","sourcesContent":["// the simple recursive removal, where unlink and rmdir are atomic\n// Note that this approach does NOT work on Windows!\n// We stat first and only unlink if the Dirent isn't a directory,\n// because sunos will let root unlink a directory, and some\n// SUPER weird breakage happens as a result.\n\nimport { lstatSync, promises, rmdirSync, unlinkSync } from './fs.js'\nconst { lstat, rmdir, unlink } = promises\n\nimport { parse, resolve } from 'path'\n\nimport { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'\n\nimport { Dirent, Stats } from 'fs'\nimport { RimrafAsyncOptions, RimrafSyncOptions } from '.'\nimport { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'\n\nexport const rimrafPosix = async (path: string, opt: RimrafAsyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return await rimrafPosixDir(path, opt, await lstat(path))\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nexport const rimrafPosixSync = (path: string, opt: RimrafSyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return rimrafPosixDirSync(path, opt, lstatSync(path))\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nconst rimrafPosixDir = async (\n path: string,\n opt: RimrafAsyncOptions,\n ent: Dirent | Stats\n): Promise => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n const entries = ent.isDirectory() ? await readdirOrError(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n await ignoreENOENT(unlink(path))\n return true\n }\n\n const removedAll = (\n await Promise.all(\n entries.map(ent => rimrafPosixDir(resolve(path, ent.name), opt, ent))\n )\n ).reduce((a, b) => a && b, true)\n\n if (!removedAll) {\n return false\n }\n\n // we don't ever ACTUALLY try to unlink /, because that can never work\n // but when preserveRoot is false, we could be operating on it.\n // No need to check if preserveRoot is not false.\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n\n await ignoreENOENT(rmdir(path))\n return true\n}\n\nconst rimrafPosixDirSync = (\n path: string,\n opt: RimrafSyncOptions,\n ent: Dirent | Stats\n): boolean => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n ignoreENOENTSync(() => unlinkSync(path))\n return true\n }\n let removedAll: boolean = true\n for (const ent of entries) {\n const p = resolve(path, ent.name)\n removedAll = rimrafPosixDirSync(p, opt, ent) && removedAll\n }\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n\n if (!removedAll) {\n return false\n }\n\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n\n ignoreENOENTSync(() => rmdirSync(path))\n return true\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts new file mode 100644 index 00000000..94129878 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafSyncOptions } from '.'; +export declare const rimrafWindows: (path: string, opt: RimrafAsyncOptions) => Promise; +export declare const rimrafWindowsSync: (path: string, opt: RimrafSyncOptions) => boolean; +//# sourceMappingURL=rimraf-windows.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts.map new file mode 100644 index 00000000..03ecfb6d --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-windows.d.ts","sourceRoot":"","sources":["../../src/rimraf-windows.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,GAAG,CAAA;AA2DzD,eAAO,MAAM,aAAa,SAAgB,MAAM,OAAO,kBAAkB,qBAUxE,CAAA;AAED,eAAO,MAAM,iBAAiB,SAAU,MAAM,OAAO,iBAAiB,YAUrE,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.js new file mode 100644 index 00000000..bd2fa806 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.js @@ -0,0 +1,177 @@ +// This is the same as rimrafPosix, with the following changes: +// +// 1. EBUSY, ENFILE, EMFILE trigger retries and/or exponential backoff +// 2. All non-directories are removed first and then all directories are +// removed in a second sweep. +// 3. If we hit ENOTEMPTY in the second sweep, fall back to move-remove on +// the that folder. +// +// Note: "move then remove" is 2-10 times slower, and just as unreliable. +import { parse, resolve } from 'path'; +import { fixEPERM, fixEPERMSync } from './fix-eperm.js'; +import { lstatSync, promises, rmdirSync, unlinkSync } from './fs.js'; +import { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'; +import { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'; +import { retryBusy, retryBusySync } from './retry-busy.js'; +import { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js'; +const { unlink, rmdir, lstat } = promises; +const rimrafWindowsFile = retryBusy(fixEPERM(unlink)); +const rimrafWindowsFileSync = retryBusySync(fixEPERMSync(unlinkSync)); +const rimrafWindowsDirRetry = retryBusy(fixEPERM(rmdir)); +const rimrafWindowsDirRetrySync = retryBusySync(fixEPERMSync(rmdirSync)); +const rimrafWindowsDirMoveRemoveFallback = async (path, opt) => { + /* c8 ignore start */ + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + /* c8 ignore stop */ + // already filtered, remove from options so we don't call unnecessarily + const { filter, ...options } = opt; + try { + return await rimrafWindowsDirRetry(path, options); + } + catch (er) { + if (er?.code === 'ENOTEMPTY') { + return await rimrafMoveRemove(path, options); + } + throw er; + } +}; +const rimrafWindowsDirMoveRemoveFallbackSync = (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + // already filtered, remove from options so we don't call unnecessarily + const { filter, ...options } = opt; + try { + return rimrafWindowsDirRetrySync(path, options); + } + catch (er) { + const fer = er; + if (fer?.code === 'ENOTEMPTY') { + return rimrafMoveRemoveSync(path, options); + } + throw er; + } +}; +const START = Symbol('start'); +const CHILD = Symbol('child'); +const FINISH = Symbol('finish'); +export const rimrafWindows = async (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return await rimrafWindowsDir(path, opt, await lstat(path), START); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +export const rimrafWindowsSync = (path, opt) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + try { + return rimrafWindowsDirSync(path, opt, lstatSync(path), START); + } + catch (er) { + if (er?.code === 'ENOENT') + return true; + throw er; + } +}; +const rimrafWindowsDir = async (path, opt, ent, state = START) => { + if (opt?.signal?.aborted) { + throw opt.signal.reason; + } + const entries = ent.isDirectory() ? await readdirOrError(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + // is a file + await ignoreENOENT(rimrafWindowsFile(path, opt)); + return true; + } + const s = state === START ? CHILD : state; + const removedAll = (await Promise.all(entries.map(ent => rimrafWindowsDir(resolve(path, ent.name), opt, ent, s)))).reduce((a, b) => a && b, true); + if (state === START) { + return rimrafWindowsDir(path, opt, ent, FINISH); + } + else if (state === FINISH) { + if (opt.preserveRoot === false && path === parse(path).root) { + return false; + } + if (!removedAll) { + return false; + } + if (opt.filter && !(await opt.filter(path, ent))) { + return false; + } + await ignoreENOENT(rimrafWindowsDirMoveRemoveFallback(path, opt)); + } + return true; +}; +const rimrafWindowsDirSync = (path, opt, ent, state = START) => { + const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null; + if (!Array.isArray(entries)) { + // this can only happen if lstat/readdir lied, or if the dir was + // swapped out with a file at just the right moment. + /* c8 ignore start */ + if (entries) { + if (entries.code === 'ENOENT') { + return true; + } + if (entries.code !== 'ENOTDIR') { + throw entries; + } + } + /* c8 ignore stop */ + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + // is a file + ignoreENOENTSync(() => rimrafWindowsFileSync(path, opt)); + return true; + } + let removedAll = true; + for (const ent of entries) { + const s = state === START ? CHILD : state; + const p = resolve(path, ent.name); + removedAll = rimrafWindowsDirSync(p, opt, ent, s) && removedAll; + } + if (state === START) { + return rimrafWindowsDirSync(path, opt, ent, FINISH); + } + else if (state === FINISH) { + if (opt.preserveRoot === false && path === parse(path).root) { + return false; + } + if (!removedAll) { + return false; + } + if (opt.filter && !opt.filter(path, ent)) { + return false; + } + ignoreENOENTSync(() => { + rimrafWindowsDirMoveRemoveFallbackSync(path, opt); + }); + } + return true; +}; +//# sourceMappingURL=rimraf-windows.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.js.map new file mode 100644 index 00000000..7e5ebbdb --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/rimraf-windows.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rimraf-windows.js","sourceRoot":"","sources":["../../src/rimraf-windows.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,EAAE;AACF,sEAAsE;AACtE,wEAAwE;AACxE,gCAAgC;AAChC,0EAA0E;AAC1E,sBAAsB;AACtB,EAAE;AACF,yEAAyE;AAGzE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAErC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpE,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACnE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAChF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAA;AAEzC,MAAM,iBAAiB,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;AACrD,MAAM,qBAAqB,GAAG,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAA;AACrE,MAAM,qBAAqB,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;AACxD,MAAM,yBAAyB,GAAG,aAAa,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;AAExE,MAAM,kCAAkC,GAAG,KAAK,EAC9C,IAAY,EACZ,GAAuB,EACL,EAAE;IACpB,qBAAqB;IACrB,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IACD,oBAAoB;IACpB,uEAAuE;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAA;IAClC,IAAI;QACF,OAAO,MAAM,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;KAClD;IAAC,OAAO,EAAE,EAAE;QACX,IAAK,EAA4B,EAAE,IAAI,KAAK,WAAW,EAAE;YACvD,OAAO,MAAM,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;SAC7C;QACD,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAED,MAAM,sCAAsC,GAAG,CAC7C,IAAY,EACZ,GAAsB,EACb,EAAE;IACX,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IACD,uEAAuE;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,GAAG,CAAA;IAClC,IAAI;QACF,OAAO,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;KAChD;IAAC,OAAO,EAAE,EAAE;QACX,MAAM,GAAG,GAAG,EAA2B,CAAA;QACvC,IAAI,GAAG,EAAE,IAAI,KAAK,WAAW,EAAE;YAC7B,OAAO,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;SAC3C;QACD,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;AAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAA;AAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AAE/B,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,EAAE,IAAY,EAAE,GAAuB,EAAE,EAAE;IAC3E,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IACD,IAAI;QACF,OAAO,MAAM,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;KACnE;IAAC,OAAO,EAAE,EAAE;QACX,IAAK,EAA4B,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACjE,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAY,EAAE,GAAsB,EAAE,EAAE;IACxE,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IACD,IAAI;QACF,OAAO,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAA;KAC/D;IAAC,OAAO,EAAE,EAAE;QACX,IAAK,EAA4B,EAAE,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAA;QACjE,MAAM,EAAE,CAAA;KACT;AACH,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,KAAK,EAC5B,IAAY,EACZ,GAAuB,EACvB,GAAmB,EACnB,KAAK,GAAG,KAAK,EACK,EAAE;IACpB,IAAI,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;QACxB,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAA;KACxB;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,gEAAgE;QAChE,oDAAoD;QACpD,qBAAqB;QACrB,IAAI,OAAO,EAAE;YACX,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC7B,OAAO,IAAI,CAAA;aACZ;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC9B,MAAM,OAAO,CAAA;aACd;SACF;QACD,oBAAoB;QACpB,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE;YAChD,OAAO,KAAK,CAAA;SACb;QACD,YAAY;QACZ,MAAM,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QAChD,OAAO,IAAI,CAAA;KACZ;IAED,MAAM,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;IACzC,MAAM,UAAU,GAAG,CACjB,MAAM,OAAO,CAAC,GAAG,CACf,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAC3E,CACF,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAA;IAEhC,IAAI,KAAK,KAAK,KAAK,EAAE;QACnB,OAAO,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;KAChD;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE;QAC3B,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;YAC3D,OAAO,KAAK,CAAA;SACb;QACD,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,KAAK,CAAA;SACb;QACD,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE;YAChD,OAAO,KAAK,CAAA;SACb;QACD,MAAM,YAAY,CAAC,kCAAkC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;KAClE;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,CAC3B,IAAY,EACZ,GAAsB,EACtB,GAAmB,EACnB,KAAK,GAAG,KAAK,EACJ,EAAE;IACX,MAAM,OAAO,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IACnE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC3B,gEAAgE;QAChE,oDAAoD;QACpD,qBAAqB;QACrB,IAAI,OAAO,EAAE;YACX,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC7B,OAAO,IAAI,CAAA;aACZ;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;gBAC9B,MAAM,OAAO,CAAA;aACd;SACF;QACD,oBAAoB;QACpB,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YACxC,OAAO,KAAK,CAAA;SACb;QACD,YAAY;QACZ,gBAAgB,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAA;QACxD,OAAO,IAAI,CAAA;KACZ;IAED,IAAI,UAAU,GAAG,IAAI,CAAA;IACrB,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;QACzB,MAAM,CAAC,GAAG,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAA;QACzC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;QACjC,UAAU,GAAG,oBAAoB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,UAAU,CAAA;KAChE;IAED,IAAI,KAAK,KAAK,KAAK,EAAE;QACnB,OAAO,oBAAoB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;KACpD;SAAM,IAAI,KAAK,KAAK,MAAM,EAAE;QAC3B,IAAI,GAAG,CAAC,YAAY,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;YAC3D,OAAO,KAAK,CAAA;SACb;QACD,IAAI,CAAC,UAAU,EAAE;YACf,OAAO,KAAK,CAAA;SACb;QACD,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;YACxC,OAAO,KAAK,CAAA;SACb;QACD,gBAAgB,CAAC,GAAG,EAAE;YACpB,sCAAsC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;KACH;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA","sourcesContent":["// This is the same as rimrafPosix, with the following changes:\n//\n// 1. EBUSY, ENFILE, EMFILE trigger retries and/or exponential backoff\n// 2. All non-directories are removed first and then all directories are\n// removed in a second sweep.\n// 3. If we hit ENOTEMPTY in the second sweep, fall back to move-remove on\n// the that folder.\n//\n// Note: \"move then remove\" is 2-10 times slower, and just as unreliable.\n\nimport { Dirent, Stats } from 'fs'\nimport { parse, resolve } from 'path'\nimport { RimrafAsyncOptions, RimrafSyncOptions } from '.'\nimport { fixEPERM, fixEPERMSync } from './fix-eperm.js'\nimport { lstatSync, promises, rmdirSync, unlinkSync } from './fs.js'\nimport { ignoreENOENT, ignoreENOENTSync } from './ignore-enoent.js'\nimport { readdirOrError, readdirOrErrorSync } from './readdir-or-error.js'\nimport { retryBusy, retryBusySync } from './retry-busy.js'\nimport { rimrafMoveRemove, rimrafMoveRemoveSync } from './rimraf-move-remove.js'\nconst { unlink, rmdir, lstat } = promises\n\nconst rimrafWindowsFile = retryBusy(fixEPERM(unlink))\nconst rimrafWindowsFileSync = retryBusySync(fixEPERMSync(unlinkSync))\nconst rimrafWindowsDirRetry = retryBusy(fixEPERM(rmdir))\nconst rimrafWindowsDirRetrySync = retryBusySync(fixEPERMSync(rmdirSync))\n\nconst rimrafWindowsDirMoveRemoveFallback = async (\n path: string,\n opt: RimrafAsyncOptions\n): Promise => {\n /* c8 ignore start */\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n /* c8 ignore stop */\n // already filtered, remove from options so we don't call unnecessarily\n const { filter, ...options } = opt\n try {\n return await rimrafWindowsDirRetry(path, options)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOTEMPTY') {\n return await rimrafMoveRemove(path, options)\n }\n throw er\n }\n}\n\nconst rimrafWindowsDirMoveRemoveFallbackSync = (\n path: string,\n opt: RimrafSyncOptions\n): boolean => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n // already filtered, remove from options so we don't call unnecessarily\n const { filter, ...options } = opt\n try {\n return rimrafWindowsDirRetrySync(path, options)\n } catch (er) {\n const fer = er as NodeJS.ErrnoException\n if (fer?.code === 'ENOTEMPTY') {\n return rimrafMoveRemoveSync(path, options)\n }\n throw er\n }\n}\n\nconst START = Symbol('start')\nconst CHILD = Symbol('child')\nconst FINISH = Symbol('finish')\n\nexport const rimrafWindows = async (path: string, opt: RimrafAsyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return await rimrafWindowsDir(path, opt, await lstat(path), START)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nexport const rimrafWindowsSync = (path: string, opt: RimrafSyncOptions) => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n try {\n return rimrafWindowsDirSync(path, opt, lstatSync(path), START)\n } catch (er) {\n if ((er as NodeJS.ErrnoException)?.code === 'ENOENT') return true\n throw er\n }\n}\n\nconst rimrafWindowsDir = async (\n path: string,\n opt: RimrafAsyncOptions,\n ent: Dirent | Stats,\n state = START\n): Promise => {\n if (opt?.signal?.aborted) {\n throw opt.signal.reason\n }\n\n const entries = ent.isDirectory() ? await readdirOrError(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n // is a file\n await ignoreENOENT(rimrafWindowsFile(path, opt))\n return true\n }\n\n const s = state === START ? CHILD : state\n const removedAll = (\n await Promise.all(\n entries.map(ent => rimrafWindowsDir(resolve(path, ent.name), opt, ent, s))\n )\n ).reduce((a, b) => a && b, true)\n\n if (state === START) {\n return rimrafWindowsDir(path, opt, ent, FINISH)\n } else if (state === FINISH) {\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n if (!removedAll) {\n return false\n }\n if (opt.filter && !(await opt.filter(path, ent))) {\n return false\n }\n await ignoreENOENT(rimrafWindowsDirMoveRemoveFallback(path, opt))\n }\n return true\n}\n\nconst rimrafWindowsDirSync = (\n path: string,\n opt: RimrafSyncOptions,\n ent: Dirent | Stats,\n state = START\n): boolean => {\n const entries = ent.isDirectory() ? readdirOrErrorSync(path) : null\n if (!Array.isArray(entries)) {\n // this can only happen if lstat/readdir lied, or if the dir was\n // swapped out with a file at just the right moment.\n /* c8 ignore start */\n if (entries) {\n if (entries.code === 'ENOENT') {\n return true\n }\n if (entries.code !== 'ENOTDIR') {\n throw entries\n }\n }\n /* c8 ignore stop */\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n // is a file\n ignoreENOENTSync(() => rimrafWindowsFileSync(path, opt))\n return true\n }\n\n let removedAll = true\n for (const ent of entries) {\n const s = state === START ? CHILD : state\n const p = resolve(path, ent.name)\n removedAll = rimrafWindowsDirSync(p, opt, ent, s) && removedAll\n }\n\n if (state === START) {\n return rimrafWindowsDirSync(path, opt, ent, FINISH)\n } else if (state === FINISH) {\n if (opt.preserveRoot === false && path === parse(path).root) {\n return false\n }\n if (!removedAll) {\n return false\n }\n if (opt.filter && !opt.filter(path, ent)) {\n return false\n }\n ignoreENOENTSync(() => {\n rimrafWindowsDirMoveRemoveFallbackSync(path, opt)\n })\n }\n return true\n}\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.d.ts b/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.d.ts new file mode 100644 index 00000000..e191fd90 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.d.ts @@ -0,0 +1,4 @@ +import { RimrafAsyncOptions, RimrafOptions } from './index.js'; +export declare const useNative: (opt?: RimrafAsyncOptions) => boolean; +export declare const useNativeSync: (opt?: RimrafOptions) => boolean; +//# sourceMappingURL=use-native.d.ts.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.d.ts.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.d.ts.map new file mode 100644 index 00000000..847baa58 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.d.ts","sourceRoot":"","sources":["../../src/use-native.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAI9D,eAAO,MAAM,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,kBAAkB,KAAK,OAGb,CAAA;AACzC,eAAO,MAAM,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,aAAa,KAAK,OAGZ,CAAA"} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.js b/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.js new file mode 100644 index 00000000..4dc4a449 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.js @@ -0,0 +1,13 @@ +const version = process.env.__TESTING_RIMRAF_NODE_VERSION__ || process.version; +const versArr = version.replace(/^v/, '').split('.'); +const hasNative = +versArr[0] > 14 || (+versArr[0] === 14 && +versArr[1] >= 14); +// we do NOT use native by default on Windows, because Node's native +// rm implementation is less advanced. Change this code if that changes. +import platform from './platform.js'; +export const useNative = !hasNative || platform === 'win32' + ? () => false + : opt => !opt?.signal && !opt?.filter; +export const useNativeSync = !hasNative || platform === 'win32' + ? () => false + : opt => !opt?.signal && !opt?.filter; +//# sourceMappingURL=use-native.js.map \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.js.map b/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.js.map new file mode 100644 index 00000000..72cedf81 --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/dist/mjs/use-native.js.map @@ -0,0 +1 @@ +{"version":3,"file":"use-native.js","sourceRoot":"","sources":["../../src/use-native.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,IAAI,OAAO,CAAC,OAAO,CAAA;AAC9E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACpD,MAAM,SAAS,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;AAE/E,oEAAoE;AACpE,yEAAyE;AACzE,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,MAAM,CAAC,MAAM,SAAS,GACpB,CAAC,SAAS,IAAI,QAAQ,KAAK,OAAO;IAChC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,CAAA;AACzC,MAAM,CAAC,MAAM,aAAa,GACxB,CAAC,SAAS,IAAI,QAAQ,KAAK,OAAO;IAChC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK;IACb,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,MAAM,CAAA","sourcesContent":["const version = process.env.__TESTING_RIMRAF_NODE_VERSION__ || process.version\nconst versArr = version.replace(/^v/, '').split('.')\nconst hasNative = +versArr[0] > 14 || (+versArr[0] === 14 && +versArr[1] >= 14)\nimport { RimrafAsyncOptions, RimrafOptions } from './index.js'\n// we do NOT use native by default on Windows, because Node's native\n// rm implementation is less advanced. Change this code if that changes.\nimport platform from './platform.js'\nexport const useNative: (opt?: RimrafAsyncOptions) => boolean =\n !hasNative || platform === 'win32'\n ? () => false\n : opt => !opt?.signal && !opt?.filter\nexport const useNativeSync: (opt?: RimrafOptions) => boolean =\n !hasNative || platform === 'win32'\n ? () => false\n : opt => !opt?.signal && !opt?.filter\n"]} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/rimraf/package.json b/@capacitor/assets/node_modules/rimraf/package.json new file mode 100644 index 00000000..573563ea --- /dev/null +++ b/@capacitor/assets/node_modules/rimraf/package.json @@ -0,0 +1,84 @@ +{ + "name": "rimraf", + "version": "4.4.1", + "main": "./dist/cjs/src/index-cjs.js", + "module": "./dist/mjs/index.js", + "types": "./dist/mjs/index.d.ts", + "bin": "./dist/cjs/src/bin.js", + "exports": { + ".": { + "import": { + "types": "./dist/mjs/index.d.ts", + "default": "./dist/mjs/index.js" + }, + "require": { + "types": "./dist/cjs/src/index.d.ts", + "default": "./dist/cjs/src/index-cjs.js" + } + } + }, + "files": [ + "dist" + ], + "description": "A deep deletion module for node (like `rm -rf`)", + "author": "Isaac Z. Schlueter (http://blog.izs.me/)", + "license": "ISC", + "repository": "git://github.com/isaacs/rimraf.git", + "scripts": { + "preversion": "npm test", + "postversion": "npm publish", + "prepublishOnly": "git push origin --follow-tags", + "preprepare": "rm -rf dist", + "prepare": "tsc -p tsconfig.json && tsc -p tsconfig-esm.json", + "postprepare": "bash fixup.sh", + "pretest": "npm run prepare", + "presnap": "npm run prepare", + "test": "c8 tap", + "snap": "c8 tap", + "format": "prettier --write . --loglevel warn", + "benchmark": "node benchmark/index.js", + "typedoc": "typedoc --tsconfig tsconfig-esm.json ./src/*.ts" + }, + "prettier": { + "semi": false, + "printWidth": 80, + "tabWidth": 2, + "useTabs": false, + "singleQuote": true, + "jsxSingleQuote": false, + "bracketSameLine": true, + "arrowParens": "avoid", + "endOfLine": "lf" + }, + "devDependencies": { + "@types/node": "^18.11.9", + "@types/tap": "^15.0.7", + "c8": "^7.12.0", + "eslint-config-prettier": "^8.6.0", + "mkdirp": "1", + "prettier": "^2.8.2", + "tap": "^16.3.4", + "ts-node": "^10.9.1", + "typedoc": "^0.23.21", + "typescript": "^4.9.3" + }, + "tap": { + "coverage": false, + "libtap-settings": "libtap-settings.js", + "node-arg": [ + "--no-warnings", + "--loader", + "ts-node/esm" + ], + "ts": false + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "engines": { + "node": ">=14" + }, + "dependencies": { + "glob": "^9.2.0" + } +} diff --git a/@capacitor/assets/node_modules/semver/LICENSE b/@capacitor/assets/node_modules/semver/LICENSE new file mode 100644 index 00000000..19129e31 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/LICENSE @@ -0,0 +1,15 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/@capacitor/assets/node_modules/semver/README.md b/@capacitor/assets/node_modules/semver/README.md new file mode 100644 index 00000000..ede7b7d0 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/README.md @@ -0,0 +1,654 @@ +semver(1) -- The semantic versioner for npm +=========================================== + +## Install + +```bash +npm install semver +```` + +## Usage + +As a node module: + +```js +const semver = require('semver') + +semver.valid('1.2.3') // '1.2.3' +semver.valid('a.b.c') // null +semver.clean(' =v1.2.3 ') // '1.2.3' +semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true +semver.gt('1.2.3', '9.8.7') // false +semver.lt('1.2.3', '9.8.7') // true +semver.minVersion('>=1.0.0') // '1.0.0' +semver.valid(semver.coerce('v2')) // '2.0.0' +semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7' +``` + +You can also just load the module for the function that you care about if +you'd like to minimize your footprint. + +```js +// load the whole API at once in a single object +const semver = require('semver') + +// or just load the bits you need +// all of them listed here, just pick and choose what you want + +// classes +const SemVer = require('semver/classes/semver') +const Comparator = require('semver/classes/comparator') +const Range = require('semver/classes/range') + +// functions for working with versions +const semverParse = require('semver/functions/parse') +const semverValid = require('semver/functions/valid') +const semverClean = require('semver/functions/clean') +const semverInc = require('semver/functions/inc') +const semverDiff = require('semver/functions/diff') +const semverMajor = require('semver/functions/major') +const semverMinor = require('semver/functions/minor') +const semverPatch = require('semver/functions/patch') +const semverPrerelease = require('semver/functions/prerelease') +const semverCompare = require('semver/functions/compare') +const semverRcompare = require('semver/functions/rcompare') +const semverCompareLoose = require('semver/functions/compare-loose') +const semverCompareBuild = require('semver/functions/compare-build') +const semverSort = require('semver/functions/sort') +const semverRsort = require('semver/functions/rsort') + +// low-level comparators between versions +const semverGt = require('semver/functions/gt') +const semverLt = require('semver/functions/lt') +const semverEq = require('semver/functions/eq') +const semverNeq = require('semver/functions/neq') +const semverGte = require('semver/functions/gte') +const semverLte = require('semver/functions/lte') +const semverCmp = require('semver/functions/cmp') +const semverCoerce = require('semver/functions/coerce') + +// working with ranges +const semverSatisfies = require('semver/functions/satisfies') +const semverMaxSatisfying = require('semver/ranges/max-satisfying') +const semverMinSatisfying = require('semver/ranges/min-satisfying') +const semverToComparators = require('semver/ranges/to-comparators') +const semverMinVersion = require('semver/ranges/min-version') +const semverValidRange = require('semver/ranges/valid') +const semverOutside = require('semver/ranges/outside') +const semverGtr = require('semver/ranges/gtr') +const semverLtr = require('semver/ranges/ltr') +const semverIntersects = require('semver/ranges/intersects') +const semverSimplifyRange = require('semver/ranges/simplify') +const semverRangeSubset = require('semver/ranges/subset') +``` + +As a command-line utility: + +``` +$ semver -h + +A JavaScript implementation of the https://semver.org/ specification +Copyright Isaac Z. Schlueter + +Usage: semver [options] [ [...]] +Prints valid versions sorted by SemVer precedence + +Options: +-r --range + Print versions that match the specified range. + +-i --increment [] + Increment a version by the specified level. Level can + be one of: major, minor, patch, premajor, preminor, + prepatch, or prerelease. Default level is 'patch'. + Only one version may be specified. + +--preid + Identifier to be used to prefix premajor, preminor, + prepatch or prerelease version increments. + +-l --loose + Interpret versions and ranges loosely + +-n <0|1> + This is the base to be used for the prerelease identifier. + +-p --include-prerelease + Always include prerelease versions in range matching + +-c --coerce + Coerce a string into SemVer if possible + (does not imply --loose) + +--rtl + Coerce version strings right to left + +--ltr + Coerce version strings left to right (default) + +Program exits successfully if any valid version satisfies +all supplied ranges, and prints all satisfying versions. + +If no satisfying versions are found, then exits failure. + +Versions are printed in ascending order, so supplying +multiple versions to the utility will just sort them. +``` + +## Versions + +A "version" is described by the `v2.0.0` specification found at +. + +A leading `"="` or `"v"` character is stripped off and ignored. + +## Ranges + +A `version range` is a set of `comparators` that specify versions +that satisfy the range. + +A `comparator` is composed of an `operator` and a `version`. The set +of primitive `operators` is: + +* `<` Less than +* `<=` Less than or equal to +* `>` Greater than +* `>=` Greater than or equal to +* `=` Equal. If no operator is specified, then equality is assumed, + so this operator is optional but MAY be included. + +For example, the comparator `>=1.2.7` would match the versions +`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6` +or `1.1.0`. The comparator `>1` is equivalent to `>=2.0.0` and +would match the versions `2.0.0` and `3.1.0`, but not the versions +`1.0.1` or `1.1.0`. + +Comparators can be joined by whitespace to form a `comparator set`, +which is satisfied by the **intersection** of all of the comparators +it includes. + +A range is composed of one or more comparator sets, joined by `||`. A +version matches a range if and only if every comparator in at least +one of the `||`-separated comparator sets is satisfied by the version. + +For example, the range `>=1.2.7 <1.3.0` would match the versions +`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`, +or `1.1.0`. + +The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`, +`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`. + +### Prerelease Tags + +If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then +it will only be allowed to satisfy comparator sets if at least one +comparator with the same `[major, minor, patch]` tuple also has a +prerelease tag. + +For example, the range `>1.2.3-alpha.3` would be allowed to match the +version `1.2.3-alpha.7`, but it would *not* be satisfied by +`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater +than" `1.2.3-alpha.3` according to the SemVer sort rules. The version +range only accepts prerelease tags on the `1.2.3` version. +Version `3.4.5` *would* satisfy the range because it does not have a +prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`. + +The purpose of this behavior is twofold. First, prerelease versions +frequently are updated very quickly, and contain many breaking changes +that are (by the author's design) not yet fit for public consumption. +Therefore, by default, they are excluded from range-matching +semantics. + +Second, a user who has opted into using a prerelease version has +indicated the intent to use *that specific* set of +alpha/beta/rc versions. By including a prerelease tag in the range, +the user is indicating that they are aware of the risk. However, it +is still not appropriate to assume that they have opted into taking a +similar risk on the *next* set of prerelease versions. + +Note that this behavior can be suppressed (treating all prerelease +versions as if they were normal versions, for range-matching) +by setting the `includePrerelease` flag on the options +object to any +[functions](https://github.com/npm/node-semver#functions) that do +range matching. + +#### Prerelease Identifiers + +The method `.inc` takes an additional `identifier` string argument that +will append the value of the string as a prerelease identifier: + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta') +// '1.2.4-beta.0' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta +1.2.4-beta.0 +``` + +Which then can be used to increment further: + +```bash +$ semver 1.2.4-beta.0 -i prerelease +1.2.4-beta.1 +``` + +#### Prerelease Identifier Base + +The method `.inc` takes an optional parameter 'identifierBase' string +that will let you let your prerelease number as zero-based or one-based. +Set to `false` to omit the prerelease number altogether. +If you do not specify this parameter, it will default to zero-based. + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta', '1') +// '1.2.4-beta.1' +``` + +```javascript +semver.inc('1.2.3', 'prerelease', 'beta', false) +// '1.2.4-beta' +``` + +command-line example: + +```bash +$ semver 1.2.3 -i prerelease --preid beta -n 1 +1.2.4-beta.1 +``` + +```bash +$ semver 1.2.3 -i prerelease --preid beta -n false +1.2.4-beta +``` + +### Advanced Range Syntax + +Advanced range syntax desugars to primitive comparators in +deterministic ways. + +Advanced ranges may be combined in the same way as primitive +comparators using white space or `||`. + +#### Hyphen Ranges `X.Y.Z - A.B.C` + +Specifies an inclusive set. + +* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4` + +If a partial version is provided as the first version in the inclusive +range, then the missing pieces are replaced with zeroes. + +* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4` + +If a partial version is provided as the second version in the +inclusive range, then all versions that start with the supplied parts +of the tuple are accepted, but nothing that would be greater than the +provided tuple parts. + +* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0-0` +* `1.2.3 - 2` := `>=1.2.3 <3.0.0-0` + +#### X-Ranges `1.2.x` `1.X` `1.2.*` `*` + +Any of `X`, `x`, or `*` may be used to "stand in" for one of the +numeric values in the `[major, minor, patch]` tuple. + +* `*` := `>=0.0.0` (Any non-prerelease version satisfies, unless + `includePrerelease` is specified, in which case any version at all + satisfies) +* `1.x` := `>=1.0.0 <2.0.0-0` (Matching major version) +* `1.2.x` := `>=1.2.0 <1.3.0-0` (Matching major and minor versions) + +A partial version range is treated as an X-Range, so the special +character is in fact optional. + +* `""` (empty string) := `*` := `>=0.0.0` +* `1` := `1.x.x` := `>=1.0.0 <2.0.0-0` +* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0-0` + +#### Tilde Ranges `~1.2.3` `~1.2` `~1` + +Allows patch-level changes if a minor version is specified on the +comparator. Allows minor-level changes if not. + +* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0-0` +* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0-0` (Same as `1.2.x`) +* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0-0` (Same as `1.x`) +* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0-0` +* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0-0` (Same as `0.2.x`) +* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0-0` (Same as `0.x`) +* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0-0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. + +#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4` + +Allows changes that do not modify the left-most non-zero element in the +`[major, minor, patch]` tuple. In other words, this allows patch and +minor updates for versions `1.0.0` and above, patch updates for +versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`. + +Many authors treat a `0.x` version as if the `x` were the major +"breaking-change" indicator. + +Caret ranges are ideal when an author may make breaking changes +between `0.2.4` and `0.3.0` releases, which is a common practice. +However, it presumes that there will *not* be breaking changes between +`0.2.4` and `0.2.5`. It allows for changes that are presumed to be +additive (but non-breaking), according to commonly observed practices. + +* `^1.2.3` := `>=1.2.3 <2.0.0-0` +* `^0.2.3` := `>=0.2.3 <0.3.0-0` +* `^0.0.3` := `>=0.0.3 <0.0.4-0` +* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0-0` Note that prereleases in + the `1.2.3` version will be allowed, if they are greater than or + equal to `beta.2`. So, `1.2.3-beta.4` would be allowed, but + `1.2.4-beta.2` would not, because it is a prerelease of a + different `[major, minor, patch]` tuple. +* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4-0` Note that prereleases in the + `0.0.3` version *only* will be allowed, if they are greater than or + equal to `beta`. So, `0.0.3-pr.2` would be allowed. + +When parsing caret ranges, a missing `patch` value desugars to the +number `0`, but will allow flexibility within that value, even if the +major and minor versions are both `0`. + +* `^1.2.x` := `>=1.2.0 <2.0.0-0` +* `^0.0.x` := `>=0.0.0 <0.1.0-0` +* `^0.0` := `>=0.0.0 <0.1.0-0` + +A missing `minor` and `patch` values will desugar to zero, but also +allow flexibility within those values, even if the major version is +zero. + +* `^1.x` := `>=1.0.0 <2.0.0-0` +* `^0.x` := `>=0.0.0 <1.0.0-0` + +### Range Grammar + +Putting all this together, here is a Backus-Naur grammar for ranges, +for the benefit of parser authors: + +```bnf +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | ['1'-'9'] ( ['0'-'9'] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ +``` + +## Functions + +All methods and classes take a final `options` object argument. All +options in this object are `false` by default. The options supported +are: + +- `loose`: Be more forgiving about not-quite-valid semver strings. + (Any resulting output will always be 100% strict compliant, of + course.) For backwards compatibility reasons, if the `options` + argument is a boolean value instead of an object, it is interpreted + to be the `loose` param. +- `includePrerelease`: Set to suppress the [default + behavior](https://github.com/npm/node-semver#prerelease-tags) of + excluding prerelease tagged versions from ranges unless they are + explicitly opted into. + +Strict-mode Comparators and Ranges will be strict about the SemVer +strings that they parse. + +* `valid(v)`: Return the parsed version, or null if it's not valid. +* `inc(v, release, options, identifier, identifierBase)`: + Return the version incremented by the release + type (`major`, `premajor`, `minor`, `preminor`, `patch`, + `prepatch`, or `prerelease`), or null if it's not valid + * `premajor` in one call will bump the version up to the next major + version and down to a prerelease of that major version. + `preminor`, and `prepatch` work the same way. + * If called from a non-prerelease version, `prerelease` will work the + same as `prepatch`. It increments the patch version and then makes a + prerelease. If the input version is already a prerelease it simply + increments it. + * `identifier` can be used to prefix `premajor`, `preminor`, + `prepatch`, or `prerelease` version increments. `identifierBase` + is the base to be used for the `prerelease` identifier. +* `prerelease(v)`: Returns an array of prerelease components, or null + if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]` +* `major(v)`: Return the major version number. +* `minor(v)`: Return the minor version number. +* `patch(v)`: Return the patch version number. +* `intersects(r1, r2, loose)`: Return true if the two supplied ranges + or comparators intersect. +* `parse(v)`: Attempt to parse a string as a semantic version, returning either + a `SemVer` object or `null`. + +### Comparison + +* `gt(v1, v2)`: `v1 > v2` +* `gte(v1, v2)`: `v1 >= v2` +* `lt(v1, v2)`: `v1 < v2` +* `lte(v1, v2)`: `v1 <= v2` +* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent, + even if they're not the same string. You already know how to + compare strings. +* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`. +* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call + the corresponding function above. `"==="` and `"!=="` do simple + string comparison, but are included for completeness. Throws if an + invalid comparison string is provided. +* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if + `v2` is greater. Sorts in ascending order if passed to `Array.sort()`. +* `rcompare(v1, v2)`: The reverse of `compare`. Sorts an array of versions + in descending order when passed to `Array.sort()`. +* `compareBuild(v1, v2)`: The same as `compare` but considers `build` when two versions + are equal. Sorts in ascending order if passed to `Array.sort()`. +* `compareLoose(v1, v2)`: Short for `compare(v1, v2, { loose: true })`. +* `diff(v1, v2)`: Returns the difference between two versions by the release type + (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`), + or null if the versions are the same. + +### Sorting + +* `sort(versions)`: Returns a sorted array of versions based on the `compareBuild` + function. +* `rsort(versions)`: The reverse of `sort`. Returns an array of versions based on + the `compareBuild` function in descending order. + +### Comparators + +* `intersects(comparator)`: Return true if the comparators intersect + +### Ranges + +* `validRange(range)`: Return the valid range or null if it's not valid +* `satisfies(version, range)`: Return true if the version satisfies the + range. +* `maxSatisfying(versions, range)`: Return the highest version in the list + that satisfies the range, or `null` if none of them do. +* `minSatisfying(versions, range)`: Return the lowest version in the list + that satisfies the range, or `null` if none of them do. +* `minVersion(range)`: Return the lowest version that can match + the given range. +* `gtr(version, range)`: Return `true` if the version is greater than all the + versions possible in the range. +* `ltr(version, range)`: Return `true` if the version is less than all the + versions possible in the range. +* `outside(version, range, hilo)`: Return true if the version is outside + the bounds of the range in either the high or low direction. The + `hilo` argument must be either the string `'>'` or `'<'`. (This is + the function called by `gtr` and `ltr`.) +* `intersects(range)`: Return true if any of the range comparators intersect. +* `simplifyRange(versions, range)`: Return a "simplified" range that + matches the same items in the `versions` list as the range specified. Note + that it does *not* guarantee that it would match the same versions in all + cases, only for the set of versions provided. This is useful when + generating ranges by joining together multiple versions with `||` + programmatically, to provide the user with something a bit more + ergonomic. If the provided range is shorter in string-length than the + generated range, then that is returned. +* `subset(subRange, superRange)`: Return `true` if the `subRange` range is + entirely contained by the `superRange` range. + +Note that, since ranges may be non-contiguous, a version might not be +greater than a range, less than a range, *or* satisfy a range! For +example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9` +until `2.0.0`, so version `1.2.10` would not be greater than the +range (because `2.0.1` satisfies, which is higher), nor less than the +range (since `1.2.8` satisfies, which is lower), and it also does not +satisfy the range. + +If you want to know if a version satisfies or does not satisfy a +range, use the `satisfies(version, range)` function. + +### Coercion + +* `coerce(version, options)`: Coerces a string to semver if possible + +This aims to provide a very forgiving translation of a non-semver string to +semver. It looks for the first digit in a string and consumes all +remaining characters which satisfy at least a partial semver (e.g., `1`, +`1.2`, `1.2.3`) up to the max permitted length (256 characters). Longer +versions are simply truncated (`4.6.3.9.2-alpha2` becomes `4.6.3`). All +surrounding text is simply ignored (`v3.4 replaces v3.3.1` becomes +`3.4.0`). Only text which lacks digits will fail coercion (`version one` +is not valid). The maximum length for any semver component considered for +coercion is 16 characters; longer components will be ignored +(`10000000000000000.4.7.4` becomes `4.7.4`). The maximum value for any +semver component is `Number.MAX_SAFE_INTEGER || (2**53 - 1)`; higher value +components are invalid (`9999999999999999.4.7.4` is likely invalid). + +If the `options.rtl` flag is set, then `coerce` will return the right-most +coercible tuple that does not share an ending index with a longer coercible +tuple. For example, `1.2.3.4` will return `2.3.4` in rtl mode, not +`4.0.0`. `1.2.3/4` will return `4.0.0`, because the `4` is not a part of +any other overlapping SemVer tuple. + +If the `options.includePrerelease` flag is set, then the `coerce` result will contain +prerelease and build parts of a version. For example, `1.2.3.4-rc.1+rev.2` +will preserve prerelease `rc.1` and build `rev.2` in the result. + +### Clean + +* `clean(version)`: Clean a string to be a valid semver if possible + +This will return a cleaned and trimmed semver version. If the provided +version is not valid a null will be returned. This does not work for +ranges. + +ex. +* `s.clean(' = v 2.1.5foo')`: `null` +* `s.clean(' = v 2.1.5foo', { loose: true })`: `'2.1.5-foo'` +* `s.clean(' = v 2.1.5-foo')`: `null` +* `s.clean(' = v 2.1.5-foo', { loose: true })`: `'2.1.5-foo'` +* `s.clean('=v2.1.5')`: `'2.1.5'` +* `s.clean(' =v2.1.5')`: `'2.1.5'` +* `s.clean(' 2.1.5 ')`: `'2.1.5'` +* `s.clean('~1.0.0')`: `null` + +## Constants + +As a convenience, helper constants are exported to provide information about what `node-semver` supports: + +### `RELEASE_TYPES` + +- major +- premajor +- minor +- preminor +- patch +- prepatch +- prerelease + +``` +const semver = require('semver'); + +if (semver.RELEASE_TYPES.includes(arbitraryUserInput)) { + console.log('This is a valid release type!'); +} else { + console.warn('This is NOT a valid release type!'); +} +``` + +### `SEMVER_SPEC_VERSION` + +2.0.0 + +``` +const semver = require('semver'); + +console.log('We are currently using the semver specification version:', semver.SEMVER_SPEC_VERSION); +``` + +## Exported Modules + + + +You may pull in just the part of this semver utility that you need if you +are sensitive to packing and tree-shaking concerns. The main +`require('semver')` export uses getter functions to lazily load the parts +of the API that are used. + +The following modules are available: + +* `require('semver')` +* `require('semver/classes')` +* `require('semver/classes/comparator')` +* `require('semver/classes/range')` +* `require('semver/classes/semver')` +* `require('semver/functions/clean')` +* `require('semver/functions/cmp')` +* `require('semver/functions/coerce')` +* `require('semver/functions/compare')` +* `require('semver/functions/compare-build')` +* `require('semver/functions/compare-loose')` +* `require('semver/functions/diff')` +* `require('semver/functions/eq')` +* `require('semver/functions/gt')` +* `require('semver/functions/gte')` +* `require('semver/functions/inc')` +* `require('semver/functions/lt')` +* `require('semver/functions/lte')` +* `require('semver/functions/major')` +* `require('semver/functions/minor')` +* `require('semver/functions/neq')` +* `require('semver/functions/parse')` +* `require('semver/functions/patch')` +* `require('semver/functions/prerelease')` +* `require('semver/functions/rcompare')` +* `require('semver/functions/rsort')` +* `require('semver/functions/satisfies')` +* `require('semver/functions/sort')` +* `require('semver/functions/valid')` +* `require('semver/ranges/gtr')` +* `require('semver/ranges/intersects')` +* `require('semver/ranges/ltr')` +* `require('semver/ranges/max-satisfying')` +* `require('semver/ranges/min-satisfying')` +* `require('semver/ranges/min-version')` +* `require('semver/ranges/outside')` +* `require('semver/ranges/simplify')` +* `require('semver/ranges/subset')` +* `require('semver/ranges/to-comparators')` +* `require('semver/ranges/valid')` + diff --git a/@capacitor/assets/node_modules/semver/classes/comparator.js b/@capacitor/assets/node_modules/semver/classes/comparator.js new file mode 100644 index 00000000..3d39c0ee --- /dev/null +++ b/@capacitor/assets/node_modules/semver/classes/comparator.js @@ -0,0 +1,141 @@ +const ANY = Symbol('SemVer ANY') +// hoisted class for cyclic dependency +class Comparator { + static get ANY () { + return ANY + } + + constructor (comp, options) { + options = parseOptions(options) + + if (comp instanceof Comparator) { + if (comp.loose === !!options.loose) { + return comp + } else { + comp = comp.value + } + } + + comp = comp.trim().split(/\s+/).join(' ') + debug('comparator', comp, options) + this.options = options + this.loose = !!options.loose + this.parse(comp) + + if (this.semver === ANY) { + this.value = '' + } else { + this.value = this.operator + this.semver.version + } + + debug('comp', this) + } + + parse (comp) { + const r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR] + const m = comp.match(r) + + if (!m) { + throw new TypeError(`Invalid comparator: ${comp}`) + } + + this.operator = m[1] !== undefined ? m[1] : '' + if (this.operator === '=') { + this.operator = '' + } + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) { + this.semver = ANY + } else { + this.semver = new SemVer(m[2], this.options.loose) + } + } + + toString () { + return this.value + } + + test (version) { + debug('Comparator.test', version, this.options.loose) + + if (this.semver === ANY || version === ANY) { + return true + } + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options) + } catch (er) { + return false + } + } + + return cmp(version, this.operator, this.semver, this.options) + } + + intersects (comp, options) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required') + } + + if (this.operator === '') { + if (this.value === '') { + return true + } + return new Range(comp.value, options).test(this.value) + } else if (comp.operator === '') { + if (comp.value === '') { + return true + } + return new Range(this.value, options).test(comp.semver) + } + + options = parseOptions(options) + + // Special cases where nothing can possibly be lower + if (options.includePrerelease && + (this.value === '<0.0.0-0' || comp.value === '<0.0.0-0')) { + return false + } + if (!options.includePrerelease && + (this.value.startsWith('<0.0.0') || comp.value.startsWith('<0.0.0'))) { + return false + } + + // Same direction increasing (> or >=) + if (this.operator.startsWith('>') && comp.operator.startsWith('>')) { + return true + } + // Same direction decreasing (< or <=) + if (this.operator.startsWith('<') && comp.operator.startsWith('<')) { + return true + } + // same SemVer and both sides are inclusive (<= or >=) + if ( + (this.semver.version === comp.semver.version) && + this.operator.includes('=') && comp.operator.includes('=')) { + return true + } + // opposite directions less than + if (cmp(this.semver, '<', comp.semver, options) && + this.operator.startsWith('>') && comp.operator.startsWith('<')) { + return true + } + // opposite directions greater than + if (cmp(this.semver, '>', comp.semver, options) && + this.operator.startsWith('<') && comp.operator.startsWith('>')) { + return true + } + return false + } +} + +module.exports = Comparator + +const parseOptions = require('../internal/parse-options') +const { safeRe: re, t } = require('../internal/re') +const cmp = require('../functions/cmp') +const debug = require('../internal/debug') +const SemVer = require('./semver') +const Range = require('./range') diff --git a/@capacitor/assets/node_modules/semver/classes/index.js b/@capacitor/assets/node_modules/semver/classes/index.js new file mode 100644 index 00000000..5e3f5c9b --- /dev/null +++ b/@capacitor/assets/node_modules/semver/classes/index.js @@ -0,0 +1,5 @@ +module.exports = { + SemVer: require('./semver.js'), + Range: require('./range.js'), + Comparator: require('./comparator.js'), +} diff --git a/@capacitor/assets/node_modules/semver/classes/range.js b/@capacitor/assets/node_modules/semver/classes/range.js new file mode 100644 index 00000000..ceee2314 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/classes/range.js @@ -0,0 +1,554 @@ +const SPACE_CHARACTERS = /\s+/g + +// hoisted class for cyclic dependency +class Range { + constructor (range, options) { + options = parseOptions(options) + + if (range instanceof Range) { + if ( + range.loose === !!options.loose && + range.includePrerelease === !!options.includePrerelease + ) { + return range + } else { + return new Range(range.raw, options) + } + } + + if (range instanceof Comparator) { + // just put it in the set and return + this.raw = range.value + this.set = [[range]] + this.formatted = undefined + return this + } + + this.options = options + this.loose = !!options.loose + this.includePrerelease = !!options.includePrerelease + + // First reduce all whitespace as much as possible so we do not have to rely + // on potentially slow regexes like \s*. This is then stored and used for + // future error messages as well. + this.raw = range.trim().replace(SPACE_CHARACTERS, ' ') + + // First, split on || + this.set = this.raw + .split('||') + // map the range to a 2d array of comparators + .map(r => this.parseRange(r.trim())) + // throw out any comparator lists that are empty + // this generally means that it was not a valid range, which is allowed + // in loose mode, but will still throw if the WHOLE range is invalid. + .filter(c => c.length) + + if (!this.set.length) { + throw new TypeError(`Invalid SemVer Range: ${this.raw}`) + } + + // if we have any that are not the null set, throw out null sets. + if (this.set.length > 1) { + // keep the first one, in case they're all null sets + const first = this.set[0] + this.set = this.set.filter(c => !isNullSet(c[0])) + if (this.set.length === 0) { + this.set = [first] + } else if (this.set.length > 1) { + // if we have any that are *, then the range is just * + for (const c of this.set) { + if (c.length === 1 && isAny(c[0])) { + this.set = [c] + break + } + } + } + } + + this.formatted = undefined + } + + get range () { + if (this.formatted === undefined) { + this.formatted = '' + for (let i = 0; i < this.set.length; i++) { + if (i > 0) { + this.formatted += '||' + } + const comps = this.set[i] + for (let k = 0; k < comps.length; k++) { + if (k > 0) { + this.formatted += ' ' + } + this.formatted += comps[k].toString().trim() + } + } + } + return this.formatted + } + + format () { + return this.range + } + + toString () { + return this.range + } + + parseRange (range) { + // memoize range parsing for performance. + // this is a very hot path, and fully deterministic. + const memoOpts = + (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | + (this.options.loose && FLAG_LOOSE) + const memoKey = memoOpts + ':' + range + const cached = cache.get(memoKey) + if (cached) { + return cached + } + + const loose = this.options.loose + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + const hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE] + range = range.replace(hr, hyphenReplace(this.options.includePrerelease)) + debug('hyphen replace', range) + + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace) + debug('comparator trim', range) + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[t.TILDETRIM], tildeTrimReplace) + debug('tilde trim', range) + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[t.CARETTRIM], caretTrimReplace) + debug('caret trim', range) + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + let rangeList = range + .split(' ') + .map(comp => parseComparator(comp, this.options)) + .join(' ') + .split(/\s+/) + // >=0.0.0 is equivalent to * + .map(comp => replaceGTE0(comp, this.options)) + + if (loose) { + // in loose mode, throw out any that are not valid comparators + rangeList = rangeList.filter(comp => { + debug('loose invalid filter', comp, this.options) + return !!comp.match(re[t.COMPARATORLOOSE]) + }) + } + debug('range list', rangeList) + + // if any comparators are the null set, then replace with JUST null set + // if more than one comparator, remove any * comparators + // also, don't include the same comparator more than once + const rangeMap = new Map() + const comparators = rangeList.map(comp => new Comparator(comp, this.options)) + for (const comp of comparators) { + if (isNullSet(comp)) { + return [comp] + } + rangeMap.set(comp.value, comp) + } + if (rangeMap.size > 1 && rangeMap.has('')) { + rangeMap.delete('') + } + + const result = [...rangeMap.values()] + cache.set(memoKey, result) + return result + } + + intersects (range, options) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required') + } + + return this.set.some((thisComparators) => { + return ( + isSatisfiable(thisComparators, options) && + range.set.some((rangeComparators) => { + return ( + isSatisfiable(rangeComparators, options) && + thisComparators.every((thisComparator) => { + return rangeComparators.every((rangeComparator) => { + return thisComparator.intersects(rangeComparator, options) + }) + }) + ) + }) + ) + }) + } + + // if ANY of the sets match ALL of its comparators, then pass + test (version) { + if (!version) { + return false + } + + if (typeof version === 'string') { + try { + version = new SemVer(version, this.options) + } catch (er) { + return false + } + } + + for (let i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version, this.options)) { + return true + } + } + return false + } +} + +module.exports = Range + +const LRU = require('../internal/lrucache') +const cache = new LRU() + +const parseOptions = require('../internal/parse-options') +const Comparator = require('./comparator') +const debug = require('../internal/debug') +const SemVer = require('./semver') +const { + safeRe: re, + t, + comparatorTrimReplace, + tildeTrimReplace, + caretTrimReplace, +} = require('../internal/re') +const { FLAG_INCLUDE_PRERELEASE, FLAG_LOOSE } = require('../internal/constants') + +const isNullSet = c => c.value === '<0.0.0-0' +const isAny = c => c.value === '' + +// take a set of comparators and determine whether there +// exists a version which can satisfy it +const isSatisfiable = (comparators, options) => { + let result = true + const remainingComparators = comparators.slice() + let testComparator = remainingComparators.pop() + + while (result && remainingComparators.length) { + result = remainingComparators.every((otherComparator) => { + return testComparator.intersects(otherComparator, options) + }) + + testComparator = remainingComparators.pop() + } + + return result +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +const parseComparator = (comp, options) => { + debug('comp', comp, options) + comp = replaceCarets(comp, options) + debug('caret', comp) + comp = replaceTildes(comp, options) + debug('tildes', comp) + comp = replaceXRanges(comp, options) + debug('xrange', comp) + comp = replaceStars(comp, options) + debug('stars', comp) + return comp +} + +const isX = id => !id || id.toLowerCase() === 'x' || id === '*' + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0-0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0-0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0-0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0-0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0-0 +// ~0.0.1 --> >=0.0.1 <0.1.0-0 +const replaceTildes = (comp, options) => { + return comp + .trim() + .split(/\s+/) + .map((c) => replaceTilde(c, options)) + .join(' ') +} + +const replaceTilde = (comp, options) => { + const r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE] + return comp.replace(r, (_, M, m, p, pr) => { + debug('tilde', comp, _, M, m, p, pr) + let ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = `>=${M}.0.0 <${+M + 1}.0.0-0` + } else if (isX(p)) { + // ~1.2 == >=1.2.0 <1.3.0-0 + ret = `>=${M}.${m}.0 <${M}.${+m + 1}.0-0` + } else if (pr) { + debug('replaceTilde pr', pr) + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${+m + 1}.0-0` + } else { + // ~1.2.3 == >=1.2.3 <1.3.0-0 + ret = `>=${M}.${m}.${p + } <${M}.${+m + 1}.0-0` + } + + debug('tilde return', ret) + return ret + }) +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0-0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0-0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0-0 +// ^1.2.3 --> >=1.2.3 <2.0.0-0 +// ^1.2.0 --> >=1.2.0 <2.0.0-0 +// ^0.0.1 --> >=0.0.1 <0.0.2-0 +// ^0.1.0 --> >=0.1.0 <0.2.0-0 +const replaceCarets = (comp, options) => { + return comp + .trim() + .split(/\s+/) + .map((c) => replaceCaret(c, options)) + .join(' ') +} + +const replaceCaret = (comp, options) => { + debug('caret', comp, options) + const r = options.loose ? re[t.CARETLOOSE] : re[t.CARET] + const z = options.includePrerelease ? '-0' : '' + return comp.replace(r, (_, M, m, p, pr) => { + debug('caret', comp, _, M, m, p, pr) + let ret + + if (isX(M)) { + ret = '' + } else if (isX(m)) { + ret = `>=${M}.0.0${z} <${+M + 1}.0.0-0` + } else if (isX(p)) { + if (M === '0') { + ret = `>=${M}.${m}.0${z} <${M}.${+m + 1}.0-0` + } else { + ret = `>=${M}.${m}.0${z} <${+M + 1}.0.0-0` + } + } else if (pr) { + debug('replaceCaret pr', pr) + if (M === '0') { + if (m === '0') { + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${m}.${+p + 1}-0` + } else { + ret = `>=${M}.${m}.${p}-${pr + } <${M}.${+m + 1}.0-0` + } + } else { + ret = `>=${M}.${m}.${p}-${pr + } <${+M + 1}.0.0-0` + } + } else { + debug('no pr') + if (M === '0') { + if (m === '0') { + ret = `>=${M}.${m}.${p + }${z} <${M}.${m}.${+p + 1}-0` + } else { + ret = `>=${M}.${m}.${p + }${z} <${M}.${+m + 1}.0-0` + } + } else { + ret = `>=${M}.${m}.${p + } <${+M + 1}.0.0-0` + } + } + + debug('caret return', ret) + return ret + }) +} + +const replaceXRanges = (comp, options) => { + debug('replaceXRanges', comp, options) + return comp + .split(/\s+/) + .map((c) => replaceXRange(c, options)) + .join(' ') +} + +const replaceXRange = (comp, options) => { + comp = comp.trim() + const r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE] + return comp.replace(r, (ret, gtlt, M, m, p, pr) => { + debug('xRange', comp, ret, gtlt, M, m, p, pr) + const xM = isX(M) + const xm = xM || isX(m) + const xp = xm || isX(p) + const anyX = xp + + if (gtlt === '=' && anyX) { + gtlt = '' + } + + // if we're including prereleases in the match, then we need + // to fix this to -0, the lowest possible prerelease value + pr = options.includePrerelease ? '-0' : '' + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0-0' + } else { + // nothing is forbidden + ret = '*' + } + } else if (gtlt && anyX) { + // we know patch is an x, because we have any x at all. + // replace X with 0 + if (xm) { + m = 0 + } + p = 0 + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + gtlt = '>=' + if (xm) { + M = +M + 1 + m = 0 + p = 0 + } else { + m = +m + 1 + p = 0 + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<' + if (xm) { + M = +M + 1 + } else { + m = +m + 1 + } + } + + if (gtlt === '<') { + pr = '-0' + } + + ret = `${gtlt + M}.${m}.${p}${pr}` + } else if (xm) { + ret = `>=${M}.0.0${pr} <${+M + 1}.0.0-0` + } else if (xp) { + ret = `>=${M}.${m}.0${pr + } <${M}.${+m + 1}.0-0` + } + + debug('xRange return', ret) + + return ret + }) +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +const replaceStars = (comp, options) => { + debug('replaceStars', comp, options) + // Looseness is ignored here. star is always as loose as it gets! + return comp + .trim() + .replace(re[t.STAR], '') +} + +const replaceGTE0 = (comp, options) => { + debug('replaceGTE0', comp, options) + return comp + .trim() + .replace(re[options.includePrerelease ? t.GTE0PRE : t.GTE0], '') +} + +// This function is passed to string.replace(re[t.HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0-0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0-0 +// TODO build? +const hyphenReplace = incPr => ($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr) => { + if (isX(fM)) { + from = '' + } else if (isX(fm)) { + from = `>=${fM}.0.0${incPr ? '-0' : ''}` + } else if (isX(fp)) { + from = `>=${fM}.${fm}.0${incPr ? '-0' : ''}` + } else if (fpr) { + from = `>=${from}` + } else { + from = `>=${from}${incPr ? '-0' : ''}` + } + + if (isX(tM)) { + to = '' + } else if (isX(tm)) { + to = `<${+tM + 1}.0.0-0` + } else if (isX(tp)) { + to = `<${tM}.${+tm + 1}.0-0` + } else if (tpr) { + to = `<=${tM}.${tm}.${tp}-${tpr}` + } else if (incPr) { + to = `<${tM}.${tm}.${+tp + 1}-0` + } else { + to = `<=${to}` + } + + return `${from} ${to}`.trim() +} + +const testSet = (set, version, options) => { + for (let i = 0; i < set.length; i++) { + if (!set[i].test(version)) { + return false + } + } + + if (version.prerelease.length && !options.includePrerelease) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (let i = 0; i < set.length; i++) { + debug(set[i].semver) + if (set[i].semver === Comparator.ANY) { + continue + } + + if (set[i].semver.prerelease.length > 0) { + const allowed = set[i].semver + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) { + return true + } + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false + } + + return true +} diff --git a/@capacitor/assets/node_modules/semver/classes/semver.js b/@capacitor/assets/node_modules/semver/classes/semver.js new file mode 100644 index 00000000..13e66ce4 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/classes/semver.js @@ -0,0 +1,302 @@ +const debug = require('../internal/debug') +const { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants') +const { safeRe: re, t } = require('../internal/re') + +const parseOptions = require('../internal/parse-options') +const { compareIdentifiers } = require('../internal/identifiers') +class SemVer { + constructor (version, options) { + options = parseOptions(options) + + if (version instanceof SemVer) { + if (version.loose === !!options.loose && + version.includePrerelease === !!options.includePrerelease) { + return version + } else { + version = version.version + } + } else if (typeof version !== 'string') { + throw new TypeError(`Invalid version. Must be a string. Got type "${typeof version}".`) + } + + if (version.length > MAX_LENGTH) { + throw new TypeError( + `version is longer than ${MAX_LENGTH} characters` + ) + } + + debug('SemVer', version, options) + this.options = options + this.loose = !!options.loose + // this isn't actually relevant for versions, but keep it so that we + // don't run into trouble passing this.options around. + this.includePrerelease = !!options.includePrerelease + + const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL]) + + if (!m) { + throw new TypeError(`Invalid Version: ${version}`) + } + + this.raw = version + + // these are actually numbers + this.major = +m[1] + this.minor = +m[2] + this.patch = +m[3] + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) { + throw new TypeError('Invalid major version') + } + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { + throw new TypeError('Invalid minor version') + } + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { + throw new TypeError('Invalid patch version') + } + + // numberify any prerelease numeric ids + if (!m[4]) { + this.prerelease = [] + } else { + this.prerelease = m[4].split('.').map((id) => { + if (/^[0-9]+$/.test(id)) { + const num = +id + if (num >= 0 && num < MAX_SAFE_INTEGER) { + return num + } + } + return id + }) + } + + this.build = m[5] ? m[5].split('.') : [] + this.format() + } + + format () { + this.version = `${this.major}.${this.minor}.${this.patch}` + if (this.prerelease.length) { + this.version += `-${this.prerelease.join('.')}` + } + return this.version + } + + toString () { + return this.version + } + + compare (other) { + debug('SemVer.compare', this.version, this.options, other) + if (!(other instanceof SemVer)) { + if (typeof other === 'string' && other === this.version) { + return 0 + } + other = new SemVer(other, this.options) + } + + if (other.version === this.version) { + return 0 + } + + return this.compareMain(other) || this.comparePre(other) + } + + compareMain (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + return ( + compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch) + ) + } + + comparePre (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) { + return -1 + } else if (!this.prerelease.length && other.prerelease.length) { + return 1 + } else if (!this.prerelease.length && !other.prerelease.length) { + return 0 + } + + let i = 0 + do { + const a = this.prerelease[i] + const b = other.prerelease[i] + debug('prerelease compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) + } + + compareBuild (other) { + if (!(other instanceof SemVer)) { + other = new SemVer(other, this.options) + } + + let i = 0 + do { + const a = this.build[i] + const b = other.build[i] + debug('build compare', i, a, b) + if (a === undefined && b === undefined) { + return 0 + } else if (b === undefined) { + return 1 + } else if (a === undefined) { + return -1 + } else if (a === b) { + continue + } else { + return compareIdentifiers(a, b) + } + } while (++i) + } + + // preminor will bump the version up to the next minor release, and immediately + // down to pre-release. premajor and prepatch work the same way. + inc (release, identifier, identifierBase) { + switch (release) { + case 'premajor': + this.prerelease.length = 0 + this.patch = 0 + this.minor = 0 + this.major++ + this.inc('pre', identifier, identifierBase) + break + case 'preminor': + this.prerelease.length = 0 + this.patch = 0 + this.minor++ + this.inc('pre', identifier, identifierBase) + break + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0 + this.inc('patch', identifier, identifierBase) + this.inc('pre', identifier, identifierBase) + break + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) { + this.inc('patch', identifier, identifierBase) + } + this.inc('pre', identifier, identifierBase) + break + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if ( + this.minor !== 0 || + this.patch !== 0 || + this.prerelease.length === 0 + ) { + this.major++ + } + this.minor = 0 + this.patch = 0 + this.prerelease = [] + break + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) { + this.minor++ + } + this.patch = 0 + this.prerelease = [] + break + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) { + this.patch++ + } + this.prerelease = [] + break + // This probably shouldn't be used publicly. + // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction. + case 'pre': { + const base = Number(identifierBase) ? 1 : 0 + + if (!identifier && identifierBase === false) { + throw new Error('invalid increment argument: identifier is empty') + } + + if (this.prerelease.length === 0) { + this.prerelease = [base] + } else { + let i = this.prerelease.length + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++ + i = -2 + } + } + if (i === -1) { + // didn't increment anything + if (identifier === this.prerelease.join('.') && identifierBase === false) { + throw new Error('invalid increment argument: identifier already exists') + } + this.prerelease.push(base) + } + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + let prerelease = [identifier, base] + if (identifierBase === false) { + prerelease = [identifier] + } + if (compareIdentifiers(this.prerelease[0], identifier) === 0) { + if (isNaN(this.prerelease[1])) { + this.prerelease = prerelease + } + } else { + this.prerelease = prerelease + } + } + break + } + default: + throw new Error(`invalid increment argument: ${release}`) + } + this.raw = this.format() + if (this.build.length) { + this.raw += `+${this.build.join('.')}` + } + return this + } +} + +module.exports = SemVer diff --git a/@capacitor/assets/node_modules/semver/functions/clean.js b/@capacitor/assets/node_modules/semver/functions/clean.js new file mode 100644 index 00000000..811fe6b8 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/clean.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const clean = (version, options) => { + const s = parse(version.trim().replace(/^[=v]+/, ''), options) + return s ? s.version : null +} +module.exports = clean diff --git a/@capacitor/assets/node_modules/semver/functions/cmp.js b/@capacitor/assets/node_modules/semver/functions/cmp.js new file mode 100644 index 00000000..40119094 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/cmp.js @@ -0,0 +1,52 @@ +const eq = require('./eq') +const neq = require('./neq') +const gt = require('./gt') +const gte = require('./gte') +const lt = require('./lt') +const lte = require('./lte') + +const cmp = (a, op, b, loose) => { + switch (op) { + case '===': + if (typeof a === 'object') { + a = a.version + } + if (typeof b === 'object') { + b = b.version + } + return a === b + + case '!==': + if (typeof a === 'object') { + a = a.version + } + if (typeof b === 'object') { + b = b.version + } + return a !== b + + case '': + case '=': + case '==': + return eq(a, b, loose) + + case '!=': + return neq(a, b, loose) + + case '>': + return gt(a, b, loose) + + case '>=': + return gte(a, b, loose) + + case '<': + return lt(a, b, loose) + + case '<=': + return lte(a, b, loose) + + default: + throw new TypeError(`Invalid operator: ${op}`) + } +} +module.exports = cmp diff --git a/@capacitor/assets/node_modules/semver/functions/coerce.js b/@capacitor/assets/node_modules/semver/functions/coerce.js new file mode 100644 index 00000000..b378dcea --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/coerce.js @@ -0,0 +1,60 @@ +const SemVer = require('../classes/semver') +const parse = require('./parse') +const { safeRe: re, t } = require('../internal/re') + +const coerce = (version, options) => { + if (version instanceof SemVer) { + return version + } + + if (typeof version === 'number') { + version = String(version) + } + + if (typeof version !== 'string') { + return null + } + + options = options || {} + + let match = null + if (!options.rtl) { + match = version.match(options.includePrerelease ? re[t.COERCEFULL] : re[t.COERCE]) + } else { + // Find the right-most coercible string that does not share + // a terminus with a more left-ward coercible string. + // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4' + // With includePrerelease option set, '1.2.3.4-rc' wants to coerce '2.3.4-rc', not '2.3.4' + // + // Walk through the string checking with a /g regexp + // Manually set the index so as to pick up overlapping matches. + // Stop when we get a match that ends at the string end, since no + // coercible string can be more right-ward without the same terminus. + const coerceRtlRegex = options.includePrerelease ? re[t.COERCERTLFULL] : re[t.COERCERTL] + let next + while ((next = coerceRtlRegex.exec(version)) && + (!match || match.index + match[0].length !== version.length) + ) { + if (!match || + next.index + next[0].length !== match.index + match[0].length) { + match = next + } + coerceRtlRegex.lastIndex = next.index + next[1].length + next[2].length + } + // leave it in a clean state + coerceRtlRegex.lastIndex = -1 + } + + if (match === null) { + return null + } + + const major = match[2] + const minor = match[3] || '0' + const patch = match[4] || '0' + const prerelease = options.includePrerelease && match[5] ? `-${match[5]}` : '' + const build = options.includePrerelease && match[6] ? `+${match[6]}` : '' + + return parse(`${major}.${minor}.${patch}${prerelease}${build}`, options) +} +module.exports = coerce diff --git a/@capacitor/assets/node_modules/semver/functions/compare-build.js b/@capacitor/assets/node_modules/semver/functions/compare-build.js new file mode 100644 index 00000000..9eb881be --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/compare-build.js @@ -0,0 +1,7 @@ +const SemVer = require('../classes/semver') +const compareBuild = (a, b, loose) => { + const versionA = new SemVer(a, loose) + const versionB = new SemVer(b, loose) + return versionA.compare(versionB) || versionA.compareBuild(versionB) +} +module.exports = compareBuild diff --git a/@capacitor/assets/node_modules/semver/functions/compare-loose.js b/@capacitor/assets/node_modules/semver/functions/compare-loose.js new file mode 100644 index 00000000..4881fbe0 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/compare-loose.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const compareLoose = (a, b) => compare(a, b, true) +module.exports = compareLoose diff --git a/@capacitor/assets/node_modules/semver/functions/compare.js b/@capacitor/assets/node_modules/semver/functions/compare.js new file mode 100644 index 00000000..748b7afa --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/compare.js @@ -0,0 +1,5 @@ +const SemVer = require('../classes/semver') +const compare = (a, b, loose) => + new SemVer(a, loose).compare(new SemVer(b, loose)) + +module.exports = compare diff --git a/@capacitor/assets/node_modules/semver/functions/diff.js b/@capacitor/assets/node_modules/semver/functions/diff.js new file mode 100644 index 00000000..fc224e30 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/diff.js @@ -0,0 +1,65 @@ +const parse = require('./parse.js') + +const diff = (version1, version2) => { + const v1 = parse(version1, null, true) + const v2 = parse(version2, null, true) + const comparison = v1.compare(v2) + + if (comparison === 0) { + return null + } + + const v1Higher = comparison > 0 + const highVersion = v1Higher ? v1 : v2 + const lowVersion = v1Higher ? v2 : v1 + const highHasPre = !!highVersion.prerelease.length + const lowHasPre = !!lowVersion.prerelease.length + + if (lowHasPre && !highHasPre) { + // Going from prerelease -> no prerelease requires some special casing + + // If the low version has only a major, then it will always be a major + // Some examples: + // 1.0.0-1 -> 1.0.0 + // 1.0.0-1 -> 1.1.1 + // 1.0.0-1 -> 2.0.0 + if (!lowVersion.patch && !lowVersion.minor) { + return 'major' + } + + // Otherwise it can be determined by checking the high version + + if (highVersion.patch) { + // anything higher than a patch bump would result in the wrong version + return 'patch' + } + + if (highVersion.minor) { + // anything higher than a minor bump would result in the wrong version + return 'minor' + } + + // bumping major/minor/patch all have same result + return 'major' + } + + // add the `pre` prefix if we are going to a prerelease version + const prefix = highHasPre ? 'pre' : '' + + if (v1.major !== v2.major) { + return prefix + 'major' + } + + if (v1.minor !== v2.minor) { + return prefix + 'minor' + } + + if (v1.patch !== v2.patch) { + return prefix + 'patch' + } + + // high and low are preleases + return 'prerelease' +} + +module.exports = diff diff --git a/@capacitor/assets/node_modules/semver/functions/eq.js b/@capacitor/assets/node_modules/semver/functions/eq.js new file mode 100644 index 00000000..271fed97 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/eq.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const eq = (a, b, loose) => compare(a, b, loose) === 0 +module.exports = eq diff --git a/@capacitor/assets/node_modules/semver/functions/gt.js b/@capacitor/assets/node_modules/semver/functions/gt.js new file mode 100644 index 00000000..d9b2156d --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/gt.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const gt = (a, b, loose) => compare(a, b, loose) > 0 +module.exports = gt diff --git a/@capacitor/assets/node_modules/semver/functions/gte.js b/@capacitor/assets/node_modules/semver/functions/gte.js new file mode 100644 index 00000000..5aeaa634 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/gte.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const gte = (a, b, loose) => compare(a, b, loose) >= 0 +module.exports = gte diff --git a/@capacitor/assets/node_modules/semver/functions/inc.js b/@capacitor/assets/node_modules/semver/functions/inc.js new file mode 100644 index 00000000..7670b1be --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/inc.js @@ -0,0 +1,19 @@ +const SemVer = require('../classes/semver') + +const inc = (version, release, options, identifier, identifierBase) => { + if (typeof (options) === 'string') { + identifierBase = identifier + identifier = options + options = undefined + } + + try { + return new SemVer( + version instanceof SemVer ? version.version : version, + options + ).inc(release, identifier, identifierBase).version + } catch (er) { + return null + } +} +module.exports = inc diff --git a/@capacitor/assets/node_modules/semver/functions/lt.js b/@capacitor/assets/node_modules/semver/functions/lt.js new file mode 100644 index 00000000..b440ab7d --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/lt.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const lt = (a, b, loose) => compare(a, b, loose) < 0 +module.exports = lt diff --git a/@capacitor/assets/node_modules/semver/functions/lte.js b/@capacitor/assets/node_modules/semver/functions/lte.js new file mode 100644 index 00000000..6dcc9565 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/lte.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const lte = (a, b, loose) => compare(a, b, loose) <= 0 +module.exports = lte diff --git a/@capacitor/assets/node_modules/semver/functions/major.js b/@capacitor/assets/node_modules/semver/functions/major.js new file mode 100644 index 00000000..4283165e --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/major.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const major = (a, loose) => new SemVer(a, loose).major +module.exports = major diff --git a/@capacitor/assets/node_modules/semver/functions/minor.js b/@capacitor/assets/node_modules/semver/functions/minor.js new file mode 100644 index 00000000..57b3455f --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/minor.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const minor = (a, loose) => new SemVer(a, loose).minor +module.exports = minor diff --git a/@capacitor/assets/node_modules/semver/functions/neq.js b/@capacitor/assets/node_modules/semver/functions/neq.js new file mode 100644 index 00000000..f944c015 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/neq.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const neq = (a, b, loose) => compare(a, b, loose) !== 0 +module.exports = neq diff --git a/@capacitor/assets/node_modules/semver/functions/parse.js b/@capacitor/assets/node_modules/semver/functions/parse.js new file mode 100644 index 00000000..459b3b17 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/parse.js @@ -0,0 +1,16 @@ +const SemVer = require('../classes/semver') +const parse = (version, options, throwErrors = false) => { + if (version instanceof SemVer) { + return version + } + try { + return new SemVer(version, options) + } catch (er) { + if (!throwErrors) { + return null + } + throw er + } +} + +module.exports = parse diff --git a/@capacitor/assets/node_modules/semver/functions/patch.js b/@capacitor/assets/node_modules/semver/functions/patch.js new file mode 100644 index 00000000..63afca25 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/patch.js @@ -0,0 +1,3 @@ +const SemVer = require('../classes/semver') +const patch = (a, loose) => new SemVer(a, loose).patch +module.exports = patch diff --git a/@capacitor/assets/node_modules/semver/functions/prerelease.js b/@capacitor/assets/node_modules/semver/functions/prerelease.js new file mode 100644 index 00000000..06aa1324 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/prerelease.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const prerelease = (version, options) => { + const parsed = parse(version, options) + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null +} +module.exports = prerelease diff --git a/@capacitor/assets/node_modules/semver/functions/rcompare.js b/@capacitor/assets/node_modules/semver/functions/rcompare.js new file mode 100644 index 00000000..0ac509e7 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/rcompare.js @@ -0,0 +1,3 @@ +const compare = require('./compare') +const rcompare = (a, b, loose) => compare(b, a, loose) +module.exports = rcompare diff --git a/@capacitor/assets/node_modules/semver/functions/rsort.js b/@capacitor/assets/node_modules/semver/functions/rsort.js new file mode 100644 index 00000000..82404c5c --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/rsort.js @@ -0,0 +1,3 @@ +const compareBuild = require('./compare-build') +const rsort = (list, loose) => list.sort((a, b) => compareBuild(b, a, loose)) +module.exports = rsort diff --git a/@capacitor/assets/node_modules/semver/functions/satisfies.js b/@capacitor/assets/node_modules/semver/functions/satisfies.js new file mode 100644 index 00000000..50af1c19 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/satisfies.js @@ -0,0 +1,10 @@ +const Range = require('../classes/range') +const satisfies = (version, range, options) => { + try { + range = new Range(range, options) + } catch (er) { + return false + } + return range.test(version) +} +module.exports = satisfies diff --git a/@capacitor/assets/node_modules/semver/functions/sort.js b/@capacitor/assets/node_modules/semver/functions/sort.js new file mode 100644 index 00000000..4d10917a --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/sort.js @@ -0,0 +1,3 @@ +const compareBuild = require('./compare-build') +const sort = (list, loose) => list.sort((a, b) => compareBuild(a, b, loose)) +module.exports = sort diff --git a/@capacitor/assets/node_modules/semver/functions/valid.js b/@capacitor/assets/node_modules/semver/functions/valid.js new file mode 100644 index 00000000..f27bae10 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/functions/valid.js @@ -0,0 +1,6 @@ +const parse = require('./parse') +const valid = (version, options) => { + const v = parse(version, options) + return v ? v.version : null +} +module.exports = valid diff --git a/@capacitor/assets/node_modules/semver/index.js b/@capacitor/assets/node_modules/semver/index.js new file mode 100644 index 00000000..86d42ac1 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/index.js @@ -0,0 +1,89 @@ +// just pre-load all the stuff that index.js lazily exports +const internalRe = require('./internal/re') +const constants = require('./internal/constants') +const SemVer = require('./classes/semver') +const identifiers = require('./internal/identifiers') +const parse = require('./functions/parse') +const valid = require('./functions/valid') +const clean = require('./functions/clean') +const inc = require('./functions/inc') +const diff = require('./functions/diff') +const major = require('./functions/major') +const minor = require('./functions/minor') +const patch = require('./functions/patch') +const prerelease = require('./functions/prerelease') +const compare = require('./functions/compare') +const rcompare = require('./functions/rcompare') +const compareLoose = require('./functions/compare-loose') +const compareBuild = require('./functions/compare-build') +const sort = require('./functions/sort') +const rsort = require('./functions/rsort') +const gt = require('./functions/gt') +const lt = require('./functions/lt') +const eq = require('./functions/eq') +const neq = require('./functions/neq') +const gte = require('./functions/gte') +const lte = require('./functions/lte') +const cmp = require('./functions/cmp') +const coerce = require('./functions/coerce') +const Comparator = require('./classes/comparator') +const Range = require('./classes/range') +const satisfies = require('./functions/satisfies') +const toComparators = require('./ranges/to-comparators') +const maxSatisfying = require('./ranges/max-satisfying') +const minSatisfying = require('./ranges/min-satisfying') +const minVersion = require('./ranges/min-version') +const validRange = require('./ranges/valid') +const outside = require('./ranges/outside') +const gtr = require('./ranges/gtr') +const ltr = require('./ranges/ltr') +const intersects = require('./ranges/intersects') +const simplifyRange = require('./ranges/simplify') +const subset = require('./ranges/subset') +module.exports = { + parse, + valid, + clean, + inc, + diff, + major, + minor, + patch, + prerelease, + compare, + rcompare, + compareLoose, + compareBuild, + sort, + rsort, + gt, + lt, + eq, + neq, + gte, + lte, + cmp, + coerce, + Comparator, + Range, + satisfies, + toComparators, + maxSatisfying, + minSatisfying, + minVersion, + validRange, + outside, + gtr, + ltr, + intersects, + simplifyRange, + subset, + SemVer, + re: internalRe.re, + src: internalRe.src, + tokens: internalRe.t, + SEMVER_SPEC_VERSION: constants.SEMVER_SPEC_VERSION, + RELEASE_TYPES: constants.RELEASE_TYPES, + compareIdentifiers: identifiers.compareIdentifiers, + rcompareIdentifiers: identifiers.rcompareIdentifiers, +} diff --git a/@capacitor/assets/node_modules/semver/internal/constants.js b/@capacitor/assets/node_modules/semver/internal/constants.js new file mode 100644 index 00000000..94be1c57 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/internal/constants.js @@ -0,0 +1,35 @@ +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +const SEMVER_SPEC_VERSION = '2.0.0' + +const MAX_LENGTH = 256 +const MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || +/* istanbul ignore next */ 9007199254740991 + +// Max safe segment length for coercion. +const MAX_SAFE_COMPONENT_LENGTH = 16 + +// Max safe length for a build identifier. The max length minus 6 characters for +// the shortest version with a build 0.0.0+BUILD. +const MAX_SAFE_BUILD_LENGTH = MAX_LENGTH - 6 + +const RELEASE_TYPES = [ + 'major', + 'premajor', + 'minor', + 'preminor', + 'patch', + 'prepatch', + 'prerelease', +] + +module.exports = { + MAX_LENGTH, + MAX_SAFE_COMPONENT_LENGTH, + MAX_SAFE_BUILD_LENGTH, + MAX_SAFE_INTEGER, + RELEASE_TYPES, + SEMVER_SPEC_VERSION, + FLAG_INCLUDE_PRERELEASE: 0b001, + FLAG_LOOSE: 0b010, +} diff --git a/@capacitor/assets/node_modules/semver/internal/debug.js b/@capacitor/assets/node_modules/semver/internal/debug.js new file mode 100644 index 00000000..1c00e136 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/internal/debug.js @@ -0,0 +1,9 @@ +const debug = ( + typeof process === 'object' && + process.env && + process.env.NODE_DEBUG && + /\bsemver\b/i.test(process.env.NODE_DEBUG) +) ? (...args) => console.error('SEMVER', ...args) + : () => {} + +module.exports = debug diff --git a/@capacitor/assets/node_modules/semver/internal/identifiers.js b/@capacitor/assets/node_modules/semver/internal/identifiers.js new file mode 100644 index 00000000..e612d0a3 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/internal/identifiers.js @@ -0,0 +1,23 @@ +const numeric = /^[0-9]+$/ +const compareIdentifiers = (a, b) => { + const anum = numeric.test(a) + const bnum = numeric.test(b) + + if (anum && bnum) { + a = +a + b = +b + } + + return a === b ? 0 + : (anum && !bnum) ? -1 + : (bnum && !anum) ? 1 + : a < b ? -1 + : 1 +} + +const rcompareIdentifiers = (a, b) => compareIdentifiers(b, a) + +module.exports = { + compareIdentifiers, + rcompareIdentifiers, +} diff --git a/@capacitor/assets/node_modules/semver/internal/lrucache.js b/@capacitor/assets/node_modules/semver/internal/lrucache.js new file mode 100644 index 00000000..6d89ec94 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/internal/lrucache.js @@ -0,0 +1,40 @@ +class LRUCache { + constructor () { + this.max = 1000 + this.map = new Map() + } + + get (key) { + const value = this.map.get(key) + if (value === undefined) { + return undefined + } else { + // Remove the key from the map and add it to the end + this.map.delete(key) + this.map.set(key, value) + return value + } + } + + delete (key) { + return this.map.delete(key) + } + + set (key, value) { + const deleted = this.delete(key) + + if (!deleted && value !== undefined) { + // If cache is full, delete the least recently used item + if (this.map.size >= this.max) { + const firstKey = this.map.keys().next().value + this.delete(firstKey) + } + + this.map.set(key, value) + } + + return this + } +} + +module.exports = LRUCache diff --git a/@capacitor/assets/node_modules/semver/internal/parse-options.js b/@capacitor/assets/node_modules/semver/internal/parse-options.js new file mode 100644 index 00000000..10d64ce0 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/internal/parse-options.js @@ -0,0 +1,15 @@ +// parse out just the options we care about +const looseOption = Object.freeze({ loose: true }) +const emptyOpts = Object.freeze({ }) +const parseOptions = options => { + if (!options) { + return emptyOpts + } + + if (typeof options !== 'object') { + return looseOption + } + + return options +} +module.exports = parseOptions diff --git a/@capacitor/assets/node_modules/semver/internal/re.js b/@capacitor/assets/node_modules/semver/internal/re.js new file mode 100644 index 00000000..fd8920e7 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/internal/re.js @@ -0,0 +1,217 @@ +const { + MAX_SAFE_COMPONENT_LENGTH, + MAX_SAFE_BUILD_LENGTH, + MAX_LENGTH, +} = require('./constants') +const debug = require('./debug') +exports = module.exports = {} + +// The actual regexps go on exports.re +const re = exports.re = [] +const safeRe = exports.safeRe = [] +const src = exports.src = [] +const t = exports.t = {} +let R = 0 + +const LETTERDASHNUMBER = '[a-zA-Z0-9-]' + +// Replace some greedy regex tokens to prevent regex dos issues. These regex are +// used internally via the safeRe object since all inputs in this library get +// normalized first to trim and collapse all extra whitespace. The original +// regexes are exported for userland consumption and lower level usage. A +// future breaking change could export the safer regex only with a note that +// all input should have extra whitespace removed. +const safeRegexReplacements = [ + ['\\s', 1], + ['\\d', MAX_LENGTH], + [LETTERDASHNUMBER, MAX_SAFE_BUILD_LENGTH], +] + +const makeSafeRegex = (value) => { + for (const [token, max] of safeRegexReplacements) { + value = value + .split(`${token}*`).join(`${token}{0,${max}}`) + .split(`${token}+`).join(`${token}{1,${max}}`) + } + return value +} + +const createToken = (name, value, isGlobal) => { + const safe = makeSafeRegex(value) + const index = R++ + debug(name, index, value) + t[name] = index + src[index] = value + re[index] = new RegExp(value, isGlobal ? 'g' : undefined) + safeRe[index] = new RegExp(safe, isGlobal ? 'g' : undefined) +} + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +createToken('NUMERICIDENTIFIER', '0|[1-9]\\d*') +createToken('NUMERICIDENTIFIERLOOSE', '\\d+') + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +createToken('NONNUMERICIDENTIFIER', `\\d*[a-zA-Z-]${LETTERDASHNUMBER}*`) + +// ## Main Version +// Three dot-separated numeric identifiers. + +createToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\.` + + `(${src[t.NUMERICIDENTIFIER]})\\.` + + `(${src[t.NUMERICIDENTIFIER]})`) + +createToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + + `(${src[t.NUMERICIDENTIFIERLOOSE]})\\.` + + `(${src[t.NUMERICIDENTIFIERLOOSE]})`) + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +createToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER] +}|${src[t.NONNUMERICIDENTIFIER]})`) + +createToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE] +}|${src[t.NONNUMERICIDENTIFIER]})`) + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +createToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER] +}(?:\\.${src[t.PRERELEASEIDENTIFIER]})*))`) + +createToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE] +}(?:\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`) + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +createToken('BUILDIDENTIFIER', `${LETTERDASHNUMBER}+`) + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +createToken('BUILD', `(?:\\+(${src[t.BUILDIDENTIFIER] +}(?:\\.${src[t.BUILDIDENTIFIER]})*))`) + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +createToken('FULLPLAIN', `v?${src[t.MAINVERSION] +}${src[t.PRERELEASE]}?${ + src[t.BUILD]}?`) + +createToken('FULL', `^${src[t.FULLPLAIN]}$`) + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +createToken('LOOSEPLAIN', `[v=\\s]*${src[t.MAINVERSIONLOOSE] +}${src[t.PRERELEASELOOSE]}?${ + src[t.BUILD]}?`) + +createToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`) + +createToken('GTLT', '((?:<|>)?=?)') + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +createToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`) +createToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\*`) + +createToken('XRANGEPLAIN', `[v=\\s]*(${src[t.XRANGEIDENTIFIER]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIER]})` + + `(?:${src[t.PRERELEASE]})?${ + src[t.BUILD]}?` + + `)?)?`) + +createToken('XRANGEPLAINLOOSE', `[v=\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` + + `(?:${src[t.PRERELEASELOOSE]})?${ + src[t.BUILD]}?` + + `)?)?`) + +createToken('XRANGE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAIN]}$`) +createToken('XRANGELOOSE', `^${src[t.GTLT]}\\s*${src[t.XRANGEPLAINLOOSE]}$`) + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +createToken('COERCEPLAIN', `${'(^|[^\\d])' + + '(\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` + + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` + + `(?:\\.(\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?`) +createToken('COERCE', `${src[t.COERCEPLAIN]}(?:$|[^\\d])`) +createToken('COERCEFULL', src[t.COERCEPLAIN] + + `(?:${src[t.PRERELEASE]})?` + + `(?:${src[t.BUILD]})?` + + `(?:$|[^\\d])`) +createToken('COERCERTL', src[t.COERCE], true) +createToken('COERCERTLFULL', src[t.COERCEFULL], true) + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +createToken('LONETILDE', '(?:~>?)') + +createToken('TILDETRIM', `(\\s*)${src[t.LONETILDE]}\\s+`, true) +exports.tildeTrimReplace = '$1~' + +createToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`) +createToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`) + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +createToken('LONECARET', '(?:\\^)') + +createToken('CARETTRIM', `(\\s*)${src[t.LONECARET]}\\s+`, true) +exports.caretTrimReplace = '$1^' + +createToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`) +createToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`) + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +createToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\s*(${src[t.LOOSEPLAIN]})$|^$`) +createToken('COMPARATOR', `^${src[t.GTLT]}\\s*(${src[t.FULLPLAIN]})$|^$`) + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +createToken('COMPARATORTRIM', `(\\s*)${src[t.GTLT] +}\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true) +exports.comparatorTrimReplace = '$1$2$3' + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +createToken('HYPHENRANGE', `^\\s*(${src[t.XRANGEPLAIN]})` + + `\\s+-\\s+` + + `(${src[t.XRANGEPLAIN]})` + + `\\s*$`) + +createToken('HYPHENRANGELOOSE', `^\\s*(${src[t.XRANGEPLAINLOOSE]})` + + `\\s+-\\s+` + + `(${src[t.XRANGEPLAINLOOSE]})` + + `\\s*$`) + +// Star ranges basically just allow anything at all. +createToken('STAR', '(<|>)?=?\\s*\\*') +// >=0.0.0 is like a star +createToken('GTE0', '^\\s*>=\\s*0\\.0\\.0\\s*$') +createToken('GTE0PRE', '^\\s*>=\\s*0\\.0\\.0-0\\s*$') diff --git a/@capacitor/assets/node_modules/semver/package.json b/@capacitor/assets/node_modules/semver/package.json new file mode 100644 index 00000000..663d3701 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/package.json @@ -0,0 +1,77 @@ +{ + "name": "semver", + "version": "7.6.3", + "description": "The semantic version parser used by npm.", + "main": "index.js", + "scripts": { + "test": "tap", + "snap": "tap", + "lint": "eslint \"**/*.{js,cjs,ts,mjs,jsx,tsx}\"", + "postlint": "template-oss-check", + "lintfix": "npm run lint -- --fix", + "posttest": "npm run lint", + "template-oss-apply": "template-oss-apply --force" + }, + "devDependencies": { + "@npmcli/eslint-config": "^4.0.0", + "@npmcli/template-oss": "4.22.0", + "benchmark": "^2.1.4", + "tap": "^16.0.0" + }, + "license": "ISC", + "repository": { + "type": "git", + "url": "git+https://github.com/npm/node-semver.git" + }, + "bin": { + "semver": "bin/semver.js" + }, + "files": [ + "bin/", + "lib/", + "classes/", + "functions/", + "internal/", + "ranges/", + "index.js", + "preload.js", + "range.bnf" + ], + "tap": { + "timeout": 30, + "coverage-map": "map.js", + "nyc-arg": [ + "--exclude", + "tap-snapshots/**" + ] + }, + "engines": { + "node": ">=10" + }, + "author": "GitHub Inc.", + "templateOSS": { + "//@npmcli/template-oss": "This file is partially managed by @npmcli/template-oss. Edits may be overwritten.", + "version": "4.22.0", + "engines": ">=10", + "distPaths": [ + "classes/", + "functions/", + "internal/", + "ranges/", + "index.js", + "preload.js", + "range.bnf" + ], + "allowPaths": [ + "/classes/", + "/functions/", + "/internal/", + "/ranges/", + "/index.js", + "/preload.js", + "/range.bnf", + "/benchmarks" + ], + "publish": "true" + } +} diff --git a/@capacitor/assets/node_modules/semver/preload.js b/@capacitor/assets/node_modules/semver/preload.js new file mode 100644 index 00000000..947cd4f7 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/preload.js @@ -0,0 +1,2 @@ +// XXX remove in v8 or beyond +module.exports = require('./index.js') diff --git a/@capacitor/assets/node_modules/semver/range.bnf b/@capacitor/assets/node_modules/semver/range.bnf new file mode 100644 index 00000000..d4c6ae0d --- /dev/null +++ b/@capacitor/assets/node_modules/semver/range.bnf @@ -0,0 +1,16 @@ +range-set ::= range ( logical-or range ) * +logical-or ::= ( ' ' ) * '||' ( ' ' ) * +range ::= hyphen | simple ( ' ' simple ) * | '' +hyphen ::= partial ' - ' partial +simple ::= primitive | partial | tilde | caret +primitive ::= ( '<' | '>' | '>=' | '<=' | '=' ) partial +partial ::= xr ( '.' xr ( '.' xr qualifier ? )? )? +xr ::= 'x' | 'X' | '*' | nr +nr ::= '0' | [1-9] ( [0-9] ) * +tilde ::= '~' partial +caret ::= '^' partial +qualifier ::= ( '-' pre )? ( '+' build )? +pre ::= parts +build ::= parts +parts ::= part ( '.' part ) * +part ::= nr | [-0-9A-Za-z]+ diff --git a/@capacitor/assets/node_modules/semver/ranges/gtr.js b/@capacitor/assets/node_modules/semver/ranges/gtr.js new file mode 100644 index 00000000..db7e3559 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/gtr.js @@ -0,0 +1,4 @@ +// Determine if version is greater than all the versions possible in the range. +const outside = require('./outside') +const gtr = (version, range, options) => outside(version, range, '>', options) +module.exports = gtr diff --git a/@capacitor/assets/node_modules/semver/ranges/intersects.js b/@capacitor/assets/node_modules/semver/ranges/intersects.js new file mode 100644 index 00000000..e0e9b7ce --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/intersects.js @@ -0,0 +1,7 @@ +const Range = require('../classes/range') +const intersects = (r1, r2, options) => { + r1 = new Range(r1, options) + r2 = new Range(r2, options) + return r1.intersects(r2, options) +} +module.exports = intersects diff --git a/@capacitor/assets/node_modules/semver/ranges/ltr.js b/@capacitor/assets/node_modules/semver/ranges/ltr.js new file mode 100644 index 00000000..528a885e --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/ltr.js @@ -0,0 +1,4 @@ +const outside = require('./outside') +// Determine if version is less than all the versions possible in the range +const ltr = (version, range, options) => outside(version, range, '<', options) +module.exports = ltr diff --git a/@capacitor/assets/node_modules/semver/ranges/max-satisfying.js b/@capacitor/assets/node_modules/semver/ranges/max-satisfying.js new file mode 100644 index 00000000..6e3d993c --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/max-satisfying.js @@ -0,0 +1,25 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') + +const maxSatisfying = (versions, range, options) => { + let max = null + let maxSV = null + let rangeObj = null + try { + rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!max || maxSV.compare(v) === -1) { + // compare(max, v, true) + max = v + maxSV = new SemVer(max, options) + } + } + }) + return max +} +module.exports = maxSatisfying diff --git a/@capacitor/assets/node_modules/semver/ranges/min-satisfying.js b/@capacitor/assets/node_modules/semver/ranges/min-satisfying.js new file mode 100644 index 00000000..9b60974e --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/min-satisfying.js @@ -0,0 +1,24 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') +const minSatisfying = (versions, range, options) => { + let min = null + let minSV = null + let rangeObj = null + try { + rangeObj = new Range(range, options) + } catch (er) { + return null + } + versions.forEach((v) => { + if (rangeObj.test(v)) { + // satisfies(v, range, options) + if (!min || minSV.compare(v) === 1) { + // compare(min, v, true) + min = v + minSV = new SemVer(min, options) + } + } + }) + return min +} +module.exports = minSatisfying diff --git a/@capacitor/assets/node_modules/semver/ranges/min-version.js b/@capacitor/assets/node_modules/semver/ranges/min-version.js new file mode 100644 index 00000000..350e1f78 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/min-version.js @@ -0,0 +1,61 @@ +const SemVer = require('../classes/semver') +const Range = require('../classes/range') +const gt = require('../functions/gt') + +const minVersion = (range, loose) => { + range = new Range(range, loose) + + let minver = new SemVer('0.0.0') + if (range.test(minver)) { + return minver + } + + minver = new SemVer('0.0.0-0') + if (range.test(minver)) { + return minver + } + + minver = null + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i] + + let setMin = null + comparators.forEach((comparator) => { + // Clone to avoid manipulating the comparator's semver object. + const compver = new SemVer(comparator.semver.version) + switch (comparator.operator) { + case '>': + if (compver.prerelease.length === 0) { + compver.patch++ + } else { + compver.prerelease.push(0) + } + compver.raw = compver.format() + /* fallthrough */ + case '': + case '>=': + if (!setMin || gt(compver, setMin)) { + setMin = compver + } + break + case '<': + case '<=': + /* Ignore maximum versions */ + break + /* istanbul ignore next */ + default: + throw new Error(`Unexpected operation: ${comparator.operator}`) + } + }) + if (setMin && (!minver || gt(minver, setMin))) { + minver = setMin + } + } + + if (minver && range.test(minver)) { + return minver + } + + return null +} +module.exports = minVersion diff --git a/@capacitor/assets/node_modules/semver/ranges/outside.js b/@capacitor/assets/node_modules/semver/ranges/outside.js new file mode 100644 index 00000000..ae99b10a --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/outside.js @@ -0,0 +1,80 @@ +const SemVer = require('../classes/semver') +const Comparator = require('../classes/comparator') +const { ANY } = Comparator +const Range = require('../classes/range') +const satisfies = require('../functions/satisfies') +const gt = require('../functions/gt') +const lt = require('../functions/lt') +const lte = require('../functions/lte') +const gte = require('../functions/gte') + +const outside = (version, range, hilo, options) => { + version = new SemVer(version, options) + range = new Range(range, options) + + let gtfn, ltefn, ltfn, comp, ecomp + switch (hilo) { + case '>': + gtfn = gt + ltefn = lte + ltfn = lt + comp = '>' + ecomp = '>=' + break + case '<': + gtfn = lt + ltefn = gte + ltfn = gt + comp = '<' + ecomp = '<=' + break + default: + throw new TypeError('Must provide a hilo val of "<" or ">"') + } + + // If it satisfies the range it is not outside + if (satisfies(version, range, options)) { + return false + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (let i = 0; i < range.set.length; ++i) { + const comparators = range.set[i] + + let high = null + let low = null + + comparators.forEach((comparator) => { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator + low = low || comparator + if (gtfn(comparator.semver, high.semver, options)) { + high = comparator + } else if (ltfn(comparator.semver, low.semver, options)) { + low = comparator + } + }) + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false + } + } + return true +} + +module.exports = outside diff --git a/@capacitor/assets/node_modules/semver/ranges/simplify.js b/@capacitor/assets/node_modules/semver/ranges/simplify.js new file mode 100644 index 00000000..618d5b62 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/simplify.js @@ -0,0 +1,47 @@ +// given a set of versions and a range, create a "simplified" range +// that includes the same versions that the original range does +// If the original range is shorter than the simplified one, return that. +const satisfies = require('../functions/satisfies.js') +const compare = require('../functions/compare.js') +module.exports = (versions, range, options) => { + const set = [] + let first = null + let prev = null + const v = versions.sort((a, b) => compare(a, b, options)) + for (const version of v) { + const included = satisfies(version, range, options) + if (included) { + prev = version + if (!first) { + first = version + } + } else { + if (prev) { + set.push([first, prev]) + } + prev = null + first = null + } + } + if (first) { + set.push([first, null]) + } + + const ranges = [] + for (const [min, max] of set) { + if (min === max) { + ranges.push(min) + } else if (!max && min === v[0]) { + ranges.push('*') + } else if (!max) { + ranges.push(`>=${min}`) + } else if (min === v[0]) { + ranges.push(`<=${max}`) + } else { + ranges.push(`${min} - ${max}`) + } + } + const simplified = ranges.join(' || ') + const original = typeof range.raw === 'string' ? range.raw : String(range) + return simplified.length < original.length ? simplified : range +} diff --git a/@capacitor/assets/node_modules/semver/ranges/subset.js b/@capacitor/assets/node_modules/semver/ranges/subset.js new file mode 100644 index 00000000..1e5c2683 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/subset.js @@ -0,0 +1,247 @@ +const Range = require('../classes/range.js') +const Comparator = require('../classes/comparator.js') +const { ANY } = Comparator +const satisfies = require('../functions/satisfies.js') +const compare = require('../functions/compare.js') + +// Complex range `r1 || r2 || ...` is a subset of `R1 || R2 || ...` iff: +// - Every simple range `r1, r2, ...` is a null set, OR +// - Every simple range `r1, r2, ...` which is not a null set is a subset of +// some `R1, R2, ...` +// +// Simple range `c1 c2 ...` is a subset of simple range `C1 C2 ...` iff: +// - If c is only the ANY comparator +// - If C is only the ANY comparator, return true +// - Else if in prerelease mode, return false +// - else replace c with `[>=0.0.0]` +// - If C is only the ANY comparator +// - if in prerelease mode, return true +// - else replace C with `[>=0.0.0]` +// - Let EQ be the set of = comparators in c +// - If EQ is more than one, return true (null set) +// - Let GT be the highest > or >= comparator in c +// - Let LT be the lowest < or <= comparator in c +// - If GT and LT, and GT.semver > LT.semver, return true (null set) +// - If any C is a = range, and GT or LT are set, return false +// - If EQ +// - If GT, and EQ does not satisfy GT, return true (null set) +// - If LT, and EQ does not satisfy LT, return true (null set) +// - If EQ satisfies every C, return true +// - Else return false +// - If GT +// - If GT.semver is lower than any > or >= comp in C, return false +// - If GT is >=, and GT.semver does not satisfy every C, return false +// - If GT.semver has a prerelease, and not in prerelease mode +// - If no C has a prerelease and the GT.semver tuple, return false +// - If LT +// - If LT.semver is greater than any < or <= comp in C, return false +// - If LT is <=, and LT.semver does not satisfy every C, return false +// - If GT.semver has a prerelease, and not in prerelease mode +// - If no C has a prerelease and the LT.semver tuple, return false +// - Else return true + +const subset = (sub, dom, options = {}) => { + if (sub === dom) { + return true + } + + sub = new Range(sub, options) + dom = new Range(dom, options) + let sawNonNull = false + + OUTER: for (const simpleSub of sub.set) { + for (const simpleDom of dom.set) { + const isSub = simpleSubset(simpleSub, simpleDom, options) + sawNonNull = sawNonNull || isSub !== null + if (isSub) { + continue OUTER + } + } + // the null set is a subset of everything, but null simple ranges in + // a complex range should be ignored. so if we saw a non-null range, + // then we know this isn't a subset, but if EVERY simple range was null, + // then it is a subset. + if (sawNonNull) { + return false + } + } + return true +} + +const minimumVersionWithPreRelease = [new Comparator('>=0.0.0-0')] +const minimumVersion = [new Comparator('>=0.0.0')] + +const simpleSubset = (sub, dom, options) => { + if (sub === dom) { + return true + } + + if (sub.length === 1 && sub[0].semver === ANY) { + if (dom.length === 1 && dom[0].semver === ANY) { + return true + } else if (options.includePrerelease) { + sub = minimumVersionWithPreRelease + } else { + sub = minimumVersion + } + } + + if (dom.length === 1 && dom[0].semver === ANY) { + if (options.includePrerelease) { + return true + } else { + dom = minimumVersion + } + } + + const eqSet = new Set() + let gt, lt + for (const c of sub) { + if (c.operator === '>' || c.operator === '>=') { + gt = higherGT(gt, c, options) + } else if (c.operator === '<' || c.operator === '<=') { + lt = lowerLT(lt, c, options) + } else { + eqSet.add(c.semver) + } + } + + if (eqSet.size > 1) { + return null + } + + let gtltComp + if (gt && lt) { + gtltComp = compare(gt.semver, lt.semver, options) + if (gtltComp > 0) { + return null + } else if (gtltComp === 0 && (gt.operator !== '>=' || lt.operator !== '<=')) { + return null + } + } + + // will iterate one or zero times + for (const eq of eqSet) { + if (gt && !satisfies(eq, String(gt), options)) { + return null + } + + if (lt && !satisfies(eq, String(lt), options)) { + return null + } + + for (const c of dom) { + if (!satisfies(eq, String(c), options)) { + return false + } + } + + return true + } + + let higher, lower + let hasDomLT, hasDomGT + // if the subset has a prerelease, we need a comparator in the superset + // with the same tuple and a prerelease, or it's not a subset + let needDomLTPre = lt && + !options.includePrerelease && + lt.semver.prerelease.length ? lt.semver : false + let needDomGTPre = gt && + !options.includePrerelease && + gt.semver.prerelease.length ? gt.semver : false + // exception: <1.2.3-0 is the same as <1.2.3 + if (needDomLTPre && needDomLTPre.prerelease.length === 1 && + lt.operator === '<' && needDomLTPre.prerelease[0] === 0) { + needDomLTPre = false + } + + for (const c of dom) { + hasDomGT = hasDomGT || c.operator === '>' || c.operator === '>=' + hasDomLT = hasDomLT || c.operator === '<' || c.operator === '<=' + if (gt) { + if (needDomGTPre) { + if (c.semver.prerelease && c.semver.prerelease.length && + c.semver.major === needDomGTPre.major && + c.semver.minor === needDomGTPre.minor && + c.semver.patch === needDomGTPre.patch) { + needDomGTPre = false + } + } + if (c.operator === '>' || c.operator === '>=') { + higher = higherGT(gt, c, options) + if (higher === c && higher !== gt) { + return false + } + } else if (gt.operator === '>=' && !satisfies(gt.semver, String(c), options)) { + return false + } + } + if (lt) { + if (needDomLTPre) { + if (c.semver.prerelease && c.semver.prerelease.length && + c.semver.major === needDomLTPre.major && + c.semver.minor === needDomLTPre.minor && + c.semver.patch === needDomLTPre.patch) { + needDomLTPre = false + } + } + if (c.operator === '<' || c.operator === '<=') { + lower = lowerLT(lt, c, options) + if (lower === c && lower !== lt) { + return false + } + } else if (lt.operator === '<=' && !satisfies(lt.semver, String(c), options)) { + return false + } + } + if (!c.operator && (lt || gt) && gtltComp !== 0) { + return false + } + } + + // if there was a < or >, and nothing in the dom, then must be false + // UNLESS it was limited by another range in the other direction. + // Eg, >1.0.0 <1.0.1 is still a subset of <2.0.0 + if (gt && hasDomLT && !lt && gtltComp !== 0) { + return false + } + + if (lt && hasDomGT && !gt && gtltComp !== 0) { + return false + } + + // we needed a prerelease range in a specific tuple, but didn't get one + // then this isn't a subset. eg >=1.2.3-pre is not a subset of >=1.0.0, + // because it includes prereleases in the 1.2.3 tuple + if (needDomGTPre || needDomLTPre) { + return false + } + + return true +} + +// >=1.2.3 is lower than >1.2.3 +const higherGT = (a, b, options) => { + if (!a) { + return b + } + const comp = compare(a.semver, b.semver, options) + return comp > 0 ? a + : comp < 0 ? b + : b.operator === '>' && a.operator === '>=' ? b + : a +} + +// <=1.2.3 is higher than <1.2.3 +const lowerLT = (a, b, options) => { + if (!a) { + return b + } + const comp = compare(a.semver, b.semver, options) + return comp < 0 ? a + : comp > 0 ? b + : b.operator === '<' && a.operator === '<=' ? b + : a +} + +module.exports = subset diff --git a/@capacitor/assets/node_modules/semver/ranges/to-comparators.js b/@capacitor/assets/node_modules/semver/ranges/to-comparators.js new file mode 100644 index 00000000..6c8bc7e6 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/to-comparators.js @@ -0,0 +1,8 @@ +const Range = require('../classes/range') + +// Mostly just for testing and legacy API reasons +const toComparators = (range, options) => + new Range(range, options).set + .map(comp => comp.map(c => c.value).join(' ').trim().split(' ')) + +module.exports = toComparators diff --git a/@capacitor/assets/node_modules/semver/ranges/valid.js b/@capacitor/assets/node_modules/semver/ranges/valid.js new file mode 100644 index 00000000..365f3568 --- /dev/null +++ b/@capacitor/assets/node_modules/semver/ranges/valid.js @@ -0,0 +1,11 @@ +const Range = require('../classes/range') +const validRange = (range, options) => { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, options).range || '*' + } catch (er) { + return null + } +} +module.exports = validRange diff --git a/@capacitor/assets/node_modules/tr46/.npmignore b/@capacitor/assets/node_modules/tr46/.npmignore new file mode 100644 index 00000000..96e9161f --- /dev/null +++ b/@capacitor/assets/node_modules/tr46/.npmignore @@ -0,0 +1,4 @@ +scripts/ +test/ + +!lib/mapping_table.json diff --git a/@capacitor/assets/node_modules/tr46/index.js b/@capacitor/assets/node_modules/tr46/index.js new file mode 100644 index 00000000..9ce12ca2 --- /dev/null +++ b/@capacitor/assets/node_modules/tr46/index.js @@ -0,0 +1,193 @@ +"use strict"; + +var punycode = require("punycode"); +var mappingTable = require("./lib/mappingTable.json"); + +var PROCESSING_OPTIONS = { + TRANSITIONAL: 0, + NONTRANSITIONAL: 1 +}; + +function normalize(str) { // fix bug in v8 + return str.split('\u0000').map(function (s) { return s.normalize('NFC'); }).join('\u0000'); +} + +function findStatus(val) { + var start = 0; + var end = mappingTable.length - 1; + + while (start <= end) { + var mid = Math.floor((start + end) / 2); + + var target = mappingTable[mid]; + if (target[0][0] <= val && target[0][1] >= val) { + return target; + } else if (target[0][0] > val) { + end = mid - 1; + } else { + start = mid + 1; + } + } + + return null; +} + +var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + +function countSymbols(string) { + return string + // replace every surrogate pair with a BMP symbol + .replace(regexAstralSymbols, '_') + // then get the length + .length; +} + +function mapChars(domain_name, useSTD3, processing_option) { + var hasError = false; + var processed = ""; + + var len = countSymbols(domain_name); + for (var i = 0; i < len; ++i) { + var codePoint = domain_name.codePointAt(i); + var status = findStatus(codePoint); + + switch (status[1]) { + case "disallowed": + hasError = true; + processed += String.fromCodePoint(codePoint); + break; + case "ignored": + break; + case "mapped": + processed += String.fromCodePoint.apply(String, status[2]); + break; + case "deviation": + if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) { + processed += String.fromCodePoint.apply(String, status[2]); + } else { + processed += String.fromCodePoint(codePoint); + } + break; + case "valid": + processed += String.fromCodePoint(codePoint); + break; + case "disallowed_STD3_mapped": + if (useSTD3) { + hasError = true; + processed += String.fromCodePoint(codePoint); + } else { + processed += String.fromCodePoint.apply(String, status[2]); + } + break; + case "disallowed_STD3_valid": + if (useSTD3) { + hasError = true; + } + + processed += String.fromCodePoint(codePoint); + break; + } + } + + return { + string: processed, + error: hasError + }; +} + +var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/; + +function validateLabel(label, processing_option) { + if (label.substr(0, 4) === "xn--") { + label = punycode.toUnicode(label); + processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL; + } + + var error = false; + + if (normalize(label) !== label || + (label[3] === "-" && label[4] === "-") || + label[0] === "-" || label[label.length - 1] === "-" || + label.indexOf(".") !== -1 || + label.search(combiningMarksRegex) === 0) { + error = true; + } + + var len = countSymbols(label); + for (var i = 0; i < len; ++i) { + var status = findStatus(label.codePointAt(i)); + if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid") || + (processing === PROCESSING_OPTIONS.NONTRANSITIONAL && + status[1] !== "valid" && status[1] !== "deviation")) { + error = true; + break; + } + } + + return { + label: label, + error: error + }; +} + +function processing(domain_name, useSTD3, processing_option) { + var result = mapChars(domain_name, useSTD3, processing_option); + result.string = normalize(result.string); + + var labels = result.string.split("."); + for (var i = 0; i < labels.length; ++i) { + try { + var validation = validateLabel(labels[i]); + labels[i] = validation.label; + result.error = result.error || validation.error; + } catch(e) { + result.error = true; + } + } + + return { + string: labels.join("."), + error: result.error + }; +} + +module.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) { + var result = processing(domain_name, useSTD3, processing_option); + var labels = result.string.split("."); + labels = labels.map(function(l) { + try { + return punycode.toASCII(l); + } catch(e) { + result.error = true; + return l; + } + }); + + if (verifyDnsLength) { + var total = labels.slice(0, labels.length - 1).join(".").length; + if (total.length > 253 || total.length === 0) { + result.error = true; + } + + for (var i=0; i < labels.length; ++i) { + if (labels.length > 63 || labels.length === 0) { + result.error = true; + break; + } + } + } + + if (result.error) return null; + return labels.join("."); +}; + +module.exports.toUnicode = function(domain_name, useSTD3) { + var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL); + + return { + domain: result.string, + error: result.error + }; +}; + +module.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS; diff --git a/@capacitor/assets/node_modules/tr46/lib/.gitkeep b/@capacitor/assets/node_modules/tr46/lib/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/@capacitor/assets/node_modules/tr46/lib/mappingTable.json b/@capacitor/assets/node_modules/tr46/lib/mappingTable.json new file mode 100644 index 00000000..89cf19a7 --- /dev/null +++ b/@capacitor/assets/node_modules/tr46/lib/mappingTable.json @@ -0,0 +1 @@ +[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"],[[47,47],"disallowed_STD3_valid"],[[48,57],"valid"],[[58,64],"disallowed_STD3_valid"],[[65,65],"mapped",[97]],[[66,66],"mapped",[98]],[[67,67],"mapped",[99]],[[68,68],"mapped",[100]],[[69,69],"mapped",[101]],[[70,70],"mapped",[102]],[[71,71],"mapped",[103]],[[72,72],"mapped",[104]],[[73,73],"mapped",[105]],[[74,74],"mapped",[106]],[[75,75],"mapped",[107]],[[76,76],"mapped",[108]],[[77,77],"mapped",[109]],[[78,78],"mapped",[110]],[[79,79],"mapped",[111]],[[80,80],"mapped",[112]],[[81,81],"mapped",[113]],[[82,82],"mapped",[114]],[[83,83],"mapped",[115]],[[84,84],"mapped",[116]],[[85,85],"mapped",[117]],[[86,86],"mapped",[118]],[[87,87],"mapped",[119]],[[88,88],"mapped",[120]],[[89,89],"mapped",[121]],[[90,90],"mapped",[122]],[[91,96],"disallowed_STD3_valid"],[[97,122],"valid"],[[123,127],"disallowed_STD3_valid"],[[128,159],"disallowed"],[[160,160],"disallowed_STD3_mapped",[32]],[[161,167],"valid",[],"NV8"],[[168,168],"disallowed_STD3_mapped",[32,776]],[[169,169],"valid",[],"NV8"],[[170,170],"mapped",[97]],[[171,172],"valid",[],"NV8"],[[173,173],"ignored"],[[174,174],"valid",[],"NV8"],[[175,175],"disallowed_STD3_mapped",[32,772]],[[176,177],"valid",[],"NV8"],[[178,178],"mapped",[50]],[[179,179],"mapped",[51]],[[180,180],"disallowed_STD3_mapped",[32,769]],[[181,181],"mapped",[956]],[[182,182],"valid",[],"NV8"],[[183,183],"valid"],[[184,184],"disallowed_STD3_mapped",[32,807]],[[185,185],"mapped",[49]],[[186,186],"mapped",[111]],[[187,187],"valid",[],"NV8"],[[188,188],"mapped",[49,8260,52]],[[189,189],"mapped",[49,8260,50]],[[190,190],"mapped",[51,8260,52]],[[191,191],"valid",[],"NV8"],[[192,192],"mapped",[224]],[[193,193],"mapped",[225]],[[194,194],"mapped",[226]],[[195,195],"mapped",[227]],[[196,196],"mapped",[228]],[[197,197],"mapped",[229]],[[198,198],"mapped",[230]],[[199,199],"mapped",[231]],[[200,200],"mapped",[232]],[[201,201],"mapped",[233]],[[202,202],"mapped",[234]],[[203,203],"mapped",[235]],[[204,204],"mapped",[236]],[[205,205],"mapped",[237]],[[206,206],"mapped",[238]],[[207,207],"mapped",[239]],[[208,208],"mapped",[240]],[[209,209],"mapped",[241]],[[210,210],"mapped",[242]],[[211,211],"mapped",[243]],[[212,212],"mapped",[244]],[[213,213],"mapped",[245]],[[214,214],"mapped",[246]],[[215,215],"valid",[],"NV8"],[[216,216],"mapped",[248]],[[217,217],"mapped",[249]],[[218,218],"mapped",[250]],[[219,219],"mapped",[251]],[[220,220],"mapped",[252]],[[221,221],"mapped",[253]],[[222,222],"mapped",[254]],[[223,223],"deviation",[115,115]],[[224,246],"valid"],[[247,247],"valid",[],"NV8"],[[248,255],"valid"],[[256,256],"mapped",[257]],[[257,257],"valid"],[[258,258],"mapped",[259]],[[259,259],"valid"],[[260,260],"mapped",[261]],[[261,261],"valid"],[[262,262],"mapped",[263]],[[263,263],"valid"],[[264,264],"mapped",[265]],[[265,265],"valid"],[[266,266],"mapped",[267]],[[267,267],"valid"],[[268,268],"mapped",[269]],[[269,269],"valid"],[[270,270],"mapped",[271]],[[271,271],"valid"],[[272,272],"mapped",[273]],[[273,273],"valid"],[[274,274],"mapped",[275]],[[275,275],"valid"],[[276,276],"mapped",[277]],[[277,277],"valid"],[[278,278],"mapped",[279]],[[279,279],"valid"],[[280,280],"mapped",[281]],[[281,281],"valid"],[[282,282],"mapped",[283]],[[283,283],"valid"],[[284,284],"mapped",[285]],[[285,285],"valid"],[[286,286],"mapped",[287]],[[287,287],"valid"],[[288,288],"mapped",[289]],[[289,289],"valid"],[[290,290],"mapped",[291]],[[291,291],"valid"],[[292,292],"mapped",[293]],[[293,293],"valid"],[[294,294],"mapped",[295]],[[295,295],"valid"],[[296,296],"mapped",[297]],[[297,297],"valid"],[[298,298],"mapped",[299]],[[299,299],"valid"],[[300,300],"mapped",[301]],[[301,301],"valid"],[[302,302],"mapped",[303]],[[303,303],"valid"],[[304,304],"mapped",[105,775]],[[305,305],"valid"],[[306,307],"mapped",[105,106]],[[308,308],"mapped",[309]],[[309,309],"valid"],[[310,310],"mapped",[311]],[[311,312],"valid"],[[313,313],"mapped",[314]],[[314,314],"valid"],[[315,315],"mapped",[316]],[[316,316],"valid"],[[317,317],"mapped",[318]],[[318,318],"valid"],[[319,320],"mapped",[108,183]],[[321,321],"mapped",[322]],[[322,322],"valid"],[[323,323],"mapped",[324]],[[324,324],"valid"],[[325,325],"mapped",[326]],[[326,326],"valid"],[[327,327],"mapped",[328]],[[328,328],"valid"],[[329,329],"mapped",[700,110]],[[330,330],"mapped",[331]],[[331,331],"valid"],[[332,332],"mapped",[333]],[[333,333],"valid"],[[334,334],"mapped",[335]],[[335,335],"valid"],[[336,336],"mapped",[337]],[[337,337],"valid"],[[338,338],"mapped",[339]],[[339,339],"valid"],[[340,340],"mapped",[341]],[[341,341],"valid"],[[342,342],"mapped",[343]],[[343,343],"valid"],[[344,344],"mapped",[345]],[[345,345],"valid"],[[346,346],"mapped",[347]],[[347,347],"valid"],[[348,348],"mapped",[349]],[[349,349],"valid"],[[350,350],"mapped",[351]],[[351,351],"valid"],[[352,352],"mapped",[353]],[[353,353],"valid"],[[354,354],"mapped",[355]],[[355,355],"valid"],[[356,356],"mapped",[357]],[[357,357],"valid"],[[358,358],"mapped",[359]],[[359,359],"valid"],[[360,360],"mapped",[361]],[[361,361],"valid"],[[362,362],"mapped",[363]],[[363,363],"valid"],[[364,364],"mapped",[365]],[[365,365],"valid"],[[366,366],"mapped",[367]],[[367,367],"valid"],[[368,368],"mapped",[369]],[[369,369],"valid"],[[370,370],"mapped",[371]],[[371,371],"valid"],[[372,372],"mapped",[373]],[[373,373],"valid"],[[374,374],"mapped",[375]],[[375,375],"valid"],[[376,376],"mapped",[255]],[[377,377],"mapped",[378]],[[378,378],"valid"],[[379,379],"mapped",[380]],[[380,380],"valid"],[[381,381],"mapped",[382]],[[382,382],"valid"],[[383,383],"mapped",[115]],[[384,384],"valid"],[[385,385],"mapped",[595]],[[386,386],"mapped",[387]],[[387,387],"valid"],[[388,388],"mapped",[389]],[[389,389],"valid"],[[390,390],"mapped",[596]],[[391,391],"mapped",[392]],[[392,392],"valid"],[[393,393],"mapped",[598]],[[394,394],"mapped",[599]],[[395,395],"mapped",[396]],[[396,397],"valid"],[[398,398],"mapped",[477]],[[399,399],"mapped",[601]],[[400,400],"mapped",[603]],[[401,401],"mapped",[402]],[[402,402],"valid"],[[403,403],"mapped",[608]],[[404,404],"mapped",[611]],[[405,405],"valid"],[[406,406],"mapped",[617]],[[407,407],"mapped",[616]],[[408,408],"mapped",[409]],[[409,411],"valid"],[[412,412],"mapped",[623]],[[413,413],"mapped",[626]],[[414,414],"valid"],[[415,415],"mapped",[629]],[[416,416],"mapped",[417]],[[417,417],"valid"],[[418,418],"mapped",[419]],[[419,419],"valid"],[[420,420],"mapped",[421]],[[421,421],"valid"],[[422,422],"mapped",[640]],[[423,423],"mapped",[424]],[[424,424],"valid"],[[425,425],"mapped",[643]],[[426,427],"valid"],[[428,428],"mapped",[429]],[[429,429],"valid"],[[430,430],"mapped",[648]],[[431,431],"mapped",[432]],[[432,432],"valid"],[[433,433],"mapped",[650]],[[434,434],"mapped",[651]],[[435,435],"mapped",[436]],[[436,436],"valid"],[[437,437],"mapped",[438]],[[438,438],"valid"],[[439,439],"mapped",[658]],[[440,440],"mapped",[441]],[[441,443],"valid"],[[444,444],"mapped",[445]],[[445,451],"valid"],[[452,454],"mapped",[100,382]],[[455,457],"mapped",[108,106]],[[458,460],"mapped",[110,106]],[[461,461],"mapped",[462]],[[462,462],"valid"],[[463,463],"mapped",[464]],[[464,464],"valid"],[[465,465],"mapped",[466]],[[466,466],"valid"],[[467,467],"mapped",[468]],[[468,468],"valid"],[[469,469],"mapped",[470]],[[470,470],"valid"],[[471,471],"mapped",[472]],[[472,472],"valid"],[[473,473],"mapped",[474]],[[474,474],"valid"],[[475,475],"mapped",[476]],[[476,477],"valid"],[[478,478],"mapped",[479]],[[479,479],"valid"],[[480,480],"mapped",[481]],[[481,481],"valid"],[[482,482],"mapped",[483]],[[483,483],"valid"],[[484,484],"mapped",[485]],[[485,485],"valid"],[[486,486],"mapped",[487]],[[487,487],"valid"],[[488,488],"mapped",[489]],[[489,489],"valid"],[[490,490],"mapped",[491]],[[491,491],"valid"],[[492,492],"mapped",[493]],[[493,493],"valid"],[[494,494],"mapped",[495]],[[495,496],"valid"],[[497,499],"mapped",[100,122]],[[500,500],"mapped",[501]],[[501,501],"valid"],[[502,502],"mapped",[405]],[[503,503],"mapped",[447]],[[504,504],"mapped",[505]],[[505,505],"valid"],[[506,506],"mapped",[507]],[[507,507],"valid"],[[508,508],"mapped",[509]],[[509,509],"valid"],[[510,510],"mapped",[511]],[[511,511],"valid"],[[512,512],"mapped",[513]],[[513,513],"valid"],[[514,514],"mapped",[515]],[[515,515],"valid"],[[516,516],"mapped",[517]],[[517,517],"valid"],[[518,518],"mapped",[519]],[[519,519],"valid"],[[520,520],"mapped",[521]],[[521,521],"valid"],[[522,522],"mapped",[523]],[[523,523],"valid"],[[524,524],"mapped",[525]],[[525,525],"valid"],[[526,526],"mapped",[527]],[[527,527],"valid"],[[528,528],"mapped",[529]],[[529,529],"valid"],[[530,530],"mapped",[531]],[[531,531],"valid"],[[532,532],"mapped",[533]],[[533,533],"valid"],[[534,534],"mapped",[535]],[[535,535],"valid"],[[536,536],"mapped",[537]],[[537,537],"valid"],[[538,538],"mapped",[539]],[[539,539],"valid"],[[540,540],"mapped",[541]],[[541,541],"valid"],[[542,542],"mapped",[543]],[[543,543],"valid"],[[544,544],"mapped",[414]],[[545,545],"valid"],[[546,546],"mapped",[547]],[[547,547],"valid"],[[548,548],"mapped",[549]],[[549,549],"valid"],[[550,550],"mapped",[551]],[[551,551],"valid"],[[552,552],"mapped",[553]],[[553,553],"valid"],[[554,554],"mapped",[555]],[[555,555],"valid"],[[556,556],"mapped",[557]],[[557,557],"valid"],[[558,558],"mapped",[559]],[[559,559],"valid"],[[560,560],"mapped",[561]],[[561,561],"valid"],[[562,562],"mapped",[563]],[[563,563],"valid"],[[564,566],"valid"],[[567,569],"valid"],[[570,570],"mapped",[11365]],[[571,571],"mapped",[572]],[[572,572],"valid"],[[573,573],"mapped",[410]],[[574,574],"mapped",[11366]],[[575,576],"valid"],[[577,577],"mapped",[578]],[[578,578],"valid"],[[579,579],"mapped",[384]],[[580,580],"mapped",[649]],[[581,581],"mapped",[652]],[[582,582],"mapped",[583]],[[583,583],"valid"],[[584,584],"mapped",[585]],[[585,585],"valid"],[[586,586],"mapped",[587]],[[587,587],"valid"],[[588,588],"mapped",[589]],[[589,589],"valid"],[[590,590],"mapped",[591]],[[591,591],"valid"],[[592,680],"valid"],[[681,685],"valid"],[[686,687],"valid"],[[688,688],"mapped",[104]],[[689,689],"mapped",[614]],[[690,690],"mapped",[106]],[[691,691],"mapped",[114]],[[692,692],"mapped",[633]],[[693,693],"mapped",[635]],[[694,694],"mapped",[641]],[[695,695],"mapped",[119]],[[696,696],"mapped",[121]],[[697,705],"valid"],[[706,709],"valid",[],"NV8"],[[710,721],"valid"],[[722,727],"valid",[],"NV8"],[[728,728],"disallowed_STD3_mapped",[32,774]],[[729,729],"disallowed_STD3_mapped",[32,775]],[[730,730],"disallowed_STD3_mapped",[32,778]],[[731,731],"disallowed_STD3_mapped",[32,808]],[[732,732],"disallowed_STD3_mapped",[32,771]],[[733,733],"disallowed_STD3_mapped",[32,779]],[[734,734],"valid",[],"NV8"],[[735,735],"valid",[],"NV8"],[[736,736],"mapped",[611]],[[737,737],"mapped",[108]],[[738,738],"mapped",[115]],[[739,739],"mapped",[120]],[[740,740],"mapped",[661]],[[741,745],"valid",[],"NV8"],[[746,747],"valid",[],"NV8"],[[748,748],"valid"],[[749,749],"valid",[],"NV8"],[[750,750],"valid"],[[751,767],"valid",[],"NV8"],[[768,831],"valid"],[[832,832],"mapped",[768]],[[833,833],"mapped",[769]],[[834,834],"valid"],[[835,835],"mapped",[787]],[[836,836],"mapped",[776,769]],[[837,837],"mapped",[953]],[[838,846],"valid"],[[847,847],"ignored"],[[848,855],"valid"],[[856,860],"valid"],[[861,863],"valid"],[[864,865],"valid"],[[866,866],"valid"],[[867,879],"valid"],[[880,880],"mapped",[881]],[[881,881],"valid"],[[882,882],"mapped",[883]],[[883,883],"valid"],[[884,884],"mapped",[697]],[[885,885],"valid"],[[886,886],"mapped",[887]],[[887,887],"valid"],[[888,889],"disallowed"],[[890,890],"disallowed_STD3_mapped",[32,953]],[[891,893],"valid"],[[894,894],"disallowed_STD3_mapped",[59]],[[895,895],"mapped",[1011]],[[896,899],"disallowed"],[[900,900],"disallowed_STD3_mapped",[32,769]],[[901,901],"disallowed_STD3_mapped",[32,776,769]],[[902,902],"mapped",[940]],[[903,903],"mapped",[183]],[[904,904],"mapped",[941]],[[905,905],"mapped",[942]],[[906,906],"mapped",[943]],[[907,907],"disallowed"],[[908,908],"mapped",[972]],[[909,909],"disallowed"],[[910,910],"mapped",[973]],[[911,911],"mapped",[974]],[[912,912],"valid"],[[913,913],"mapped",[945]],[[914,914],"mapped",[946]],[[915,915],"mapped",[947]],[[916,916],"mapped",[948]],[[917,917],"mapped",[949]],[[918,918],"mapped",[950]],[[919,919],"mapped",[951]],[[920,920],"mapped",[952]],[[921,921],"mapped",[953]],[[922,922],"mapped",[954]],[[923,923],"mapped",[955]],[[924,924],"mapped",[956]],[[925,925],"mapped",[957]],[[926,926],"mapped",[958]],[[927,927],"mapped",[959]],[[928,928],"mapped",[960]],[[929,929],"mapped",[961]],[[930,930],"disallowed"],[[931,931],"mapped",[963]],[[932,932],"mapped",[964]],[[933,933],"mapped",[965]],[[934,934],"mapped",[966]],[[935,935],"mapped",[967]],[[936,936],"mapped",[968]],[[937,937],"mapped",[969]],[[938,938],"mapped",[970]],[[939,939],"mapped",[971]],[[940,961],"valid"],[[962,962],"deviation",[963]],[[963,974],"valid"],[[975,975],"mapped",[983]],[[976,976],"mapped",[946]],[[977,977],"mapped",[952]],[[978,978],"mapped",[965]],[[979,979],"mapped",[973]],[[980,980],"mapped",[971]],[[981,981],"mapped",[966]],[[982,982],"mapped",[960]],[[983,983],"valid"],[[984,984],"mapped",[985]],[[985,985],"valid"],[[986,986],"mapped",[987]],[[987,987],"valid"],[[988,988],"mapped",[989]],[[989,989],"valid"],[[990,990],"mapped",[991]],[[991,991],"valid"],[[992,992],"mapped",[993]],[[993,993],"valid"],[[994,994],"mapped",[995]],[[995,995],"valid"],[[996,996],"mapped",[997]],[[997,997],"valid"],[[998,998],"mapped",[999]],[[999,999],"valid"],[[1000,1000],"mapped",[1001]],[[1001,1001],"valid"],[[1002,1002],"mapped",[1003]],[[1003,1003],"valid"],[[1004,1004],"mapped",[1005]],[[1005,1005],"valid"],[[1006,1006],"mapped",[1007]],[[1007,1007],"valid"],[[1008,1008],"mapped",[954]],[[1009,1009],"mapped",[961]],[[1010,1010],"mapped",[963]],[[1011,1011],"valid"],[[1012,1012],"mapped",[952]],[[1013,1013],"mapped",[949]],[[1014,1014],"valid",[],"NV8"],[[1015,1015],"mapped",[1016]],[[1016,1016],"valid"],[[1017,1017],"mapped",[963]],[[1018,1018],"mapped",[1019]],[[1019,1019],"valid"],[[1020,1020],"valid"],[[1021,1021],"mapped",[891]],[[1022,1022],"mapped",[892]],[[1023,1023],"mapped",[893]],[[1024,1024],"mapped",[1104]],[[1025,1025],"mapped",[1105]],[[1026,1026],"mapped",[1106]],[[1027,1027],"mapped",[1107]],[[1028,1028],"mapped",[1108]],[[1029,1029],"mapped",[1109]],[[1030,1030],"mapped",[1110]],[[1031,1031],"mapped",[1111]],[[1032,1032],"mapped",[1112]],[[1033,1033],"mapped",[1113]],[[1034,1034],"mapped",[1114]],[[1035,1035],"mapped",[1115]],[[1036,1036],"mapped",[1116]],[[1037,1037],"mapped",[1117]],[[1038,1038],"mapped",[1118]],[[1039,1039],"mapped",[1119]],[[1040,1040],"mapped",[1072]],[[1041,1041],"mapped",[1073]],[[1042,1042],"mapped",[1074]],[[1043,1043],"mapped",[1075]],[[1044,1044],"mapped",[1076]],[[1045,1045],"mapped",[1077]],[[1046,1046],"mapped",[1078]],[[1047,1047],"mapped",[1079]],[[1048,1048],"mapped",[1080]],[[1049,1049],"mapped",[1081]],[[1050,1050],"mapped",[1082]],[[1051,1051],"mapped",[1083]],[[1052,1052],"mapped",[1084]],[[1053,1053],"mapped",[1085]],[[1054,1054],"mapped",[1086]],[[1055,1055],"mapped",[1087]],[[1056,1056],"mapped",[1088]],[[1057,1057],"mapped",[1089]],[[1058,1058],"mapped",[1090]],[[1059,1059],"mapped",[1091]],[[1060,1060],"mapped",[1092]],[[1061,1061],"mapped",[1093]],[[1062,1062],"mapped",[1094]],[[1063,1063],"mapped",[1095]],[[1064,1064],"mapped",[1096]],[[1065,1065],"mapped",[1097]],[[1066,1066],"mapped",[1098]],[[1067,1067],"mapped",[1099]],[[1068,1068],"mapped",[1100]],[[1069,1069],"mapped",[1101]],[[1070,1070],"mapped",[1102]],[[1071,1071],"mapped",[1103]],[[1072,1103],"valid"],[[1104,1104],"valid"],[[1105,1116],"valid"],[[1117,1117],"valid"],[[1118,1119],"valid"],[[1120,1120],"mapped",[1121]],[[1121,1121],"valid"],[[1122,1122],"mapped",[1123]],[[1123,1123],"valid"],[[1124,1124],"mapped",[1125]],[[1125,1125],"valid"],[[1126,1126],"mapped",[1127]],[[1127,1127],"valid"],[[1128,1128],"mapped",[1129]],[[1129,1129],"valid"],[[1130,1130],"mapped",[1131]],[[1131,1131],"valid"],[[1132,1132],"mapped",[1133]],[[1133,1133],"valid"],[[1134,1134],"mapped",[1135]],[[1135,1135],"valid"],[[1136,1136],"mapped",[1137]],[[1137,1137],"valid"],[[1138,1138],"mapped",[1139]],[[1139,1139],"valid"],[[1140,1140],"mapped",[1141]],[[1141,1141],"valid"],[[1142,1142],"mapped",[1143]],[[1143,1143],"valid"],[[1144,1144],"mapped",[1145]],[[1145,1145],"valid"],[[1146,1146],"mapped",[1147]],[[1147,1147],"valid"],[[1148,1148],"mapped",[1149]],[[1149,1149],"valid"],[[1150,1150],"mapped",[1151]],[[1151,1151],"valid"],[[1152,1152],"mapped",[1153]],[[1153,1153],"valid"],[[1154,1154],"valid",[],"NV8"],[[1155,1158],"valid"],[[1159,1159],"valid"],[[1160,1161],"valid",[],"NV8"],[[1162,1162],"mapped",[1163]],[[1163,1163],"valid"],[[1164,1164],"mapped",[1165]],[[1165,1165],"valid"],[[1166,1166],"mapped",[1167]],[[1167,1167],"valid"],[[1168,1168],"mapped",[1169]],[[1169,1169],"valid"],[[1170,1170],"mapped",[1171]],[[1171,1171],"valid"],[[1172,1172],"mapped",[1173]],[[1173,1173],"valid"],[[1174,1174],"mapped",[1175]],[[1175,1175],"valid"],[[1176,1176],"mapped",[1177]],[[1177,1177],"valid"],[[1178,1178],"mapped",[1179]],[[1179,1179],"valid"],[[1180,1180],"mapped",[1181]],[[1181,1181],"valid"],[[1182,1182],"mapped",[1183]],[[1183,1183],"valid"],[[1184,1184],"mapped",[1185]],[[1185,1185],"valid"],[[1186,1186],"mapped",[1187]],[[1187,1187],"valid"],[[1188,1188],"mapped",[1189]],[[1189,1189],"valid"],[[1190,1190],"mapped",[1191]],[[1191,1191],"valid"],[[1192,1192],"mapped",[1193]],[[1193,1193],"valid"],[[1194,1194],"mapped",[1195]],[[1195,1195],"valid"],[[1196,1196],"mapped",[1197]],[[1197,1197],"valid"],[[1198,1198],"mapped",[1199]],[[1199,1199],"valid"],[[1200,1200],"mapped",[1201]],[[1201,1201],"valid"],[[1202,1202],"mapped",[1203]],[[1203,1203],"valid"],[[1204,1204],"mapped",[1205]],[[1205,1205],"valid"],[[1206,1206],"mapped",[1207]],[[1207,1207],"valid"],[[1208,1208],"mapped",[1209]],[[1209,1209],"valid"],[[1210,1210],"mapped",[1211]],[[1211,1211],"valid"],[[1212,1212],"mapped",[1213]],[[1213,1213],"valid"],[[1214,1214],"mapped",[1215]],[[1215,1215],"valid"],[[1216,1216],"disallowed"],[[1217,1217],"mapped",[1218]],[[1218,1218],"valid"],[[1219,1219],"mapped",[1220]],[[1220,1220],"valid"],[[1221,1221],"mapped",[1222]],[[1222,1222],"valid"],[[1223,1223],"mapped",[1224]],[[1224,1224],"valid"],[[1225,1225],"mapped",[1226]],[[1226,1226],"valid"],[[1227,1227],"mapped",[1228]],[[1228,1228],"valid"],[[1229,1229],"mapped",[1230]],[[1230,1230],"valid"],[[1231,1231],"valid"],[[1232,1232],"mapped",[1233]],[[1233,1233],"valid"],[[1234,1234],"mapped",[1235]],[[1235,1235],"valid"],[[1236,1236],"mapped",[1237]],[[1237,1237],"valid"],[[1238,1238],"mapped",[1239]],[[1239,1239],"valid"],[[1240,1240],"mapped",[1241]],[[1241,1241],"valid"],[[1242,1242],"mapped",[1243]],[[1243,1243],"valid"],[[1244,1244],"mapped",[1245]],[[1245,1245],"valid"],[[1246,1246],"mapped",[1247]],[[1247,1247],"valid"],[[1248,1248],"mapped",[1249]],[[1249,1249],"valid"],[[1250,1250],"mapped",[1251]],[[1251,1251],"valid"],[[1252,1252],"mapped",[1253]],[[1253,1253],"valid"],[[1254,1254],"mapped",[1255]],[[1255,1255],"valid"],[[1256,1256],"mapped",[1257]],[[1257,1257],"valid"],[[1258,1258],"mapped",[1259]],[[1259,1259],"valid"],[[1260,1260],"mapped",[1261]],[[1261,1261],"valid"],[[1262,1262],"mapped",[1263]],[[1263,1263],"valid"],[[1264,1264],"mapped",[1265]],[[1265,1265],"valid"],[[1266,1266],"mapped",[1267]],[[1267,1267],"valid"],[[1268,1268],"mapped",[1269]],[[1269,1269],"valid"],[[1270,1270],"mapped",[1271]],[[1271,1271],"valid"],[[1272,1272],"mapped",[1273]],[[1273,1273],"valid"],[[1274,1274],"mapped",[1275]],[[1275,1275],"valid"],[[1276,1276],"mapped",[1277]],[[1277,1277],"valid"],[[1278,1278],"mapped",[1279]],[[1279,1279],"valid"],[[1280,1280],"mapped",[1281]],[[1281,1281],"valid"],[[1282,1282],"mapped",[1283]],[[1283,1283],"valid"],[[1284,1284],"mapped",[1285]],[[1285,1285],"valid"],[[1286,1286],"mapped",[1287]],[[1287,1287],"valid"],[[1288,1288],"mapped",[1289]],[[1289,1289],"valid"],[[1290,1290],"mapped",[1291]],[[1291,1291],"valid"],[[1292,1292],"mapped",[1293]],[[1293,1293],"valid"],[[1294,1294],"mapped",[1295]],[[1295,1295],"valid"],[[1296,1296],"mapped",[1297]],[[1297,1297],"valid"],[[1298,1298],"mapped",[1299]],[[1299,1299],"valid"],[[1300,1300],"mapped",[1301]],[[1301,1301],"valid"],[[1302,1302],"mapped",[1303]],[[1303,1303],"valid"],[[1304,1304],"mapped",[1305]],[[1305,1305],"valid"],[[1306,1306],"mapped",[1307]],[[1307,1307],"valid"],[[1308,1308],"mapped",[1309]],[[1309,1309],"valid"],[[1310,1310],"mapped",[1311]],[[1311,1311],"valid"],[[1312,1312],"mapped",[1313]],[[1313,1313],"valid"],[[1314,1314],"mapped",[1315]],[[1315,1315],"valid"],[[1316,1316],"mapped",[1317]],[[1317,1317],"valid"],[[1318,1318],"mapped",[1319]],[[1319,1319],"valid"],[[1320,1320],"mapped",[1321]],[[1321,1321],"valid"],[[1322,1322],"mapped",[1323]],[[1323,1323],"valid"],[[1324,1324],"mapped",[1325]],[[1325,1325],"valid"],[[1326,1326],"mapped",[1327]],[[1327,1327],"valid"],[[1328,1328],"disallowed"],[[1329,1329],"mapped",[1377]],[[1330,1330],"mapped",[1378]],[[1331,1331],"mapped",[1379]],[[1332,1332],"mapped",[1380]],[[1333,1333],"mapped",[1381]],[[1334,1334],"mapped",[1382]],[[1335,1335],"mapped",[1383]],[[1336,1336],"mapped",[1384]],[[1337,1337],"mapped",[1385]],[[1338,1338],"mapped",[1386]],[[1339,1339],"mapped",[1387]],[[1340,1340],"mapped",[1388]],[[1341,1341],"mapped",[1389]],[[1342,1342],"mapped",[1390]],[[1343,1343],"mapped",[1391]],[[1344,1344],"mapped",[1392]],[[1345,1345],"mapped",[1393]],[[1346,1346],"mapped",[1394]],[[1347,1347],"mapped",[1395]],[[1348,1348],"mapped",[1396]],[[1349,1349],"mapped",[1397]],[[1350,1350],"mapped",[1398]],[[1351,1351],"mapped",[1399]],[[1352,1352],"mapped",[1400]],[[1353,1353],"mapped",[1401]],[[1354,1354],"mapped",[1402]],[[1355,1355],"mapped",[1403]],[[1356,1356],"mapped",[1404]],[[1357,1357],"mapped",[1405]],[[1358,1358],"mapped",[1406]],[[1359,1359],"mapped",[1407]],[[1360,1360],"mapped",[1408]],[[1361,1361],"mapped",[1409]],[[1362,1362],"mapped",[1410]],[[1363,1363],"mapped",[1411]],[[1364,1364],"mapped",[1412]],[[1365,1365],"mapped",[1413]],[[1366,1366],"mapped",[1414]],[[1367,1368],"disallowed"],[[1369,1369],"valid"],[[1370,1375],"valid",[],"NV8"],[[1376,1376],"disallowed"],[[1377,1414],"valid"],[[1415,1415],"mapped",[1381,1410]],[[1416,1416],"disallowed"],[[1417,1417],"valid",[],"NV8"],[[1418,1418],"valid",[],"NV8"],[[1419,1420],"disallowed"],[[1421,1422],"valid",[],"NV8"],[[1423,1423],"valid",[],"NV8"],[[1424,1424],"disallowed"],[[1425,1441],"valid"],[[1442,1442],"valid"],[[1443,1455],"valid"],[[1456,1465],"valid"],[[1466,1466],"valid"],[[1467,1469],"valid"],[[1470,1470],"valid",[],"NV8"],[[1471,1471],"valid"],[[1472,1472],"valid",[],"NV8"],[[1473,1474],"valid"],[[1475,1475],"valid",[],"NV8"],[[1476,1476],"valid"],[[1477,1477],"valid"],[[1478,1478],"valid",[],"NV8"],[[1479,1479],"valid"],[[1480,1487],"disallowed"],[[1488,1514],"valid"],[[1515,1519],"disallowed"],[[1520,1524],"valid"],[[1525,1535],"disallowed"],[[1536,1539],"disallowed"],[[1540,1540],"disallowed"],[[1541,1541],"disallowed"],[[1542,1546],"valid",[],"NV8"],[[1547,1547],"valid",[],"NV8"],[[1548,1548],"valid",[],"NV8"],[[1549,1551],"valid",[],"NV8"],[[1552,1557],"valid"],[[1558,1562],"valid"],[[1563,1563],"valid",[],"NV8"],[[1564,1564],"disallowed"],[[1565,1565],"disallowed"],[[1566,1566],"valid",[],"NV8"],[[1567,1567],"valid",[],"NV8"],[[1568,1568],"valid"],[[1569,1594],"valid"],[[1595,1599],"valid"],[[1600,1600],"valid",[],"NV8"],[[1601,1618],"valid"],[[1619,1621],"valid"],[[1622,1624],"valid"],[[1625,1630],"valid"],[[1631,1631],"valid"],[[1632,1641],"valid"],[[1642,1645],"valid",[],"NV8"],[[1646,1647],"valid"],[[1648,1652],"valid"],[[1653,1653],"mapped",[1575,1652]],[[1654,1654],"mapped",[1608,1652]],[[1655,1655],"mapped",[1735,1652]],[[1656,1656],"mapped",[1610,1652]],[[1657,1719],"valid"],[[1720,1721],"valid"],[[1722,1726],"valid"],[[1727,1727],"valid"],[[1728,1742],"valid"],[[1743,1743],"valid"],[[1744,1747],"valid"],[[1748,1748],"valid",[],"NV8"],[[1749,1756],"valid"],[[1757,1757],"disallowed"],[[1758,1758],"valid",[],"NV8"],[[1759,1768],"valid"],[[1769,1769],"valid",[],"NV8"],[[1770,1773],"valid"],[[1774,1775],"valid"],[[1776,1785],"valid"],[[1786,1790],"valid"],[[1791,1791],"valid"],[[1792,1805],"valid",[],"NV8"],[[1806,1806],"disallowed"],[[1807,1807],"disallowed"],[[1808,1836],"valid"],[[1837,1839],"valid"],[[1840,1866],"valid"],[[1867,1868],"disallowed"],[[1869,1871],"valid"],[[1872,1901],"valid"],[[1902,1919],"valid"],[[1920,1968],"valid"],[[1969,1969],"valid"],[[1970,1983],"disallowed"],[[1984,2037],"valid"],[[2038,2042],"valid",[],"NV8"],[[2043,2047],"disallowed"],[[2048,2093],"valid"],[[2094,2095],"disallowed"],[[2096,2110],"valid",[],"NV8"],[[2111,2111],"disallowed"],[[2112,2139],"valid"],[[2140,2141],"disallowed"],[[2142,2142],"valid",[],"NV8"],[[2143,2207],"disallowed"],[[2208,2208],"valid"],[[2209,2209],"valid"],[[2210,2220],"valid"],[[2221,2226],"valid"],[[2227,2228],"valid"],[[2229,2274],"disallowed"],[[2275,2275],"valid"],[[2276,2302],"valid"],[[2303,2303],"valid"],[[2304,2304],"valid"],[[2305,2307],"valid"],[[2308,2308],"valid"],[[2309,2361],"valid"],[[2362,2363],"valid"],[[2364,2381],"valid"],[[2382,2382],"valid"],[[2383,2383],"valid"],[[2384,2388],"valid"],[[2389,2389],"valid"],[[2390,2391],"valid"],[[2392,2392],"mapped",[2325,2364]],[[2393,2393],"mapped",[2326,2364]],[[2394,2394],"mapped",[2327,2364]],[[2395,2395],"mapped",[2332,2364]],[[2396,2396],"mapped",[2337,2364]],[[2397,2397],"mapped",[2338,2364]],[[2398,2398],"mapped",[2347,2364]],[[2399,2399],"mapped",[2351,2364]],[[2400,2403],"valid"],[[2404,2405],"valid",[],"NV8"],[[2406,2415],"valid"],[[2416,2416],"valid",[],"NV8"],[[2417,2418],"valid"],[[2419,2423],"valid"],[[2424,2424],"valid"],[[2425,2426],"valid"],[[2427,2428],"valid"],[[2429,2429],"valid"],[[2430,2431],"valid"],[[2432,2432],"valid"],[[2433,2435],"valid"],[[2436,2436],"disallowed"],[[2437,2444],"valid"],[[2445,2446],"disallowed"],[[2447,2448],"valid"],[[2449,2450],"disallowed"],[[2451,2472],"valid"],[[2473,2473],"disallowed"],[[2474,2480],"valid"],[[2481,2481],"disallowed"],[[2482,2482],"valid"],[[2483,2485],"disallowed"],[[2486,2489],"valid"],[[2490,2491],"disallowed"],[[2492,2492],"valid"],[[2493,2493],"valid"],[[2494,2500],"valid"],[[2501,2502],"disallowed"],[[2503,2504],"valid"],[[2505,2506],"disallowed"],[[2507,2509],"valid"],[[2510,2510],"valid"],[[2511,2518],"disallowed"],[[2519,2519],"valid"],[[2520,2523],"disallowed"],[[2524,2524],"mapped",[2465,2492]],[[2525,2525],"mapped",[2466,2492]],[[2526,2526],"disallowed"],[[2527,2527],"mapped",[2479,2492]],[[2528,2531],"valid"],[[2532,2533],"disallowed"],[[2534,2545],"valid"],[[2546,2554],"valid",[],"NV8"],[[2555,2555],"valid",[],"NV8"],[[2556,2560],"disallowed"],[[2561,2561],"valid"],[[2562,2562],"valid"],[[2563,2563],"valid"],[[2564,2564],"disallowed"],[[2565,2570],"valid"],[[2571,2574],"disallowed"],[[2575,2576],"valid"],[[2577,2578],"disallowed"],[[2579,2600],"valid"],[[2601,2601],"disallowed"],[[2602,2608],"valid"],[[2609,2609],"disallowed"],[[2610,2610],"valid"],[[2611,2611],"mapped",[2610,2620]],[[2612,2612],"disallowed"],[[2613,2613],"valid"],[[2614,2614],"mapped",[2616,2620]],[[2615,2615],"disallowed"],[[2616,2617],"valid"],[[2618,2619],"disallowed"],[[2620,2620],"valid"],[[2621,2621],"disallowed"],[[2622,2626],"valid"],[[2627,2630],"disallowed"],[[2631,2632],"valid"],[[2633,2634],"disallowed"],[[2635,2637],"valid"],[[2638,2640],"disallowed"],[[2641,2641],"valid"],[[2642,2648],"disallowed"],[[2649,2649],"mapped",[2582,2620]],[[2650,2650],"mapped",[2583,2620]],[[2651,2651],"mapped",[2588,2620]],[[2652,2652],"valid"],[[2653,2653],"disallowed"],[[2654,2654],"mapped",[2603,2620]],[[2655,2661],"disallowed"],[[2662,2676],"valid"],[[2677,2677],"valid"],[[2678,2688],"disallowed"],[[2689,2691],"valid"],[[2692,2692],"disallowed"],[[2693,2699],"valid"],[[2700,2700],"valid"],[[2701,2701],"valid"],[[2702,2702],"disallowed"],[[2703,2705],"valid"],[[2706,2706],"disallowed"],[[2707,2728],"valid"],[[2729,2729],"disallowed"],[[2730,2736],"valid"],[[2737,2737],"disallowed"],[[2738,2739],"valid"],[[2740,2740],"disallowed"],[[2741,2745],"valid"],[[2746,2747],"disallowed"],[[2748,2757],"valid"],[[2758,2758],"disallowed"],[[2759,2761],"valid"],[[2762,2762],"disallowed"],[[2763,2765],"valid"],[[2766,2767],"disallowed"],[[2768,2768],"valid"],[[2769,2783],"disallowed"],[[2784,2784],"valid"],[[2785,2787],"valid"],[[2788,2789],"disallowed"],[[2790,2799],"valid"],[[2800,2800],"valid",[],"NV8"],[[2801,2801],"valid",[],"NV8"],[[2802,2808],"disallowed"],[[2809,2809],"valid"],[[2810,2816],"disallowed"],[[2817,2819],"valid"],[[2820,2820],"disallowed"],[[2821,2828],"valid"],[[2829,2830],"disallowed"],[[2831,2832],"valid"],[[2833,2834],"disallowed"],[[2835,2856],"valid"],[[2857,2857],"disallowed"],[[2858,2864],"valid"],[[2865,2865],"disallowed"],[[2866,2867],"valid"],[[2868,2868],"disallowed"],[[2869,2869],"valid"],[[2870,2873],"valid"],[[2874,2875],"disallowed"],[[2876,2883],"valid"],[[2884,2884],"valid"],[[2885,2886],"disallowed"],[[2887,2888],"valid"],[[2889,2890],"disallowed"],[[2891,2893],"valid"],[[2894,2901],"disallowed"],[[2902,2903],"valid"],[[2904,2907],"disallowed"],[[2908,2908],"mapped",[2849,2876]],[[2909,2909],"mapped",[2850,2876]],[[2910,2910],"disallowed"],[[2911,2913],"valid"],[[2914,2915],"valid"],[[2916,2917],"disallowed"],[[2918,2927],"valid"],[[2928,2928],"valid",[],"NV8"],[[2929,2929],"valid"],[[2930,2935],"valid",[],"NV8"],[[2936,2945],"disallowed"],[[2946,2947],"valid"],[[2948,2948],"disallowed"],[[2949,2954],"valid"],[[2955,2957],"disallowed"],[[2958,2960],"valid"],[[2961,2961],"disallowed"],[[2962,2965],"valid"],[[2966,2968],"disallowed"],[[2969,2970],"valid"],[[2971,2971],"disallowed"],[[2972,2972],"valid"],[[2973,2973],"disallowed"],[[2974,2975],"valid"],[[2976,2978],"disallowed"],[[2979,2980],"valid"],[[2981,2983],"disallowed"],[[2984,2986],"valid"],[[2987,2989],"disallowed"],[[2990,2997],"valid"],[[2998,2998],"valid"],[[2999,3001],"valid"],[[3002,3005],"disallowed"],[[3006,3010],"valid"],[[3011,3013],"disallowed"],[[3014,3016],"valid"],[[3017,3017],"disallowed"],[[3018,3021],"valid"],[[3022,3023],"disallowed"],[[3024,3024],"valid"],[[3025,3030],"disallowed"],[[3031,3031],"valid"],[[3032,3045],"disallowed"],[[3046,3046],"valid"],[[3047,3055],"valid"],[[3056,3058],"valid",[],"NV8"],[[3059,3066],"valid",[],"NV8"],[[3067,3071],"disallowed"],[[3072,3072],"valid"],[[3073,3075],"valid"],[[3076,3076],"disallowed"],[[3077,3084],"valid"],[[3085,3085],"disallowed"],[[3086,3088],"valid"],[[3089,3089],"disallowed"],[[3090,3112],"valid"],[[3113,3113],"disallowed"],[[3114,3123],"valid"],[[3124,3124],"valid"],[[3125,3129],"valid"],[[3130,3132],"disallowed"],[[3133,3133],"valid"],[[3134,3140],"valid"],[[3141,3141],"disallowed"],[[3142,3144],"valid"],[[3145,3145],"disallowed"],[[3146,3149],"valid"],[[3150,3156],"disallowed"],[[3157,3158],"valid"],[[3159,3159],"disallowed"],[[3160,3161],"valid"],[[3162,3162],"valid"],[[3163,3167],"disallowed"],[[3168,3169],"valid"],[[3170,3171],"valid"],[[3172,3173],"disallowed"],[[3174,3183],"valid"],[[3184,3191],"disallowed"],[[3192,3199],"valid",[],"NV8"],[[3200,3200],"disallowed"],[[3201,3201],"valid"],[[3202,3203],"valid"],[[3204,3204],"disallowed"],[[3205,3212],"valid"],[[3213,3213],"disallowed"],[[3214,3216],"valid"],[[3217,3217],"disallowed"],[[3218,3240],"valid"],[[3241,3241],"disallowed"],[[3242,3251],"valid"],[[3252,3252],"disallowed"],[[3253,3257],"valid"],[[3258,3259],"disallowed"],[[3260,3261],"valid"],[[3262,3268],"valid"],[[3269,3269],"disallowed"],[[3270,3272],"valid"],[[3273,3273],"disallowed"],[[3274,3277],"valid"],[[3278,3284],"disallowed"],[[3285,3286],"valid"],[[3287,3293],"disallowed"],[[3294,3294],"valid"],[[3295,3295],"disallowed"],[[3296,3297],"valid"],[[3298,3299],"valid"],[[3300,3301],"disallowed"],[[3302,3311],"valid"],[[3312,3312],"disallowed"],[[3313,3314],"valid"],[[3315,3328],"disallowed"],[[3329,3329],"valid"],[[3330,3331],"valid"],[[3332,3332],"disallowed"],[[3333,3340],"valid"],[[3341,3341],"disallowed"],[[3342,3344],"valid"],[[3345,3345],"disallowed"],[[3346,3368],"valid"],[[3369,3369],"valid"],[[3370,3385],"valid"],[[3386,3386],"valid"],[[3387,3388],"disallowed"],[[3389,3389],"valid"],[[3390,3395],"valid"],[[3396,3396],"valid"],[[3397,3397],"disallowed"],[[3398,3400],"valid"],[[3401,3401],"disallowed"],[[3402,3405],"valid"],[[3406,3406],"valid"],[[3407,3414],"disallowed"],[[3415,3415],"valid"],[[3416,3422],"disallowed"],[[3423,3423],"valid"],[[3424,3425],"valid"],[[3426,3427],"valid"],[[3428,3429],"disallowed"],[[3430,3439],"valid"],[[3440,3445],"valid",[],"NV8"],[[3446,3448],"disallowed"],[[3449,3449],"valid",[],"NV8"],[[3450,3455],"valid"],[[3456,3457],"disallowed"],[[3458,3459],"valid"],[[3460,3460],"disallowed"],[[3461,3478],"valid"],[[3479,3481],"disallowed"],[[3482,3505],"valid"],[[3506,3506],"disallowed"],[[3507,3515],"valid"],[[3516,3516],"disallowed"],[[3517,3517],"valid"],[[3518,3519],"disallowed"],[[3520,3526],"valid"],[[3527,3529],"disallowed"],[[3530,3530],"valid"],[[3531,3534],"disallowed"],[[3535,3540],"valid"],[[3541,3541],"disallowed"],[[3542,3542],"valid"],[[3543,3543],"disallowed"],[[3544,3551],"valid"],[[3552,3557],"disallowed"],[[3558,3567],"valid"],[[3568,3569],"disallowed"],[[3570,3571],"valid"],[[3572,3572],"valid",[],"NV8"],[[3573,3584],"disallowed"],[[3585,3634],"valid"],[[3635,3635],"mapped",[3661,3634]],[[3636,3642],"valid"],[[3643,3646],"disallowed"],[[3647,3647],"valid",[],"NV8"],[[3648,3662],"valid"],[[3663,3663],"valid",[],"NV8"],[[3664,3673],"valid"],[[3674,3675],"valid",[],"NV8"],[[3676,3712],"disallowed"],[[3713,3714],"valid"],[[3715,3715],"disallowed"],[[3716,3716],"valid"],[[3717,3718],"disallowed"],[[3719,3720],"valid"],[[3721,3721],"disallowed"],[[3722,3722],"valid"],[[3723,3724],"disallowed"],[[3725,3725],"valid"],[[3726,3731],"disallowed"],[[3732,3735],"valid"],[[3736,3736],"disallowed"],[[3737,3743],"valid"],[[3744,3744],"disallowed"],[[3745,3747],"valid"],[[3748,3748],"disallowed"],[[3749,3749],"valid"],[[3750,3750],"disallowed"],[[3751,3751],"valid"],[[3752,3753],"disallowed"],[[3754,3755],"valid"],[[3756,3756],"disallowed"],[[3757,3762],"valid"],[[3763,3763],"mapped",[3789,3762]],[[3764,3769],"valid"],[[3770,3770],"disallowed"],[[3771,3773],"valid"],[[3774,3775],"disallowed"],[[3776,3780],"valid"],[[3781,3781],"disallowed"],[[3782,3782],"valid"],[[3783,3783],"disallowed"],[[3784,3789],"valid"],[[3790,3791],"disallowed"],[[3792,3801],"valid"],[[3802,3803],"disallowed"],[[3804,3804],"mapped",[3755,3737]],[[3805,3805],"mapped",[3755,3745]],[[3806,3807],"valid"],[[3808,3839],"disallowed"],[[3840,3840],"valid"],[[3841,3850],"valid",[],"NV8"],[[3851,3851],"valid"],[[3852,3852],"mapped",[3851]],[[3853,3863],"valid",[],"NV8"],[[3864,3865],"valid"],[[3866,3871],"valid",[],"NV8"],[[3872,3881],"valid"],[[3882,3892],"valid",[],"NV8"],[[3893,3893],"valid"],[[3894,3894],"valid",[],"NV8"],[[3895,3895],"valid"],[[3896,3896],"valid",[],"NV8"],[[3897,3897],"valid"],[[3898,3901],"valid",[],"NV8"],[[3902,3906],"valid"],[[3907,3907],"mapped",[3906,4023]],[[3908,3911],"valid"],[[3912,3912],"disallowed"],[[3913,3916],"valid"],[[3917,3917],"mapped",[3916,4023]],[[3918,3921],"valid"],[[3922,3922],"mapped",[3921,4023]],[[3923,3926],"valid"],[[3927,3927],"mapped",[3926,4023]],[[3928,3931],"valid"],[[3932,3932],"mapped",[3931,4023]],[[3933,3944],"valid"],[[3945,3945],"mapped",[3904,4021]],[[3946,3946],"valid"],[[3947,3948],"valid"],[[3949,3952],"disallowed"],[[3953,3954],"valid"],[[3955,3955],"mapped",[3953,3954]],[[3956,3956],"valid"],[[3957,3957],"mapped",[3953,3956]],[[3958,3958],"mapped",[4018,3968]],[[3959,3959],"mapped",[4018,3953,3968]],[[3960,3960],"mapped",[4019,3968]],[[3961,3961],"mapped",[4019,3953,3968]],[[3962,3968],"valid"],[[3969,3969],"mapped",[3953,3968]],[[3970,3972],"valid"],[[3973,3973],"valid",[],"NV8"],[[3974,3979],"valid"],[[3980,3983],"valid"],[[3984,3986],"valid"],[[3987,3987],"mapped",[3986,4023]],[[3988,3989],"valid"],[[3990,3990],"valid"],[[3991,3991],"valid"],[[3992,3992],"disallowed"],[[3993,3996],"valid"],[[3997,3997],"mapped",[3996,4023]],[[3998,4001],"valid"],[[4002,4002],"mapped",[4001,4023]],[[4003,4006],"valid"],[[4007,4007],"mapped",[4006,4023]],[[4008,4011],"valid"],[[4012,4012],"mapped",[4011,4023]],[[4013,4013],"valid"],[[4014,4016],"valid"],[[4017,4023],"valid"],[[4024,4024],"valid"],[[4025,4025],"mapped",[3984,4021]],[[4026,4028],"valid"],[[4029,4029],"disallowed"],[[4030,4037],"valid",[],"NV8"],[[4038,4038],"valid"],[[4039,4044],"valid",[],"NV8"],[[4045,4045],"disallowed"],[[4046,4046],"valid",[],"NV8"],[[4047,4047],"valid",[],"NV8"],[[4048,4049],"valid",[],"NV8"],[[4050,4052],"valid",[],"NV8"],[[4053,4056],"valid",[],"NV8"],[[4057,4058],"valid",[],"NV8"],[[4059,4095],"disallowed"],[[4096,4129],"valid"],[[4130,4130],"valid"],[[4131,4135],"valid"],[[4136,4136],"valid"],[[4137,4138],"valid"],[[4139,4139],"valid"],[[4140,4146],"valid"],[[4147,4149],"valid"],[[4150,4153],"valid"],[[4154,4159],"valid"],[[4160,4169],"valid"],[[4170,4175],"valid",[],"NV8"],[[4176,4185],"valid"],[[4186,4249],"valid"],[[4250,4253],"valid"],[[4254,4255],"valid",[],"NV8"],[[4256,4293],"disallowed"],[[4294,4294],"disallowed"],[[4295,4295],"mapped",[11559]],[[4296,4300],"disallowed"],[[4301,4301],"mapped",[11565]],[[4302,4303],"disallowed"],[[4304,4342],"valid"],[[4343,4344],"valid"],[[4345,4346],"valid"],[[4347,4347],"valid",[],"NV8"],[[4348,4348],"mapped",[4316]],[[4349,4351],"valid"],[[4352,4441],"valid",[],"NV8"],[[4442,4446],"valid",[],"NV8"],[[4447,4448],"disallowed"],[[4449,4514],"valid",[],"NV8"],[[4515,4519],"valid",[],"NV8"],[[4520,4601],"valid",[],"NV8"],[[4602,4607],"valid",[],"NV8"],[[4608,4614],"valid"],[[4615,4615],"valid"],[[4616,4678],"valid"],[[4679,4679],"valid"],[[4680,4680],"valid"],[[4681,4681],"disallowed"],[[4682,4685],"valid"],[[4686,4687],"disallowed"],[[4688,4694],"valid"],[[4695,4695],"disallowed"],[[4696,4696],"valid"],[[4697,4697],"disallowed"],[[4698,4701],"valid"],[[4702,4703],"disallowed"],[[4704,4742],"valid"],[[4743,4743],"valid"],[[4744,4744],"valid"],[[4745,4745],"disallowed"],[[4746,4749],"valid"],[[4750,4751],"disallowed"],[[4752,4782],"valid"],[[4783,4783],"valid"],[[4784,4784],"valid"],[[4785,4785],"disallowed"],[[4786,4789],"valid"],[[4790,4791],"disallowed"],[[4792,4798],"valid"],[[4799,4799],"disallowed"],[[4800,4800],"valid"],[[4801,4801],"disallowed"],[[4802,4805],"valid"],[[4806,4807],"disallowed"],[[4808,4814],"valid"],[[4815,4815],"valid"],[[4816,4822],"valid"],[[4823,4823],"disallowed"],[[4824,4846],"valid"],[[4847,4847],"valid"],[[4848,4878],"valid"],[[4879,4879],"valid"],[[4880,4880],"valid"],[[4881,4881],"disallowed"],[[4882,4885],"valid"],[[4886,4887],"disallowed"],[[4888,4894],"valid"],[[4895,4895],"valid"],[[4896,4934],"valid"],[[4935,4935],"valid"],[[4936,4954],"valid"],[[4955,4956],"disallowed"],[[4957,4958],"valid"],[[4959,4959],"valid"],[[4960,4960],"valid",[],"NV8"],[[4961,4988],"valid",[],"NV8"],[[4989,4991],"disallowed"],[[4992,5007],"valid"],[[5008,5017],"valid",[],"NV8"],[[5018,5023],"disallowed"],[[5024,5108],"valid"],[[5109,5109],"valid"],[[5110,5111],"disallowed"],[[5112,5112],"mapped",[5104]],[[5113,5113],"mapped",[5105]],[[5114,5114],"mapped",[5106]],[[5115,5115],"mapped",[5107]],[[5116,5116],"mapped",[5108]],[[5117,5117],"mapped",[5109]],[[5118,5119],"disallowed"],[[5120,5120],"valid",[],"NV8"],[[5121,5740],"valid"],[[5741,5742],"valid",[],"NV8"],[[5743,5750],"valid"],[[5751,5759],"valid"],[[5760,5760],"disallowed"],[[5761,5786],"valid"],[[5787,5788],"valid",[],"NV8"],[[5789,5791],"disallowed"],[[5792,5866],"valid"],[[5867,5872],"valid",[],"NV8"],[[5873,5880],"valid"],[[5881,5887],"disallowed"],[[5888,5900],"valid"],[[5901,5901],"disallowed"],[[5902,5908],"valid"],[[5909,5919],"disallowed"],[[5920,5940],"valid"],[[5941,5942],"valid",[],"NV8"],[[5943,5951],"disallowed"],[[5952,5971],"valid"],[[5972,5983],"disallowed"],[[5984,5996],"valid"],[[5997,5997],"disallowed"],[[5998,6000],"valid"],[[6001,6001],"disallowed"],[[6002,6003],"valid"],[[6004,6015],"disallowed"],[[6016,6067],"valid"],[[6068,6069],"disallowed"],[[6070,6099],"valid"],[[6100,6102],"valid",[],"NV8"],[[6103,6103],"valid"],[[6104,6107],"valid",[],"NV8"],[[6108,6108],"valid"],[[6109,6109],"valid"],[[6110,6111],"disallowed"],[[6112,6121],"valid"],[[6122,6127],"disallowed"],[[6128,6137],"valid",[],"NV8"],[[6138,6143],"disallowed"],[[6144,6149],"valid",[],"NV8"],[[6150,6150],"disallowed"],[[6151,6154],"valid",[],"NV8"],[[6155,6157],"ignored"],[[6158,6158],"disallowed"],[[6159,6159],"disallowed"],[[6160,6169],"valid"],[[6170,6175],"disallowed"],[[6176,6263],"valid"],[[6264,6271],"disallowed"],[[6272,6313],"valid"],[[6314,6314],"valid"],[[6315,6319],"disallowed"],[[6320,6389],"valid"],[[6390,6399],"disallowed"],[[6400,6428],"valid"],[[6429,6430],"valid"],[[6431,6431],"disallowed"],[[6432,6443],"valid"],[[6444,6447],"disallowed"],[[6448,6459],"valid"],[[6460,6463],"disallowed"],[[6464,6464],"valid",[],"NV8"],[[6465,6467],"disallowed"],[[6468,6469],"valid",[],"NV8"],[[6470,6509],"valid"],[[6510,6511],"disallowed"],[[6512,6516],"valid"],[[6517,6527],"disallowed"],[[6528,6569],"valid"],[[6570,6571],"valid"],[[6572,6575],"disallowed"],[[6576,6601],"valid"],[[6602,6607],"disallowed"],[[6608,6617],"valid"],[[6618,6618],"valid",[],"XV8"],[[6619,6621],"disallowed"],[[6622,6623],"valid",[],"NV8"],[[6624,6655],"valid",[],"NV8"],[[6656,6683],"valid"],[[6684,6685],"disallowed"],[[6686,6687],"valid",[],"NV8"],[[6688,6750],"valid"],[[6751,6751],"disallowed"],[[6752,6780],"valid"],[[6781,6782],"disallowed"],[[6783,6793],"valid"],[[6794,6799],"disallowed"],[[6800,6809],"valid"],[[6810,6815],"disallowed"],[[6816,6822],"valid",[],"NV8"],[[6823,6823],"valid"],[[6824,6829],"valid",[],"NV8"],[[6830,6831],"disallowed"],[[6832,6845],"valid"],[[6846,6846],"valid",[],"NV8"],[[6847,6911],"disallowed"],[[6912,6987],"valid"],[[6988,6991],"disallowed"],[[6992,7001],"valid"],[[7002,7018],"valid",[],"NV8"],[[7019,7027],"valid"],[[7028,7036],"valid",[],"NV8"],[[7037,7039],"disallowed"],[[7040,7082],"valid"],[[7083,7085],"valid"],[[7086,7097],"valid"],[[7098,7103],"valid"],[[7104,7155],"valid"],[[7156,7163],"disallowed"],[[7164,7167],"valid",[],"NV8"],[[7168,7223],"valid"],[[7224,7226],"disallowed"],[[7227,7231],"valid",[],"NV8"],[[7232,7241],"valid"],[[7242,7244],"disallowed"],[[7245,7293],"valid"],[[7294,7295],"valid",[],"NV8"],[[7296,7359],"disallowed"],[[7360,7367],"valid",[],"NV8"],[[7368,7375],"disallowed"],[[7376,7378],"valid"],[[7379,7379],"valid",[],"NV8"],[[7380,7410],"valid"],[[7411,7414],"valid"],[[7415,7415],"disallowed"],[[7416,7417],"valid"],[[7418,7423],"disallowed"],[[7424,7467],"valid"],[[7468,7468],"mapped",[97]],[[7469,7469],"mapped",[230]],[[7470,7470],"mapped",[98]],[[7471,7471],"valid"],[[7472,7472],"mapped",[100]],[[7473,7473],"mapped",[101]],[[7474,7474],"mapped",[477]],[[7475,7475],"mapped",[103]],[[7476,7476],"mapped",[104]],[[7477,7477],"mapped",[105]],[[7478,7478],"mapped",[106]],[[7479,7479],"mapped",[107]],[[7480,7480],"mapped",[108]],[[7481,7481],"mapped",[109]],[[7482,7482],"mapped",[110]],[[7483,7483],"valid"],[[7484,7484],"mapped",[111]],[[7485,7485],"mapped",[547]],[[7486,7486],"mapped",[112]],[[7487,7487],"mapped",[114]],[[7488,7488],"mapped",[116]],[[7489,7489],"mapped",[117]],[[7490,7490],"mapped",[119]],[[7491,7491],"mapped",[97]],[[7492,7492],"mapped",[592]],[[7493,7493],"mapped",[593]],[[7494,7494],"mapped",[7426]],[[7495,7495],"mapped",[98]],[[7496,7496],"mapped",[100]],[[7497,7497],"mapped",[101]],[[7498,7498],"mapped",[601]],[[7499,7499],"mapped",[603]],[[7500,7500],"mapped",[604]],[[7501,7501],"mapped",[103]],[[7502,7502],"valid"],[[7503,7503],"mapped",[107]],[[7504,7504],"mapped",[109]],[[7505,7505],"mapped",[331]],[[7506,7506],"mapped",[111]],[[7507,7507],"mapped",[596]],[[7508,7508],"mapped",[7446]],[[7509,7509],"mapped",[7447]],[[7510,7510],"mapped",[112]],[[7511,7511],"mapped",[116]],[[7512,7512],"mapped",[117]],[[7513,7513],"mapped",[7453]],[[7514,7514],"mapped",[623]],[[7515,7515],"mapped",[118]],[[7516,7516],"mapped",[7461]],[[7517,7517],"mapped",[946]],[[7518,7518],"mapped",[947]],[[7519,7519],"mapped",[948]],[[7520,7520],"mapped",[966]],[[7521,7521],"mapped",[967]],[[7522,7522],"mapped",[105]],[[7523,7523],"mapped",[114]],[[7524,7524],"mapped",[117]],[[7525,7525],"mapped",[118]],[[7526,7526],"mapped",[946]],[[7527,7527],"mapped",[947]],[[7528,7528],"mapped",[961]],[[7529,7529],"mapped",[966]],[[7530,7530],"mapped",[967]],[[7531,7531],"valid"],[[7532,7543],"valid"],[[7544,7544],"mapped",[1085]],[[7545,7578],"valid"],[[7579,7579],"mapped",[594]],[[7580,7580],"mapped",[99]],[[7581,7581],"mapped",[597]],[[7582,7582],"mapped",[240]],[[7583,7583],"mapped",[604]],[[7584,7584],"mapped",[102]],[[7585,7585],"mapped",[607]],[[7586,7586],"mapped",[609]],[[7587,7587],"mapped",[613]],[[7588,7588],"mapped",[616]],[[7589,7589],"mapped",[617]],[[7590,7590],"mapped",[618]],[[7591,7591],"mapped",[7547]],[[7592,7592],"mapped",[669]],[[7593,7593],"mapped",[621]],[[7594,7594],"mapped",[7557]],[[7595,7595],"mapped",[671]],[[7596,7596],"mapped",[625]],[[7597,7597],"mapped",[624]],[[7598,7598],"mapped",[626]],[[7599,7599],"mapped",[627]],[[7600,7600],"mapped",[628]],[[7601,7601],"mapped",[629]],[[7602,7602],"mapped",[632]],[[7603,7603],"mapped",[642]],[[7604,7604],"mapped",[643]],[[7605,7605],"mapped",[427]],[[7606,7606],"mapped",[649]],[[7607,7607],"mapped",[650]],[[7608,7608],"mapped",[7452]],[[7609,7609],"mapped",[651]],[[7610,7610],"mapped",[652]],[[7611,7611],"mapped",[122]],[[7612,7612],"mapped",[656]],[[7613,7613],"mapped",[657]],[[7614,7614],"mapped",[658]],[[7615,7615],"mapped",[952]],[[7616,7619],"valid"],[[7620,7626],"valid"],[[7627,7654],"valid"],[[7655,7669],"valid"],[[7670,7675],"disallowed"],[[7676,7676],"valid"],[[7677,7677],"valid"],[[7678,7679],"valid"],[[7680,7680],"mapped",[7681]],[[7681,7681],"valid"],[[7682,7682],"mapped",[7683]],[[7683,7683],"valid"],[[7684,7684],"mapped",[7685]],[[7685,7685],"valid"],[[7686,7686],"mapped",[7687]],[[7687,7687],"valid"],[[7688,7688],"mapped",[7689]],[[7689,7689],"valid"],[[7690,7690],"mapped",[7691]],[[7691,7691],"valid"],[[7692,7692],"mapped",[7693]],[[7693,7693],"valid"],[[7694,7694],"mapped",[7695]],[[7695,7695],"valid"],[[7696,7696],"mapped",[7697]],[[7697,7697],"valid"],[[7698,7698],"mapped",[7699]],[[7699,7699],"valid"],[[7700,7700],"mapped",[7701]],[[7701,7701],"valid"],[[7702,7702],"mapped",[7703]],[[7703,7703],"valid"],[[7704,7704],"mapped",[7705]],[[7705,7705],"valid"],[[7706,7706],"mapped",[7707]],[[7707,7707],"valid"],[[7708,7708],"mapped",[7709]],[[7709,7709],"valid"],[[7710,7710],"mapped",[7711]],[[7711,7711],"valid"],[[7712,7712],"mapped",[7713]],[[7713,7713],"valid"],[[7714,7714],"mapped",[7715]],[[7715,7715],"valid"],[[7716,7716],"mapped",[7717]],[[7717,7717],"valid"],[[7718,7718],"mapped",[7719]],[[7719,7719],"valid"],[[7720,7720],"mapped",[7721]],[[7721,7721],"valid"],[[7722,7722],"mapped",[7723]],[[7723,7723],"valid"],[[7724,7724],"mapped",[7725]],[[7725,7725],"valid"],[[7726,7726],"mapped",[7727]],[[7727,7727],"valid"],[[7728,7728],"mapped",[7729]],[[7729,7729],"valid"],[[7730,7730],"mapped",[7731]],[[7731,7731],"valid"],[[7732,7732],"mapped",[7733]],[[7733,7733],"valid"],[[7734,7734],"mapped",[7735]],[[7735,7735],"valid"],[[7736,7736],"mapped",[7737]],[[7737,7737],"valid"],[[7738,7738],"mapped",[7739]],[[7739,7739],"valid"],[[7740,7740],"mapped",[7741]],[[7741,7741],"valid"],[[7742,7742],"mapped",[7743]],[[7743,7743],"valid"],[[7744,7744],"mapped",[7745]],[[7745,7745],"valid"],[[7746,7746],"mapped",[7747]],[[7747,7747],"valid"],[[7748,7748],"mapped",[7749]],[[7749,7749],"valid"],[[7750,7750],"mapped",[7751]],[[7751,7751],"valid"],[[7752,7752],"mapped",[7753]],[[7753,7753],"valid"],[[7754,7754],"mapped",[7755]],[[7755,7755],"valid"],[[7756,7756],"mapped",[7757]],[[7757,7757],"valid"],[[7758,7758],"mapped",[7759]],[[7759,7759],"valid"],[[7760,7760],"mapped",[7761]],[[7761,7761],"valid"],[[7762,7762],"mapped",[7763]],[[7763,7763],"valid"],[[7764,7764],"mapped",[7765]],[[7765,7765],"valid"],[[7766,7766],"mapped",[7767]],[[7767,7767],"valid"],[[7768,7768],"mapped",[7769]],[[7769,7769],"valid"],[[7770,7770],"mapped",[7771]],[[7771,7771],"valid"],[[7772,7772],"mapped",[7773]],[[7773,7773],"valid"],[[7774,7774],"mapped",[7775]],[[7775,7775],"valid"],[[7776,7776],"mapped",[7777]],[[7777,7777],"valid"],[[7778,7778],"mapped",[7779]],[[7779,7779],"valid"],[[7780,7780],"mapped",[7781]],[[7781,7781],"valid"],[[7782,7782],"mapped",[7783]],[[7783,7783],"valid"],[[7784,7784],"mapped",[7785]],[[7785,7785],"valid"],[[7786,7786],"mapped",[7787]],[[7787,7787],"valid"],[[7788,7788],"mapped",[7789]],[[7789,7789],"valid"],[[7790,7790],"mapped",[7791]],[[7791,7791],"valid"],[[7792,7792],"mapped",[7793]],[[7793,7793],"valid"],[[7794,7794],"mapped",[7795]],[[7795,7795],"valid"],[[7796,7796],"mapped",[7797]],[[7797,7797],"valid"],[[7798,7798],"mapped",[7799]],[[7799,7799],"valid"],[[7800,7800],"mapped",[7801]],[[7801,7801],"valid"],[[7802,7802],"mapped",[7803]],[[7803,7803],"valid"],[[7804,7804],"mapped",[7805]],[[7805,7805],"valid"],[[7806,7806],"mapped",[7807]],[[7807,7807],"valid"],[[7808,7808],"mapped",[7809]],[[7809,7809],"valid"],[[7810,7810],"mapped",[7811]],[[7811,7811],"valid"],[[7812,7812],"mapped",[7813]],[[7813,7813],"valid"],[[7814,7814],"mapped",[7815]],[[7815,7815],"valid"],[[7816,7816],"mapped",[7817]],[[7817,7817],"valid"],[[7818,7818],"mapped",[7819]],[[7819,7819],"valid"],[[7820,7820],"mapped",[7821]],[[7821,7821],"valid"],[[7822,7822],"mapped",[7823]],[[7823,7823],"valid"],[[7824,7824],"mapped",[7825]],[[7825,7825],"valid"],[[7826,7826],"mapped",[7827]],[[7827,7827],"valid"],[[7828,7828],"mapped",[7829]],[[7829,7833],"valid"],[[7834,7834],"mapped",[97,702]],[[7835,7835],"mapped",[7777]],[[7836,7837],"valid"],[[7838,7838],"mapped",[115,115]],[[7839,7839],"valid"],[[7840,7840],"mapped",[7841]],[[7841,7841],"valid"],[[7842,7842],"mapped",[7843]],[[7843,7843],"valid"],[[7844,7844],"mapped",[7845]],[[7845,7845],"valid"],[[7846,7846],"mapped",[7847]],[[7847,7847],"valid"],[[7848,7848],"mapped",[7849]],[[7849,7849],"valid"],[[7850,7850],"mapped",[7851]],[[7851,7851],"valid"],[[7852,7852],"mapped",[7853]],[[7853,7853],"valid"],[[7854,7854],"mapped",[7855]],[[7855,7855],"valid"],[[7856,7856],"mapped",[7857]],[[7857,7857],"valid"],[[7858,7858],"mapped",[7859]],[[7859,7859],"valid"],[[7860,7860],"mapped",[7861]],[[7861,7861],"valid"],[[7862,7862],"mapped",[7863]],[[7863,7863],"valid"],[[7864,7864],"mapped",[7865]],[[7865,7865],"valid"],[[7866,7866],"mapped",[7867]],[[7867,7867],"valid"],[[7868,7868],"mapped",[7869]],[[7869,7869],"valid"],[[7870,7870],"mapped",[7871]],[[7871,7871],"valid"],[[7872,7872],"mapped",[7873]],[[7873,7873],"valid"],[[7874,7874],"mapped",[7875]],[[7875,7875],"valid"],[[7876,7876],"mapped",[7877]],[[7877,7877],"valid"],[[7878,7878],"mapped",[7879]],[[7879,7879],"valid"],[[7880,7880],"mapped",[7881]],[[7881,7881],"valid"],[[7882,7882],"mapped",[7883]],[[7883,7883],"valid"],[[7884,7884],"mapped",[7885]],[[7885,7885],"valid"],[[7886,7886],"mapped",[7887]],[[7887,7887],"valid"],[[7888,7888],"mapped",[7889]],[[7889,7889],"valid"],[[7890,7890],"mapped",[7891]],[[7891,7891],"valid"],[[7892,7892],"mapped",[7893]],[[7893,7893],"valid"],[[7894,7894],"mapped",[7895]],[[7895,7895],"valid"],[[7896,7896],"mapped",[7897]],[[7897,7897],"valid"],[[7898,7898],"mapped",[7899]],[[7899,7899],"valid"],[[7900,7900],"mapped",[7901]],[[7901,7901],"valid"],[[7902,7902],"mapped",[7903]],[[7903,7903],"valid"],[[7904,7904],"mapped",[7905]],[[7905,7905],"valid"],[[7906,7906],"mapped",[7907]],[[7907,7907],"valid"],[[7908,7908],"mapped",[7909]],[[7909,7909],"valid"],[[7910,7910],"mapped",[7911]],[[7911,7911],"valid"],[[7912,7912],"mapped",[7913]],[[7913,7913],"valid"],[[7914,7914],"mapped",[7915]],[[7915,7915],"valid"],[[7916,7916],"mapped",[7917]],[[7917,7917],"valid"],[[7918,7918],"mapped",[7919]],[[7919,7919],"valid"],[[7920,7920],"mapped",[7921]],[[7921,7921],"valid"],[[7922,7922],"mapped",[7923]],[[7923,7923],"valid"],[[7924,7924],"mapped",[7925]],[[7925,7925],"valid"],[[7926,7926],"mapped",[7927]],[[7927,7927],"valid"],[[7928,7928],"mapped",[7929]],[[7929,7929],"valid"],[[7930,7930],"mapped",[7931]],[[7931,7931],"valid"],[[7932,7932],"mapped",[7933]],[[7933,7933],"valid"],[[7934,7934],"mapped",[7935]],[[7935,7935],"valid"],[[7936,7943],"valid"],[[7944,7944],"mapped",[7936]],[[7945,7945],"mapped",[7937]],[[7946,7946],"mapped",[7938]],[[7947,7947],"mapped",[7939]],[[7948,7948],"mapped",[7940]],[[7949,7949],"mapped",[7941]],[[7950,7950],"mapped",[7942]],[[7951,7951],"mapped",[7943]],[[7952,7957],"valid"],[[7958,7959],"disallowed"],[[7960,7960],"mapped",[7952]],[[7961,7961],"mapped",[7953]],[[7962,7962],"mapped",[7954]],[[7963,7963],"mapped",[7955]],[[7964,7964],"mapped",[7956]],[[7965,7965],"mapped",[7957]],[[7966,7967],"disallowed"],[[7968,7975],"valid"],[[7976,7976],"mapped",[7968]],[[7977,7977],"mapped",[7969]],[[7978,7978],"mapped",[7970]],[[7979,7979],"mapped",[7971]],[[7980,7980],"mapped",[7972]],[[7981,7981],"mapped",[7973]],[[7982,7982],"mapped",[7974]],[[7983,7983],"mapped",[7975]],[[7984,7991],"valid"],[[7992,7992],"mapped",[7984]],[[7993,7993],"mapped",[7985]],[[7994,7994],"mapped",[7986]],[[7995,7995],"mapped",[7987]],[[7996,7996],"mapped",[7988]],[[7997,7997],"mapped",[7989]],[[7998,7998],"mapped",[7990]],[[7999,7999],"mapped",[7991]],[[8000,8005],"valid"],[[8006,8007],"disallowed"],[[8008,8008],"mapped",[8000]],[[8009,8009],"mapped",[8001]],[[8010,8010],"mapped",[8002]],[[8011,8011],"mapped",[8003]],[[8012,8012],"mapped",[8004]],[[8013,8013],"mapped",[8005]],[[8014,8015],"disallowed"],[[8016,8023],"valid"],[[8024,8024],"disallowed"],[[8025,8025],"mapped",[8017]],[[8026,8026],"disallowed"],[[8027,8027],"mapped",[8019]],[[8028,8028],"disallowed"],[[8029,8029],"mapped",[8021]],[[8030,8030],"disallowed"],[[8031,8031],"mapped",[8023]],[[8032,8039],"valid"],[[8040,8040],"mapped",[8032]],[[8041,8041],"mapped",[8033]],[[8042,8042],"mapped",[8034]],[[8043,8043],"mapped",[8035]],[[8044,8044],"mapped",[8036]],[[8045,8045],"mapped",[8037]],[[8046,8046],"mapped",[8038]],[[8047,8047],"mapped",[8039]],[[8048,8048],"valid"],[[8049,8049],"mapped",[940]],[[8050,8050],"valid"],[[8051,8051],"mapped",[941]],[[8052,8052],"valid"],[[8053,8053],"mapped",[942]],[[8054,8054],"valid"],[[8055,8055],"mapped",[943]],[[8056,8056],"valid"],[[8057,8057],"mapped",[972]],[[8058,8058],"valid"],[[8059,8059],"mapped",[973]],[[8060,8060],"valid"],[[8061,8061],"mapped",[974]],[[8062,8063],"disallowed"],[[8064,8064],"mapped",[7936,953]],[[8065,8065],"mapped",[7937,953]],[[8066,8066],"mapped",[7938,953]],[[8067,8067],"mapped",[7939,953]],[[8068,8068],"mapped",[7940,953]],[[8069,8069],"mapped",[7941,953]],[[8070,8070],"mapped",[7942,953]],[[8071,8071],"mapped",[7943,953]],[[8072,8072],"mapped",[7936,953]],[[8073,8073],"mapped",[7937,953]],[[8074,8074],"mapped",[7938,953]],[[8075,8075],"mapped",[7939,953]],[[8076,8076],"mapped",[7940,953]],[[8077,8077],"mapped",[7941,953]],[[8078,8078],"mapped",[7942,953]],[[8079,8079],"mapped",[7943,953]],[[8080,8080],"mapped",[7968,953]],[[8081,8081],"mapped",[7969,953]],[[8082,8082],"mapped",[7970,953]],[[8083,8083],"mapped",[7971,953]],[[8084,8084],"mapped",[7972,953]],[[8085,8085],"mapped",[7973,953]],[[8086,8086],"mapped",[7974,953]],[[8087,8087],"mapped",[7975,953]],[[8088,8088],"mapped",[7968,953]],[[8089,8089],"mapped",[7969,953]],[[8090,8090],"mapped",[7970,953]],[[8091,8091],"mapped",[7971,953]],[[8092,8092],"mapped",[7972,953]],[[8093,8093],"mapped",[7973,953]],[[8094,8094],"mapped",[7974,953]],[[8095,8095],"mapped",[7975,953]],[[8096,8096],"mapped",[8032,953]],[[8097,8097],"mapped",[8033,953]],[[8098,8098],"mapped",[8034,953]],[[8099,8099],"mapped",[8035,953]],[[8100,8100],"mapped",[8036,953]],[[8101,8101],"mapped",[8037,953]],[[8102,8102],"mapped",[8038,953]],[[8103,8103],"mapped",[8039,953]],[[8104,8104],"mapped",[8032,953]],[[8105,8105],"mapped",[8033,953]],[[8106,8106],"mapped",[8034,953]],[[8107,8107],"mapped",[8035,953]],[[8108,8108],"mapped",[8036,953]],[[8109,8109],"mapped",[8037,953]],[[8110,8110],"mapped",[8038,953]],[[8111,8111],"mapped",[8039,953]],[[8112,8113],"valid"],[[8114,8114],"mapped",[8048,953]],[[8115,8115],"mapped",[945,953]],[[8116,8116],"mapped",[940,953]],[[8117,8117],"disallowed"],[[8118,8118],"valid"],[[8119,8119],"mapped",[8118,953]],[[8120,8120],"mapped",[8112]],[[8121,8121],"mapped",[8113]],[[8122,8122],"mapped",[8048]],[[8123,8123],"mapped",[940]],[[8124,8124],"mapped",[945,953]],[[8125,8125],"disallowed_STD3_mapped",[32,787]],[[8126,8126],"mapped",[953]],[[8127,8127],"disallowed_STD3_mapped",[32,787]],[[8128,8128],"disallowed_STD3_mapped",[32,834]],[[8129,8129],"disallowed_STD3_mapped",[32,776,834]],[[8130,8130],"mapped",[8052,953]],[[8131,8131],"mapped",[951,953]],[[8132,8132],"mapped",[942,953]],[[8133,8133],"disallowed"],[[8134,8134],"valid"],[[8135,8135],"mapped",[8134,953]],[[8136,8136],"mapped",[8050]],[[8137,8137],"mapped",[941]],[[8138,8138],"mapped",[8052]],[[8139,8139],"mapped",[942]],[[8140,8140],"mapped",[951,953]],[[8141,8141],"disallowed_STD3_mapped",[32,787,768]],[[8142,8142],"disallowed_STD3_mapped",[32,787,769]],[[8143,8143],"disallowed_STD3_mapped",[32,787,834]],[[8144,8146],"valid"],[[8147,8147],"mapped",[912]],[[8148,8149],"disallowed"],[[8150,8151],"valid"],[[8152,8152],"mapped",[8144]],[[8153,8153],"mapped",[8145]],[[8154,8154],"mapped",[8054]],[[8155,8155],"mapped",[943]],[[8156,8156],"disallowed"],[[8157,8157],"disallowed_STD3_mapped",[32,788,768]],[[8158,8158],"disallowed_STD3_mapped",[32,788,769]],[[8159,8159],"disallowed_STD3_mapped",[32,788,834]],[[8160,8162],"valid"],[[8163,8163],"mapped",[944]],[[8164,8167],"valid"],[[8168,8168],"mapped",[8160]],[[8169,8169],"mapped",[8161]],[[8170,8170],"mapped",[8058]],[[8171,8171],"mapped",[973]],[[8172,8172],"mapped",[8165]],[[8173,8173],"disallowed_STD3_mapped",[32,776,768]],[[8174,8174],"disallowed_STD3_mapped",[32,776,769]],[[8175,8175],"disallowed_STD3_mapped",[96]],[[8176,8177],"disallowed"],[[8178,8178],"mapped",[8060,953]],[[8179,8179],"mapped",[969,953]],[[8180,8180],"mapped",[974,953]],[[8181,8181],"disallowed"],[[8182,8182],"valid"],[[8183,8183],"mapped",[8182,953]],[[8184,8184],"mapped",[8056]],[[8185,8185],"mapped",[972]],[[8186,8186],"mapped",[8060]],[[8187,8187],"mapped",[974]],[[8188,8188],"mapped",[969,953]],[[8189,8189],"disallowed_STD3_mapped",[32,769]],[[8190,8190],"disallowed_STD3_mapped",[32,788]],[[8191,8191],"disallowed"],[[8192,8202],"disallowed_STD3_mapped",[32]],[[8203,8203],"ignored"],[[8204,8205],"deviation",[]],[[8206,8207],"disallowed"],[[8208,8208],"valid",[],"NV8"],[[8209,8209],"mapped",[8208]],[[8210,8214],"valid",[],"NV8"],[[8215,8215],"disallowed_STD3_mapped",[32,819]],[[8216,8227],"valid",[],"NV8"],[[8228,8230],"disallowed"],[[8231,8231],"valid",[],"NV8"],[[8232,8238],"disallowed"],[[8239,8239],"disallowed_STD3_mapped",[32]],[[8240,8242],"valid",[],"NV8"],[[8243,8243],"mapped",[8242,8242]],[[8244,8244],"mapped",[8242,8242,8242]],[[8245,8245],"valid",[],"NV8"],[[8246,8246],"mapped",[8245,8245]],[[8247,8247],"mapped",[8245,8245,8245]],[[8248,8251],"valid",[],"NV8"],[[8252,8252],"disallowed_STD3_mapped",[33,33]],[[8253,8253],"valid",[],"NV8"],[[8254,8254],"disallowed_STD3_mapped",[32,773]],[[8255,8262],"valid",[],"NV8"],[[8263,8263],"disallowed_STD3_mapped",[63,63]],[[8264,8264],"disallowed_STD3_mapped",[63,33]],[[8265,8265],"disallowed_STD3_mapped",[33,63]],[[8266,8269],"valid",[],"NV8"],[[8270,8274],"valid",[],"NV8"],[[8275,8276],"valid",[],"NV8"],[[8277,8278],"valid",[],"NV8"],[[8279,8279],"mapped",[8242,8242,8242,8242]],[[8280,8286],"valid",[],"NV8"],[[8287,8287],"disallowed_STD3_mapped",[32]],[[8288,8288],"ignored"],[[8289,8291],"disallowed"],[[8292,8292],"ignored"],[[8293,8293],"disallowed"],[[8294,8297],"disallowed"],[[8298,8303],"disallowed"],[[8304,8304],"mapped",[48]],[[8305,8305],"mapped",[105]],[[8306,8307],"disallowed"],[[8308,8308],"mapped",[52]],[[8309,8309],"mapped",[53]],[[8310,8310],"mapped",[54]],[[8311,8311],"mapped",[55]],[[8312,8312],"mapped",[56]],[[8313,8313],"mapped",[57]],[[8314,8314],"disallowed_STD3_mapped",[43]],[[8315,8315],"mapped",[8722]],[[8316,8316],"disallowed_STD3_mapped",[61]],[[8317,8317],"disallowed_STD3_mapped",[40]],[[8318,8318],"disallowed_STD3_mapped",[41]],[[8319,8319],"mapped",[110]],[[8320,8320],"mapped",[48]],[[8321,8321],"mapped",[49]],[[8322,8322],"mapped",[50]],[[8323,8323],"mapped",[51]],[[8324,8324],"mapped",[52]],[[8325,8325],"mapped",[53]],[[8326,8326],"mapped",[54]],[[8327,8327],"mapped",[55]],[[8328,8328],"mapped",[56]],[[8329,8329],"mapped",[57]],[[8330,8330],"disallowed_STD3_mapped",[43]],[[8331,8331],"mapped",[8722]],[[8332,8332],"disallowed_STD3_mapped",[61]],[[8333,8333],"disallowed_STD3_mapped",[40]],[[8334,8334],"disallowed_STD3_mapped",[41]],[[8335,8335],"disallowed"],[[8336,8336],"mapped",[97]],[[8337,8337],"mapped",[101]],[[8338,8338],"mapped",[111]],[[8339,8339],"mapped",[120]],[[8340,8340],"mapped",[601]],[[8341,8341],"mapped",[104]],[[8342,8342],"mapped",[107]],[[8343,8343],"mapped",[108]],[[8344,8344],"mapped",[109]],[[8345,8345],"mapped",[110]],[[8346,8346],"mapped",[112]],[[8347,8347],"mapped",[115]],[[8348,8348],"mapped",[116]],[[8349,8351],"disallowed"],[[8352,8359],"valid",[],"NV8"],[[8360,8360],"mapped",[114,115]],[[8361,8362],"valid",[],"NV8"],[[8363,8363],"valid",[],"NV8"],[[8364,8364],"valid",[],"NV8"],[[8365,8367],"valid",[],"NV8"],[[8368,8369],"valid",[],"NV8"],[[8370,8373],"valid",[],"NV8"],[[8374,8376],"valid",[],"NV8"],[[8377,8377],"valid",[],"NV8"],[[8378,8378],"valid",[],"NV8"],[[8379,8381],"valid",[],"NV8"],[[8382,8382],"valid",[],"NV8"],[[8383,8399],"disallowed"],[[8400,8417],"valid",[],"NV8"],[[8418,8419],"valid",[],"NV8"],[[8420,8426],"valid",[],"NV8"],[[8427,8427],"valid",[],"NV8"],[[8428,8431],"valid",[],"NV8"],[[8432,8432],"valid",[],"NV8"],[[8433,8447],"disallowed"],[[8448,8448],"disallowed_STD3_mapped",[97,47,99]],[[8449,8449],"disallowed_STD3_mapped",[97,47,115]],[[8450,8450],"mapped",[99]],[[8451,8451],"mapped",[176,99]],[[8452,8452],"valid",[],"NV8"],[[8453,8453],"disallowed_STD3_mapped",[99,47,111]],[[8454,8454],"disallowed_STD3_mapped",[99,47,117]],[[8455,8455],"mapped",[603]],[[8456,8456],"valid",[],"NV8"],[[8457,8457],"mapped",[176,102]],[[8458,8458],"mapped",[103]],[[8459,8462],"mapped",[104]],[[8463,8463],"mapped",[295]],[[8464,8465],"mapped",[105]],[[8466,8467],"mapped",[108]],[[8468,8468],"valid",[],"NV8"],[[8469,8469],"mapped",[110]],[[8470,8470],"mapped",[110,111]],[[8471,8472],"valid",[],"NV8"],[[8473,8473],"mapped",[112]],[[8474,8474],"mapped",[113]],[[8475,8477],"mapped",[114]],[[8478,8479],"valid",[],"NV8"],[[8480,8480],"mapped",[115,109]],[[8481,8481],"mapped",[116,101,108]],[[8482,8482],"mapped",[116,109]],[[8483,8483],"valid",[],"NV8"],[[8484,8484],"mapped",[122]],[[8485,8485],"valid",[],"NV8"],[[8486,8486],"mapped",[969]],[[8487,8487],"valid",[],"NV8"],[[8488,8488],"mapped",[122]],[[8489,8489],"valid",[],"NV8"],[[8490,8490],"mapped",[107]],[[8491,8491],"mapped",[229]],[[8492,8492],"mapped",[98]],[[8493,8493],"mapped",[99]],[[8494,8494],"valid",[],"NV8"],[[8495,8496],"mapped",[101]],[[8497,8497],"mapped",[102]],[[8498,8498],"disallowed"],[[8499,8499],"mapped",[109]],[[8500,8500],"mapped",[111]],[[8501,8501],"mapped",[1488]],[[8502,8502],"mapped",[1489]],[[8503,8503],"mapped",[1490]],[[8504,8504],"mapped",[1491]],[[8505,8505],"mapped",[105]],[[8506,8506],"valid",[],"NV8"],[[8507,8507],"mapped",[102,97,120]],[[8508,8508],"mapped",[960]],[[8509,8510],"mapped",[947]],[[8511,8511],"mapped",[960]],[[8512,8512],"mapped",[8721]],[[8513,8516],"valid",[],"NV8"],[[8517,8518],"mapped",[100]],[[8519,8519],"mapped",[101]],[[8520,8520],"mapped",[105]],[[8521,8521],"mapped",[106]],[[8522,8523],"valid",[],"NV8"],[[8524,8524],"valid",[],"NV8"],[[8525,8525],"valid",[],"NV8"],[[8526,8526],"valid"],[[8527,8527],"valid",[],"NV8"],[[8528,8528],"mapped",[49,8260,55]],[[8529,8529],"mapped",[49,8260,57]],[[8530,8530],"mapped",[49,8260,49,48]],[[8531,8531],"mapped",[49,8260,51]],[[8532,8532],"mapped",[50,8260,51]],[[8533,8533],"mapped",[49,8260,53]],[[8534,8534],"mapped",[50,8260,53]],[[8535,8535],"mapped",[51,8260,53]],[[8536,8536],"mapped",[52,8260,53]],[[8537,8537],"mapped",[49,8260,54]],[[8538,8538],"mapped",[53,8260,54]],[[8539,8539],"mapped",[49,8260,56]],[[8540,8540],"mapped",[51,8260,56]],[[8541,8541],"mapped",[53,8260,56]],[[8542,8542],"mapped",[55,8260,56]],[[8543,8543],"mapped",[49,8260]],[[8544,8544],"mapped",[105]],[[8545,8545],"mapped",[105,105]],[[8546,8546],"mapped",[105,105,105]],[[8547,8547],"mapped",[105,118]],[[8548,8548],"mapped",[118]],[[8549,8549],"mapped",[118,105]],[[8550,8550],"mapped",[118,105,105]],[[8551,8551],"mapped",[118,105,105,105]],[[8552,8552],"mapped",[105,120]],[[8553,8553],"mapped",[120]],[[8554,8554],"mapped",[120,105]],[[8555,8555],"mapped",[120,105,105]],[[8556,8556],"mapped",[108]],[[8557,8557],"mapped",[99]],[[8558,8558],"mapped",[100]],[[8559,8559],"mapped",[109]],[[8560,8560],"mapped",[105]],[[8561,8561],"mapped",[105,105]],[[8562,8562],"mapped",[105,105,105]],[[8563,8563],"mapped",[105,118]],[[8564,8564],"mapped",[118]],[[8565,8565],"mapped",[118,105]],[[8566,8566],"mapped",[118,105,105]],[[8567,8567],"mapped",[118,105,105,105]],[[8568,8568],"mapped",[105,120]],[[8569,8569],"mapped",[120]],[[8570,8570],"mapped",[120,105]],[[8571,8571],"mapped",[120,105,105]],[[8572,8572],"mapped",[108]],[[8573,8573],"mapped",[99]],[[8574,8574],"mapped",[100]],[[8575,8575],"mapped",[109]],[[8576,8578],"valid",[],"NV8"],[[8579,8579],"disallowed"],[[8580,8580],"valid"],[[8581,8584],"valid",[],"NV8"],[[8585,8585],"mapped",[48,8260,51]],[[8586,8587],"valid",[],"NV8"],[[8588,8591],"disallowed"],[[8592,8682],"valid",[],"NV8"],[[8683,8691],"valid",[],"NV8"],[[8692,8703],"valid",[],"NV8"],[[8704,8747],"valid",[],"NV8"],[[8748,8748],"mapped",[8747,8747]],[[8749,8749],"mapped",[8747,8747,8747]],[[8750,8750],"valid",[],"NV8"],[[8751,8751],"mapped",[8750,8750]],[[8752,8752],"mapped",[8750,8750,8750]],[[8753,8799],"valid",[],"NV8"],[[8800,8800],"disallowed_STD3_valid"],[[8801,8813],"valid",[],"NV8"],[[8814,8815],"disallowed_STD3_valid"],[[8816,8945],"valid",[],"NV8"],[[8946,8959],"valid",[],"NV8"],[[8960,8960],"valid",[],"NV8"],[[8961,8961],"valid",[],"NV8"],[[8962,9000],"valid",[],"NV8"],[[9001,9001],"mapped",[12296]],[[9002,9002],"mapped",[12297]],[[9003,9082],"valid",[],"NV8"],[[9083,9083],"valid",[],"NV8"],[[9084,9084],"valid",[],"NV8"],[[9085,9114],"valid",[],"NV8"],[[9115,9166],"valid",[],"NV8"],[[9167,9168],"valid",[],"NV8"],[[9169,9179],"valid",[],"NV8"],[[9180,9191],"valid",[],"NV8"],[[9192,9192],"valid",[],"NV8"],[[9193,9203],"valid",[],"NV8"],[[9204,9210],"valid",[],"NV8"],[[9211,9215],"disallowed"],[[9216,9252],"valid",[],"NV8"],[[9253,9254],"valid",[],"NV8"],[[9255,9279],"disallowed"],[[9280,9290],"valid",[],"NV8"],[[9291,9311],"disallowed"],[[9312,9312],"mapped",[49]],[[9313,9313],"mapped",[50]],[[9314,9314],"mapped",[51]],[[9315,9315],"mapped",[52]],[[9316,9316],"mapped",[53]],[[9317,9317],"mapped",[54]],[[9318,9318],"mapped",[55]],[[9319,9319],"mapped",[56]],[[9320,9320],"mapped",[57]],[[9321,9321],"mapped",[49,48]],[[9322,9322],"mapped",[49,49]],[[9323,9323],"mapped",[49,50]],[[9324,9324],"mapped",[49,51]],[[9325,9325],"mapped",[49,52]],[[9326,9326],"mapped",[49,53]],[[9327,9327],"mapped",[49,54]],[[9328,9328],"mapped",[49,55]],[[9329,9329],"mapped",[49,56]],[[9330,9330],"mapped",[49,57]],[[9331,9331],"mapped",[50,48]],[[9332,9332],"disallowed_STD3_mapped",[40,49,41]],[[9333,9333],"disallowed_STD3_mapped",[40,50,41]],[[9334,9334],"disallowed_STD3_mapped",[40,51,41]],[[9335,9335],"disallowed_STD3_mapped",[40,52,41]],[[9336,9336],"disallowed_STD3_mapped",[40,53,41]],[[9337,9337],"disallowed_STD3_mapped",[40,54,41]],[[9338,9338],"disallowed_STD3_mapped",[40,55,41]],[[9339,9339],"disallowed_STD3_mapped",[40,56,41]],[[9340,9340],"disallowed_STD3_mapped",[40,57,41]],[[9341,9341],"disallowed_STD3_mapped",[40,49,48,41]],[[9342,9342],"disallowed_STD3_mapped",[40,49,49,41]],[[9343,9343],"disallowed_STD3_mapped",[40,49,50,41]],[[9344,9344],"disallowed_STD3_mapped",[40,49,51,41]],[[9345,9345],"disallowed_STD3_mapped",[40,49,52,41]],[[9346,9346],"disallowed_STD3_mapped",[40,49,53,41]],[[9347,9347],"disallowed_STD3_mapped",[40,49,54,41]],[[9348,9348],"disallowed_STD3_mapped",[40,49,55,41]],[[9349,9349],"disallowed_STD3_mapped",[40,49,56,41]],[[9350,9350],"disallowed_STD3_mapped",[40,49,57,41]],[[9351,9351],"disallowed_STD3_mapped",[40,50,48,41]],[[9352,9371],"disallowed"],[[9372,9372],"disallowed_STD3_mapped",[40,97,41]],[[9373,9373],"disallowed_STD3_mapped",[40,98,41]],[[9374,9374],"disallowed_STD3_mapped",[40,99,41]],[[9375,9375],"disallowed_STD3_mapped",[40,100,41]],[[9376,9376],"disallowed_STD3_mapped",[40,101,41]],[[9377,9377],"disallowed_STD3_mapped",[40,102,41]],[[9378,9378],"disallowed_STD3_mapped",[40,103,41]],[[9379,9379],"disallowed_STD3_mapped",[40,104,41]],[[9380,9380],"disallowed_STD3_mapped",[40,105,41]],[[9381,9381],"disallowed_STD3_mapped",[40,106,41]],[[9382,9382],"disallowed_STD3_mapped",[40,107,41]],[[9383,9383],"disallowed_STD3_mapped",[40,108,41]],[[9384,9384],"disallowed_STD3_mapped",[40,109,41]],[[9385,9385],"disallowed_STD3_mapped",[40,110,41]],[[9386,9386],"disallowed_STD3_mapped",[40,111,41]],[[9387,9387],"disallowed_STD3_mapped",[40,112,41]],[[9388,9388],"disallowed_STD3_mapped",[40,113,41]],[[9389,9389],"disallowed_STD3_mapped",[40,114,41]],[[9390,9390],"disallowed_STD3_mapped",[40,115,41]],[[9391,9391],"disallowed_STD3_mapped",[40,116,41]],[[9392,9392],"disallowed_STD3_mapped",[40,117,41]],[[9393,9393],"disallowed_STD3_mapped",[40,118,41]],[[9394,9394],"disallowed_STD3_mapped",[40,119,41]],[[9395,9395],"disallowed_STD3_mapped",[40,120,41]],[[9396,9396],"disallowed_STD3_mapped",[40,121,41]],[[9397,9397],"disallowed_STD3_mapped",[40,122,41]],[[9398,9398],"mapped",[97]],[[9399,9399],"mapped",[98]],[[9400,9400],"mapped",[99]],[[9401,9401],"mapped",[100]],[[9402,9402],"mapped",[101]],[[9403,9403],"mapped",[102]],[[9404,9404],"mapped",[103]],[[9405,9405],"mapped",[104]],[[9406,9406],"mapped",[105]],[[9407,9407],"mapped",[106]],[[9408,9408],"mapped",[107]],[[9409,9409],"mapped",[108]],[[9410,9410],"mapped",[109]],[[9411,9411],"mapped",[110]],[[9412,9412],"mapped",[111]],[[9413,9413],"mapped",[112]],[[9414,9414],"mapped",[113]],[[9415,9415],"mapped",[114]],[[9416,9416],"mapped",[115]],[[9417,9417],"mapped",[116]],[[9418,9418],"mapped",[117]],[[9419,9419],"mapped",[118]],[[9420,9420],"mapped",[119]],[[9421,9421],"mapped",[120]],[[9422,9422],"mapped",[121]],[[9423,9423],"mapped",[122]],[[9424,9424],"mapped",[97]],[[9425,9425],"mapped",[98]],[[9426,9426],"mapped",[99]],[[9427,9427],"mapped",[100]],[[9428,9428],"mapped",[101]],[[9429,9429],"mapped",[102]],[[9430,9430],"mapped",[103]],[[9431,9431],"mapped",[104]],[[9432,9432],"mapped",[105]],[[9433,9433],"mapped",[106]],[[9434,9434],"mapped",[107]],[[9435,9435],"mapped",[108]],[[9436,9436],"mapped",[109]],[[9437,9437],"mapped",[110]],[[9438,9438],"mapped",[111]],[[9439,9439],"mapped",[112]],[[9440,9440],"mapped",[113]],[[9441,9441],"mapped",[114]],[[9442,9442],"mapped",[115]],[[9443,9443],"mapped",[116]],[[9444,9444],"mapped",[117]],[[9445,9445],"mapped",[118]],[[9446,9446],"mapped",[119]],[[9447,9447],"mapped",[120]],[[9448,9448],"mapped",[121]],[[9449,9449],"mapped",[122]],[[9450,9450],"mapped",[48]],[[9451,9470],"valid",[],"NV8"],[[9471,9471],"valid",[],"NV8"],[[9472,9621],"valid",[],"NV8"],[[9622,9631],"valid",[],"NV8"],[[9632,9711],"valid",[],"NV8"],[[9712,9719],"valid",[],"NV8"],[[9720,9727],"valid",[],"NV8"],[[9728,9747],"valid",[],"NV8"],[[9748,9749],"valid",[],"NV8"],[[9750,9751],"valid",[],"NV8"],[[9752,9752],"valid",[],"NV8"],[[9753,9753],"valid",[],"NV8"],[[9754,9839],"valid",[],"NV8"],[[9840,9841],"valid",[],"NV8"],[[9842,9853],"valid",[],"NV8"],[[9854,9855],"valid",[],"NV8"],[[9856,9865],"valid",[],"NV8"],[[9866,9873],"valid",[],"NV8"],[[9874,9884],"valid",[],"NV8"],[[9885,9885],"valid",[],"NV8"],[[9886,9887],"valid",[],"NV8"],[[9888,9889],"valid",[],"NV8"],[[9890,9905],"valid",[],"NV8"],[[9906,9906],"valid",[],"NV8"],[[9907,9916],"valid",[],"NV8"],[[9917,9919],"valid",[],"NV8"],[[9920,9923],"valid",[],"NV8"],[[9924,9933],"valid",[],"NV8"],[[9934,9934],"valid",[],"NV8"],[[9935,9953],"valid",[],"NV8"],[[9954,9954],"valid",[],"NV8"],[[9955,9955],"valid",[],"NV8"],[[9956,9959],"valid",[],"NV8"],[[9960,9983],"valid",[],"NV8"],[[9984,9984],"valid",[],"NV8"],[[9985,9988],"valid",[],"NV8"],[[9989,9989],"valid",[],"NV8"],[[9990,9993],"valid",[],"NV8"],[[9994,9995],"valid",[],"NV8"],[[9996,10023],"valid",[],"NV8"],[[10024,10024],"valid",[],"NV8"],[[10025,10059],"valid",[],"NV8"],[[10060,10060],"valid",[],"NV8"],[[10061,10061],"valid",[],"NV8"],[[10062,10062],"valid",[],"NV8"],[[10063,10066],"valid",[],"NV8"],[[10067,10069],"valid",[],"NV8"],[[10070,10070],"valid",[],"NV8"],[[10071,10071],"valid",[],"NV8"],[[10072,10078],"valid",[],"NV8"],[[10079,10080],"valid",[],"NV8"],[[10081,10087],"valid",[],"NV8"],[[10088,10101],"valid",[],"NV8"],[[10102,10132],"valid",[],"NV8"],[[10133,10135],"valid",[],"NV8"],[[10136,10159],"valid",[],"NV8"],[[10160,10160],"valid",[],"NV8"],[[10161,10174],"valid",[],"NV8"],[[10175,10175],"valid",[],"NV8"],[[10176,10182],"valid",[],"NV8"],[[10183,10186],"valid",[],"NV8"],[[10187,10187],"valid",[],"NV8"],[[10188,10188],"valid",[],"NV8"],[[10189,10189],"valid",[],"NV8"],[[10190,10191],"valid",[],"NV8"],[[10192,10219],"valid",[],"NV8"],[[10220,10223],"valid",[],"NV8"],[[10224,10239],"valid",[],"NV8"],[[10240,10495],"valid",[],"NV8"],[[10496,10763],"valid",[],"NV8"],[[10764,10764],"mapped",[8747,8747,8747,8747]],[[10765,10867],"valid",[],"NV8"],[[10868,10868],"disallowed_STD3_mapped",[58,58,61]],[[10869,10869],"disallowed_STD3_mapped",[61,61]],[[10870,10870],"disallowed_STD3_mapped",[61,61,61]],[[10871,10971],"valid",[],"NV8"],[[10972,10972],"mapped",[10973,824]],[[10973,11007],"valid",[],"NV8"],[[11008,11021],"valid",[],"NV8"],[[11022,11027],"valid",[],"NV8"],[[11028,11034],"valid",[],"NV8"],[[11035,11039],"valid",[],"NV8"],[[11040,11043],"valid",[],"NV8"],[[11044,11084],"valid",[],"NV8"],[[11085,11087],"valid",[],"NV8"],[[11088,11092],"valid",[],"NV8"],[[11093,11097],"valid",[],"NV8"],[[11098,11123],"valid",[],"NV8"],[[11124,11125],"disallowed"],[[11126,11157],"valid",[],"NV8"],[[11158,11159],"disallowed"],[[11160,11193],"valid",[],"NV8"],[[11194,11196],"disallowed"],[[11197,11208],"valid",[],"NV8"],[[11209,11209],"disallowed"],[[11210,11217],"valid",[],"NV8"],[[11218,11243],"disallowed"],[[11244,11247],"valid",[],"NV8"],[[11248,11263],"disallowed"],[[11264,11264],"mapped",[11312]],[[11265,11265],"mapped",[11313]],[[11266,11266],"mapped",[11314]],[[11267,11267],"mapped",[11315]],[[11268,11268],"mapped",[11316]],[[11269,11269],"mapped",[11317]],[[11270,11270],"mapped",[11318]],[[11271,11271],"mapped",[11319]],[[11272,11272],"mapped",[11320]],[[11273,11273],"mapped",[11321]],[[11274,11274],"mapped",[11322]],[[11275,11275],"mapped",[11323]],[[11276,11276],"mapped",[11324]],[[11277,11277],"mapped",[11325]],[[11278,11278],"mapped",[11326]],[[11279,11279],"mapped",[11327]],[[11280,11280],"mapped",[11328]],[[11281,11281],"mapped",[11329]],[[11282,11282],"mapped",[11330]],[[11283,11283],"mapped",[11331]],[[11284,11284],"mapped",[11332]],[[11285,11285],"mapped",[11333]],[[11286,11286],"mapped",[11334]],[[11287,11287],"mapped",[11335]],[[11288,11288],"mapped",[11336]],[[11289,11289],"mapped",[11337]],[[11290,11290],"mapped",[11338]],[[11291,11291],"mapped",[11339]],[[11292,11292],"mapped",[11340]],[[11293,11293],"mapped",[11341]],[[11294,11294],"mapped",[11342]],[[11295,11295],"mapped",[11343]],[[11296,11296],"mapped",[11344]],[[11297,11297],"mapped",[11345]],[[11298,11298],"mapped",[11346]],[[11299,11299],"mapped",[11347]],[[11300,11300],"mapped",[11348]],[[11301,11301],"mapped",[11349]],[[11302,11302],"mapped",[11350]],[[11303,11303],"mapped",[11351]],[[11304,11304],"mapped",[11352]],[[11305,11305],"mapped",[11353]],[[11306,11306],"mapped",[11354]],[[11307,11307],"mapped",[11355]],[[11308,11308],"mapped",[11356]],[[11309,11309],"mapped",[11357]],[[11310,11310],"mapped",[11358]],[[11311,11311],"disallowed"],[[11312,11358],"valid"],[[11359,11359],"disallowed"],[[11360,11360],"mapped",[11361]],[[11361,11361],"valid"],[[11362,11362],"mapped",[619]],[[11363,11363],"mapped",[7549]],[[11364,11364],"mapped",[637]],[[11365,11366],"valid"],[[11367,11367],"mapped",[11368]],[[11368,11368],"valid"],[[11369,11369],"mapped",[11370]],[[11370,11370],"valid"],[[11371,11371],"mapped",[11372]],[[11372,11372],"valid"],[[11373,11373],"mapped",[593]],[[11374,11374],"mapped",[625]],[[11375,11375],"mapped",[592]],[[11376,11376],"mapped",[594]],[[11377,11377],"valid"],[[11378,11378],"mapped",[11379]],[[11379,11379],"valid"],[[11380,11380],"valid"],[[11381,11381],"mapped",[11382]],[[11382,11383],"valid"],[[11384,11387],"valid"],[[11388,11388],"mapped",[106]],[[11389,11389],"mapped",[118]],[[11390,11390],"mapped",[575]],[[11391,11391],"mapped",[576]],[[11392,11392],"mapped",[11393]],[[11393,11393],"valid"],[[11394,11394],"mapped",[11395]],[[11395,11395],"valid"],[[11396,11396],"mapped",[11397]],[[11397,11397],"valid"],[[11398,11398],"mapped",[11399]],[[11399,11399],"valid"],[[11400,11400],"mapped",[11401]],[[11401,11401],"valid"],[[11402,11402],"mapped",[11403]],[[11403,11403],"valid"],[[11404,11404],"mapped",[11405]],[[11405,11405],"valid"],[[11406,11406],"mapped",[11407]],[[11407,11407],"valid"],[[11408,11408],"mapped",[11409]],[[11409,11409],"valid"],[[11410,11410],"mapped",[11411]],[[11411,11411],"valid"],[[11412,11412],"mapped",[11413]],[[11413,11413],"valid"],[[11414,11414],"mapped",[11415]],[[11415,11415],"valid"],[[11416,11416],"mapped",[11417]],[[11417,11417],"valid"],[[11418,11418],"mapped",[11419]],[[11419,11419],"valid"],[[11420,11420],"mapped",[11421]],[[11421,11421],"valid"],[[11422,11422],"mapped",[11423]],[[11423,11423],"valid"],[[11424,11424],"mapped",[11425]],[[11425,11425],"valid"],[[11426,11426],"mapped",[11427]],[[11427,11427],"valid"],[[11428,11428],"mapped",[11429]],[[11429,11429],"valid"],[[11430,11430],"mapped",[11431]],[[11431,11431],"valid"],[[11432,11432],"mapped",[11433]],[[11433,11433],"valid"],[[11434,11434],"mapped",[11435]],[[11435,11435],"valid"],[[11436,11436],"mapped",[11437]],[[11437,11437],"valid"],[[11438,11438],"mapped",[11439]],[[11439,11439],"valid"],[[11440,11440],"mapped",[11441]],[[11441,11441],"valid"],[[11442,11442],"mapped",[11443]],[[11443,11443],"valid"],[[11444,11444],"mapped",[11445]],[[11445,11445],"valid"],[[11446,11446],"mapped",[11447]],[[11447,11447],"valid"],[[11448,11448],"mapped",[11449]],[[11449,11449],"valid"],[[11450,11450],"mapped",[11451]],[[11451,11451],"valid"],[[11452,11452],"mapped",[11453]],[[11453,11453],"valid"],[[11454,11454],"mapped",[11455]],[[11455,11455],"valid"],[[11456,11456],"mapped",[11457]],[[11457,11457],"valid"],[[11458,11458],"mapped",[11459]],[[11459,11459],"valid"],[[11460,11460],"mapped",[11461]],[[11461,11461],"valid"],[[11462,11462],"mapped",[11463]],[[11463,11463],"valid"],[[11464,11464],"mapped",[11465]],[[11465,11465],"valid"],[[11466,11466],"mapped",[11467]],[[11467,11467],"valid"],[[11468,11468],"mapped",[11469]],[[11469,11469],"valid"],[[11470,11470],"mapped",[11471]],[[11471,11471],"valid"],[[11472,11472],"mapped",[11473]],[[11473,11473],"valid"],[[11474,11474],"mapped",[11475]],[[11475,11475],"valid"],[[11476,11476],"mapped",[11477]],[[11477,11477],"valid"],[[11478,11478],"mapped",[11479]],[[11479,11479],"valid"],[[11480,11480],"mapped",[11481]],[[11481,11481],"valid"],[[11482,11482],"mapped",[11483]],[[11483,11483],"valid"],[[11484,11484],"mapped",[11485]],[[11485,11485],"valid"],[[11486,11486],"mapped",[11487]],[[11487,11487],"valid"],[[11488,11488],"mapped",[11489]],[[11489,11489],"valid"],[[11490,11490],"mapped",[11491]],[[11491,11492],"valid"],[[11493,11498],"valid",[],"NV8"],[[11499,11499],"mapped",[11500]],[[11500,11500],"valid"],[[11501,11501],"mapped",[11502]],[[11502,11505],"valid"],[[11506,11506],"mapped",[11507]],[[11507,11507],"valid"],[[11508,11512],"disallowed"],[[11513,11519],"valid",[],"NV8"],[[11520,11557],"valid"],[[11558,11558],"disallowed"],[[11559,11559],"valid"],[[11560,11564],"disallowed"],[[11565,11565],"valid"],[[11566,11567],"disallowed"],[[11568,11621],"valid"],[[11622,11623],"valid"],[[11624,11630],"disallowed"],[[11631,11631],"mapped",[11617]],[[11632,11632],"valid",[],"NV8"],[[11633,11646],"disallowed"],[[11647,11647],"valid"],[[11648,11670],"valid"],[[11671,11679],"disallowed"],[[11680,11686],"valid"],[[11687,11687],"disallowed"],[[11688,11694],"valid"],[[11695,11695],"disallowed"],[[11696,11702],"valid"],[[11703,11703],"disallowed"],[[11704,11710],"valid"],[[11711,11711],"disallowed"],[[11712,11718],"valid"],[[11719,11719],"disallowed"],[[11720,11726],"valid"],[[11727,11727],"disallowed"],[[11728,11734],"valid"],[[11735,11735],"disallowed"],[[11736,11742],"valid"],[[11743,11743],"disallowed"],[[11744,11775],"valid"],[[11776,11799],"valid",[],"NV8"],[[11800,11803],"valid",[],"NV8"],[[11804,11805],"valid",[],"NV8"],[[11806,11822],"valid",[],"NV8"],[[11823,11823],"valid"],[[11824,11824],"valid",[],"NV8"],[[11825,11825],"valid",[],"NV8"],[[11826,11835],"valid",[],"NV8"],[[11836,11842],"valid",[],"NV8"],[[11843,11903],"disallowed"],[[11904,11929],"valid",[],"NV8"],[[11930,11930],"disallowed"],[[11931,11934],"valid",[],"NV8"],[[11935,11935],"mapped",[27597]],[[11936,12018],"valid",[],"NV8"],[[12019,12019],"mapped",[40863]],[[12020,12031],"disallowed"],[[12032,12032],"mapped",[19968]],[[12033,12033],"mapped",[20008]],[[12034,12034],"mapped",[20022]],[[12035,12035],"mapped",[20031]],[[12036,12036],"mapped",[20057]],[[12037,12037],"mapped",[20101]],[[12038,12038],"mapped",[20108]],[[12039,12039],"mapped",[20128]],[[12040,12040],"mapped",[20154]],[[12041,12041],"mapped",[20799]],[[12042,12042],"mapped",[20837]],[[12043,12043],"mapped",[20843]],[[12044,12044],"mapped",[20866]],[[12045,12045],"mapped",[20886]],[[12046,12046],"mapped",[20907]],[[12047,12047],"mapped",[20960]],[[12048,12048],"mapped",[20981]],[[12049,12049],"mapped",[20992]],[[12050,12050],"mapped",[21147]],[[12051,12051],"mapped",[21241]],[[12052,12052],"mapped",[21269]],[[12053,12053],"mapped",[21274]],[[12054,12054],"mapped",[21304]],[[12055,12055],"mapped",[21313]],[[12056,12056],"mapped",[21340]],[[12057,12057],"mapped",[21353]],[[12058,12058],"mapped",[21378]],[[12059,12059],"mapped",[21430]],[[12060,12060],"mapped",[21448]],[[12061,12061],"mapped",[21475]],[[12062,12062],"mapped",[22231]],[[12063,12063],"mapped",[22303]],[[12064,12064],"mapped",[22763]],[[12065,12065],"mapped",[22786]],[[12066,12066],"mapped",[22794]],[[12067,12067],"mapped",[22805]],[[12068,12068],"mapped",[22823]],[[12069,12069],"mapped",[22899]],[[12070,12070],"mapped",[23376]],[[12071,12071],"mapped",[23424]],[[12072,12072],"mapped",[23544]],[[12073,12073],"mapped",[23567]],[[12074,12074],"mapped",[23586]],[[12075,12075],"mapped",[23608]],[[12076,12076],"mapped",[23662]],[[12077,12077],"mapped",[23665]],[[12078,12078],"mapped",[24027]],[[12079,12079],"mapped",[24037]],[[12080,12080],"mapped",[24049]],[[12081,12081],"mapped",[24062]],[[12082,12082],"mapped",[24178]],[[12083,12083],"mapped",[24186]],[[12084,12084],"mapped",[24191]],[[12085,12085],"mapped",[24308]],[[12086,12086],"mapped",[24318]],[[12087,12087],"mapped",[24331]],[[12088,12088],"mapped",[24339]],[[12089,12089],"mapped",[24400]],[[12090,12090],"mapped",[24417]],[[12091,12091],"mapped",[24435]],[[12092,12092],"mapped",[24515]],[[12093,12093],"mapped",[25096]],[[12094,12094],"mapped",[25142]],[[12095,12095],"mapped",[25163]],[[12096,12096],"mapped",[25903]],[[12097,12097],"mapped",[25908]],[[12098,12098],"mapped",[25991]],[[12099,12099],"mapped",[26007]],[[12100,12100],"mapped",[26020]],[[12101,12101],"mapped",[26041]],[[12102,12102],"mapped",[26080]],[[12103,12103],"mapped",[26085]],[[12104,12104],"mapped",[26352]],[[12105,12105],"mapped",[26376]],[[12106,12106],"mapped",[26408]],[[12107,12107],"mapped",[27424]],[[12108,12108],"mapped",[27490]],[[12109,12109],"mapped",[27513]],[[12110,12110],"mapped",[27571]],[[12111,12111],"mapped",[27595]],[[12112,12112],"mapped",[27604]],[[12113,12113],"mapped",[27611]],[[12114,12114],"mapped",[27663]],[[12115,12115],"mapped",[27668]],[[12116,12116],"mapped",[27700]],[[12117,12117],"mapped",[28779]],[[12118,12118],"mapped",[29226]],[[12119,12119],"mapped",[29238]],[[12120,12120],"mapped",[29243]],[[12121,12121],"mapped",[29247]],[[12122,12122],"mapped",[29255]],[[12123,12123],"mapped",[29273]],[[12124,12124],"mapped",[29275]],[[12125,12125],"mapped",[29356]],[[12126,12126],"mapped",[29572]],[[12127,12127],"mapped",[29577]],[[12128,12128],"mapped",[29916]],[[12129,12129],"mapped",[29926]],[[12130,12130],"mapped",[29976]],[[12131,12131],"mapped",[29983]],[[12132,12132],"mapped",[29992]],[[12133,12133],"mapped",[30000]],[[12134,12134],"mapped",[30091]],[[12135,12135],"mapped",[30098]],[[12136,12136],"mapped",[30326]],[[12137,12137],"mapped",[30333]],[[12138,12138],"mapped",[30382]],[[12139,12139],"mapped",[30399]],[[12140,12140],"mapped",[30446]],[[12141,12141],"mapped",[30683]],[[12142,12142],"mapped",[30690]],[[12143,12143],"mapped",[30707]],[[12144,12144],"mapped",[31034]],[[12145,12145],"mapped",[31160]],[[12146,12146],"mapped",[31166]],[[12147,12147],"mapped",[31348]],[[12148,12148],"mapped",[31435]],[[12149,12149],"mapped",[31481]],[[12150,12150],"mapped",[31859]],[[12151,12151],"mapped",[31992]],[[12152,12152],"mapped",[32566]],[[12153,12153],"mapped",[32593]],[[12154,12154],"mapped",[32650]],[[12155,12155],"mapped",[32701]],[[12156,12156],"mapped",[32769]],[[12157,12157],"mapped",[32780]],[[12158,12158],"mapped",[32786]],[[12159,12159],"mapped",[32819]],[[12160,12160],"mapped",[32895]],[[12161,12161],"mapped",[32905]],[[12162,12162],"mapped",[33251]],[[12163,12163],"mapped",[33258]],[[12164,12164],"mapped",[33267]],[[12165,12165],"mapped",[33276]],[[12166,12166],"mapped",[33292]],[[12167,12167],"mapped",[33307]],[[12168,12168],"mapped",[33311]],[[12169,12169],"mapped",[33390]],[[12170,12170],"mapped",[33394]],[[12171,12171],"mapped",[33400]],[[12172,12172],"mapped",[34381]],[[12173,12173],"mapped",[34411]],[[12174,12174],"mapped",[34880]],[[12175,12175],"mapped",[34892]],[[12176,12176],"mapped",[34915]],[[12177,12177],"mapped",[35198]],[[12178,12178],"mapped",[35211]],[[12179,12179],"mapped",[35282]],[[12180,12180],"mapped",[35328]],[[12181,12181],"mapped",[35895]],[[12182,12182],"mapped",[35910]],[[12183,12183],"mapped",[35925]],[[12184,12184],"mapped",[35960]],[[12185,12185],"mapped",[35997]],[[12186,12186],"mapped",[36196]],[[12187,12187],"mapped",[36208]],[[12188,12188],"mapped",[36275]],[[12189,12189],"mapped",[36523]],[[12190,12190],"mapped",[36554]],[[12191,12191],"mapped",[36763]],[[12192,12192],"mapped",[36784]],[[12193,12193],"mapped",[36789]],[[12194,12194],"mapped",[37009]],[[12195,12195],"mapped",[37193]],[[12196,12196],"mapped",[37318]],[[12197,12197],"mapped",[37324]],[[12198,12198],"mapped",[37329]],[[12199,12199],"mapped",[38263]],[[12200,12200],"mapped",[38272]],[[12201,12201],"mapped",[38428]],[[12202,12202],"mapped",[38582]],[[12203,12203],"mapped",[38585]],[[12204,12204],"mapped",[38632]],[[12205,12205],"mapped",[38737]],[[12206,12206],"mapped",[38750]],[[12207,12207],"mapped",[38754]],[[12208,12208],"mapped",[38761]],[[12209,12209],"mapped",[38859]],[[12210,12210],"mapped",[38893]],[[12211,12211],"mapped",[38899]],[[12212,12212],"mapped",[38913]],[[12213,12213],"mapped",[39080]],[[12214,12214],"mapped",[39131]],[[12215,12215],"mapped",[39135]],[[12216,12216],"mapped",[39318]],[[12217,12217],"mapped",[39321]],[[12218,12218],"mapped",[39340]],[[12219,12219],"mapped",[39592]],[[12220,12220],"mapped",[39640]],[[12221,12221],"mapped",[39647]],[[12222,12222],"mapped",[39717]],[[12223,12223],"mapped",[39727]],[[12224,12224],"mapped",[39730]],[[12225,12225],"mapped",[39740]],[[12226,12226],"mapped",[39770]],[[12227,12227],"mapped",[40165]],[[12228,12228],"mapped",[40565]],[[12229,12229],"mapped",[40575]],[[12230,12230],"mapped",[40613]],[[12231,12231],"mapped",[40635]],[[12232,12232],"mapped",[40643]],[[12233,12233],"mapped",[40653]],[[12234,12234],"mapped",[40657]],[[12235,12235],"mapped",[40697]],[[12236,12236],"mapped",[40701]],[[12237,12237],"mapped",[40718]],[[12238,12238],"mapped",[40723]],[[12239,12239],"mapped",[40736]],[[12240,12240],"mapped",[40763]],[[12241,12241],"mapped",[40778]],[[12242,12242],"mapped",[40786]],[[12243,12243],"mapped",[40845]],[[12244,12244],"mapped",[40860]],[[12245,12245],"mapped",[40864]],[[12246,12271],"disallowed"],[[12272,12283],"disallowed"],[[12284,12287],"disallowed"],[[12288,12288],"disallowed_STD3_mapped",[32]],[[12289,12289],"valid",[],"NV8"],[[12290,12290],"mapped",[46]],[[12291,12292],"valid",[],"NV8"],[[12293,12295],"valid"],[[12296,12329],"valid",[],"NV8"],[[12330,12333],"valid"],[[12334,12341],"valid",[],"NV8"],[[12342,12342],"mapped",[12306]],[[12343,12343],"valid",[],"NV8"],[[12344,12344],"mapped",[21313]],[[12345,12345],"mapped",[21316]],[[12346,12346],"mapped",[21317]],[[12347,12347],"valid",[],"NV8"],[[12348,12348],"valid"],[[12349,12349],"valid",[],"NV8"],[[12350,12350],"valid",[],"NV8"],[[12351,12351],"valid",[],"NV8"],[[12352,12352],"disallowed"],[[12353,12436],"valid"],[[12437,12438],"valid"],[[12439,12440],"disallowed"],[[12441,12442],"valid"],[[12443,12443],"disallowed_STD3_mapped",[32,12441]],[[12444,12444],"disallowed_STD3_mapped",[32,12442]],[[12445,12446],"valid"],[[12447,12447],"mapped",[12424,12426]],[[12448,12448],"valid",[],"NV8"],[[12449,12542],"valid"],[[12543,12543],"mapped",[12467,12488]],[[12544,12548],"disallowed"],[[12549,12588],"valid"],[[12589,12589],"valid"],[[12590,12592],"disallowed"],[[12593,12593],"mapped",[4352]],[[12594,12594],"mapped",[4353]],[[12595,12595],"mapped",[4522]],[[12596,12596],"mapped",[4354]],[[12597,12597],"mapped",[4524]],[[12598,12598],"mapped",[4525]],[[12599,12599],"mapped",[4355]],[[12600,12600],"mapped",[4356]],[[12601,12601],"mapped",[4357]],[[12602,12602],"mapped",[4528]],[[12603,12603],"mapped",[4529]],[[12604,12604],"mapped",[4530]],[[12605,12605],"mapped",[4531]],[[12606,12606],"mapped",[4532]],[[12607,12607],"mapped",[4533]],[[12608,12608],"mapped",[4378]],[[12609,12609],"mapped",[4358]],[[12610,12610],"mapped",[4359]],[[12611,12611],"mapped",[4360]],[[12612,12612],"mapped",[4385]],[[12613,12613],"mapped",[4361]],[[12614,12614],"mapped",[4362]],[[12615,12615],"mapped",[4363]],[[12616,12616],"mapped",[4364]],[[12617,12617],"mapped",[4365]],[[12618,12618],"mapped",[4366]],[[12619,12619],"mapped",[4367]],[[12620,12620],"mapped",[4368]],[[12621,12621],"mapped",[4369]],[[12622,12622],"mapped",[4370]],[[12623,12623],"mapped",[4449]],[[12624,12624],"mapped",[4450]],[[12625,12625],"mapped",[4451]],[[12626,12626],"mapped",[4452]],[[12627,12627],"mapped",[4453]],[[12628,12628],"mapped",[4454]],[[12629,12629],"mapped",[4455]],[[12630,12630],"mapped",[4456]],[[12631,12631],"mapped",[4457]],[[12632,12632],"mapped",[4458]],[[12633,12633],"mapped",[4459]],[[12634,12634],"mapped",[4460]],[[12635,12635],"mapped",[4461]],[[12636,12636],"mapped",[4462]],[[12637,12637],"mapped",[4463]],[[12638,12638],"mapped",[4464]],[[12639,12639],"mapped",[4465]],[[12640,12640],"mapped",[4466]],[[12641,12641],"mapped",[4467]],[[12642,12642],"mapped",[4468]],[[12643,12643],"mapped",[4469]],[[12644,12644],"disallowed"],[[12645,12645],"mapped",[4372]],[[12646,12646],"mapped",[4373]],[[12647,12647],"mapped",[4551]],[[12648,12648],"mapped",[4552]],[[12649,12649],"mapped",[4556]],[[12650,12650],"mapped",[4558]],[[12651,12651],"mapped",[4563]],[[12652,12652],"mapped",[4567]],[[12653,12653],"mapped",[4569]],[[12654,12654],"mapped",[4380]],[[12655,12655],"mapped",[4573]],[[12656,12656],"mapped",[4575]],[[12657,12657],"mapped",[4381]],[[12658,12658],"mapped",[4382]],[[12659,12659],"mapped",[4384]],[[12660,12660],"mapped",[4386]],[[12661,12661],"mapped",[4387]],[[12662,12662],"mapped",[4391]],[[12663,12663],"mapped",[4393]],[[12664,12664],"mapped",[4395]],[[12665,12665],"mapped",[4396]],[[12666,12666],"mapped",[4397]],[[12667,12667],"mapped",[4398]],[[12668,12668],"mapped",[4399]],[[12669,12669],"mapped",[4402]],[[12670,12670],"mapped",[4406]],[[12671,12671],"mapped",[4416]],[[12672,12672],"mapped",[4423]],[[12673,12673],"mapped",[4428]],[[12674,12674],"mapped",[4593]],[[12675,12675],"mapped",[4594]],[[12676,12676],"mapped",[4439]],[[12677,12677],"mapped",[4440]],[[12678,12678],"mapped",[4441]],[[12679,12679],"mapped",[4484]],[[12680,12680],"mapped",[4485]],[[12681,12681],"mapped",[4488]],[[12682,12682],"mapped",[4497]],[[12683,12683],"mapped",[4498]],[[12684,12684],"mapped",[4500]],[[12685,12685],"mapped",[4510]],[[12686,12686],"mapped",[4513]],[[12687,12687],"disallowed"],[[12688,12689],"valid",[],"NV8"],[[12690,12690],"mapped",[19968]],[[12691,12691],"mapped",[20108]],[[12692,12692],"mapped",[19977]],[[12693,12693],"mapped",[22235]],[[12694,12694],"mapped",[19978]],[[12695,12695],"mapped",[20013]],[[12696,12696],"mapped",[19979]],[[12697,12697],"mapped",[30002]],[[12698,12698],"mapped",[20057]],[[12699,12699],"mapped",[19993]],[[12700,12700],"mapped",[19969]],[[12701,12701],"mapped",[22825]],[[12702,12702],"mapped",[22320]],[[12703,12703],"mapped",[20154]],[[12704,12727],"valid"],[[12728,12730],"valid"],[[12731,12735],"disallowed"],[[12736,12751],"valid",[],"NV8"],[[12752,12771],"valid",[],"NV8"],[[12772,12783],"disallowed"],[[12784,12799],"valid"],[[12800,12800],"disallowed_STD3_mapped",[40,4352,41]],[[12801,12801],"disallowed_STD3_mapped",[40,4354,41]],[[12802,12802],"disallowed_STD3_mapped",[40,4355,41]],[[12803,12803],"disallowed_STD3_mapped",[40,4357,41]],[[12804,12804],"disallowed_STD3_mapped",[40,4358,41]],[[12805,12805],"disallowed_STD3_mapped",[40,4359,41]],[[12806,12806],"disallowed_STD3_mapped",[40,4361,41]],[[12807,12807],"disallowed_STD3_mapped",[40,4363,41]],[[12808,12808],"disallowed_STD3_mapped",[40,4364,41]],[[12809,12809],"disallowed_STD3_mapped",[40,4366,41]],[[12810,12810],"disallowed_STD3_mapped",[40,4367,41]],[[12811,12811],"disallowed_STD3_mapped",[40,4368,41]],[[12812,12812],"disallowed_STD3_mapped",[40,4369,41]],[[12813,12813],"disallowed_STD3_mapped",[40,4370,41]],[[12814,12814],"disallowed_STD3_mapped",[40,44032,41]],[[12815,12815],"disallowed_STD3_mapped",[40,45208,41]],[[12816,12816],"disallowed_STD3_mapped",[40,45796,41]],[[12817,12817],"disallowed_STD3_mapped",[40,46972,41]],[[12818,12818],"disallowed_STD3_mapped",[40,47560,41]],[[12819,12819],"disallowed_STD3_mapped",[40,48148,41]],[[12820,12820],"disallowed_STD3_mapped",[40,49324,41]],[[12821,12821],"disallowed_STD3_mapped",[40,50500,41]],[[12822,12822],"disallowed_STD3_mapped",[40,51088,41]],[[12823,12823],"disallowed_STD3_mapped",[40,52264,41]],[[12824,12824],"disallowed_STD3_mapped",[40,52852,41]],[[12825,12825],"disallowed_STD3_mapped",[40,53440,41]],[[12826,12826],"disallowed_STD3_mapped",[40,54028,41]],[[12827,12827],"disallowed_STD3_mapped",[40,54616,41]],[[12828,12828],"disallowed_STD3_mapped",[40,51452,41]],[[12829,12829],"disallowed_STD3_mapped",[40,50724,51204,41]],[[12830,12830],"disallowed_STD3_mapped",[40,50724,54980,41]],[[12831,12831],"disallowed"],[[12832,12832],"disallowed_STD3_mapped",[40,19968,41]],[[12833,12833],"disallowed_STD3_mapped",[40,20108,41]],[[12834,12834],"disallowed_STD3_mapped",[40,19977,41]],[[12835,12835],"disallowed_STD3_mapped",[40,22235,41]],[[12836,12836],"disallowed_STD3_mapped",[40,20116,41]],[[12837,12837],"disallowed_STD3_mapped",[40,20845,41]],[[12838,12838],"disallowed_STD3_mapped",[40,19971,41]],[[12839,12839],"disallowed_STD3_mapped",[40,20843,41]],[[12840,12840],"disallowed_STD3_mapped",[40,20061,41]],[[12841,12841],"disallowed_STD3_mapped",[40,21313,41]],[[12842,12842],"disallowed_STD3_mapped",[40,26376,41]],[[12843,12843],"disallowed_STD3_mapped",[40,28779,41]],[[12844,12844],"disallowed_STD3_mapped",[40,27700,41]],[[12845,12845],"disallowed_STD3_mapped",[40,26408,41]],[[12846,12846],"disallowed_STD3_mapped",[40,37329,41]],[[12847,12847],"disallowed_STD3_mapped",[40,22303,41]],[[12848,12848],"disallowed_STD3_mapped",[40,26085,41]],[[12849,12849],"disallowed_STD3_mapped",[40,26666,41]],[[12850,12850],"disallowed_STD3_mapped",[40,26377,41]],[[12851,12851],"disallowed_STD3_mapped",[40,31038,41]],[[12852,12852],"disallowed_STD3_mapped",[40,21517,41]],[[12853,12853],"disallowed_STD3_mapped",[40,29305,41]],[[12854,12854],"disallowed_STD3_mapped",[40,36001,41]],[[12855,12855],"disallowed_STD3_mapped",[40,31069,41]],[[12856,12856],"disallowed_STD3_mapped",[40,21172,41]],[[12857,12857],"disallowed_STD3_mapped",[40,20195,41]],[[12858,12858],"disallowed_STD3_mapped",[40,21628,41]],[[12859,12859],"disallowed_STD3_mapped",[40,23398,41]],[[12860,12860],"disallowed_STD3_mapped",[40,30435,41]],[[12861,12861],"disallowed_STD3_mapped",[40,20225,41]],[[12862,12862],"disallowed_STD3_mapped",[40,36039,41]],[[12863,12863],"disallowed_STD3_mapped",[40,21332,41]],[[12864,12864],"disallowed_STD3_mapped",[40,31085,41]],[[12865,12865],"disallowed_STD3_mapped",[40,20241,41]],[[12866,12866],"disallowed_STD3_mapped",[40,33258,41]],[[12867,12867],"disallowed_STD3_mapped",[40,33267,41]],[[12868,12868],"mapped",[21839]],[[12869,12869],"mapped",[24188]],[[12870,12870],"mapped",[25991]],[[12871,12871],"mapped",[31631]],[[12872,12879],"valid",[],"NV8"],[[12880,12880],"mapped",[112,116,101]],[[12881,12881],"mapped",[50,49]],[[12882,12882],"mapped",[50,50]],[[12883,12883],"mapped",[50,51]],[[12884,12884],"mapped",[50,52]],[[12885,12885],"mapped",[50,53]],[[12886,12886],"mapped",[50,54]],[[12887,12887],"mapped",[50,55]],[[12888,12888],"mapped",[50,56]],[[12889,12889],"mapped",[50,57]],[[12890,12890],"mapped",[51,48]],[[12891,12891],"mapped",[51,49]],[[12892,12892],"mapped",[51,50]],[[12893,12893],"mapped",[51,51]],[[12894,12894],"mapped",[51,52]],[[12895,12895],"mapped",[51,53]],[[12896,12896],"mapped",[4352]],[[12897,12897],"mapped",[4354]],[[12898,12898],"mapped",[4355]],[[12899,12899],"mapped",[4357]],[[12900,12900],"mapped",[4358]],[[12901,12901],"mapped",[4359]],[[12902,12902],"mapped",[4361]],[[12903,12903],"mapped",[4363]],[[12904,12904],"mapped",[4364]],[[12905,12905],"mapped",[4366]],[[12906,12906],"mapped",[4367]],[[12907,12907],"mapped",[4368]],[[12908,12908],"mapped",[4369]],[[12909,12909],"mapped",[4370]],[[12910,12910],"mapped",[44032]],[[12911,12911],"mapped",[45208]],[[12912,12912],"mapped",[45796]],[[12913,12913],"mapped",[46972]],[[12914,12914],"mapped",[47560]],[[12915,12915],"mapped",[48148]],[[12916,12916],"mapped",[49324]],[[12917,12917],"mapped",[50500]],[[12918,12918],"mapped",[51088]],[[12919,12919],"mapped",[52264]],[[12920,12920],"mapped",[52852]],[[12921,12921],"mapped",[53440]],[[12922,12922],"mapped",[54028]],[[12923,12923],"mapped",[54616]],[[12924,12924],"mapped",[52280,44256]],[[12925,12925],"mapped",[51452,51032]],[[12926,12926],"mapped",[50864]],[[12927,12927],"valid",[],"NV8"],[[12928,12928],"mapped",[19968]],[[12929,12929],"mapped",[20108]],[[12930,12930],"mapped",[19977]],[[12931,12931],"mapped",[22235]],[[12932,12932],"mapped",[20116]],[[12933,12933],"mapped",[20845]],[[12934,12934],"mapped",[19971]],[[12935,12935],"mapped",[20843]],[[12936,12936],"mapped",[20061]],[[12937,12937],"mapped",[21313]],[[12938,12938],"mapped",[26376]],[[12939,12939],"mapped",[28779]],[[12940,12940],"mapped",[27700]],[[12941,12941],"mapped",[26408]],[[12942,12942],"mapped",[37329]],[[12943,12943],"mapped",[22303]],[[12944,12944],"mapped",[26085]],[[12945,12945],"mapped",[26666]],[[12946,12946],"mapped",[26377]],[[12947,12947],"mapped",[31038]],[[12948,12948],"mapped",[21517]],[[12949,12949],"mapped",[29305]],[[12950,12950],"mapped",[36001]],[[12951,12951],"mapped",[31069]],[[12952,12952],"mapped",[21172]],[[12953,12953],"mapped",[31192]],[[12954,12954],"mapped",[30007]],[[12955,12955],"mapped",[22899]],[[12956,12956],"mapped",[36969]],[[12957,12957],"mapped",[20778]],[[12958,12958],"mapped",[21360]],[[12959,12959],"mapped",[27880]],[[12960,12960],"mapped",[38917]],[[12961,12961],"mapped",[20241]],[[12962,12962],"mapped",[20889]],[[12963,12963],"mapped",[27491]],[[12964,12964],"mapped",[19978]],[[12965,12965],"mapped",[20013]],[[12966,12966],"mapped",[19979]],[[12967,12967],"mapped",[24038]],[[12968,12968],"mapped",[21491]],[[12969,12969],"mapped",[21307]],[[12970,12970],"mapped",[23447]],[[12971,12971],"mapped",[23398]],[[12972,12972],"mapped",[30435]],[[12973,12973],"mapped",[20225]],[[12974,12974],"mapped",[36039]],[[12975,12975],"mapped",[21332]],[[12976,12976],"mapped",[22812]],[[12977,12977],"mapped",[51,54]],[[12978,12978],"mapped",[51,55]],[[12979,12979],"mapped",[51,56]],[[12980,12980],"mapped",[51,57]],[[12981,12981],"mapped",[52,48]],[[12982,12982],"mapped",[52,49]],[[12983,12983],"mapped",[52,50]],[[12984,12984],"mapped",[52,51]],[[12985,12985],"mapped",[52,52]],[[12986,12986],"mapped",[52,53]],[[12987,12987],"mapped",[52,54]],[[12988,12988],"mapped",[52,55]],[[12989,12989],"mapped",[52,56]],[[12990,12990],"mapped",[52,57]],[[12991,12991],"mapped",[53,48]],[[12992,12992],"mapped",[49,26376]],[[12993,12993],"mapped",[50,26376]],[[12994,12994],"mapped",[51,26376]],[[12995,12995],"mapped",[52,26376]],[[12996,12996],"mapped",[53,26376]],[[12997,12997],"mapped",[54,26376]],[[12998,12998],"mapped",[55,26376]],[[12999,12999],"mapped",[56,26376]],[[13000,13000],"mapped",[57,26376]],[[13001,13001],"mapped",[49,48,26376]],[[13002,13002],"mapped",[49,49,26376]],[[13003,13003],"mapped",[49,50,26376]],[[13004,13004],"mapped",[104,103]],[[13005,13005],"mapped",[101,114,103]],[[13006,13006],"mapped",[101,118]],[[13007,13007],"mapped",[108,116,100]],[[13008,13008],"mapped",[12450]],[[13009,13009],"mapped",[12452]],[[13010,13010],"mapped",[12454]],[[13011,13011],"mapped",[12456]],[[13012,13012],"mapped",[12458]],[[13013,13013],"mapped",[12459]],[[13014,13014],"mapped",[12461]],[[13015,13015],"mapped",[12463]],[[13016,13016],"mapped",[12465]],[[13017,13017],"mapped",[12467]],[[13018,13018],"mapped",[12469]],[[13019,13019],"mapped",[12471]],[[13020,13020],"mapped",[12473]],[[13021,13021],"mapped",[12475]],[[13022,13022],"mapped",[12477]],[[13023,13023],"mapped",[12479]],[[13024,13024],"mapped",[12481]],[[13025,13025],"mapped",[12484]],[[13026,13026],"mapped",[12486]],[[13027,13027],"mapped",[12488]],[[13028,13028],"mapped",[12490]],[[13029,13029],"mapped",[12491]],[[13030,13030],"mapped",[12492]],[[13031,13031],"mapped",[12493]],[[13032,13032],"mapped",[12494]],[[13033,13033],"mapped",[12495]],[[13034,13034],"mapped",[12498]],[[13035,13035],"mapped",[12501]],[[13036,13036],"mapped",[12504]],[[13037,13037],"mapped",[12507]],[[13038,13038],"mapped",[12510]],[[13039,13039],"mapped",[12511]],[[13040,13040],"mapped",[12512]],[[13041,13041],"mapped",[12513]],[[13042,13042],"mapped",[12514]],[[13043,13043],"mapped",[12516]],[[13044,13044],"mapped",[12518]],[[13045,13045],"mapped",[12520]],[[13046,13046],"mapped",[12521]],[[13047,13047],"mapped",[12522]],[[13048,13048],"mapped",[12523]],[[13049,13049],"mapped",[12524]],[[13050,13050],"mapped",[12525]],[[13051,13051],"mapped",[12527]],[[13052,13052],"mapped",[12528]],[[13053,13053],"mapped",[12529]],[[13054,13054],"mapped",[12530]],[[13055,13055],"disallowed"],[[13056,13056],"mapped",[12450,12497,12540,12488]],[[13057,13057],"mapped",[12450,12523,12501,12449]],[[13058,13058],"mapped",[12450,12531,12506,12450]],[[13059,13059],"mapped",[12450,12540,12523]],[[13060,13060],"mapped",[12452,12491,12531,12464]],[[13061,13061],"mapped",[12452,12531,12481]],[[13062,13062],"mapped",[12454,12457,12531]],[[13063,13063],"mapped",[12456,12473,12463,12540,12489]],[[13064,13064],"mapped",[12456,12540,12459,12540]],[[13065,13065],"mapped",[12458,12531,12473]],[[13066,13066],"mapped",[12458,12540,12512]],[[13067,13067],"mapped",[12459,12452,12522]],[[13068,13068],"mapped",[12459,12521,12483,12488]],[[13069,13069],"mapped",[12459,12525,12522,12540]],[[13070,13070],"mapped",[12460,12525,12531]],[[13071,13071],"mapped",[12460,12531,12510]],[[13072,13072],"mapped",[12462,12460]],[[13073,13073],"mapped",[12462,12491,12540]],[[13074,13074],"mapped",[12461,12517,12522,12540]],[[13075,13075],"mapped",[12462,12523,12480,12540]],[[13076,13076],"mapped",[12461,12525]],[[13077,13077],"mapped",[12461,12525,12464,12521,12512]],[[13078,13078],"mapped",[12461,12525,12513,12540,12488,12523]],[[13079,13079],"mapped",[12461,12525,12527,12483,12488]],[[13080,13080],"mapped",[12464,12521,12512]],[[13081,13081],"mapped",[12464,12521,12512,12488,12531]],[[13082,13082],"mapped",[12463,12523,12476,12452,12525]],[[13083,13083],"mapped",[12463,12525,12540,12493]],[[13084,13084],"mapped",[12465,12540,12473]],[[13085,13085],"mapped",[12467,12523,12490]],[[13086,13086],"mapped",[12467,12540,12509]],[[13087,13087],"mapped",[12469,12452,12463,12523]],[[13088,13088],"mapped",[12469,12531,12481,12540,12512]],[[13089,13089],"mapped",[12471,12522,12531,12464]],[[13090,13090],"mapped",[12475,12531,12481]],[[13091,13091],"mapped",[12475,12531,12488]],[[13092,13092],"mapped",[12480,12540,12473]],[[13093,13093],"mapped",[12487,12471]],[[13094,13094],"mapped",[12489,12523]],[[13095,13095],"mapped",[12488,12531]],[[13096,13096],"mapped",[12490,12494]],[[13097,13097],"mapped",[12494,12483,12488]],[[13098,13098],"mapped",[12495,12452,12484]],[[13099,13099],"mapped",[12497,12540,12475,12531,12488]],[[13100,13100],"mapped",[12497,12540,12484]],[[13101,13101],"mapped",[12496,12540,12524,12523]],[[13102,13102],"mapped",[12500,12450,12473,12488,12523]],[[13103,13103],"mapped",[12500,12463,12523]],[[13104,13104],"mapped",[12500,12467]],[[13105,13105],"mapped",[12499,12523]],[[13106,13106],"mapped",[12501,12449,12521,12483,12489]],[[13107,13107],"mapped",[12501,12451,12540,12488]],[[13108,13108],"mapped",[12502,12483,12471,12455,12523]],[[13109,13109],"mapped",[12501,12521,12531]],[[13110,13110],"mapped",[12504,12463,12479,12540,12523]],[[13111,13111],"mapped",[12506,12477]],[[13112,13112],"mapped",[12506,12491,12498]],[[13113,13113],"mapped",[12504,12523,12484]],[[13114,13114],"mapped",[12506,12531,12473]],[[13115,13115],"mapped",[12506,12540,12472]],[[13116,13116],"mapped",[12505,12540,12479]],[[13117,13117],"mapped",[12509,12452,12531,12488]],[[13118,13118],"mapped",[12508,12523,12488]],[[13119,13119],"mapped",[12507,12531]],[[13120,13120],"mapped",[12509,12531,12489]],[[13121,13121],"mapped",[12507,12540,12523]],[[13122,13122],"mapped",[12507,12540,12531]],[[13123,13123],"mapped",[12510,12452,12463,12525]],[[13124,13124],"mapped",[12510,12452,12523]],[[13125,13125],"mapped",[12510,12483,12495]],[[13126,13126],"mapped",[12510,12523,12463]],[[13127,13127],"mapped",[12510,12531,12471,12519,12531]],[[13128,13128],"mapped",[12511,12463,12525,12531]],[[13129,13129],"mapped",[12511,12522]],[[13130,13130],"mapped",[12511,12522,12496,12540,12523]],[[13131,13131],"mapped",[12513,12460]],[[13132,13132],"mapped",[12513,12460,12488,12531]],[[13133,13133],"mapped",[12513,12540,12488,12523]],[[13134,13134],"mapped",[12516,12540,12489]],[[13135,13135],"mapped",[12516,12540,12523]],[[13136,13136],"mapped",[12518,12450,12531]],[[13137,13137],"mapped",[12522,12483,12488,12523]],[[13138,13138],"mapped",[12522,12521]],[[13139,13139],"mapped",[12523,12500,12540]],[[13140,13140],"mapped",[12523,12540,12502,12523]],[[13141,13141],"mapped",[12524,12512]],[[13142,13142],"mapped",[12524,12531,12488,12466,12531]],[[13143,13143],"mapped",[12527,12483,12488]],[[13144,13144],"mapped",[48,28857]],[[13145,13145],"mapped",[49,28857]],[[13146,13146],"mapped",[50,28857]],[[13147,13147],"mapped",[51,28857]],[[13148,13148],"mapped",[52,28857]],[[13149,13149],"mapped",[53,28857]],[[13150,13150],"mapped",[54,28857]],[[13151,13151],"mapped",[55,28857]],[[13152,13152],"mapped",[56,28857]],[[13153,13153],"mapped",[57,28857]],[[13154,13154],"mapped",[49,48,28857]],[[13155,13155],"mapped",[49,49,28857]],[[13156,13156],"mapped",[49,50,28857]],[[13157,13157],"mapped",[49,51,28857]],[[13158,13158],"mapped",[49,52,28857]],[[13159,13159],"mapped",[49,53,28857]],[[13160,13160],"mapped",[49,54,28857]],[[13161,13161],"mapped",[49,55,28857]],[[13162,13162],"mapped",[49,56,28857]],[[13163,13163],"mapped",[49,57,28857]],[[13164,13164],"mapped",[50,48,28857]],[[13165,13165],"mapped",[50,49,28857]],[[13166,13166],"mapped",[50,50,28857]],[[13167,13167],"mapped",[50,51,28857]],[[13168,13168],"mapped",[50,52,28857]],[[13169,13169],"mapped",[104,112,97]],[[13170,13170],"mapped",[100,97]],[[13171,13171],"mapped",[97,117]],[[13172,13172],"mapped",[98,97,114]],[[13173,13173],"mapped",[111,118]],[[13174,13174],"mapped",[112,99]],[[13175,13175],"mapped",[100,109]],[[13176,13176],"mapped",[100,109,50]],[[13177,13177],"mapped",[100,109,51]],[[13178,13178],"mapped",[105,117]],[[13179,13179],"mapped",[24179,25104]],[[13180,13180],"mapped",[26157,21644]],[[13181,13181],"mapped",[22823,27491]],[[13182,13182],"mapped",[26126,27835]],[[13183,13183],"mapped",[26666,24335,20250,31038]],[[13184,13184],"mapped",[112,97]],[[13185,13185],"mapped",[110,97]],[[13186,13186],"mapped",[956,97]],[[13187,13187],"mapped",[109,97]],[[13188,13188],"mapped",[107,97]],[[13189,13189],"mapped",[107,98]],[[13190,13190],"mapped",[109,98]],[[13191,13191],"mapped",[103,98]],[[13192,13192],"mapped",[99,97,108]],[[13193,13193],"mapped",[107,99,97,108]],[[13194,13194],"mapped",[112,102]],[[13195,13195],"mapped",[110,102]],[[13196,13196],"mapped",[956,102]],[[13197,13197],"mapped",[956,103]],[[13198,13198],"mapped",[109,103]],[[13199,13199],"mapped",[107,103]],[[13200,13200],"mapped",[104,122]],[[13201,13201],"mapped",[107,104,122]],[[13202,13202],"mapped",[109,104,122]],[[13203,13203],"mapped",[103,104,122]],[[13204,13204],"mapped",[116,104,122]],[[13205,13205],"mapped",[956,108]],[[13206,13206],"mapped",[109,108]],[[13207,13207],"mapped",[100,108]],[[13208,13208],"mapped",[107,108]],[[13209,13209],"mapped",[102,109]],[[13210,13210],"mapped",[110,109]],[[13211,13211],"mapped",[956,109]],[[13212,13212],"mapped",[109,109]],[[13213,13213],"mapped",[99,109]],[[13214,13214],"mapped",[107,109]],[[13215,13215],"mapped",[109,109,50]],[[13216,13216],"mapped",[99,109,50]],[[13217,13217],"mapped",[109,50]],[[13218,13218],"mapped",[107,109,50]],[[13219,13219],"mapped",[109,109,51]],[[13220,13220],"mapped",[99,109,51]],[[13221,13221],"mapped",[109,51]],[[13222,13222],"mapped",[107,109,51]],[[13223,13223],"mapped",[109,8725,115]],[[13224,13224],"mapped",[109,8725,115,50]],[[13225,13225],"mapped",[112,97]],[[13226,13226],"mapped",[107,112,97]],[[13227,13227],"mapped",[109,112,97]],[[13228,13228],"mapped",[103,112,97]],[[13229,13229],"mapped",[114,97,100]],[[13230,13230],"mapped",[114,97,100,8725,115]],[[13231,13231],"mapped",[114,97,100,8725,115,50]],[[13232,13232],"mapped",[112,115]],[[13233,13233],"mapped",[110,115]],[[13234,13234],"mapped",[956,115]],[[13235,13235],"mapped",[109,115]],[[13236,13236],"mapped",[112,118]],[[13237,13237],"mapped",[110,118]],[[13238,13238],"mapped",[956,118]],[[13239,13239],"mapped",[109,118]],[[13240,13240],"mapped",[107,118]],[[13241,13241],"mapped",[109,118]],[[13242,13242],"mapped",[112,119]],[[13243,13243],"mapped",[110,119]],[[13244,13244],"mapped",[956,119]],[[13245,13245],"mapped",[109,119]],[[13246,13246],"mapped",[107,119]],[[13247,13247],"mapped",[109,119]],[[13248,13248],"mapped",[107,969]],[[13249,13249],"mapped",[109,969]],[[13250,13250],"disallowed"],[[13251,13251],"mapped",[98,113]],[[13252,13252],"mapped",[99,99]],[[13253,13253],"mapped",[99,100]],[[13254,13254],"mapped",[99,8725,107,103]],[[13255,13255],"disallowed"],[[13256,13256],"mapped",[100,98]],[[13257,13257],"mapped",[103,121]],[[13258,13258],"mapped",[104,97]],[[13259,13259],"mapped",[104,112]],[[13260,13260],"mapped",[105,110]],[[13261,13261],"mapped",[107,107]],[[13262,13262],"mapped",[107,109]],[[13263,13263],"mapped",[107,116]],[[13264,13264],"mapped",[108,109]],[[13265,13265],"mapped",[108,110]],[[13266,13266],"mapped",[108,111,103]],[[13267,13267],"mapped",[108,120]],[[13268,13268],"mapped",[109,98]],[[13269,13269],"mapped",[109,105,108]],[[13270,13270],"mapped",[109,111,108]],[[13271,13271],"mapped",[112,104]],[[13272,13272],"disallowed"],[[13273,13273],"mapped",[112,112,109]],[[13274,13274],"mapped",[112,114]],[[13275,13275],"mapped",[115,114]],[[13276,13276],"mapped",[115,118]],[[13277,13277],"mapped",[119,98]],[[13278,13278],"mapped",[118,8725,109]],[[13279,13279],"mapped",[97,8725,109]],[[13280,13280],"mapped",[49,26085]],[[13281,13281],"mapped",[50,26085]],[[13282,13282],"mapped",[51,26085]],[[13283,13283],"mapped",[52,26085]],[[13284,13284],"mapped",[53,26085]],[[13285,13285],"mapped",[54,26085]],[[13286,13286],"mapped",[55,26085]],[[13287,13287],"mapped",[56,26085]],[[13288,13288],"mapped",[57,26085]],[[13289,13289],"mapped",[49,48,26085]],[[13290,13290],"mapped",[49,49,26085]],[[13291,13291],"mapped",[49,50,26085]],[[13292,13292],"mapped",[49,51,26085]],[[13293,13293],"mapped",[49,52,26085]],[[13294,13294],"mapped",[49,53,26085]],[[13295,13295],"mapped",[49,54,26085]],[[13296,13296],"mapped",[49,55,26085]],[[13297,13297],"mapped",[49,56,26085]],[[13298,13298],"mapped",[49,57,26085]],[[13299,13299],"mapped",[50,48,26085]],[[13300,13300],"mapped",[50,49,26085]],[[13301,13301],"mapped",[50,50,26085]],[[13302,13302],"mapped",[50,51,26085]],[[13303,13303],"mapped",[50,52,26085]],[[13304,13304],"mapped",[50,53,26085]],[[13305,13305],"mapped",[50,54,26085]],[[13306,13306],"mapped",[50,55,26085]],[[13307,13307],"mapped",[50,56,26085]],[[13308,13308],"mapped",[50,57,26085]],[[13309,13309],"mapped",[51,48,26085]],[[13310,13310],"mapped",[51,49,26085]],[[13311,13311],"mapped",[103,97,108]],[[13312,19893],"valid"],[[19894,19903],"disallowed"],[[19904,19967],"valid",[],"NV8"],[[19968,40869],"valid"],[[40870,40891],"valid"],[[40892,40899],"valid"],[[40900,40907],"valid"],[[40908,40908],"valid"],[[40909,40917],"valid"],[[40918,40959],"disallowed"],[[40960,42124],"valid"],[[42125,42127],"disallowed"],[[42128,42145],"valid",[],"NV8"],[[42146,42147],"valid",[],"NV8"],[[42148,42163],"valid",[],"NV8"],[[42164,42164],"valid",[],"NV8"],[[42165,42176],"valid",[],"NV8"],[[42177,42177],"valid",[],"NV8"],[[42178,42180],"valid",[],"NV8"],[[42181,42181],"valid",[],"NV8"],[[42182,42182],"valid",[],"NV8"],[[42183,42191],"disallowed"],[[42192,42237],"valid"],[[42238,42239],"valid",[],"NV8"],[[42240,42508],"valid"],[[42509,42511],"valid",[],"NV8"],[[42512,42539],"valid"],[[42540,42559],"disallowed"],[[42560,42560],"mapped",[42561]],[[42561,42561],"valid"],[[42562,42562],"mapped",[42563]],[[42563,42563],"valid"],[[42564,42564],"mapped",[42565]],[[42565,42565],"valid"],[[42566,42566],"mapped",[42567]],[[42567,42567],"valid"],[[42568,42568],"mapped",[42569]],[[42569,42569],"valid"],[[42570,42570],"mapped",[42571]],[[42571,42571],"valid"],[[42572,42572],"mapped",[42573]],[[42573,42573],"valid"],[[42574,42574],"mapped",[42575]],[[42575,42575],"valid"],[[42576,42576],"mapped",[42577]],[[42577,42577],"valid"],[[42578,42578],"mapped",[42579]],[[42579,42579],"valid"],[[42580,42580],"mapped",[42581]],[[42581,42581],"valid"],[[42582,42582],"mapped",[42583]],[[42583,42583],"valid"],[[42584,42584],"mapped",[42585]],[[42585,42585],"valid"],[[42586,42586],"mapped",[42587]],[[42587,42587],"valid"],[[42588,42588],"mapped",[42589]],[[42589,42589],"valid"],[[42590,42590],"mapped",[42591]],[[42591,42591],"valid"],[[42592,42592],"mapped",[42593]],[[42593,42593],"valid"],[[42594,42594],"mapped",[42595]],[[42595,42595],"valid"],[[42596,42596],"mapped",[42597]],[[42597,42597],"valid"],[[42598,42598],"mapped",[42599]],[[42599,42599],"valid"],[[42600,42600],"mapped",[42601]],[[42601,42601],"valid"],[[42602,42602],"mapped",[42603]],[[42603,42603],"valid"],[[42604,42604],"mapped",[42605]],[[42605,42607],"valid"],[[42608,42611],"valid",[],"NV8"],[[42612,42619],"valid"],[[42620,42621],"valid"],[[42622,42622],"valid",[],"NV8"],[[42623,42623],"valid"],[[42624,42624],"mapped",[42625]],[[42625,42625],"valid"],[[42626,42626],"mapped",[42627]],[[42627,42627],"valid"],[[42628,42628],"mapped",[42629]],[[42629,42629],"valid"],[[42630,42630],"mapped",[42631]],[[42631,42631],"valid"],[[42632,42632],"mapped",[42633]],[[42633,42633],"valid"],[[42634,42634],"mapped",[42635]],[[42635,42635],"valid"],[[42636,42636],"mapped",[42637]],[[42637,42637],"valid"],[[42638,42638],"mapped",[42639]],[[42639,42639],"valid"],[[42640,42640],"mapped",[42641]],[[42641,42641],"valid"],[[42642,42642],"mapped",[42643]],[[42643,42643],"valid"],[[42644,42644],"mapped",[42645]],[[42645,42645],"valid"],[[42646,42646],"mapped",[42647]],[[42647,42647],"valid"],[[42648,42648],"mapped",[42649]],[[42649,42649],"valid"],[[42650,42650],"mapped",[42651]],[[42651,42651],"valid"],[[42652,42652],"mapped",[1098]],[[42653,42653],"mapped",[1100]],[[42654,42654],"valid"],[[42655,42655],"valid"],[[42656,42725],"valid"],[[42726,42735],"valid",[],"NV8"],[[42736,42737],"valid"],[[42738,42743],"valid",[],"NV8"],[[42744,42751],"disallowed"],[[42752,42774],"valid",[],"NV8"],[[42775,42778],"valid"],[[42779,42783],"valid"],[[42784,42785],"valid",[],"NV8"],[[42786,42786],"mapped",[42787]],[[42787,42787],"valid"],[[42788,42788],"mapped",[42789]],[[42789,42789],"valid"],[[42790,42790],"mapped",[42791]],[[42791,42791],"valid"],[[42792,42792],"mapped",[42793]],[[42793,42793],"valid"],[[42794,42794],"mapped",[42795]],[[42795,42795],"valid"],[[42796,42796],"mapped",[42797]],[[42797,42797],"valid"],[[42798,42798],"mapped",[42799]],[[42799,42801],"valid"],[[42802,42802],"mapped",[42803]],[[42803,42803],"valid"],[[42804,42804],"mapped",[42805]],[[42805,42805],"valid"],[[42806,42806],"mapped",[42807]],[[42807,42807],"valid"],[[42808,42808],"mapped",[42809]],[[42809,42809],"valid"],[[42810,42810],"mapped",[42811]],[[42811,42811],"valid"],[[42812,42812],"mapped",[42813]],[[42813,42813],"valid"],[[42814,42814],"mapped",[42815]],[[42815,42815],"valid"],[[42816,42816],"mapped",[42817]],[[42817,42817],"valid"],[[42818,42818],"mapped",[42819]],[[42819,42819],"valid"],[[42820,42820],"mapped",[42821]],[[42821,42821],"valid"],[[42822,42822],"mapped",[42823]],[[42823,42823],"valid"],[[42824,42824],"mapped",[42825]],[[42825,42825],"valid"],[[42826,42826],"mapped",[42827]],[[42827,42827],"valid"],[[42828,42828],"mapped",[42829]],[[42829,42829],"valid"],[[42830,42830],"mapped",[42831]],[[42831,42831],"valid"],[[42832,42832],"mapped",[42833]],[[42833,42833],"valid"],[[42834,42834],"mapped",[42835]],[[42835,42835],"valid"],[[42836,42836],"mapped",[42837]],[[42837,42837],"valid"],[[42838,42838],"mapped",[42839]],[[42839,42839],"valid"],[[42840,42840],"mapped",[42841]],[[42841,42841],"valid"],[[42842,42842],"mapped",[42843]],[[42843,42843],"valid"],[[42844,42844],"mapped",[42845]],[[42845,42845],"valid"],[[42846,42846],"mapped",[42847]],[[42847,42847],"valid"],[[42848,42848],"mapped",[42849]],[[42849,42849],"valid"],[[42850,42850],"mapped",[42851]],[[42851,42851],"valid"],[[42852,42852],"mapped",[42853]],[[42853,42853],"valid"],[[42854,42854],"mapped",[42855]],[[42855,42855],"valid"],[[42856,42856],"mapped",[42857]],[[42857,42857],"valid"],[[42858,42858],"mapped",[42859]],[[42859,42859],"valid"],[[42860,42860],"mapped",[42861]],[[42861,42861],"valid"],[[42862,42862],"mapped",[42863]],[[42863,42863],"valid"],[[42864,42864],"mapped",[42863]],[[42865,42872],"valid"],[[42873,42873],"mapped",[42874]],[[42874,42874],"valid"],[[42875,42875],"mapped",[42876]],[[42876,42876],"valid"],[[42877,42877],"mapped",[7545]],[[42878,42878],"mapped",[42879]],[[42879,42879],"valid"],[[42880,42880],"mapped",[42881]],[[42881,42881],"valid"],[[42882,42882],"mapped",[42883]],[[42883,42883],"valid"],[[42884,42884],"mapped",[42885]],[[42885,42885],"valid"],[[42886,42886],"mapped",[42887]],[[42887,42888],"valid"],[[42889,42890],"valid",[],"NV8"],[[42891,42891],"mapped",[42892]],[[42892,42892],"valid"],[[42893,42893],"mapped",[613]],[[42894,42894],"valid"],[[42895,42895],"valid"],[[42896,42896],"mapped",[42897]],[[42897,42897],"valid"],[[42898,42898],"mapped",[42899]],[[42899,42899],"valid"],[[42900,42901],"valid"],[[42902,42902],"mapped",[42903]],[[42903,42903],"valid"],[[42904,42904],"mapped",[42905]],[[42905,42905],"valid"],[[42906,42906],"mapped",[42907]],[[42907,42907],"valid"],[[42908,42908],"mapped",[42909]],[[42909,42909],"valid"],[[42910,42910],"mapped",[42911]],[[42911,42911],"valid"],[[42912,42912],"mapped",[42913]],[[42913,42913],"valid"],[[42914,42914],"mapped",[42915]],[[42915,42915],"valid"],[[42916,42916],"mapped",[42917]],[[42917,42917],"valid"],[[42918,42918],"mapped",[42919]],[[42919,42919],"valid"],[[42920,42920],"mapped",[42921]],[[42921,42921],"valid"],[[42922,42922],"mapped",[614]],[[42923,42923],"mapped",[604]],[[42924,42924],"mapped",[609]],[[42925,42925],"mapped",[620]],[[42926,42927],"disallowed"],[[42928,42928],"mapped",[670]],[[42929,42929],"mapped",[647]],[[42930,42930],"mapped",[669]],[[42931,42931],"mapped",[43859]],[[42932,42932],"mapped",[42933]],[[42933,42933],"valid"],[[42934,42934],"mapped",[42935]],[[42935,42935],"valid"],[[42936,42998],"disallowed"],[[42999,42999],"valid"],[[43000,43000],"mapped",[295]],[[43001,43001],"mapped",[339]],[[43002,43002],"valid"],[[43003,43007],"valid"],[[43008,43047],"valid"],[[43048,43051],"valid",[],"NV8"],[[43052,43055],"disallowed"],[[43056,43065],"valid",[],"NV8"],[[43066,43071],"disallowed"],[[43072,43123],"valid"],[[43124,43127],"valid",[],"NV8"],[[43128,43135],"disallowed"],[[43136,43204],"valid"],[[43205,43213],"disallowed"],[[43214,43215],"valid",[],"NV8"],[[43216,43225],"valid"],[[43226,43231],"disallowed"],[[43232,43255],"valid"],[[43256,43258],"valid",[],"NV8"],[[43259,43259],"valid"],[[43260,43260],"valid",[],"NV8"],[[43261,43261],"valid"],[[43262,43263],"disallowed"],[[43264,43309],"valid"],[[43310,43311],"valid",[],"NV8"],[[43312,43347],"valid"],[[43348,43358],"disallowed"],[[43359,43359],"valid",[],"NV8"],[[43360,43388],"valid",[],"NV8"],[[43389,43391],"disallowed"],[[43392,43456],"valid"],[[43457,43469],"valid",[],"NV8"],[[43470,43470],"disallowed"],[[43471,43481],"valid"],[[43482,43485],"disallowed"],[[43486,43487],"valid",[],"NV8"],[[43488,43518],"valid"],[[43519,43519],"disallowed"],[[43520,43574],"valid"],[[43575,43583],"disallowed"],[[43584,43597],"valid"],[[43598,43599],"disallowed"],[[43600,43609],"valid"],[[43610,43611],"disallowed"],[[43612,43615],"valid",[],"NV8"],[[43616,43638],"valid"],[[43639,43641],"valid",[],"NV8"],[[43642,43643],"valid"],[[43644,43647],"valid"],[[43648,43714],"valid"],[[43715,43738],"disallowed"],[[43739,43741],"valid"],[[43742,43743],"valid",[],"NV8"],[[43744,43759],"valid"],[[43760,43761],"valid",[],"NV8"],[[43762,43766],"valid"],[[43767,43776],"disallowed"],[[43777,43782],"valid"],[[43783,43784],"disallowed"],[[43785,43790],"valid"],[[43791,43792],"disallowed"],[[43793,43798],"valid"],[[43799,43807],"disallowed"],[[43808,43814],"valid"],[[43815,43815],"disallowed"],[[43816,43822],"valid"],[[43823,43823],"disallowed"],[[43824,43866],"valid"],[[43867,43867],"valid",[],"NV8"],[[43868,43868],"mapped",[42791]],[[43869,43869],"mapped",[43831]],[[43870,43870],"mapped",[619]],[[43871,43871],"mapped",[43858]],[[43872,43875],"valid"],[[43876,43877],"valid"],[[43878,43887],"disallowed"],[[43888,43888],"mapped",[5024]],[[43889,43889],"mapped",[5025]],[[43890,43890],"mapped",[5026]],[[43891,43891],"mapped",[5027]],[[43892,43892],"mapped",[5028]],[[43893,43893],"mapped",[5029]],[[43894,43894],"mapped",[5030]],[[43895,43895],"mapped",[5031]],[[43896,43896],"mapped",[5032]],[[43897,43897],"mapped",[5033]],[[43898,43898],"mapped",[5034]],[[43899,43899],"mapped",[5035]],[[43900,43900],"mapped",[5036]],[[43901,43901],"mapped",[5037]],[[43902,43902],"mapped",[5038]],[[43903,43903],"mapped",[5039]],[[43904,43904],"mapped",[5040]],[[43905,43905],"mapped",[5041]],[[43906,43906],"mapped",[5042]],[[43907,43907],"mapped",[5043]],[[43908,43908],"mapped",[5044]],[[43909,43909],"mapped",[5045]],[[43910,43910],"mapped",[5046]],[[43911,43911],"mapped",[5047]],[[43912,43912],"mapped",[5048]],[[43913,43913],"mapped",[5049]],[[43914,43914],"mapped",[5050]],[[43915,43915],"mapped",[5051]],[[43916,43916],"mapped",[5052]],[[43917,43917],"mapped",[5053]],[[43918,43918],"mapped",[5054]],[[43919,43919],"mapped",[5055]],[[43920,43920],"mapped",[5056]],[[43921,43921],"mapped",[5057]],[[43922,43922],"mapped",[5058]],[[43923,43923],"mapped",[5059]],[[43924,43924],"mapped",[5060]],[[43925,43925],"mapped",[5061]],[[43926,43926],"mapped",[5062]],[[43927,43927],"mapped",[5063]],[[43928,43928],"mapped",[5064]],[[43929,43929],"mapped",[5065]],[[43930,43930],"mapped",[5066]],[[43931,43931],"mapped",[5067]],[[43932,43932],"mapped",[5068]],[[43933,43933],"mapped",[5069]],[[43934,43934],"mapped",[5070]],[[43935,43935],"mapped",[5071]],[[43936,43936],"mapped",[5072]],[[43937,43937],"mapped",[5073]],[[43938,43938],"mapped",[5074]],[[43939,43939],"mapped",[5075]],[[43940,43940],"mapped",[5076]],[[43941,43941],"mapped",[5077]],[[43942,43942],"mapped",[5078]],[[43943,43943],"mapped",[5079]],[[43944,43944],"mapped",[5080]],[[43945,43945],"mapped",[5081]],[[43946,43946],"mapped",[5082]],[[43947,43947],"mapped",[5083]],[[43948,43948],"mapped",[5084]],[[43949,43949],"mapped",[5085]],[[43950,43950],"mapped",[5086]],[[43951,43951],"mapped",[5087]],[[43952,43952],"mapped",[5088]],[[43953,43953],"mapped",[5089]],[[43954,43954],"mapped",[5090]],[[43955,43955],"mapped",[5091]],[[43956,43956],"mapped",[5092]],[[43957,43957],"mapped",[5093]],[[43958,43958],"mapped",[5094]],[[43959,43959],"mapped",[5095]],[[43960,43960],"mapped",[5096]],[[43961,43961],"mapped",[5097]],[[43962,43962],"mapped",[5098]],[[43963,43963],"mapped",[5099]],[[43964,43964],"mapped",[5100]],[[43965,43965],"mapped",[5101]],[[43966,43966],"mapped",[5102]],[[43967,43967],"mapped",[5103]],[[43968,44010],"valid"],[[44011,44011],"valid",[],"NV8"],[[44012,44013],"valid"],[[44014,44015],"disallowed"],[[44016,44025],"valid"],[[44026,44031],"disallowed"],[[44032,55203],"valid"],[[55204,55215],"disallowed"],[[55216,55238],"valid",[],"NV8"],[[55239,55242],"disallowed"],[[55243,55291],"valid",[],"NV8"],[[55292,55295],"disallowed"],[[55296,57343],"disallowed"],[[57344,63743],"disallowed"],[[63744,63744],"mapped",[35912]],[[63745,63745],"mapped",[26356]],[[63746,63746],"mapped",[36554]],[[63747,63747],"mapped",[36040]],[[63748,63748],"mapped",[28369]],[[63749,63749],"mapped",[20018]],[[63750,63750],"mapped",[21477]],[[63751,63752],"mapped",[40860]],[[63753,63753],"mapped",[22865]],[[63754,63754],"mapped",[37329]],[[63755,63755],"mapped",[21895]],[[63756,63756],"mapped",[22856]],[[63757,63757],"mapped",[25078]],[[63758,63758],"mapped",[30313]],[[63759,63759],"mapped",[32645]],[[63760,63760],"mapped",[34367]],[[63761,63761],"mapped",[34746]],[[63762,63762],"mapped",[35064]],[[63763,63763],"mapped",[37007]],[[63764,63764],"mapped",[27138]],[[63765,63765],"mapped",[27931]],[[63766,63766],"mapped",[28889]],[[63767,63767],"mapped",[29662]],[[63768,63768],"mapped",[33853]],[[63769,63769],"mapped",[37226]],[[63770,63770],"mapped",[39409]],[[63771,63771],"mapped",[20098]],[[63772,63772],"mapped",[21365]],[[63773,63773],"mapped",[27396]],[[63774,63774],"mapped",[29211]],[[63775,63775],"mapped",[34349]],[[63776,63776],"mapped",[40478]],[[63777,63777],"mapped",[23888]],[[63778,63778],"mapped",[28651]],[[63779,63779],"mapped",[34253]],[[63780,63780],"mapped",[35172]],[[63781,63781],"mapped",[25289]],[[63782,63782],"mapped",[33240]],[[63783,63783],"mapped",[34847]],[[63784,63784],"mapped",[24266]],[[63785,63785],"mapped",[26391]],[[63786,63786],"mapped",[28010]],[[63787,63787],"mapped",[29436]],[[63788,63788],"mapped",[37070]],[[63789,63789],"mapped",[20358]],[[63790,63790],"mapped",[20919]],[[63791,63791],"mapped",[21214]],[[63792,63792],"mapped",[25796]],[[63793,63793],"mapped",[27347]],[[63794,63794],"mapped",[29200]],[[63795,63795],"mapped",[30439]],[[63796,63796],"mapped",[32769]],[[63797,63797],"mapped",[34310]],[[63798,63798],"mapped",[34396]],[[63799,63799],"mapped",[36335]],[[63800,63800],"mapped",[38706]],[[63801,63801],"mapped",[39791]],[[63802,63802],"mapped",[40442]],[[63803,63803],"mapped",[30860]],[[63804,63804],"mapped",[31103]],[[63805,63805],"mapped",[32160]],[[63806,63806],"mapped",[33737]],[[63807,63807],"mapped",[37636]],[[63808,63808],"mapped",[40575]],[[63809,63809],"mapped",[35542]],[[63810,63810],"mapped",[22751]],[[63811,63811],"mapped",[24324]],[[63812,63812],"mapped",[31840]],[[63813,63813],"mapped",[32894]],[[63814,63814],"mapped",[29282]],[[63815,63815],"mapped",[30922]],[[63816,63816],"mapped",[36034]],[[63817,63817],"mapped",[38647]],[[63818,63818],"mapped",[22744]],[[63819,63819],"mapped",[23650]],[[63820,63820],"mapped",[27155]],[[63821,63821],"mapped",[28122]],[[63822,63822],"mapped",[28431]],[[63823,63823],"mapped",[32047]],[[63824,63824],"mapped",[32311]],[[63825,63825],"mapped",[38475]],[[63826,63826],"mapped",[21202]],[[63827,63827],"mapped",[32907]],[[63828,63828],"mapped",[20956]],[[63829,63829],"mapped",[20940]],[[63830,63830],"mapped",[31260]],[[63831,63831],"mapped",[32190]],[[63832,63832],"mapped",[33777]],[[63833,63833],"mapped",[38517]],[[63834,63834],"mapped",[35712]],[[63835,63835],"mapped",[25295]],[[63836,63836],"mapped",[27138]],[[63837,63837],"mapped",[35582]],[[63838,63838],"mapped",[20025]],[[63839,63839],"mapped",[23527]],[[63840,63840],"mapped",[24594]],[[63841,63841],"mapped",[29575]],[[63842,63842],"mapped",[30064]],[[63843,63843],"mapped",[21271]],[[63844,63844],"mapped",[30971]],[[63845,63845],"mapped",[20415]],[[63846,63846],"mapped",[24489]],[[63847,63847],"mapped",[19981]],[[63848,63848],"mapped",[27852]],[[63849,63849],"mapped",[25976]],[[63850,63850],"mapped",[32034]],[[63851,63851],"mapped",[21443]],[[63852,63852],"mapped",[22622]],[[63853,63853],"mapped",[30465]],[[63854,63854],"mapped",[33865]],[[63855,63855],"mapped",[35498]],[[63856,63856],"mapped",[27578]],[[63857,63857],"mapped",[36784]],[[63858,63858],"mapped",[27784]],[[63859,63859],"mapped",[25342]],[[63860,63860],"mapped",[33509]],[[63861,63861],"mapped",[25504]],[[63862,63862],"mapped",[30053]],[[63863,63863],"mapped",[20142]],[[63864,63864],"mapped",[20841]],[[63865,63865],"mapped",[20937]],[[63866,63866],"mapped",[26753]],[[63867,63867],"mapped",[31975]],[[63868,63868],"mapped",[33391]],[[63869,63869],"mapped",[35538]],[[63870,63870],"mapped",[37327]],[[63871,63871],"mapped",[21237]],[[63872,63872],"mapped",[21570]],[[63873,63873],"mapped",[22899]],[[63874,63874],"mapped",[24300]],[[63875,63875],"mapped",[26053]],[[63876,63876],"mapped",[28670]],[[63877,63877],"mapped",[31018]],[[63878,63878],"mapped",[38317]],[[63879,63879],"mapped",[39530]],[[63880,63880],"mapped",[40599]],[[63881,63881],"mapped",[40654]],[[63882,63882],"mapped",[21147]],[[63883,63883],"mapped",[26310]],[[63884,63884],"mapped",[27511]],[[63885,63885],"mapped",[36706]],[[63886,63886],"mapped",[24180]],[[63887,63887],"mapped",[24976]],[[63888,63888],"mapped",[25088]],[[63889,63889],"mapped",[25754]],[[63890,63890],"mapped",[28451]],[[63891,63891],"mapped",[29001]],[[63892,63892],"mapped",[29833]],[[63893,63893],"mapped",[31178]],[[63894,63894],"mapped",[32244]],[[63895,63895],"mapped",[32879]],[[63896,63896],"mapped",[36646]],[[63897,63897],"mapped",[34030]],[[63898,63898],"mapped",[36899]],[[63899,63899],"mapped",[37706]],[[63900,63900],"mapped",[21015]],[[63901,63901],"mapped",[21155]],[[63902,63902],"mapped",[21693]],[[63903,63903],"mapped",[28872]],[[63904,63904],"mapped",[35010]],[[63905,63905],"mapped",[35498]],[[63906,63906],"mapped",[24265]],[[63907,63907],"mapped",[24565]],[[63908,63908],"mapped",[25467]],[[63909,63909],"mapped",[27566]],[[63910,63910],"mapped",[31806]],[[63911,63911],"mapped",[29557]],[[63912,63912],"mapped",[20196]],[[63913,63913],"mapped",[22265]],[[63914,63914],"mapped",[23527]],[[63915,63915],"mapped",[23994]],[[63916,63916],"mapped",[24604]],[[63917,63917],"mapped",[29618]],[[63918,63918],"mapped",[29801]],[[63919,63919],"mapped",[32666]],[[63920,63920],"mapped",[32838]],[[63921,63921],"mapped",[37428]],[[63922,63922],"mapped",[38646]],[[63923,63923],"mapped",[38728]],[[63924,63924],"mapped",[38936]],[[63925,63925],"mapped",[20363]],[[63926,63926],"mapped",[31150]],[[63927,63927],"mapped",[37300]],[[63928,63928],"mapped",[38584]],[[63929,63929],"mapped",[24801]],[[63930,63930],"mapped",[20102]],[[63931,63931],"mapped",[20698]],[[63932,63932],"mapped",[23534]],[[63933,63933],"mapped",[23615]],[[63934,63934],"mapped",[26009]],[[63935,63935],"mapped",[27138]],[[63936,63936],"mapped",[29134]],[[63937,63937],"mapped",[30274]],[[63938,63938],"mapped",[34044]],[[63939,63939],"mapped",[36988]],[[63940,63940],"mapped",[40845]],[[63941,63941],"mapped",[26248]],[[63942,63942],"mapped",[38446]],[[63943,63943],"mapped",[21129]],[[63944,63944],"mapped",[26491]],[[63945,63945],"mapped",[26611]],[[63946,63946],"mapped",[27969]],[[63947,63947],"mapped",[28316]],[[63948,63948],"mapped",[29705]],[[63949,63949],"mapped",[30041]],[[63950,63950],"mapped",[30827]],[[63951,63951],"mapped",[32016]],[[63952,63952],"mapped",[39006]],[[63953,63953],"mapped",[20845]],[[63954,63954],"mapped",[25134]],[[63955,63955],"mapped",[38520]],[[63956,63956],"mapped",[20523]],[[63957,63957],"mapped",[23833]],[[63958,63958],"mapped",[28138]],[[63959,63959],"mapped",[36650]],[[63960,63960],"mapped",[24459]],[[63961,63961],"mapped",[24900]],[[63962,63962],"mapped",[26647]],[[63963,63963],"mapped",[29575]],[[63964,63964],"mapped",[38534]],[[63965,63965],"mapped",[21033]],[[63966,63966],"mapped",[21519]],[[63967,63967],"mapped",[23653]],[[63968,63968],"mapped",[26131]],[[63969,63969],"mapped",[26446]],[[63970,63970],"mapped",[26792]],[[63971,63971],"mapped",[27877]],[[63972,63972],"mapped",[29702]],[[63973,63973],"mapped",[30178]],[[63974,63974],"mapped",[32633]],[[63975,63975],"mapped",[35023]],[[63976,63976],"mapped",[35041]],[[63977,63977],"mapped",[37324]],[[63978,63978],"mapped",[38626]],[[63979,63979],"mapped",[21311]],[[63980,63980],"mapped",[28346]],[[63981,63981],"mapped",[21533]],[[63982,63982],"mapped",[29136]],[[63983,63983],"mapped",[29848]],[[63984,63984],"mapped",[34298]],[[63985,63985],"mapped",[38563]],[[63986,63986],"mapped",[40023]],[[63987,63987],"mapped",[40607]],[[63988,63988],"mapped",[26519]],[[63989,63989],"mapped",[28107]],[[63990,63990],"mapped",[33256]],[[63991,63991],"mapped",[31435]],[[63992,63992],"mapped",[31520]],[[63993,63993],"mapped",[31890]],[[63994,63994],"mapped",[29376]],[[63995,63995],"mapped",[28825]],[[63996,63996],"mapped",[35672]],[[63997,63997],"mapped",[20160]],[[63998,63998],"mapped",[33590]],[[63999,63999],"mapped",[21050]],[[64000,64000],"mapped",[20999]],[[64001,64001],"mapped",[24230]],[[64002,64002],"mapped",[25299]],[[64003,64003],"mapped",[31958]],[[64004,64004],"mapped",[23429]],[[64005,64005],"mapped",[27934]],[[64006,64006],"mapped",[26292]],[[64007,64007],"mapped",[36667]],[[64008,64008],"mapped",[34892]],[[64009,64009],"mapped",[38477]],[[64010,64010],"mapped",[35211]],[[64011,64011],"mapped",[24275]],[[64012,64012],"mapped",[20800]],[[64013,64013],"mapped",[21952]],[[64014,64015],"valid"],[[64016,64016],"mapped",[22618]],[[64017,64017],"valid"],[[64018,64018],"mapped",[26228]],[[64019,64020],"valid"],[[64021,64021],"mapped",[20958]],[[64022,64022],"mapped",[29482]],[[64023,64023],"mapped",[30410]],[[64024,64024],"mapped",[31036]],[[64025,64025],"mapped",[31070]],[[64026,64026],"mapped",[31077]],[[64027,64027],"mapped",[31119]],[[64028,64028],"mapped",[38742]],[[64029,64029],"mapped",[31934]],[[64030,64030],"mapped",[32701]],[[64031,64031],"valid"],[[64032,64032],"mapped",[34322]],[[64033,64033],"valid"],[[64034,64034],"mapped",[35576]],[[64035,64036],"valid"],[[64037,64037],"mapped",[36920]],[[64038,64038],"mapped",[37117]],[[64039,64041],"valid"],[[64042,64042],"mapped",[39151]],[[64043,64043],"mapped",[39164]],[[64044,64044],"mapped",[39208]],[[64045,64045],"mapped",[40372]],[[64046,64046],"mapped",[37086]],[[64047,64047],"mapped",[38583]],[[64048,64048],"mapped",[20398]],[[64049,64049],"mapped",[20711]],[[64050,64050],"mapped",[20813]],[[64051,64051],"mapped",[21193]],[[64052,64052],"mapped",[21220]],[[64053,64053],"mapped",[21329]],[[64054,64054],"mapped",[21917]],[[64055,64055],"mapped",[22022]],[[64056,64056],"mapped",[22120]],[[64057,64057],"mapped",[22592]],[[64058,64058],"mapped",[22696]],[[64059,64059],"mapped",[23652]],[[64060,64060],"mapped",[23662]],[[64061,64061],"mapped",[24724]],[[64062,64062],"mapped",[24936]],[[64063,64063],"mapped",[24974]],[[64064,64064],"mapped",[25074]],[[64065,64065],"mapped",[25935]],[[64066,64066],"mapped",[26082]],[[64067,64067],"mapped",[26257]],[[64068,64068],"mapped",[26757]],[[64069,64069],"mapped",[28023]],[[64070,64070],"mapped",[28186]],[[64071,64071],"mapped",[28450]],[[64072,64072],"mapped",[29038]],[[64073,64073],"mapped",[29227]],[[64074,64074],"mapped",[29730]],[[64075,64075],"mapped",[30865]],[[64076,64076],"mapped",[31038]],[[64077,64077],"mapped",[31049]],[[64078,64078],"mapped",[31048]],[[64079,64079],"mapped",[31056]],[[64080,64080],"mapped",[31062]],[[64081,64081],"mapped",[31069]],[[64082,64082],"mapped",[31117]],[[64083,64083],"mapped",[31118]],[[64084,64084],"mapped",[31296]],[[64085,64085],"mapped",[31361]],[[64086,64086],"mapped",[31680]],[[64087,64087],"mapped",[32244]],[[64088,64088],"mapped",[32265]],[[64089,64089],"mapped",[32321]],[[64090,64090],"mapped",[32626]],[[64091,64091],"mapped",[32773]],[[64092,64092],"mapped",[33261]],[[64093,64094],"mapped",[33401]],[[64095,64095],"mapped",[33879]],[[64096,64096],"mapped",[35088]],[[64097,64097],"mapped",[35222]],[[64098,64098],"mapped",[35585]],[[64099,64099],"mapped",[35641]],[[64100,64100],"mapped",[36051]],[[64101,64101],"mapped",[36104]],[[64102,64102],"mapped",[36790]],[[64103,64103],"mapped",[36920]],[[64104,64104],"mapped",[38627]],[[64105,64105],"mapped",[38911]],[[64106,64106],"mapped",[38971]],[[64107,64107],"mapped",[24693]],[[64108,64108],"mapped",[148206]],[[64109,64109],"mapped",[33304]],[[64110,64111],"disallowed"],[[64112,64112],"mapped",[20006]],[[64113,64113],"mapped",[20917]],[[64114,64114],"mapped",[20840]],[[64115,64115],"mapped",[20352]],[[64116,64116],"mapped",[20805]],[[64117,64117],"mapped",[20864]],[[64118,64118],"mapped",[21191]],[[64119,64119],"mapped",[21242]],[[64120,64120],"mapped",[21917]],[[64121,64121],"mapped",[21845]],[[64122,64122],"mapped",[21913]],[[64123,64123],"mapped",[21986]],[[64124,64124],"mapped",[22618]],[[64125,64125],"mapped",[22707]],[[64126,64126],"mapped",[22852]],[[64127,64127],"mapped",[22868]],[[64128,64128],"mapped",[23138]],[[64129,64129],"mapped",[23336]],[[64130,64130],"mapped",[24274]],[[64131,64131],"mapped",[24281]],[[64132,64132],"mapped",[24425]],[[64133,64133],"mapped",[24493]],[[64134,64134],"mapped",[24792]],[[64135,64135],"mapped",[24910]],[[64136,64136],"mapped",[24840]],[[64137,64137],"mapped",[24974]],[[64138,64138],"mapped",[24928]],[[64139,64139],"mapped",[25074]],[[64140,64140],"mapped",[25140]],[[64141,64141],"mapped",[25540]],[[64142,64142],"mapped",[25628]],[[64143,64143],"mapped",[25682]],[[64144,64144],"mapped",[25942]],[[64145,64145],"mapped",[26228]],[[64146,64146],"mapped",[26391]],[[64147,64147],"mapped",[26395]],[[64148,64148],"mapped",[26454]],[[64149,64149],"mapped",[27513]],[[64150,64150],"mapped",[27578]],[[64151,64151],"mapped",[27969]],[[64152,64152],"mapped",[28379]],[[64153,64153],"mapped",[28363]],[[64154,64154],"mapped",[28450]],[[64155,64155],"mapped",[28702]],[[64156,64156],"mapped",[29038]],[[64157,64157],"mapped",[30631]],[[64158,64158],"mapped",[29237]],[[64159,64159],"mapped",[29359]],[[64160,64160],"mapped",[29482]],[[64161,64161],"mapped",[29809]],[[64162,64162],"mapped",[29958]],[[64163,64163],"mapped",[30011]],[[64164,64164],"mapped",[30237]],[[64165,64165],"mapped",[30239]],[[64166,64166],"mapped",[30410]],[[64167,64167],"mapped",[30427]],[[64168,64168],"mapped",[30452]],[[64169,64169],"mapped",[30538]],[[64170,64170],"mapped",[30528]],[[64171,64171],"mapped",[30924]],[[64172,64172],"mapped",[31409]],[[64173,64173],"mapped",[31680]],[[64174,64174],"mapped",[31867]],[[64175,64175],"mapped",[32091]],[[64176,64176],"mapped",[32244]],[[64177,64177],"mapped",[32574]],[[64178,64178],"mapped",[32773]],[[64179,64179],"mapped",[33618]],[[64180,64180],"mapped",[33775]],[[64181,64181],"mapped",[34681]],[[64182,64182],"mapped",[35137]],[[64183,64183],"mapped",[35206]],[[64184,64184],"mapped",[35222]],[[64185,64185],"mapped",[35519]],[[64186,64186],"mapped",[35576]],[[64187,64187],"mapped",[35531]],[[64188,64188],"mapped",[35585]],[[64189,64189],"mapped",[35582]],[[64190,64190],"mapped",[35565]],[[64191,64191],"mapped",[35641]],[[64192,64192],"mapped",[35722]],[[64193,64193],"mapped",[36104]],[[64194,64194],"mapped",[36664]],[[64195,64195],"mapped",[36978]],[[64196,64196],"mapped",[37273]],[[64197,64197],"mapped",[37494]],[[64198,64198],"mapped",[38524]],[[64199,64199],"mapped",[38627]],[[64200,64200],"mapped",[38742]],[[64201,64201],"mapped",[38875]],[[64202,64202],"mapped",[38911]],[[64203,64203],"mapped",[38923]],[[64204,64204],"mapped",[38971]],[[64205,64205],"mapped",[39698]],[[64206,64206],"mapped",[40860]],[[64207,64207],"mapped",[141386]],[[64208,64208],"mapped",[141380]],[[64209,64209],"mapped",[144341]],[[64210,64210],"mapped",[15261]],[[64211,64211],"mapped",[16408]],[[64212,64212],"mapped",[16441]],[[64213,64213],"mapped",[152137]],[[64214,64214],"mapped",[154832]],[[64215,64215],"mapped",[163539]],[[64216,64216],"mapped",[40771]],[[64217,64217],"mapped",[40846]],[[64218,64255],"disallowed"],[[64256,64256],"mapped",[102,102]],[[64257,64257],"mapped",[102,105]],[[64258,64258],"mapped",[102,108]],[[64259,64259],"mapped",[102,102,105]],[[64260,64260],"mapped",[102,102,108]],[[64261,64262],"mapped",[115,116]],[[64263,64274],"disallowed"],[[64275,64275],"mapped",[1396,1398]],[[64276,64276],"mapped",[1396,1381]],[[64277,64277],"mapped",[1396,1387]],[[64278,64278],"mapped",[1406,1398]],[[64279,64279],"mapped",[1396,1389]],[[64280,64284],"disallowed"],[[64285,64285],"mapped",[1497,1460]],[[64286,64286],"valid"],[[64287,64287],"mapped",[1522,1463]],[[64288,64288],"mapped",[1506]],[[64289,64289],"mapped",[1488]],[[64290,64290],"mapped",[1491]],[[64291,64291],"mapped",[1492]],[[64292,64292],"mapped",[1499]],[[64293,64293],"mapped",[1500]],[[64294,64294],"mapped",[1501]],[[64295,64295],"mapped",[1512]],[[64296,64296],"mapped",[1514]],[[64297,64297],"disallowed_STD3_mapped",[43]],[[64298,64298],"mapped",[1513,1473]],[[64299,64299],"mapped",[1513,1474]],[[64300,64300],"mapped",[1513,1468,1473]],[[64301,64301],"mapped",[1513,1468,1474]],[[64302,64302],"mapped",[1488,1463]],[[64303,64303],"mapped",[1488,1464]],[[64304,64304],"mapped",[1488,1468]],[[64305,64305],"mapped",[1489,1468]],[[64306,64306],"mapped",[1490,1468]],[[64307,64307],"mapped",[1491,1468]],[[64308,64308],"mapped",[1492,1468]],[[64309,64309],"mapped",[1493,1468]],[[64310,64310],"mapped",[1494,1468]],[[64311,64311],"disallowed"],[[64312,64312],"mapped",[1496,1468]],[[64313,64313],"mapped",[1497,1468]],[[64314,64314],"mapped",[1498,1468]],[[64315,64315],"mapped",[1499,1468]],[[64316,64316],"mapped",[1500,1468]],[[64317,64317],"disallowed"],[[64318,64318],"mapped",[1502,1468]],[[64319,64319],"disallowed"],[[64320,64320],"mapped",[1504,1468]],[[64321,64321],"mapped",[1505,1468]],[[64322,64322],"disallowed"],[[64323,64323],"mapped",[1507,1468]],[[64324,64324],"mapped",[1508,1468]],[[64325,64325],"disallowed"],[[64326,64326],"mapped",[1510,1468]],[[64327,64327],"mapped",[1511,1468]],[[64328,64328],"mapped",[1512,1468]],[[64329,64329],"mapped",[1513,1468]],[[64330,64330],"mapped",[1514,1468]],[[64331,64331],"mapped",[1493,1465]],[[64332,64332],"mapped",[1489,1471]],[[64333,64333],"mapped",[1499,1471]],[[64334,64334],"mapped",[1508,1471]],[[64335,64335],"mapped",[1488,1500]],[[64336,64337],"mapped",[1649]],[[64338,64341],"mapped",[1659]],[[64342,64345],"mapped",[1662]],[[64346,64349],"mapped",[1664]],[[64350,64353],"mapped",[1658]],[[64354,64357],"mapped",[1663]],[[64358,64361],"mapped",[1657]],[[64362,64365],"mapped",[1700]],[[64366,64369],"mapped",[1702]],[[64370,64373],"mapped",[1668]],[[64374,64377],"mapped",[1667]],[[64378,64381],"mapped",[1670]],[[64382,64385],"mapped",[1671]],[[64386,64387],"mapped",[1677]],[[64388,64389],"mapped",[1676]],[[64390,64391],"mapped",[1678]],[[64392,64393],"mapped",[1672]],[[64394,64395],"mapped",[1688]],[[64396,64397],"mapped",[1681]],[[64398,64401],"mapped",[1705]],[[64402,64405],"mapped",[1711]],[[64406,64409],"mapped",[1715]],[[64410,64413],"mapped",[1713]],[[64414,64415],"mapped",[1722]],[[64416,64419],"mapped",[1723]],[[64420,64421],"mapped",[1728]],[[64422,64425],"mapped",[1729]],[[64426,64429],"mapped",[1726]],[[64430,64431],"mapped",[1746]],[[64432,64433],"mapped",[1747]],[[64434,64449],"valid",[],"NV8"],[[64450,64466],"disallowed"],[[64467,64470],"mapped",[1709]],[[64471,64472],"mapped",[1735]],[[64473,64474],"mapped",[1734]],[[64475,64476],"mapped",[1736]],[[64477,64477],"mapped",[1735,1652]],[[64478,64479],"mapped",[1739]],[[64480,64481],"mapped",[1733]],[[64482,64483],"mapped",[1737]],[[64484,64487],"mapped",[1744]],[[64488,64489],"mapped",[1609]],[[64490,64491],"mapped",[1574,1575]],[[64492,64493],"mapped",[1574,1749]],[[64494,64495],"mapped",[1574,1608]],[[64496,64497],"mapped",[1574,1735]],[[64498,64499],"mapped",[1574,1734]],[[64500,64501],"mapped",[1574,1736]],[[64502,64504],"mapped",[1574,1744]],[[64505,64507],"mapped",[1574,1609]],[[64508,64511],"mapped",[1740]],[[64512,64512],"mapped",[1574,1580]],[[64513,64513],"mapped",[1574,1581]],[[64514,64514],"mapped",[1574,1605]],[[64515,64515],"mapped",[1574,1609]],[[64516,64516],"mapped",[1574,1610]],[[64517,64517],"mapped",[1576,1580]],[[64518,64518],"mapped",[1576,1581]],[[64519,64519],"mapped",[1576,1582]],[[64520,64520],"mapped",[1576,1605]],[[64521,64521],"mapped",[1576,1609]],[[64522,64522],"mapped",[1576,1610]],[[64523,64523],"mapped",[1578,1580]],[[64524,64524],"mapped",[1578,1581]],[[64525,64525],"mapped",[1578,1582]],[[64526,64526],"mapped",[1578,1605]],[[64527,64527],"mapped",[1578,1609]],[[64528,64528],"mapped",[1578,1610]],[[64529,64529],"mapped",[1579,1580]],[[64530,64530],"mapped",[1579,1605]],[[64531,64531],"mapped",[1579,1609]],[[64532,64532],"mapped",[1579,1610]],[[64533,64533],"mapped",[1580,1581]],[[64534,64534],"mapped",[1580,1605]],[[64535,64535],"mapped",[1581,1580]],[[64536,64536],"mapped",[1581,1605]],[[64537,64537],"mapped",[1582,1580]],[[64538,64538],"mapped",[1582,1581]],[[64539,64539],"mapped",[1582,1605]],[[64540,64540],"mapped",[1587,1580]],[[64541,64541],"mapped",[1587,1581]],[[64542,64542],"mapped",[1587,1582]],[[64543,64543],"mapped",[1587,1605]],[[64544,64544],"mapped",[1589,1581]],[[64545,64545],"mapped",[1589,1605]],[[64546,64546],"mapped",[1590,1580]],[[64547,64547],"mapped",[1590,1581]],[[64548,64548],"mapped",[1590,1582]],[[64549,64549],"mapped",[1590,1605]],[[64550,64550],"mapped",[1591,1581]],[[64551,64551],"mapped",[1591,1605]],[[64552,64552],"mapped",[1592,1605]],[[64553,64553],"mapped",[1593,1580]],[[64554,64554],"mapped",[1593,1605]],[[64555,64555],"mapped",[1594,1580]],[[64556,64556],"mapped",[1594,1605]],[[64557,64557],"mapped",[1601,1580]],[[64558,64558],"mapped",[1601,1581]],[[64559,64559],"mapped",[1601,1582]],[[64560,64560],"mapped",[1601,1605]],[[64561,64561],"mapped",[1601,1609]],[[64562,64562],"mapped",[1601,1610]],[[64563,64563],"mapped",[1602,1581]],[[64564,64564],"mapped",[1602,1605]],[[64565,64565],"mapped",[1602,1609]],[[64566,64566],"mapped",[1602,1610]],[[64567,64567],"mapped",[1603,1575]],[[64568,64568],"mapped",[1603,1580]],[[64569,64569],"mapped",[1603,1581]],[[64570,64570],"mapped",[1603,1582]],[[64571,64571],"mapped",[1603,1604]],[[64572,64572],"mapped",[1603,1605]],[[64573,64573],"mapped",[1603,1609]],[[64574,64574],"mapped",[1603,1610]],[[64575,64575],"mapped",[1604,1580]],[[64576,64576],"mapped",[1604,1581]],[[64577,64577],"mapped",[1604,1582]],[[64578,64578],"mapped",[1604,1605]],[[64579,64579],"mapped",[1604,1609]],[[64580,64580],"mapped",[1604,1610]],[[64581,64581],"mapped",[1605,1580]],[[64582,64582],"mapped",[1605,1581]],[[64583,64583],"mapped",[1605,1582]],[[64584,64584],"mapped",[1605,1605]],[[64585,64585],"mapped",[1605,1609]],[[64586,64586],"mapped",[1605,1610]],[[64587,64587],"mapped",[1606,1580]],[[64588,64588],"mapped",[1606,1581]],[[64589,64589],"mapped",[1606,1582]],[[64590,64590],"mapped",[1606,1605]],[[64591,64591],"mapped",[1606,1609]],[[64592,64592],"mapped",[1606,1610]],[[64593,64593],"mapped",[1607,1580]],[[64594,64594],"mapped",[1607,1605]],[[64595,64595],"mapped",[1607,1609]],[[64596,64596],"mapped",[1607,1610]],[[64597,64597],"mapped",[1610,1580]],[[64598,64598],"mapped",[1610,1581]],[[64599,64599],"mapped",[1610,1582]],[[64600,64600],"mapped",[1610,1605]],[[64601,64601],"mapped",[1610,1609]],[[64602,64602],"mapped",[1610,1610]],[[64603,64603],"mapped",[1584,1648]],[[64604,64604],"mapped",[1585,1648]],[[64605,64605],"mapped",[1609,1648]],[[64606,64606],"disallowed_STD3_mapped",[32,1612,1617]],[[64607,64607],"disallowed_STD3_mapped",[32,1613,1617]],[[64608,64608],"disallowed_STD3_mapped",[32,1614,1617]],[[64609,64609],"disallowed_STD3_mapped",[32,1615,1617]],[[64610,64610],"disallowed_STD3_mapped",[32,1616,1617]],[[64611,64611],"disallowed_STD3_mapped",[32,1617,1648]],[[64612,64612],"mapped",[1574,1585]],[[64613,64613],"mapped",[1574,1586]],[[64614,64614],"mapped",[1574,1605]],[[64615,64615],"mapped",[1574,1606]],[[64616,64616],"mapped",[1574,1609]],[[64617,64617],"mapped",[1574,1610]],[[64618,64618],"mapped",[1576,1585]],[[64619,64619],"mapped",[1576,1586]],[[64620,64620],"mapped",[1576,1605]],[[64621,64621],"mapped",[1576,1606]],[[64622,64622],"mapped",[1576,1609]],[[64623,64623],"mapped",[1576,1610]],[[64624,64624],"mapped",[1578,1585]],[[64625,64625],"mapped",[1578,1586]],[[64626,64626],"mapped",[1578,1605]],[[64627,64627],"mapped",[1578,1606]],[[64628,64628],"mapped",[1578,1609]],[[64629,64629],"mapped",[1578,1610]],[[64630,64630],"mapped",[1579,1585]],[[64631,64631],"mapped",[1579,1586]],[[64632,64632],"mapped",[1579,1605]],[[64633,64633],"mapped",[1579,1606]],[[64634,64634],"mapped",[1579,1609]],[[64635,64635],"mapped",[1579,1610]],[[64636,64636],"mapped",[1601,1609]],[[64637,64637],"mapped",[1601,1610]],[[64638,64638],"mapped",[1602,1609]],[[64639,64639],"mapped",[1602,1610]],[[64640,64640],"mapped",[1603,1575]],[[64641,64641],"mapped",[1603,1604]],[[64642,64642],"mapped",[1603,1605]],[[64643,64643],"mapped",[1603,1609]],[[64644,64644],"mapped",[1603,1610]],[[64645,64645],"mapped",[1604,1605]],[[64646,64646],"mapped",[1604,1609]],[[64647,64647],"mapped",[1604,1610]],[[64648,64648],"mapped",[1605,1575]],[[64649,64649],"mapped",[1605,1605]],[[64650,64650],"mapped",[1606,1585]],[[64651,64651],"mapped",[1606,1586]],[[64652,64652],"mapped",[1606,1605]],[[64653,64653],"mapped",[1606,1606]],[[64654,64654],"mapped",[1606,1609]],[[64655,64655],"mapped",[1606,1610]],[[64656,64656],"mapped",[1609,1648]],[[64657,64657],"mapped",[1610,1585]],[[64658,64658],"mapped",[1610,1586]],[[64659,64659],"mapped",[1610,1605]],[[64660,64660],"mapped",[1610,1606]],[[64661,64661],"mapped",[1610,1609]],[[64662,64662],"mapped",[1610,1610]],[[64663,64663],"mapped",[1574,1580]],[[64664,64664],"mapped",[1574,1581]],[[64665,64665],"mapped",[1574,1582]],[[64666,64666],"mapped",[1574,1605]],[[64667,64667],"mapped",[1574,1607]],[[64668,64668],"mapped",[1576,1580]],[[64669,64669],"mapped",[1576,1581]],[[64670,64670],"mapped",[1576,1582]],[[64671,64671],"mapped",[1576,1605]],[[64672,64672],"mapped",[1576,1607]],[[64673,64673],"mapped",[1578,1580]],[[64674,64674],"mapped",[1578,1581]],[[64675,64675],"mapped",[1578,1582]],[[64676,64676],"mapped",[1578,1605]],[[64677,64677],"mapped",[1578,1607]],[[64678,64678],"mapped",[1579,1605]],[[64679,64679],"mapped",[1580,1581]],[[64680,64680],"mapped",[1580,1605]],[[64681,64681],"mapped",[1581,1580]],[[64682,64682],"mapped",[1581,1605]],[[64683,64683],"mapped",[1582,1580]],[[64684,64684],"mapped",[1582,1605]],[[64685,64685],"mapped",[1587,1580]],[[64686,64686],"mapped",[1587,1581]],[[64687,64687],"mapped",[1587,1582]],[[64688,64688],"mapped",[1587,1605]],[[64689,64689],"mapped",[1589,1581]],[[64690,64690],"mapped",[1589,1582]],[[64691,64691],"mapped",[1589,1605]],[[64692,64692],"mapped",[1590,1580]],[[64693,64693],"mapped",[1590,1581]],[[64694,64694],"mapped",[1590,1582]],[[64695,64695],"mapped",[1590,1605]],[[64696,64696],"mapped",[1591,1581]],[[64697,64697],"mapped",[1592,1605]],[[64698,64698],"mapped",[1593,1580]],[[64699,64699],"mapped",[1593,1605]],[[64700,64700],"mapped",[1594,1580]],[[64701,64701],"mapped",[1594,1605]],[[64702,64702],"mapped",[1601,1580]],[[64703,64703],"mapped",[1601,1581]],[[64704,64704],"mapped",[1601,1582]],[[64705,64705],"mapped",[1601,1605]],[[64706,64706],"mapped",[1602,1581]],[[64707,64707],"mapped",[1602,1605]],[[64708,64708],"mapped",[1603,1580]],[[64709,64709],"mapped",[1603,1581]],[[64710,64710],"mapped",[1603,1582]],[[64711,64711],"mapped",[1603,1604]],[[64712,64712],"mapped",[1603,1605]],[[64713,64713],"mapped",[1604,1580]],[[64714,64714],"mapped",[1604,1581]],[[64715,64715],"mapped",[1604,1582]],[[64716,64716],"mapped",[1604,1605]],[[64717,64717],"mapped",[1604,1607]],[[64718,64718],"mapped",[1605,1580]],[[64719,64719],"mapped",[1605,1581]],[[64720,64720],"mapped",[1605,1582]],[[64721,64721],"mapped",[1605,1605]],[[64722,64722],"mapped",[1606,1580]],[[64723,64723],"mapped",[1606,1581]],[[64724,64724],"mapped",[1606,1582]],[[64725,64725],"mapped",[1606,1605]],[[64726,64726],"mapped",[1606,1607]],[[64727,64727],"mapped",[1607,1580]],[[64728,64728],"mapped",[1607,1605]],[[64729,64729],"mapped",[1607,1648]],[[64730,64730],"mapped",[1610,1580]],[[64731,64731],"mapped",[1610,1581]],[[64732,64732],"mapped",[1610,1582]],[[64733,64733],"mapped",[1610,1605]],[[64734,64734],"mapped",[1610,1607]],[[64735,64735],"mapped",[1574,1605]],[[64736,64736],"mapped",[1574,1607]],[[64737,64737],"mapped",[1576,1605]],[[64738,64738],"mapped",[1576,1607]],[[64739,64739],"mapped",[1578,1605]],[[64740,64740],"mapped",[1578,1607]],[[64741,64741],"mapped",[1579,1605]],[[64742,64742],"mapped",[1579,1607]],[[64743,64743],"mapped",[1587,1605]],[[64744,64744],"mapped",[1587,1607]],[[64745,64745],"mapped",[1588,1605]],[[64746,64746],"mapped",[1588,1607]],[[64747,64747],"mapped",[1603,1604]],[[64748,64748],"mapped",[1603,1605]],[[64749,64749],"mapped",[1604,1605]],[[64750,64750],"mapped",[1606,1605]],[[64751,64751],"mapped",[1606,1607]],[[64752,64752],"mapped",[1610,1605]],[[64753,64753],"mapped",[1610,1607]],[[64754,64754],"mapped",[1600,1614,1617]],[[64755,64755],"mapped",[1600,1615,1617]],[[64756,64756],"mapped",[1600,1616,1617]],[[64757,64757],"mapped",[1591,1609]],[[64758,64758],"mapped",[1591,1610]],[[64759,64759],"mapped",[1593,1609]],[[64760,64760],"mapped",[1593,1610]],[[64761,64761],"mapped",[1594,1609]],[[64762,64762],"mapped",[1594,1610]],[[64763,64763],"mapped",[1587,1609]],[[64764,64764],"mapped",[1587,1610]],[[64765,64765],"mapped",[1588,1609]],[[64766,64766],"mapped",[1588,1610]],[[64767,64767],"mapped",[1581,1609]],[[64768,64768],"mapped",[1581,1610]],[[64769,64769],"mapped",[1580,1609]],[[64770,64770],"mapped",[1580,1610]],[[64771,64771],"mapped",[1582,1609]],[[64772,64772],"mapped",[1582,1610]],[[64773,64773],"mapped",[1589,1609]],[[64774,64774],"mapped",[1589,1610]],[[64775,64775],"mapped",[1590,1609]],[[64776,64776],"mapped",[1590,1610]],[[64777,64777],"mapped",[1588,1580]],[[64778,64778],"mapped",[1588,1581]],[[64779,64779],"mapped",[1588,1582]],[[64780,64780],"mapped",[1588,1605]],[[64781,64781],"mapped",[1588,1585]],[[64782,64782],"mapped",[1587,1585]],[[64783,64783],"mapped",[1589,1585]],[[64784,64784],"mapped",[1590,1585]],[[64785,64785],"mapped",[1591,1609]],[[64786,64786],"mapped",[1591,1610]],[[64787,64787],"mapped",[1593,1609]],[[64788,64788],"mapped",[1593,1610]],[[64789,64789],"mapped",[1594,1609]],[[64790,64790],"mapped",[1594,1610]],[[64791,64791],"mapped",[1587,1609]],[[64792,64792],"mapped",[1587,1610]],[[64793,64793],"mapped",[1588,1609]],[[64794,64794],"mapped",[1588,1610]],[[64795,64795],"mapped",[1581,1609]],[[64796,64796],"mapped",[1581,1610]],[[64797,64797],"mapped",[1580,1609]],[[64798,64798],"mapped",[1580,1610]],[[64799,64799],"mapped",[1582,1609]],[[64800,64800],"mapped",[1582,1610]],[[64801,64801],"mapped",[1589,1609]],[[64802,64802],"mapped",[1589,1610]],[[64803,64803],"mapped",[1590,1609]],[[64804,64804],"mapped",[1590,1610]],[[64805,64805],"mapped",[1588,1580]],[[64806,64806],"mapped",[1588,1581]],[[64807,64807],"mapped",[1588,1582]],[[64808,64808],"mapped",[1588,1605]],[[64809,64809],"mapped",[1588,1585]],[[64810,64810],"mapped",[1587,1585]],[[64811,64811],"mapped",[1589,1585]],[[64812,64812],"mapped",[1590,1585]],[[64813,64813],"mapped",[1588,1580]],[[64814,64814],"mapped",[1588,1581]],[[64815,64815],"mapped",[1588,1582]],[[64816,64816],"mapped",[1588,1605]],[[64817,64817],"mapped",[1587,1607]],[[64818,64818],"mapped",[1588,1607]],[[64819,64819],"mapped",[1591,1605]],[[64820,64820],"mapped",[1587,1580]],[[64821,64821],"mapped",[1587,1581]],[[64822,64822],"mapped",[1587,1582]],[[64823,64823],"mapped",[1588,1580]],[[64824,64824],"mapped",[1588,1581]],[[64825,64825],"mapped",[1588,1582]],[[64826,64826],"mapped",[1591,1605]],[[64827,64827],"mapped",[1592,1605]],[[64828,64829],"mapped",[1575,1611]],[[64830,64831],"valid",[],"NV8"],[[64832,64847],"disallowed"],[[64848,64848],"mapped",[1578,1580,1605]],[[64849,64850],"mapped",[1578,1581,1580]],[[64851,64851],"mapped",[1578,1581,1605]],[[64852,64852],"mapped",[1578,1582,1605]],[[64853,64853],"mapped",[1578,1605,1580]],[[64854,64854],"mapped",[1578,1605,1581]],[[64855,64855],"mapped",[1578,1605,1582]],[[64856,64857],"mapped",[1580,1605,1581]],[[64858,64858],"mapped",[1581,1605,1610]],[[64859,64859],"mapped",[1581,1605,1609]],[[64860,64860],"mapped",[1587,1581,1580]],[[64861,64861],"mapped",[1587,1580,1581]],[[64862,64862],"mapped",[1587,1580,1609]],[[64863,64864],"mapped",[1587,1605,1581]],[[64865,64865],"mapped",[1587,1605,1580]],[[64866,64867],"mapped",[1587,1605,1605]],[[64868,64869],"mapped",[1589,1581,1581]],[[64870,64870],"mapped",[1589,1605,1605]],[[64871,64872],"mapped",[1588,1581,1605]],[[64873,64873],"mapped",[1588,1580,1610]],[[64874,64875],"mapped",[1588,1605,1582]],[[64876,64877],"mapped",[1588,1605,1605]],[[64878,64878],"mapped",[1590,1581,1609]],[[64879,64880],"mapped",[1590,1582,1605]],[[64881,64882],"mapped",[1591,1605,1581]],[[64883,64883],"mapped",[1591,1605,1605]],[[64884,64884],"mapped",[1591,1605,1610]],[[64885,64885],"mapped",[1593,1580,1605]],[[64886,64887],"mapped",[1593,1605,1605]],[[64888,64888],"mapped",[1593,1605,1609]],[[64889,64889],"mapped",[1594,1605,1605]],[[64890,64890],"mapped",[1594,1605,1610]],[[64891,64891],"mapped",[1594,1605,1609]],[[64892,64893],"mapped",[1601,1582,1605]],[[64894,64894],"mapped",[1602,1605,1581]],[[64895,64895],"mapped",[1602,1605,1605]],[[64896,64896],"mapped",[1604,1581,1605]],[[64897,64897],"mapped",[1604,1581,1610]],[[64898,64898],"mapped",[1604,1581,1609]],[[64899,64900],"mapped",[1604,1580,1580]],[[64901,64902],"mapped",[1604,1582,1605]],[[64903,64904],"mapped",[1604,1605,1581]],[[64905,64905],"mapped",[1605,1581,1580]],[[64906,64906],"mapped",[1605,1581,1605]],[[64907,64907],"mapped",[1605,1581,1610]],[[64908,64908],"mapped",[1605,1580,1581]],[[64909,64909],"mapped",[1605,1580,1605]],[[64910,64910],"mapped",[1605,1582,1580]],[[64911,64911],"mapped",[1605,1582,1605]],[[64912,64913],"disallowed"],[[64914,64914],"mapped",[1605,1580,1582]],[[64915,64915],"mapped",[1607,1605,1580]],[[64916,64916],"mapped",[1607,1605,1605]],[[64917,64917],"mapped",[1606,1581,1605]],[[64918,64918],"mapped",[1606,1581,1609]],[[64919,64920],"mapped",[1606,1580,1605]],[[64921,64921],"mapped",[1606,1580,1609]],[[64922,64922],"mapped",[1606,1605,1610]],[[64923,64923],"mapped",[1606,1605,1609]],[[64924,64925],"mapped",[1610,1605,1605]],[[64926,64926],"mapped",[1576,1582,1610]],[[64927,64927],"mapped",[1578,1580,1610]],[[64928,64928],"mapped",[1578,1580,1609]],[[64929,64929],"mapped",[1578,1582,1610]],[[64930,64930],"mapped",[1578,1582,1609]],[[64931,64931],"mapped",[1578,1605,1610]],[[64932,64932],"mapped",[1578,1605,1609]],[[64933,64933],"mapped",[1580,1605,1610]],[[64934,64934],"mapped",[1580,1581,1609]],[[64935,64935],"mapped",[1580,1605,1609]],[[64936,64936],"mapped",[1587,1582,1609]],[[64937,64937],"mapped",[1589,1581,1610]],[[64938,64938],"mapped",[1588,1581,1610]],[[64939,64939],"mapped",[1590,1581,1610]],[[64940,64940],"mapped",[1604,1580,1610]],[[64941,64941],"mapped",[1604,1605,1610]],[[64942,64942],"mapped",[1610,1581,1610]],[[64943,64943],"mapped",[1610,1580,1610]],[[64944,64944],"mapped",[1610,1605,1610]],[[64945,64945],"mapped",[1605,1605,1610]],[[64946,64946],"mapped",[1602,1605,1610]],[[64947,64947],"mapped",[1606,1581,1610]],[[64948,64948],"mapped",[1602,1605,1581]],[[64949,64949],"mapped",[1604,1581,1605]],[[64950,64950],"mapped",[1593,1605,1610]],[[64951,64951],"mapped",[1603,1605,1610]],[[64952,64952],"mapped",[1606,1580,1581]],[[64953,64953],"mapped",[1605,1582,1610]],[[64954,64954],"mapped",[1604,1580,1605]],[[64955,64955],"mapped",[1603,1605,1605]],[[64956,64956],"mapped",[1604,1580,1605]],[[64957,64957],"mapped",[1606,1580,1581]],[[64958,64958],"mapped",[1580,1581,1610]],[[64959,64959],"mapped",[1581,1580,1610]],[[64960,64960],"mapped",[1605,1580,1610]],[[64961,64961],"mapped",[1601,1605,1610]],[[64962,64962],"mapped",[1576,1581,1610]],[[64963,64963],"mapped",[1603,1605,1605]],[[64964,64964],"mapped",[1593,1580,1605]],[[64965,64965],"mapped",[1589,1605,1605]],[[64966,64966],"mapped",[1587,1582,1610]],[[64967,64967],"mapped",[1606,1580,1610]],[[64968,64975],"disallowed"],[[64976,65007],"disallowed"],[[65008,65008],"mapped",[1589,1604,1746]],[[65009,65009],"mapped",[1602,1604,1746]],[[65010,65010],"mapped",[1575,1604,1604,1607]],[[65011,65011],"mapped",[1575,1603,1576,1585]],[[65012,65012],"mapped",[1605,1581,1605,1583]],[[65013,65013],"mapped",[1589,1604,1593,1605]],[[65014,65014],"mapped",[1585,1587,1608,1604]],[[65015,65015],"mapped",[1593,1604,1610,1607]],[[65016,65016],"mapped",[1608,1587,1604,1605]],[[65017,65017],"mapped",[1589,1604,1609]],[[65018,65018],"disallowed_STD3_mapped",[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605]],[[65019,65019],"disallowed_STD3_mapped",[1580,1604,32,1580,1604,1575,1604,1607]],[[65020,65020],"mapped",[1585,1740,1575,1604]],[[65021,65021],"valid",[],"NV8"],[[65022,65023],"disallowed"],[[65024,65039],"ignored"],[[65040,65040],"disallowed_STD3_mapped",[44]],[[65041,65041],"mapped",[12289]],[[65042,65042],"disallowed"],[[65043,65043],"disallowed_STD3_mapped",[58]],[[65044,65044],"disallowed_STD3_mapped",[59]],[[65045,65045],"disallowed_STD3_mapped",[33]],[[65046,65046],"disallowed_STD3_mapped",[63]],[[65047,65047],"mapped",[12310]],[[65048,65048],"mapped",[12311]],[[65049,65049],"disallowed"],[[65050,65055],"disallowed"],[[65056,65059],"valid"],[[65060,65062],"valid"],[[65063,65069],"valid"],[[65070,65071],"valid"],[[65072,65072],"disallowed"],[[65073,65073],"mapped",[8212]],[[65074,65074],"mapped",[8211]],[[65075,65076],"disallowed_STD3_mapped",[95]],[[65077,65077],"disallowed_STD3_mapped",[40]],[[65078,65078],"disallowed_STD3_mapped",[41]],[[65079,65079],"disallowed_STD3_mapped",[123]],[[65080,65080],"disallowed_STD3_mapped",[125]],[[65081,65081],"mapped",[12308]],[[65082,65082],"mapped",[12309]],[[65083,65083],"mapped",[12304]],[[65084,65084],"mapped",[12305]],[[65085,65085],"mapped",[12298]],[[65086,65086],"mapped",[12299]],[[65087,65087],"mapped",[12296]],[[65088,65088],"mapped",[12297]],[[65089,65089],"mapped",[12300]],[[65090,65090],"mapped",[12301]],[[65091,65091],"mapped",[12302]],[[65092,65092],"mapped",[12303]],[[65093,65094],"valid",[],"NV8"],[[65095,65095],"disallowed_STD3_mapped",[91]],[[65096,65096],"disallowed_STD3_mapped",[93]],[[65097,65100],"disallowed_STD3_mapped",[32,773]],[[65101,65103],"disallowed_STD3_mapped",[95]],[[65104,65104],"disallowed_STD3_mapped",[44]],[[65105,65105],"mapped",[12289]],[[65106,65106],"disallowed"],[[65107,65107],"disallowed"],[[65108,65108],"disallowed_STD3_mapped",[59]],[[65109,65109],"disallowed_STD3_mapped",[58]],[[65110,65110],"disallowed_STD3_mapped",[63]],[[65111,65111],"disallowed_STD3_mapped",[33]],[[65112,65112],"mapped",[8212]],[[65113,65113],"disallowed_STD3_mapped",[40]],[[65114,65114],"disallowed_STD3_mapped",[41]],[[65115,65115],"disallowed_STD3_mapped",[123]],[[65116,65116],"disallowed_STD3_mapped",[125]],[[65117,65117],"mapped",[12308]],[[65118,65118],"mapped",[12309]],[[65119,65119],"disallowed_STD3_mapped",[35]],[[65120,65120],"disallowed_STD3_mapped",[38]],[[65121,65121],"disallowed_STD3_mapped",[42]],[[65122,65122],"disallowed_STD3_mapped",[43]],[[65123,65123],"mapped",[45]],[[65124,65124],"disallowed_STD3_mapped",[60]],[[65125,65125],"disallowed_STD3_mapped",[62]],[[65126,65126],"disallowed_STD3_mapped",[61]],[[65127,65127],"disallowed"],[[65128,65128],"disallowed_STD3_mapped",[92]],[[65129,65129],"disallowed_STD3_mapped",[36]],[[65130,65130],"disallowed_STD3_mapped",[37]],[[65131,65131],"disallowed_STD3_mapped",[64]],[[65132,65135],"disallowed"],[[65136,65136],"disallowed_STD3_mapped",[32,1611]],[[65137,65137],"mapped",[1600,1611]],[[65138,65138],"disallowed_STD3_mapped",[32,1612]],[[65139,65139],"valid"],[[65140,65140],"disallowed_STD3_mapped",[32,1613]],[[65141,65141],"disallowed"],[[65142,65142],"disallowed_STD3_mapped",[32,1614]],[[65143,65143],"mapped",[1600,1614]],[[65144,65144],"disallowed_STD3_mapped",[32,1615]],[[65145,65145],"mapped",[1600,1615]],[[65146,65146],"disallowed_STD3_mapped",[32,1616]],[[65147,65147],"mapped",[1600,1616]],[[65148,65148],"disallowed_STD3_mapped",[32,1617]],[[65149,65149],"mapped",[1600,1617]],[[65150,65150],"disallowed_STD3_mapped",[32,1618]],[[65151,65151],"mapped",[1600,1618]],[[65152,65152],"mapped",[1569]],[[65153,65154],"mapped",[1570]],[[65155,65156],"mapped",[1571]],[[65157,65158],"mapped",[1572]],[[65159,65160],"mapped",[1573]],[[65161,65164],"mapped",[1574]],[[65165,65166],"mapped",[1575]],[[65167,65170],"mapped",[1576]],[[65171,65172],"mapped",[1577]],[[65173,65176],"mapped",[1578]],[[65177,65180],"mapped",[1579]],[[65181,65184],"mapped",[1580]],[[65185,65188],"mapped",[1581]],[[65189,65192],"mapped",[1582]],[[65193,65194],"mapped",[1583]],[[65195,65196],"mapped",[1584]],[[65197,65198],"mapped",[1585]],[[65199,65200],"mapped",[1586]],[[65201,65204],"mapped",[1587]],[[65205,65208],"mapped",[1588]],[[65209,65212],"mapped",[1589]],[[65213,65216],"mapped",[1590]],[[65217,65220],"mapped",[1591]],[[65221,65224],"mapped",[1592]],[[65225,65228],"mapped",[1593]],[[65229,65232],"mapped",[1594]],[[65233,65236],"mapped",[1601]],[[65237,65240],"mapped",[1602]],[[65241,65244],"mapped",[1603]],[[65245,65248],"mapped",[1604]],[[65249,65252],"mapped",[1605]],[[65253,65256],"mapped",[1606]],[[65257,65260],"mapped",[1607]],[[65261,65262],"mapped",[1608]],[[65263,65264],"mapped",[1609]],[[65265,65268],"mapped",[1610]],[[65269,65270],"mapped",[1604,1570]],[[65271,65272],"mapped",[1604,1571]],[[65273,65274],"mapped",[1604,1573]],[[65275,65276],"mapped",[1604,1575]],[[65277,65278],"disallowed"],[[65279,65279],"ignored"],[[65280,65280],"disallowed"],[[65281,65281],"disallowed_STD3_mapped",[33]],[[65282,65282],"disallowed_STD3_mapped",[34]],[[65283,65283],"disallowed_STD3_mapped",[35]],[[65284,65284],"disallowed_STD3_mapped",[36]],[[65285,65285],"disallowed_STD3_mapped",[37]],[[65286,65286],"disallowed_STD3_mapped",[38]],[[65287,65287],"disallowed_STD3_mapped",[39]],[[65288,65288],"disallowed_STD3_mapped",[40]],[[65289,65289],"disallowed_STD3_mapped",[41]],[[65290,65290],"disallowed_STD3_mapped",[42]],[[65291,65291],"disallowed_STD3_mapped",[43]],[[65292,65292],"disallowed_STD3_mapped",[44]],[[65293,65293],"mapped",[45]],[[65294,65294],"mapped",[46]],[[65295,65295],"disallowed_STD3_mapped",[47]],[[65296,65296],"mapped",[48]],[[65297,65297],"mapped",[49]],[[65298,65298],"mapped",[50]],[[65299,65299],"mapped",[51]],[[65300,65300],"mapped",[52]],[[65301,65301],"mapped",[53]],[[65302,65302],"mapped",[54]],[[65303,65303],"mapped",[55]],[[65304,65304],"mapped",[56]],[[65305,65305],"mapped",[57]],[[65306,65306],"disallowed_STD3_mapped",[58]],[[65307,65307],"disallowed_STD3_mapped",[59]],[[65308,65308],"disallowed_STD3_mapped",[60]],[[65309,65309],"disallowed_STD3_mapped",[61]],[[65310,65310],"disallowed_STD3_mapped",[62]],[[65311,65311],"disallowed_STD3_mapped",[63]],[[65312,65312],"disallowed_STD3_mapped",[64]],[[65313,65313],"mapped",[97]],[[65314,65314],"mapped",[98]],[[65315,65315],"mapped",[99]],[[65316,65316],"mapped",[100]],[[65317,65317],"mapped",[101]],[[65318,65318],"mapped",[102]],[[65319,65319],"mapped",[103]],[[65320,65320],"mapped",[104]],[[65321,65321],"mapped",[105]],[[65322,65322],"mapped",[106]],[[65323,65323],"mapped",[107]],[[65324,65324],"mapped",[108]],[[65325,65325],"mapped",[109]],[[65326,65326],"mapped",[110]],[[65327,65327],"mapped",[111]],[[65328,65328],"mapped",[112]],[[65329,65329],"mapped",[113]],[[65330,65330],"mapped",[114]],[[65331,65331],"mapped",[115]],[[65332,65332],"mapped",[116]],[[65333,65333],"mapped",[117]],[[65334,65334],"mapped",[118]],[[65335,65335],"mapped",[119]],[[65336,65336],"mapped",[120]],[[65337,65337],"mapped",[121]],[[65338,65338],"mapped",[122]],[[65339,65339],"disallowed_STD3_mapped",[91]],[[65340,65340],"disallowed_STD3_mapped",[92]],[[65341,65341],"disallowed_STD3_mapped",[93]],[[65342,65342],"disallowed_STD3_mapped",[94]],[[65343,65343],"disallowed_STD3_mapped",[95]],[[65344,65344],"disallowed_STD3_mapped",[96]],[[65345,65345],"mapped",[97]],[[65346,65346],"mapped",[98]],[[65347,65347],"mapped",[99]],[[65348,65348],"mapped",[100]],[[65349,65349],"mapped",[101]],[[65350,65350],"mapped",[102]],[[65351,65351],"mapped",[103]],[[65352,65352],"mapped",[104]],[[65353,65353],"mapped",[105]],[[65354,65354],"mapped",[106]],[[65355,65355],"mapped",[107]],[[65356,65356],"mapped",[108]],[[65357,65357],"mapped",[109]],[[65358,65358],"mapped",[110]],[[65359,65359],"mapped",[111]],[[65360,65360],"mapped",[112]],[[65361,65361],"mapped",[113]],[[65362,65362],"mapped",[114]],[[65363,65363],"mapped",[115]],[[65364,65364],"mapped",[116]],[[65365,65365],"mapped",[117]],[[65366,65366],"mapped",[118]],[[65367,65367],"mapped",[119]],[[65368,65368],"mapped",[120]],[[65369,65369],"mapped",[121]],[[65370,65370],"mapped",[122]],[[65371,65371],"disallowed_STD3_mapped",[123]],[[65372,65372],"disallowed_STD3_mapped",[124]],[[65373,65373],"disallowed_STD3_mapped",[125]],[[65374,65374],"disallowed_STD3_mapped",[126]],[[65375,65375],"mapped",[10629]],[[65376,65376],"mapped",[10630]],[[65377,65377],"mapped",[46]],[[65378,65378],"mapped",[12300]],[[65379,65379],"mapped",[12301]],[[65380,65380],"mapped",[12289]],[[65381,65381],"mapped",[12539]],[[65382,65382],"mapped",[12530]],[[65383,65383],"mapped",[12449]],[[65384,65384],"mapped",[12451]],[[65385,65385],"mapped",[12453]],[[65386,65386],"mapped",[12455]],[[65387,65387],"mapped",[12457]],[[65388,65388],"mapped",[12515]],[[65389,65389],"mapped",[12517]],[[65390,65390],"mapped",[12519]],[[65391,65391],"mapped",[12483]],[[65392,65392],"mapped",[12540]],[[65393,65393],"mapped",[12450]],[[65394,65394],"mapped",[12452]],[[65395,65395],"mapped",[12454]],[[65396,65396],"mapped",[12456]],[[65397,65397],"mapped",[12458]],[[65398,65398],"mapped",[12459]],[[65399,65399],"mapped",[12461]],[[65400,65400],"mapped",[12463]],[[65401,65401],"mapped",[12465]],[[65402,65402],"mapped",[12467]],[[65403,65403],"mapped",[12469]],[[65404,65404],"mapped",[12471]],[[65405,65405],"mapped",[12473]],[[65406,65406],"mapped",[12475]],[[65407,65407],"mapped",[12477]],[[65408,65408],"mapped",[12479]],[[65409,65409],"mapped",[12481]],[[65410,65410],"mapped",[12484]],[[65411,65411],"mapped",[12486]],[[65412,65412],"mapped",[12488]],[[65413,65413],"mapped",[12490]],[[65414,65414],"mapped",[12491]],[[65415,65415],"mapped",[12492]],[[65416,65416],"mapped",[12493]],[[65417,65417],"mapped",[12494]],[[65418,65418],"mapped",[12495]],[[65419,65419],"mapped",[12498]],[[65420,65420],"mapped",[12501]],[[65421,65421],"mapped",[12504]],[[65422,65422],"mapped",[12507]],[[65423,65423],"mapped",[12510]],[[65424,65424],"mapped",[12511]],[[65425,65425],"mapped",[12512]],[[65426,65426],"mapped",[12513]],[[65427,65427],"mapped",[12514]],[[65428,65428],"mapped",[12516]],[[65429,65429],"mapped",[12518]],[[65430,65430],"mapped",[12520]],[[65431,65431],"mapped",[12521]],[[65432,65432],"mapped",[12522]],[[65433,65433],"mapped",[12523]],[[65434,65434],"mapped",[12524]],[[65435,65435],"mapped",[12525]],[[65436,65436],"mapped",[12527]],[[65437,65437],"mapped",[12531]],[[65438,65438],"mapped",[12441]],[[65439,65439],"mapped",[12442]],[[65440,65440],"disallowed"],[[65441,65441],"mapped",[4352]],[[65442,65442],"mapped",[4353]],[[65443,65443],"mapped",[4522]],[[65444,65444],"mapped",[4354]],[[65445,65445],"mapped",[4524]],[[65446,65446],"mapped",[4525]],[[65447,65447],"mapped",[4355]],[[65448,65448],"mapped",[4356]],[[65449,65449],"mapped",[4357]],[[65450,65450],"mapped",[4528]],[[65451,65451],"mapped",[4529]],[[65452,65452],"mapped",[4530]],[[65453,65453],"mapped",[4531]],[[65454,65454],"mapped",[4532]],[[65455,65455],"mapped",[4533]],[[65456,65456],"mapped",[4378]],[[65457,65457],"mapped",[4358]],[[65458,65458],"mapped",[4359]],[[65459,65459],"mapped",[4360]],[[65460,65460],"mapped",[4385]],[[65461,65461],"mapped",[4361]],[[65462,65462],"mapped",[4362]],[[65463,65463],"mapped",[4363]],[[65464,65464],"mapped",[4364]],[[65465,65465],"mapped",[4365]],[[65466,65466],"mapped",[4366]],[[65467,65467],"mapped",[4367]],[[65468,65468],"mapped",[4368]],[[65469,65469],"mapped",[4369]],[[65470,65470],"mapped",[4370]],[[65471,65473],"disallowed"],[[65474,65474],"mapped",[4449]],[[65475,65475],"mapped",[4450]],[[65476,65476],"mapped",[4451]],[[65477,65477],"mapped",[4452]],[[65478,65478],"mapped",[4453]],[[65479,65479],"mapped",[4454]],[[65480,65481],"disallowed"],[[65482,65482],"mapped",[4455]],[[65483,65483],"mapped",[4456]],[[65484,65484],"mapped",[4457]],[[65485,65485],"mapped",[4458]],[[65486,65486],"mapped",[4459]],[[65487,65487],"mapped",[4460]],[[65488,65489],"disallowed"],[[65490,65490],"mapped",[4461]],[[65491,65491],"mapped",[4462]],[[65492,65492],"mapped",[4463]],[[65493,65493],"mapped",[4464]],[[65494,65494],"mapped",[4465]],[[65495,65495],"mapped",[4466]],[[65496,65497],"disallowed"],[[65498,65498],"mapped",[4467]],[[65499,65499],"mapped",[4468]],[[65500,65500],"mapped",[4469]],[[65501,65503],"disallowed"],[[65504,65504],"mapped",[162]],[[65505,65505],"mapped",[163]],[[65506,65506],"mapped",[172]],[[65507,65507],"disallowed_STD3_mapped",[32,772]],[[65508,65508],"mapped",[166]],[[65509,65509],"mapped",[165]],[[65510,65510],"mapped",[8361]],[[65511,65511],"disallowed"],[[65512,65512],"mapped",[9474]],[[65513,65513],"mapped",[8592]],[[65514,65514],"mapped",[8593]],[[65515,65515],"mapped",[8594]],[[65516,65516],"mapped",[8595]],[[65517,65517],"mapped",[9632]],[[65518,65518],"mapped",[9675]],[[65519,65528],"disallowed"],[[65529,65531],"disallowed"],[[65532,65532],"disallowed"],[[65533,65533],"disallowed"],[[65534,65535],"disallowed"],[[65536,65547],"valid"],[[65548,65548],"disallowed"],[[65549,65574],"valid"],[[65575,65575],"disallowed"],[[65576,65594],"valid"],[[65595,65595],"disallowed"],[[65596,65597],"valid"],[[65598,65598],"disallowed"],[[65599,65613],"valid"],[[65614,65615],"disallowed"],[[65616,65629],"valid"],[[65630,65663],"disallowed"],[[65664,65786],"valid"],[[65787,65791],"disallowed"],[[65792,65794],"valid",[],"NV8"],[[65795,65798],"disallowed"],[[65799,65843],"valid",[],"NV8"],[[65844,65846],"disallowed"],[[65847,65855],"valid",[],"NV8"],[[65856,65930],"valid",[],"NV8"],[[65931,65932],"valid",[],"NV8"],[[65933,65935],"disallowed"],[[65936,65947],"valid",[],"NV8"],[[65948,65951],"disallowed"],[[65952,65952],"valid",[],"NV8"],[[65953,65999],"disallowed"],[[66000,66044],"valid",[],"NV8"],[[66045,66045],"valid"],[[66046,66175],"disallowed"],[[66176,66204],"valid"],[[66205,66207],"disallowed"],[[66208,66256],"valid"],[[66257,66271],"disallowed"],[[66272,66272],"valid"],[[66273,66299],"valid",[],"NV8"],[[66300,66303],"disallowed"],[[66304,66334],"valid"],[[66335,66335],"valid"],[[66336,66339],"valid",[],"NV8"],[[66340,66351],"disallowed"],[[66352,66368],"valid"],[[66369,66369],"valid",[],"NV8"],[[66370,66377],"valid"],[[66378,66378],"valid",[],"NV8"],[[66379,66383],"disallowed"],[[66384,66426],"valid"],[[66427,66431],"disallowed"],[[66432,66461],"valid"],[[66462,66462],"disallowed"],[[66463,66463],"valid",[],"NV8"],[[66464,66499],"valid"],[[66500,66503],"disallowed"],[[66504,66511],"valid"],[[66512,66517],"valid",[],"NV8"],[[66518,66559],"disallowed"],[[66560,66560],"mapped",[66600]],[[66561,66561],"mapped",[66601]],[[66562,66562],"mapped",[66602]],[[66563,66563],"mapped",[66603]],[[66564,66564],"mapped",[66604]],[[66565,66565],"mapped",[66605]],[[66566,66566],"mapped",[66606]],[[66567,66567],"mapped",[66607]],[[66568,66568],"mapped",[66608]],[[66569,66569],"mapped",[66609]],[[66570,66570],"mapped",[66610]],[[66571,66571],"mapped",[66611]],[[66572,66572],"mapped",[66612]],[[66573,66573],"mapped",[66613]],[[66574,66574],"mapped",[66614]],[[66575,66575],"mapped",[66615]],[[66576,66576],"mapped",[66616]],[[66577,66577],"mapped",[66617]],[[66578,66578],"mapped",[66618]],[[66579,66579],"mapped",[66619]],[[66580,66580],"mapped",[66620]],[[66581,66581],"mapped",[66621]],[[66582,66582],"mapped",[66622]],[[66583,66583],"mapped",[66623]],[[66584,66584],"mapped",[66624]],[[66585,66585],"mapped",[66625]],[[66586,66586],"mapped",[66626]],[[66587,66587],"mapped",[66627]],[[66588,66588],"mapped",[66628]],[[66589,66589],"mapped",[66629]],[[66590,66590],"mapped",[66630]],[[66591,66591],"mapped",[66631]],[[66592,66592],"mapped",[66632]],[[66593,66593],"mapped",[66633]],[[66594,66594],"mapped",[66634]],[[66595,66595],"mapped",[66635]],[[66596,66596],"mapped",[66636]],[[66597,66597],"mapped",[66637]],[[66598,66598],"mapped",[66638]],[[66599,66599],"mapped",[66639]],[[66600,66637],"valid"],[[66638,66717],"valid"],[[66718,66719],"disallowed"],[[66720,66729],"valid"],[[66730,66815],"disallowed"],[[66816,66855],"valid"],[[66856,66863],"disallowed"],[[66864,66915],"valid"],[[66916,66926],"disallowed"],[[66927,66927],"valid",[],"NV8"],[[66928,67071],"disallowed"],[[67072,67382],"valid"],[[67383,67391],"disallowed"],[[67392,67413],"valid"],[[67414,67423],"disallowed"],[[67424,67431],"valid"],[[67432,67583],"disallowed"],[[67584,67589],"valid"],[[67590,67591],"disallowed"],[[67592,67592],"valid"],[[67593,67593],"disallowed"],[[67594,67637],"valid"],[[67638,67638],"disallowed"],[[67639,67640],"valid"],[[67641,67643],"disallowed"],[[67644,67644],"valid"],[[67645,67646],"disallowed"],[[67647,67647],"valid"],[[67648,67669],"valid"],[[67670,67670],"disallowed"],[[67671,67679],"valid",[],"NV8"],[[67680,67702],"valid"],[[67703,67711],"valid",[],"NV8"],[[67712,67742],"valid"],[[67743,67750],"disallowed"],[[67751,67759],"valid",[],"NV8"],[[67760,67807],"disallowed"],[[67808,67826],"valid"],[[67827,67827],"disallowed"],[[67828,67829],"valid"],[[67830,67834],"disallowed"],[[67835,67839],"valid",[],"NV8"],[[67840,67861],"valid"],[[67862,67865],"valid",[],"NV8"],[[67866,67867],"valid",[],"NV8"],[[67868,67870],"disallowed"],[[67871,67871],"valid",[],"NV8"],[[67872,67897],"valid"],[[67898,67902],"disallowed"],[[67903,67903],"valid",[],"NV8"],[[67904,67967],"disallowed"],[[67968,68023],"valid"],[[68024,68027],"disallowed"],[[68028,68029],"valid",[],"NV8"],[[68030,68031],"valid"],[[68032,68047],"valid",[],"NV8"],[[68048,68049],"disallowed"],[[68050,68095],"valid",[],"NV8"],[[68096,68099],"valid"],[[68100,68100],"disallowed"],[[68101,68102],"valid"],[[68103,68107],"disallowed"],[[68108,68115],"valid"],[[68116,68116],"disallowed"],[[68117,68119],"valid"],[[68120,68120],"disallowed"],[[68121,68147],"valid"],[[68148,68151],"disallowed"],[[68152,68154],"valid"],[[68155,68158],"disallowed"],[[68159,68159],"valid"],[[68160,68167],"valid",[],"NV8"],[[68168,68175],"disallowed"],[[68176,68184],"valid",[],"NV8"],[[68185,68191],"disallowed"],[[68192,68220],"valid"],[[68221,68223],"valid",[],"NV8"],[[68224,68252],"valid"],[[68253,68255],"valid",[],"NV8"],[[68256,68287],"disallowed"],[[68288,68295],"valid"],[[68296,68296],"valid",[],"NV8"],[[68297,68326],"valid"],[[68327,68330],"disallowed"],[[68331,68342],"valid",[],"NV8"],[[68343,68351],"disallowed"],[[68352,68405],"valid"],[[68406,68408],"disallowed"],[[68409,68415],"valid",[],"NV8"],[[68416,68437],"valid"],[[68438,68439],"disallowed"],[[68440,68447],"valid",[],"NV8"],[[68448,68466],"valid"],[[68467,68471],"disallowed"],[[68472,68479],"valid",[],"NV8"],[[68480,68497],"valid"],[[68498,68504],"disallowed"],[[68505,68508],"valid",[],"NV8"],[[68509,68520],"disallowed"],[[68521,68527],"valid",[],"NV8"],[[68528,68607],"disallowed"],[[68608,68680],"valid"],[[68681,68735],"disallowed"],[[68736,68736],"mapped",[68800]],[[68737,68737],"mapped",[68801]],[[68738,68738],"mapped",[68802]],[[68739,68739],"mapped",[68803]],[[68740,68740],"mapped",[68804]],[[68741,68741],"mapped",[68805]],[[68742,68742],"mapped",[68806]],[[68743,68743],"mapped",[68807]],[[68744,68744],"mapped",[68808]],[[68745,68745],"mapped",[68809]],[[68746,68746],"mapped",[68810]],[[68747,68747],"mapped",[68811]],[[68748,68748],"mapped",[68812]],[[68749,68749],"mapped",[68813]],[[68750,68750],"mapped",[68814]],[[68751,68751],"mapped",[68815]],[[68752,68752],"mapped",[68816]],[[68753,68753],"mapped",[68817]],[[68754,68754],"mapped",[68818]],[[68755,68755],"mapped",[68819]],[[68756,68756],"mapped",[68820]],[[68757,68757],"mapped",[68821]],[[68758,68758],"mapped",[68822]],[[68759,68759],"mapped",[68823]],[[68760,68760],"mapped",[68824]],[[68761,68761],"mapped",[68825]],[[68762,68762],"mapped",[68826]],[[68763,68763],"mapped",[68827]],[[68764,68764],"mapped",[68828]],[[68765,68765],"mapped",[68829]],[[68766,68766],"mapped",[68830]],[[68767,68767],"mapped",[68831]],[[68768,68768],"mapped",[68832]],[[68769,68769],"mapped",[68833]],[[68770,68770],"mapped",[68834]],[[68771,68771],"mapped",[68835]],[[68772,68772],"mapped",[68836]],[[68773,68773],"mapped",[68837]],[[68774,68774],"mapped",[68838]],[[68775,68775],"mapped",[68839]],[[68776,68776],"mapped",[68840]],[[68777,68777],"mapped",[68841]],[[68778,68778],"mapped",[68842]],[[68779,68779],"mapped",[68843]],[[68780,68780],"mapped",[68844]],[[68781,68781],"mapped",[68845]],[[68782,68782],"mapped",[68846]],[[68783,68783],"mapped",[68847]],[[68784,68784],"mapped",[68848]],[[68785,68785],"mapped",[68849]],[[68786,68786],"mapped",[68850]],[[68787,68799],"disallowed"],[[68800,68850],"valid"],[[68851,68857],"disallowed"],[[68858,68863],"valid",[],"NV8"],[[68864,69215],"disallowed"],[[69216,69246],"valid",[],"NV8"],[[69247,69631],"disallowed"],[[69632,69702],"valid"],[[69703,69709],"valid",[],"NV8"],[[69710,69713],"disallowed"],[[69714,69733],"valid",[],"NV8"],[[69734,69743],"valid"],[[69744,69758],"disallowed"],[[69759,69759],"valid"],[[69760,69818],"valid"],[[69819,69820],"valid",[],"NV8"],[[69821,69821],"disallowed"],[[69822,69825],"valid",[],"NV8"],[[69826,69839],"disallowed"],[[69840,69864],"valid"],[[69865,69871],"disallowed"],[[69872,69881],"valid"],[[69882,69887],"disallowed"],[[69888,69940],"valid"],[[69941,69941],"disallowed"],[[69942,69951],"valid"],[[69952,69955],"valid",[],"NV8"],[[69956,69967],"disallowed"],[[69968,70003],"valid"],[[70004,70005],"valid",[],"NV8"],[[70006,70006],"valid"],[[70007,70015],"disallowed"],[[70016,70084],"valid"],[[70085,70088],"valid",[],"NV8"],[[70089,70089],"valid",[],"NV8"],[[70090,70092],"valid"],[[70093,70093],"valid",[],"NV8"],[[70094,70095],"disallowed"],[[70096,70105],"valid"],[[70106,70106],"valid"],[[70107,70107],"valid",[],"NV8"],[[70108,70108],"valid"],[[70109,70111],"valid",[],"NV8"],[[70112,70112],"disallowed"],[[70113,70132],"valid",[],"NV8"],[[70133,70143],"disallowed"],[[70144,70161],"valid"],[[70162,70162],"disallowed"],[[70163,70199],"valid"],[[70200,70205],"valid",[],"NV8"],[[70206,70271],"disallowed"],[[70272,70278],"valid"],[[70279,70279],"disallowed"],[[70280,70280],"valid"],[[70281,70281],"disallowed"],[[70282,70285],"valid"],[[70286,70286],"disallowed"],[[70287,70301],"valid"],[[70302,70302],"disallowed"],[[70303,70312],"valid"],[[70313,70313],"valid",[],"NV8"],[[70314,70319],"disallowed"],[[70320,70378],"valid"],[[70379,70383],"disallowed"],[[70384,70393],"valid"],[[70394,70399],"disallowed"],[[70400,70400],"valid"],[[70401,70403],"valid"],[[70404,70404],"disallowed"],[[70405,70412],"valid"],[[70413,70414],"disallowed"],[[70415,70416],"valid"],[[70417,70418],"disallowed"],[[70419,70440],"valid"],[[70441,70441],"disallowed"],[[70442,70448],"valid"],[[70449,70449],"disallowed"],[[70450,70451],"valid"],[[70452,70452],"disallowed"],[[70453,70457],"valid"],[[70458,70459],"disallowed"],[[70460,70468],"valid"],[[70469,70470],"disallowed"],[[70471,70472],"valid"],[[70473,70474],"disallowed"],[[70475,70477],"valid"],[[70478,70479],"disallowed"],[[70480,70480],"valid"],[[70481,70486],"disallowed"],[[70487,70487],"valid"],[[70488,70492],"disallowed"],[[70493,70499],"valid"],[[70500,70501],"disallowed"],[[70502,70508],"valid"],[[70509,70511],"disallowed"],[[70512,70516],"valid"],[[70517,70783],"disallowed"],[[70784,70853],"valid"],[[70854,70854],"valid",[],"NV8"],[[70855,70855],"valid"],[[70856,70863],"disallowed"],[[70864,70873],"valid"],[[70874,71039],"disallowed"],[[71040,71093],"valid"],[[71094,71095],"disallowed"],[[71096,71104],"valid"],[[71105,71113],"valid",[],"NV8"],[[71114,71127],"valid",[],"NV8"],[[71128,71133],"valid"],[[71134,71167],"disallowed"],[[71168,71232],"valid"],[[71233,71235],"valid",[],"NV8"],[[71236,71236],"valid"],[[71237,71247],"disallowed"],[[71248,71257],"valid"],[[71258,71295],"disallowed"],[[71296,71351],"valid"],[[71352,71359],"disallowed"],[[71360,71369],"valid"],[[71370,71423],"disallowed"],[[71424,71449],"valid"],[[71450,71452],"disallowed"],[[71453,71467],"valid"],[[71468,71471],"disallowed"],[[71472,71481],"valid"],[[71482,71487],"valid",[],"NV8"],[[71488,71839],"disallowed"],[[71840,71840],"mapped",[71872]],[[71841,71841],"mapped",[71873]],[[71842,71842],"mapped",[71874]],[[71843,71843],"mapped",[71875]],[[71844,71844],"mapped",[71876]],[[71845,71845],"mapped",[71877]],[[71846,71846],"mapped",[71878]],[[71847,71847],"mapped",[71879]],[[71848,71848],"mapped",[71880]],[[71849,71849],"mapped",[71881]],[[71850,71850],"mapped",[71882]],[[71851,71851],"mapped",[71883]],[[71852,71852],"mapped",[71884]],[[71853,71853],"mapped",[71885]],[[71854,71854],"mapped",[71886]],[[71855,71855],"mapped",[71887]],[[71856,71856],"mapped",[71888]],[[71857,71857],"mapped",[71889]],[[71858,71858],"mapped",[71890]],[[71859,71859],"mapped",[71891]],[[71860,71860],"mapped",[71892]],[[71861,71861],"mapped",[71893]],[[71862,71862],"mapped",[71894]],[[71863,71863],"mapped",[71895]],[[71864,71864],"mapped",[71896]],[[71865,71865],"mapped",[71897]],[[71866,71866],"mapped",[71898]],[[71867,71867],"mapped",[71899]],[[71868,71868],"mapped",[71900]],[[71869,71869],"mapped",[71901]],[[71870,71870],"mapped",[71902]],[[71871,71871],"mapped",[71903]],[[71872,71913],"valid"],[[71914,71922],"valid",[],"NV8"],[[71923,71934],"disallowed"],[[71935,71935],"valid"],[[71936,72383],"disallowed"],[[72384,72440],"valid"],[[72441,73727],"disallowed"],[[73728,74606],"valid"],[[74607,74648],"valid"],[[74649,74649],"valid"],[[74650,74751],"disallowed"],[[74752,74850],"valid",[],"NV8"],[[74851,74862],"valid",[],"NV8"],[[74863,74863],"disallowed"],[[74864,74867],"valid",[],"NV8"],[[74868,74868],"valid",[],"NV8"],[[74869,74879],"disallowed"],[[74880,75075],"valid"],[[75076,77823],"disallowed"],[[77824,78894],"valid"],[[78895,82943],"disallowed"],[[82944,83526],"valid"],[[83527,92159],"disallowed"],[[92160,92728],"valid"],[[92729,92735],"disallowed"],[[92736,92766],"valid"],[[92767,92767],"disallowed"],[[92768,92777],"valid"],[[92778,92781],"disallowed"],[[92782,92783],"valid",[],"NV8"],[[92784,92879],"disallowed"],[[92880,92909],"valid"],[[92910,92911],"disallowed"],[[92912,92916],"valid"],[[92917,92917],"valid",[],"NV8"],[[92918,92927],"disallowed"],[[92928,92982],"valid"],[[92983,92991],"valid",[],"NV8"],[[92992,92995],"valid"],[[92996,92997],"valid",[],"NV8"],[[92998,93007],"disallowed"],[[93008,93017],"valid"],[[93018,93018],"disallowed"],[[93019,93025],"valid",[],"NV8"],[[93026,93026],"disallowed"],[[93027,93047],"valid"],[[93048,93052],"disallowed"],[[93053,93071],"valid"],[[93072,93951],"disallowed"],[[93952,94020],"valid"],[[94021,94031],"disallowed"],[[94032,94078],"valid"],[[94079,94094],"disallowed"],[[94095,94111],"valid"],[[94112,110591],"disallowed"],[[110592,110593],"valid"],[[110594,113663],"disallowed"],[[113664,113770],"valid"],[[113771,113775],"disallowed"],[[113776,113788],"valid"],[[113789,113791],"disallowed"],[[113792,113800],"valid"],[[113801,113807],"disallowed"],[[113808,113817],"valid"],[[113818,113819],"disallowed"],[[113820,113820],"valid",[],"NV8"],[[113821,113822],"valid"],[[113823,113823],"valid",[],"NV8"],[[113824,113827],"ignored"],[[113828,118783],"disallowed"],[[118784,119029],"valid",[],"NV8"],[[119030,119039],"disallowed"],[[119040,119078],"valid",[],"NV8"],[[119079,119080],"disallowed"],[[119081,119081],"valid",[],"NV8"],[[119082,119133],"valid",[],"NV8"],[[119134,119134],"mapped",[119127,119141]],[[119135,119135],"mapped",[119128,119141]],[[119136,119136],"mapped",[119128,119141,119150]],[[119137,119137],"mapped",[119128,119141,119151]],[[119138,119138],"mapped",[119128,119141,119152]],[[119139,119139],"mapped",[119128,119141,119153]],[[119140,119140],"mapped",[119128,119141,119154]],[[119141,119154],"valid",[],"NV8"],[[119155,119162],"disallowed"],[[119163,119226],"valid",[],"NV8"],[[119227,119227],"mapped",[119225,119141]],[[119228,119228],"mapped",[119226,119141]],[[119229,119229],"mapped",[119225,119141,119150]],[[119230,119230],"mapped",[119226,119141,119150]],[[119231,119231],"mapped",[119225,119141,119151]],[[119232,119232],"mapped",[119226,119141,119151]],[[119233,119261],"valid",[],"NV8"],[[119262,119272],"valid",[],"NV8"],[[119273,119295],"disallowed"],[[119296,119365],"valid",[],"NV8"],[[119366,119551],"disallowed"],[[119552,119638],"valid",[],"NV8"],[[119639,119647],"disallowed"],[[119648,119665],"valid",[],"NV8"],[[119666,119807],"disallowed"],[[119808,119808],"mapped",[97]],[[119809,119809],"mapped",[98]],[[119810,119810],"mapped",[99]],[[119811,119811],"mapped",[100]],[[119812,119812],"mapped",[101]],[[119813,119813],"mapped",[102]],[[119814,119814],"mapped",[103]],[[119815,119815],"mapped",[104]],[[119816,119816],"mapped",[105]],[[119817,119817],"mapped",[106]],[[119818,119818],"mapped",[107]],[[119819,119819],"mapped",[108]],[[119820,119820],"mapped",[109]],[[119821,119821],"mapped",[110]],[[119822,119822],"mapped",[111]],[[119823,119823],"mapped",[112]],[[119824,119824],"mapped",[113]],[[119825,119825],"mapped",[114]],[[119826,119826],"mapped",[115]],[[119827,119827],"mapped",[116]],[[119828,119828],"mapped",[117]],[[119829,119829],"mapped",[118]],[[119830,119830],"mapped",[119]],[[119831,119831],"mapped",[120]],[[119832,119832],"mapped",[121]],[[119833,119833],"mapped",[122]],[[119834,119834],"mapped",[97]],[[119835,119835],"mapped",[98]],[[119836,119836],"mapped",[99]],[[119837,119837],"mapped",[100]],[[119838,119838],"mapped",[101]],[[119839,119839],"mapped",[102]],[[119840,119840],"mapped",[103]],[[119841,119841],"mapped",[104]],[[119842,119842],"mapped",[105]],[[119843,119843],"mapped",[106]],[[119844,119844],"mapped",[107]],[[119845,119845],"mapped",[108]],[[119846,119846],"mapped",[109]],[[119847,119847],"mapped",[110]],[[119848,119848],"mapped",[111]],[[119849,119849],"mapped",[112]],[[119850,119850],"mapped",[113]],[[119851,119851],"mapped",[114]],[[119852,119852],"mapped",[115]],[[119853,119853],"mapped",[116]],[[119854,119854],"mapped",[117]],[[119855,119855],"mapped",[118]],[[119856,119856],"mapped",[119]],[[119857,119857],"mapped",[120]],[[119858,119858],"mapped",[121]],[[119859,119859],"mapped",[122]],[[119860,119860],"mapped",[97]],[[119861,119861],"mapped",[98]],[[119862,119862],"mapped",[99]],[[119863,119863],"mapped",[100]],[[119864,119864],"mapped",[101]],[[119865,119865],"mapped",[102]],[[119866,119866],"mapped",[103]],[[119867,119867],"mapped",[104]],[[119868,119868],"mapped",[105]],[[119869,119869],"mapped",[106]],[[119870,119870],"mapped",[107]],[[119871,119871],"mapped",[108]],[[119872,119872],"mapped",[109]],[[119873,119873],"mapped",[110]],[[119874,119874],"mapped",[111]],[[119875,119875],"mapped",[112]],[[119876,119876],"mapped",[113]],[[119877,119877],"mapped",[114]],[[119878,119878],"mapped",[115]],[[119879,119879],"mapped",[116]],[[119880,119880],"mapped",[117]],[[119881,119881],"mapped",[118]],[[119882,119882],"mapped",[119]],[[119883,119883],"mapped",[120]],[[119884,119884],"mapped",[121]],[[119885,119885],"mapped",[122]],[[119886,119886],"mapped",[97]],[[119887,119887],"mapped",[98]],[[119888,119888],"mapped",[99]],[[119889,119889],"mapped",[100]],[[119890,119890],"mapped",[101]],[[119891,119891],"mapped",[102]],[[119892,119892],"mapped",[103]],[[119893,119893],"disallowed"],[[119894,119894],"mapped",[105]],[[119895,119895],"mapped",[106]],[[119896,119896],"mapped",[107]],[[119897,119897],"mapped",[108]],[[119898,119898],"mapped",[109]],[[119899,119899],"mapped",[110]],[[119900,119900],"mapped",[111]],[[119901,119901],"mapped",[112]],[[119902,119902],"mapped",[113]],[[119903,119903],"mapped",[114]],[[119904,119904],"mapped",[115]],[[119905,119905],"mapped",[116]],[[119906,119906],"mapped",[117]],[[119907,119907],"mapped",[118]],[[119908,119908],"mapped",[119]],[[119909,119909],"mapped",[120]],[[119910,119910],"mapped",[121]],[[119911,119911],"mapped",[122]],[[119912,119912],"mapped",[97]],[[119913,119913],"mapped",[98]],[[119914,119914],"mapped",[99]],[[119915,119915],"mapped",[100]],[[119916,119916],"mapped",[101]],[[119917,119917],"mapped",[102]],[[119918,119918],"mapped",[103]],[[119919,119919],"mapped",[104]],[[119920,119920],"mapped",[105]],[[119921,119921],"mapped",[106]],[[119922,119922],"mapped",[107]],[[119923,119923],"mapped",[108]],[[119924,119924],"mapped",[109]],[[119925,119925],"mapped",[110]],[[119926,119926],"mapped",[111]],[[119927,119927],"mapped",[112]],[[119928,119928],"mapped",[113]],[[119929,119929],"mapped",[114]],[[119930,119930],"mapped",[115]],[[119931,119931],"mapped",[116]],[[119932,119932],"mapped",[117]],[[119933,119933],"mapped",[118]],[[119934,119934],"mapped",[119]],[[119935,119935],"mapped",[120]],[[119936,119936],"mapped",[121]],[[119937,119937],"mapped",[122]],[[119938,119938],"mapped",[97]],[[119939,119939],"mapped",[98]],[[119940,119940],"mapped",[99]],[[119941,119941],"mapped",[100]],[[119942,119942],"mapped",[101]],[[119943,119943],"mapped",[102]],[[119944,119944],"mapped",[103]],[[119945,119945],"mapped",[104]],[[119946,119946],"mapped",[105]],[[119947,119947],"mapped",[106]],[[119948,119948],"mapped",[107]],[[119949,119949],"mapped",[108]],[[119950,119950],"mapped",[109]],[[119951,119951],"mapped",[110]],[[119952,119952],"mapped",[111]],[[119953,119953],"mapped",[112]],[[119954,119954],"mapped",[113]],[[119955,119955],"mapped",[114]],[[119956,119956],"mapped",[115]],[[119957,119957],"mapped",[116]],[[119958,119958],"mapped",[117]],[[119959,119959],"mapped",[118]],[[119960,119960],"mapped",[119]],[[119961,119961],"mapped",[120]],[[119962,119962],"mapped",[121]],[[119963,119963],"mapped",[122]],[[119964,119964],"mapped",[97]],[[119965,119965],"disallowed"],[[119966,119966],"mapped",[99]],[[119967,119967],"mapped",[100]],[[119968,119969],"disallowed"],[[119970,119970],"mapped",[103]],[[119971,119972],"disallowed"],[[119973,119973],"mapped",[106]],[[119974,119974],"mapped",[107]],[[119975,119976],"disallowed"],[[119977,119977],"mapped",[110]],[[119978,119978],"mapped",[111]],[[119979,119979],"mapped",[112]],[[119980,119980],"mapped",[113]],[[119981,119981],"disallowed"],[[119982,119982],"mapped",[115]],[[119983,119983],"mapped",[116]],[[119984,119984],"mapped",[117]],[[119985,119985],"mapped",[118]],[[119986,119986],"mapped",[119]],[[119987,119987],"mapped",[120]],[[119988,119988],"mapped",[121]],[[119989,119989],"mapped",[122]],[[119990,119990],"mapped",[97]],[[119991,119991],"mapped",[98]],[[119992,119992],"mapped",[99]],[[119993,119993],"mapped",[100]],[[119994,119994],"disallowed"],[[119995,119995],"mapped",[102]],[[119996,119996],"disallowed"],[[119997,119997],"mapped",[104]],[[119998,119998],"mapped",[105]],[[119999,119999],"mapped",[106]],[[120000,120000],"mapped",[107]],[[120001,120001],"mapped",[108]],[[120002,120002],"mapped",[109]],[[120003,120003],"mapped",[110]],[[120004,120004],"disallowed"],[[120005,120005],"mapped",[112]],[[120006,120006],"mapped",[113]],[[120007,120007],"mapped",[114]],[[120008,120008],"mapped",[115]],[[120009,120009],"mapped",[116]],[[120010,120010],"mapped",[117]],[[120011,120011],"mapped",[118]],[[120012,120012],"mapped",[119]],[[120013,120013],"mapped",[120]],[[120014,120014],"mapped",[121]],[[120015,120015],"mapped",[122]],[[120016,120016],"mapped",[97]],[[120017,120017],"mapped",[98]],[[120018,120018],"mapped",[99]],[[120019,120019],"mapped",[100]],[[120020,120020],"mapped",[101]],[[120021,120021],"mapped",[102]],[[120022,120022],"mapped",[103]],[[120023,120023],"mapped",[104]],[[120024,120024],"mapped",[105]],[[120025,120025],"mapped",[106]],[[120026,120026],"mapped",[107]],[[120027,120027],"mapped",[108]],[[120028,120028],"mapped",[109]],[[120029,120029],"mapped",[110]],[[120030,120030],"mapped",[111]],[[120031,120031],"mapped",[112]],[[120032,120032],"mapped",[113]],[[120033,120033],"mapped",[114]],[[120034,120034],"mapped",[115]],[[120035,120035],"mapped",[116]],[[120036,120036],"mapped",[117]],[[120037,120037],"mapped",[118]],[[120038,120038],"mapped",[119]],[[120039,120039],"mapped",[120]],[[120040,120040],"mapped",[121]],[[120041,120041],"mapped",[122]],[[120042,120042],"mapped",[97]],[[120043,120043],"mapped",[98]],[[120044,120044],"mapped",[99]],[[120045,120045],"mapped",[100]],[[120046,120046],"mapped",[101]],[[120047,120047],"mapped",[102]],[[120048,120048],"mapped",[103]],[[120049,120049],"mapped",[104]],[[120050,120050],"mapped",[105]],[[120051,120051],"mapped",[106]],[[120052,120052],"mapped",[107]],[[120053,120053],"mapped",[108]],[[120054,120054],"mapped",[109]],[[120055,120055],"mapped",[110]],[[120056,120056],"mapped",[111]],[[120057,120057],"mapped",[112]],[[120058,120058],"mapped",[113]],[[120059,120059],"mapped",[114]],[[120060,120060],"mapped",[115]],[[120061,120061],"mapped",[116]],[[120062,120062],"mapped",[117]],[[120063,120063],"mapped",[118]],[[120064,120064],"mapped",[119]],[[120065,120065],"mapped",[120]],[[120066,120066],"mapped",[121]],[[120067,120067],"mapped",[122]],[[120068,120068],"mapped",[97]],[[120069,120069],"mapped",[98]],[[120070,120070],"disallowed"],[[120071,120071],"mapped",[100]],[[120072,120072],"mapped",[101]],[[120073,120073],"mapped",[102]],[[120074,120074],"mapped",[103]],[[120075,120076],"disallowed"],[[120077,120077],"mapped",[106]],[[120078,120078],"mapped",[107]],[[120079,120079],"mapped",[108]],[[120080,120080],"mapped",[109]],[[120081,120081],"mapped",[110]],[[120082,120082],"mapped",[111]],[[120083,120083],"mapped",[112]],[[120084,120084],"mapped",[113]],[[120085,120085],"disallowed"],[[120086,120086],"mapped",[115]],[[120087,120087],"mapped",[116]],[[120088,120088],"mapped",[117]],[[120089,120089],"mapped",[118]],[[120090,120090],"mapped",[119]],[[120091,120091],"mapped",[120]],[[120092,120092],"mapped",[121]],[[120093,120093],"disallowed"],[[120094,120094],"mapped",[97]],[[120095,120095],"mapped",[98]],[[120096,120096],"mapped",[99]],[[120097,120097],"mapped",[100]],[[120098,120098],"mapped",[101]],[[120099,120099],"mapped",[102]],[[120100,120100],"mapped",[103]],[[120101,120101],"mapped",[104]],[[120102,120102],"mapped",[105]],[[120103,120103],"mapped",[106]],[[120104,120104],"mapped",[107]],[[120105,120105],"mapped",[108]],[[120106,120106],"mapped",[109]],[[120107,120107],"mapped",[110]],[[120108,120108],"mapped",[111]],[[120109,120109],"mapped",[112]],[[120110,120110],"mapped",[113]],[[120111,120111],"mapped",[114]],[[120112,120112],"mapped",[115]],[[120113,120113],"mapped",[116]],[[120114,120114],"mapped",[117]],[[120115,120115],"mapped",[118]],[[120116,120116],"mapped",[119]],[[120117,120117],"mapped",[120]],[[120118,120118],"mapped",[121]],[[120119,120119],"mapped",[122]],[[120120,120120],"mapped",[97]],[[120121,120121],"mapped",[98]],[[120122,120122],"disallowed"],[[120123,120123],"mapped",[100]],[[120124,120124],"mapped",[101]],[[120125,120125],"mapped",[102]],[[120126,120126],"mapped",[103]],[[120127,120127],"disallowed"],[[120128,120128],"mapped",[105]],[[120129,120129],"mapped",[106]],[[120130,120130],"mapped",[107]],[[120131,120131],"mapped",[108]],[[120132,120132],"mapped",[109]],[[120133,120133],"disallowed"],[[120134,120134],"mapped",[111]],[[120135,120137],"disallowed"],[[120138,120138],"mapped",[115]],[[120139,120139],"mapped",[116]],[[120140,120140],"mapped",[117]],[[120141,120141],"mapped",[118]],[[120142,120142],"mapped",[119]],[[120143,120143],"mapped",[120]],[[120144,120144],"mapped",[121]],[[120145,120145],"disallowed"],[[120146,120146],"mapped",[97]],[[120147,120147],"mapped",[98]],[[120148,120148],"mapped",[99]],[[120149,120149],"mapped",[100]],[[120150,120150],"mapped",[101]],[[120151,120151],"mapped",[102]],[[120152,120152],"mapped",[103]],[[120153,120153],"mapped",[104]],[[120154,120154],"mapped",[105]],[[120155,120155],"mapped",[106]],[[120156,120156],"mapped",[107]],[[120157,120157],"mapped",[108]],[[120158,120158],"mapped",[109]],[[120159,120159],"mapped",[110]],[[120160,120160],"mapped",[111]],[[120161,120161],"mapped",[112]],[[120162,120162],"mapped",[113]],[[120163,120163],"mapped",[114]],[[120164,120164],"mapped",[115]],[[120165,120165],"mapped",[116]],[[120166,120166],"mapped",[117]],[[120167,120167],"mapped",[118]],[[120168,120168],"mapped",[119]],[[120169,120169],"mapped",[120]],[[120170,120170],"mapped",[121]],[[120171,120171],"mapped",[122]],[[120172,120172],"mapped",[97]],[[120173,120173],"mapped",[98]],[[120174,120174],"mapped",[99]],[[120175,120175],"mapped",[100]],[[120176,120176],"mapped",[101]],[[120177,120177],"mapped",[102]],[[120178,120178],"mapped",[103]],[[120179,120179],"mapped",[104]],[[120180,120180],"mapped",[105]],[[120181,120181],"mapped",[106]],[[120182,120182],"mapped",[107]],[[120183,120183],"mapped",[108]],[[120184,120184],"mapped",[109]],[[120185,120185],"mapped",[110]],[[120186,120186],"mapped",[111]],[[120187,120187],"mapped",[112]],[[120188,120188],"mapped",[113]],[[120189,120189],"mapped",[114]],[[120190,120190],"mapped",[115]],[[120191,120191],"mapped",[116]],[[120192,120192],"mapped",[117]],[[120193,120193],"mapped",[118]],[[120194,120194],"mapped",[119]],[[120195,120195],"mapped",[120]],[[120196,120196],"mapped",[121]],[[120197,120197],"mapped",[122]],[[120198,120198],"mapped",[97]],[[120199,120199],"mapped",[98]],[[120200,120200],"mapped",[99]],[[120201,120201],"mapped",[100]],[[120202,120202],"mapped",[101]],[[120203,120203],"mapped",[102]],[[120204,120204],"mapped",[103]],[[120205,120205],"mapped",[104]],[[120206,120206],"mapped",[105]],[[120207,120207],"mapped",[106]],[[120208,120208],"mapped",[107]],[[120209,120209],"mapped",[108]],[[120210,120210],"mapped",[109]],[[120211,120211],"mapped",[110]],[[120212,120212],"mapped",[111]],[[120213,120213],"mapped",[112]],[[120214,120214],"mapped",[113]],[[120215,120215],"mapped",[114]],[[120216,120216],"mapped",[115]],[[120217,120217],"mapped",[116]],[[120218,120218],"mapped",[117]],[[120219,120219],"mapped",[118]],[[120220,120220],"mapped",[119]],[[120221,120221],"mapped",[120]],[[120222,120222],"mapped",[121]],[[120223,120223],"mapped",[122]],[[120224,120224],"mapped",[97]],[[120225,120225],"mapped",[98]],[[120226,120226],"mapped",[99]],[[120227,120227],"mapped",[100]],[[120228,120228],"mapped",[101]],[[120229,120229],"mapped",[102]],[[120230,120230],"mapped",[103]],[[120231,120231],"mapped",[104]],[[120232,120232],"mapped",[105]],[[120233,120233],"mapped",[106]],[[120234,120234],"mapped",[107]],[[120235,120235],"mapped",[108]],[[120236,120236],"mapped",[109]],[[120237,120237],"mapped",[110]],[[120238,120238],"mapped",[111]],[[120239,120239],"mapped",[112]],[[120240,120240],"mapped",[113]],[[120241,120241],"mapped",[114]],[[120242,120242],"mapped",[115]],[[120243,120243],"mapped",[116]],[[120244,120244],"mapped",[117]],[[120245,120245],"mapped",[118]],[[120246,120246],"mapped",[119]],[[120247,120247],"mapped",[120]],[[120248,120248],"mapped",[121]],[[120249,120249],"mapped",[122]],[[120250,120250],"mapped",[97]],[[120251,120251],"mapped",[98]],[[120252,120252],"mapped",[99]],[[120253,120253],"mapped",[100]],[[120254,120254],"mapped",[101]],[[120255,120255],"mapped",[102]],[[120256,120256],"mapped",[103]],[[120257,120257],"mapped",[104]],[[120258,120258],"mapped",[105]],[[120259,120259],"mapped",[106]],[[120260,120260],"mapped",[107]],[[120261,120261],"mapped",[108]],[[120262,120262],"mapped",[109]],[[120263,120263],"mapped",[110]],[[120264,120264],"mapped",[111]],[[120265,120265],"mapped",[112]],[[120266,120266],"mapped",[113]],[[120267,120267],"mapped",[114]],[[120268,120268],"mapped",[115]],[[120269,120269],"mapped",[116]],[[120270,120270],"mapped",[117]],[[120271,120271],"mapped",[118]],[[120272,120272],"mapped",[119]],[[120273,120273],"mapped",[120]],[[120274,120274],"mapped",[121]],[[120275,120275],"mapped",[122]],[[120276,120276],"mapped",[97]],[[120277,120277],"mapped",[98]],[[120278,120278],"mapped",[99]],[[120279,120279],"mapped",[100]],[[120280,120280],"mapped",[101]],[[120281,120281],"mapped",[102]],[[120282,120282],"mapped",[103]],[[120283,120283],"mapped",[104]],[[120284,120284],"mapped",[105]],[[120285,120285],"mapped",[106]],[[120286,120286],"mapped",[107]],[[120287,120287],"mapped",[108]],[[120288,120288],"mapped",[109]],[[120289,120289],"mapped",[110]],[[120290,120290],"mapped",[111]],[[120291,120291],"mapped",[112]],[[120292,120292],"mapped",[113]],[[120293,120293],"mapped",[114]],[[120294,120294],"mapped",[115]],[[120295,120295],"mapped",[116]],[[120296,120296],"mapped",[117]],[[120297,120297],"mapped",[118]],[[120298,120298],"mapped",[119]],[[120299,120299],"mapped",[120]],[[120300,120300],"mapped",[121]],[[120301,120301],"mapped",[122]],[[120302,120302],"mapped",[97]],[[120303,120303],"mapped",[98]],[[120304,120304],"mapped",[99]],[[120305,120305],"mapped",[100]],[[120306,120306],"mapped",[101]],[[120307,120307],"mapped",[102]],[[120308,120308],"mapped",[103]],[[120309,120309],"mapped",[104]],[[120310,120310],"mapped",[105]],[[120311,120311],"mapped",[106]],[[120312,120312],"mapped",[107]],[[120313,120313],"mapped",[108]],[[120314,120314],"mapped",[109]],[[120315,120315],"mapped",[110]],[[120316,120316],"mapped",[111]],[[120317,120317],"mapped",[112]],[[120318,120318],"mapped",[113]],[[120319,120319],"mapped",[114]],[[120320,120320],"mapped",[115]],[[120321,120321],"mapped",[116]],[[120322,120322],"mapped",[117]],[[120323,120323],"mapped",[118]],[[120324,120324],"mapped",[119]],[[120325,120325],"mapped",[120]],[[120326,120326],"mapped",[121]],[[120327,120327],"mapped",[122]],[[120328,120328],"mapped",[97]],[[120329,120329],"mapped",[98]],[[120330,120330],"mapped",[99]],[[120331,120331],"mapped",[100]],[[120332,120332],"mapped",[101]],[[120333,120333],"mapped",[102]],[[120334,120334],"mapped",[103]],[[120335,120335],"mapped",[104]],[[120336,120336],"mapped",[105]],[[120337,120337],"mapped",[106]],[[120338,120338],"mapped",[107]],[[120339,120339],"mapped",[108]],[[120340,120340],"mapped",[109]],[[120341,120341],"mapped",[110]],[[120342,120342],"mapped",[111]],[[120343,120343],"mapped",[112]],[[120344,120344],"mapped",[113]],[[120345,120345],"mapped",[114]],[[120346,120346],"mapped",[115]],[[120347,120347],"mapped",[116]],[[120348,120348],"mapped",[117]],[[120349,120349],"mapped",[118]],[[120350,120350],"mapped",[119]],[[120351,120351],"mapped",[120]],[[120352,120352],"mapped",[121]],[[120353,120353],"mapped",[122]],[[120354,120354],"mapped",[97]],[[120355,120355],"mapped",[98]],[[120356,120356],"mapped",[99]],[[120357,120357],"mapped",[100]],[[120358,120358],"mapped",[101]],[[120359,120359],"mapped",[102]],[[120360,120360],"mapped",[103]],[[120361,120361],"mapped",[104]],[[120362,120362],"mapped",[105]],[[120363,120363],"mapped",[106]],[[120364,120364],"mapped",[107]],[[120365,120365],"mapped",[108]],[[120366,120366],"mapped",[109]],[[120367,120367],"mapped",[110]],[[120368,120368],"mapped",[111]],[[120369,120369],"mapped",[112]],[[120370,120370],"mapped",[113]],[[120371,120371],"mapped",[114]],[[120372,120372],"mapped",[115]],[[120373,120373],"mapped",[116]],[[120374,120374],"mapped",[117]],[[120375,120375],"mapped",[118]],[[120376,120376],"mapped",[119]],[[120377,120377],"mapped",[120]],[[120378,120378],"mapped",[121]],[[120379,120379],"mapped",[122]],[[120380,120380],"mapped",[97]],[[120381,120381],"mapped",[98]],[[120382,120382],"mapped",[99]],[[120383,120383],"mapped",[100]],[[120384,120384],"mapped",[101]],[[120385,120385],"mapped",[102]],[[120386,120386],"mapped",[103]],[[120387,120387],"mapped",[104]],[[120388,120388],"mapped",[105]],[[120389,120389],"mapped",[106]],[[120390,120390],"mapped",[107]],[[120391,120391],"mapped",[108]],[[120392,120392],"mapped",[109]],[[120393,120393],"mapped",[110]],[[120394,120394],"mapped",[111]],[[120395,120395],"mapped",[112]],[[120396,120396],"mapped",[113]],[[120397,120397],"mapped",[114]],[[120398,120398],"mapped",[115]],[[120399,120399],"mapped",[116]],[[120400,120400],"mapped",[117]],[[120401,120401],"mapped",[118]],[[120402,120402],"mapped",[119]],[[120403,120403],"mapped",[120]],[[120404,120404],"mapped",[121]],[[120405,120405],"mapped",[122]],[[120406,120406],"mapped",[97]],[[120407,120407],"mapped",[98]],[[120408,120408],"mapped",[99]],[[120409,120409],"mapped",[100]],[[120410,120410],"mapped",[101]],[[120411,120411],"mapped",[102]],[[120412,120412],"mapped",[103]],[[120413,120413],"mapped",[104]],[[120414,120414],"mapped",[105]],[[120415,120415],"mapped",[106]],[[120416,120416],"mapped",[107]],[[120417,120417],"mapped",[108]],[[120418,120418],"mapped",[109]],[[120419,120419],"mapped",[110]],[[120420,120420],"mapped",[111]],[[120421,120421],"mapped",[112]],[[120422,120422],"mapped",[113]],[[120423,120423],"mapped",[114]],[[120424,120424],"mapped",[115]],[[120425,120425],"mapped",[116]],[[120426,120426],"mapped",[117]],[[120427,120427],"mapped",[118]],[[120428,120428],"mapped",[119]],[[120429,120429],"mapped",[120]],[[120430,120430],"mapped",[121]],[[120431,120431],"mapped",[122]],[[120432,120432],"mapped",[97]],[[120433,120433],"mapped",[98]],[[120434,120434],"mapped",[99]],[[120435,120435],"mapped",[100]],[[120436,120436],"mapped",[101]],[[120437,120437],"mapped",[102]],[[120438,120438],"mapped",[103]],[[120439,120439],"mapped",[104]],[[120440,120440],"mapped",[105]],[[120441,120441],"mapped",[106]],[[120442,120442],"mapped",[107]],[[120443,120443],"mapped",[108]],[[120444,120444],"mapped",[109]],[[120445,120445],"mapped",[110]],[[120446,120446],"mapped",[111]],[[120447,120447],"mapped",[112]],[[120448,120448],"mapped",[113]],[[120449,120449],"mapped",[114]],[[120450,120450],"mapped",[115]],[[120451,120451],"mapped",[116]],[[120452,120452],"mapped",[117]],[[120453,120453],"mapped",[118]],[[120454,120454],"mapped",[119]],[[120455,120455],"mapped",[120]],[[120456,120456],"mapped",[121]],[[120457,120457],"mapped",[122]],[[120458,120458],"mapped",[97]],[[120459,120459],"mapped",[98]],[[120460,120460],"mapped",[99]],[[120461,120461],"mapped",[100]],[[120462,120462],"mapped",[101]],[[120463,120463],"mapped",[102]],[[120464,120464],"mapped",[103]],[[120465,120465],"mapped",[104]],[[120466,120466],"mapped",[105]],[[120467,120467],"mapped",[106]],[[120468,120468],"mapped",[107]],[[120469,120469],"mapped",[108]],[[120470,120470],"mapped",[109]],[[120471,120471],"mapped",[110]],[[120472,120472],"mapped",[111]],[[120473,120473],"mapped",[112]],[[120474,120474],"mapped",[113]],[[120475,120475],"mapped",[114]],[[120476,120476],"mapped",[115]],[[120477,120477],"mapped",[116]],[[120478,120478],"mapped",[117]],[[120479,120479],"mapped",[118]],[[120480,120480],"mapped",[119]],[[120481,120481],"mapped",[120]],[[120482,120482],"mapped",[121]],[[120483,120483],"mapped",[122]],[[120484,120484],"mapped",[305]],[[120485,120485],"mapped",[567]],[[120486,120487],"disallowed"],[[120488,120488],"mapped",[945]],[[120489,120489],"mapped",[946]],[[120490,120490],"mapped",[947]],[[120491,120491],"mapped",[948]],[[120492,120492],"mapped",[949]],[[120493,120493],"mapped",[950]],[[120494,120494],"mapped",[951]],[[120495,120495],"mapped",[952]],[[120496,120496],"mapped",[953]],[[120497,120497],"mapped",[954]],[[120498,120498],"mapped",[955]],[[120499,120499],"mapped",[956]],[[120500,120500],"mapped",[957]],[[120501,120501],"mapped",[958]],[[120502,120502],"mapped",[959]],[[120503,120503],"mapped",[960]],[[120504,120504],"mapped",[961]],[[120505,120505],"mapped",[952]],[[120506,120506],"mapped",[963]],[[120507,120507],"mapped",[964]],[[120508,120508],"mapped",[965]],[[120509,120509],"mapped",[966]],[[120510,120510],"mapped",[967]],[[120511,120511],"mapped",[968]],[[120512,120512],"mapped",[969]],[[120513,120513],"mapped",[8711]],[[120514,120514],"mapped",[945]],[[120515,120515],"mapped",[946]],[[120516,120516],"mapped",[947]],[[120517,120517],"mapped",[948]],[[120518,120518],"mapped",[949]],[[120519,120519],"mapped",[950]],[[120520,120520],"mapped",[951]],[[120521,120521],"mapped",[952]],[[120522,120522],"mapped",[953]],[[120523,120523],"mapped",[954]],[[120524,120524],"mapped",[955]],[[120525,120525],"mapped",[956]],[[120526,120526],"mapped",[957]],[[120527,120527],"mapped",[958]],[[120528,120528],"mapped",[959]],[[120529,120529],"mapped",[960]],[[120530,120530],"mapped",[961]],[[120531,120532],"mapped",[963]],[[120533,120533],"mapped",[964]],[[120534,120534],"mapped",[965]],[[120535,120535],"mapped",[966]],[[120536,120536],"mapped",[967]],[[120537,120537],"mapped",[968]],[[120538,120538],"mapped",[969]],[[120539,120539],"mapped",[8706]],[[120540,120540],"mapped",[949]],[[120541,120541],"mapped",[952]],[[120542,120542],"mapped",[954]],[[120543,120543],"mapped",[966]],[[120544,120544],"mapped",[961]],[[120545,120545],"mapped",[960]],[[120546,120546],"mapped",[945]],[[120547,120547],"mapped",[946]],[[120548,120548],"mapped",[947]],[[120549,120549],"mapped",[948]],[[120550,120550],"mapped",[949]],[[120551,120551],"mapped",[950]],[[120552,120552],"mapped",[951]],[[120553,120553],"mapped",[952]],[[120554,120554],"mapped",[953]],[[120555,120555],"mapped",[954]],[[120556,120556],"mapped",[955]],[[120557,120557],"mapped",[956]],[[120558,120558],"mapped",[957]],[[120559,120559],"mapped",[958]],[[120560,120560],"mapped",[959]],[[120561,120561],"mapped",[960]],[[120562,120562],"mapped",[961]],[[120563,120563],"mapped",[952]],[[120564,120564],"mapped",[963]],[[120565,120565],"mapped",[964]],[[120566,120566],"mapped",[965]],[[120567,120567],"mapped",[966]],[[120568,120568],"mapped",[967]],[[120569,120569],"mapped",[968]],[[120570,120570],"mapped",[969]],[[120571,120571],"mapped",[8711]],[[120572,120572],"mapped",[945]],[[120573,120573],"mapped",[946]],[[120574,120574],"mapped",[947]],[[120575,120575],"mapped",[948]],[[120576,120576],"mapped",[949]],[[120577,120577],"mapped",[950]],[[120578,120578],"mapped",[951]],[[120579,120579],"mapped",[952]],[[120580,120580],"mapped",[953]],[[120581,120581],"mapped",[954]],[[120582,120582],"mapped",[955]],[[120583,120583],"mapped",[956]],[[120584,120584],"mapped",[957]],[[120585,120585],"mapped",[958]],[[120586,120586],"mapped",[959]],[[120587,120587],"mapped",[960]],[[120588,120588],"mapped",[961]],[[120589,120590],"mapped",[963]],[[120591,120591],"mapped",[964]],[[120592,120592],"mapped",[965]],[[120593,120593],"mapped",[966]],[[120594,120594],"mapped",[967]],[[120595,120595],"mapped",[968]],[[120596,120596],"mapped",[969]],[[120597,120597],"mapped",[8706]],[[120598,120598],"mapped",[949]],[[120599,120599],"mapped",[952]],[[120600,120600],"mapped",[954]],[[120601,120601],"mapped",[966]],[[120602,120602],"mapped",[961]],[[120603,120603],"mapped",[960]],[[120604,120604],"mapped",[945]],[[120605,120605],"mapped",[946]],[[120606,120606],"mapped",[947]],[[120607,120607],"mapped",[948]],[[120608,120608],"mapped",[949]],[[120609,120609],"mapped",[950]],[[120610,120610],"mapped",[951]],[[120611,120611],"mapped",[952]],[[120612,120612],"mapped",[953]],[[120613,120613],"mapped",[954]],[[120614,120614],"mapped",[955]],[[120615,120615],"mapped",[956]],[[120616,120616],"mapped",[957]],[[120617,120617],"mapped",[958]],[[120618,120618],"mapped",[959]],[[120619,120619],"mapped",[960]],[[120620,120620],"mapped",[961]],[[120621,120621],"mapped",[952]],[[120622,120622],"mapped",[963]],[[120623,120623],"mapped",[964]],[[120624,120624],"mapped",[965]],[[120625,120625],"mapped",[966]],[[120626,120626],"mapped",[967]],[[120627,120627],"mapped",[968]],[[120628,120628],"mapped",[969]],[[120629,120629],"mapped",[8711]],[[120630,120630],"mapped",[945]],[[120631,120631],"mapped",[946]],[[120632,120632],"mapped",[947]],[[120633,120633],"mapped",[948]],[[120634,120634],"mapped",[949]],[[120635,120635],"mapped",[950]],[[120636,120636],"mapped",[951]],[[120637,120637],"mapped",[952]],[[120638,120638],"mapped",[953]],[[120639,120639],"mapped",[954]],[[120640,120640],"mapped",[955]],[[120641,120641],"mapped",[956]],[[120642,120642],"mapped",[957]],[[120643,120643],"mapped",[958]],[[120644,120644],"mapped",[959]],[[120645,120645],"mapped",[960]],[[120646,120646],"mapped",[961]],[[120647,120648],"mapped",[963]],[[120649,120649],"mapped",[964]],[[120650,120650],"mapped",[965]],[[120651,120651],"mapped",[966]],[[120652,120652],"mapped",[967]],[[120653,120653],"mapped",[968]],[[120654,120654],"mapped",[969]],[[120655,120655],"mapped",[8706]],[[120656,120656],"mapped",[949]],[[120657,120657],"mapped",[952]],[[120658,120658],"mapped",[954]],[[120659,120659],"mapped",[966]],[[120660,120660],"mapped",[961]],[[120661,120661],"mapped",[960]],[[120662,120662],"mapped",[945]],[[120663,120663],"mapped",[946]],[[120664,120664],"mapped",[947]],[[120665,120665],"mapped",[948]],[[120666,120666],"mapped",[949]],[[120667,120667],"mapped",[950]],[[120668,120668],"mapped",[951]],[[120669,120669],"mapped",[952]],[[120670,120670],"mapped",[953]],[[120671,120671],"mapped",[954]],[[120672,120672],"mapped",[955]],[[120673,120673],"mapped",[956]],[[120674,120674],"mapped",[957]],[[120675,120675],"mapped",[958]],[[120676,120676],"mapped",[959]],[[120677,120677],"mapped",[960]],[[120678,120678],"mapped",[961]],[[120679,120679],"mapped",[952]],[[120680,120680],"mapped",[963]],[[120681,120681],"mapped",[964]],[[120682,120682],"mapped",[965]],[[120683,120683],"mapped",[966]],[[120684,120684],"mapped",[967]],[[120685,120685],"mapped",[968]],[[120686,120686],"mapped",[969]],[[120687,120687],"mapped",[8711]],[[120688,120688],"mapped",[945]],[[120689,120689],"mapped",[946]],[[120690,120690],"mapped",[947]],[[120691,120691],"mapped",[948]],[[120692,120692],"mapped",[949]],[[120693,120693],"mapped",[950]],[[120694,120694],"mapped",[951]],[[120695,120695],"mapped",[952]],[[120696,120696],"mapped",[953]],[[120697,120697],"mapped",[954]],[[120698,120698],"mapped",[955]],[[120699,120699],"mapped",[956]],[[120700,120700],"mapped",[957]],[[120701,120701],"mapped",[958]],[[120702,120702],"mapped",[959]],[[120703,120703],"mapped",[960]],[[120704,120704],"mapped",[961]],[[120705,120706],"mapped",[963]],[[120707,120707],"mapped",[964]],[[120708,120708],"mapped",[965]],[[120709,120709],"mapped",[966]],[[120710,120710],"mapped",[967]],[[120711,120711],"mapped",[968]],[[120712,120712],"mapped",[969]],[[120713,120713],"mapped",[8706]],[[120714,120714],"mapped",[949]],[[120715,120715],"mapped",[952]],[[120716,120716],"mapped",[954]],[[120717,120717],"mapped",[966]],[[120718,120718],"mapped",[961]],[[120719,120719],"mapped",[960]],[[120720,120720],"mapped",[945]],[[120721,120721],"mapped",[946]],[[120722,120722],"mapped",[947]],[[120723,120723],"mapped",[948]],[[120724,120724],"mapped",[949]],[[120725,120725],"mapped",[950]],[[120726,120726],"mapped",[951]],[[120727,120727],"mapped",[952]],[[120728,120728],"mapped",[953]],[[120729,120729],"mapped",[954]],[[120730,120730],"mapped",[955]],[[120731,120731],"mapped",[956]],[[120732,120732],"mapped",[957]],[[120733,120733],"mapped",[958]],[[120734,120734],"mapped",[959]],[[120735,120735],"mapped",[960]],[[120736,120736],"mapped",[961]],[[120737,120737],"mapped",[952]],[[120738,120738],"mapped",[963]],[[120739,120739],"mapped",[964]],[[120740,120740],"mapped",[965]],[[120741,120741],"mapped",[966]],[[120742,120742],"mapped",[967]],[[120743,120743],"mapped",[968]],[[120744,120744],"mapped",[969]],[[120745,120745],"mapped",[8711]],[[120746,120746],"mapped",[945]],[[120747,120747],"mapped",[946]],[[120748,120748],"mapped",[947]],[[120749,120749],"mapped",[948]],[[120750,120750],"mapped",[949]],[[120751,120751],"mapped",[950]],[[120752,120752],"mapped",[951]],[[120753,120753],"mapped",[952]],[[120754,120754],"mapped",[953]],[[120755,120755],"mapped",[954]],[[120756,120756],"mapped",[955]],[[120757,120757],"mapped",[956]],[[120758,120758],"mapped",[957]],[[120759,120759],"mapped",[958]],[[120760,120760],"mapped",[959]],[[120761,120761],"mapped",[960]],[[120762,120762],"mapped",[961]],[[120763,120764],"mapped",[963]],[[120765,120765],"mapped",[964]],[[120766,120766],"mapped",[965]],[[120767,120767],"mapped",[966]],[[120768,120768],"mapped",[967]],[[120769,120769],"mapped",[968]],[[120770,120770],"mapped",[969]],[[120771,120771],"mapped",[8706]],[[120772,120772],"mapped",[949]],[[120773,120773],"mapped",[952]],[[120774,120774],"mapped",[954]],[[120775,120775],"mapped",[966]],[[120776,120776],"mapped",[961]],[[120777,120777],"mapped",[960]],[[120778,120779],"mapped",[989]],[[120780,120781],"disallowed"],[[120782,120782],"mapped",[48]],[[120783,120783],"mapped",[49]],[[120784,120784],"mapped",[50]],[[120785,120785],"mapped",[51]],[[120786,120786],"mapped",[52]],[[120787,120787],"mapped",[53]],[[120788,120788],"mapped",[54]],[[120789,120789],"mapped",[55]],[[120790,120790],"mapped",[56]],[[120791,120791],"mapped",[57]],[[120792,120792],"mapped",[48]],[[120793,120793],"mapped",[49]],[[120794,120794],"mapped",[50]],[[120795,120795],"mapped",[51]],[[120796,120796],"mapped",[52]],[[120797,120797],"mapped",[53]],[[120798,120798],"mapped",[54]],[[120799,120799],"mapped",[55]],[[120800,120800],"mapped",[56]],[[120801,120801],"mapped",[57]],[[120802,120802],"mapped",[48]],[[120803,120803],"mapped",[49]],[[120804,120804],"mapped",[50]],[[120805,120805],"mapped",[51]],[[120806,120806],"mapped",[52]],[[120807,120807],"mapped",[53]],[[120808,120808],"mapped",[54]],[[120809,120809],"mapped",[55]],[[120810,120810],"mapped",[56]],[[120811,120811],"mapped",[57]],[[120812,120812],"mapped",[48]],[[120813,120813],"mapped",[49]],[[120814,120814],"mapped",[50]],[[120815,120815],"mapped",[51]],[[120816,120816],"mapped",[52]],[[120817,120817],"mapped",[53]],[[120818,120818],"mapped",[54]],[[120819,120819],"mapped",[55]],[[120820,120820],"mapped",[56]],[[120821,120821],"mapped",[57]],[[120822,120822],"mapped",[48]],[[120823,120823],"mapped",[49]],[[120824,120824],"mapped",[50]],[[120825,120825],"mapped",[51]],[[120826,120826],"mapped",[52]],[[120827,120827],"mapped",[53]],[[120828,120828],"mapped",[54]],[[120829,120829],"mapped",[55]],[[120830,120830],"mapped",[56]],[[120831,120831],"mapped",[57]],[[120832,121343],"valid",[],"NV8"],[[121344,121398],"valid"],[[121399,121402],"valid",[],"NV8"],[[121403,121452],"valid"],[[121453,121460],"valid",[],"NV8"],[[121461,121461],"valid"],[[121462,121475],"valid",[],"NV8"],[[121476,121476],"valid"],[[121477,121483],"valid",[],"NV8"],[[121484,121498],"disallowed"],[[121499,121503],"valid"],[[121504,121504],"disallowed"],[[121505,121519],"valid"],[[121520,124927],"disallowed"],[[124928,125124],"valid"],[[125125,125126],"disallowed"],[[125127,125135],"valid",[],"NV8"],[[125136,125142],"valid"],[[125143,126463],"disallowed"],[[126464,126464],"mapped",[1575]],[[126465,126465],"mapped",[1576]],[[126466,126466],"mapped",[1580]],[[126467,126467],"mapped",[1583]],[[126468,126468],"disallowed"],[[126469,126469],"mapped",[1608]],[[126470,126470],"mapped",[1586]],[[126471,126471],"mapped",[1581]],[[126472,126472],"mapped",[1591]],[[126473,126473],"mapped",[1610]],[[126474,126474],"mapped",[1603]],[[126475,126475],"mapped",[1604]],[[126476,126476],"mapped",[1605]],[[126477,126477],"mapped",[1606]],[[126478,126478],"mapped",[1587]],[[126479,126479],"mapped",[1593]],[[126480,126480],"mapped",[1601]],[[126481,126481],"mapped",[1589]],[[126482,126482],"mapped",[1602]],[[126483,126483],"mapped",[1585]],[[126484,126484],"mapped",[1588]],[[126485,126485],"mapped",[1578]],[[126486,126486],"mapped",[1579]],[[126487,126487],"mapped",[1582]],[[126488,126488],"mapped",[1584]],[[126489,126489],"mapped",[1590]],[[126490,126490],"mapped",[1592]],[[126491,126491],"mapped",[1594]],[[126492,126492],"mapped",[1646]],[[126493,126493],"mapped",[1722]],[[126494,126494],"mapped",[1697]],[[126495,126495],"mapped",[1647]],[[126496,126496],"disallowed"],[[126497,126497],"mapped",[1576]],[[126498,126498],"mapped",[1580]],[[126499,126499],"disallowed"],[[126500,126500],"mapped",[1607]],[[126501,126502],"disallowed"],[[126503,126503],"mapped",[1581]],[[126504,126504],"disallowed"],[[126505,126505],"mapped",[1610]],[[126506,126506],"mapped",[1603]],[[126507,126507],"mapped",[1604]],[[126508,126508],"mapped",[1605]],[[126509,126509],"mapped",[1606]],[[126510,126510],"mapped",[1587]],[[126511,126511],"mapped",[1593]],[[126512,126512],"mapped",[1601]],[[126513,126513],"mapped",[1589]],[[126514,126514],"mapped",[1602]],[[126515,126515],"disallowed"],[[126516,126516],"mapped",[1588]],[[126517,126517],"mapped",[1578]],[[126518,126518],"mapped",[1579]],[[126519,126519],"mapped",[1582]],[[126520,126520],"disallowed"],[[126521,126521],"mapped",[1590]],[[126522,126522],"disallowed"],[[126523,126523],"mapped",[1594]],[[126524,126529],"disallowed"],[[126530,126530],"mapped",[1580]],[[126531,126534],"disallowed"],[[126535,126535],"mapped",[1581]],[[126536,126536],"disallowed"],[[126537,126537],"mapped",[1610]],[[126538,126538],"disallowed"],[[126539,126539],"mapped",[1604]],[[126540,126540],"disallowed"],[[126541,126541],"mapped",[1606]],[[126542,126542],"mapped",[1587]],[[126543,126543],"mapped",[1593]],[[126544,126544],"disallowed"],[[126545,126545],"mapped",[1589]],[[126546,126546],"mapped",[1602]],[[126547,126547],"disallowed"],[[126548,126548],"mapped",[1588]],[[126549,126550],"disallowed"],[[126551,126551],"mapped",[1582]],[[126552,126552],"disallowed"],[[126553,126553],"mapped",[1590]],[[126554,126554],"disallowed"],[[126555,126555],"mapped",[1594]],[[126556,126556],"disallowed"],[[126557,126557],"mapped",[1722]],[[126558,126558],"disallowed"],[[126559,126559],"mapped",[1647]],[[126560,126560],"disallowed"],[[126561,126561],"mapped",[1576]],[[126562,126562],"mapped",[1580]],[[126563,126563],"disallowed"],[[126564,126564],"mapped",[1607]],[[126565,126566],"disallowed"],[[126567,126567],"mapped",[1581]],[[126568,126568],"mapped",[1591]],[[126569,126569],"mapped",[1610]],[[126570,126570],"mapped",[1603]],[[126571,126571],"disallowed"],[[126572,126572],"mapped",[1605]],[[126573,126573],"mapped",[1606]],[[126574,126574],"mapped",[1587]],[[126575,126575],"mapped",[1593]],[[126576,126576],"mapped",[1601]],[[126577,126577],"mapped",[1589]],[[126578,126578],"mapped",[1602]],[[126579,126579],"disallowed"],[[126580,126580],"mapped",[1588]],[[126581,126581],"mapped",[1578]],[[126582,126582],"mapped",[1579]],[[126583,126583],"mapped",[1582]],[[126584,126584],"disallowed"],[[126585,126585],"mapped",[1590]],[[126586,126586],"mapped",[1592]],[[126587,126587],"mapped",[1594]],[[126588,126588],"mapped",[1646]],[[126589,126589],"disallowed"],[[126590,126590],"mapped",[1697]],[[126591,126591],"disallowed"],[[126592,126592],"mapped",[1575]],[[126593,126593],"mapped",[1576]],[[126594,126594],"mapped",[1580]],[[126595,126595],"mapped",[1583]],[[126596,126596],"mapped",[1607]],[[126597,126597],"mapped",[1608]],[[126598,126598],"mapped",[1586]],[[126599,126599],"mapped",[1581]],[[126600,126600],"mapped",[1591]],[[126601,126601],"mapped",[1610]],[[126602,126602],"disallowed"],[[126603,126603],"mapped",[1604]],[[126604,126604],"mapped",[1605]],[[126605,126605],"mapped",[1606]],[[126606,126606],"mapped",[1587]],[[126607,126607],"mapped",[1593]],[[126608,126608],"mapped",[1601]],[[126609,126609],"mapped",[1589]],[[126610,126610],"mapped",[1602]],[[126611,126611],"mapped",[1585]],[[126612,126612],"mapped",[1588]],[[126613,126613],"mapped",[1578]],[[126614,126614],"mapped",[1579]],[[126615,126615],"mapped",[1582]],[[126616,126616],"mapped",[1584]],[[126617,126617],"mapped",[1590]],[[126618,126618],"mapped",[1592]],[[126619,126619],"mapped",[1594]],[[126620,126624],"disallowed"],[[126625,126625],"mapped",[1576]],[[126626,126626],"mapped",[1580]],[[126627,126627],"mapped",[1583]],[[126628,126628],"disallowed"],[[126629,126629],"mapped",[1608]],[[126630,126630],"mapped",[1586]],[[126631,126631],"mapped",[1581]],[[126632,126632],"mapped",[1591]],[[126633,126633],"mapped",[1610]],[[126634,126634],"disallowed"],[[126635,126635],"mapped",[1604]],[[126636,126636],"mapped",[1605]],[[126637,126637],"mapped",[1606]],[[126638,126638],"mapped",[1587]],[[126639,126639],"mapped",[1593]],[[126640,126640],"mapped",[1601]],[[126641,126641],"mapped",[1589]],[[126642,126642],"mapped",[1602]],[[126643,126643],"mapped",[1585]],[[126644,126644],"mapped",[1588]],[[126645,126645],"mapped",[1578]],[[126646,126646],"mapped",[1579]],[[126647,126647],"mapped",[1582]],[[126648,126648],"mapped",[1584]],[[126649,126649],"mapped",[1590]],[[126650,126650],"mapped",[1592]],[[126651,126651],"mapped",[1594]],[[126652,126703],"disallowed"],[[126704,126705],"valid",[],"NV8"],[[126706,126975],"disallowed"],[[126976,127019],"valid",[],"NV8"],[[127020,127023],"disallowed"],[[127024,127123],"valid",[],"NV8"],[[127124,127135],"disallowed"],[[127136,127150],"valid",[],"NV8"],[[127151,127152],"disallowed"],[[127153,127166],"valid",[],"NV8"],[[127167,127167],"valid",[],"NV8"],[[127168,127168],"disallowed"],[[127169,127183],"valid",[],"NV8"],[[127184,127184],"disallowed"],[[127185,127199],"valid",[],"NV8"],[[127200,127221],"valid",[],"NV8"],[[127222,127231],"disallowed"],[[127232,127232],"disallowed"],[[127233,127233],"disallowed_STD3_mapped",[48,44]],[[127234,127234],"disallowed_STD3_mapped",[49,44]],[[127235,127235],"disallowed_STD3_mapped",[50,44]],[[127236,127236],"disallowed_STD3_mapped",[51,44]],[[127237,127237],"disallowed_STD3_mapped",[52,44]],[[127238,127238],"disallowed_STD3_mapped",[53,44]],[[127239,127239],"disallowed_STD3_mapped",[54,44]],[[127240,127240],"disallowed_STD3_mapped",[55,44]],[[127241,127241],"disallowed_STD3_mapped",[56,44]],[[127242,127242],"disallowed_STD3_mapped",[57,44]],[[127243,127244],"valid",[],"NV8"],[[127245,127247],"disallowed"],[[127248,127248],"disallowed_STD3_mapped",[40,97,41]],[[127249,127249],"disallowed_STD3_mapped",[40,98,41]],[[127250,127250],"disallowed_STD3_mapped",[40,99,41]],[[127251,127251],"disallowed_STD3_mapped",[40,100,41]],[[127252,127252],"disallowed_STD3_mapped",[40,101,41]],[[127253,127253],"disallowed_STD3_mapped",[40,102,41]],[[127254,127254],"disallowed_STD3_mapped",[40,103,41]],[[127255,127255],"disallowed_STD3_mapped",[40,104,41]],[[127256,127256],"disallowed_STD3_mapped",[40,105,41]],[[127257,127257],"disallowed_STD3_mapped",[40,106,41]],[[127258,127258],"disallowed_STD3_mapped",[40,107,41]],[[127259,127259],"disallowed_STD3_mapped",[40,108,41]],[[127260,127260],"disallowed_STD3_mapped",[40,109,41]],[[127261,127261],"disallowed_STD3_mapped",[40,110,41]],[[127262,127262],"disallowed_STD3_mapped",[40,111,41]],[[127263,127263],"disallowed_STD3_mapped",[40,112,41]],[[127264,127264],"disallowed_STD3_mapped",[40,113,41]],[[127265,127265],"disallowed_STD3_mapped",[40,114,41]],[[127266,127266],"disallowed_STD3_mapped",[40,115,41]],[[127267,127267],"disallowed_STD3_mapped",[40,116,41]],[[127268,127268],"disallowed_STD3_mapped",[40,117,41]],[[127269,127269],"disallowed_STD3_mapped",[40,118,41]],[[127270,127270],"disallowed_STD3_mapped",[40,119,41]],[[127271,127271],"disallowed_STD3_mapped",[40,120,41]],[[127272,127272],"disallowed_STD3_mapped",[40,121,41]],[[127273,127273],"disallowed_STD3_mapped",[40,122,41]],[[127274,127274],"mapped",[12308,115,12309]],[[127275,127275],"mapped",[99]],[[127276,127276],"mapped",[114]],[[127277,127277],"mapped",[99,100]],[[127278,127278],"mapped",[119,122]],[[127279,127279],"disallowed"],[[127280,127280],"mapped",[97]],[[127281,127281],"mapped",[98]],[[127282,127282],"mapped",[99]],[[127283,127283],"mapped",[100]],[[127284,127284],"mapped",[101]],[[127285,127285],"mapped",[102]],[[127286,127286],"mapped",[103]],[[127287,127287],"mapped",[104]],[[127288,127288],"mapped",[105]],[[127289,127289],"mapped",[106]],[[127290,127290],"mapped",[107]],[[127291,127291],"mapped",[108]],[[127292,127292],"mapped",[109]],[[127293,127293],"mapped",[110]],[[127294,127294],"mapped",[111]],[[127295,127295],"mapped",[112]],[[127296,127296],"mapped",[113]],[[127297,127297],"mapped",[114]],[[127298,127298],"mapped",[115]],[[127299,127299],"mapped",[116]],[[127300,127300],"mapped",[117]],[[127301,127301],"mapped",[118]],[[127302,127302],"mapped",[119]],[[127303,127303],"mapped",[120]],[[127304,127304],"mapped",[121]],[[127305,127305],"mapped",[122]],[[127306,127306],"mapped",[104,118]],[[127307,127307],"mapped",[109,118]],[[127308,127308],"mapped",[115,100]],[[127309,127309],"mapped",[115,115]],[[127310,127310],"mapped",[112,112,118]],[[127311,127311],"mapped",[119,99]],[[127312,127318],"valid",[],"NV8"],[[127319,127319],"valid",[],"NV8"],[[127320,127326],"valid",[],"NV8"],[[127327,127327],"valid",[],"NV8"],[[127328,127337],"valid",[],"NV8"],[[127338,127338],"mapped",[109,99]],[[127339,127339],"mapped",[109,100]],[[127340,127343],"disallowed"],[[127344,127352],"valid",[],"NV8"],[[127353,127353],"valid",[],"NV8"],[[127354,127354],"valid",[],"NV8"],[[127355,127356],"valid",[],"NV8"],[[127357,127358],"valid",[],"NV8"],[[127359,127359],"valid",[],"NV8"],[[127360,127369],"valid",[],"NV8"],[[127370,127373],"valid",[],"NV8"],[[127374,127375],"valid",[],"NV8"],[[127376,127376],"mapped",[100,106]],[[127377,127386],"valid",[],"NV8"],[[127387,127461],"disallowed"],[[127462,127487],"valid",[],"NV8"],[[127488,127488],"mapped",[12411,12363]],[[127489,127489],"mapped",[12467,12467]],[[127490,127490],"mapped",[12469]],[[127491,127503],"disallowed"],[[127504,127504],"mapped",[25163]],[[127505,127505],"mapped",[23383]],[[127506,127506],"mapped",[21452]],[[127507,127507],"mapped",[12487]],[[127508,127508],"mapped",[20108]],[[127509,127509],"mapped",[22810]],[[127510,127510],"mapped",[35299]],[[127511,127511],"mapped",[22825]],[[127512,127512],"mapped",[20132]],[[127513,127513],"mapped",[26144]],[[127514,127514],"mapped",[28961]],[[127515,127515],"mapped",[26009]],[[127516,127516],"mapped",[21069]],[[127517,127517],"mapped",[24460]],[[127518,127518],"mapped",[20877]],[[127519,127519],"mapped",[26032]],[[127520,127520],"mapped",[21021]],[[127521,127521],"mapped",[32066]],[[127522,127522],"mapped",[29983]],[[127523,127523],"mapped",[36009]],[[127524,127524],"mapped",[22768]],[[127525,127525],"mapped",[21561]],[[127526,127526],"mapped",[28436]],[[127527,127527],"mapped",[25237]],[[127528,127528],"mapped",[25429]],[[127529,127529],"mapped",[19968]],[[127530,127530],"mapped",[19977]],[[127531,127531],"mapped",[36938]],[[127532,127532],"mapped",[24038]],[[127533,127533],"mapped",[20013]],[[127534,127534],"mapped",[21491]],[[127535,127535],"mapped",[25351]],[[127536,127536],"mapped",[36208]],[[127537,127537],"mapped",[25171]],[[127538,127538],"mapped",[31105]],[[127539,127539],"mapped",[31354]],[[127540,127540],"mapped",[21512]],[[127541,127541],"mapped",[28288]],[[127542,127542],"mapped",[26377]],[[127543,127543],"mapped",[26376]],[[127544,127544],"mapped",[30003]],[[127545,127545],"mapped",[21106]],[[127546,127546],"mapped",[21942]],[[127547,127551],"disallowed"],[[127552,127552],"mapped",[12308,26412,12309]],[[127553,127553],"mapped",[12308,19977,12309]],[[127554,127554],"mapped",[12308,20108,12309]],[[127555,127555],"mapped",[12308,23433,12309]],[[127556,127556],"mapped",[12308,28857,12309]],[[127557,127557],"mapped",[12308,25171,12309]],[[127558,127558],"mapped",[12308,30423,12309]],[[127559,127559],"mapped",[12308,21213,12309]],[[127560,127560],"mapped",[12308,25943,12309]],[[127561,127567],"disallowed"],[[127568,127568],"mapped",[24471]],[[127569,127569],"mapped",[21487]],[[127570,127743],"disallowed"],[[127744,127776],"valid",[],"NV8"],[[127777,127788],"valid",[],"NV8"],[[127789,127791],"valid",[],"NV8"],[[127792,127797],"valid",[],"NV8"],[[127798,127798],"valid",[],"NV8"],[[127799,127868],"valid",[],"NV8"],[[127869,127869],"valid",[],"NV8"],[[127870,127871],"valid",[],"NV8"],[[127872,127891],"valid",[],"NV8"],[[127892,127903],"valid",[],"NV8"],[[127904,127940],"valid",[],"NV8"],[[127941,127941],"valid",[],"NV8"],[[127942,127946],"valid",[],"NV8"],[[127947,127950],"valid",[],"NV8"],[[127951,127955],"valid",[],"NV8"],[[127956,127967],"valid",[],"NV8"],[[127968,127984],"valid",[],"NV8"],[[127985,127991],"valid",[],"NV8"],[[127992,127999],"valid",[],"NV8"],[[128000,128062],"valid",[],"NV8"],[[128063,128063],"valid",[],"NV8"],[[128064,128064],"valid",[],"NV8"],[[128065,128065],"valid",[],"NV8"],[[128066,128247],"valid",[],"NV8"],[[128248,128248],"valid",[],"NV8"],[[128249,128252],"valid",[],"NV8"],[[128253,128254],"valid",[],"NV8"],[[128255,128255],"valid",[],"NV8"],[[128256,128317],"valid",[],"NV8"],[[128318,128319],"valid",[],"NV8"],[[128320,128323],"valid",[],"NV8"],[[128324,128330],"valid",[],"NV8"],[[128331,128335],"valid",[],"NV8"],[[128336,128359],"valid",[],"NV8"],[[128360,128377],"valid",[],"NV8"],[[128378,128378],"disallowed"],[[128379,128419],"valid",[],"NV8"],[[128420,128420],"disallowed"],[[128421,128506],"valid",[],"NV8"],[[128507,128511],"valid",[],"NV8"],[[128512,128512],"valid",[],"NV8"],[[128513,128528],"valid",[],"NV8"],[[128529,128529],"valid",[],"NV8"],[[128530,128532],"valid",[],"NV8"],[[128533,128533],"valid",[],"NV8"],[[128534,128534],"valid",[],"NV8"],[[128535,128535],"valid",[],"NV8"],[[128536,128536],"valid",[],"NV8"],[[128537,128537],"valid",[],"NV8"],[[128538,128538],"valid",[],"NV8"],[[128539,128539],"valid",[],"NV8"],[[128540,128542],"valid",[],"NV8"],[[128543,128543],"valid",[],"NV8"],[[128544,128549],"valid",[],"NV8"],[[128550,128551],"valid",[],"NV8"],[[128552,128555],"valid",[],"NV8"],[[128556,128556],"valid",[],"NV8"],[[128557,128557],"valid",[],"NV8"],[[128558,128559],"valid",[],"NV8"],[[128560,128563],"valid",[],"NV8"],[[128564,128564],"valid",[],"NV8"],[[128565,128576],"valid",[],"NV8"],[[128577,128578],"valid",[],"NV8"],[[128579,128580],"valid",[],"NV8"],[[128581,128591],"valid",[],"NV8"],[[128592,128639],"valid",[],"NV8"],[[128640,128709],"valid",[],"NV8"],[[128710,128719],"valid",[],"NV8"],[[128720,128720],"valid",[],"NV8"],[[128721,128735],"disallowed"],[[128736,128748],"valid",[],"NV8"],[[128749,128751],"disallowed"],[[128752,128755],"valid",[],"NV8"],[[128756,128767],"disallowed"],[[128768,128883],"valid",[],"NV8"],[[128884,128895],"disallowed"],[[128896,128980],"valid",[],"NV8"],[[128981,129023],"disallowed"],[[129024,129035],"valid",[],"NV8"],[[129036,129039],"disallowed"],[[129040,129095],"valid",[],"NV8"],[[129096,129103],"disallowed"],[[129104,129113],"valid",[],"NV8"],[[129114,129119],"disallowed"],[[129120,129159],"valid",[],"NV8"],[[129160,129167],"disallowed"],[[129168,129197],"valid",[],"NV8"],[[129198,129295],"disallowed"],[[129296,129304],"valid",[],"NV8"],[[129305,129407],"disallowed"],[[129408,129412],"valid",[],"NV8"],[[129413,129471],"disallowed"],[[129472,129472],"valid",[],"NV8"],[[129473,131069],"disallowed"],[[131070,131071],"disallowed"],[[131072,173782],"valid"],[[173783,173823],"disallowed"],[[173824,177972],"valid"],[[177973,177983],"disallowed"],[[177984,178205],"valid"],[[178206,178207],"disallowed"],[[178208,183969],"valid"],[[183970,194559],"disallowed"],[[194560,194560],"mapped",[20029]],[[194561,194561],"mapped",[20024]],[[194562,194562],"mapped",[20033]],[[194563,194563],"mapped",[131362]],[[194564,194564],"mapped",[20320]],[[194565,194565],"mapped",[20398]],[[194566,194566],"mapped",[20411]],[[194567,194567],"mapped",[20482]],[[194568,194568],"mapped",[20602]],[[194569,194569],"mapped",[20633]],[[194570,194570],"mapped",[20711]],[[194571,194571],"mapped",[20687]],[[194572,194572],"mapped",[13470]],[[194573,194573],"mapped",[132666]],[[194574,194574],"mapped",[20813]],[[194575,194575],"mapped",[20820]],[[194576,194576],"mapped",[20836]],[[194577,194577],"mapped",[20855]],[[194578,194578],"mapped",[132380]],[[194579,194579],"mapped",[13497]],[[194580,194580],"mapped",[20839]],[[194581,194581],"mapped",[20877]],[[194582,194582],"mapped",[132427]],[[194583,194583],"mapped",[20887]],[[194584,194584],"mapped",[20900]],[[194585,194585],"mapped",[20172]],[[194586,194586],"mapped",[20908]],[[194587,194587],"mapped",[20917]],[[194588,194588],"mapped",[168415]],[[194589,194589],"mapped",[20981]],[[194590,194590],"mapped",[20995]],[[194591,194591],"mapped",[13535]],[[194592,194592],"mapped",[21051]],[[194593,194593],"mapped",[21062]],[[194594,194594],"mapped",[21106]],[[194595,194595],"mapped",[21111]],[[194596,194596],"mapped",[13589]],[[194597,194597],"mapped",[21191]],[[194598,194598],"mapped",[21193]],[[194599,194599],"mapped",[21220]],[[194600,194600],"mapped",[21242]],[[194601,194601],"mapped",[21253]],[[194602,194602],"mapped",[21254]],[[194603,194603],"mapped",[21271]],[[194604,194604],"mapped",[21321]],[[194605,194605],"mapped",[21329]],[[194606,194606],"mapped",[21338]],[[194607,194607],"mapped",[21363]],[[194608,194608],"mapped",[21373]],[[194609,194611],"mapped",[21375]],[[194612,194612],"mapped",[133676]],[[194613,194613],"mapped",[28784]],[[194614,194614],"mapped",[21450]],[[194615,194615],"mapped",[21471]],[[194616,194616],"mapped",[133987]],[[194617,194617],"mapped",[21483]],[[194618,194618],"mapped",[21489]],[[194619,194619],"mapped",[21510]],[[194620,194620],"mapped",[21662]],[[194621,194621],"mapped",[21560]],[[194622,194622],"mapped",[21576]],[[194623,194623],"mapped",[21608]],[[194624,194624],"mapped",[21666]],[[194625,194625],"mapped",[21750]],[[194626,194626],"mapped",[21776]],[[194627,194627],"mapped",[21843]],[[194628,194628],"mapped",[21859]],[[194629,194630],"mapped",[21892]],[[194631,194631],"mapped",[21913]],[[194632,194632],"mapped",[21931]],[[194633,194633],"mapped",[21939]],[[194634,194634],"mapped",[21954]],[[194635,194635],"mapped",[22294]],[[194636,194636],"mapped",[22022]],[[194637,194637],"mapped",[22295]],[[194638,194638],"mapped",[22097]],[[194639,194639],"mapped",[22132]],[[194640,194640],"mapped",[20999]],[[194641,194641],"mapped",[22766]],[[194642,194642],"mapped",[22478]],[[194643,194643],"mapped",[22516]],[[194644,194644],"mapped",[22541]],[[194645,194645],"mapped",[22411]],[[194646,194646],"mapped",[22578]],[[194647,194647],"mapped",[22577]],[[194648,194648],"mapped",[22700]],[[194649,194649],"mapped",[136420]],[[194650,194650],"mapped",[22770]],[[194651,194651],"mapped",[22775]],[[194652,194652],"mapped",[22790]],[[194653,194653],"mapped",[22810]],[[194654,194654],"mapped",[22818]],[[194655,194655],"mapped",[22882]],[[194656,194656],"mapped",[136872]],[[194657,194657],"mapped",[136938]],[[194658,194658],"mapped",[23020]],[[194659,194659],"mapped",[23067]],[[194660,194660],"mapped",[23079]],[[194661,194661],"mapped",[23000]],[[194662,194662],"mapped",[23142]],[[194663,194663],"mapped",[14062]],[[194664,194664],"disallowed"],[[194665,194665],"mapped",[23304]],[[194666,194667],"mapped",[23358]],[[194668,194668],"mapped",[137672]],[[194669,194669],"mapped",[23491]],[[194670,194670],"mapped",[23512]],[[194671,194671],"mapped",[23527]],[[194672,194672],"mapped",[23539]],[[194673,194673],"mapped",[138008]],[[194674,194674],"mapped",[23551]],[[194675,194675],"mapped",[23558]],[[194676,194676],"disallowed"],[[194677,194677],"mapped",[23586]],[[194678,194678],"mapped",[14209]],[[194679,194679],"mapped",[23648]],[[194680,194680],"mapped",[23662]],[[194681,194681],"mapped",[23744]],[[194682,194682],"mapped",[23693]],[[194683,194683],"mapped",[138724]],[[194684,194684],"mapped",[23875]],[[194685,194685],"mapped",[138726]],[[194686,194686],"mapped",[23918]],[[194687,194687],"mapped",[23915]],[[194688,194688],"mapped",[23932]],[[194689,194689],"mapped",[24033]],[[194690,194690],"mapped",[24034]],[[194691,194691],"mapped",[14383]],[[194692,194692],"mapped",[24061]],[[194693,194693],"mapped",[24104]],[[194694,194694],"mapped",[24125]],[[194695,194695],"mapped",[24169]],[[194696,194696],"mapped",[14434]],[[194697,194697],"mapped",[139651]],[[194698,194698],"mapped",[14460]],[[194699,194699],"mapped",[24240]],[[194700,194700],"mapped",[24243]],[[194701,194701],"mapped",[24246]],[[194702,194702],"mapped",[24266]],[[194703,194703],"mapped",[172946]],[[194704,194704],"mapped",[24318]],[[194705,194706],"mapped",[140081]],[[194707,194707],"mapped",[33281]],[[194708,194709],"mapped",[24354]],[[194710,194710],"mapped",[14535]],[[194711,194711],"mapped",[144056]],[[194712,194712],"mapped",[156122]],[[194713,194713],"mapped",[24418]],[[194714,194714],"mapped",[24427]],[[194715,194715],"mapped",[14563]],[[194716,194716],"mapped",[24474]],[[194717,194717],"mapped",[24525]],[[194718,194718],"mapped",[24535]],[[194719,194719],"mapped",[24569]],[[194720,194720],"mapped",[24705]],[[194721,194721],"mapped",[14650]],[[194722,194722],"mapped",[14620]],[[194723,194723],"mapped",[24724]],[[194724,194724],"mapped",[141012]],[[194725,194725],"mapped",[24775]],[[194726,194726],"mapped",[24904]],[[194727,194727],"mapped",[24908]],[[194728,194728],"mapped",[24910]],[[194729,194729],"mapped",[24908]],[[194730,194730],"mapped",[24954]],[[194731,194731],"mapped",[24974]],[[194732,194732],"mapped",[25010]],[[194733,194733],"mapped",[24996]],[[194734,194734],"mapped",[25007]],[[194735,194735],"mapped",[25054]],[[194736,194736],"mapped",[25074]],[[194737,194737],"mapped",[25078]],[[194738,194738],"mapped",[25104]],[[194739,194739],"mapped",[25115]],[[194740,194740],"mapped",[25181]],[[194741,194741],"mapped",[25265]],[[194742,194742],"mapped",[25300]],[[194743,194743],"mapped",[25424]],[[194744,194744],"mapped",[142092]],[[194745,194745],"mapped",[25405]],[[194746,194746],"mapped",[25340]],[[194747,194747],"mapped",[25448]],[[194748,194748],"mapped",[25475]],[[194749,194749],"mapped",[25572]],[[194750,194750],"mapped",[142321]],[[194751,194751],"mapped",[25634]],[[194752,194752],"mapped",[25541]],[[194753,194753],"mapped",[25513]],[[194754,194754],"mapped",[14894]],[[194755,194755],"mapped",[25705]],[[194756,194756],"mapped",[25726]],[[194757,194757],"mapped",[25757]],[[194758,194758],"mapped",[25719]],[[194759,194759],"mapped",[14956]],[[194760,194760],"mapped",[25935]],[[194761,194761],"mapped",[25964]],[[194762,194762],"mapped",[143370]],[[194763,194763],"mapped",[26083]],[[194764,194764],"mapped",[26360]],[[194765,194765],"mapped",[26185]],[[194766,194766],"mapped",[15129]],[[194767,194767],"mapped",[26257]],[[194768,194768],"mapped",[15112]],[[194769,194769],"mapped",[15076]],[[194770,194770],"mapped",[20882]],[[194771,194771],"mapped",[20885]],[[194772,194772],"mapped",[26368]],[[194773,194773],"mapped",[26268]],[[194774,194774],"mapped",[32941]],[[194775,194775],"mapped",[17369]],[[194776,194776],"mapped",[26391]],[[194777,194777],"mapped",[26395]],[[194778,194778],"mapped",[26401]],[[194779,194779],"mapped",[26462]],[[194780,194780],"mapped",[26451]],[[194781,194781],"mapped",[144323]],[[194782,194782],"mapped",[15177]],[[194783,194783],"mapped",[26618]],[[194784,194784],"mapped",[26501]],[[194785,194785],"mapped",[26706]],[[194786,194786],"mapped",[26757]],[[194787,194787],"mapped",[144493]],[[194788,194788],"mapped",[26766]],[[194789,194789],"mapped",[26655]],[[194790,194790],"mapped",[26900]],[[194791,194791],"mapped",[15261]],[[194792,194792],"mapped",[26946]],[[194793,194793],"mapped",[27043]],[[194794,194794],"mapped",[27114]],[[194795,194795],"mapped",[27304]],[[194796,194796],"mapped",[145059]],[[194797,194797],"mapped",[27355]],[[194798,194798],"mapped",[15384]],[[194799,194799],"mapped",[27425]],[[194800,194800],"mapped",[145575]],[[194801,194801],"mapped",[27476]],[[194802,194802],"mapped",[15438]],[[194803,194803],"mapped",[27506]],[[194804,194804],"mapped",[27551]],[[194805,194805],"mapped",[27578]],[[194806,194806],"mapped",[27579]],[[194807,194807],"mapped",[146061]],[[194808,194808],"mapped",[138507]],[[194809,194809],"mapped",[146170]],[[194810,194810],"mapped",[27726]],[[194811,194811],"mapped",[146620]],[[194812,194812],"mapped",[27839]],[[194813,194813],"mapped",[27853]],[[194814,194814],"mapped",[27751]],[[194815,194815],"mapped",[27926]],[[194816,194816],"mapped",[27966]],[[194817,194817],"mapped",[28023]],[[194818,194818],"mapped",[27969]],[[194819,194819],"mapped",[28009]],[[194820,194820],"mapped",[28024]],[[194821,194821],"mapped",[28037]],[[194822,194822],"mapped",[146718]],[[194823,194823],"mapped",[27956]],[[194824,194824],"mapped",[28207]],[[194825,194825],"mapped",[28270]],[[194826,194826],"mapped",[15667]],[[194827,194827],"mapped",[28363]],[[194828,194828],"mapped",[28359]],[[194829,194829],"mapped",[147153]],[[194830,194830],"mapped",[28153]],[[194831,194831],"mapped",[28526]],[[194832,194832],"mapped",[147294]],[[194833,194833],"mapped",[147342]],[[194834,194834],"mapped",[28614]],[[194835,194835],"mapped",[28729]],[[194836,194836],"mapped",[28702]],[[194837,194837],"mapped",[28699]],[[194838,194838],"mapped",[15766]],[[194839,194839],"mapped",[28746]],[[194840,194840],"mapped",[28797]],[[194841,194841],"mapped",[28791]],[[194842,194842],"mapped",[28845]],[[194843,194843],"mapped",[132389]],[[194844,194844],"mapped",[28997]],[[194845,194845],"mapped",[148067]],[[194846,194846],"mapped",[29084]],[[194847,194847],"disallowed"],[[194848,194848],"mapped",[29224]],[[194849,194849],"mapped",[29237]],[[194850,194850],"mapped",[29264]],[[194851,194851],"mapped",[149000]],[[194852,194852],"mapped",[29312]],[[194853,194853],"mapped",[29333]],[[194854,194854],"mapped",[149301]],[[194855,194855],"mapped",[149524]],[[194856,194856],"mapped",[29562]],[[194857,194857],"mapped",[29579]],[[194858,194858],"mapped",[16044]],[[194859,194859],"mapped",[29605]],[[194860,194861],"mapped",[16056]],[[194862,194862],"mapped",[29767]],[[194863,194863],"mapped",[29788]],[[194864,194864],"mapped",[29809]],[[194865,194865],"mapped",[29829]],[[194866,194866],"mapped",[29898]],[[194867,194867],"mapped",[16155]],[[194868,194868],"mapped",[29988]],[[194869,194869],"mapped",[150582]],[[194870,194870],"mapped",[30014]],[[194871,194871],"mapped",[150674]],[[194872,194872],"mapped",[30064]],[[194873,194873],"mapped",[139679]],[[194874,194874],"mapped",[30224]],[[194875,194875],"mapped",[151457]],[[194876,194876],"mapped",[151480]],[[194877,194877],"mapped",[151620]],[[194878,194878],"mapped",[16380]],[[194879,194879],"mapped",[16392]],[[194880,194880],"mapped",[30452]],[[194881,194881],"mapped",[151795]],[[194882,194882],"mapped",[151794]],[[194883,194883],"mapped",[151833]],[[194884,194884],"mapped",[151859]],[[194885,194885],"mapped",[30494]],[[194886,194887],"mapped",[30495]],[[194888,194888],"mapped",[30538]],[[194889,194889],"mapped",[16441]],[[194890,194890],"mapped",[30603]],[[194891,194891],"mapped",[16454]],[[194892,194892],"mapped",[16534]],[[194893,194893],"mapped",[152605]],[[194894,194894],"mapped",[30798]],[[194895,194895],"mapped",[30860]],[[194896,194896],"mapped",[30924]],[[194897,194897],"mapped",[16611]],[[194898,194898],"mapped",[153126]],[[194899,194899],"mapped",[31062]],[[194900,194900],"mapped",[153242]],[[194901,194901],"mapped",[153285]],[[194902,194902],"mapped",[31119]],[[194903,194903],"mapped",[31211]],[[194904,194904],"mapped",[16687]],[[194905,194905],"mapped",[31296]],[[194906,194906],"mapped",[31306]],[[194907,194907],"mapped",[31311]],[[194908,194908],"mapped",[153980]],[[194909,194910],"mapped",[154279]],[[194911,194911],"disallowed"],[[194912,194912],"mapped",[16898]],[[194913,194913],"mapped",[154539]],[[194914,194914],"mapped",[31686]],[[194915,194915],"mapped",[31689]],[[194916,194916],"mapped",[16935]],[[194917,194917],"mapped",[154752]],[[194918,194918],"mapped",[31954]],[[194919,194919],"mapped",[17056]],[[194920,194920],"mapped",[31976]],[[194921,194921],"mapped",[31971]],[[194922,194922],"mapped",[32000]],[[194923,194923],"mapped",[155526]],[[194924,194924],"mapped",[32099]],[[194925,194925],"mapped",[17153]],[[194926,194926],"mapped",[32199]],[[194927,194927],"mapped",[32258]],[[194928,194928],"mapped",[32325]],[[194929,194929],"mapped",[17204]],[[194930,194930],"mapped",[156200]],[[194931,194931],"mapped",[156231]],[[194932,194932],"mapped",[17241]],[[194933,194933],"mapped",[156377]],[[194934,194934],"mapped",[32634]],[[194935,194935],"mapped",[156478]],[[194936,194936],"mapped",[32661]],[[194937,194937],"mapped",[32762]],[[194938,194938],"mapped",[32773]],[[194939,194939],"mapped",[156890]],[[194940,194940],"mapped",[156963]],[[194941,194941],"mapped",[32864]],[[194942,194942],"mapped",[157096]],[[194943,194943],"mapped",[32880]],[[194944,194944],"mapped",[144223]],[[194945,194945],"mapped",[17365]],[[194946,194946],"mapped",[32946]],[[194947,194947],"mapped",[33027]],[[194948,194948],"mapped",[17419]],[[194949,194949],"mapped",[33086]],[[194950,194950],"mapped",[23221]],[[194951,194951],"mapped",[157607]],[[194952,194952],"mapped",[157621]],[[194953,194953],"mapped",[144275]],[[194954,194954],"mapped",[144284]],[[194955,194955],"mapped",[33281]],[[194956,194956],"mapped",[33284]],[[194957,194957],"mapped",[36766]],[[194958,194958],"mapped",[17515]],[[194959,194959],"mapped",[33425]],[[194960,194960],"mapped",[33419]],[[194961,194961],"mapped",[33437]],[[194962,194962],"mapped",[21171]],[[194963,194963],"mapped",[33457]],[[194964,194964],"mapped",[33459]],[[194965,194965],"mapped",[33469]],[[194966,194966],"mapped",[33510]],[[194967,194967],"mapped",[158524]],[[194968,194968],"mapped",[33509]],[[194969,194969],"mapped",[33565]],[[194970,194970],"mapped",[33635]],[[194971,194971],"mapped",[33709]],[[194972,194972],"mapped",[33571]],[[194973,194973],"mapped",[33725]],[[194974,194974],"mapped",[33767]],[[194975,194975],"mapped",[33879]],[[194976,194976],"mapped",[33619]],[[194977,194977],"mapped",[33738]],[[194978,194978],"mapped",[33740]],[[194979,194979],"mapped",[33756]],[[194980,194980],"mapped",[158774]],[[194981,194981],"mapped",[159083]],[[194982,194982],"mapped",[158933]],[[194983,194983],"mapped",[17707]],[[194984,194984],"mapped",[34033]],[[194985,194985],"mapped",[34035]],[[194986,194986],"mapped",[34070]],[[194987,194987],"mapped",[160714]],[[194988,194988],"mapped",[34148]],[[194989,194989],"mapped",[159532]],[[194990,194990],"mapped",[17757]],[[194991,194991],"mapped",[17761]],[[194992,194992],"mapped",[159665]],[[194993,194993],"mapped",[159954]],[[194994,194994],"mapped",[17771]],[[194995,194995],"mapped",[34384]],[[194996,194996],"mapped",[34396]],[[194997,194997],"mapped",[34407]],[[194998,194998],"mapped",[34409]],[[194999,194999],"mapped",[34473]],[[195000,195000],"mapped",[34440]],[[195001,195001],"mapped",[34574]],[[195002,195002],"mapped",[34530]],[[195003,195003],"mapped",[34681]],[[195004,195004],"mapped",[34600]],[[195005,195005],"mapped",[34667]],[[195006,195006],"mapped",[34694]],[[195007,195007],"disallowed"],[[195008,195008],"mapped",[34785]],[[195009,195009],"mapped",[34817]],[[195010,195010],"mapped",[17913]],[[195011,195011],"mapped",[34912]],[[195012,195012],"mapped",[34915]],[[195013,195013],"mapped",[161383]],[[195014,195014],"mapped",[35031]],[[195015,195015],"mapped",[35038]],[[195016,195016],"mapped",[17973]],[[195017,195017],"mapped",[35066]],[[195018,195018],"mapped",[13499]],[[195019,195019],"mapped",[161966]],[[195020,195020],"mapped",[162150]],[[195021,195021],"mapped",[18110]],[[195022,195022],"mapped",[18119]],[[195023,195023],"mapped",[35488]],[[195024,195024],"mapped",[35565]],[[195025,195025],"mapped",[35722]],[[195026,195026],"mapped",[35925]],[[195027,195027],"mapped",[162984]],[[195028,195028],"mapped",[36011]],[[195029,195029],"mapped",[36033]],[[195030,195030],"mapped",[36123]],[[195031,195031],"mapped",[36215]],[[195032,195032],"mapped",[163631]],[[195033,195033],"mapped",[133124]],[[195034,195034],"mapped",[36299]],[[195035,195035],"mapped",[36284]],[[195036,195036],"mapped",[36336]],[[195037,195037],"mapped",[133342]],[[195038,195038],"mapped",[36564]],[[195039,195039],"mapped",[36664]],[[195040,195040],"mapped",[165330]],[[195041,195041],"mapped",[165357]],[[195042,195042],"mapped",[37012]],[[195043,195043],"mapped",[37105]],[[195044,195044],"mapped",[37137]],[[195045,195045],"mapped",[165678]],[[195046,195046],"mapped",[37147]],[[195047,195047],"mapped",[37432]],[[195048,195048],"mapped",[37591]],[[195049,195049],"mapped",[37592]],[[195050,195050],"mapped",[37500]],[[195051,195051],"mapped",[37881]],[[195052,195052],"mapped",[37909]],[[195053,195053],"mapped",[166906]],[[195054,195054],"mapped",[38283]],[[195055,195055],"mapped",[18837]],[[195056,195056],"mapped",[38327]],[[195057,195057],"mapped",[167287]],[[195058,195058],"mapped",[18918]],[[195059,195059],"mapped",[38595]],[[195060,195060],"mapped",[23986]],[[195061,195061],"mapped",[38691]],[[195062,195062],"mapped",[168261]],[[195063,195063],"mapped",[168474]],[[195064,195064],"mapped",[19054]],[[195065,195065],"mapped",[19062]],[[195066,195066],"mapped",[38880]],[[195067,195067],"mapped",[168970]],[[195068,195068],"mapped",[19122]],[[195069,195069],"mapped",[169110]],[[195070,195071],"mapped",[38923]],[[195072,195072],"mapped",[38953]],[[195073,195073],"mapped",[169398]],[[195074,195074],"mapped",[39138]],[[195075,195075],"mapped",[19251]],[[195076,195076],"mapped",[39209]],[[195077,195077],"mapped",[39335]],[[195078,195078],"mapped",[39362]],[[195079,195079],"mapped",[39422]],[[195080,195080],"mapped",[19406]],[[195081,195081],"mapped",[170800]],[[195082,195082],"mapped",[39698]],[[195083,195083],"mapped",[40000]],[[195084,195084],"mapped",[40189]],[[195085,195085],"mapped",[19662]],[[195086,195086],"mapped",[19693]],[[195087,195087],"mapped",[40295]],[[195088,195088],"mapped",[172238]],[[195089,195089],"mapped",[19704]],[[195090,195090],"mapped",[172293]],[[195091,195091],"mapped",[172558]],[[195092,195092],"mapped",[172689]],[[195093,195093],"mapped",[40635]],[[195094,195094],"mapped",[19798]],[[195095,195095],"mapped",[40697]],[[195096,195096],"mapped",[40702]],[[195097,195097],"mapped",[40709]],[[195098,195098],"mapped",[40719]],[[195099,195099],"mapped",[40726]],[[195100,195100],"mapped",[40763]],[[195101,195101],"mapped",[173568]],[[195102,196605],"disallowed"],[[196606,196607],"disallowed"],[[196608,262141],"disallowed"],[[262142,262143],"disallowed"],[[262144,327677],"disallowed"],[[327678,327679],"disallowed"],[[327680,393213],"disallowed"],[[393214,393215],"disallowed"],[[393216,458749],"disallowed"],[[458750,458751],"disallowed"],[[458752,524285],"disallowed"],[[524286,524287],"disallowed"],[[524288,589821],"disallowed"],[[589822,589823],"disallowed"],[[589824,655357],"disallowed"],[[655358,655359],"disallowed"],[[655360,720893],"disallowed"],[[720894,720895],"disallowed"],[[720896,786429],"disallowed"],[[786430,786431],"disallowed"],[[786432,851965],"disallowed"],[[851966,851967],"disallowed"],[[851968,917501],"disallowed"],[[917502,917503],"disallowed"],[[917504,917504],"disallowed"],[[917505,917505],"disallowed"],[[917506,917535],"disallowed"],[[917536,917631],"disallowed"],[[917632,917759],"disallowed"],[[917760,917999],"ignored"],[[918000,983037],"disallowed"],[[983038,983039],"disallowed"],[[983040,1048573],"disallowed"],[[1048574,1048575],"disallowed"],[[1048576,1114109],"disallowed"],[[1114110,1114111],"disallowed"]] \ No newline at end of file diff --git a/@capacitor/assets/node_modules/tr46/package.json b/@capacitor/assets/node_modules/tr46/package.json new file mode 100644 index 00000000..b6826da1 --- /dev/null +++ b/@capacitor/assets/node_modules/tr46/package.json @@ -0,0 +1,31 @@ +{ + "name": "tr46", + "version": "0.0.3", + "description": "An implementation of the Unicode TR46 spec", + "main": "index.js", + "scripts": { + "test": "mocha", + "pretest": "node scripts/getLatestUnicodeTests.js", + "prepublish": "node scripts/generateMappingTable.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Sebmaster/tr46.js.git" + }, + "keywords": [ + "unicode", + "tr46", + "url", + "whatwg" + ], + "author": "Sebastian Mayr ", + "license": "MIT", + "bugs": { + "url": "https://github.com/Sebmaster/tr46.js/issues" + }, + "homepage": "https://github.com/Sebmaster/tr46.js#readme", + "devDependencies": { + "mocha": "^2.2.5", + "request": "^2.57.0" + } +} diff --git a/@capacitor/assets/node_modules/tslib/CopyrightNotice.txt b/@capacitor/assets/node_modules/tslib/CopyrightNotice.txt new file mode 100644 index 00000000..5d7d2d9c --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/CopyrightNotice.txt @@ -0,0 +1,15 @@ +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + diff --git a/@capacitor/assets/node_modules/tslib/LICENSE.txt b/@capacitor/assets/node_modules/tslib/LICENSE.txt new file mode 100644 index 00000000..fa7d1bdf --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/LICENSE.txt @@ -0,0 +1,12 @@ +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. \ No newline at end of file diff --git a/@capacitor/assets/node_modules/tslib/README.md b/@capacitor/assets/node_modules/tslib/README.md new file mode 100644 index 00000000..14b9a83d --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/README.md @@ -0,0 +1,164 @@ +# tslib + +This is a runtime library for [TypeScript](https://www.typescriptlang.org/) that contains all of the TypeScript helper functions. + +This library is primarily used by the `--importHelpers` flag in TypeScript. +When using `--importHelpers`, a module that uses helper functions like `__extends` and `__assign` in the following emitted file: + +```ts +var __assign = (this && this.__assign) || Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; +}; +exports.x = {}; +exports.y = __assign({}, exports.x); + +``` + +will instead be emitted as something like the following: + +```ts +var tslib_1 = require("tslib"); +exports.x = {}; +exports.y = tslib_1.__assign({}, exports.x); +``` + +Because this can avoid duplicate declarations of things like `__extends`, `__assign`, etc., this means delivering users smaller files on average, as well as less runtime overhead. +For optimized bundles with TypeScript, you should absolutely consider using `tslib` and `--importHelpers`. + +# Installing + +For the latest stable version, run: + +## npm + +```sh +# TypeScript 3.9.2 or later +npm install tslib + +# TypeScript 3.8.4 or earlier +npm install tslib@^1 + +# TypeScript 2.3.2 or earlier +npm install tslib@1.6.1 +``` + +## yarn + +```sh +# TypeScript 3.9.2 or later +yarn add tslib + +# TypeScript 3.8.4 or earlier +yarn add tslib@^1 + +# TypeScript 2.3.2 or earlier +yarn add tslib@1.6.1 +``` + +## bower + +```sh +# TypeScript 3.9.2 or later +bower install tslib + +# TypeScript 3.8.4 or earlier +bower install tslib@^1 + +# TypeScript 2.3.2 or earlier +bower install tslib@1.6.1 +``` + +## JSPM + +```sh +# TypeScript 3.9.2 or later +jspm install tslib + +# TypeScript 3.8.4 or earlier +jspm install tslib@^1 + +# TypeScript 2.3.2 or earlier +jspm install tslib@1.6.1 +``` + +# Usage + +Set the `importHelpers` compiler option on the command line: + +``` +tsc --importHelpers file.ts +``` + +or in your tsconfig.json: + +```json +{ + "compilerOptions": { + "importHelpers": true + } +} +``` + +#### For bower and JSPM users + +You will need to add a `paths` mapping for `tslib`, e.g. For Bower users: + +```json +{ + "compilerOptions": { + "module": "amd", + "importHelpers": true, + "baseUrl": "./", + "paths": { + "tslib" : ["bower_components/tslib/tslib.d.ts"] + } + } +} +``` + +For JSPM users: + +```json +{ + "compilerOptions": { + "module": "system", + "importHelpers": true, + "baseUrl": "./", + "paths": { + "tslib" : ["jspm_packages/npm/tslib@2.x.y/tslib.d.ts"] + } + } +} +``` + +## Deployment + +- Choose your new version number +- Set it in `package.json` and `bower.json` +- Create a tag: `git tag [version]` +- Push the tag: `git push --tags` +- Create a [release in GitHub](https://github.com/microsoft/tslib/releases) +- Run the [publish to npm](https://github.com/microsoft/tslib/actions?query=workflow%3A%22Publish+to+NPM%22) workflow + +Done. + +# Contribute + +There are many ways to [contribute](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md) to TypeScript. + +* [Submit bugs](https://github.com/Microsoft/TypeScript/issues) and help us verify fixes as they are checked in. +* Review the [source code changes](https://github.com/Microsoft/TypeScript/pulls). +* Engage with other TypeScript users and developers on [StackOverflow](http://stackoverflow.com/questions/tagged/typescript). +* Join the [#typescript](http://twitter.com/#!/search/realtime/%23typescript) discussion on Twitter. +* [Contribute bug fixes](https://github.com/Microsoft/TypeScript/blob/master/CONTRIBUTING.md). + +# Documentation + +* [Quick tutorial](http://www.typescriptlang.org/Tutorial) +* [Programming handbook](http://www.typescriptlang.org/Handbook) +* [Homepage](http://www.typescriptlang.org/) diff --git a/@capacitor/assets/node_modules/tslib/SECURITY.md b/@capacitor/assets/node_modules/tslib/SECURITY.md new file mode 100644 index 00000000..869fdfe2 --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + diff --git a/@capacitor/assets/node_modules/tslib/modules/index.d.ts b/@capacitor/assets/node_modules/tslib/modules/index.d.ts new file mode 100644 index 00000000..0fedae88 --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/modules/index.d.ts @@ -0,0 +1,37 @@ +// Note: named reexports are used instead of `export *` because +// TypeScript itself doesn't resolve the `export *` when checking +// if a particular helper exists. +export { + __extends, + __assign, + __rest, + __decorate, + __param, + __esDecorate, + __runInitializers, + __propKey, + __setFunctionName, + __metadata, + __awaiter, + __generator, + __exportStar, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn, + __createBinding, + __addDisposableResource, + __disposeResources, +} from '../tslib.js'; +export * as default from '../tslib.js'; diff --git a/@capacitor/assets/node_modules/tslib/modules/index.js b/@capacitor/assets/node_modules/tslib/modules/index.js new file mode 100644 index 00000000..0c9dcd5f --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/modules/index.js @@ -0,0 +1,68 @@ +import tslib from '../tslib.js'; +const { + __extends, + __assign, + __rest, + __decorate, + __param, + __esDecorate, + __runInitializers, + __propKey, + __setFunctionName, + __metadata, + __awaiter, + __generator, + __exportStar, + __createBinding, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn, + __addDisposableResource, + __disposeResources, +} = tslib; +export { + __extends, + __assign, + __rest, + __decorate, + __param, + __esDecorate, + __runInitializers, + __propKey, + __setFunctionName, + __metadata, + __awaiter, + __generator, + __exportStar, + __createBinding, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn, + __addDisposableResource, + __disposeResources, +}; +export default tslib; diff --git a/@capacitor/assets/node_modules/tslib/modules/package.json b/@capacitor/assets/node_modules/tslib/modules/package.json new file mode 100644 index 00000000..96ae6e57 --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/modules/package.json @@ -0,0 +1,3 @@ +{ + "type": "module" +} \ No newline at end of file diff --git a/@capacitor/assets/node_modules/tslib/package.json b/@capacitor/assets/node_modules/tslib/package.json new file mode 100644 index 00000000..0a1fdec5 --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/package.json @@ -0,0 +1,47 @@ +{ + "name": "tslib", + "author": "Microsoft Corp.", + "homepage": "https://www.typescriptlang.org/", + "version": "2.6.2", + "license": "0BSD", + "description": "Runtime library for TypeScript helper functions", + "keywords": [ + "TypeScript", + "Microsoft", + "compiler", + "language", + "javascript", + "tslib", + "runtime" + ], + "bugs": { + "url": "https://github.com/Microsoft/TypeScript/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/Microsoft/tslib.git" + }, + "main": "tslib.js", + "module": "tslib.es6.js", + "jsnext:main": "tslib.es6.js", + "typings": "tslib.d.ts", + "sideEffects": false, + "exports": { + ".": { + "module": { + "types": "./modules/index.d.ts", + "default": "./tslib.es6.mjs" + }, + "import": { + "node": "./modules/index.js", + "default": { + "types": "./modules/index.d.ts", + "default": "./tslib.es6.mjs" + } + }, + "default": "./tslib.js" + }, + "./*": "./*", + "./": "./" + } +} diff --git a/@capacitor/assets/node_modules/tslib/tslib.d.ts b/@capacitor/assets/node_modules/tslib/tslib.d.ts new file mode 100644 index 00000000..95cbc4ff --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/tslib.d.ts @@ -0,0 +1,453 @@ +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +/** + * Used to shim class extends. + * + * @param d The derived class. + * @param b The base class. + */ +export declare function __extends(d: Function, b: Function): void; + +/** + * Copy the values of all of the enumerable own properties from one or more source objects to a + * target object. Returns the target object. + * + * @param t The target object to copy to. + * @param sources One or more source objects from which to copy properties + */ +export declare function __assign(t: any, ...sources: any[]): any; + +/** + * Performs a rest spread on an object. + * + * @param t The source value. + * @param propertyNames The property names excluded from the rest spread. + */ +export declare function __rest(t: any, propertyNames: (string | symbol)[]): any; + +/** + * Applies decorators to a target object + * + * @param decorators The set of decorators to apply. + * @param target The target object. + * @param key If specified, the own property to apply the decorators to. + * @param desc The property descriptor, defaults to fetching the descriptor from the target object. + * @experimental + */ +export declare function __decorate(decorators: Function[], target: any, key?: string | symbol, desc?: any): any; + +/** + * Creates an observing function decorator from a parameter decorator. + * + * @param paramIndex The parameter index to apply the decorator to. + * @param decorator The parameter decorator to apply. Note that the return value is ignored. + * @experimental + */ +export declare function __param(paramIndex: number, decorator: Function): Function; + +/** + * Applies decorators to a class or class member, following the native ECMAScript decorator specification. + * @param ctor For non-field class members, the class constructor. Otherwise, `null`. + * @param descriptorIn The `PropertyDescriptor` to use when unable to look up the property from `ctor`. + * @param decorators The decorators to apply + * @param contextIn The `DecoratorContext` to clone for each decorator application. + * @param initializers An array of field initializer mutation functions into which new initializers are written. + * @param extraInitializers An array of extra initializer functions into which new initializers are written. + */ +export declare function __esDecorate(ctor: Function | null, descriptorIn: object | null, decorators: Function[], contextIn: object, initializers: Function[] | null, extraInitializers: Function[]): void; + +/** + * Runs field initializers or extra initializers generated by `__esDecorate`. + * @param thisArg The `this` argument to use. + * @param initializers The array of initializers to evaluate. + * @param value The initial value to pass to the initializers. + */ +export declare function __runInitializers(thisArg: unknown, initializers: Function[], value?: any): any; + +/** + * Converts a computed property name into a `string` or `symbol` value. + */ +export declare function __propKey(x: any): string | symbol; + +/** + * Assigns the name of a function derived from the left-hand side of an assignment. + * @param f The function to rename. + * @param name The new name for the function. + * @param prefix A prefix (such as `"get"` or `"set"`) to insert before the name. + */ +export declare function __setFunctionName(f: Function, name: string | symbol, prefix?: string): Function; + +/** + * Creates a decorator that sets metadata. + * + * @param metadataKey The metadata key + * @param metadataValue The metadata value + * @experimental + */ +export declare function __metadata(metadataKey: any, metadataValue: any): Function; + +/** + * Converts a generator function into a pseudo-async function, by treating each `yield` as an `await`. + * + * @param thisArg The reference to use as the `this` value in the generator function + * @param _arguments The optional arguments array + * @param P The optional promise constructor argument, defaults to the `Promise` property of the global object. + * @param generator The generator function + */ +export declare function __awaiter(thisArg: any, _arguments: any, P: Function, generator: Function): any; + +/** + * Creates an Iterator object using the body as the implementation. + * + * @param thisArg The reference to use as the `this` value in the function + * @param body The generator state-machine based implementation. + * + * @see [./docs/generator.md] + */ +export declare function __generator(thisArg: any, body: Function): any; + +/** + * Creates bindings for all enumerable properties of `m` on `exports` + * + * @param m The source object + * @param exports The `exports` object. + */ +export declare function __exportStar(m: any, o: any): void; + +/** + * Creates a value iterator from an `Iterable` or `ArrayLike` object. + * + * @param o The object. + * @throws {TypeError} If `o` is neither `Iterable`, nor an `ArrayLike`. + */ +export declare function __values(o: any): any; + +/** + * Reads values from an `Iterable` or `ArrayLike` object and returns the resulting array. + * + * @param o The object to read from. + * @param n The maximum number of arguments to read, defaults to `Infinity`. + */ +export declare function __read(o: any, n?: number): any[]; + +/** + * Creates an array from iterable spread. + * + * @param args The Iterable objects to spread. + * @deprecated since TypeScript 4.2 - Use `__spreadArray` + */ +export declare function __spread(...args: any[][]): any[]; + +/** + * Creates an array from array spread. + * + * @param args The ArrayLikes to spread into the resulting array. + * @deprecated since TypeScript 4.2 - Use `__spreadArray` + */ +export declare function __spreadArrays(...args: any[][]): any[]; + +/** + * Spreads the `from` array into the `to` array. + * + * @param pack Replace empty elements with `undefined`. + */ +export declare function __spreadArray(to: any[], from: any[], pack?: boolean): any[]; + +/** + * Creates an object that signals to `__asyncGenerator` that it shouldn't be yielded, + * and instead should be awaited and the resulting value passed back to the generator. + * + * @param v The value to await. + */ +export declare function __await(v: any): any; + +/** + * Converts a generator function into an async generator function, by using `yield __await` + * in place of normal `await`. + * + * @param thisArg The reference to use as the `this` value in the generator function + * @param _arguments The optional arguments array + * @param generator The generator function + */ +export declare function __asyncGenerator(thisArg: any, _arguments: any, generator: Function): any; + +/** + * Used to wrap a potentially async iterator in such a way so that it wraps the result + * of calling iterator methods of `o` in `__await` instances, and then yields the awaited values. + * + * @param o The potentially async iterator. + * @returns A synchronous iterator yielding `__await` instances on every odd invocation + * and returning the awaited `IteratorResult` passed to `next` every even invocation. + */ +export declare function __asyncDelegator(o: any): any; + +/** + * Creates a value async iterator from an `AsyncIterable`, `Iterable` or `ArrayLike` object. + * + * @param o The object. + * @throws {TypeError} If `o` is neither `AsyncIterable`, `Iterable`, nor an `ArrayLike`. + */ +export declare function __asyncValues(o: any): any; + +/** + * Creates a `TemplateStringsArray` frozen object from the `cooked` and `raw` arrays. + * + * @param cooked The cooked possibly-sparse array. + * @param raw The raw string content. + */ +export declare function __makeTemplateObject(cooked: string[], raw: string[]): TemplateStringsArray; + +/** + * Used to shim default and named imports in ECMAScript Modules transpiled to CommonJS. + * + * ```js + * import Default, { Named, Other } from "mod"; + * // or + * import { default as Default, Named, Other } from "mod"; + * ``` + * + * @param mod The CommonJS module exports object. + */ +export declare function __importStar(mod: T): T; + +/** + * Used to shim default imports in ECMAScript Modules transpiled to CommonJS. + * + * ```js + * import Default from "mod"; + * ``` + * + * @param mod The CommonJS module exports object. + */ +export declare function __importDefault(mod: T): T | { default: T }; + +/** + * Emulates reading a private instance field. + * + * @param receiver The instance from which to read the private field. + * @param state A WeakMap containing the private field value for an instance. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * + * @throws {TypeError} If `state` doesn't have an entry for `receiver`. + */ +export declare function __classPrivateFieldGet( + receiver: T, + state: { has(o: T): boolean, get(o: T): V | undefined }, + kind?: "f" +): V; + +/** + * Emulates reading a private static field. + * + * @param receiver The object from which to read the private static field. + * @param state The class constructor containing the definition of the static field. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * @param f The descriptor that holds the static field value. + * + * @throws {TypeError} If `receiver` is not `state`. + */ +export declare function __classPrivateFieldGet unknown, V>( + receiver: T, + state: T, + kind: "f", + f: { value: V } +): V; + +/** + * Emulates evaluating a private instance "get" accessor. + * + * @param receiver The instance on which to evaluate the private "get" accessor. + * @param state A WeakSet used to verify an instance supports the private "get" accessor. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * @param f The "get" accessor function to evaluate. + * + * @throws {TypeError} If `state` doesn't have an entry for `receiver`. + */ +export declare function __classPrivateFieldGet( + receiver: T, + state: { has(o: T): boolean }, + kind: "a", + f: () => V +): V; + +/** + * Emulates evaluating a private static "get" accessor. + * + * @param receiver The object on which to evaluate the private static "get" accessor. + * @param state The class constructor containing the definition of the static "get" accessor. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * @param f The "get" accessor function to evaluate. + * + * @throws {TypeError} If `receiver` is not `state`. + */ +export declare function __classPrivateFieldGet unknown, V>( + receiver: T, + state: T, + kind: "a", + f: () => V +): V; + +/** + * Emulates reading a private instance method. + * + * @param receiver The instance from which to read a private method. + * @param state A WeakSet used to verify an instance supports the private method. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * @param f The function to return as the private instance method. + * + * @throws {TypeError} If `state` doesn't have an entry for `receiver`. + */ +export declare function __classPrivateFieldGet unknown>( + receiver: T, + state: { has(o: T): boolean }, + kind: "m", + f: V +): V; + +/** + * Emulates reading a private static method. + * + * @param receiver The object from which to read the private static method. + * @param state The class constructor containing the definition of the static method. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * @param f The function to return as the private static method. + * + * @throws {TypeError} If `receiver` is not `state`. + */ +export declare function __classPrivateFieldGet unknown, V extends (...args: any[]) => unknown>( + receiver: T, + state: T, + kind: "m", + f: V +): V; + +/** + * Emulates writing to a private instance field. + * + * @param receiver The instance on which to set a private field value. + * @param state A WeakMap used to store the private field value for an instance. + * @param value The value to store in the private field. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * + * @throws {TypeError} If `state` doesn't have an entry for `receiver`. + */ +export declare function __classPrivateFieldSet( + receiver: T, + state: { has(o: T): boolean, set(o: T, value: V): unknown }, + value: V, + kind?: "f" +): V; + +/** + * Emulates writing to a private static field. + * + * @param receiver The object on which to set the private static field. + * @param state The class constructor containing the definition of the private static field. + * @param value The value to store in the private field. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * @param f The descriptor that holds the static field value. + * + * @throws {TypeError} If `receiver` is not `state`. + */ +export declare function __classPrivateFieldSet unknown, V>( + receiver: T, + state: T, + value: V, + kind: "f", + f: { value: V } +): V; + +/** + * Emulates writing to a private instance "set" accessor. + * + * @param receiver The instance on which to evaluate the private instance "set" accessor. + * @param state A WeakSet used to verify an instance supports the private "set" accessor. + * @param value The value to store in the private accessor. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * @param f The "set" accessor function to evaluate. + * + * @throws {TypeError} If `state` doesn't have an entry for `receiver`. + */ +export declare function __classPrivateFieldSet( + receiver: T, + state: { has(o: T): boolean }, + value: V, + kind: "a", + f: (v: V) => void +): V; + +/** + * Emulates writing to a private static "set" accessor. + * + * @param receiver The object on which to evaluate the private static "set" accessor. + * @param state The class constructor containing the definition of the static "set" accessor. + * @param value The value to store in the private field. + * @param kind Either `"f"` for a field, `"a"` for an accessor, or `"m"` for a method. + * @param f The "set" accessor function to evaluate. + * + * @throws {TypeError} If `receiver` is not `state`. + */ +export declare function __classPrivateFieldSet unknown, V>( + receiver: T, + state: T, + value: V, + kind: "a", + f: (v: V) => void +): V; + +/** + * Checks for the existence of a private field/method/accessor. + * + * @param state The class constructor containing the static member, or the WeakMap or WeakSet associated with a private instance member. + * @param receiver The object for which to test the presence of the private member. + */ +export declare function __classPrivateFieldIn( + state: (new (...args: any[]) => unknown) | { has(o: any): boolean }, + receiver: unknown, +): boolean; + +/** + * Creates a re-export binding on `object` with key `objectKey` that references `target[key]`. + * + * @param object The local `exports` object. + * @param target The object to re-export from. + * @param key The property key of `target` to re-export. + * @param objectKey The property key to re-export as. Defaults to `key`. + */ +export declare function __createBinding(object: object, target: object, key: PropertyKey, objectKey?: PropertyKey): void; + +/** + * Adds a disposable resource to a resource-tracking environment object. + * @param env A resource-tracking environment object. + * @param value Either a Disposable or AsyncDisposable object, `null`, or `undefined`. + * @param async When `true`, `AsyncDisposable` resources can be added. When `false`, `AsyncDisposable` resources cannot be added. + * @returns The {@link value} argument. + * + * @throws {TypeError} If {@link value} is not an object, or if either `Symbol.dispose` or `Symbol.asyncDispose` are not + * defined, or if {@link value} does not have an appropriate `Symbol.dispose` or `Symbol.asyncDispose` method. + */ +export declare function __addDisposableResource(env: { stack: { value?: unknown, dispose?: Function, async: boolean }[]; error: unknown; hasError: boolean; }, value: T, async: boolean): T; + +/** + * Disposes all resources in a resource-tracking environment object. + * @param env A resource-tracking environment object. + * @returns A {@link Promise} if any resources in the environment were marked as `async` when added; otherwise, `void`. + * + * @throws {SuppressedError} if an error thrown during disposal would have suppressed a prior error from disposal or the + * error recorded in the resource-tracking environment object. + * @seealso {@link __addDisposableResource} + */ +export declare function __disposeResources(env: { stack: { value?: unknown, dispose?: Function, async: boolean }[]; error: unknown; hasError: boolean; }): any; diff --git a/@capacitor/assets/node_modules/tslib/tslib.es6.html b/@capacitor/assets/node_modules/tslib/tslib.es6.html new file mode 100644 index 00000000..b122e41b --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/tslib.es6.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/@capacitor/assets/node_modules/tslib/tslib.es6.js b/@capacitor/assets/node_modules/tslib/tslib.es6.js new file mode 100644 index 00000000..66174fb9 --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/tslib.es6.js @@ -0,0 +1,370 @@ +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +export function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +export var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +export function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} + +export function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +export function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +export function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { + function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } + var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; + var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; + var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); + var _, done = false; + for (var i = decorators.length - 1; i >= 0; i--) { + var context = {}; + for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) context.access[p] = contextIn.access[p]; + context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; + var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); + if (kind === "accessor") { + if (result === void 0) continue; + if (result === null || typeof result !== "object") throw new TypeError("Object expected"); + if (_ = accept(result.get)) descriptor.get = _; + if (_ = accept(result.set)) descriptor.set = _; + if (_ = accept(result.init)) initializers.unshift(_); + } + else if (_ = accept(result)) { + if (kind === "field") initializers.unshift(_); + else descriptor[key] = _; + } + } + if (target) Object.defineProperty(target, contextIn.name, descriptor); + done = true; +}; + +export function __runInitializers(thisArg, initializers, value) { + var useValue = arguments.length > 2; + for (var i = 0; i < initializers.length; i++) { + value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); + } + return useValue ? value : void 0; +}; + +export function __propKey(x) { + return typeof x === "symbol" ? x : "".concat(x); +}; + +export function __setFunctionName(f, name, prefix) { + if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; + return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); +}; + +export function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +export function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +export function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +export var __createBinding = Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +}); + +export function __exportStar(m, o) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); +} + +export function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +} + +export function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +/** @deprecated */ +export function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +/** @deprecated */ +export function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +} + +export function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} + +export function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +export function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +export function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; } +} + +export function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +export function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +var __setModuleDefault = Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}; + +export function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +} + +export function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} + +export function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +export function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +export function __classPrivateFieldIn(state, receiver) { + if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); +} + +export function __addDisposableResource(env, value, async) { + if (value !== null && value !== void 0) { + if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); + var dispose; + if (async) { + if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); + dispose = value[Symbol.asyncDispose]; + } + if (dispose === void 0) { + if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); + dispose = value[Symbol.dispose]; + } + if (typeof dispose !== "function") throw new TypeError("Object not disposable."); + env.stack.push({ value: value, dispose: dispose, async: async }); + } + else if (async) { + env.stack.push({ async: true }); + } + return value; +} + +var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +export function __disposeResources(env) { + function fail(e) { + env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; + env.hasError = true; + } + function next() { + while (env.stack.length) { + var rec = env.stack.pop(); + try { + var result = rec.dispose && rec.dispose.call(rec.value); + if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + } + catch (e) { + fail(e); + } + } + if (env.hasError) throw env.error; + } + return next(); +} + +export default { + __extends: __extends, + __assign: __assign, + __rest: __rest, + __decorate: __decorate, + __param: __param, + __metadata: __metadata, + __awaiter: __awaiter, + __generator: __generator, + __createBinding: __createBinding, + __exportStar: __exportStar, + __values: __values, + __read: __read, + __spread: __spread, + __spreadArrays: __spreadArrays, + __spreadArray: __spreadArray, + __await: __await, + __asyncGenerator: __asyncGenerator, + __asyncDelegator: __asyncDelegator, + __asyncValues: __asyncValues, + __makeTemplateObject: __makeTemplateObject, + __importStar: __importStar, + __importDefault: __importDefault, + __classPrivateFieldGet: __classPrivateFieldGet, + __classPrivateFieldSet: __classPrivateFieldSet, + __classPrivateFieldIn: __classPrivateFieldIn, + __addDisposableResource: __addDisposableResource, + __disposeResources: __disposeResources, +}; diff --git a/@capacitor/assets/node_modules/tslib/tslib.es6.mjs b/@capacitor/assets/node_modules/tslib/tslib.es6.mjs new file mode 100644 index 00000000..c8e29993 --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/tslib.es6.mjs @@ -0,0 +1,370 @@ +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +export function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +export var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +export function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; +} + +export function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +export function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +export function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { + function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } + var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; + var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; + var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); + var _, done = false; + for (var i = decorators.length - 1; i >= 0; i--) { + var context = {}; + for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) context.access[p] = contextIn.access[p]; + context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; + var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); + if (kind === "accessor") { + if (result === void 0) continue; + if (result === null || typeof result !== "object") throw new TypeError("Object expected"); + if (_ = accept(result.get)) descriptor.get = _; + if (_ = accept(result.set)) descriptor.set = _; + if (_ = accept(result.init)) initializers.unshift(_); + } + else if (_ = accept(result)) { + if (kind === "field") initializers.unshift(_); + else descriptor[key] = _; + } + } + if (target) Object.defineProperty(target, contextIn.name, descriptor); + done = true; +}; + +export function __runInitializers(thisArg, initializers, value) { + var useValue = arguments.length > 2; + for (var i = 0; i < initializers.length; i++) { + value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); + } + return useValue ? value : void 0; +}; + +export function __propKey(x) { + return typeof x === "symbol" ? x : "".concat(x); +}; + +export function __setFunctionName(f, name, prefix) { + if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; + return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); +}; + +export function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +export function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +export function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +export var __createBinding = Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +}); + +export function __exportStar(m, o) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); +} + +export function __values(o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); +} + +export function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +/** @deprecated */ +export function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +/** @deprecated */ +export function __spreadArrays() { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; +} + +export function __spreadArray(to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +} + +export function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +export function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +export function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; } +} + +export function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +export function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +var __setModuleDefault = Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}; + +export function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +} + +export function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} + +export function __classPrivateFieldGet(receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +} + +export function __classPrivateFieldSet(receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +} + +export function __classPrivateFieldIn(state, receiver) { + if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); +} + +export function __addDisposableResource(env, value, async) { + if (value !== null && value !== void 0) { + if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); + var dispose; + if (async) { + if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); + dispose = value[Symbol.asyncDispose]; + } + if (dispose === void 0) { + if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); + dispose = value[Symbol.dispose]; + } + if (typeof dispose !== "function") throw new TypeError("Object not disposable."); + env.stack.push({ value: value, dispose: dispose, async: async }); + } + else if (async) { + env.stack.push({ async: true }); + } + return value; +} + +var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +export function __disposeResources(env) { + function fail(e) { + env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; + env.hasError = true; + } + function next() { + while (env.stack.length) { + var rec = env.stack.pop(); + try { + var result = rec.dispose && rec.dispose.call(rec.value); + if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + } + catch (e) { + fail(e); + } + } + if (env.hasError) throw env.error; + } + return next(); +} + +export default { + __extends, + __assign, + __rest, + __decorate, + __param, + __metadata, + __awaiter, + __generator, + __createBinding, + __exportStar, + __values, + __read, + __spread, + __spreadArrays, + __spreadArray, + __await, + __asyncGenerator, + __asyncDelegator, + __asyncValues, + __makeTemplateObject, + __importStar, + __importDefault, + __classPrivateFieldGet, + __classPrivateFieldSet, + __classPrivateFieldIn, + __addDisposableResource, + __disposeResources, +}; diff --git a/@capacitor/assets/node_modules/tslib/tslib.html b/@capacitor/assets/node_modules/tslib/tslib.html new file mode 100644 index 00000000..44c9ba51 --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/tslib.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/@capacitor/assets/node_modules/tslib/tslib.js b/@capacitor/assets/node_modules/tslib/tslib.js new file mode 100644 index 00000000..7c532936 --- /dev/null +++ b/@capacitor/assets/node_modules/tslib/tslib.js @@ -0,0 +1,421 @@ +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global global, define, Symbol, Reflect, Promise, SuppressedError */ +var __extends; +var __assign; +var __rest; +var __decorate; +var __param; +var __esDecorate; +var __runInitializers; +var __propKey; +var __setFunctionName; +var __metadata; +var __awaiter; +var __generator; +var __exportStar; +var __values; +var __read; +var __spread; +var __spreadArrays; +var __spreadArray; +var __await; +var __asyncGenerator; +var __asyncDelegator; +var __asyncValues; +var __makeTemplateObject; +var __importStar; +var __importDefault; +var __classPrivateFieldGet; +var __classPrivateFieldSet; +var __classPrivateFieldIn; +var __createBinding; +var __addDisposableResource; +var __disposeResources; +(function (factory) { + var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {}; + if (typeof define === "function" && define.amd) { + define("tslib", ["exports"], function (exports) { factory(createExporter(root, createExporter(exports))); }); + } + else if (typeof module === "object" && typeof module.exports === "object") { + factory(createExporter(root, createExporter(module.exports))); + } + else { + factory(createExporter(root)); + } + function createExporter(exports, previous) { + if (exports !== root) { + if (typeof Object.create === "function") { + Object.defineProperty(exports, "__esModule", { value: true }); + } + else { + exports.__esModule = true; + } + } + return function (id, v) { return exports[id] = previous ? previous(id, v) : v; }; + } +}) +(function (exporter) { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + + __extends = function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; + + __assign = Object.assign || function (t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + + __rest = function (s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { + if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) + t[p[i]] = s[p[i]]; + } + return t; + }; + + __decorate = function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; + }; + + __param = function (paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } + }; + + __esDecorate = function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { + function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } + var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; + var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; + var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); + var _, done = false; + for (var i = decorators.length - 1; i >= 0; i--) { + var context = {}; + for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; + for (var p in contextIn.access) context.access[p] = contextIn.access[p]; + context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; + var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); + if (kind === "accessor") { + if (result === void 0) continue; + if (result === null || typeof result !== "object") throw new TypeError("Object expected"); + if (_ = accept(result.get)) descriptor.get = _; + if (_ = accept(result.set)) descriptor.set = _; + if (_ = accept(result.init)) initializers.unshift(_); + } + else if (_ = accept(result)) { + if (kind === "field") initializers.unshift(_); + else descriptor[key] = _; + } + } + if (target) Object.defineProperty(target, contextIn.name, descriptor); + done = true; + }; + + __runInitializers = function (thisArg, initializers, value) { + var useValue = arguments.length > 2; + for (var i = 0; i < initializers.length; i++) { + value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); + } + return useValue ? value : void 0; + }; + + __propKey = function (x) { + return typeof x === "symbol" ? x : "".concat(x); + }; + + __setFunctionName = function (f, name, prefix) { + if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : ""; + return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name }); + }; + + __metadata = function (metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); + }; + + __awaiter = function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; + + __generator = function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (g && (g = 0, op[0] && (_ = 0)), _) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } + }; + + __exportStar = function(m, o) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p); + }; + + __createBinding = Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); + }) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; + }); + + __values = function (o) { + var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; + if (m) return m.call(o); + if (o && typeof o.length === "number") return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; + throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); + }; + + __read = function (o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; + }; + + /** @deprecated */ + __spread = function () { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; + }; + + /** @deprecated */ + __spreadArrays = function () { + for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; + for (var r = Array(s), k = 0, i = 0; i < il; i++) + for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) + r[k] = a[j]; + return r; + }; + + __spreadArray = function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); + }; + + __await = function (v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); + }; + + __asyncGenerator = function (thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } + }; + + __asyncDelegator = function (o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; } + }; + + __asyncValues = function (o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } + }; + + __makeTemplateObject = function (cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; + }; + + var __setModuleDefault = Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); + }) : function(o, v) { + o["default"] = v; + }; + + __importStar = function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; + }; + + __importDefault = function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; + }; + + __classPrivateFieldGet = function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); + }; + + __classPrivateFieldSet = function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; + }; + + __classPrivateFieldIn = function (state, receiver) { + if (receiver === null || (typeof receiver !== "object" && typeof receiver !== "function")) throw new TypeError("Cannot use 'in' operator on non-object"); + return typeof state === "function" ? receiver === state : state.has(receiver); + }; + + __addDisposableResource = function (env, value, async) { + if (value !== null && value !== void 0) { + if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected."); + var dispose; + if (async) { + if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined."); + dispose = value[Symbol.asyncDispose]; + } + if (dispose === void 0) { + if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined."); + dispose = value[Symbol.dispose]; + } + if (typeof dispose !== "function") throw new TypeError("Object not disposable."); + env.stack.push({ value: value, dispose: dispose, async: async }); + } + else if (async) { + env.stack.push({ async: true }); + } + return value; + }; + + var _SuppressedError = typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; + }; + + __disposeResources = function (env) { + function fail(e) { + env.error = env.hasError ? new _SuppressedError(e, env.error, "An error was suppressed during disposal.") : e; + env.hasError = true; + } + function next() { + while (env.stack.length) { + var rec = env.stack.pop(); + try { + var result = rec.dispose && rec.dispose.call(rec.value); + if (rec.async) return Promise.resolve(result).then(next, function(e) { fail(e); return next(); }); + } + catch (e) { + fail(e); + } + } + if (env.hasError) throw env.error; + } + return next(); + }; + + exporter("__extends", __extends); + exporter("__assign", __assign); + exporter("__rest", __rest); + exporter("__decorate", __decorate); + exporter("__param", __param); + exporter("__esDecorate", __esDecorate); + exporter("__runInitializers", __runInitializers); + exporter("__propKey", __propKey); + exporter("__setFunctionName", __setFunctionName); + exporter("__metadata", __metadata); + exporter("__awaiter", __awaiter); + exporter("__generator", __generator); + exporter("__exportStar", __exportStar); + exporter("__createBinding", __createBinding); + exporter("__values", __values); + exporter("__read", __read); + exporter("__spread", __spread); + exporter("__spreadArrays", __spreadArrays); + exporter("__spreadArray", __spreadArray); + exporter("__await", __await); + exporter("__asyncGenerator", __asyncGenerator); + exporter("__asyncDelegator", __asyncDelegator); + exporter("__asyncValues", __asyncValues); + exporter("__makeTemplateObject", __makeTemplateObject); + exporter("__importStar", __importStar); + exporter("__importDefault", __importDefault); + exporter("__classPrivateFieldGet", __classPrivateFieldGet); + exporter("__classPrivateFieldSet", __classPrivateFieldSet); + exporter("__classPrivateFieldIn", __classPrivateFieldIn); + exporter("__addDisposableResource", __addDisposableResource); + exporter("__disposeResources", __disposeResources); +}); diff --git a/@capacitor/assets/node_modules/universalify/LICENSE b/@capacitor/assets/node_modules/universalify/LICENSE new file mode 100644 index 00000000..514e84e6 --- /dev/null +++ b/@capacitor/assets/node_modules/universalify/LICENSE @@ -0,0 +1,20 @@ +(The MIT License) + +Copyright (c) 2017, Ryan Zimmerman + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the 'Software'), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@capacitor/assets/node_modules/universalify/README.md b/@capacitor/assets/node_modules/universalify/README.md new file mode 100644 index 00000000..1184939d --- /dev/null +++ b/@capacitor/assets/node_modules/universalify/README.md @@ -0,0 +1,76 @@ +# universalify + +![GitHub Workflow Status (branch)](https://img.shields.io/github/actions/workflow/status/RyanZim/universalify/ci.yml?branch=master) +![Coveralls github branch](https://img.shields.io/coveralls/github/RyanZim/universalify/master.svg) +![npm](https://img.shields.io/npm/dm/universalify.svg) +![npm](https://img.shields.io/npm/l/universalify.svg) + +Make a callback- or promise-based function support both promises and callbacks. + +Uses the native promise implementation. + +## Installation + +```bash +npm install universalify +``` + +## API + +### `universalify.fromCallback(fn)` + +Takes a callback-based function to universalify, and returns the universalified function. + +Function must take a callback as the last parameter that will be called with the signature `(error, result)`. `universalify` does not support calling the callback with three or more arguments, and does not ensure that the callback is only called once. + +```js +function callbackFn (n, cb) { + setTimeout(() => cb(null, n), 15) +} + +const fn = universalify.fromCallback(callbackFn) + +// Works with Promises: +fn('Hello World!') +.then(result => console.log(result)) // -> Hello World! +.catch(error => console.error(error)) + +// Works with Callbacks: +fn('Hi!', (error, result) => { + if (error) return console.error(error) + console.log(result) + // -> Hi! +}) +``` + +### `universalify.fromPromise(fn)` + +Takes a promise-based function to universalify, and returns the universalified function. + +Function must return a valid JS promise. `universalify` does not ensure that a valid promise is returned. + +```js +function promiseFn (n) { + return new Promise(resolve => { + setTimeout(() => resolve(n), 15) + }) +} + +const fn = universalify.fromPromise(promiseFn) + +// Works with Promises: +fn('Hello World!') +.then(result => console.log(result)) // -> Hello World! +.catch(error => console.error(error)) + +// Works with Callbacks: +fn('Hi!', (error, result) => { + if (error) return console.error(error) + console.log(result) + // -> Hi! +}) +``` + +## License + +MIT diff --git a/@capacitor/assets/node_modules/universalify/index.js b/@capacitor/assets/node_modules/universalify/index.js new file mode 100644 index 00000000..233beac7 --- /dev/null +++ b/@capacitor/assets/node_modules/universalify/index.js @@ -0,0 +1,24 @@ +'use strict' + +exports.fromCallback = function (fn) { + return Object.defineProperty(function (...args) { + if (typeof args[args.length - 1] === 'function') fn.apply(this, args) + else { + return new Promise((resolve, reject) => { + args.push((err, res) => (err != null) ? reject(err) : resolve(res)) + fn.apply(this, args) + }) + } + }, 'name', { value: fn.name }) +} + +exports.fromPromise = function (fn) { + return Object.defineProperty(function (...args) { + const cb = args[args.length - 1] + if (typeof cb !== 'function') return fn.apply(this, args) + else { + args.pop() + fn.apply(this, args).then(r => cb(null, r), cb) + } + }, 'name', { value: fn.name }) +} diff --git a/@capacitor/assets/node_modules/universalify/package.json b/@capacitor/assets/node_modules/universalify/package.json new file mode 100644 index 00000000..d60fccb5 --- /dev/null +++ b/@capacitor/assets/node_modules/universalify/package.json @@ -0,0 +1,34 @@ +{ + "name": "universalify", + "version": "2.0.1", + "description": "Make a callback- or promise-based function support both promises and callbacks.", + "keywords": [ + "callback", + "native", + "promise" + ], + "homepage": "https://github.com/RyanZim/universalify#readme", + "bugs": "https://github.com/RyanZim/universalify/issues", + "license": "MIT", + "author": "Ryan Zimmerman ", + "files": [ + "index.js" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/RyanZim/universalify.git" + }, + "scripts": { + "test": "standard && nyc --reporter text --reporter lcovonly tape test/*.js | colortape" + }, + "devDependencies": { + "colortape": "^0.1.2", + "coveralls": "^3.0.1", + "nyc": "^15.0.0", + "standard": "^14.3.1", + "tape": "^5.0.1" + }, + "engines": { + "node": ">= 10.0.0" + } +} diff --git a/@capacitor/assets/node_modules/webidl-conversions/LICENSE.md b/@capacitor/assets/node_modules/webidl-conversions/LICENSE.md new file mode 100644 index 00000000..d4a994f5 --- /dev/null +++ b/@capacitor/assets/node_modules/webidl-conversions/LICENSE.md @@ -0,0 +1,12 @@ +# The BSD 2-Clause License + +Copyright (c) 2014, Domenic Denicola +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/@capacitor/assets/node_modules/webidl-conversions/README.md b/@capacitor/assets/node_modules/webidl-conversions/README.md new file mode 100644 index 00000000..3657890a --- /dev/null +++ b/@capacitor/assets/node_modules/webidl-conversions/README.md @@ -0,0 +1,53 @@ +# WebIDL Type Conversions on JavaScript Values + +This package implements, in JavaScript, the algorithms to convert a given JavaScript value according to a given [WebIDL](http://heycam.github.io/webidl/) [type](http://heycam.github.io/webidl/#idl-types). + +The goal is that you should be able to write code like + +```js +const conversions = require("webidl-conversions"); + +function doStuff(x, y) { + x = conversions["boolean"](x); + y = conversions["unsigned long"](y); + // actual algorithm code here +} +``` + +and your function `doStuff` will behave the same as a WebIDL operation declared as + +```webidl +void doStuff(boolean x, unsigned long y); +``` + +## API + +This package's main module's default export is an object with a variety of methods, each corresponding to a different WebIDL type. Each method, when invoked on a JavaScript value, will give back the new JavaScript value that results after passing through the WebIDL conversion rules. (See below for more details on what that means.) Alternately, the method could throw an error, if the WebIDL algorithm is specified to do so: for example `conversions["float"](NaN)` [will throw a `TypeError`](http://heycam.github.io/webidl/#es-float). + +## Status + +All of the numeric types are implemented (float being implemented as double) and some others are as well - check the source for all of them. This list will grow over time in service of the [HTML as Custom Elements](https://github.com/dglazkov/html-as-custom-elements) project, but in the meantime, pull requests welcome! + +I'm not sure yet what the strategy will be for modifiers, e.g. [`[Clamp]`](http://heycam.github.io/webidl/#Clamp). Maybe something like `conversions["unsigned long"](x, { clamp: true })`? We'll see. + +We might also want to extend the API to give better error messages, e.g. "Argument 1 of HTMLMediaElement.fastSeek is not a finite floating-point value" instead of "Argument is not a finite floating-point value." This would require passing in more information to the conversion functions than we currently do. + +## Background + +What's actually going on here, conceptually, is pretty weird. Let's try to explain. + +WebIDL, as part of its madness-inducing design, has its own type system. When people write algorithms in web platform specs, they usually operate on WebIDL values, i.e. instances of WebIDL types. For example, if they were specifying the algorithm for our `doStuff` operation above, they would treat `x` as a WebIDL value of [WebIDL type `boolean`](http://heycam.github.io/webidl/#idl-boolean). Crucially, they would _not_ treat `x` as a JavaScript variable whose value is either the JavaScript `true` or `false`. They're instead working in a different type system altogether, with its own rules. + +Separately from its type system, WebIDL defines a ["binding"](http://heycam.github.io/webidl/#ecmascript-binding) of the type system into JavaScript. This contains rules like: when you pass a JavaScript value to the JavaScript method that manifests a given WebIDL operation, how does that get converted into a WebIDL value? For example, a JavaScript `true` passed in the position of a WebIDL `boolean` argument becomes a WebIDL `true`. But, a JavaScript `true` passed in the position of a [WebIDL `unsigned long`](http://heycam.github.io/webidl/#idl-unsigned-long) becomes a WebIDL `1`. And so on. + +Finally, we have the actual implementation code. This is usually C++, although these days [some smart people are using Rust](https://github.com/servo/servo). The implementation, of course, has its own type system. So when they implement the WebIDL algorithms, they don't actually use WebIDL values, since those aren't "real" outside of specs. Instead, implementations apply the WebIDL binding rules in such a way as to convert incoming JavaScript values into C++ values. For example, if code in the browser called `doStuff(true, true)`, then the implementation code would eventually receive a C++ `bool` containing `true` and a C++ `uint32_t` containing `1`. + +The upside of all this is that implementations can abstract all the conversion logic away, letting WebIDL handle it, and focus on implementing the relevant methods in C++ with values of the correct type already provided. That is payoff of WebIDL, in a nutshell. + +And getting to that payoff is the goal of _this_ project—but for JavaScript implementations, instead of C++ ones. That is, this library is designed to make it easier for JavaScript developers to write functions that behave like a given WebIDL operation. So conceptually, the conversion pipeline, which in its general form is JavaScript values ↦ WebIDL values ↦ implementation-language values, in this case becomes JavaScript values ↦ WebIDL values ↦ JavaScript values. And that intermediate step is where all the logic is performed: a JavaScript `true` becomes a WebIDL `1` in an unsigned long context, which then becomes a JavaScript `1`. + +## Don't Use This + +Seriously, why would you ever use this? You really shouldn't. WebIDL is … not great, and you shouldn't be emulating its semantics. If you're looking for a generic argument-processing library, you should find one with better rules than those from WebIDL. In general, your JavaScript should not be trying to become more like WebIDL; if anything, we should fix WebIDL to make it more like JavaScript. + +The _only_ people who should use this are those trying to create faithful implementations (or polyfills) of web platform interfaces defined in WebIDL. diff --git a/@capacitor/assets/node_modules/webidl-conversions/lib/index.js b/@capacitor/assets/node_modules/webidl-conversions/lib/index.js new file mode 100644 index 00000000..c5153a3a --- /dev/null +++ b/@capacitor/assets/node_modules/webidl-conversions/lib/index.js @@ -0,0 +1,189 @@ +"use strict"; + +var conversions = {}; +module.exports = conversions; + +function sign(x) { + return x < 0 ? -1 : 1; +} + +function evenRound(x) { + // Round x to the nearest integer, choosing the even integer if it lies halfway between two. + if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor) + return Math.floor(x); + } else { + return Math.round(x); + } +} + +function createNumberConversion(bitLength, typeOpts) { + if (!typeOpts.unsigned) { + --bitLength; + } + const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength); + const upperBound = Math.pow(2, bitLength) - 1; + + const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); + const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); + + return function(V, opts) { + if (!opts) opts = {}; + + let x = +V; + + if (opts.enforceRange) { + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite number"); + } + + x = sign(x) * Math.floor(Math.abs(x)); + if (x < lowerBound || x > upperBound) { + throw new TypeError("Argument is not in byte range"); + } + + return x; + } + + if (!isNaN(x) && opts.clamp) { + x = evenRound(x); + + if (x < lowerBound) x = lowerBound; + if (x > upperBound) x = upperBound; + return x; + } + + if (!Number.isFinite(x) || x === 0) { + return 0; + } + + x = sign(x) * Math.floor(Math.abs(x)); + x = x % moduloVal; + + if (!typeOpts.unsigned && x >= moduloBound) { + return x - moduloVal; + } else if (typeOpts.unsigned) { + if (x < 0) { + x += moduloVal; + } else if (x === -0) { // don't return negative zero + return 0; + } + } + + return x; + } +} + +conversions["void"] = function () { + return undefined; +}; + +conversions["boolean"] = function (val) { + return !!val; +}; + +conversions["byte"] = createNumberConversion(8, { unsigned: false }); +conversions["octet"] = createNumberConversion(8, { unsigned: true }); + +conversions["short"] = createNumberConversion(16, { unsigned: false }); +conversions["unsigned short"] = createNumberConversion(16, { unsigned: true }); + +conversions["long"] = createNumberConversion(32, { unsigned: false }); +conversions["unsigned long"] = createNumberConversion(32, { unsigned: true }); + +conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 }); +conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 }); + +conversions["double"] = function (V) { + const x = +V; + + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite floating-point value"); + } + + return x; +}; + +conversions["unrestricted double"] = function (V) { + const x = +V; + + if (isNaN(x)) { + throw new TypeError("Argument is NaN"); + } + + return x; +}; + +// not quite valid, but good enough for JS +conversions["float"] = conversions["double"]; +conversions["unrestricted float"] = conversions["unrestricted double"]; + +conversions["DOMString"] = function (V, opts) { + if (!opts) opts = {}; + + if (opts.treatNullAsEmptyString && V === null) { + return ""; + } + + return String(V); +}; + +conversions["ByteString"] = function (V, opts) { + const x = String(V); + let c = undefined; + for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) { + if (c > 255) { + throw new TypeError("Argument is not a valid bytestring"); + } + } + + return x; +}; + +conversions["USVString"] = function (V) { + const S = String(V); + const n = S.length; + const U = []; + for (let i = 0; i < n; ++i) { + const c = S.charCodeAt(i); + if (c < 0xD800 || c > 0xDFFF) { + U.push(String.fromCodePoint(c)); + } else if (0xDC00 <= c && c <= 0xDFFF) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + if (i === n - 1) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + const d = S.charCodeAt(i + 1); + if (0xDC00 <= d && d <= 0xDFFF) { + const a = c & 0x3FF; + const b = d & 0x3FF; + U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b)); + ++i; + } else { + U.push(String.fromCodePoint(0xFFFD)); + } + } + } + } + + return U.join(''); +}; + +conversions["Date"] = function (V, opts) { + if (!(V instanceof Date)) { + throw new TypeError("Argument is not a Date object"); + } + if (isNaN(V)) { + return undefined; + } + + return V; +}; + +conversions["RegExp"] = function (V, opts) { + if (!(V instanceof RegExp)) { + V = new RegExp(V); + } + + return V; +}; diff --git a/@capacitor/assets/node_modules/webidl-conversions/package.json b/@capacitor/assets/node_modules/webidl-conversions/package.json new file mode 100644 index 00000000..c31bc074 --- /dev/null +++ b/@capacitor/assets/node_modules/webidl-conversions/package.json @@ -0,0 +1,23 @@ +{ + "name": "webidl-conversions", + "version": "3.0.1", + "description": "Implements the WebIDL algorithms for converting to and from JavaScript values", + "main": "lib/index.js", + "scripts": { + "test": "mocha test/*.js" + }, + "repository": "jsdom/webidl-conversions", + "keywords": [ + "webidl", + "web", + "types" + ], + "files": [ + "lib/" + ], + "author": "Domenic Denicola (https://domenic.me/)", + "license": "BSD-2-Clause", + "devDependencies": { + "mocha": "^1.21.4" + } +} diff --git a/@capacitor/assets/node_modules/whatwg-url/LICENSE.txt b/@capacitor/assets/node_modules/whatwg-url/LICENSE.txt new file mode 100644 index 00000000..54dfac39 --- /dev/null +++ b/@capacitor/assets/node_modules/whatwg-url/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015–2016 Sebastian Mayr + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/@capacitor/assets/node_modules/whatwg-url/README.md b/@capacitor/assets/node_modules/whatwg-url/README.md new file mode 100644 index 00000000..4347a7fc --- /dev/null +++ b/@capacitor/assets/node_modules/whatwg-url/README.md @@ -0,0 +1,67 @@ +# whatwg-url + +whatwg-url is a full implementation of the WHATWG [URL Standard](https://url.spec.whatwg.org/). It can be used standalone, but it also exposes a lot of the internal algorithms that are useful for integrating a URL parser into a project like [jsdom](https://github.com/tmpvar/jsdom). + +## Current Status + +whatwg-url is currently up to date with the URL spec up to commit [a62223](https://github.com/whatwg/url/commit/a622235308342c9adc7fc2fd1659ff059f7d5e2a). + +## API + +### The `URL` Constructor + +The main API is the [`URL`](https://url.spec.whatwg.org/#url) export, which follows the spec's behavior in all ways (including e.g. `USVString` conversion). Most consumers of this library will want to use this. + +### Low-level URL Standard API + +The following methods are exported for use by places like jsdom that need to implement things like [`HTMLHyperlinkElementUtils`](https://html.spec.whatwg.org/#htmlhyperlinkelementutils). They operate on or return an "internal URL" or ["URL record"](https://url.spec.whatwg.org/#concept-url) type. + +- [URL parser](https://url.spec.whatwg.org/#concept-url-parser): `parseURL(input, { baseURL, encodingOverride })` +- [Basic URL parser](https://url.spec.whatwg.org/#concept-basic-url-parser): `basicURLParse(input, { baseURL, encodingOverride, url, stateOverride })` +- [URL serializer](https://url.spec.whatwg.org/#concept-url-serializer): `serializeURL(urlRecord, excludeFragment)` +- [Host serializer](https://url.spec.whatwg.org/#concept-host-serializer): `serializeHost(hostFromURLRecord)` +- [Serialize an integer](https://url.spec.whatwg.org/#serialize-an-integer): `serializeInteger(number)` +- [Origin](https://url.spec.whatwg.org/#concept-url-origin) [serializer](https://html.spec.whatwg.org/multipage/browsers.html#serialization-of-an-origin): `serializeURLOrigin(urlRecord)` +- [Set the username](https://url.spec.whatwg.org/#set-the-username): `setTheUsername(urlRecord, usernameString)` +- [Set the password](https://url.spec.whatwg.org/#set-the-password): `setThePassword(urlRecord, passwordString)` +- [Cannot have a username/password/port](https://url.spec.whatwg.org/#cannot-have-a-username-password-port): `cannotHaveAUsernamePasswordPort(urlRecord)` + +The `stateOverride` parameter is one of the following strings: + +- [`"scheme start"`](https://url.spec.whatwg.org/#scheme-start-state) +- [`"scheme"`](https://url.spec.whatwg.org/#scheme-state) +- [`"no scheme"`](https://url.spec.whatwg.org/#no-scheme-state) +- [`"special relative or authority"`](https://url.spec.whatwg.org/#special-relative-or-authority-state) +- [`"path or authority"`](https://url.spec.whatwg.org/#path-or-authority-state) +- [`"relative"`](https://url.spec.whatwg.org/#relative-state) +- [`"relative slash"`](https://url.spec.whatwg.org/#relative-slash-state) +- [`"special authority slashes"`](https://url.spec.whatwg.org/#special-authority-slashes-state) +- [`"special authority ignore slashes"`](https://url.spec.whatwg.org/#special-authority-ignore-slashes-state) +- [`"authority"`](https://url.spec.whatwg.org/#authority-state) +- [`"host"`](https://url.spec.whatwg.org/#host-state) +- [`"hostname"`](https://url.spec.whatwg.org/#hostname-state) +- [`"port"`](https://url.spec.whatwg.org/#port-state) +- [`"file"`](https://url.spec.whatwg.org/#file-state) +- [`"file slash"`](https://url.spec.whatwg.org/#file-slash-state) +- [`"file host"`](https://url.spec.whatwg.org/#file-host-state) +- [`"path start"`](https://url.spec.whatwg.org/#path-start-state) +- [`"path"`](https://url.spec.whatwg.org/#path-state) +- [`"cannot-be-a-base-URL path"`](https://url.spec.whatwg.org/#cannot-be-a-base-url-path-state) +- [`"query"`](https://url.spec.whatwg.org/#query-state) +- [`"fragment"`](https://url.spec.whatwg.org/#fragment-state) + +The URL record type has the following API: + +- [`scheme`](https://url.spec.whatwg.org/#concept-url-scheme) +- [`username`](https://url.spec.whatwg.org/#concept-url-username) +- [`password`](https://url.spec.whatwg.org/#concept-url-password) +- [`host`](https://url.spec.whatwg.org/#concept-url-host) +- [`port`](https://url.spec.whatwg.org/#concept-url-port) +- [`path`](https://url.spec.whatwg.org/#concept-url-path) (as an array) +- [`query`](https://url.spec.whatwg.org/#concept-url-query) +- [`fragment`](https://url.spec.whatwg.org/#concept-url-fragment) +- [`cannotBeABaseURL`](https://url.spec.whatwg.org/#url-cannot-be-a-base-url-flag) (as a boolean) + +These properties should be treated with care, as in general changing them will cause the URL record to be in an inconsistent state until the appropriate invocation of `basicURLParse` is used to fix it up. You can see examples of this in the URL Standard, where there are many step sequences like "4. Set context object’s url’s fragment to the empty string. 5. Basic URL parse _input_ with context object’s url as _url_ and fragment state as _state override_." In between those two steps, a URL record is in an unusable state. + +The return value of "failure" in the spec is represented by the string `"failure"`. That is, functions like `parseURL` and `basicURLParse` can return _either_ a URL record _or_ the string `"failure"`. diff --git a/@capacitor/assets/node_modules/whatwg-url/lib/URL-impl.js b/@capacitor/assets/node_modules/whatwg-url/lib/URL-impl.js new file mode 100644 index 00000000..dc7452cc --- /dev/null +++ b/@capacitor/assets/node_modules/whatwg-url/lib/URL-impl.js @@ -0,0 +1,200 @@ +"use strict"; +const usm = require("./url-state-machine"); + +exports.implementation = class URLImpl { + constructor(constructorArgs) { + const url = constructorArgs[0]; + const base = constructorArgs[1]; + + let parsedBase = null; + if (base !== undefined) { + parsedBase = usm.basicURLParse(base); + if (parsedBase === "failure") { + throw new TypeError("Invalid base URL"); + } + } + + const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase }); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + + // TODO: query stuff + } + + get href() { + return usm.serializeURL(this._url); + } + + set href(v) { + const parsedURL = usm.basicURLParse(v); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + } + + get origin() { + return usm.serializeURLOrigin(this._url); + } + + get protocol() { + return this._url.scheme + ":"; + } + + set protocol(v) { + usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" }); + } + + get username() { + return this._url.username; + } + + set username(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setTheUsername(this._url, v); + } + + get password() { + return this._url.password; + } + + set password(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setThePassword(this._url, v); + } + + get host() { + const url = this._url; + + if (url.host === null) { + return ""; + } + + if (url.port === null) { + return usm.serializeHost(url.host); + } + + return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port); + } + + set host(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "host" }); + } + + get hostname() { + if (this._url.host === null) { + return ""; + } + + return usm.serializeHost(this._url.host); + } + + set hostname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" }); + } + + get port() { + if (this._url.port === null) { + return ""; + } + + return usm.serializeInteger(this._url.port); + } + + set port(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + if (v === "") { + this._url.port = null; + } else { + usm.basicURLParse(v, { url: this._url, stateOverride: "port" }); + } + } + + get pathname() { + if (this._url.cannotBeABaseURL) { + return this._url.path[0]; + } + + if (this._url.path.length === 0) { + return ""; + } + + return "/" + this._url.path.join("/"); + } + + set pathname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + this._url.path = []; + usm.basicURLParse(v, { url: this._url, stateOverride: "path start" }); + } + + get search() { + if (this._url.query === null || this._url.query === "") { + return ""; + } + + return "?" + this._url.query; + } + + set search(v) { + // TODO: query stuff + + const url = this._url; + + if (v === "") { + url.query = null; + return; + } + + const input = v[0] === "?" ? v.substring(1) : v; + url.query = ""; + usm.basicURLParse(input, { url, stateOverride: "query" }); + } + + get hash() { + if (this._url.fragment === null || this._url.fragment === "") { + return ""; + } + + return "#" + this._url.fragment; + } + + set hash(v) { + if (v === "") { + this._url.fragment = null; + return; + } + + const input = v[0] === "#" ? v.substring(1) : v; + this._url.fragment = ""; + usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" }); + } + + toJSON() { + return this.href; + } +}; diff --git a/@capacitor/assets/node_modules/whatwg-url/lib/URL.js b/@capacitor/assets/node_modules/whatwg-url/lib/URL.js new file mode 100644 index 00000000..78c7207e --- /dev/null +++ b/@capacitor/assets/node_modules/whatwg-url/lib/URL.js @@ -0,0 +1,196 @@ +"use strict"; + +const conversions = require("webidl-conversions"); +const utils = require("./utils.js"); +const Impl = require(".//URL-impl.js"); + +const impl = utils.implSymbol; + +function URL(url) { + if (!this || this[impl] || !(this instanceof URL)) { + throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function."); + } + if (arguments.length < 1) { + throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present."); + } + const args = []; + for (let i = 0; i < arguments.length && i < 2; ++i) { + args[i] = arguments[i]; + } + args[0] = conversions["USVString"](args[0]); + if (args[1] !== undefined) { + args[1] = conversions["USVString"](args[1]); + } + + module.exports.setup(this, args); +} + +URL.prototype.toJSON = function toJSON() { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + const args = []; + for (let i = 0; i < arguments.length && i < 0; ++i) { + args[i] = arguments[i]; + } + return this[impl].toJSON.apply(this[impl], args); +}; +Object.defineProperty(URL.prototype, "href", { + get() { + return this[impl].href; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].href = V; + }, + enumerable: true, + configurable: true +}); + +URL.prototype.toString = function () { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + return this.href; +}; + +Object.defineProperty(URL.prototype, "origin", { + get() { + return this[impl].origin; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "protocol", { + get() { + return this[impl].protocol; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].protocol = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "username", { + get() { + return this[impl].username; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].username = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "password", { + get() { + return this[impl].password; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].password = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "host", { + get() { + return this[impl].host; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].host = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hostname", { + get() { + return this[impl].hostname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hostname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "port", { + get() { + return this[impl].port; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].port = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "pathname", { + get() { + return this[impl].pathname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].pathname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "search", { + get() { + return this[impl].search; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].search = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hash", { + get() { + return this[impl].hash; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hash = V; + }, + enumerable: true, + configurable: true +}); + + +module.exports = { + is(obj) { + return !!obj && obj[impl] instanceof Impl.implementation; + }, + create(constructorArgs, privateData) { + let obj = Object.create(URL.prototype); + this.setup(obj, constructorArgs, privateData); + return obj; + }, + setup(obj, constructorArgs, privateData) { + if (!privateData) privateData = {}; + privateData.wrapper = obj; + + obj[impl] = new Impl.implementation(constructorArgs, privateData); + obj[impl][utils.wrapperSymbol] = obj; + }, + interface: URL, + expose: { + Window: { URL: URL }, + Worker: { URL: URL } + } +}; + diff --git a/@capacitor/assets/node_modules/whatwg-url/lib/public-api.js b/@capacitor/assets/node_modules/whatwg-url/lib/public-api.js new file mode 100644 index 00000000..932dcada --- /dev/null +++ b/@capacitor/assets/node_modules/whatwg-url/lib/public-api.js @@ -0,0 +1,11 @@ +"use strict"; + +exports.URL = require("./URL").interface; +exports.serializeURL = require("./url-state-machine").serializeURL; +exports.serializeURLOrigin = require("./url-state-machine").serializeURLOrigin; +exports.basicURLParse = require("./url-state-machine").basicURLParse; +exports.setTheUsername = require("./url-state-machine").setTheUsername; +exports.setThePassword = require("./url-state-machine").setThePassword; +exports.serializeHost = require("./url-state-machine").serializeHost; +exports.serializeInteger = require("./url-state-machine").serializeInteger; +exports.parseURL = require("./url-state-machine").parseURL; diff --git a/@capacitor/assets/node_modules/whatwg-url/lib/url-state-machine.js b/@capacitor/assets/node_modules/whatwg-url/lib/url-state-machine.js new file mode 100644 index 00000000..27d977a2 --- /dev/null +++ b/@capacitor/assets/node_modules/whatwg-url/lib/url-state-machine.js @@ -0,0 +1,1297 @@ +"use strict"; +const punycode = require("punycode"); +const tr46 = require("tr46"); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; diff --git a/@capacitor/assets/node_modules/whatwg-url/lib/utils.js b/@capacitor/assets/node_modules/whatwg-url/lib/utils.js new file mode 100644 index 00000000..a562009c --- /dev/null +++ b/@capacitor/assets/node_modules/whatwg-url/lib/utils.js @@ -0,0 +1,20 @@ +"use strict"; + +module.exports.mixin = function mixin(target, source) { + const keys = Object.getOwnPropertyNames(source); + for (let i = 0; i < keys.length; ++i) { + Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); + } +}; + +module.exports.wrapperSymbol = Symbol("wrapper"); +module.exports.implSymbol = Symbol("impl"); + +module.exports.wrapperForImpl = function (impl) { + return impl[module.exports.wrapperSymbol]; +}; + +module.exports.implForWrapper = function (wrapper) { + return wrapper[module.exports.implSymbol]; +}; + diff --git a/@capacitor/assets/node_modules/whatwg-url/package.json b/@capacitor/assets/node_modules/whatwg-url/package.json new file mode 100644 index 00000000..fce35ae7 --- /dev/null +++ b/@capacitor/assets/node_modules/whatwg-url/package.json @@ -0,0 +1,32 @@ +{ + "name": "whatwg-url", + "version": "5.0.0", + "description": "An implementation of the WHATWG URL Standard's URL API and parsing machinery", + "main": "lib/public-api.js", + "files": [ + "lib/" + ], + "author": "Sebastian Mayr ", + "license": "MIT", + "repository": "jsdom/whatwg-url", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + }, + "devDependencies": { + "eslint": "^2.6.0", + "istanbul": "~0.4.3", + "mocha": "^2.2.4", + "recast": "~0.10.29", + "request": "^2.55.0", + "webidl2js": "^3.0.2" + }, + "scripts": { + "build": "node scripts/transform.js && node scripts/convert-idl.js", + "coverage": "istanbul cover node_modules/mocha/bin/_mocha", + "lint": "eslint .", + "prepublish": "npm run build", + "pretest": "node scripts/get-latest-platform-tests.js && npm run build", + "test": "mocha" + } +} diff --git a/@capacitor/assets/node_modules/xml2js/LICENSE b/@capacitor/assets/node_modules/xml2js/LICENSE new file mode 100644 index 00000000..e3b4222a --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/LICENSE @@ -0,0 +1,19 @@ +Copyright 2010, 2011, 2012, 2013. All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to +deal in the Software without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +sell copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +IN THE SOFTWARE. diff --git a/@capacitor/assets/node_modules/xml2js/README.md b/@capacitor/assets/node_modules/xml2js/README.md new file mode 100644 index 00000000..67f2104a --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/README.md @@ -0,0 +1,507 @@ +node-xml2js +=========== + +Ever had the urge to parse XML? And wanted to access the data in some sane, +easy way? Don't want to compile a C parser, for whatever reason? Then xml2js is +what you're looking for! + +Description +=========== + +Simple XML to JavaScript object converter. It supports bi-directional conversion. +Uses [sax-js](https://github.com/isaacs/sax-js/) and +[xmlbuilder-js](https://github.com/oozcitak/xmlbuilder-js/). + +Note: If you're looking for a full DOM parser, you probably want +[JSDom](https://github.com/tmpvar/jsdom). + +Installation +============ + +Simplest way to install `xml2js` is to use [npm](http://npmjs.org), just `npm +install xml2js` which will download xml2js and all dependencies. + +xml2js is also available via [Bower](http://bower.io/), just `bower install +xml2js` which will download xml2js and all dependencies. + +Usage +===== + +No extensive tutorials required because you are a smart developer! The task of +parsing XML should be an easy one, so let's make it so! Here's some examples. + +Shoot-and-forget usage +---------------------- + +You want to parse XML as simple and easy as possible? It's dangerous to go +alone, take this: + +```javascript +var parseString = require('xml2js').parseString; +var xml = "Hello xml2js!" +parseString(xml, function (err, result) { + console.dir(result); +}); +``` + +Can't get easier than this, right? This works starting with `xml2js` 0.2.3. +With CoffeeScript it looks like this: + +```coffeescript +{parseString} = require 'xml2js' +xml = "Hello xml2js!" +parseString xml, (err, result) -> + console.dir result +``` + +If you need some special options, fear not, `xml2js` supports a number of +options (see below), you can specify these as second argument: + +```javascript +parseString(xml, {trim: true}, function (err, result) { +}); +``` + +Simple as pie usage +------------------- + +That's right, if you have been using xml-simple or a home-grown +wrapper, this was added in 0.1.11 just for you: + +```javascript +var fs = require('fs'), + xml2js = require('xml2js'); + +var parser = new xml2js.Parser(); +fs.readFile(__dirname + '/foo.xml', function(err, data) { + parser.parseString(data, function (err, result) { + console.dir(result); + console.log('Done'); + }); +}); +``` + +Look ma, no event listeners! + +You can also use `xml2js` from +[CoffeeScript](https://github.com/jashkenas/coffeescript), further reducing +the clutter: + +```coffeescript +fs = require 'fs', +xml2js = require 'xml2js' + +parser = new xml2js.Parser() +fs.readFile __dirname + '/foo.xml', (err, data) -> + parser.parseString data, (err, result) -> + console.dir result + console.log 'Done.' +``` + +But what happens if you forget the `new` keyword to create a new `Parser`? In +the middle of a nightly coding session, it might get lost, after all. Worry +not, we got you covered! Starting with 0.2.8 you can also leave it out, in +which case `xml2js` will helpfully add it for you, no bad surprises and +inexplicable bugs! + +Promise usage +------------- + +```javascript +var xml2js = require('xml2js'); +var xml = ''; + +// With parser +var parser = new xml2js.Parser(/* options */); +parser.parseStringPromise(xml).then(function (result) { + console.dir(result); + console.log('Done'); +}) +.catch(function (err) { + // Failed +}); + +// Without parser +xml2js.parseStringPromise(xml /*, options */).then(function (result) { + console.dir(result); + console.log('Done'); +}) +.catch(function (err) { + // Failed +}); +``` + +Parsing multiple files +---------------------- + +If you want to parse multiple files, you have multiple possibilities: + + * You can create one `xml2js.Parser` per file. That's the recommended one + and is promised to always *just work*. + * You can call `reset()` on your parser object. + * You can hope everything goes well anyway. This behaviour is not + guaranteed work always, if ever. Use option #1 if possible. Thanks! + +So you wanna some JSON? +----------------------- + +Just wrap the `result` object in a call to `JSON.stringify` like this +`JSON.stringify(result)`. You get a string containing the JSON representation +of the parsed object that you can feed to JSON-hungry consumers. + +Displaying results +------------------ + +You might wonder why, using `console.dir` or `console.log` the output at some +level is only `[Object]`. Don't worry, this is not because `xml2js` got lazy. +That's because Node uses `util.inspect` to convert the object into strings and +that function stops after `depth=2` which is a bit low for most XML. + +To display the whole deal, you can use `console.log(util.inspect(result, false, +null))`, which displays the whole result. + +So much for that, but what if you use +[eyes](https://github.com/cloudhead/eyes.js) for nice colored output and it +truncates the output with `…`? Don't fear, there's also a solution for that, +you just need to increase the `maxLength` limit by creating a custom inspector +`var inspect = require('eyes').inspector({maxLength: false})` and then you can +easily `inspect(result)`. + +XML builder usage +----------------- + +Since 0.4.0, objects can be also be used to build XML: + +```javascript +var xml2js = require('xml2js'); + +var obj = {name: "Super", Surname: "Man", age: 23}; + +var builder = new xml2js.Builder(); +var xml = builder.buildObject(obj); +``` +will result in: + +```xml + + + Super + Man + 23 + +``` + +At the moment, a one to one bi-directional conversion is guaranteed only for +default configuration, except for `attrkey`, `charkey` and `explicitArray` options +you can redefine to your taste. Writing CDATA is supported via setting the `cdata` +option to `true`. + +To specify attributes: +```javascript +var xml2js = require('xml2js'); + +var obj = {root: {$: {id: "my id"}, _: "my inner text"}}; + +var builder = new xml2js.Builder(); +var xml = builder.buildObject(obj); +``` +will result in: +```xml + +my inner text +``` + +### Adding xmlns attributes + +You can generate XML that declares XML namespace prefix / URI pairs with xmlns attributes. + +Example declaring a default namespace on the root element: + +```javascript +let obj = { + Foo: { + $: { + "xmlns": "http://foo.com" + } + } +}; +``` +Result of `buildObject(obj)`: +```xml + +``` +Example declaring non-default namespaces on non-root elements: +```javascript +let obj = { + 'foo:Foo': { + $: { + 'xmlns:foo': 'http://foo.com' + }, + 'bar:Bar': { + $: { + 'xmlns:bar': 'http://bar.com' + } + } + } +} +``` +Result of `buildObject(obj)`: +```xml + + + +``` + + +Processing attribute, tag names and values +------------------------------------------ + +Since 0.4.1 you can optionally provide the parser with attribute name and tag name processors as well as element value processors (Since 0.4.14, you can also optionally provide the parser with attribute value processors): + +```javascript + +function nameToUpperCase(name){ + return name.toUpperCase(); +} + +//transform all attribute and tag names and values to uppercase +parseString(xml, { + tagNameProcessors: [nameToUpperCase], + attrNameProcessors: [nameToUpperCase], + valueProcessors: [nameToUpperCase], + attrValueProcessors: [nameToUpperCase]}, + function (err, result) { + // processed data +}); +``` + +The `tagNameProcessors` and `attrNameProcessors` options +accept an `Array` of functions with the following signature: + +```javascript +function (name){ + //do something with `name` + return name +} +``` + +The `attrValueProcessors` and `valueProcessors` options +accept an `Array` of functions with the following signature: + +```javascript +function (value, name) { + //`name` will be the node name or attribute name + //do something with `value`, (optionally) dependent on the node/attr name + return value +} +``` + +Some processors are provided out-of-the-box and can be found in `lib/processors.js`: + +- `normalize`: transforms the name to lowercase. +(Automatically used when `options.normalize` is set to `true`) + +- `firstCharLowerCase`: transforms the first character to lower case. +E.g. 'MyTagName' becomes 'myTagName' + +- `stripPrefix`: strips the xml namespace prefix. E.g `` will become 'Bar'. +(N.B.: the `xmlns` prefix is NOT stripped.) + +- `parseNumbers`: parses integer-like strings as integers and float-like strings as floats +E.g. "0" becomes 0 and "15.56" becomes 15.56 + +- `parseBooleans`: parses boolean-like strings to booleans +E.g. "true" becomes true and "False" becomes false + +Options +======= + +Apart from the default settings, there are a number of options that can be +specified for the parser. Options are specified by ``new Parser({optionName: +value})``. Possible options are: + + * `attrkey` (default: `$`): Prefix that is used to access the attributes. + Version 0.1 default was `@`. + * `charkey` (default: `_`): Prefix that is used to access the character + content. Version 0.1 default was `#`. + * `explicitCharkey` (default: `false`) Determines whether or not to use + a `charkey` prefix for elements with no attributes. + * `trim` (default: `false`): Trim the whitespace at the beginning and end of + text nodes. + * `normalizeTags` (default: `false`): Normalize all tag names to lowercase. + * `normalize` (default: `false`): Trim whitespaces inside text nodes. + * `explicitRoot` (default: `true`): Set this if you want to get the root + node in the resulting object. + * `emptyTag` (default: `''`): what will the value of empty nodes be. In case + you want to use an empty object as a default value, it is better to provide a factory + function `() => ({})` instead. Without this function a plain object would + become a shared reference across all occurrences with unwanted behavior. + * `explicitArray` (default: `true`): Always put child nodes in an array if + true; otherwise an array is created only if there is more than one. + * `ignoreAttrs` (default: `false`): Ignore all XML attributes and only create + text nodes. + * `mergeAttrs` (default: `false`): Merge attributes and child elements as + properties of the parent, instead of keying attributes off a child + attribute object. This option is ignored if `ignoreAttrs` is `true`. + * `validator` (default `null`): You can specify a callable that validates + the resulting structure somehow, however you want. See unit tests + for an example. + * `xmlns` (default `false`): Give each element a field usually called '$ns' + (the first character is the same as attrkey) that contains its local name + and namespace URI. + * `explicitChildren` (default `false`): Put child elements to separate + property. Doesn't work with `mergeAttrs = true`. If element has no children + then "children" won't be created. Added in 0.2.5. + * `childkey` (default `$$`): Prefix that is used to access child elements if + `explicitChildren` is set to `true`. Added in 0.2.5. + * `preserveChildrenOrder` (default `false`): Modifies the behavior of + `explicitChildren` so that the value of the "children" property becomes an + ordered array. When this is `true`, every node will also get a `#name` field + whose value will correspond to the XML nodeName, so that you may iterate + the "children" array and still be able to determine node names. The named + (and potentially unordered) properties are also retained in this + configuration at the same level as the ordered "children" array. Added in + 0.4.9. + * `charsAsChildren` (default `false`): Determines whether chars should be + considered children if `explicitChildren` is on. Added in 0.2.5. + * `includeWhiteChars` (default `false`): Determines whether whitespace-only + text nodes should be included. Added in 0.4.17. + * `async` (default `false`): Should the callbacks be async? This *might* be + an incompatible change if your code depends on sync execution of callbacks. + Future versions of `xml2js` might change this default, so the recommendation + is to not depend on sync execution anyway. Added in 0.2.6. + * `strict` (default `true`): Set sax-js to strict or non-strict parsing mode. + Defaults to `true` which is *highly* recommended, since parsing HTML which + is not well-formed XML might yield just about anything. Added in 0.2.7. + * `attrNameProcessors` (default: `null`): Allows the addition of attribute + name processing functions. Accepts an `Array` of functions with following + signature: + ```javascript + function (name){ + //do something with `name` + return name + } + ``` + Added in 0.4.14 + * `attrValueProcessors` (default: `null`): Allows the addition of attribute + value processing functions. Accepts an `Array` of functions with following + signature: + ```javascript + function (value, name){ + //do something with `name` + return name + } + ``` + Added in 0.4.1 + * `tagNameProcessors` (default: `null`): Allows the addition of tag name + processing functions. Accepts an `Array` of functions with following + signature: + ```javascript + function (name){ + //do something with `name` + return name + } + ``` + Added in 0.4.1 + * `valueProcessors` (default: `null`): Allows the addition of element value + processing functions. Accepts an `Array` of functions with following + signature: + ```javascript + function (value, name){ + //do something with `name` + return name + } + ``` + Added in 0.4.6 + +Options for the `Builder` class +------------------------------- +These options are specified by ``new Builder({optionName: value})``. +Possible options are: + + * `attrkey` (default: `$`): Prefix that is used to access the attributes. + Version 0.1 default was `@`. + * `charkey` (default: `_`): Prefix that is used to access the character + content. Version 0.1 default was `#`. + * `rootName` (default `root` or the root key name): root element name to be used in case + `explicitRoot` is `false` or to override the root element name. + * `renderOpts` (default `{ 'pretty': true, 'indent': ' ', 'newline': '\n' }`): + Rendering options for xmlbuilder-js. + * pretty: prettify generated XML + * indent: whitespace for indentation (only when pretty) + * newline: newline char (only when pretty) + * `xmldec` (default `{ 'version': '1.0', 'encoding': 'UTF-8', 'standalone': true }`: + XML declaration attributes. + * `xmldec.version` A version number string, e.g. 1.0 + * `xmldec.encoding` Encoding declaration, e.g. UTF-8 + * `xmldec.standalone` standalone document declaration: true or false + * `doctype` (default `null`): optional DTD. Eg. `{'ext': 'hello.dtd'}` + * `headless` (default: `false`): omit the XML header. Added in 0.4.3. + * `allowSurrogateChars` (default: `false`): allows using characters from the Unicode + surrogate blocks. + * `cdata` (default: `false`): wrap text nodes in `` instead of + escaping when necessary. Does not add `` if it is not required. + Added in 0.4.5. + +`renderOpts`, `xmldec`,`doctype` and `headless` pass through to +[xmlbuilder-js](https://github.com/oozcitak/xmlbuilder-js). + +Updating to new version +======================= + +Version 0.2 changed the default parsing settings, but version 0.1.14 introduced +the default settings for version 0.2, so these settings can be tried before the +migration. + +```javascript +var xml2js = require('xml2js'); +var parser = new xml2js.Parser(xml2js.defaults["0.2"]); +``` + +To get the 0.1 defaults in version 0.2 you can just use +`xml2js.defaults["0.1"]` in the same place. This provides you with enough time +to migrate to the saner way of parsing in `xml2js` 0.2. We try to make the +migration as simple and gentle as possible, but some breakage cannot be +avoided. + +So, what exactly did change and why? In 0.2 we changed some defaults to parse +the XML in a more universal and sane way. So we disabled `normalize` and `trim` +so `xml2js` does not cut out any text content. You can reenable this at will of +course. A more important change is that we return the root tag in the resulting +JavaScript structure via the `explicitRoot` setting, so you need to access the +first element. This is useful for anybody who wants to know what the root node +is and preserves more information. The last major change was to enable +`explicitArray`, so everytime it is possible that one might embed more than one +sub-tag into a tag, xml2js >= 0.2 returns an array even if the array just +includes one element. This is useful when dealing with APIs that return +variable amounts of subtags. + +Running tests, development +========================== + +[![Build Status](https://travis-ci.org/Leonidas-from-XIV/node-xml2js.svg?branch=master)](https://travis-ci.org/Leonidas-from-XIV/node-xml2js) +[![Coverage Status](https://coveralls.io/repos/Leonidas-from-XIV/node-xml2js/badge.svg?branch=)](https://coveralls.io/r/Leonidas-from-XIV/node-xml2js?branch=master) +[![Dependency Status](https://david-dm.org/Leonidas-from-XIV/node-xml2js.svg)](https://david-dm.org/Leonidas-from-XIV/node-xml2js) + +The development requirements are handled by npm, you just need to install them. +We also have a number of unit tests, they can be run using `npm test` directly +from the project root. This runs zap to discover all the tests and execute +them. + +If you like to contribute, keep in mind that `xml2js` is written in +CoffeeScript, so don't develop on the JavaScript files that are checked into +the repository for convenience reasons. Also, please write some unit test to +check your behaviour and if it is some user-facing thing, add some +documentation to this README, so people will know it exists. Thanks in advance! + +Getting support +=============== + +Please, if you have a problem with the library, first make sure you read this +README. If you read this far, thanks, you're good. Then, please make sure your +problem really is with `xml2js`. It is? Okay, then I'll look at it. Send me a +mail and we can talk. Please don't open issues, as I don't think that is the +proper forum for support problems. Some problems might as well really be bugs +in `xml2js`, if so I'll let you know to open an issue instead :) + +But if you know you really found a bug, feel free to open an issue instead. diff --git a/@capacitor/assets/node_modules/xml2js/lib/bom.js b/@capacitor/assets/node_modules/xml2js/lib/bom.js new file mode 100644 index 00000000..7b8fb27b --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/lib/bom.js @@ -0,0 +1,12 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + "use strict"; + exports.stripBOM = function(str) { + if (str[0] === '\uFEFF') { + return str.substring(1); + } else { + return str; + } + }; + +}).call(this); diff --git a/@capacitor/assets/node_modules/xml2js/lib/builder.js b/@capacitor/assets/node_modules/xml2js/lib/builder.js new file mode 100644 index 00000000..58f36384 --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/lib/builder.js @@ -0,0 +1,127 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + "use strict"; + var builder, defaults, escapeCDATA, requiresCDATA, wrapCDATA, + hasProp = {}.hasOwnProperty; + + builder = require('xmlbuilder'); + + defaults = require('./defaults').defaults; + + requiresCDATA = function(entry) { + return typeof entry === "string" && (entry.indexOf('&') >= 0 || entry.indexOf('>') >= 0 || entry.indexOf('<') >= 0); + }; + + wrapCDATA = function(entry) { + return ""; + }; + + escapeCDATA = function(entry) { + return entry.replace(']]>', ']]]]>'); + }; + + exports.Builder = (function() { + function Builder(opts) { + var key, ref, value; + this.options = {}; + ref = defaults["0.2"]; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this.options[key] = value; + } + for (key in opts) { + if (!hasProp.call(opts, key)) continue; + value = opts[key]; + this.options[key] = value; + } + } + + Builder.prototype.buildObject = function(rootObj) { + var attrkey, charkey, render, rootElement, rootName; + attrkey = this.options.attrkey; + charkey = this.options.charkey; + if ((Object.keys(rootObj).length === 1) && (this.options.rootName === defaults['0.2'].rootName)) { + rootName = Object.keys(rootObj)[0]; + rootObj = rootObj[rootName]; + } else { + rootName = this.options.rootName; + } + render = (function(_this) { + return function(element, obj) { + var attr, child, entry, index, key, value; + if (typeof obj !== 'object') { + if (_this.options.cdata && requiresCDATA(obj)) { + element.raw(wrapCDATA(obj)); + } else { + element.txt(obj); + } + } else if (Array.isArray(obj)) { + for (index in obj) { + if (!hasProp.call(obj, index)) continue; + child = obj[index]; + for (key in child) { + entry = child[key]; + element = render(element.ele(key), entry).up(); + } + } + } else { + for (key in obj) { + if (!hasProp.call(obj, key)) continue; + child = obj[key]; + if (key === attrkey) { + if (typeof child === "object") { + for (attr in child) { + value = child[attr]; + element = element.att(attr, value); + } + } + } else if (key === charkey) { + if (_this.options.cdata && requiresCDATA(child)) { + element = element.raw(wrapCDATA(child)); + } else { + element = element.txt(child); + } + } else if (Array.isArray(child)) { + for (index in child) { + if (!hasProp.call(child, index)) continue; + entry = child[index]; + if (typeof entry === 'string') { + if (_this.options.cdata && requiresCDATA(entry)) { + element = element.ele(key).raw(wrapCDATA(entry)).up(); + } else { + element = element.ele(key, entry).up(); + } + } else { + element = render(element.ele(key), entry).up(); + } + } + } else if (typeof child === "object") { + element = render(element.ele(key), child).up(); + } else { + if (typeof child === 'string' && _this.options.cdata && requiresCDATA(child)) { + element = element.ele(key).raw(wrapCDATA(child)).up(); + } else { + if (child == null) { + child = ''; + } + element = element.ele(key, child.toString()).up(); + } + } + } + } + return element; + }; + })(this); + rootElement = builder.create(rootName, this.options.xmldec, this.options.doctype, { + headless: this.options.headless, + allowSurrogateChars: this.options.allowSurrogateChars + }); + return render(rootElement, rootObj).end(this.options.renderOpts); + }; + + return Builder; + + })(); + +}).call(this); diff --git a/@capacitor/assets/node_modules/xml2js/lib/defaults.js b/@capacitor/assets/node_modules/xml2js/lib/defaults.js new file mode 100644 index 00000000..0a21da0a --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/lib/defaults.js @@ -0,0 +1,72 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + exports.defaults = { + "0.1": { + explicitCharkey: false, + trim: true, + normalize: true, + normalizeTags: false, + attrkey: "@", + charkey: "#", + explicitArray: false, + ignoreAttrs: false, + mergeAttrs: false, + explicitRoot: false, + validator: null, + xmlns: false, + explicitChildren: false, + childkey: '@@', + charsAsChildren: false, + includeWhiteChars: false, + async: false, + strict: true, + attrNameProcessors: null, + attrValueProcessors: null, + tagNameProcessors: null, + valueProcessors: null, + emptyTag: '' + }, + "0.2": { + explicitCharkey: false, + trim: false, + normalize: false, + normalizeTags: false, + attrkey: "$", + charkey: "_", + explicitArray: true, + ignoreAttrs: false, + mergeAttrs: false, + explicitRoot: true, + validator: null, + xmlns: false, + explicitChildren: false, + preserveChildrenOrder: false, + childkey: '$$', + charsAsChildren: false, + includeWhiteChars: false, + async: false, + strict: true, + attrNameProcessors: null, + attrValueProcessors: null, + tagNameProcessors: null, + valueProcessors: null, + rootName: 'root', + xmldec: { + 'version': '1.0', + 'encoding': 'UTF-8', + 'standalone': true + }, + doctype: null, + renderOpts: { + 'pretty': true, + 'indent': ' ', + 'newline': '\n' + }, + headless: false, + chunkSize: 10000, + emptyTag: '', + cdata: false + } + }; + +}).call(this); diff --git a/@capacitor/assets/node_modules/xml2js/lib/parser.js b/@capacitor/assets/node_modules/xml2js/lib/parser.js new file mode 100644 index 00000000..192382d3 --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/lib/parser.js @@ -0,0 +1,385 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + "use strict"; + var bom, defaults, events, isEmpty, processItem, processors, sax, setImmediate, + bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + sax = require('sax'); + + events = require('events'); + + bom = require('./bom'); + + processors = require('./processors'); + + setImmediate = require('timers').setImmediate; + + defaults = require('./defaults').defaults; + + isEmpty = function(thing) { + return typeof thing === "object" && (thing != null) && Object.keys(thing).length === 0; + }; + + processItem = function(processors, item, key) { + var i, len, process; + for (i = 0, len = processors.length; i < len; i++) { + process = processors[i]; + item = process(item, key); + } + return item; + }; + + exports.Parser = (function(superClass) { + extend(Parser, superClass); + + function Parser(opts) { + this.parseStringPromise = bind(this.parseStringPromise, this); + this.parseString = bind(this.parseString, this); + this.reset = bind(this.reset, this); + this.assignOrPush = bind(this.assignOrPush, this); + this.processAsync = bind(this.processAsync, this); + var key, ref, value; + if (!(this instanceof exports.Parser)) { + return new exports.Parser(opts); + } + this.options = {}; + ref = defaults["0.2"]; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + value = ref[key]; + this.options[key] = value; + } + for (key in opts) { + if (!hasProp.call(opts, key)) continue; + value = opts[key]; + this.options[key] = value; + } + if (this.options.xmlns) { + this.options.xmlnskey = this.options.attrkey + "ns"; + } + if (this.options.normalizeTags) { + if (!this.options.tagNameProcessors) { + this.options.tagNameProcessors = []; + } + this.options.tagNameProcessors.unshift(processors.normalize); + } + this.reset(); + } + + Parser.prototype.processAsync = function() { + var chunk, err; + try { + if (this.remaining.length <= this.options.chunkSize) { + chunk = this.remaining; + this.remaining = ''; + this.saxParser = this.saxParser.write(chunk); + return this.saxParser.close(); + } else { + chunk = this.remaining.substr(0, this.options.chunkSize); + this.remaining = this.remaining.substr(this.options.chunkSize, this.remaining.length); + this.saxParser = this.saxParser.write(chunk); + return setImmediate(this.processAsync); + } + } catch (error1) { + err = error1; + if (!this.saxParser.errThrown) { + this.saxParser.errThrown = true; + return this.emit(err); + } + } + }; + + Parser.prototype.assignOrPush = function(obj, key, newValue) { + if (!(key in obj)) { + if (!this.options.explicitArray) { + return obj[key] = newValue; + } else { + return obj[key] = [newValue]; + } + } else { + if (!(obj[key] instanceof Array)) { + obj[key] = [obj[key]]; + } + return obj[key].push(newValue); + } + }; + + Parser.prototype.reset = function() { + var attrkey, charkey, ontext, stack; + this.removeAllListeners(); + this.saxParser = sax.parser(this.options.strict, { + trim: false, + normalize: false, + xmlns: this.options.xmlns + }); + this.saxParser.errThrown = false; + this.saxParser.onerror = (function(_this) { + return function(error) { + _this.saxParser.resume(); + if (!_this.saxParser.errThrown) { + _this.saxParser.errThrown = true; + return _this.emit("error", error); + } + }; + })(this); + this.saxParser.onend = (function(_this) { + return function() { + if (!_this.saxParser.ended) { + _this.saxParser.ended = true; + return _this.emit("end", _this.resultObject); + } + }; + })(this); + this.saxParser.ended = false; + this.EXPLICIT_CHARKEY = this.options.explicitCharkey; + this.resultObject = null; + stack = []; + attrkey = this.options.attrkey; + charkey = this.options.charkey; + this.saxParser.onopentag = (function(_this) { + return function(node) { + var key, newValue, obj, processedKey, ref; + obj = Object.create(null); + obj[charkey] = ""; + if (!_this.options.ignoreAttrs) { + ref = node.attributes; + for (key in ref) { + if (!hasProp.call(ref, key)) continue; + if (!(attrkey in obj) && !_this.options.mergeAttrs) { + obj[attrkey] = Object.create(null); + } + newValue = _this.options.attrValueProcessors ? processItem(_this.options.attrValueProcessors, node.attributes[key], key) : node.attributes[key]; + processedKey = _this.options.attrNameProcessors ? processItem(_this.options.attrNameProcessors, key) : key; + if (_this.options.mergeAttrs) { + _this.assignOrPush(obj, processedKey, newValue); + } else { + obj[attrkey][processedKey] = newValue; + } + } + } + obj["#name"] = _this.options.tagNameProcessors ? processItem(_this.options.tagNameProcessors, node.name) : node.name; + if (_this.options.xmlns) { + obj[_this.options.xmlnskey] = { + uri: node.uri, + local: node.local + }; + } + return stack.push(obj); + }; + })(this); + this.saxParser.onclosetag = (function(_this) { + return function() { + var cdata, emptyStr, key, node, nodeName, obj, objClone, old, s, xpath; + obj = stack.pop(); + nodeName = obj["#name"]; + if (!_this.options.explicitChildren || !_this.options.preserveChildrenOrder) { + delete obj["#name"]; + } + if (obj.cdata === true) { + cdata = obj.cdata; + delete obj.cdata; + } + s = stack[stack.length - 1]; + if (obj[charkey].match(/^\s*$/) && !cdata) { + emptyStr = obj[charkey]; + delete obj[charkey]; + } else { + if (_this.options.trim) { + obj[charkey] = obj[charkey].trim(); + } + if (_this.options.normalize) { + obj[charkey] = obj[charkey].replace(/\s{2,}/g, " ").trim(); + } + obj[charkey] = _this.options.valueProcessors ? processItem(_this.options.valueProcessors, obj[charkey], nodeName) : obj[charkey]; + if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { + obj = obj[charkey]; + } + } + if (isEmpty(obj)) { + if (typeof _this.options.emptyTag === 'function') { + obj = _this.options.emptyTag(); + } else { + obj = _this.options.emptyTag !== '' ? _this.options.emptyTag : emptyStr; + } + } + if (_this.options.validator != null) { + xpath = "/" + ((function() { + var i, len, results; + results = []; + for (i = 0, len = stack.length; i < len; i++) { + node = stack[i]; + results.push(node["#name"]); + } + return results; + })()).concat(nodeName).join("/"); + (function() { + var err; + try { + return obj = _this.options.validator(xpath, s && s[nodeName], obj); + } catch (error1) { + err = error1; + return _this.emit("error", err); + } + })(); + } + if (_this.options.explicitChildren && !_this.options.mergeAttrs && typeof obj === 'object') { + if (!_this.options.preserveChildrenOrder) { + node = Object.create(null); + if (_this.options.attrkey in obj) { + node[_this.options.attrkey] = obj[_this.options.attrkey]; + delete obj[_this.options.attrkey]; + } + if (!_this.options.charsAsChildren && _this.options.charkey in obj) { + node[_this.options.charkey] = obj[_this.options.charkey]; + delete obj[_this.options.charkey]; + } + if (Object.getOwnPropertyNames(obj).length > 0) { + node[_this.options.childkey] = obj; + } + obj = node; + } else if (s) { + s[_this.options.childkey] = s[_this.options.childkey] || []; + objClone = Object.create(null); + for (key in obj) { + if (!hasProp.call(obj, key)) continue; + objClone[key] = obj[key]; + } + s[_this.options.childkey].push(objClone); + delete obj["#name"]; + if (Object.keys(obj).length === 1 && charkey in obj && !_this.EXPLICIT_CHARKEY) { + obj = obj[charkey]; + } + } + } + if (stack.length > 0) { + return _this.assignOrPush(s, nodeName, obj); + } else { + if (_this.options.explicitRoot) { + old = obj; + obj = Object.create(null); + obj[nodeName] = old; + } + _this.resultObject = obj; + _this.saxParser.ended = true; + return _this.emit("end", _this.resultObject); + } + }; + })(this); + ontext = (function(_this) { + return function(text) { + var charChild, s; + s = stack[stack.length - 1]; + if (s) { + s[charkey] += text; + if (_this.options.explicitChildren && _this.options.preserveChildrenOrder && _this.options.charsAsChildren && (_this.options.includeWhiteChars || text.replace(/\\n/g, '').trim() !== '')) { + s[_this.options.childkey] = s[_this.options.childkey] || []; + charChild = { + '#name': '__text__' + }; + charChild[charkey] = text; + if (_this.options.normalize) { + charChild[charkey] = charChild[charkey].replace(/\s{2,}/g, " ").trim(); + } + s[_this.options.childkey].push(charChild); + } + return s; + } + }; + })(this); + this.saxParser.ontext = ontext; + return this.saxParser.oncdata = (function(_this) { + return function(text) { + var s; + s = ontext(text); + if (s) { + return s.cdata = true; + } + }; + })(this); + }; + + Parser.prototype.parseString = function(str, cb) { + var err; + if ((cb != null) && typeof cb === "function") { + this.on("end", function(result) { + this.reset(); + return cb(null, result); + }); + this.on("error", function(err) { + this.reset(); + return cb(err); + }); + } + try { + str = str.toString(); + if (str.trim() === '') { + this.emit("end", null); + return true; + } + str = bom.stripBOM(str); + if (this.options.async) { + this.remaining = str; + setImmediate(this.processAsync); + return this.saxParser; + } + return this.saxParser.write(str).close(); + } catch (error1) { + err = error1; + if (!(this.saxParser.errThrown || this.saxParser.ended)) { + this.emit('error', err); + return this.saxParser.errThrown = true; + } else if (this.saxParser.ended) { + throw err; + } + } + }; + + Parser.prototype.parseStringPromise = function(str) { + return new Promise((function(_this) { + return function(resolve, reject) { + return _this.parseString(str, function(err, value) { + if (err) { + return reject(err); + } else { + return resolve(value); + } + }); + }; + })(this)); + }; + + return Parser; + + })(events); + + exports.parseString = function(str, a, b) { + var cb, options, parser; + if (b != null) { + if (typeof b === 'function') { + cb = b; + } + if (typeof a === 'object') { + options = a; + } + } else { + if (typeof a === 'function') { + cb = a; + } + options = {}; + } + parser = new exports.Parser(options); + return parser.parseString(str, cb); + }; + + exports.parseStringPromise = function(str, a) { + var options, parser; + if (typeof a === 'object') { + options = a; + } + parser = new exports.Parser(options); + return parser.parseStringPromise(str); + }; + +}).call(this); diff --git a/@capacitor/assets/node_modules/xml2js/lib/processors.js b/@capacitor/assets/node_modules/xml2js/lib/processors.js new file mode 100644 index 00000000..89aa85f2 --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/lib/processors.js @@ -0,0 +1,34 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + "use strict"; + var prefixMatch; + + prefixMatch = new RegExp(/(?!xmlns)^.*:/); + + exports.normalize = function(str) { + return str.toLowerCase(); + }; + + exports.firstCharLowerCase = function(str) { + return str.charAt(0).toLowerCase() + str.slice(1); + }; + + exports.stripPrefix = function(str) { + return str.replace(prefixMatch, ''); + }; + + exports.parseNumbers = function(str) { + if (!isNaN(str)) { + str = str % 1 === 0 ? parseInt(str, 10) : parseFloat(str); + } + return str; + }; + + exports.parseBooleans = function(str) { + if (/^(?:true|false)$/i.test(str)) { + str = str.toLowerCase() === 'true'; + } + return str; + }; + +}).call(this); diff --git a/@capacitor/assets/node_modules/xml2js/lib/xml2js.js b/@capacitor/assets/node_modules/xml2js/lib/xml2js.js new file mode 100644 index 00000000..24b6e699 --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/lib/xml2js.js @@ -0,0 +1,39 @@ +// Generated by CoffeeScript 1.12.7 +(function() { + "use strict"; + var builder, defaults, parser, processors, + extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, + hasProp = {}.hasOwnProperty; + + defaults = require('./defaults'); + + builder = require('./builder'); + + parser = require('./parser'); + + processors = require('./processors'); + + exports.defaults = defaults.defaults; + + exports.processors = processors; + + exports.ValidationError = (function(superClass) { + extend(ValidationError, superClass); + + function ValidationError(message) { + this.message = message; + } + + return ValidationError; + + })(Error); + + exports.Builder = builder.Builder; + + exports.Parser = parser.Parser; + + exports.parseString = parser.parseString; + + exports.parseStringPromise = parser.parseStringPromise; + +}).call(this); diff --git a/@capacitor/assets/node_modules/xml2js/package.json b/@capacitor/assets/node_modules/xml2js/package.json new file mode 100644 index 00000000..bc8eb663 --- /dev/null +++ b/@capacitor/assets/node_modules/xml2js/package.json @@ -0,0 +1,93 @@ +{ + "name": "xml2js", + "description": "Simple XML to JavaScript object converter.", + "keywords": [ + "xml", + "json" + ], + "homepage": "https://github.com/Leonidas-from-XIV/node-xml2js", + "version": "0.5.0", + "author": "Marek Kubica (https://xivilization.net)", + "contributors": [ + "maqr (https://github.com/maqr)", + "Ben Weaver (http://benweaver.com/)", + "Jae Kwon (https://github.com/jaekwon)", + "Jim Robert", + "Ștefan Rusu (http://www.saltwaterc.eu/)", + "Carter Cole (http://cartercole.com/)", + "Kurt Raschke (http://www.kurtraschke.com/)", + "Contra (https://github.com/Contra)", + "Marcelo Diniz (https://github.com/mdiniz)", + "Michael Hart (https://github.com/mhart)", + "Zachary Scott (http://zacharyscott.net/)", + "Raoul Millais (https://github.com/raoulmillais)", + "Salsita Software (http://www.salsitasoft.com/)", + "Mike Schilling (http://www.emotive.com/)", + "Jackson Tian (http://weibo.com/shyvo)", + "Mikhail Zyatin (https://github.com/Sitin)", + "Chris Tavares (https://github.com/christav)", + "Frank Xu (http://f2e.us/)", + "Guido D'Albore (http://www.bitstorm.it/)", + "Jack Senechal (http://jacksenechal.com/)", + "Matthias Hölzl (https://github.com/hoelzl)", + "Camille Reynders (http://www.creynders.be/)", + "Taylor Gautier (https://github.com/tsgautier)", + "Todd Bryan (https://github.com/toddrbryan)", + "Leore Avidar (http://leoreavidar.com/)", + "Dave Aitken (http://www.actionshrimp.com/)", + "Shaney Orrowe ", + "Candle ", + "Jess Telford (http://jes.st)", + "Tom Hughes < (http://compton.nu/)", + "Piotr Rochala (http://rocha.la/)", + "Michael Avila (https://github.com/michaelavila)", + "Ryan Gahl (https://github.com/ryedin)", + "Eric Laberge (https://github.com/elaberge)", + "Benjamin E. Coe (https://twitter.com/benjamincoe)", + "Stephen Cresswell (https://github.com/cressie176)", + "Pascal Ehlert (http://www.hacksrus.net/)", + "Tom Spencer (http://fiznool.com/)", + "Tristian Flanagan (https://github.com/tflanagan)", + "Tim Johns (https://github.com/TimJohns)", + "Bogdan Chadkin (https://github.com/TrySound)", + "David Wood (http://codesleuth.co.uk/)", + "Nicolas Maquet (https://github.com/nmaquet)", + "Lovell Fuller (http://lovell.info/)", + "d3adc0d3 (https://github.com/d3adc0d3)", + "James Crosby (https://github.com/autopulated)" + ], + "main": "./lib/xml2js", + "files": [ + "lib" + ], + "directories": { + "lib": "./lib" + }, + "scripts": { + "build": "cake build", + "test": "zap", + "coverage": "nyc npm test && nyc report", + "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls", + "doc": "cake doc" + }, + "repository": { + "type": "git", + "url": "https://github.com/Leonidas-from-XIV/node-xml2js.git" + }, + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "devDependencies": { + "coffee-script": ">=1.10.0", + "coveralls": "^3.0.1", + "diff": ">=1.0.8", + "docco": ">=0.6.2", + "nyc": ">=2.2.1", + "zap": ">=0.2.9" + }, + "engines": { + "node": ">=4.0.0" + }, + "license": "MIT" +} diff --git a/@capacitor/assets/node_modules/yargs-parser/CHANGELOG.md b/@capacitor/assets/node_modules/yargs-parser/CHANGELOG.md new file mode 100644 index 00000000..584eb86e --- /dev/null +++ b/@capacitor/assets/node_modules/yargs-parser/CHANGELOG.md @@ -0,0 +1,308 @@ +# Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + +## [21.1.1](https://github.com/yargs/yargs-parser/compare/yargs-parser-v21.1.0...yargs-parser-v21.1.1) (2022-08-04) + + +### Bug Fixes + +* **typescript:** ignore .cts files during publish ([#454](https://github.com/yargs/yargs-parser/issues/454)) ([d69f9c3](https://github.com/yargs/yargs-parser/commit/d69f9c3a91c3ad2f9494d0a94e29a8b76c41b81b)), closes [#452](https://github.com/yargs/yargs-parser/issues/452) + +## [21.1.0](https://github.com/yargs/yargs-parser/compare/yargs-parser-v21.0.1...yargs-parser-v21.1.0) (2022-08-03) + + +### Features + +* allow the browser build to be imported ([#443](https://github.com/yargs/yargs-parser/issues/443)) ([a89259f](https://github.com/yargs/yargs-parser/commit/a89259ff41d6f5312b3ce8a30bef343a993f395a)) + + +### Bug Fixes + +* **halt-at-non-option:** prevent known args from being parsed when "unknown-options-as-args" is enabled ([#438](https://github.com/yargs/yargs-parser/issues/438)) ([c474bc1](https://github.com/yargs/yargs-parser/commit/c474bc10c3aa0ae864b95e5722730114ef15f573)) +* node version check now uses process.versions.node ([#450](https://github.com/yargs/yargs-parser/issues/450)) ([d07bcdb](https://github.com/yargs/yargs-parser/commit/d07bcdbe43075f7201fbe8a08e491217247fe1f1)) +* parse options ending with 3+ hyphens ([#434](https://github.com/yargs/yargs-parser/issues/434)) ([4f1060b](https://github.com/yargs/yargs-parser/commit/4f1060b50759fadbac3315c5117b0c3d65b0a7d8)) + +### [21.0.1](https://github.com/yargs/yargs-parser/compare/yargs-parser-v21.0.0...yargs-parser-v21.0.1) (2022-02-27) + + +### Bug Fixes + +* return deno env object ([#432](https://github.com/yargs/yargs-parser/issues/432)) ([b00eb87](https://github.com/yargs/yargs-parser/commit/b00eb87b4860a890dd2dab0d6058241bbfd2b3ec)) + +## [21.0.0](https://www.github.com/yargs/yargs-parser/compare/yargs-parser-v20.2.9...yargs-parser-v21.0.0) (2021-11-15) + + +### ⚠ BREAKING CHANGES + +* drops support for 10 (#421) + +### Bug Fixes + +* esm json import ([#416](https://www.github.com/yargs/yargs-parser/issues/416)) ([90f970a](https://www.github.com/yargs/yargs-parser/commit/90f970a6482dd4f5b5eb18d38596dd6f02d73edf)) +* parser should preserve inner quotes ([#407](https://www.github.com/yargs/yargs-parser/issues/407)) ([ae11f49](https://www.github.com/yargs/yargs-parser/commit/ae11f496a8318ea8885aa25015d429b33713c314)) + + +### Code Refactoring + +* drops support for 10 ([#421](https://www.github.com/yargs/yargs-parser/issues/421)) ([3aaf878](https://www.github.com/yargs/yargs-parser/commit/3aaf8784f5c7f2aec6108c1c6a55537fa7e3b5c1)) + +### [20.2.9](https://www.github.com/yargs/yargs-parser/compare/yargs-parser-v20.2.8...yargs-parser-v20.2.9) (2021-06-20) + + +### Bug Fixes + +* **build:** fixed automated release pipeline ([1fe9135](https://www.github.com/yargs/yargs-parser/commit/1fe9135884790a083615419b2861683e2597dac3)) + +### [20.2.8](https://www.github.com/yargs/yargs-parser/compare/yargs-parser-v20.2.7...yargs-parser-v20.2.8) (2021-06-20) + + +### Bug Fixes + +* **locale:** Turkish camelize and decamelize issues with toLocaleLowerCase/toLocaleUpperCase ([2617303](https://www.github.com/yargs/yargs-parser/commit/261730383e02448562f737b94bbd1f164aed5143)) +* **perf:** address slow parse when using unknown-options-as-args ([#394](https://www.github.com/yargs/yargs-parser/issues/394)) ([441f059](https://www.github.com/yargs/yargs-parser/commit/441f059d585d446551068ad213db79ac91daf83a)) +* **string-utils:** detect [0,1] ranged values as numbers ([#388](https://www.github.com/yargs/yargs-parser/issues/388)) ([efcc32c](https://www.github.com/yargs/yargs-parser/commit/efcc32c2d6b09aba31abfa2db9bd947befe5586b)) + +### [20.2.7](https://www.github.com/yargs/yargs-parser/compare/v20.2.6...v20.2.7) (2021-03-10) + + +### Bug Fixes + +* **deno:** force release for Deno ([6687c97](https://www.github.com/yargs/yargs-parser/commit/6687c972d0f3ca7865a97908dde3080b05f8b026)) + +### [20.2.6](https://www.github.com/yargs/yargs-parser/compare/v20.2.5...v20.2.6) (2021-02-22) + + +### Bug Fixes + +* **populate--:** -- should always be array ([#354](https://www.github.com/yargs/yargs-parser/issues/354)) ([585ae8f](https://www.github.com/yargs/yargs-parser/commit/585ae8ffad74cc02974f92d788e750137fd65146)) + +### [20.2.5](https://www.github.com/yargs/yargs-parser/compare/v20.2.4...v20.2.5) (2021-02-13) + + +### Bug Fixes + +* do not lowercase camel cased string ([#348](https://www.github.com/yargs/yargs-parser/issues/348)) ([5f4da1f](https://www.github.com/yargs/yargs-parser/commit/5f4da1f17d9d50542d2aaa206c9806ce3e320335)) + +### [20.2.4](https://www.github.com/yargs/yargs-parser/compare/v20.2.3...v20.2.4) (2020-11-09) + + +### Bug Fixes + +* **deno:** address import issues in Deno ([#339](https://www.github.com/yargs/yargs-parser/issues/339)) ([3b54e5e](https://www.github.com/yargs/yargs-parser/commit/3b54e5eef6e9a7b7c6eec7c12bab3ba3b8ba8306)) + +### [20.2.3](https://www.github.com/yargs/yargs-parser/compare/v20.2.2...v20.2.3) (2020-10-16) + + +### Bug Fixes + +* **exports:** node 13.0 and 13.1 require the dotted object form _with_ a string fallback ([#336](https://www.github.com/yargs/yargs-parser/issues/336)) ([3ae7242](https://www.github.com/yargs/yargs-parser/commit/3ae7242040ff876d28dabded60ac226e00150c88)) + +### [20.2.2](https://www.github.com/yargs/yargs-parser/compare/v20.2.1...v20.2.2) (2020-10-14) + + +### Bug Fixes + +* **exports:** node 13.0-13.6 require a string fallback ([#333](https://www.github.com/yargs/yargs-parser/issues/333)) ([291aeda](https://www.github.com/yargs/yargs-parser/commit/291aeda06b685b7a015d83bdf2558e180b37388d)) + +### [20.2.1](https://www.github.com/yargs/yargs-parser/compare/v20.2.0...v20.2.1) (2020-10-01) + + +### Bug Fixes + +* **deno:** update types for deno ^1.4.0 ([#330](https://www.github.com/yargs/yargs-parser/issues/330)) ([0ab92e5](https://www.github.com/yargs/yargs-parser/commit/0ab92e50b090f11196334c048c9c92cecaddaf56)) + +## [20.2.0](https://www.github.com/yargs/yargs-parser/compare/v20.1.0...v20.2.0) (2020-09-21) + + +### Features + +* **string-utils:** export looksLikeNumber helper ([#324](https://www.github.com/yargs/yargs-parser/issues/324)) ([c8580a2](https://www.github.com/yargs/yargs-parser/commit/c8580a2327b55f6342acecb6e72b62963d506750)) + + +### Bug Fixes + +* **unknown-options-as-args:** convert positionals that look like numbers ([#326](https://www.github.com/yargs/yargs-parser/issues/326)) ([f85ebb4](https://www.github.com/yargs/yargs-parser/commit/f85ebb4face9d4b0f56147659404cbe0002f3dad)) + +## [20.1.0](https://www.github.com/yargs/yargs-parser/compare/v20.0.0...v20.1.0) (2020-09-20) + + +### Features + +* adds parse-positional-numbers configuration ([#321](https://www.github.com/yargs/yargs-parser/issues/321)) ([9cec00a](https://www.github.com/yargs/yargs-parser/commit/9cec00a622251292ffb7dce6f78f5353afaa0d4c)) + + +### Bug Fixes + +* **build:** update release-please; make labels kick off builds ([#323](https://www.github.com/yargs/yargs-parser/issues/323)) ([09f448b](https://www.github.com/yargs/yargs-parser/commit/09f448b4cd66e25d2872544718df46dab8af062a)) + +## [20.0.0](https://www.github.com/yargs/yargs-parser/compare/v19.0.4...v20.0.0) (2020-09-09) + + +### ⚠ BREAKING CHANGES + +* do not ship type definitions (#318) + +### Bug Fixes + +* only strip camel case if hyphenated ([#316](https://www.github.com/yargs/yargs-parser/issues/316)) ([95a9e78](https://www.github.com/yargs/yargs-parser/commit/95a9e785127b9bbf2d1db1f1f808ca1fb100e82a)), closes [#315](https://www.github.com/yargs/yargs-parser/issues/315) + + +### Code Refactoring + +* do not ship type definitions ([#318](https://www.github.com/yargs/yargs-parser/issues/318)) ([8fbd56f](https://www.github.com/yargs/yargs-parser/commit/8fbd56f1d0b6c44c30fca62708812151ca0ce330)) + +### [19.0.4](https://www.github.com/yargs/yargs-parser/compare/v19.0.3...v19.0.4) (2020-08-27) + + +### Bug Fixes + +* **build:** fixing publication ([#310](https://www.github.com/yargs/yargs-parser/issues/310)) ([5d3c6c2](https://www.github.com/yargs/yargs-parser/commit/5d3c6c29a9126248ba601920d9cf87c78e161ff5)) + +### [19.0.3](https://www.github.com/yargs/yargs-parser/compare/v19.0.2...v19.0.3) (2020-08-27) + + +### Bug Fixes + +* **build:** switch to action for publish ([#308](https://www.github.com/yargs/yargs-parser/issues/308)) ([5c2f305](https://www.github.com/yargs/yargs-parser/commit/5c2f30585342bcd8aaf926407c863099d256d174)) + +### [19.0.2](https://www.github.com/yargs/yargs-parser/compare/v19.0.1...v19.0.2) (2020-08-27) + + +### Bug Fixes + +* **types:** envPrefix should be optional ([#305](https://www.github.com/yargs/yargs-parser/issues/305)) ([ae3f180](https://www.github.com/yargs/yargs-parser/commit/ae3f180e14df2de2fd962145f4518f9aa0e76523)) + +### [19.0.1](https://www.github.com/yargs/yargs-parser/compare/v19.0.0...v19.0.1) (2020-08-09) + + +### Bug Fixes + +* **build:** push tag created for deno ([2186a14](https://www.github.com/yargs/yargs-parser/commit/2186a14989749887d56189867602e39e6679f8b0)) + +## [19.0.0](https://www.github.com/yargs/yargs-parser/compare/v18.1.3...v19.0.0) (2020-08-09) + + +### ⚠ BREAKING CHANGES + +* adds support for ESM and Deno (#295) +* **ts:** projects using `@types/yargs-parser` may see variations in type definitions. +* drops Node 6. begin following Node.js LTS schedule (#278) + +### Features + +* adds support for ESM and Deno ([#295](https://www.github.com/yargs/yargs-parser/issues/295)) ([195bc4a](https://www.github.com/yargs/yargs-parser/commit/195bc4a7f20c2a8f8e33fbb6ba96ef6e9a0120a1)) +* expose camelCase and decamelize helpers ([#296](https://www.github.com/yargs/yargs-parser/issues/296)) ([39154ce](https://www.github.com/yargs/yargs-parser/commit/39154ceb5bdcf76b5f59a9219b34cedb79b67f26)) +* **deps:** update to latest camelcase/decamelize ([#281](https://www.github.com/yargs/yargs-parser/issues/281)) ([8931ab0](https://www.github.com/yargs/yargs-parser/commit/8931ab08f686cc55286f33a95a83537da2be5516)) + + +### Bug Fixes + +* boolean numeric short option ([#294](https://www.github.com/yargs/yargs-parser/issues/294)) ([f600082](https://www.github.com/yargs/yargs-parser/commit/f600082c959e092076caf420bbbc9d7a231e2418)) +* raise permission error for Deno if config load fails ([#298](https://www.github.com/yargs/yargs-parser/issues/298)) ([1174e2b](https://www.github.com/yargs/yargs-parser/commit/1174e2b3f0c845a1cd64e14ffc3703e730567a84)) +* **deps:** update dependency decamelize to v3 ([#274](https://www.github.com/yargs/yargs-parser/issues/274)) ([4d98698](https://www.github.com/yargs/yargs-parser/commit/4d98698bc6767e84ec54a0842908191739be73b7)) +* **types:** switch back to using Partial types ([#293](https://www.github.com/yargs/yargs-parser/issues/293)) ([bdc80ba](https://www.github.com/yargs/yargs-parser/commit/bdc80ba59fa13bc3025ce0a85e8bad9f9da24ea7)) + + +### Build System + +* drops Node 6. begin following Node.js LTS schedule ([#278](https://www.github.com/yargs/yargs-parser/issues/278)) ([9014ed7](https://www.github.com/yargs/yargs-parser/commit/9014ed722a32768b96b829e65a31705db5c1458a)) + + +### Code Refactoring + +* **ts:** move index.js to TypeScript ([#292](https://www.github.com/yargs/yargs-parser/issues/292)) ([f78d2b9](https://www.github.com/yargs/yargs-parser/commit/f78d2b97567ac4828624406e420b4047c710b789)) + +### [18.1.3](https://www.github.com/yargs/yargs-parser/compare/v18.1.2...v18.1.3) (2020-04-16) + + +### Bug Fixes + +* **setArg:** options using camel-case and dot-notation populated twice ([#268](https://www.github.com/yargs/yargs-parser/issues/268)) ([f7e15b9](https://www.github.com/yargs/yargs-parser/commit/f7e15b9800900b9856acac1a830a5f35847be73e)) + +### [18.1.2](https://www.github.com/yargs/yargs-parser/compare/v18.1.1...v18.1.2) (2020-03-26) + + +### Bug Fixes + +* **array, nargs:** support -o=--value and --option=--value format ([#262](https://www.github.com/yargs/yargs-parser/issues/262)) ([41d3f81](https://www.github.com/yargs/yargs-parser/commit/41d3f8139e116706b28de9b0de3433feb08d2f13)) + +### [18.1.1](https://www.github.com/yargs/yargs-parser/compare/v18.1.0...v18.1.1) (2020-03-16) + + +### Bug Fixes + +* \_\_proto\_\_ will now be replaced with \_\_\_proto\_\_\_ in parse ([#258](https://www.github.com/yargs/yargs-parser/issues/258)), patching a potential +prototype pollution vulnerability. This was reported by the Snyk Security Research Team.([63810ca](https://www.github.com/yargs/yargs-parser/commit/63810ca1ae1a24b08293a4d971e70e058c7a41e2)) + +## [18.1.0](https://www.github.com/yargs/yargs-parser/compare/v18.0.0...v18.1.0) (2020-03-07) + + +### Features + +* introduce single-digit boolean aliases ([#255](https://www.github.com/yargs/yargs-parser/issues/255)) ([9c60265](https://www.github.com/yargs/yargs-parser/commit/9c60265fd7a03cb98e6df3e32c8c5e7508d9f56f)) + +## [18.0.0](https://www.github.com/yargs/yargs-parser/compare/v17.1.0...v18.0.0) (2020-03-02) + + +### ⚠ BREAKING CHANGES + +* the narg count is now enforced when parsing arrays. + +### Features + +* NaN can now be provided as a value for nargs, indicating "at least" one value is expected for array ([#251](https://www.github.com/yargs/yargs-parser/issues/251)) ([9db4be8](https://www.github.com/yargs/yargs-parser/commit/9db4be81417a2c7097128db34d86fe70ef4af70c)) + +## [17.1.0](https://www.github.com/yargs/yargs-parser/compare/v17.0.1...v17.1.0) (2020-03-01) + + +### Features + +* introduce greedy-arrays config, for specifying whether arrays consume multiple positionals ([#249](https://www.github.com/yargs/yargs-parser/issues/249)) ([60e880a](https://www.github.com/yargs/yargs-parser/commit/60e880a837046314d89fa4725f923837fd33a9eb)) + +### [17.0.1](https://www.github.com/yargs/yargs-parser/compare/v17.0.0...v17.0.1) (2020-02-29) + + +### Bug Fixes + +* normalized keys were not enumerable ([#247](https://www.github.com/yargs/yargs-parser/issues/247)) ([57119f9](https://www.github.com/yargs/yargs-parser/commit/57119f9f17cf27499bd95e61c2f72d18314f11ba)) + +## [17.0.0](https://www.github.com/yargs/yargs-parser/compare/v16.1.0...v17.0.0) (2020-02-10) + + +### ⚠ BREAKING CHANGES + +* this reverts parsing behavior of booleans to that of yargs@14 +* objects used during parsing are now created with a null +prototype. There may be some scenarios where this change in behavior +leaks externally. + +### Features + +* boolean arguments will not be collected into an implicit array ([#236](https://www.github.com/yargs/yargs-parser/issues/236)) ([34c4e19](https://www.github.com/yargs/yargs-parser/commit/34c4e19bae4e7af63e3cb6fa654a97ed476e5eb5)) +* introduce nargs-eats-options config option ([#246](https://www.github.com/yargs/yargs-parser/issues/246)) ([d50822a](https://www.github.com/yargs/yargs-parser/commit/d50822ac10e1b05f2e9643671ca131ac251b6732)) + + +### Bug Fixes + +* address bugs with "uknown-options-as-args" ([bc023e3](https://www.github.com/yargs/yargs-parser/commit/bc023e3b13e20a118353f9507d1c999bf388a346)) +* array should take precedence over nargs, but enforce nargs ([#243](https://www.github.com/yargs/yargs-parser/issues/243)) ([4cbc188](https://www.github.com/yargs/yargs-parser/commit/4cbc188b7abb2249529a19c090338debdad2fe6c)) +* support keys that collide with object prototypes ([#234](https://www.github.com/yargs/yargs-parser/issues/234)) ([1587b6d](https://www.github.com/yargs/yargs-parser/commit/1587b6d91db853a9109f1be6b209077993fee4de)) +* unknown options terminated with digits now handled by unknown-options-as-args ([#238](https://www.github.com/yargs/yargs-parser/issues/238)) ([d36cdfa](https://www.github.com/yargs/yargs-parser/commit/d36cdfa854254d7c7e0fe1d583818332ac46c2a5)) + +## [16.1.0](https://www.github.com/yargs/yargs-parser/compare/v16.0.0...v16.1.0) (2019-11-01) + + +### ⚠ BREAKING CHANGES + +* populate error if incompatible narg/count or array/count options are used (#191) + +### Features + +* options that have had their default value used are now tracked ([#211](https://www.github.com/yargs/yargs-parser/issues/211)) ([a525234](https://www.github.com/yargs/yargs-parser/commit/a525234558c847deedd73f8792e0a3b77b26e2c0)) +* populate error if incompatible narg/count or array/count options are used ([#191](https://www.github.com/yargs/yargs-parser/issues/191)) ([84a401f](https://www.github.com/yargs/yargs-parser/commit/84a401f0fa3095e0a19661670d1570d0c3b9d3c9)) + + +### Reverts + +* revert 16.0.0 CHANGELOG entry ([920320a](https://www.github.com/yargs/yargs-parser/commit/920320ad9861bbfd58eda39221ae211540fc1daf)) diff --git a/@capacitor/assets/node_modules/yargs-parser/LICENSE.txt b/@capacitor/assets/node_modules/yargs-parser/LICENSE.txt new file mode 100644 index 00000000..836440be --- /dev/null +++ b/@capacitor/assets/node_modules/yargs-parser/LICENSE.txt @@ -0,0 +1,14 @@ +Copyright (c) 2016, Contributors + +Permission to use, copy, modify, and/or distribute this software +for any purpose with or without fee is hereby granted, provided +that the above copyright notice and this permission notice +appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE +LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES +OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/@capacitor/assets/node_modules/yargs-parser/README.md b/@capacitor/assets/node_modules/yargs-parser/README.md new file mode 100644 index 00000000..26148407 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs-parser/README.md @@ -0,0 +1,518 @@ +# yargs-parser + +![ci](https://github.com/yargs/yargs-parser/workflows/ci/badge.svg) +[![NPM version](https://img.shields.io/npm/v/yargs-parser.svg)](https://www.npmjs.com/package/yargs-parser) +[![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org) +![nycrc config on GitHub](https://img.shields.io/nycrc/yargs/yargs-parser) + +The mighty option parser used by [yargs](https://github.com/yargs/yargs). + +visit the [yargs website](http://yargs.js.org/) for more examples, and thorough usage instructions. + + + +## Example + +```sh +npm i yargs-parser --save +``` + +```js +const argv = require('yargs-parser')(process.argv.slice(2)) +console.log(argv) +``` + +```console +$ node example.js --foo=33 --bar hello +{ _: [], foo: 33, bar: 'hello' } +``` + +_or parse a string!_ + +```js +const argv = require('yargs-parser')('--foo=99 --bar=33') +console.log(argv) +``` + +```console +{ _: [], foo: 99, bar: 33 } +``` + +Convert an array of mixed types before passing to `yargs-parser`: + +```js +const parse = require('yargs-parser') +parse(['-f', 11, '--zoom', 55].join(' ')) // <-- array to string +parse(['-f', 11, '--zoom', 55].map(String)) // <-- array of strings +``` + +## Deno Example + +As of `v19` `yargs-parser` supports [Deno](https://github.com/denoland/deno): + +```typescript +import parser from "https://deno.land/x/yargs_parser/deno.ts"; + +const argv = parser('--foo=99 --bar=9987930', { + string: ['bar'] +}) +console.log(argv) +``` + +## ESM Example + +As of `v19` `yargs-parser` supports ESM (_both in Node.js and in the browser_): + +**Node.js:** + +```js +import parser from 'yargs-parser' + +const argv = parser('--foo=99 --bar=9987930', { + string: ['bar'] +}) +console.log(argv) +``` + +**Browsers:** + +```html + + + + +``` + +## API + +### parser(args, opts={}) + +Parses command line arguments returning a simple mapping of keys and values. + +**expects:** + +* `args`: a string or array of strings representing the options to parse. +* `opts`: provide a set of hints indicating how `args` should be parsed: + * `opts.alias`: an object representing the set of aliases for a key: `{alias: {foo: ['f']}}`. + * `opts.array`: indicate that keys should be parsed as an array: `{array: ['foo', 'bar']}`.
    + Indicate that keys should be parsed as an array and coerced to booleans / numbers:
    + `{array: [{ key: 'foo', boolean: true }, {key: 'bar', number: true}]}`. + * `opts.boolean`: arguments should be parsed as booleans: `{boolean: ['x', 'y']}`. + * `opts.coerce`: provide a custom synchronous function that returns a coerced value from the argument provided + (or throws an error). For arrays the function is called only once for the entire array:
    + `{coerce: {foo: function (arg) {return modifiedArg}}}`. + * `opts.config`: indicate a key that represents a path to a configuration file (this file will be loaded and parsed). + * `opts.configObjects`: configuration objects to parse, their properties will be set as arguments:
    + `{configObjects: [{'x': 5, 'y': 33}, {'z': 44}]}`. + * `opts.configuration`: provide configuration options to the yargs-parser (see: [configuration](#configuration)). + * `opts.count`: indicate a key that should be used as a counter, e.g., `-vvv` = `{v: 3}`. + * `opts.default`: provide default values for keys: `{default: {x: 33, y: 'hello world!'}}`. + * `opts.envPrefix`: environment variables (`process.env`) with the prefix provided should be parsed. + * `opts.narg`: specify that a key requires `n` arguments: `{narg: {x: 2}}`. + * `opts.normalize`: `path.normalize()` will be applied to values set to this key. + * `opts.number`: keys should be treated as numbers. + * `opts.string`: keys should be treated as strings (even if they resemble a number `-x 33`). + +**returns:** + +* `obj`: an object representing the parsed value of `args` + * `key/value`: key value pairs for each argument and their aliases. + * `_`: an array representing the positional arguments. + * [optional] `--`: an array with arguments after the end-of-options flag `--`. + +### require('yargs-parser').detailed(args, opts={}) + +Parses a command line string, returning detailed information required by the +yargs engine. + +**expects:** + +* `args`: a string or array of strings representing options to parse. +* `opts`: provide a set of hints indicating how `args`, inputs are identical to `require('yargs-parser')(args, opts={})`. + +**returns:** + +* `argv`: an object representing the parsed value of `args` + * `key/value`: key value pairs for each argument and their aliases. + * `_`: an array representing the positional arguments. + * [optional] `--`: an array with arguments after the end-of-options flag `--`. +* `error`: populated with an error object if an exception occurred during parsing. +* `aliases`: the inferred list of aliases built by combining lists in `opts.alias`. +* `newAliases`: any new aliases added via camel-case expansion: + * `boolean`: `{ fooBar: true }` +* `defaulted`: any new argument created by `opts.default`, no aliases included. + * `boolean`: `{ foo: true }` +* `configuration`: given by default settings and `opts.configuration`. + + + +### Configuration + +The yargs-parser applies several automated transformations on the keys provided +in `args`. These features can be turned on and off using the `configuration` field +of `opts`. + +```js +var parsed = parser(['--no-dice'], { + configuration: { + 'boolean-negation': false + } +}) +``` + +### short option groups + +* default: `true`. +* key: `short-option-groups`. + +Should a group of short-options be treated as boolean flags? + +```console +$ node example.js -abc +{ _: [], a: true, b: true, c: true } +``` + +_if disabled:_ + +```console +$ node example.js -abc +{ _: [], abc: true } +``` + +### camel-case expansion + +* default: `true`. +* key: `camel-case-expansion`. + +Should hyphenated arguments be expanded into camel-case aliases? + +```console +$ node example.js --foo-bar +{ _: [], 'foo-bar': true, fooBar: true } +``` + +_if disabled:_ + +```console +$ node example.js --foo-bar +{ _: [], 'foo-bar': true } +``` + +### dot-notation + +* default: `true` +* key: `dot-notation` + +Should keys that contain `.` be treated as objects? + +```console +$ node example.js --foo.bar +{ _: [], foo: { bar: true } } +``` + +_if disabled:_ + +```console +$ node example.js --foo.bar +{ _: [], "foo.bar": true } +``` + +### parse numbers + +* default: `true` +* key: `parse-numbers` + +Should keys that look like numbers be treated as such? + +```console +$ node example.js --foo=99.3 +{ _: [], foo: 99.3 } +``` + +_if disabled:_ + +```console +$ node example.js --foo=99.3 +{ _: [], foo: "99.3" } +``` + +### parse positional numbers + +* default: `true` +* key: `parse-positional-numbers` + +Should positional keys that look like numbers be treated as such. + +```console +$ node example.js 99.3 +{ _: [99.3] } +``` + +_if disabled:_ + +```console +$ node example.js 99.3 +{ _: ['99.3'] } +``` + +### boolean negation + +* default: `true` +* key: `boolean-negation` + +Should variables prefixed with `--no` be treated as negations? + +```console +$ node example.js --no-foo +{ _: [], foo: false } +``` + +_if disabled:_ + +```console +$ node example.js --no-foo +{ _: [], "no-foo": true } +``` + +### combine arrays + +* default: `false` +* key: `combine-arrays` + +Should arrays be combined when provided by both command line arguments and +a configuration file. + +### duplicate arguments array + +* default: `true` +* key: `duplicate-arguments-array` + +Should arguments be coerced into an array when duplicated: + +```console +$ node example.js -x 1 -x 2 +{ _: [], x: [1, 2] } +``` + +_if disabled:_ + +```console +$ node example.js -x 1 -x 2 +{ _: [], x: 2 } +``` + +### flatten duplicate arrays + +* default: `true` +* key: `flatten-duplicate-arrays` + +Should array arguments be coerced into a single array when duplicated: + +```console +$ node example.js -x 1 2 -x 3 4 +{ _: [], x: [1, 2, 3, 4] } +``` + +_if disabled:_ + +```console +$ node example.js -x 1 2 -x 3 4 +{ _: [], x: [[1, 2], [3, 4]] } +``` + +### greedy arrays + +* default: `true` +* key: `greedy-arrays` + +Should arrays consume more than one positional argument following their flag. + +```console +$ node example --arr 1 2 +{ _: [], arr: [1, 2] } +``` + +_if disabled:_ + +```console +$ node example --arr 1 2 +{ _: [2], arr: [1] } +``` + +**Note: in `v18.0.0` we are considering defaulting greedy arrays to `false`.** + +### nargs eats options + +* default: `false` +* key: `nargs-eats-options` + +Should nargs consume dash options as well as positional arguments. + +### negation prefix + +* default: `no-` +* key: `negation-prefix` + +The prefix to use for negated boolean variables. + +```console +$ node example.js --no-foo +{ _: [], foo: false } +``` + +_if set to `quux`:_ + +```console +$ node example.js --quuxfoo +{ _: [], foo: false } +``` + +### populate -- + +* default: `false`. +* key: `populate--` + +Should unparsed flags be stored in `--` or `_`. + +_If disabled:_ + +```console +$ node example.js a -b -- x y +{ _: [ 'a', 'x', 'y' ], b: true } +``` + +_If enabled:_ + +```console +$ node example.js a -b -- x y +{ _: [ 'a' ], '--': [ 'x', 'y' ], b: true } +``` + +### set placeholder key + +* default: `false`. +* key: `set-placeholder-key`. + +Should a placeholder be added for keys not set via the corresponding CLI argument? + +_If disabled:_ + +```console +$ node example.js -a 1 -c 2 +{ _: [], a: 1, c: 2 } +``` + +_If enabled:_ + +```console +$ node example.js -a 1 -c 2 +{ _: [], a: 1, b: undefined, c: 2 } +``` + +### halt at non-option + +* default: `false`. +* key: `halt-at-non-option`. + +Should parsing stop at the first positional argument? This is similar to how e.g. `ssh` parses its command line. + +_If disabled:_ + +```console +$ node example.js -a run b -x y +{ _: [ 'b' ], a: 'run', x: 'y' } +``` + +_If enabled:_ + +```console +$ node example.js -a run b -x y +{ _: [ 'b', '-x', 'y' ], a: 'run' } +``` + +### strip aliased + +* default: `false` +* key: `strip-aliased` + +Should aliases be removed before returning results? + +_If disabled:_ + +```console +$ node example.js --test-field 1 +{ _: [], 'test-field': 1, testField: 1, 'test-alias': 1, testAlias: 1 } +``` + +_If enabled:_ + +```console +$ node example.js --test-field 1 +{ _: [], 'test-field': 1, testField: 1 } +``` + +### strip dashed + +* default: `false` +* key: `strip-dashed` + +Should dashed keys be removed before returning results? This option has no effect if +`camel-case-expansion` is disabled. + +_If disabled:_ + +```console +$ node example.js --test-field 1 +{ _: [], 'test-field': 1, testField: 1 } +``` + +_If enabled:_ + +```console +$ node example.js --test-field 1 +{ _: [], testField: 1 } +``` + +### unknown options as args + +* default: `false` +* key: `unknown-options-as-args` + +Should unknown options be treated like regular arguments? An unknown option is one that is not +configured in `opts`. + +_If disabled_ + +```console +$ node example.js --unknown-option --known-option 2 --string-option --unknown-option2 +{ _: [], unknownOption: true, knownOption: 2, stringOption: '', unknownOption2: true } +``` + +_If enabled_ + +```console +$ node example.js --unknown-option --known-option 2 --string-option --unknown-option2 +{ _: ['--unknown-option'], knownOption: 2, stringOption: '--unknown-option2' } +``` + +## Supported Node.js Versions + +Libraries in this ecosystem make a best effort to track +[Node.js' release schedule](https://nodejs.org/en/about/releases/). Here's [a +post on why we think this is important](https://medium.com/the-node-js-collection/maintainers-should-consider-following-node-js-release-schedule-ab08ed4de71a). + +## Special Thanks + +The yargs project evolves from optimist and minimist. It owes its +existence to a lot of James Halliday's hard work. Thanks [substack](https://github.com/substack) **beep** **boop** \o/ + +## License + +ISC diff --git a/@capacitor/assets/node_modules/yargs-parser/browser.js b/@capacitor/assets/node_modules/yargs-parser/browser.js new file mode 100644 index 00000000..241202c7 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs-parser/browser.js @@ -0,0 +1,29 @@ +// Main entrypoint for ESM web browser environments. Avoids using Node.js +// specific libraries, such as "path". +// +// TODO: figure out reasonable web equivalents for "resolve", "normalize", etc. +import { camelCase, decamelize, looksLikeNumber } from './build/lib/string-utils.js' +import { YargsParser } from './build/lib/yargs-parser.js' +const parser = new YargsParser({ + cwd: () => { return '' }, + format: (str, arg) => { return str.replace('%s', arg) }, + normalize: (str) => { return str }, + resolve: (str) => { return str }, + require: () => { + throw Error('loading config from files not currently supported in browser') + }, + env: () => {} +}) + +const yargsParser = function Parser (args, opts) { + const result = parser.parse(args.slice(), opts) + return result.argv +} +yargsParser.detailed = function (args, opts) { + return parser.parse(args.slice(), opts) +} +yargsParser.camelCase = camelCase +yargsParser.decamelize = decamelize +yargsParser.looksLikeNumber = looksLikeNumber + +export default yargsParser diff --git a/@capacitor/assets/node_modules/yargs-parser/package.json b/@capacitor/assets/node_modules/yargs-parser/package.json new file mode 100644 index 00000000..decd0c3f --- /dev/null +++ b/@capacitor/assets/node_modules/yargs-parser/package.json @@ -0,0 +1,92 @@ +{ + "name": "yargs-parser", + "version": "21.1.1", + "description": "the mighty option parser used by yargs", + "main": "build/index.cjs", + "exports": { + ".": [ + { + "import": "./build/lib/index.js", + "require": "./build/index.cjs" + }, + "./build/index.cjs" + ], + "./browser": [ + "./browser.js" + ] + }, + "type": "module", + "module": "./build/lib/index.js", + "scripts": { + "check": "standardx '**/*.ts' && standardx '**/*.js' && standardx '**/*.cjs'", + "fix": "standardx --fix '**/*.ts' && standardx --fix '**/*.js' && standardx --fix '**/*.cjs'", + "pretest": "rimraf build && tsc -p tsconfig.test.json && cross-env NODE_ENV=test npm run build:cjs", + "test": "c8 --reporter=text --reporter=html mocha test/*.cjs", + "test:esm": "c8 --reporter=text --reporter=html mocha test/*.mjs", + "test:browser": "start-server-and-test 'serve ./ -p 8080' http://127.0.0.1:8080/package.json 'node ./test/browser/yargs-test.cjs'", + "pretest:typescript": "npm run pretest", + "test:typescript": "c8 mocha ./build/test/typescript/*.js", + "coverage": "c8 report --check-coverage", + "precompile": "rimraf build", + "compile": "tsc", + "postcompile": "npm run build:cjs", + "build:cjs": "rollup -c", + "prepare": "npm run compile" + }, + "repository": { + "type": "git", + "url": "https://github.com/yargs/yargs-parser.git" + }, + "keywords": [ + "argument", + "parser", + "yargs", + "command", + "cli", + "parsing", + "option", + "args", + "argument" + ], + "author": "Ben Coe ", + "license": "ISC", + "devDependencies": { + "@types/chai": "^4.2.11", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.4", + "@typescript-eslint/eslint-plugin": "^3.10.1", + "@typescript-eslint/parser": "^3.10.1", + "c8": "^7.3.0", + "chai": "^4.2.0", + "cross-env": "^7.0.2", + "eslint": "^7.0.0", + "eslint-plugin-import": "^2.20.1", + "eslint-plugin-node": "^11.0.0", + "gts": "^3.0.0", + "mocha": "^10.0.0", + "puppeteer": "^16.0.0", + "rimraf": "^3.0.2", + "rollup": "^2.22.1", + "rollup-plugin-cleanup": "^3.1.1", + "rollup-plugin-ts": "^3.0.2", + "serve": "^14.0.0", + "standardx": "^7.0.0", + "start-server-and-test": "^1.11.2", + "ts-transform-default-export": "^1.0.2", + "typescript": "^4.0.0" + }, + "files": [ + "browser.js", + "build", + "!*.d.ts", + "!*.d.cts" + ], + "engines": { + "node": ">=12" + }, + "standardx": { + "ignore": [ + "build" + ] + } +} diff --git a/@capacitor/assets/node_modules/yargs/LICENSE b/@capacitor/assets/node_modules/yargs/LICENSE new file mode 100644 index 00000000..b0145ca0 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright 2010 James Halliday (mail@substack.net); Modified work Copyright 2014 Contributors (ben@npmjs.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/@capacitor/assets/node_modules/yargs/README.md b/@capacitor/assets/node_modules/yargs/README.md new file mode 100644 index 00000000..51f5b225 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/README.md @@ -0,0 +1,204 @@ +

    + +

    +

    Yargs

    +

    + Yargs be a node.js library fer hearties tryin' ter parse optstrings +

    + +
    + +![ci](https://github.com/yargs/yargs/workflows/ci/badge.svg) +[![NPM version][npm-image]][npm-url] +[![js-standard-style][standard-image]][standard-url] +[![Coverage][coverage-image]][coverage-url] +[![Conventional Commits][conventional-commits-image]][conventional-commits-url] +[![Slack][slack-image]][slack-url] + +## Description +Yargs helps you build interactive command line tools, by parsing arguments and generating an elegant user interface. + +It gives you: + +* commands and (grouped) options (`my-program.js serve --port=5000`). +* a dynamically generated help menu based on your arguments: + +``` +mocha [spec..] + +Run tests with Mocha + +Commands + mocha inspect [spec..] Run tests with Mocha [default] + mocha init create a client-side Mocha setup at + +Rules & Behavior + --allow-uncaught Allow uncaught errors to propagate [boolean] + --async-only, -A Require all tests to use a callback (async) or + return a Promise [boolean] +``` + +* bash-completion shortcuts for commands and options. +* and [tons more](/docs/api.md). + +## Installation + +Stable version: +```bash +npm i yargs +``` + +Bleeding edge version with the most recent features: +```bash +npm i yargs@next +``` + +## Usage + +### Simple Example + +```javascript +#!/usr/bin/env node +const yargs = require('yargs/yargs') +const { hideBin } = require('yargs/helpers') +const argv = yargs(hideBin(process.argv)).argv + +if (argv.ships > 3 && argv.distance < 53.5) { + console.log('Plunder more riffiwobbles!') +} else { + console.log('Retreat from the xupptumblers!') +} +``` + +```bash +$ ./plunder.js --ships=4 --distance=22 +Plunder more riffiwobbles! + +$ ./plunder.js --ships 12 --distance 98.7 +Retreat from the xupptumblers! +``` + +> Note: `hideBin` is a shorthand for [`process.argv.slice(2)`](https://nodejs.org/en/knowledge/command-line/how-to-parse-command-line-arguments/). It has the benefit that it takes into account variations in some environments, e.g., [Electron](https://github.com/electron/electron/issues/4690). + +### Complex Example + +```javascript +#!/usr/bin/env node +const yargs = require('yargs/yargs') +const { hideBin } = require('yargs/helpers') + +yargs(hideBin(process.argv)) + .command('serve [port]', 'start the server', (yargs) => { + return yargs + .positional('port', { + describe: 'port to bind on', + default: 5000 + }) + }, (argv) => { + if (argv.verbose) console.info(`start server on :${argv.port}`) + serve(argv.port) + }) + .option('verbose', { + alias: 'v', + type: 'boolean', + description: 'Run with verbose logging' + }) + .parse() +``` + +Run the example above with `--help` to see the help for the application. + +## Supported Platforms + +### TypeScript + +yargs has type definitions at [@types/yargs][type-definitions]. + +``` +npm i @types/yargs --save-dev +``` + +See usage examples in [docs](/docs/typescript.md). + +### Deno + +As of `v16`, `yargs` supports [Deno](https://github.com/denoland/deno): + +```typescript +import yargs from 'https://deno.land/x/yargs/deno.ts' +import { Arguments } from 'https://deno.land/x/yargs/deno-types.ts' + +yargs(Deno.args) + .command('download ', 'download a list of files', (yargs: any) => { + return yargs.positional('files', { + describe: 'a list of files to do something with' + }) + }, (argv: Arguments) => { + console.info(argv) + }) + .strictCommands() + .demandCommand(1) + .parse() +``` + +### ESM + +As of `v16`,`yargs` supports ESM imports: + +```js +import yargs from 'yargs' +import { hideBin } from 'yargs/helpers' + +yargs(hideBin(process.argv)) + .command('curl ', 'fetch the contents of the URL', () => {}, (argv) => { + console.info(argv) + }) + .demandCommand(1) + .parse() +``` + +### Usage in Browser + +See examples of using yargs in the browser in [docs](/docs/browser.md). + +## Community + +Having problems? want to contribute? join our [community slack](http://devtoolscommunity.herokuapp.com). + +## Documentation + +### Table of Contents + +* [Yargs' API](/docs/api.md) +* [Examples](/docs/examples.md) +* [Parsing Tricks](/docs/tricks.md) + * [Stop the Parser](/docs/tricks.md#stop) + * [Negating Boolean Arguments](/docs/tricks.md#negate) + * [Numbers](/docs/tricks.md#numbers) + * [Arrays](/docs/tricks.md#arrays) + * [Objects](/docs/tricks.md#objects) + * [Quotes](/docs/tricks.md#quotes) +* [Advanced Topics](/docs/advanced.md) + * [Composing Your App Using Commands](/docs/advanced.md#commands) + * [Building Configurable CLI Apps](/docs/advanced.md#configuration) + * [Customizing Yargs' Parser](/docs/advanced.md#customizing) + * [Bundling yargs](/docs/bundling.md) +* [Contributing](/contributing.md) + +## Supported Node.js Versions + +Libraries in this ecosystem make a best effort to track +[Node.js' release schedule](https://nodejs.org/en/about/releases/). Here's [a +post on why we think this is important](https://medium.com/the-node-js-collection/maintainers-should-consider-following-node-js-release-schedule-ab08ed4de71a). + +[npm-url]: https://www.npmjs.com/package/yargs +[npm-image]: https://img.shields.io/npm/v/yargs.svg +[standard-image]: https://img.shields.io/badge/code%20style-standard-brightgreen.svg +[standard-url]: http://standardjs.com/ +[conventional-commits-image]: https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg +[conventional-commits-url]: https://conventionalcommits.org/ +[slack-image]: http://devtoolscommunity.herokuapp.com/badge.svg +[slack-url]: http://devtoolscommunity.herokuapp.com +[type-definitions]: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/yargs +[coverage-image]: https://img.shields.io/nycrc/yargs/yargs +[coverage-url]: https://github.com/yargs/yargs/blob/main/.nycrc diff --git a/@capacitor/assets/node_modules/yargs/browser.d.ts b/@capacitor/assets/node_modules/yargs/browser.d.ts new file mode 100644 index 00000000..21f3fc69 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/browser.d.ts @@ -0,0 +1,5 @@ +import {YargsFactory} from './build/lib/yargs-factory'; + +declare const Yargs: ReturnType; + +export default Yargs; diff --git a/@capacitor/assets/node_modules/yargs/browser.mjs b/@capacitor/assets/node_modules/yargs/browser.mjs new file mode 100644 index 00000000..2d0d6e9e --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/browser.mjs @@ -0,0 +1,7 @@ +// Bootstrap yargs for browser: +import browserPlatformShim from './lib/platform-shims/browser.mjs'; +import {YargsFactory} from './build/lib/yargs-factory.js'; + +const Yargs = YargsFactory(browserPlatformShim); + +export default Yargs; diff --git a/@capacitor/assets/node_modules/yargs/helpers/helpers.mjs b/@capacitor/assets/node_modules/yargs/helpers/helpers.mjs new file mode 100644 index 00000000..3f96b3db --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/helpers/helpers.mjs @@ -0,0 +1,10 @@ +import {applyExtends as _applyExtends} from '../build/lib/utils/apply-extends.js'; +import {hideBin} from '../build/lib/utils/process-argv.js'; +import Parser from 'yargs-parser'; +import shim from '../lib/platform-shims/esm.mjs'; + +const applyExtends = (config, cwd, mergeExtends) => { + return _applyExtends(config, cwd, mergeExtends, shim); +}; + +export {applyExtends, hideBin, Parser}; diff --git a/@capacitor/assets/node_modules/yargs/helpers/index.js b/@capacitor/assets/node_modules/yargs/helpers/index.js new file mode 100644 index 00000000..8ab79a33 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/helpers/index.js @@ -0,0 +1,14 @@ +const { + applyExtends, + cjsPlatformShim, + Parser, + processArgv, +} = require('../build/index.cjs'); + +module.exports = { + applyExtends: (config, cwd, mergeExtends) => { + return applyExtends(config, cwd, mergeExtends, cjsPlatformShim); + }, + hideBin: processArgv.hideBin, + Parser, +}; diff --git a/@capacitor/assets/node_modules/yargs/helpers/package.json b/@capacitor/assets/node_modules/yargs/helpers/package.json new file mode 100644 index 00000000..5bbefffb --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/helpers/package.json @@ -0,0 +1,3 @@ +{ + "type": "commonjs" +} diff --git a/@capacitor/assets/node_modules/yargs/index.cjs b/@capacitor/assets/node_modules/yargs/index.cjs new file mode 100644 index 00000000..d1eee821 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/index.cjs @@ -0,0 +1,53 @@ +'use strict'; +// classic singleton yargs API, to use yargs +// without running as a singleton do: +// require('yargs/yargs')(process.argv.slice(2)) +const {Yargs, processArgv} = require('./build/index.cjs'); + +Argv(processArgv.hideBin(process.argv)); + +module.exports = Argv; + +function Argv(processArgs, cwd) { + const argv = Yargs(processArgs, cwd, require); + singletonify(argv); + // TODO(bcoe): warn if argv.parse() or argv.argv is used directly. + return argv; +} + +function defineGetter(obj, key, getter) { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: true, + get: getter, + }); +} +function lookupGetter(obj, key) { + const desc = Object.getOwnPropertyDescriptor(obj, key); + if (typeof desc !== 'undefined') { + return desc.get; + } +} + +/* Hack an instance of Argv with process.argv into Argv + so people can do + require('yargs')(['--beeble=1','-z','zizzle']).argv + to parse a list of args and + require('yargs').argv + to get a parsed version of process.argv. +*/ +function singletonify(inst) { + [ + ...Object.keys(inst), + ...Object.getOwnPropertyNames(inst.constructor.prototype), + ].forEach(key => { + if (key === 'argv') { + defineGetter(Argv, key, lookupGetter(inst, key)); + } else if (typeof inst[key] === 'function') { + Argv[key] = inst[key].bind(inst); + } else { + defineGetter(Argv, '$0', () => inst.$0); + defineGetter(Argv, 'parsed', () => inst.parsed); + } + }); +} diff --git a/@capacitor/assets/node_modules/yargs/index.mjs b/@capacitor/assets/node_modules/yargs/index.mjs new file mode 100644 index 00000000..c6440b9e --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/index.mjs @@ -0,0 +1,8 @@ +'use strict'; + +// Bootstraps yargs for ESM: +import esmPlatformShim from './lib/platform-shims/esm.mjs'; +import {YargsFactory} from './build/lib/yargs-factory.js'; + +const Yargs = YargsFactory(esmPlatformShim); +export default Yargs; diff --git a/@capacitor/assets/node_modules/yargs/lib/platform-shims/browser.mjs b/@capacitor/assets/node_modules/yargs/lib/platform-shims/browser.mjs new file mode 100644 index 00000000..5f8ec61f --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/lib/platform-shims/browser.mjs @@ -0,0 +1,95 @@ +/* eslint-disable no-unused-vars */ +'use strict'; + +import cliui from 'https://unpkg.com/cliui@7.0.1/index.mjs'; // eslint-disable-line +import Parser from 'https://unpkg.com/yargs-parser@19.0.0/browser.js'; // eslint-disable-line +import {getProcessArgvBin} from '../../build/lib/utils/process-argv.js'; +import {YError} from '../../build/lib/yerror.js'; + +const REQUIRE_ERROR = 'require is not supported in browser'; +const REQUIRE_DIRECTORY_ERROR = + 'loading a directory of commands is not supported in browser'; + +export default { + assert: { + notStrictEqual: (a, b) => { + // noop. + }, + strictEqual: (a, b) => { + // noop. + }, + }, + cliui, + findUp: () => undefined, + getEnv: key => { + // There is no environment in browser: + return undefined; + }, + inspect: console.log, + getCallerFile: () => { + throw new YError(REQUIRE_DIRECTORY_ERROR); + }, + getProcessArgvBin, + mainFilename: 'yargs', + Parser, + path: { + basename: str => str, + dirname: str => str, + extname: str => str, + relative: str => str, + }, + process: { + argv: () => [], + cwd: () => '', + emitWarning: (warning, name) => {}, + execPath: () => '', + // exit is noop browser: + exit: () => {}, + nextTick: cb => { + // eslint-disable-next-line no-undef + window.setTimeout(cb, 1); + }, + stdColumns: 80, + }, + readFileSync: () => { + return ''; + }, + require: () => { + throw new YError(REQUIRE_ERROR); + }, + requireDirectory: () => { + throw new YError(REQUIRE_DIRECTORY_ERROR); + }, + stringWidth: str => { + return [...str].length; + }, + // TODO: replace this with y18n once it's ported to ESM: + y18n: { + __: (...str) => { + if (str.length === 0) return ''; + const args = str.slice(1); + return sprintf(str[0], ...args); + }, + __n: (str1, str2, count, ...args) => { + if (count === 1) { + return sprintf(str1, ...args); + } else { + return sprintf(str2, ...args); + } + }, + getLocale: () => { + return 'en_US'; + }, + setLocale: () => {}, + updateLocale: () => {}, + }, +}; + +function sprintf(_str, ...args) { + let str = ''; + const split = _str.split('%s'); + split.forEach((token, i) => { + str += `${token}${split[i + 1] !== undefined && args[i] ? args[i] : ''}`; + }); + return str; +} diff --git a/@capacitor/assets/node_modules/yargs/lib/platform-shims/esm.mjs b/@capacitor/assets/node_modules/yargs/lib/platform-shims/esm.mjs new file mode 100644 index 00000000..c25baa5a --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/lib/platform-shims/esm.mjs @@ -0,0 +1,73 @@ +'use strict' + +import { notStrictEqual, strictEqual } from 'assert' +import cliui from 'cliui' +import escalade from 'escalade/sync' +import { inspect } from 'util' +import { readFileSync } from 'fs' +import { fileURLToPath } from 'url'; +import Parser from 'yargs-parser' +import { basename, dirname, extname, relative, resolve } from 'path' +import { getProcessArgvBin } from '../../build/lib/utils/process-argv.js' +import { YError } from '../../build/lib/yerror.js' +import y18n from 'y18n' + +const REQUIRE_ERROR = 'require is not supported by ESM' +const REQUIRE_DIRECTORY_ERROR = 'loading a directory of commands is not supported yet for ESM' + +let __dirname; +try { + __dirname = fileURLToPath(import.meta.url); +} catch (e) { + __dirname = process.cwd(); +} +const mainFilename = __dirname.substring(0, __dirname.lastIndexOf('node_modules')); + +export default { + assert: { + notStrictEqual, + strictEqual + }, + cliui, + findUp: escalade, + getEnv: (key) => { + return process.env[key] + }, + inspect, + getCallerFile: () => { + throw new YError(REQUIRE_DIRECTORY_ERROR) + }, + getProcessArgvBin, + mainFilename: mainFilename || process.cwd(), + Parser, + path: { + basename, + dirname, + extname, + relative, + resolve + }, + process: { + argv: () => process.argv, + cwd: process.cwd, + emitWarning: (warning, type) => process.emitWarning(warning, type), + execPath: () => process.execPath, + exit: process.exit, + nextTick: process.nextTick, + stdColumns: typeof process.stdout.columns !== 'undefined' ? process.stdout.columns : null + }, + readFileSync, + require: () => { + throw new YError(REQUIRE_ERROR) + }, + requireDirectory: () => { + throw new YError(REQUIRE_DIRECTORY_ERROR) + }, + stringWidth: (str) => { + return [...str].length + }, + y18n: y18n({ + directory: resolve(__dirname, '../../../locales'), + updateFiles: false + }) +} diff --git a/@capacitor/assets/node_modules/yargs/locales/be.json b/@capacitor/assets/node_modules/yargs/locales/be.json new file mode 100644 index 00000000..e28fa301 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/be.json @@ -0,0 +1,46 @@ +{ + "Commands:": "Каманды:", + "Options:": "Опцыі:", + "Examples:": "Прыклады:", + "boolean": "булевы тып", + "count": "падлік", + "string": "радковы тып", + "number": "лік", + "array": "масіў", + "required": "неабходна", + "default": "па змаўчанні", + "default:": "па змаўчанні:", + "choices:": "магчымасці:", + "aliases:": "аліасы:", + "generated-value": "згенераванае значэнне", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Недастаткова неапцыйных аргументаў: ёсць %s, трэба як мінімум %s", + "other": "Недастаткова неапцыйных аргументаў: ёсць %s, трэба як мінімум %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Занадта шмат неапцыйных аргументаў: ёсць %s, максімум дапушчальна %s", + "other": "Занадта шмат неапцыйных аргументаў: ёсць %s, максімум дапушчальна %s" + }, + "Missing argument value: %s": { + "one": "Не хапае значэння аргументу: %s", + "other": "Не хапае значэнняў аргументаў: %s" + }, + "Missing required argument: %s": { + "one": "Не хапае неабходнага аргументу: %s", + "other": "Не хапае неабходных аргументаў: %s" + }, + "Unknown argument: %s": { + "one": "Невядомы аргумент: %s", + "other": "Невядомыя аргументы: %s" + }, + "Invalid values:": "Несапраўдныя значэння:", + "Argument: %s, Given: %s, Choices: %s": "Аргумент: %s, Дадзенае значэнне: %s, Магчымасці: %s", + "Argument check failed: %s": "Праверка аргументаў не ўдалася: %s", + "Implications failed:": "Дадзены аргумент патрабуе наступны дадатковы аргумент:", + "Not enough arguments following: %s": "Недастаткова наступных аргументаў: %s", + "Invalid JSON config file: %s": "Несапраўдны файл канфігурацыі JSON: %s", + "Path to JSON config file": "Шлях да файла канфігурацыі JSON", + "Show help": "Паказаць дапамогу", + "Show version number": "Паказаць нумар версіі", + "Did you mean %s?": "Вы мелі на ўвазе %s?" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/cs.json b/@capacitor/assets/node_modules/yargs/locales/cs.json new file mode 100644 index 00000000..63948756 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/cs.json @@ -0,0 +1,51 @@ +{ + "Commands:": "Příkazy:", + "Options:": "Možnosti:", + "Examples:": "Příklady:", + "boolean": "logická hodnota", + "count": "počet", + "string": "řetězec", + "number": "číslo", + "array": "pole", + "required": "povinné", + "default": "výchozí", + "default:": "výchozí:", + "choices:": "volby:", + "aliases:": "aliasy:", + "generated-value": "generovaná-hodnota", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Nedostatek argumentů: zadáno %s, je potřeba alespoň %s", + "other": "Nedostatek argumentů: zadáno %s, je potřeba alespoň %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Příliš mnoho argumentů: zadáno %s, maximálně %s", + "other": "Příliš mnoho argumentů: zadáno %s, maximálně %s" + }, + "Missing argument value: %s": { + "one": "Chybí hodnota argumentu: %s", + "other": "Chybí hodnoty argumentů: %s" + }, + "Missing required argument: %s": { + "one": "Chybí požadovaný argument: %s", + "other": "Chybí požadované argumenty: %s" + }, + "Unknown argument: %s": { + "one": "Neznámý argument: %s", + "other": "Neznámé argumenty: %s" + }, + "Invalid values:": "Neplatné hodnoty:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Zadáno: %s, Možnosti: %s", + "Argument check failed: %s": "Kontrola argumentů se nezdařila: %s", + "Implications failed:": "Chybí závislé argumenty:", + "Not enough arguments following: %s": "Následuje nedostatek argumentů: %s", + "Invalid JSON config file: %s": "Neplatný konfigurační soubor JSON: %s", + "Path to JSON config file": "Cesta ke konfiguračnímu souboru JSON", + "Show help": "Zobrazit nápovědu", + "Show version number": "Zobrazit číslo verze", + "Did you mean %s?": "Měl jste na mysli %s?", + "Arguments %s and %s are mutually exclusive" : "Argumenty %s a %s se vzájemně vylučují", + "Positionals:": "Poziční:", + "command": "příkaz", + "deprecated": "zastaralé", + "deprecated: %s": "zastaralé: %s" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/de.json b/@capacitor/assets/node_modules/yargs/locales/de.json new file mode 100644 index 00000000..dc73ec3f --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/de.json @@ -0,0 +1,46 @@ +{ + "Commands:": "Kommandos:", + "Options:": "Optionen:", + "Examples:": "Beispiele:", + "boolean": "boolean", + "count": "Zähler", + "string": "string", + "number": "Zahl", + "array": "array", + "required": "erforderlich", + "default": "Standard", + "default:": "Standard:", + "choices:": "Möglichkeiten:", + "aliases:": "Aliase:", + "generated-value": "Generierter-Wert", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Nicht genügend Argumente ohne Optionen: %s vorhanden, mindestens %s benötigt", + "other": "Nicht genügend Argumente ohne Optionen: %s vorhanden, mindestens %s benötigt" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Zu viele Argumente ohne Optionen: %s vorhanden, maximal %s erlaubt", + "other": "Zu viele Argumente ohne Optionen: %s vorhanden, maximal %s erlaubt" + }, + "Missing argument value: %s": { + "one": "Fehlender Argumentwert: %s", + "other": "Fehlende Argumentwerte: %s" + }, + "Missing required argument: %s": { + "one": "Fehlendes Argument: %s", + "other": "Fehlende Argumente: %s" + }, + "Unknown argument: %s": { + "one": "Unbekanntes Argument: %s", + "other": "Unbekannte Argumente: %s" + }, + "Invalid values:": "Unzulässige Werte:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gegeben: %s, Möglichkeiten: %s", + "Argument check failed: %s": "Argumente-Check fehlgeschlagen: %s", + "Implications failed:": "Fehlende abhängige Argumente:", + "Not enough arguments following: %s": "Nicht genügend Argumente nach: %s", + "Invalid JSON config file: %s": "Fehlerhafte JSON-Config Datei: %s", + "Path to JSON config file": "Pfad zur JSON-Config Datei", + "Show help": "Hilfe anzeigen", + "Show version number": "Version anzeigen", + "Did you mean %s?": "Meintest du %s?" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/en.json b/@capacitor/assets/node_modules/yargs/locales/en.json new file mode 100644 index 00000000..af096a11 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/en.json @@ -0,0 +1,55 @@ +{ + "Commands:": "Commands:", + "Options:": "Options:", + "Examples:": "Examples:", + "boolean": "boolean", + "count": "count", + "string": "string", + "number": "number", + "array": "array", + "required": "required", + "default": "default", + "default:": "default:", + "choices:": "choices:", + "aliases:": "aliases:", + "generated-value": "generated-value", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Not enough non-option arguments: got %s, need at least %s", + "other": "Not enough non-option arguments: got %s, need at least %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Too many non-option arguments: got %s, maximum of %s", + "other": "Too many non-option arguments: got %s, maximum of %s" + }, + "Missing argument value: %s": { + "one": "Missing argument value: %s", + "other": "Missing argument values: %s" + }, + "Missing required argument: %s": { + "one": "Missing required argument: %s", + "other": "Missing required arguments: %s" + }, + "Unknown argument: %s": { + "one": "Unknown argument: %s", + "other": "Unknown arguments: %s" + }, + "Unknown command: %s": { + "one": "Unknown command: %s", + "other": "Unknown commands: %s" + }, + "Invalid values:": "Invalid values:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Given: %s, Choices: %s", + "Argument check failed: %s": "Argument check failed: %s", + "Implications failed:": "Missing dependent arguments:", + "Not enough arguments following: %s": "Not enough arguments following: %s", + "Invalid JSON config file: %s": "Invalid JSON config file: %s", + "Path to JSON config file": "Path to JSON config file", + "Show help": "Show help", + "Show version number": "Show version number", + "Did you mean %s?": "Did you mean %s?", + "Arguments %s and %s are mutually exclusive" : "Arguments %s and %s are mutually exclusive", + "Positionals:": "Positionals:", + "command": "command", + "deprecated": "deprecated", + "deprecated: %s": "deprecated: %s" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/es.json b/@capacitor/assets/node_modules/yargs/locales/es.json new file mode 100644 index 00000000..d77b4616 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/es.json @@ -0,0 +1,46 @@ +{ + "Commands:": "Comandos:", + "Options:": "Opciones:", + "Examples:": "Ejemplos:", + "boolean": "booleano", + "count": "cuenta", + "string": "cadena de caracteres", + "number": "número", + "array": "tabla", + "required": "requerido", + "default": "defecto", + "default:": "defecto:", + "choices:": "selección:", + "aliases:": "alias:", + "generated-value": "valor-generado", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Hacen falta argumentos no-opcionales: Número recibido %s, necesita por lo menos %s", + "other": "Hacen falta argumentos no-opcionales: Número recibido %s, necesita por lo menos %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Demasiados argumentos no-opcionales: Número recibido %s, máximo es %s", + "other": "Demasiados argumentos no-opcionales: Número recibido %s, máximo es %s" + }, + "Missing argument value: %s": { + "one": "Falta argumento: %s", + "other": "Faltan argumentos: %s" + }, + "Missing required argument: %s": { + "one": "Falta argumento requerido: %s", + "other": "Faltan argumentos requeridos: %s" + }, + "Unknown argument: %s": { + "one": "Argumento desconocido: %s", + "other": "Argumentos desconocidos: %s" + }, + "Invalid values:": "Valores inválidos:", + "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Recibido: %s, Seleccionados: %s", + "Argument check failed: %s": "Verificación de argumento ha fallado: %s", + "Implications failed:": "Implicaciones fallidas:", + "Not enough arguments following: %s": "No hay suficientes argumentos después de: %s", + "Invalid JSON config file: %s": "Archivo de configuración JSON inválido: %s", + "Path to JSON config file": "Ruta al archivo de configuración JSON", + "Show help": "Muestra ayuda", + "Show version number": "Muestra número de versión", + "Did you mean %s?": "Quisiste decir %s?" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/fi.json b/@capacitor/assets/node_modules/yargs/locales/fi.json new file mode 100644 index 00000000..481feb71 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/fi.json @@ -0,0 +1,49 @@ +{ + "Commands:": "Komennot:", + "Options:": "Valinnat:", + "Examples:": "Esimerkkejä:", + "boolean": "totuusarvo", + "count": "lukumäärä", + "string": "merkkijono", + "number": "numero", + "array": "taulukko", + "required": "pakollinen", + "default": "oletusarvo", + "default:": "oletusarvo:", + "choices:": "vaihtoehdot:", + "aliases:": "aliakset:", + "generated-value": "generoitu-arvo", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Liian vähän argumentteja, jotka eivät ole valintoja: annettu %s, vaaditaan vähintään %s", + "other": "Liian vähän argumentteja, jotka eivät ole valintoja: annettu %s, vaaditaan vähintään %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Liikaa argumentteja, jotka eivät ole valintoja: annettu %s, sallitaan enintään %s", + "other": "Liikaa argumentteja, jotka eivät ole valintoja: annettu %s, sallitaan enintään %s" + }, + "Missing argument value: %s": { + "one": "Argumentin arvo puuttuu: %s", + "other": "Argumentin arvot puuttuvat: %s" + }, + "Missing required argument: %s": { + "one": "Pakollinen argumentti puuttuu: %s", + "other": "Pakollisia argumentteja puuttuu: %s" + }, + "Unknown argument: %s": { + "one": "Tuntematon argumentti: %s", + "other": "Tuntemattomia argumentteja: %s" + }, + "Invalid values:": "Virheelliset arvot:", + "Argument: %s, Given: %s, Choices: %s": "Argumentti: %s, Annettu: %s, Vaihtoehdot: %s", + "Argument check failed: %s": "Argumentin tarkistus epäonnistui: %s", + "Implications failed:": "Riippuvia argumentteja puuttuu:", + "Not enough arguments following: %s": "Argumentin perässä ei ole tarpeeksi argumentteja: %s", + "Invalid JSON config file: %s": "Epävalidi JSON-asetustiedosto: %s", + "Path to JSON config file": "JSON-asetustiedoston polku", + "Show help": "Näytä ohje", + "Show version number": "Näytä versionumero", + "Did you mean %s?": "Tarkoititko %s?", + "Arguments %s and %s are mutually exclusive" : "Argumentit %s ja %s eivät ole yhteensopivat", + "Positionals:": "Sijaintiparametrit:", + "command": "komento" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/fr.json b/@capacitor/assets/node_modules/yargs/locales/fr.json new file mode 100644 index 00000000..edd743f0 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/fr.json @@ -0,0 +1,53 @@ +{ + "Commands:": "Commandes :", + "Options:": "Options :", + "Examples:": "Exemples :", + "boolean": "booléen", + "count": "compteur", + "string": "chaîne de caractères", + "number": "nombre", + "array": "tableau", + "required": "requis", + "default": "défaut", + "default:": "défaut :", + "choices:": "choix :", + "aliases:": "alias :", + "generated-value": "valeur générée", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Pas assez d'arguments (hors options) : reçu %s, besoin d'au moins %s", + "other": "Pas assez d'arguments (hors options) : reçus %s, besoin d'au moins %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Trop d'arguments (hors options) : reçu %s, maximum de %s", + "other": "Trop d'arguments (hors options) : reçus %s, maximum de %s" + }, + "Missing argument value: %s": { + "one": "Argument manquant : %s", + "other": "Arguments manquants : %s" + }, + "Missing required argument: %s": { + "one": "Argument requis manquant : %s", + "other": "Arguments requis manquants : %s" + }, + "Unknown argument: %s": { + "one": "Argument inconnu : %s", + "other": "Arguments inconnus : %s" + }, + "Unknown command: %s": { + "one": "Commande inconnue : %s", + "other": "Commandes inconnues : %s" + }, + "Invalid values:": "Valeurs invalides :", + "Argument: %s, Given: %s, Choices: %s": "Argument : %s, donné : %s, choix : %s", + "Argument check failed: %s": "Echec de la vérification de l'argument : %s", + "Implications failed:": "Arguments dépendants manquants :", + "Not enough arguments following: %s": "Pas assez d'arguments après : %s", + "Invalid JSON config file: %s": "Fichier de configuration JSON invalide : %s", + "Path to JSON config file": "Chemin du fichier de configuration JSON", + "Show help": "Affiche l'aide", + "Show version number": "Affiche le numéro de version", + "Did you mean %s?": "Vouliez-vous dire %s ?", + "Arguments %s and %s are mutually exclusive" : "Les arguments %s et %s sont mutuellement exclusifs", + "Positionals:": "Arguments positionnels :", + "command": "commande" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/hi.json b/@capacitor/assets/node_modules/yargs/locales/hi.json new file mode 100644 index 00000000..a9de77cc --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/hi.json @@ -0,0 +1,49 @@ +{ + "Commands:": "आदेश:", + "Options:": "विकल्प:", + "Examples:": "उदाहरण:", + "boolean": "सत्यता", + "count": "संख्या", + "string": "वर्णों का तार ", + "number": "अंक", + "array": "सरणी", + "required": "आवश्यक", + "default": "डिफॉल्ट", + "default:": "डिफॉल्ट:", + "choices:": "विकल्प:", + "aliases:": "उपनाम:", + "generated-value": "उत्पन्न-मूल्य", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "पर्याप्त गैर-विकल्प तर्क प्राप्त नहीं: %s प्राप्त, कम से कम %s की आवश्यकता है", + "other": "पर्याप्त गैर-विकल्प तर्क प्राप्त नहीं: %s प्राप्त, कम से कम %s की आवश्यकता है" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "बहुत सारे गैर-विकल्प तर्क: %s प्राप्त, अधिकतम %s मान्य", + "other": "बहुत सारे गैर-विकल्प तर्क: %s प्राप्त, अधिकतम %s मान्य" + }, + "Missing argument value: %s": { + "one": "कुछ तर्को के मूल्य गुम हैं: %s", + "other": "कुछ तर्को के मूल्य गुम हैं: %s" + }, + "Missing required argument: %s": { + "one": "आवश्यक तर्क गुम हैं: %s", + "other": "आवश्यक तर्क गुम हैं: %s" + }, + "Unknown argument: %s": { + "one": "अज्ञात तर्क प्राप्त: %s", + "other": "अज्ञात तर्क प्राप्त: %s" + }, + "Invalid values:": "अमान्य मूल्य:", + "Argument: %s, Given: %s, Choices: %s": "तर्क: %s, प्राप्त: %s, विकल्प: %s", + "Argument check failed: %s": "तर्क जांच विफल: %s", + "Implications failed:": "दिए गए तर्क के लिए अतिरिक्त तर्क की अपेक्षा है:", + "Not enough arguments following: %s": "निम्नलिखित के बाद पर्याप्त तर्क नहीं प्राप्त: %s", + "Invalid JSON config file: %s": "अमान्य JSON config फाइल: %s", + "Path to JSON config file": "JSON config फाइल का पथ", + "Show help": "सहायता दिखाएँ", + "Show version number": "Version संख्या दिखाएँ", + "Did you mean %s?": "क्या आपका मतलब है %s?", + "Arguments %s and %s are mutually exclusive" : "तर्क %s और %s परस्पर अनन्य हैं", + "Positionals:": "स्थानीय:", + "command": "आदेश" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/hu.json b/@capacitor/assets/node_modules/yargs/locales/hu.json new file mode 100644 index 00000000..21492d05 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/hu.json @@ -0,0 +1,46 @@ +{ + "Commands:": "Parancsok:", + "Options:": "Opciók:", + "Examples:": "Példák:", + "boolean": "boolean", + "count": "számláló", + "string": "szöveg", + "number": "szám", + "array": "tömb", + "required": "kötelező", + "default": "alapértelmezett", + "default:": "alapértelmezett:", + "choices:": "lehetőségek:", + "aliases:": "aliaszok:", + "generated-value": "generált-érték", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Nincs elég nem opcionális argumentum: %s van, legalább %s kell", + "other": "Nincs elég nem opcionális argumentum: %s van, legalább %s kell" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Túl sok nem opciánlis argumentum van: %s van, maximum %s lehet", + "other": "Túl sok nem opciánlis argumentum van: %s van, maximum %s lehet" + }, + "Missing argument value: %s": { + "one": "Hiányzó argumentum érték: %s", + "other": "Hiányzó argumentum értékek: %s" + }, + "Missing required argument: %s": { + "one": "Hiányzó kötelező argumentum: %s", + "other": "Hiányzó kötelező argumentumok: %s" + }, + "Unknown argument: %s": { + "one": "Ismeretlen argumentum: %s", + "other": "Ismeretlen argumentumok: %s" + }, + "Invalid values:": "Érvénytelen érték:", + "Argument: %s, Given: %s, Choices: %s": "Argumentum: %s, Megadott: %s, Lehetőségek: %s", + "Argument check failed: %s": "Argumentum ellenőrzés sikertelen: %s", + "Implications failed:": "Implikációk sikertelenek:", + "Not enough arguments following: %s": "Nem elég argumentum követi: %s", + "Invalid JSON config file: %s": "Érvénytelen JSON konfigurációs file: %s", + "Path to JSON config file": "JSON konfigurációs file helye", + "Show help": "Súgo megjelenítése", + "Show version number": "Verziószám megjelenítése", + "Did you mean %s?": "Erre gondoltál %s?" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/id.json b/@capacitor/assets/node_modules/yargs/locales/id.json new file mode 100644 index 00000000..125867cb --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/id.json @@ -0,0 +1,50 @@ + +{ + "Commands:": "Perintah:", + "Options:": "Pilihan:", + "Examples:": "Contoh:", + "boolean": "boolean", + "count": "jumlah", + "number": "nomor", + "string": "string", + "array": "larik", + "required": "diperlukan", + "default": "bawaan", + "default:": "bawaan:", + "aliases:": "istilah lain:", + "choices:": "pilihan:", + "generated-value": "nilai-yang-dihasilkan", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Argumen wajib kurang: hanya %s, minimal %s", + "other": "Argumen wajib kurang: hanya %s, minimal %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Terlalu banyak argumen wajib: ada %s, maksimal %s", + "other": "Terlalu banyak argumen wajib: ada %s, maksimal %s" + }, + "Missing argument value: %s": { + "one": "Kurang argumen: %s", + "other": "Kurang argumen: %s" + }, + "Missing required argument: %s": { + "one": "Kurang argumen wajib: %s", + "other": "Kurang argumen wajib: %s" + }, + "Unknown argument: %s": { + "one": "Argumen tak diketahui: %s", + "other": "Argumen tak diketahui: %s" + }, + "Invalid values:": "Nilai-nilai tidak valid:", + "Argument: %s, Given: %s, Choices: %s": "Argumen: %s, Diberikan: %s, Pilihan: %s", + "Argument check failed: %s": "Pemeriksaan argument gagal: %s", + "Implications failed:": "Implikasi gagal:", + "Not enough arguments following: %s": "Kurang argumen untuk: %s", + "Invalid JSON config file: %s": "Berkas konfigurasi JSON tidak valid: %s", + "Path to JSON config file": "Alamat berkas konfigurasi JSON", + "Show help": "Lihat bantuan", + "Show version number": "Lihat nomor versi", + "Did you mean %s?": "Maksud Anda: %s?", + "Arguments %s and %s are mutually exclusive" : "Argumen %s dan %s saling eksklusif", + "Positionals:": "Posisional-posisional:", + "command": "perintah" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/it.json b/@capacitor/assets/node_modules/yargs/locales/it.json new file mode 100644 index 00000000..fde57561 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/it.json @@ -0,0 +1,46 @@ +{ + "Commands:": "Comandi:", + "Options:": "Opzioni:", + "Examples:": "Esempi:", + "boolean": "booleano", + "count": "contatore", + "string": "stringa", + "number": "numero", + "array": "vettore", + "required": "richiesto", + "default": "predefinito", + "default:": "predefinito:", + "choices:": "scelte:", + "aliases:": "alias:", + "generated-value": "valore generato", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Numero insufficiente di argomenti non opzione: inseriti %s, richiesti almeno %s", + "other": "Numero insufficiente di argomenti non opzione: inseriti %s, richiesti almeno %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Troppi argomenti non opzione: inseriti %s, massimo possibile %s", + "other": "Troppi argomenti non opzione: inseriti %s, massimo possibile %s" + }, + "Missing argument value: %s": { + "one": "Argomento mancante: %s", + "other": "Argomenti mancanti: %s" + }, + "Missing required argument: %s": { + "one": "Argomento richiesto mancante: %s", + "other": "Argomenti richiesti mancanti: %s" + }, + "Unknown argument: %s": { + "one": "Argomento sconosciuto: %s", + "other": "Argomenti sconosciuti: %s" + }, + "Invalid values:": "Valori non validi:", + "Argument: %s, Given: %s, Choices: %s": "Argomento: %s, Richiesto: %s, Scelte: %s", + "Argument check failed: %s": "Controllo dell'argomento fallito: %s", + "Implications failed:": "Argomenti dipendenti mancanti:", + "Not enough arguments following: %s": "Argomenti insufficienti dopo: %s", + "Invalid JSON config file: %s": "File di configurazione JSON non valido: %s", + "Path to JSON config file": "Percorso del file di configurazione JSON", + "Show help": "Mostra la schermata di aiuto", + "Show version number": "Mostra il numero di versione", + "Did you mean %s?": "Intendi forse %s?" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/ja.json b/@capacitor/assets/node_modules/yargs/locales/ja.json new file mode 100644 index 00000000..3954ae68 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/ja.json @@ -0,0 +1,51 @@ +{ + "Commands:": "コマンド:", + "Options:": "オプション:", + "Examples:": "例:", + "boolean": "真偽", + "count": "カウント", + "string": "文字列", + "number": "数値", + "array": "配列", + "required": "必須", + "default": "デフォルト", + "default:": "デフォルト:", + "choices:": "選択してください:", + "aliases:": "エイリアス:", + "generated-value": "生成された値", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "オプションではない引数が %s 個では不足しています。少なくとも %s 個の引数が必要です:", + "other": "オプションではない引数が %s 個では不足しています。少なくとも %s 個の引数が必要です:" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "オプションではない引数が %s 個では多すぎます。最大で %s 個までです:", + "other": "オプションではない引数が %s 個では多すぎます。最大で %s 個までです:" + }, + "Missing argument value: %s": { + "one": "引数の値が見つかりません: %s", + "other": "引数の値が見つかりません: %s" + }, + "Missing required argument: %s": { + "one": "必須の引数が見つかりません: %s", + "other": "必須の引数が見つかりません: %s" + }, + "Unknown argument: %s": { + "one": "未知の引数です: %s", + "other": "未知の引数です: %s" + }, + "Invalid values:": "不正な値です:", + "Argument: %s, Given: %s, Choices: %s": "引数は %s です。与えられた値: %s, 選択してください: %s", + "Argument check failed: %s": "引数のチェックに失敗しました: %s", + "Implications failed:": "オプションの組み合わせで不正が生じました:", + "Not enough arguments following: %s": "次の引数が不足しています。: %s", + "Invalid JSON config file: %s": "JSONの設定ファイルが不正です: %s", + "Path to JSON config file": "JSONの設定ファイルまでのpath", + "Show help": "ヘルプを表示", + "Show version number": "バージョンを表示", + "Did you mean %s?": "もしかして %s?", + "Arguments %s and %s are mutually exclusive" : "引数 %s と %s は同時に指定できません", + "Positionals:": "位置:", + "command": "コマンド", + "deprecated": "非推奨", + "deprecated: %s": "非推奨: %s" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/ko.json b/@capacitor/assets/node_modules/yargs/locales/ko.json new file mode 100644 index 00000000..746bc89f --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/ko.json @@ -0,0 +1,49 @@ +{ + "Commands:": "명령:", + "Options:": "옵션:", + "Examples:": "예시:", + "boolean": "불리언", + "count": "개수", + "string": "문자열", + "number": "숫자", + "array": "배열", + "required": "필수", + "default": "기본값", + "default:": "기본값:", + "choices:": "선택지:", + "aliases:": "별칭:", + "generated-value": "생성된 값", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "옵션이 아닌 인수가 충분하지 않습니다: %s개 입력받음, 최소 %s개 입력 필요", + "other": "옵션이 아닌 인수가 충분하지 않습니다: %s개 입력받음, 최소 %s개 입력 필요" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "옵션이 아닌 인수가 너무 많습니다: %s개 입력받음, 최대 %s개 입력 가능", + "other": "옵션이 아닌 인수가 너무 많습니다: %s개 입력받음, 최대 %s개 입력 가능" + }, + "Missing argument value: %s": { + "one": "인수가 주어지지 않았습니다: %s", + "other": "인수가 주어지지 않았습니다: %s" + }, + "Missing required argument: %s": { + "one": "필수 인수가 주어지지 않았습니다: %s", + "other": "필수 인수가 주어지지 않았습니다: %s" + }, + "Unknown argument: %s": { + "one": "알 수 없는 인수입니다: %s", + "other": "알 수 없는 인수입니다: %s" + }, + "Invalid values:": "유효하지 않은 값:", + "Argument: %s, Given: %s, Choices: %s": "인수: %s, 주어진 값: %s, 선택지: %s", + "Argument check failed: %s": "인수 체크에 실패했습니다: %s", + "Implications failed:": "주어진 인수에 필요한 추가 인수가 주어지지 않았습니다:", + "Not enough arguments following: %s": "다음 인수가 주어지지 않았습니다: %s", + "Invalid JSON config file: %s": "유효하지 않은 JSON 설정 파일: %s", + "Path to JSON config file": "JSON 설정 파일 경로", + "Show help": "도움말 표시", + "Show version number": "버전 표시", + "Did you mean %s?": "%s을(를) 찾으시나요?", + "Arguments %s and %s are mutually exclusive" : "인수 %s과(와) %s은(는) 동시에 지정할 수 없습니다", + "Positionals:": "위치:", + "command": "명령" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/nb.json b/@capacitor/assets/node_modules/yargs/locales/nb.json new file mode 100644 index 00000000..6f410ed0 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/nb.json @@ -0,0 +1,44 @@ +{ + "Commands:": "Kommandoer:", + "Options:": "Alternativer:", + "Examples:": "Eksempler:", + "boolean": "boolsk", + "count": "antall", + "string": "streng", + "number": "nummer", + "array": "matrise", + "required": "obligatorisk", + "default": "standard", + "default:": "standard:", + "choices:": "valg:", + "generated-value": "generert-verdi", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Ikke nok ikke-alternativ argumenter: fikk %s, trenger minst %s", + "other": "Ikke nok ikke-alternativ argumenter: fikk %s, trenger minst %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "For mange ikke-alternativ argumenter: fikk %s, maksimum %s", + "other": "For mange ikke-alternativ argumenter: fikk %s, maksimum %s" + }, + "Missing argument value: %s": { + "one": "Mangler argument verdi: %s", + "other": "Mangler argument verdier: %s" + }, + "Missing required argument: %s": { + "one": "Mangler obligatorisk argument: %s", + "other": "Mangler obligatoriske argumenter: %s" + }, + "Unknown argument: %s": { + "one": "Ukjent argument: %s", + "other": "Ukjente argumenter: %s" + }, + "Invalid values:": "Ugyldige verdier:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gitt: %s, Valg: %s", + "Argument check failed: %s": "Argumentsjekk mislyktes: %s", + "Implications failed:": "Konsekvensene mislyktes:", + "Not enough arguments following: %s": "Ikke nok følgende argumenter: %s", + "Invalid JSON config file: %s": "Ugyldig JSON konfigurasjonsfil: %s", + "Path to JSON config file": "Bane til JSON konfigurasjonsfil", + "Show help": "Vis hjelp", + "Show version number": "Vis versjonsnummer" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/nl.json b/@capacitor/assets/node_modules/yargs/locales/nl.json new file mode 100644 index 00000000..9ff95c55 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/nl.json @@ -0,0 +1,49 @@ +{ + "Commands:": "Commando's:", + "Options:": "Opties:", + "Examples:": "Voorbeelden:", + "boolean": "booleaans", + "count": "aantal", + "string": "string", + "number": "getal", + "array": "lijst", + "required": "verplicht", + "default": "standaard", + "default:": "standaard:", + "choices:": "keuzes:", + "aliases:": "aliassen:", + "generated-value": "gegenereerde waarde", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Niet genoeg niet-optie-argumenten: %s gekregen, minstens %s nodig", + "other": "Niet genoeg niet-optie-argumenten: %s gekregen, minstens %s nodig" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Te veel niet-optie-argumenten: %s gekregen, maximum is %s", + "other": "Te veel niet-optie-argumenten: %s gekregen, maximum is %s" + }, + "Missing argument value: %s": { + "one": "Missende argumentwaarde: %s", + "other": "Missende argumentwaarden: %s" + }, + "Missing required argument: %s": { + "one": "Missend verplicht argument: %s", + "other": "Missende verplichte argumenten: %s" + }, + "Unknown argument: %s": { + "one": "Onbekend argument: %s", + "other": "Onbekende argumenten: %s" + }, + "Invalid values:": "Ongeldige waarden:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gegeven: %s, Keuzes: %s", + "Argument check failed: %s": "Argumentcontrole mislukt: %s", + "Implications failed:": "Ontbrekende afhankelijke argumenten:", + "Not enough arguments following: %s": "Niet genoeg argumenten na: %s", + "Invalid JSON config file: %s": "Ongeldig JSON-config-bestand: %s", + "Path to JSON config file": "Pad naar JSON-config-bestand", + "Show help": "Toon help", + "Show version number": "Toon versienummer", + "Did you mean %s?": "Bedoelde u misschien %s?", + "Arguments %s and %s are mutually exclusive": "Argumenten %s en %s kunnen niet tegelijk gebruikt worden", + "Positionals:": "Positie-afhankelijke argumenten", + "command": "commando" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/nn.json b/@capacitor/assets/node_modules/yargs/locales/nn.json new file mode 100644 index 00000000..24479ac9 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/nn.json @@ -0,0 +1,44 @@ +{ + "Commands:": "Kommandoar:", + "Options:": "Alternativ:", + "Examples:": "Døme:", + "boolean": "boolsk", + "count": "mengd", + "string": "streng", + "number": "nummer", + "array": "matrise", + "required": "obligatorisk", + "default": "standard", + "default:": "standard:", + "choices:": "val:", + "generated-value": "generert-verdi", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Ikkje nok ikkje-alternativ argument: fekk %s, treng minst %s", + "other": "Ikkje nok ikkje-alternativ argument: fekk %s, treng minst %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "For mange ikkje-alternativ argument: fekk %s, maksimum %s", + "other": "For mange ikkje-alternativ argument: fekk %s, maksimum %s" + }, + "Missing argument value: %s": { + "one": "Manglar argumentverdi: %s", + "other": "Manglar argumentverdiar: %s" + }, + "Missing required argument: %s": { + "one": "Manglar obligatorisk argument: %s", + "other": "Manglar obligatoriske argument: %s" + }, + "Unknown argument: %s": { + "one": "Ukjent argument: %s", + "other": "Ukjende argument: %s" + }, + "Invalid values:": "Ugyldige verdiar:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Gjeve: %s, Val: %s", + "Argument check failed: %s": "Argumentsjekk mislukkast: %s", + "Implications failed:": "Konsekvensane mislukkast:", + "Not enough arguments following: %s": "Ikkje nok fylgjande argument: %s", + "Invalid JSON config file: %s": "Ugyldig JSON konfigurasjonsfil: %s", + "Path to JSON config file": "Bane til JSON konfigurasjonsfil", + "Show help": "Vis hjelp", + "Show version number": "Vis versjonsnummer" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/pirate.json b/@capacitor/assets/node_modules/yargs/locales/pirate.json new file mode 100644 index 00000000..dcb5cb75 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/pirate.json @@ -0,0 +1,13 @@ +{ + "Commands:": "Choose yer command:", + "Options:": "Options for me hearties!", + "Examples:": "Ex. marks the spot:", + "required": "requi-yar-ed", + "Missing required argument: %s": { + "one": "Ye be havin' to set the followin' argument land lubber: %s", + "other": "Ye be havin' to set the followin' arguments land lubber: %s" + }, + "Show help": "Parlay this here code of conduct", + "Show version number": "'Tis the version ye be askin' fer", + "Arguments %s and %s are mutually exclusive" : "Yon scurvy dogs %s and %s be as bad as rum and a prudish wench" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/pl.json b/@capacitor/assets/node_modules/yargs/locales/pl.json new file mode 100644 index 00000000..a41d4bd5 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/pl.json @@ -0,0 +1,49 @@ +{ + "Commands:": "Polecenia:", + "Options:": "Opcje:", + "Examples:": "Przykłady:", + "boolean": "boolean", + "count": "ilość", + "string": "ciąg znaków", + "number": "liczba", + "array": "tablica", + "required": "wymagany", + "default": "domyślny", + "default:": "domyślny:", + "choices:": "dostępne:", + "aliases:": "aliasy:", + "generated-value": "wygenerowana-wartość", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Niewystarczająca ilość argumentów: otrzymano %s, wymagane co najmniej %s", + "other": "Niewystarczająca ilość argumentów: otrzymano %s, wymagane co najmniej %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Zbyt duża ilość argumentów: otrzymano %s, wymagane co najwyżej %s", + "other": "Zbyt duża ilość argumentów: otrzymano %s, wymagane co najwyżej %s" + }, + "Missing argument value: %s": { + "one": "Brak wartości dla argumentu: %s", + "other": "Brak wartości dla argumentów: %s" + }, + "Missing required argument: %s": { + "one": "Brak wymaganego argumentu: %s", + "other": "Brak wymaganych argumentów: %s" + }, + "Unknown argument: %s": { + "one": "Nieznany argument: %s", + "other": "Nieznane argumenty: %s" + }, + "Invalid values:": "Nieprawidłowe wartości:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Otrzymano: %s, Dostępne: %s", + "Argument check failed: %s": "Weryfikacja argumentów nie powiodła się: %s", + "Implications failed:": "Założenia nie zostały spełnione:", + "Not enough arguments following: %s": "Niewystarczająca ilość argumentów następujących po: %s", + "Invalid JSON config file: %s": "Nieprawidłowy plik konfiguracyjny JSON: %s", + "Path to JSON config file": "Ścieżka do pliku konfiguracyjnego JSON", + "Show help": "Pokaż pomoc", + "Show version number": "Pokaż numer wersji", + "Did you mean %s?": "Czy chodziło Ci o %s?", + "Arguments %s and %s are mutually exclusive": "Argumenty %s i %s wzajemnie się wykluczają", + "Positionals:": "Pozycyjne:", + "command": "polecenie" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/pt.json b/@capacitor/assets/node_modules/yargs/locales/pt.json new file mode 100644 index 00000000..0c8ac99c --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/pt.json @@ -0,0 +1,45 @@ +{ + "Commands:": "Comandos:", + "Options:": "Opções:", + "Examples:": "Exemplos:", + "boolean": "boolean", + "count": "contagem", + "string": "cadeia de caracteres", + "number": "número", + "array": "arranjo", + "required": "requerido", + "default": "padrão", + "default:": "padrão:", + "choices:": "escolhas:", + "generated-value": "valor-gerado", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Argumentos insuficientes não opcionais: Argumento %s, necessário pelo menos %s", + "other": "Argumentos insuficientes não opcionais: Argumento %s, necessário pelo menos %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Excesso de argumentos não opcionais: recebido %s, máximo de %s", + "other": "Excesso de argumentos não opcionais: recebido %s, máximo de %s" + }, + "Missing argument value: %s": { + "one": "Falta valor de argumento: %s", + "other": "Falta valores de argumento: %s" + }, + "Missing required argument: %s": { + "one": "Falta argumento obrigatório: %s", + "other": "Faltando argumentos obrigatórios: %s" + }, + "Unknown argument: %s": { + "one": "Argumento desconhecido: %s", + "other": "Argumentos desconhecidos: %s" + }, + "Invalid values:": "Valores inválidos:", + "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Dado: %s, Escolhas: %s", + "Argument check failed: %s": "Verificação de argumento falhou: %s", + "Implications failed:": "Implicações falharam:", + "Not enough arguments following: %s": "Insuficientes argumentos a seguir: %s", + "Invalid JSON config file: %s": "Arquivo de configuração em JSON esta inválido: %s", + "Path to JSON config file": "Caminho para o arquivo de configuração em JSON", + "Show help": "Mostra ajuda", + "Show version number": "Mostra número de versão", + "Arguments %s and %s are mutually exclusive" : "Argumentos %s e %s são mutualmente exclusivos" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/pt_BR.json b/@capacitor/assets/node_modules/yargs/locales/pt_BR.json new file mode 100644 index 00000000..eae1ec60 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/pt_BR.json @@ -0,0 +1,48 @@ +{ + "Commands:": "Comandos:", + "Options:": "Opções:", + "Examples:": "Exemplos:", + "boolean": "booleano", + "count": "contagem", + "string": "string", + "number": "número", + "array": "array", + "required": "obrigatório", + "default:": "padrão:", + "choices:": "opções:", + "aliases:": "sinônimos:", + "generated-value": "valor-gerado", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Argumentos insuficientes: Argumento %s, necessário pelo menos %s", + "other": "Argumentos insuficientes: Argumento %s, necessário pelo menos %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Excesso de argumentos: recebido %s, máximo de %s", + "other": "Excesso de argumentos: recebido %s, máximo de %s" + }, + "Missing argument value: %s": { + "one": "Falta valor de argumento: %s", + "other": "Falta valores de argumento: %s" + }, + "Missing required argument: %s": { + "one": "Falta argumento obrigatório: %s", + "other": "Faltando argumentos obrigatórios: %s" + }, + "Unknown argument: %s": { + "one": "Argumento desconhecido: %s", + "other": "Argumentos desconhecidos: %s" + }, + "Invalid values:": "Valores inválidos:", + "Argument: %s, Given: %s, Choices: %s": "Argumento: %s, Dado: %s, Opções: %s", + "Argument check failed: %s": "Verificação de argumento falhou: %s", + "Implications failed:": "Implicações falharam:", + "Not enough arguments following: %s": "Argumentos insuficientes a seguir: %s", + "Invalid JSON config file: %s": "Arquivo JSON de configuração inválido: %s", + "Path to JSON config file": "Caminho para o arquivo JSON de configuração", + "Show help": "Exibe ajuda", + "Show version number": "Exibe a versão", + "Did you mean %s?": "Você quis dizer %s?", + "Arguments %s and %s are mutually exclusive" : "Argumentos %s e %s são mutualmente exclusivos", + "Positionals:": "Posicionais:", + "command": "comando" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/ru.json b/@capacitor/assets/node_modules/yargs/locales/ru.json new file mode 100644 index 00000000..d5c9e323 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/ru.json @@ -0,0 +1,51 @@ +{ + "Commands:": "Команды:", + "Options:": "Опции:", + "Examples:": "Примеры:", + "boolean": "булевый тип", + "count": "подсчет", + "string": "строковой тип", + "number": "число", + "array": "массив", + "required": "необходимо", + "default": "по умолчанию", + "default:": "по умолчанию:", + "choices:": "возможности:", + "aliases:": "алиасы:", + "generated-value": "генерированное значение", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Недостаточно неопционных аргументов: есть %s, нужно как минимум %s", + "other": "Недостаточно неопционных аргументов: есть %s, нужно как минимум %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Слишком много неопционных аргументов: есть %s, максимум допустимо %s", + "other": "Слишком много неопционных аргументов: есть %s, максимум допустимо %s" + }, + "Missing argument value: %s": { + "one": "Не хватает значения аргумента: %s", + "other": "Не хватает значений аргументов: %s" + }, + "Missing required argument: %s": { + "one": "Не хватает необходимого аргумента: %s", + "other": "Не хватает необходимых аргументов: %s" + }, + "Unknown argument: %s": { + "one": "Неизвестный аргумент: %s", + "other": "Неизвестные аргументы: %s" + }, + "Invalid values:": "Недействительные значения:", + "Argument: %s, Given: %s, Choices: %s": "Аргумент: %s, Данное значение: %s, Возможности: %s", + "Argument check failed: %s": "Проверка аргументов не удалась: %s", + "Implications failed:": "Данный аргумент требует следующий дополнительный аргумент:", + "Not enough arguments following: %s": "Недостаточно следующих аргументов: %s", + "Invalid JSON config file: %s": "Недействительный файл конфигурации JSON: %s", + "Path to JSON config file": "Путь к файлу конфигурации JSON", + "Show help": "Показать помощь", + "Show version number": "Показать номер версии", + "Did you mean %s?": "Вы имели в виду %s?", + "Arguments %s and %s are mutually exclusive": "Аргументы %s и %s являются взаимоисключающими", + "Positionals:": "Позиционные аргументы:", + "command": "команда", + "deprecated": "устар.", + "deprecated: %s": "устар.: %s" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/th.json b/@capacitor/assets/node_modules/yargs/locales/th.json new file mode 100644 index 00000000..33b048e2 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/th.json @@ -0,0 +1,46 @@ +{ + "Commands:": "คอมมาน", + "Options:": "ออฟชั่น", + "Examples:": "ตัวอย่าง", + "boolean": "บูลีน", + "count": "นับ", + "string": "สตริง", + "number": "ตัวเลข", + "array": "อาเรย์", + "required": "จำเป็น", + "default": "ค่าเริ่มต้", + "default:": "ค่าเริ่มต้น", + "choices:": "ตัวเลือก", + "aliases:": "เอเลียส", + "generated-value": "ค่าที่ถูกสร้างขึ้น", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "ใส่อาร์กิวเมนต์ไม่ครบตามจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการอย่างน้อย %s ค่า", + "other": "ใส่อาร์กิวเมนต์ไม่ครบตามจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการอย่างน้อย %s ค่า" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "ใส่อาร์กิวเมนต์เกินจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการมากที่สุด %s ค่า", + "other": "ใส่อาร์กิวเมนต์เกินจำนวนที่กำหนด: ใส่ค่ามาจำนวน %s ค่า, แต่ต้องการมากที่สุด %s ค่า" + }, + "Missing argument value: %s": { + "one": "ค่าอาร์กิวเมนต์ที่ขาดไป: %s", + "other": "ค่าอาร์กิวเมนต์ที่ขาดไป: %s" + }, + "Missing required argument: %s": { + "one": "อาร์กิวเมนต์จำเป็นที่ขาดไป: %s", + "other": "อาร์กิวเมนต์จำเป็นที่ขาดไป: %s" + }, + "Unknown argument: %s": { + "one": "อาร์กิวเมนต์ที่ไม่รู้จัก: %s", + "other": "อาร์กิวเมนต์ที่ไม่รู้จัก: %s" + }, + "Invalid values:": "ค่าไม่ถูกต้อง:", + "Argument: %s, Given: %s, Choices: %s": "อาร์กิวเมนต์: %s, ได้รับ: %s, ตัวเลือก: %s", + "Argument check failed: %s": "ตรวจสอบพบอาร์กิวเมนต์ที่ไม่ถูกต้อง: %s", + "Implications failed:": "Implications ไม่สำเร็จ:", + "Not enough arguments following: %s": "ใส่อาร์กิวเมนต์ไม่ครบ: %s", + "Invalid JSON config file: %s": "ไฟล์คอนฟิค JSON ไม่ถูกต้อง: %s", + "Path to JSON config file": "พาทไฟล์คอนฟิค JSON", + "Show help": "ขอความช่วยเหลือ", + "Show version number": "แสดงตัวเลขเวอร์ชั่น", + "Did you mean %s?": "คุณหมายถึง %s?" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/tr.json b/@capacitor/assets/node_modules/yargs/locales/tr.json new file mode 100644 index 00000000..0d0d2ccd --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/tr.json @@ -0,0 +1,48 @@ +{ + "Commands:": "Komutlar:", + "Options:": "Seçenekler:", + "Examples:": "Örnekler:", + "boolean": "boolean", + "count": "sayı", + "string": "string", + "number": "numara", + "array": "array", + "required": "zorunlu", + "default": "varsayılan", + "default:": "varsayılan:", + "choices:": "seçimler:", + "aliases:": "takma adlar:", + "generated-value": "oluşturulan-değer", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Seçenek dışı argümanlar yetersiz: %s bulundu, %s gerekli", + "other": "Seçenek dışı argümanlar yetersiz: %s bulundu, %s gerekli" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Seçenek dışı argümanlar gereğinden fazla: %s bulundu, azami %s", + "other": "Seçenek dışı argümanlar gereğinden fazla: %s bulundu, azami %s" + }, + "Missing argument value: %s": { + "one": "Eksik argüman değeri: %s", + "other": "Eksik argüman değerleri: %s" + }, + "Missing required argument: %s": { + "one": "Eksik zorunlu argüman: %s", + "other": "Eksik zorunlu argümanlar: %s" + }, + "Unknown argument: %s": { + "one": "Bilinmeyen argüman: %s", + "other": "Bilinmeyen argümanlar: %s" + }, + "Invalid values:": "Geçersiz değerler:", + "Argument: %s, Given: %s, Choices: %s": "Argüman: %s, Verilen: %s, Seçimler: %s", + "Argument check failed: %s": "Argüman kontrolü başarısız oldu: %s", + "Implications failed:": "Sonuçlar başarısız oldu:", + "Not enough arguments following: %s": "%s için yeterli argüman bulunamadı", + "Invalid JSON config file: %s": "Geçersiz JSON yapılandırma dosyası: %s", + "Path to JSON config file": "JSON yapılandırma dosya konumu", + "Show help": "Yardım detaylarını göster", + "Show version number": "Versiyon detaylarını göster", + "Did you mean %s?": "Bunu mu demek istediniz: %s?", + "Positionals:": "Sıralılar:", + "command": "komut" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/uk_UA.json b/@capacitor/assets/node_modules/yargs/locales/uk_UA.json new file mode 100644 index 00000000..0af0e99c --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/uk_UA.json @@ -0,0 +1,51 @@ +{ + "Commands:": "Команди:", + "Options:": "Опції:", + "Examples:": "Приклади:", + "boolean": "boolean", + "count": "кількість", + "string": "строка", + "number": "число", + "array": "масива", + "required": "обов'язково", + "default": "за замовчуванням", + "default:": "за замовчуванням:", + "choices:": "доступні варіанти:", + "aliases:": "псевдоніми:", + "generated-value": "згенероване значення", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "Недостатньо аргументів: наразі %s, потрібно %s або більше", + "other": "Недостатньо аргументів: наразі %s, потрібно %s або більше" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "Забагато аргументів: наразі %s, максимум %s", + "other": "Too many non-option arguments: наразі %s, максимум of %s" + }, + "Missing argument value: %s": { + "one": "Відсутнє значення для аргументу: %s", + "other": "Відсутні значення для аргументу: %s" + }, + "Missing required argument: %s": { + "one": "Відсутній обов'язковий аргумент: %s", + "other": "Відсутні обов'язкові аргументи: %s" + }, + "Unknown argument: %s": { + "one": "Аргумент %s не підтримується", + "other": "Аргументи %s не підтримуються" + }, + "Invalid values:": "Некоректні значення:", + "Argument: %s, Given: %s, Choices: %s": "Аргумент: %s, Введено: %s, Доступні варіанти: %s", + "Argument check failed: %s": "Аргумент не пройшов перевірку: %s", + "Implications failed:": "Відсутні залежні аргументи:", + "Not enough arguments following: %s": "Не достатньо аргументів після: %s", + "Invalid JSON config file: %s": "Некоректний JSON-файл конфігурації: %s", + "Path to JSON config file": "Шлях до JSON-файлу конфігурації", + "Show help": "Показати довідку", + "Show version number": "Показати версію", + "Did you mean %s?": "Можливо, ви мали на увазі %s?", + "Arguments %s and %s are mutually exclusive" : "Аргументи %s та %s взаємовиключні", + "Positionals:": "Позиційні:", + "command": "команда", + "deprecated": "застарілий", + "deprecated: %s": "застарілий: %s" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/uz.json b/@capacitor/assets/node_modules/yargs/locales/uz.json new file mode 100644 index 00000000..0d071681 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/uz.json @@ -0,0 +1,52 @@ +{ + "Commands:": "Buyruqlar:", + "Options:": "Imkoniyatlar:", + "Examples:": "Misollar:", + "boolean": "boolean", + "count": "sanoq", + "string": "satr", + "number": "raqam", + "array": "massiv", + "required": "majburiy", + "default": "boshlang'ich", + "default:": "boshlang'ich:", + "choices:": "tanlovlar:", + "aliases:": "taxalluslar:", + "generated-value": "yaratilgan-qiymat", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "No-imkoniyat argumentlar yetarli emas: berilgan %s, minimum %s", + "other": "No-imkoniyat argumentlar yetarli emas: berilgan %s, minimum %s" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "No-imkoniyat argumentlar juda ko'p: berilgan %s, maksimum %s", + "other": "No-imkoniyat argumentlar juda ko'p: got %s, maksimum %s" + }, + "Missing argument value: %s": { + "one": "Argument qiymati berilmagan: %s", + "other": "Argument qiymatlari berilmagan: %s" + }, + "Missing required argument: %s": { + "one": "Majburiy argument berilmagan: %s", + "other": "Majburiy argumentlar berilmagan: %s" + }, + "Unknown argument: %s": { + "one": "Noma'lum argument berilmagan: %s", + "other": "Noma'lum argumentlar berilmagan: %s" + }, + "Invalid values:": "Nosoz qiymatlar:", + "Argument: %s, Given: %s, Choices: %s": "Argument: %s, Berilgan: %s, Tanlovlar: %s", + "Argument check failed: %s": "Muvaffaqiyatsiz argument tekshiruvi: %s", + "Implications failed:": "Bog'liq argumentlar berilmagan:", + "Not enough arguments following: %s": "Quyidagi argumentlar yetarli emas: %s", + "Invalid JSON config file: %s": "Nosoz JSON konfiguratsiya fayli: %s", + "Path to JSON config file": "JSON konfiguratsiya fayli joylashuvi", + "Show help": "Yordam ko'rsatish", + "Show version number": "Versiyani ko'rsatish", + "Did you mean %s?": "%s ni nazarda tutyapsizmi?", + "Arguments %s and %s are mutually exclusive" : "%s va %s argumentlari alohida", + "Positionals:": "Positsionallar:", + "command": "buyruq", + "deprecated": "eskirgan", + "deprecated: %s": "eskirgan: %s" + } + \ No newline at end of file diff --git a/@capacitor/assets/node_modules/yargs/locales/zh_CN.json b/@capacitor/assets/node_modules/yargs/locales/zh_CN.json new file mode 100644 index 00000000..257d26ba --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/zh_CN.json @@ -0,0 +1,48 @@ +{ + "Commands:": "命令:", + "Options:": "选项:", + "Examples:": "示例:", + "boolean": "布尔", + "count": "计数", + "string": "字符串", + "number": "数字", + "array": "数组", + "required": "必需", + "default": "默认值", + "default:": "默认值:", + "choices:": "可选值:", + "generated-value": "生成的值", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "缺少 non-option 参数:传入了 %s 个, 至少需要 %s 个", + "other": "缺少 non-option 参数:传入了 %s 个, 至少需要 %s 个" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "non-option 参数过多:传入了 %s 个, 最大允许 %s 个", + "other": "non-option 参数过多:传入了 %s 个, 最大允许 %s 个" + }, + "Missing argument value: %s": { + "one": "没有给此选项指定值:%s", + "other": "没有给这些选项指定值:%s" + }, + "Missing required argument: %s": { + "one": "缺少必须的选项:%s", + "other": "缺少这些必须的选项:%s" + }, + "Unknown argument: %s": { + "one": "无法识别的选项:%s", + "other": "无法识别这些选项:%s" + }, + "Invalid values:": "无效的选项值:", + "Argument: %s, Given: %s, Choices: %s": "选项名称: %s, 传入的值: %s, 可选的值:%s", + "Argument check failed: %s": "选项值验证失败:%s", + "Implications failed:": "缺少依赖的选项:", + "Not enough arguments following: %s": "没有提供足够的值给此选项:%s", + "Invalid JSON config file: %s": "无效的 JSON 配置文件:%s", + "Path to JSON config file": "JSON 配置文件的路径", + "Show help": "显示帮助信息", + "Show version number": "显示版本号", + "Did you mean %s?": "是指 %s?", + "Arguments %s and %s are mutually exclusive" : "选项 %s 和 %s 是互斥的", + "Positionals:": "位置:", + "command": "命令" +} diff --git a/@capacitor/assets/node_modules/yargs/locales/zh_TW.json b/@capacitor/assets/node_modules/yargs/locales/zh_TW.json new file mode 100644 index 00000000..e38495d3 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/locales/zh_TW.json @@ -0,0 +1,51 @@ +{ + "Commands:": "命令:", + "Options:": "選項:", + "Examples:": "範例:", + "boolean": "布林", + "count": "次數", + "string": "字串", + "number": "數字", + "array": "陣列", + "required": "必填", + "default": "預設值", + "default:": "預設值:", + "choices:": "可選值:", + "aliases:": "別名:", + "generated-value": "生成的值", + "Not enough non-option arguments: got %s, need at least %s": { + "one": "non-option 引數不足:只傳入了 %s 個, 至少要 %s 個", + "other": "non-option 引數不足:只傳入了 %s 個, 至少要 %s 個" + }, + "Too many non-option arguments: got %s, maximum of %s": { + "one": "non-option 引數過多:傳入了 %s 個, 但最多 %s 個", + "other": "non-option 引數過多:傳入了 %s 個, 但最多 %s 個" + }, + "Missing argument value: %s": { + "one": "此引數無指定值:%s", + "other": "這些引數無指定值:%s" + }, + "Missing required argument: %s": { + "one": "缺少必須的引數:%s", + "other": "缺少這些必須的引數:%s" + }, + "Unknown argument: %s": { + "one": "未知的引數:%s", + "other": "未知的引數:%s" + }, + "Invalid values:": "無效的選項值:", + "Argument: %s, Given: %s, Choices: %s": "引數名稱: %s, 傳入的值: %s, 可選的值:%s", + "Argument check failed: %s": "引數驗證失敗:%s", + "Implications failed:": "缺少依賴引數:", + "Not enough arguments following: %s": "沒有提供足夠的值給此引數:%s", + "Invalid JSON config file: %s": "無效的 JSON 設置文件:%s", + "Path to JSON config file": "JSON 設置文件的路徑", + "Show help": "顯示說明", + "Show version number": "顯示版本", + "Did you mean %s?": "您是指 %s 嗎?", + "Arguments %s and %s are mutually exclusive" : "引數 %s 和 %s 互斥", + "Positionals:": "位置:", + "command": "命令", + "deprecated": "已淘汰", + "deprecated: %s": "已淘汰:%s" + } diff --git a/@capacitor/assets/node_modules/yargs/package.json b/@capacitor/assets/node_modules/yargs/package.json new file mode 100644 index 00000000..389cc6b0 --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/package.json @@ -0,0 +1,123 @@ +{ + "name": "yargs", + "version": "17.7.2", + "description": "yargs the modern, pirate-themed, successor to optimist.", + "main": "./index.cjs", + "exports": { + "./package.json": "./package.json", + ".": [ + { + "import": "./index.mjs", + "require": "./index.cjs" + }, + "./index.cjs" + ], + "./helpers": { + "import": "./helpers/helpers.mjs", + "require": "./helpers/index.js" + }, + "./browser": { + "import": "./browser.mjs", + "types": "./browser.d.ts" + }, + "./yargs": [ + { + "import": "./yargs.mjs", + "require": "./yargs" + }, + "./yargs" + ] + }, + "type": "module", + "module": "./index.mjs", + "contributors": [ + { + "name": "Yargs Contributors", + "url": "https://github.com/yargs/yargs/graphs/contributors" + } + ], + "files": [ + "browser.mjs", + "browser.d.ts", + "index.cjs", + "helpers/*.js", + "helpers/*", + "index.mjs", + "yargs", + "yargs.mjs", + "build", + "locales", + "LICENSE", + "lib/platform-shims/*.mjs", + "!*.d.ts", + "!**/*.d.ts" + ], + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "devDependencies": { + "@types/chai": "^4.2.11", + "@types/mocha": "^9.0.0", + "@types/node": "^18.0.0", + "c8": "^7.7.0", + "chai": "^4.2.0", + "chalk": "^4.0.0", + "coveralls": "^3.0.9", + "cpr": "^3.0.1", + "cross-env": "^7.0.2", + "cross-spawn": "^7.0.0", + "eslint": "^7.23.0", + "gts": "^3.0.0", + "hashish": "0.0.4", + "mocha": "^9.0.0", + "rimraf": "^3.0.2", + "rollup": "^2.23.0", + "rollup-plugin-cleanup": "^3.1.1", + "rollup-plugin-terser": "^7.0.2", + "rollup-plugin-ts": "^2.0.4", + "typescript": "^4.0.2", + "which": "^2.0.0", + "yargs-test-extends": "^1.0.1" + }, + "scripts": { + "fix": "gts fix && npm run fix:js", + "fix:js": "eslint . --ext cjs --ext mjs --ext js --fix", + "posttest": "npm run check", + "test": "c8 mocha --enable-source-maps ./test/*.cjs --require ./test/before.cjs --timeout=12000 --check-leaks", + "test:esm": "c8 mocha --enable-source-maps ./test/esm/*.mjs --check-leaks", + "coverage": "c8 report --check-coverage", + "prepare": "npm run compile", + "pretest": "npm run compile -- -p tsconfig.test.json && cross-env NODE_ENV=test npm run build:cjs", + "compile": "rimraf build && tsc", + "postcompile": "npm run build:cjs", + "build:cjs": "rollup -c rollup.config.cjs", + "postbuild:cjs": "rimraf ./build/index.cjs.d.ts", + "check": "gts lint && npm run check:js", + "check:js": "eslint . --ext cjs --ext mjs --ext js", + "clean": "gts clean" + }, + "repository": { + "type": "git", + "url": "https://github.com/yargs/yargs.git" + }, + "homepage": "https://yargs.js.org/", + "keywords": [ + "argument", + "args", + "option", + "parser", + "parsing", + "cli", + "command" + ], + "license": "MIT", + "engines": { + "node": ">=12" + } +} diff --git a/@capacitor/assets/node_modules/yargs/yargs b/@capacitor/assets/node_modules/yargs/yargs new file mode 100644 index 00000000..8460d10a --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/yargs @@ -0,0 +1,9 @@ +// TODO: consolidate on using a helpers file at some point in the future, which +// is the approach currently used to export Parser and applyExtends for ESM: +const {applyExtends, cjsPlatformShim, Parser, Yargs, processArgv} = require('./build/index.cjs') +Yargs.applyExtends = (config, cwd, mergeExtends) => { + return applyExtends(config, cwd, mergeExtends, cjsPlatformShim) +} +Yargs.hideBin = processArgv.hideBin +Yargs.Parser = Parser +module.exports = Yargs diff --git a/@capacitor/assets/node_modules/yargs/yargs.mjs b/@capacitor/assets/node_modules/yargs/yargs.mjs new file mode 100644 index 00000000..6d9f390c --- /dev/null +++ b/@capacitor/assets/node_modules/yargs/yargs.mjs @@ -0,0 +1,10 @@ +// TODO: consolidate on using a helpers file at some point in the future, which +// is the approach currently used to export Parser and applyExtends for ESM: +import pkg from './build/index.cjs'; +const {applyExtends, cjsPlatformShim, Parser, processArgv, Yargs} = pkg; +Yargs.applyExtends = (config, cwd, mergeExtends) => { + return applyExtends(config, cwd, mergeExtends, cjsPlatformShim); +}; +Yargs.hideBin = processArgv.hideBin; +Yargs.Parser = Parser; +export default Yargs; diff --git a/@capacitor/assets/package.json b/@capacitor/assets/package.json new file mode 100644 index 00000000..26b7aa49 --- /dev/null +++ b/@capacitor/assets/package.json @@ -0,0 +1,105 @@ +{ + "name": "@capacitor/assets", + "version": "3.0.5", + "description": "Generate icon and splash screen images for Capacitor apps", + "homepage": "https://ionicframework.com", + "author": "Ionic Team ", + "license": "MIT", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "engines": { + "node": ">=10.3.0" + }, + "bin": { + "capacitor-assets": "./bin/capacitor-assets" + }, + "scripts": { + "prepare": "husky install", + "build": "tsc", + "watch": "tsc -w", + "test": "jest --maxWorkers=4", + "lint": "npm run eslint && npm run prettier -- --check", + "fmt": "npm run prettier -- --write", + "eslint": "eslint . --ext ts", + "prettier": "prettier 'src/**/*.ts'", + "prepublishOnly": "npm run build" + }, + "prettier": "@ionic/prettier-config", + "eslintConfig": { + "extends": "@ionic/eslint-config/recommended" + }, + "files": [ + "bin", + "dist" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/ionic-team/capacitor-assets.git" + }, + "bugs": { + "url": "https://github.com/ionic-team/capacitor-assets/issues" + }, + "keywords": [ + "ionic", + "capacitor", + "resources", + "mobile", + "native", + "icon", + "splash screen" + ], + "dependencies": { + "@capacitor/cli": "^5.3.0", + "@ionic/utils-array": "2.1.6", + "@ionic/utils-fs": "3.1.7", + "@trapezedev/project": "^7.0.10", + "commander": "8.3.0", + "debug": "4.3.4", + "fs-extra": "10.1.0", + "node-fetch": "2.7.0", + "node-html-parser": "5.4.2", + "sharp": "0.32.6", + "tslib": "2.6.2", + "yargs": "17.7.2" + }, + "devDependencies": { + "@changesets/cli": "2.26.2", + "@ionic/eslint-config": "0.3.0", + "@ionic/prettier-config": "4.0.0", + "@types/debug": "4.1.8", + "@types/jest": "27.5.2", + "@types/fs-extra": "9.0.13", + "@types/plist": "3.0.2", + "@types/slice-ansi": "5.0.0", + "@types/node": "18.17.15", + "@types/node-fetch": "2.6.5", + "@types/rimraf": "3.0.2", + "@typescript-eslint/eslint-plugin": "5.62.0", + "eslint": "7.32.0", + "husky": "^8.0.1", + "jest": "27.5.1", + "np": "7.7.0", + "prettier": "3.0.3", + "rimraf": "3.0.2", + "tempy": "1.0.1", + "ts-jest": "27.1.5", + "typescript": "4.4.4" + }, + "overrides": { + "@capacitor/cli": { + "plist": { + "@xmldom/xmldom": "0.8.4" + } + }, + "@trapezedev/project": { + "@xmldom/xmldom": "0.7.7", + "mergexml": { + "@xmldom/xmldom": "0.7.7" + } + } + }, + "volta": { + "node": "16.13.2", + "npm": "8.3.0" + } +} \ No newline at end of file diff --git a/@capacitor/cli/LICENSE b/@capacitor/cli/LICENSE new file mode 100644 index 00000000..c3e903bd --- /dev/null +++ b/@capacitor/cli/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present Drifty Co. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/@capacitor/cli/README.md b/@capacitor/cli/README.md new file mode 100644 index 00000000..d758c3ca --- /dev/null +++ b/@capacitor/cli/README.md @@ -0,0 +1,15 @@ +# Capacitor CLI + +The Capacitor command-line interface should be installed locally and executed through `npm` scripts. + +``` +npm install @capacitor/cli --save-dev +``` + +## Using Capacitor CLI + +Consult the Getting Started guide for information on using the CLI and Capacitor scripts. + +### License + +* [MIT](https://github.com/ionic-team/capacitor/blob/HEAD/LICENSE) diff --git a/@capacitor/cli/assets/android-template.tar.gz b/@capacitor/cli/assets/android-template.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..24b4c675cfcd61b3ae24d469c5bed50478a0810c GIT binary patch literal 235405 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%0DelnFeZCv(--TvNk!#GwY2}Ypxrb>_3 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 z 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%0Ayrp!oQ>FYgn; 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 z%0AVsJxC~PIP=Sb3LQTq6B+2M^qv&ze_Eb1vpFDQ<_?4$3eAWCn31cJ3Z=$ z`(tQt(|`W_sgvLS;jU62HTwb3adW1c#UHGTP@*VM-jYC*71uM{O`go389R*+H|8;^ zFFS~l{MV`1F#L?|c|L`Ga`TG1ROibw!oMpWk6YMYY?>KjY_hT)BivxG0lK`@Aj8Z~ z`+2LxVFddJV}h!)zmy69u4nKd`b@Op6kb^kyjA~BxsHJQ@N8y!Cx4k<<(6&aNiAm> z%s&U0#|h7x#cMO}Re;u}Hswvb)gYr;b$_Ggs?*{pGhg%y(l|u|Z=g-5;|rkth4!$y z%-f%zTyRi?dZ4x;zrZga$Kur}NotrVWl%5Le9q&QQNI)kmon4SO>p*!m^|z3SG3o; zWyk9y2h!ej_1J!8fk|cP!>L?HuCaJ%42?L`Q_U;g{PAY?*PS8KE&u}~@Ti7y18V4#SSEiK{>J70e0C)QI*fTr#B!Z2^S+tx{Ul%wg=U(jLTG0=TWlFjPy?CE3hY^JD-OcSb7AxidJUm1(~*Z*sxF>uOaB$n{0;3D!y6F zAR#P#E~%a+16eS4VC+~xNM+d4+e8|CC%5Z`x_!Tj_M48QHOh6P3A-VoM^Cyt9~O&X z{=xu%US?)RrmkV$j=P?PI>%VX=L}sgir)w~_?*(^$cy`4`c_2eDJN8IR&i)7vL&vH zF8&4sS3CDu)sho6naHzfvlz2jHQcL%MDYVcJ5vjkv1;Lq9vr`;4CAT2x1M^2XY&}> za(IqsNi&JeXsaZ;Id_T_b4drM==!3|Y7u>oSF{D1)lK))e1|XAM}FKM8SGdKrw$0V zo2juIC$7cy3Sycbtd_P%Q6qy$hx5Tup%2X=f2K-hm<$5~+7a#vg(0FA2=7ol8J|?e z%CsPJQ}z$Dx71zEKle7?kdQP)ATC-@$0P-dm+iX#^`22)d>cQLjN5Z7fz5nX5^F0|{mJ;A z$m23MHn1xM<90yMn_?VuJVK_F@ofHFPtR*|wc(e@?--F6Z!z=TXrRC2Q{J92)owNI zWciMk8P#kPIj_DjWb`0;P5ZSL9z}8WX_}@`<8S79m}T-zAr)KLhgcUP94S<@`@SE2 zz}1@633ot*U5H(%ozi56|8C8G{@$TV=n4?LFi{UnW>jEs2Yu}7rd#L=9xs>1C=u(Rq5>gS`zU^jY3={`WP-Qz^YcYjE!b$3z#1hlQ29mp zwvZo}#CXL&CJZnT5I`X);o@vq26MTI7F|wN{dX;lQySQ$aB}u-Ts3W1B~*4y=-C%s z2`(05*CEBE<<%Jz=QjU~gZVEfCntOSCYXfL%}&8~n95v>P_0EJ0q&0KKmqQIu-VOD!+W$ zXVZgW{-UjGI#%jr;E{+tQx^uKP_m+B4auVm&a{4?xI$DRSOR-sNmDxj=Sq2&Xp2K`Cuc`O;?upl#KN`Gw!~MgkrqE%g%xIXN zjlAxPy9K@JRGQNh^Ox_R%;nSCX)Px3)b9Vn&UZ&enQZ%#vt%SglO;7dNEFFA=h!q2 zG<1Lt1PKZfBqIU>lA~fkNg`2l&RHZ1q5=wnfFkf7=**d!Gv}On@4S28T6dlLqgQ{` zd+(~+wSPO*2W6Hn_(9iEYRs2${16aJ@_gQJ4yk&$bdy>CE>QU?cEbu6SLzFyUd+Tx z%ro;jreoMEjqugvm1BL*`?W)ienEI<=@idszHTme#xZgRe`-2#pFhjKEODl8(=ESK2xn#JH%Jys56=)}MSdY8da<{)5EkfRt zg!G-#9yg@l#tqwjKhEG97^&ZPyXuPR7T2Q`Jc%%Rrf#liiQ-eJx=nfgV{3Po!?JGu>s?y!Bn+h3f`0F+#eaMvxso9 zrk9w|7mOAvuP!rW`X0Q>2*u^dB_H3Xeutc`?5qm@`nlb_Y|vq6OkeCYA-L3eJl_gW zMMdg((|W`~W&AM25J&aGiMv5Wu5_~c35&AuT|f`dmE_giSrquhlxztpr*p`bW3C;_ zSsY6Q0>S>O^0rK?7JCQP%!xMSPR9iuD*l30{XoK-Tm^-FqSTjp@81x;#7E(Hn~@k7 z*NVz$3GZ`BX{lC6ufnzx zfVFX?7CzU=Dhs>M>!NyVG2!6Gfu!H&4Dt5D$i>1`xkHLW5&FGFbDJQ3G%)|5ki1C_ zx|Fx3;nFIppC{CG^*SGOeoUr;Sto_HpvcBS(80%Ja8GFroq&p3>UgUELg0E4vy^)< zp?9O_XyIUgx~OnC)~U*UPy%m(uH$C*LN(M}Q%y|`0s?{7x?aDIWe~11uIRVDj;FX- zSy@R*XSUTjeD?Zea3E8vrNcXA`o#G=We@XbMWo4%W3SF5mewBqwZRghkppYnp!6ZP zRyfPyA})9J*bdqJ{gbW7+Y~pUF7oj!S+KU5iNEX{JtX^iL;v2 zO7_VbwHvL!zpq)$4dGqg~Dy@4s9EWoX9I;rc1Bf-G61qJ}lBmyUjRu5R7|F;WhHy z()I{rC9uW7?WCp~MQOpEt&NrB(cl!~BN}n|>LMfoEO24d3X4fNzH1)tpoG;^HuXJduO@1Ax;f(HN$Z|JRsN@vB)skU_dy>GRBy8ELA~>u4eoHM(@2S5 z6{i}#*%wQGzvG>LYXBGF+bd*aYGf%-vCq5&Pm$usnQ`yDDe^03^G*^M_WW~=7xAmM zDYgy9J&M)xnpgO4UgXM%_B4iQ3Xr|r^>mrd!K)G=go=^bXwlbx8!7oNw;$5M8pWUrXpDvnt`LJD4aKkfkVUl+3Ba^!xxlf z$$9$Mqc6_X;N%g7eA8nRoak^_^(+GDMum&m>3>!3%Y#40-;+qubxz|KJCLVIk<>-TUAQ0(*P>xcngi4*NeJ zHR zV&}vvWJ+Rxlk)#fDgSA|YySxUXbcL9@Ie3H0sar|U*KO_=I`(?AtfjIAN>Ej?f)GA z0un%RfxqEj;2i$~e}?}b_VLpJfP8$M&%SZ17zP5=e0-FCn$MrnVxSlp#2Ey}K>eVY zK<6{N`zvfdAh0*c1M+hiFcJ>*fMCEN9}pOdL85^0K+r$u2V>C~B-|N`f;pqXo{+yH zCw52Lf*>%;+~4FU*6Vo^WF19(DEzZvwL7K(wue?k6P z@?nC4!a=A&Zj~$Nk7B>=R1!O*{@2WB6Z=yEXFvQ)A!=YS1cCWI|Bt@kvMT)m-Y-i2 zGyMULkbhIpKh&iLDA4F!oxi32^Xd6R5pGET-%z=OU}(rcThI>1W?hEGj_)Fc1_11QR`z_Y;ut zKxZf%SU#sJS~|Kb?`0{^m-l7Ga%tkl_^p#Q=Dzt{fC z{hvSUD!`u?LyBZ%P`D2gg#n;3APf`?K%zW=URVSa15`t!At($`=x-!{`|Zp?6v@cM zgoMZdLV%x^1ArmHAQ<3`0B~k)A^?9+DA*I=4~4-1kN^l6i-7=sf8G)53e1~?ab1r31!lt2Ja6vX{kN96W97lc6~Vd!(ih9W$;RV;pd z0k|Q-*fYWB8LN^QNQDd_Bu3_gb%jB}05A-MMg#s}>wusiImwl?hx2bgsr`^pHvq`Z z4SFWZ8H!d%qEHYp=8_-)2(^YYU?jpF>VZZ5sPvHMW{p1c8}KvGA^{*641mVE ziu$0CUJx(_Ee1!rVb9JG$jHv+qQNMr59TKj&OcBPA0+zB*+3!a-vGn|iS&R$E(!kH z0SEa(5b6*F1_grs><&5qbc6Un5N;3z`1bf&_3`f}e5PT=Gj|sVaD~8-2#?=NgZ^-YP=p)Q59)>m!2mzh3HU8w&$kNwtLGp) z8!8asjzYo}0Nj2c6!fg5LH{J?CL;sEV886nPj&rUTM$AcBljQw|L?ZH=~Ut$`hOn4Phg7rL){<%?H_&x4Z&c}U;mJi@c?u+Gy#_& zKo1~5?T04?m}9VRP^2ILi-w@k3S>NgWcxK%K-|tVA*_ezxi>qLBy^tdA^jjI6x0nO zM8*REAp-x#iS~hjq3%$K+Yb*2MW6e)^Lc0?Q2;m+b(S4sKu{R^ELrqK`k%#~U&s65 za(~1z2*MAFLL$zSNIxhViXr0x{7e-6{r!J>MIaL8A?Ahzqs72j)Y(ar*x8~yuuwOM z*trdRB%25X$2`t3;nE#SP$&MEyu)L6EcX=z~InA!sy^ zj0a%h`Kz7)Q1sdH6$T2%!ayik;2Ens7WRYL9|H0|qk%)DS#S&H)6f#jJge%h-I;Fl@~jX`0-m@_-UAOUcY zHv|C1oQE$I1og8V`ALcffKX?_7U2f_Wz85*$lqiF&iv&M4Wa|l7zkVh07AI^lyS!T zQ_fG`Uors!G(gQn|EF5eXC=#zN(X}aL+RoJ1&hI;t|-u1WEMkXea=cO(H}j5znrQB zh@uc=zwlwvkYCpOLjixuNBmHom_G{S;{!p7{dg4p`3Up^{Tm+f*Y?l+zl5BWti<2H z|B;aX&-HweudlpTCge;NTc)TBwQY8fl5)|A7$x zOhx$$4i1hg4h|0eZwU?6jC8d$%`Je2TDyh={RaA?z|jl(qC!Ih!&PSD6H-fSp9e&H zbO#Lwg>^-6$v#B6rLPv-3Dz<4m97>GMKJPRq%Xd>gW5si{*$Q@;Nak#d67TP>bErH zKWTm%_&+11`#tF|SokAL)Vpba0WusMCq^6`p+9H&;cBgaJQ;$Z2;g~1kz+#~%sR<_ z;v{mky4$HfWOh+6yQ5Nyf;6mylr(W`hKP?c{mw*0io<4{DEIs9aX}+bs6Jy3W)v4Q zrY2XQE?bBDY77?+EeN8jKgdnp5Av^k?*c$i8x@KXqmY}^+zr~50Y z*Tq*m<5oYrzG&2F)wi_J@ga07U0NeU?7v|MZ8XDkDp{EfNZ@>axMN3HVQwlwv$1_G z@Q{e%`HC#z^M^L8;fwcI3WYt-Y3VyT6W;F7$O#A?-omadB+Y za%1d~PfINEwl728O92L@`%C6Rb~{i8xfQ9&+ql7J{H(gzorByiO}m&R5+Tu#+}1{S>=mu z>O;zX%>H_QKY2c%27@BFH={{EU*t7L=jAkl($vn7H(h$ajIR5_LuXYEx#EMEITpUG3UM+tXF(p8-llY*iVy(_$n#(*T{EA~( z?~LysloJUjMAn5d`uVRqZ)J)Gfqie5O%|p1sw=t|^J-jqW-$Ko7R_^4i|1xUs#fb8 zmzk1ks_(@_c#^7Hz4WxKg*3+Xdp}ocQW}R#7 zwp6ON_TDQC8vFX58ZmhHis-lxw5)#vkhUdDS6#)8prq1=+zr&^T476h!cYEQ2~1H6 zzjNr_xJ||A+N)8lYSa-mo(?pm^~?%;q|BLCeZqwnVV3*C6_)1Yrp!KzW?mSQx*4@0 zOSlN3eW$M8`O#gYZ6Q(6Ai6DQ;8EH#w~g<~1O(g1XvGRt+wHa`dcspFm?6EHeltW_ zi7vh?7SCl5Ha0c9O2K1vNv!JN-j=U&+6Qr?O_}lD0;7HuJ4elz);mXgre!_!!NxA= zfPHBpQ|v+ZE%!cV8L!gEYVD89H2DadbjjQn0-t8YK8y-woA9BZ_Lh&6Vo7{Mkt1%; z>~*LTdgYYSAD4g2LE(bB+Jqe=9GpcVm-y65`a89%*>+tN=No~J%X}uGLhMqoFws-( z9PdNH(9-4g!^m)FuS15=L6Iz@A%wC_8^G)ELg>RKf0ocBRZsbtbuak@i3`3;#;u$( z-$}1eZ8LsPb8NSCi7$7&zl3BtNxZH@d}8kMzqN)!(^YmXp>u2?9Pfc%KipVI7k<_v~)Of)! zq;dJ)xQqd#NMCO$RW8@=tM`}ag~3XVol?@ zfq;&)0<@b}>!ZnM=i-=7Gx9}Jp^6wj?n_S}IvVpEDoVSJ^bovZW=YkQ*Sj8Rlwoyg z;|_J1!Mg|u|J9ppx4OTi(s()C^LlNOoZ8e~Aw>i?6k+Huu3L+>DTqm1!PAV8envK3 zwKd?dm1QH^$1s{7BjYMMZvMzzqlmwac82#(q)522ZGoA)6zf`bywbGi*Tg&X(j0Q# zl>Em0wwX=l<50soD3Iq_+kj-#1lni#Wue^kfqOeBHvZiMS#S9q@sxd7`P!kCk)Z(p z`m2;EYp?ih!nL6gmnTyJl$%PDW#&)4saX9^Hf>&;$G{ASr1jXiy9k{BM!k+SLc>H^j^|bU#y04L0~HS^e$_p z_0i|6X^;D!97&%|!?vRbF{b%AvaPhsf}fa8WNaQM_GyqqByQbPu1WzY_V7!*(fh3@Gi4>c zA5$|C&ot`-Z8GPos7v*pY|rQSXpF2`+E&Gn)&a$&tzr-7+R&u60>fP|ZjTAejGL65 zHk6Kg-YdEp^9odtESxm&D`PSfcF%(gcFju280FHoW0QhgUogt4oaogV<)tj9lqrDa z_{(%YKDpOG+JMhjS>*FlW5xnL&Md8&@!6@7chUBkC;c+NSZ$)e+hO5No~Yeq38RuP z^6b^(oQpZn6tkZ2;0 z`Ng+9cd+^NdL?kFBMz*jWq7OyNO!o*S)RP?ZDCm#rrSvD@X;=>+~w)P3wMk;gmRC0 zBCHR#gaVSZ40heFrCLAPo-~YpO7>Yy=LVJ9rnVRXrH>qyc@l^$i!H@-an-;LO!v z7sP+O){4@#=iHO=c$#11ibrmrmVec=llLMG#Ft24l7uL*vU+lu?zD?k>$Z5&FmO^McdpRQ3Fch?x%a4wI3WKwpFiO%2k=HOHA(O!^9HC^B(lF)ec z(1(XF+eJFDwM|@$Nf4j3!-t)|FaC3BP&`*NGkfqwzMid%ea3BW#fa__rcS}q0Y^^& zHuiQ6`z#(bcULscFqY}--JR!Q2rrHqY8zF`Zx|l-k2q87xTWltTgeV#3Jx)ox8${= z9Ap!(`7|3TX!TXRNxWSi-0j|p7<}u>aI?Ah*#F5To}gXH%Dx?@o)uW4ru{|avxz$} zyTjAAmzrUN%rNHe&d$xkz|D*6Gdl@6kOTP~g`}2aT>kMX3SjTj7)7mPpuk&g{!xW1 zs+)Cr+sq3SqUrn=e`d@wN`~)t4N2A5Ja!Vsg;((|{XW zb@95Rkw(|_Kh!3I@cSP}MP76novd0-mojZLNbApFbKJ9)qr3WHVPJbQ`6F`xzyFuw zM%>}T{rTz-MEnHAjCV$rLnu$DTc^uhj_B@N_<-+g7noS8lvEK>$A!Tt4DU? zX@g(9?_DB$uut$L6(Q13{*9!w>uG9m>HLeaUL$Ky<_@#iWkqFScY7;?FTC8VPU@y_ zW~|xRrIH-6={YXTI*%B?GyXo^oa+Mmis9hkNS&S1{938~QkseWdRG0LvpeBSeZzW& zK*3r=F+GD`-ATit-ia{D{y184GP5{LoD^-GnR#8T-mab`+8qAkpJc>>e?Q(?aSexH zASltZ7xC!djQY<~YpUPp$zT}t@6zhY*Q!sH@NjU<32|^F{+?XT6^%iGz!-HT91cRb z89)&bbtJ+Mg2F&hKeFpI3r8fa8oe?;dECY;?%JAAb=A})Ga=(rYT7YRX|BgKV;$Wf z+iAGVT?+N0>urmLV$!1>oJ&cP3+%}z>D7Cn^@YnppI)HfF3hW5zkWhwqBVO3Pf@|| zg2q$umG0e_K{Nrj?3dXC*$JZpCcik?f^WH_%P3ymUVO%E#rnj9lPU;qUmeh(uT#Ek z-x$;v$+{_!&#&5mALZK4Xw*y7I9{V~H7zIi4)S(-IncWJkSW#))Axa5Dz)tkTZyP13v>Lmvq*!O<09+3 z8F1YshCQjjAYWL~CM)4SD)ys#4VKBulw95V7AdyX^P4(o7Wq0qDf8jCTFwax(2}hB zxB3l9(~jmCT1tc0?fOw|7x*K%E?2~Wf=Er5C8bQU%M?Mi0%e8;Q6nUwDE7(Z`OPm< z)WJ{*87Yd2i~w&KfD8R1Aird z%DJlH8$DHrXKqt4$wutLpj+uL#wA!8ukc(e5O-d#l4W+#`Bre_l|6Z9Hno06a-NQT zty|agtZcZ*`}AFM_F2o#LbDYg&A)>PRL;NWbM;ovC#V^cKw)%5?dQ9ib^w`R4Z zKQWT*eJQ?1OR7`A@N^=gxIYqJ5-@uE;%GxuS*9k>u=tew@FaVc`!oCJk439Y{761q ztV++&jabQa^EtexX-%<_GHABRE#7)%>Y;0W`*!ssYsZ&9WrPXhnW_b8j}(eFGdnv{ ztn{>uN9kXr7^=BI$;O`e)|E2!cde-PN;p_wA*F|QL ztMVd~bgNobp5+XB!XAkfPCeJMn)O-Q662!@Ks#6D%JU&gh57D-;U$6G_ZOS1Srs*C zl?6_Y*zswzgzqUvedH^8EE4toI)imXie3)6nD!≪!>84hA)KdY+29#BVF2-Mo| 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𝔍kaBFm$Zrj# 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 *3t!6n` zH;G1e74Rxei7Iao>ZfH{A1HmEnGg`iiq_HEXY(ezO_8w*az$IPS?^HVd>;v;4U94TiyG&MV{ptPMFUHul0MO{q+ey!_;}f z-P#@k7{b9Evakm?cO;g*nQgHx#O-LT`s2zF?lC#er{H{3?m@4FBwxXvqz;2xr|Zyu zFrd}65pr#HSE^2J!S1@vrFl{DT;Ao5g!SH`-xZfPC>2^8_1u&v>@v=-57XZGt|~4S z-`Ad4KWQ}5@?Obbae0~f`+9Ey)TSqYOeq;!4^z#|I5ns0GTZI)Q}Vv&O#y@G^uc4WAusSw3 z%A)+g4<{6Jo61NeFALGHCia%@?p5J>YK5#co2&>M=}UH3Q2P<`%vmB=STy|wBn8E^ z!Ur*w;1GGlTCnly(4(=Y#a4;syV4UfmU|7Sm-cp>ZNlL_z~q~!_D!&U`s}Ebjn18( zc{8)}JLPFDQnCA92`?#66^T=EHR?)YY^Cz4X+NwigsQyx@BG4^pTo~RSMxG1@5z41 z@AXB?DkPuZRU1!R@4w2uUv=)+sE)0%0VbR8EeC=zc6z+o6JFW+raw=3DBHd}6e^UK zw@^MOAKg!U;nFav3J((4U}8_9w|Qw!pA_X}kk-TRt<9%(wHZ)n%=Y2LC!&}|0dp&b z%Co}r*2>-6UDG&!`&$QhFvm2<|Bo&(k$YK$C*Ni<;?0e zq*GPhmv_VC&Y}m7J)@G>y^?1pujZs$H5@4y-EI4uDWFQfjU!<$yE2X(3&d(!qr9RX zky};U8_n4wi{8B&EPr1czeeql9FPZlb7bwH{wQ@A`hb>?*Ap%KW0dbT7k736<6H`$-UR=T2viHA%(jD#N_$^XIhQ zEAmT#;(BhgC~-7EuQ+Rj1+uT9q{8~YopcHw%J5@3#ei+Yd?DV>Av)Pf&$vMBg+2q@|EPr%ebv(ji$lI)A6{`n_FnZF5wp*&M|7{g XdEfOsvssz?TnX)W{E-28z=8h*5uJPa literal 0 HcmV?d00001 diff --git a/@capacitor/cli/assets/capacitor-cordova-android-plugins.tar.gz b/@capacitor/cli/assets/capacitor-cordova-android-plugins.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ec27e1d690870513f67b961d7701149b51a96a81 GIT binary patch literal 927 zcmV;Q17Q3giwFP!000006YW=BZ{j!<R8k=XnoN>jn%6r>WjBs9((>yZ+YD0APi55?O} zI0q$!8RfIc$~XtfeXu>J=XiEjLnu@vmiS^FeWZZW;L_~nv}tPOcxmnj%bKP}(4nHT z5JV9vG&Mp|qVu5?Ga+V-G@6@%1TP665N;G^`S3&b8WBl&M0mJM5HhT_#AXh5D3U@N z#|Xi+la=AG{pf#kT7@zXX^mJ)b`O#*W|aH8vl*Q#tnO{g%182q94ACe91^I9SmH2U zPoc+V@|scC^ByFUGBS?t4#{48|GeaTQQ$+nlgkq01v3M|V>;W?C82yPyfpVtNNL_( z5+7Qv4Zp!^M$EAk`%$G?o=|NTmtwgd9Ega3w?8_>34yxjp!(KMVU(L|X{g}a8wF2= zGS@s%N+^gi(`0K(F7VS?S}asZ)-Iz{%BZ=AuXu^`Qk@^c&G_ni_?Oq;Q|84}vb|X1 zjvZ%|xFTlQTvGK|YDAR=TdUAbFy$_zQ*HkWcJ_SCRAM8VNJbLE4Ng}NF=b?;2x&xA z`A-Qc57{CjKKx<-;@o0o|Jf{KsTYTogQW~JG5p7O9}XR1^-?aOW=`t2IVs%c#|kIp zZ=vq|52Xjvn#grw{QdLC(arVOU@(EpU=$25gW=#R7{hpSaWl!Hj)n%q%Tznph0(X~ zU#^Dm<>un@TL8iDlVF%OvtWBRBxSK;p`a0w7~%yF!G|zfj#%jD6E@# zbJDOz(|UNf-@OVi$Hpu9Ui=Mn8WU}tRluI<-9q*+6(GBFbl{_QJ#;KiTJJ)=84@3s@zLYd=2>Pwlxe(sx}Q&Pjsx z=0*{U#KrQ?RYbe_n0;oQxCPDGyNOa^2OIz2;w5&S88vr=$e)|zi2pOY?Ee4j^}1f= z|JPz$(?kB>^gng#+qD09|Gg*u@3yM`zZx$&|E+hcu0n+h6)LL6#Kh`40$h;A@4xxT-~zcRZ|FQPSB`Eb2NUfa#JJs#(+|qL=m_( zP2zT?VYhcANd#UHC2^F7aS~IHh5-!{@aQPFe?ns{(;lU|krMUSeY&^6u>JyGW*WSj z?Lrl~5X?_7OQ zz?IU_yFuOA^`{jVY_+T~7i`(+m6Mg$)+U?J?OIri+UKg8b5=7htkT!La3wfO)3$kZ zc-GZQRbkBv+%(w`wnp7a*4R>M0}HqZa;T)>aE7cRu-F4qihbcqSDID0R{F*X2|V@< zyBD>>tPr*n^mi4)md#~*O>3}Yk!`f@7s8Tl$SfIl7C8rH~9~eFifZXf0yT(rn~gR{EzyXCjJ~hpZ>4pKTg{y a{X{cwnesm|F)=am4|xJ`*CojS5C8zw(bDt) literal 0 HcmV?d00001 diff --git a/@capacitor/cli/assets/ios-pods-template.tar.gz b/@capacitor/cli/assets/ios-pods-template.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b75580642a36f41cdbf15c35c1e4c86470e3f273 GIT binary patch literal 155319 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�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 T3kBLQL17V*0`g$!5n%oUyDlPt literal 0 HcmV?d00001 diff --git a/@capacitor/cli/assets/ios-spm-template.tar.gz b/@capacitor/cli/assets/ios-spm-template.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..26dbb83af54c9756fc7f025a05a66c047cd393f7 GIT binary patch literal 155078 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 literal 0 HcmV?d00001 diff --git a/@capacitor/cli/dist/android/add.js b/@capacitor/cli/dist/android/add.js new file mode 100644 index 00000000..5bb7ea97 --- /dev/null +++ b/@capacitor/cli/dist/android/add.js @@ -0,0 +1,52 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createLocalProperties = exports.addAndroid = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const os_1 = require("os"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const subprocess_1 = require("../util/subprocess"); +const template_1 = require("../util/template"); +async function addAndroid(config) { + await (0, common_1.runTask)(`Adding native android project in ${colors_1.default.strong(config.android.platformDir)}`, async () => { + return (0, template_1.extractTemplate)(config.cli.assets.android.platformTemplateArchiveAbs, config.android.platformDirAbs); + }); +} +exports.addAndroid = addAndroid; +async function createLocalProperties(platformDir) { + const defaultAndroidPath = (0, path_1.join)((0, os_1.homedir)(), 'Library/Android/sdk'); + if (await (0, utils_fs_1.pathExists)(defaultAndroidPath)) { + const localSettings = ` +## This file is automatically generated by Android Studio. +# Do not modify this file -- YOUR CHANGES WILL BE ERASED! +# +# This file should *NOT* be checked into Version Control Systems, +# as it contains information specific to your local configuration. +# +# Location of the SDK. This is only used by Gradle. +# For customization when using a Version Control System, please read the +# header note. +sdk.dir=${defaultAndroidPath} + `; + await (0, utils_fs_1.writeFile)((0, path_1.join)(platformDir, 'local.properties'), localSettings, { + encoding: 'utf-8', + }); + // Only sync if we were able to create the local properties above, otherwise + // this will fail + try { + await gradleSync(platformDir); + } + catch (e) { + console.error('Error running gradle sync', e); + console.error('Unable to infer default Android SDK settings. This is fine, just run npx cap open android and import and sync gradle manually'); + } + } +} +exports.createLocalProperties = createLocalProperties; +async function gradleSync(platformDir) { + await (0, subprocess_1.runCommand)(`./gradlew`, [], { + cwd: platformDir, + }); +} diff --git a/@capacitor/cli/dist/android/build.js b/@capacitor/cli/dist/android/build.js new file mode 100644 index 00000000..9d26512d --- /dev/null +++ b/@capacitor/cli/dist/android/build.js @@ -0,0 +1,106 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildAndroid = void 0; +const tslib_1 = require("tslib"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const log_1 = require("../log"); +const subprocess_1 = require("../util/subprocess"); +async function buildAndroid(config, buildOptions) { + var _a, _b; + const releaseType = (_a = buildOptions.androidreleasetype) !== null && _a !== void 0 ? _a : 'AAB'; + const releaseTypeIsAAB = releaseType === 'AAB'; + const flavor = (_b = buildOptions.flavor) !== null && _b !== void 0 ? _b : ''; + const arg = releaseTypeIsAAB + ? `:app:bundle${flavor}Release` + : `assemble${flavor}Release`; + const gradleArgs = [arg]; + try { + await (0, common_1.runTask)('Running Gradle build', async () => (0, subprocess_1.runCommand)('./gradlew', gradleArgs, { + cwd: config.android.platformDirAbs, + })); + } + catch (e) { + if (e.includes('EACCES')) { + throw `gradlew file does not have executable permissions. This can happen if the Android platform was added on a Windows machine. Please run ${colors_1.default.strong(`chmod +x ./${config.android.platformDir}/gradlew`)} and try again.`; + } + else { + throw e; + } + } + const releaseDir = releaseTypeIsAAB + ? flavor !== '' + ? `${flavor}Release` + : 'release' + : flavor !== '' + ? (0, path_1.join)(flavor, 'release') + : 'release'; + const releasePath = (0, path_1.join)(config.android.appDirAbs, 'build', 'outputs', releaseTypeIsAAB ? 'bundle' : 'apk', releaseDir); + const unsignedReleaseName = `app${flavor !== '' ? `-${flavor}` : ''}-release${releaseTypeIsAAB ? '' : '-unsigned'}.${releaseType.toLowerCase()}`; + const signedReleaseName = unsignedReleaseName.replace(`-release${releaseTypeIsAAB ? '' : '-unsigned'}.${releaseType.toLowerCase()}`, `-release-signed.${releaseType.toLowerCase()}`); + if (buildOptions.signingtype == 'jarsigner') { + await signWithJarSigner(config, buildOptions, releasePath, signedReleaseName, unsignedReleaseName); + } + else { + await signWithApkSigner(config, buildOptions, releasePath, signedReleaseName, unsignedReleaseName); + } + (0, log_1.logSuccess)(`Successfully generated ${signedReleaseName} at: ${releasePath}`); +} +exports.buildAndroid = buildAndroid; +async function signWithApkSigner(config, buildOptions, releasePath, signedReleaseName, unsignedReleaseName) { + if (!buildOptions.keystorepath || !buildOptions.keystorepass) { + throw 'Missing options. Please supply all options for android signing. (Keystore Path, Keystore Password)'; + } + const signingArgs = [ + 'sign', + '--ks', + buildOptions.keystorepath, + '--ks-pass', + `pass:${buildOptions.keystorepass}`, + '--in', + `${(0, path_1.join)(releasePath, unsignedReleaseName)}`, + '--out', + `${(0, path_1.join)(releasePath, signedReleaseName)}`, + ]; + if (buildOptions.keystorealias) { + signingArgs.push('--ks-key-alias', buildOptions.keystorealias); + } + if (buildOptions.keystorealiaspass) { + signingArgs.push('--key-pass', `pass:${buildOptions.keystorealiaspass}`); + } + await (0, common_1.runTask)('Signing Release', async () => { + await (0, subprocess_1.runCommand)('apksigner', signingArgs, { + cwd: config.android.platformDirAbs, + }); + }); +} +async function signWithJarSigner(config, buildOptions, releasePath, signedReleaseName, unsignedReleaseName) { + if (!buildOptions.keystorepath || + !buildOptions.keystorealias || + !buildOptions.keystorealiaspass || + !buildOptions.keystorepass) { + throw 'Missing options. Please supply all options for android signing. (Keystore Path, Keystore Password, Keystore Key Alias, Keystore Key Password)'; + } + const signingArgs = [ + '-sigalg', + 'SHA1withRSA', + '-digestalg', + 'SHA1', + '-keystore', + buildOptions.keystorepath, + '-keypass', + buildOptions.keystorealiaspass, + '-storepass', + buildOptions.keystorepass, + `-signedjar`, + `${(0, path_1.join)(releasePath, signedReleaseName)}`, + `${(0, path_1.join)(releasePath, unsignedReleaseName)}`, + buildOptions.keystorealias, + ]; + await (0, common_1.runTask)('Signing Release', async () => { + await (0, subprocess_1.runCommand)('jarsigner', signingArgs, { + cwd: config.android.platformDirAbs, + }); + }); +} diff --git a/@capacitor/cli/dist/android/common.js b/@capacitor/cli/dist/android/common.js new file mode 100644 index 00000000..0a86c2c2 --- /dev/null +++ b/@capacitor/cli/dist/android/common.js @@ -0,0 +1,97 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.editProjectSettingsAndroid = exports.resolvePlugin = exports.getAndroidPlugins = exports.checkAndroidPackage = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const plugin_1 = require("../plugin"); +const fs_1 = require("../util/fs"); +async function checkAndroidPackage(config) { + return (0, common_1.checkCapacitorPlatform)(config, 'android'); +} +exports.checkAndroidPackage = checkAndroidPackage; +async function getAndroidPlugins(allPlugins) { + const resolved = await Promise.all(allPlugins.map(async (plugin) => await resolvePlugin(plugin))); + return resolved.filter((plugin) => !!plugin); +} +exports.getAndroidPlugins = getAndroidPlugins; +async function resolvePlugin(plugin) { + var _a; + const platform = 'android'; + if ((_a = plugin.manifest) === null || _a === void 0 ? void 0 : _a.android) { + let pluginFilesPath = plugin.manifest.android.src + ? plugin.manifest.android.src + : platform; + const absolutePath = (0, path_1.join)(plugin.rootPath, pluginFilesPath, plugin.id); + // Android folder shouldn't have subfolders, but they used to, so search for them for compatibility reasons + if (await (0, utils_fs_1.pathExists)(absolutePath)) { + pluginFilesPath = (0, path_1.join)(platform, plugin.id); + } + plugin.android = { + type: 0 /* PluginType.Core */, + path: (0, fs_1.convertToUnixPath)(pluginFilesPath), + }; + } + else if (plugin.xml) { + plugin.android = { + type: 1 /* PluginType.Cordova */, + path: 'src/' + platform, + }; + if ((0, cordova_1.getIncompatibleCordovaPlugins)(platform).includes(plugin.id) || + !(0, plugin_1.getPluginPlatform)(plugin, platform)) { + plugin.android.type = 2 /* PluginType.Incompatible */; + } + } + else { + return null; + } + return plugin; +} +exports.resolvePlugin = resolvePlugin; +/** + * Update an Android project with the desired app name and appId. + * This is a little trickier for Android because the appId becomes + * the package name. + */ +async function editProjectSettingsAndroid(config) { + const appId = config.app.appId; + const appName = config.app.appName + .replace(/&/g, '&') + .replace(/ checkGradlew(config), + () => checkAppSrcDirs(config), + ]); + (0, log_1.logSuccess)('Android looking great! 👌'); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } +} +exports.doctorAndroid = doctorAndroid; +async function checkAppSrcDirs(config) { + if (!(await (0, utils_fs_1.pathExists)(config.android.appDirAbs))) { + return `${colors_1.default.strong(config.android.appDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + if (!(await (0, utils_fs_1.pathExists)(config.android.srcMainDirAbs))) { + return `${colors_1.default.strong(config.android.srcMainDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + if (!(await (0, utils_fs_1.pathExists)(config.android.assetsDirAbs))) { + return `${colors_1.default.strong(config.android.assetsDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + if (!(await (0, utils_fs_1.pathExists)(config.android.webDirAbs))) { + return `${colors_1.default.strong(config.android.webDir)} directory is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + const appSrcMainAssetsWwwIndexHtmlDir = (0, path_1.join)(config.android.webDirAbs, 'index.html'); + if (!(await (0, utils_fs_1.pathExists)(appSrcMainAssetsWwwIndexHtmlDir))) { + return `${colors_1.default.strong('index.html')} file is missing in ${colors_1.default.strong(config.android.webDirAbs)}`; + } + return checkAndroidManifestFile(config); +} +async function checkAndroidManifestFile(config) { + const manifestFileName = 'AndroidManifest.xml'; + const manifestFilePath = (0, path_1.join)(config.android.srcMainDirAbs, manifestFileName); + if (!(await (0, utils_fs_1.pathExists)(manifestFilePath))) { + return `${colors_1.default.strong(manifestFileName)} is missing in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + try { + const xmlData = await (0, xml_1.readXML)(manifestFilePath); + return checkAndroidManifestData(config, xmlData); + } + catch (e) { + return e; + } +} +async function checkAndroidManifestData(config, xmlData) { + const manifestNode = xmlData.manifest; + if (!manifestNode) { + return `Missing ${colors_1.default.input('')} XML node in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + const applicationChildNodes = manifestNode.application; + if (!Array.isArray(manifestNode.application)) { + return `Missing ${colors_1.default.input('')} XML node as a child node of ${colors_1.default.input('')} in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + let mainActivityClassPath = ''; + const mainApplicationNode = applicationChildNodes.find(applicationChildNode => { + const activityChildNodes = applicationChildNode.activity; + if (!Array.isArray(activityChildNodes)) { + return false; + } + const mainActivityNode = activityChildNodes.find(activityChildNode => { + const intentFilterChildNodes = activityChildNode['intent-filter']; + if (!Array.isArray(intentFilterChildNodes)) { + return false; + } + return intentFilterChildNodes.find(intentFilterChildNode => { + const actionChildNodes = intentFilterChildNode.action; + if (!Array.isArray(actionChildNodes)) { + return false; + } + const mainActionChildNode = actionChildNodes.find(actionChildNode => { + const androidName = actionChildNode.$['android:name']; + return androidName === 'android.intent.action.MAIN'; + }); + if (!mainActionChildNode) { + return false; + } + const categoryChildNodes = intentFilterChildNode.category; + if (!Array.isArray(categoryChildNodes)) { + return false; + } + return categoryChildNodes.find(categoryChildNode => { + const androidName = categoryChildNode.$['android:name']; + return androidName === 'android.intent.category.LAUNCHER'; + }); + }); + }); + if (mainActivityNode) { + mainActivityClassPath = mainActivityNode.$['android:name']; + } + return mainActivityNode; + }); + if (!mainApplicationNode) { + return `Missing main ${colors_1.default.input('')} XML node in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + if (!mainActivityClassPath) { + return `Missing ${colors_1.default.input('')} attribute for MainActivity class in ${colors_1.default.strong(config.android.srcMainDir)}`; + } + return checkPackage(config, mainActivityClassPath); +} +async function checkPackage(config, mainActivityClassPath) { + const appSrcMainJavaDir = (0, path_1.join)(config.android.srcMainDirAbs, 'java'); + if (!(await (0, utils_fs_1.pathExists)(appSrcMainJavaDir))) { + return `${colors_1.default.strong('java')} directory is missing in ${colors_1.default.strong(appSrcMainJavaDir)}`; + } + const mainActivityClassName = mainActivityClassPath.split('.').pop(); + const srcFiles = await (0, utils_fs_1.readdirp)(appSrcMainJavaDir, { + filter: entry => !entry.stats.isDirectory() && + ['.java', '.kt'].includes((0, path_1.extname)(entry.path)) && + mainActivityClassName === (0, path_1.parse)(entry.path).name, + }); + if (srcFiles.length == 0) { + return `Main activity file (${mainActivityClassName}) is missing`; + } + return checkBuildGradle(config); +} +async function checkBuildGradle(config) { + const fileName = 'build.gradle'; + const filePath = (0, path_1.join)(config.android.appDirAbs, fileName); + if (!(await (0, utils_fs_1.pathExists)(filePath))) { + return `${colors_1.default.strong(fileName)} file is missing in ${colors_1.default.strong(config.android.appDir)}`; + } + let fileContent = await (0, utils_fs_1.readFile)(filePath, { encoding: 'utf-8' }); + fileContent = fileContent.replace(/'|"/g, '').replace(/\s+/g, ' '); + const searchFor = `applicationId`; + if (fileContent.indexOf(searchFor) === -1) { + return `${colors_1.default.strong('build.gradle')} file missing ${colors_1.default.input(`applicationId`)} config in ${filePath}`; + } + return null; +} +async function checkGradlew(config) { + const fileName = 'gradlew'; + const filePath = (0, path_1.join)(config.android.platformDirAbs, fileName); + if (!(await (0, utils_fs_1.pathExists)(filePath))) { + return `${colors_1.default.strong(fileName)} file is missing in ${colors_1.default.strong(config.android.platformDir)}`; + } + return null; +} +async function checkAndroidInstalled() { + /* + if (!await isInstalled('android')) { + return 'Android is not installed. For information: https://developer.android.com/studio/index.html'; + } + */ + return null; +} diff --git a/@capacitor/cli/dist/android/open.js b/@capacitor/cli/dist/android/open.js new file mode 100644 index 00000000..574bcf83 --- /dev/null +++ b/@capacitor/cli/dist/android/open.js @@ -0,0 +1,28 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.openAndroid = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const open_1 = tslib_1.__importDefault(require("open")); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const log_1 = require("../log"); +const debug = (0, debug_1.default)('capacitor:android:open'); +async function openAndroid(config) { + const androidStudioPath = await config.android.studioPath; + const dir = config.android.platformDirAbs; + try { + if (!(await (0, utils_fs_1.pathExists)(androidStudioPath))) { + throw new Error(`Android Studio does not exist at: ${androidStudioPath}`); + } + await (0, open_1.default)(dir, { app: { name: androidStudioPath }, wait: false }); + log_1.logger.info(`Opening Android project at: ${colors_1.default.strong(config.android.platformDir)}.`); + } + catch (e) { + debug('Error opening Android Studio: %O', e); + log_1.logger.error('Unable to launch Android Studio. Is it installed?\n' + + `Attempted to open Android Studio at: ${colors_1.default.strong(androidStudioPath)}\n` + + `You can configure this with the ${colors_1.default.input('CAPACITOR_ANDROID_STUDIO_PATH')} environment variable.`); + } +} +exports.openAndroid = openAndroid; diff --git a/@capacitor/cli/dist/android/run.js b/@capacitor/cli/dist/android/run.js new file mode 100644 index 00000000..d001ba45 --- /dev/null +++ b/@capacitor/cli/dist/android/run.js @@ -0,0 +1,42 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runAndroid = void 0; +const tslib_1 = require("tslib"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const native_run_1 = require("../util/native-run"); +const subprocess_1 = require("../util/subprocess"); +const debug = (0, debug_1.default)('capacitor:android:run'); +async function runAndroid(config, { target: selectedTarget, flavor: selectedFlavor, forwardPorts: selectedPorts, }) { + var _a; + const target = await (0, common_1.promptForPlatformTarget)(await (0, native_run_1.getPlatformTargets)('android'), selectedTarget); + const runFlavor = selectedFlavor || ((_a = config.android) === null || _a === void 0 ? void 0 : _a.flavor) || ''; + const arg = `assemble${runFlavor}Debug`; + const gradleArgs = [arg]; + debug('Invoking ./gradlew with args: %O', gradleArgs); + try { + await (0, common_1.runTask)('Running Gradle build', async () => (0, subprocess_1.runCommand)('./gradlew', gradleArgs, { + cwd: config.android.platformDirAbs, + })); + } + catch (e) { + if (e.includes('EACCES')) { + throw `gradlew file does not have executable permissions. This can happen if the Android platform was added on a Windows machine. Please run ${colors_1.default.strong(`chmod +x ./${config.android.platformDir}/gradlew`)} and try again.`; + } + else { + throw e; + } + } + const pathToApk = `${config.android.platformDirAbs}/${config.android.appDir}/build/outputs/apk${runFlavor !== '' ? '/' + runFlavor : ''}/debug`; + const apkName = (0, common_1.parseApkNameFromFlavor)(runFlavor); + const apkPath = (0, path_1.resolve)(pathToApk, apkName); + const nativeRunArgs = ['android', '--app', apkPath, '--target', target.id]; + if (selectedPorts) { + nativeRunArgs.push('--forward', `${selectedPorts}`); + } + debug('Invoking native-run with args: %O', nativeRunArgs); + await (0, common_1.runTask)(`Deploying ${colors_1.default.strong(apkName)} to ${colors_1.default.input(target.id)}`, async () => (0, native_run_1.runNativeRun)(nativeRunArgs)); +} +exports.runAndroid = runAndroid; diff --git a/@capacitor/cli/dist/android/update.js b/@capacitor/cli/dist/android/update.js new file mode 100644 index 00000000..76c80f36 --- /dev/null +++ b/@capacitor/cli/dist/android/update.js @@ -0,0 +1,323 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.handleCordovaPluginsGradle = exports.installGradlePlugins = exports.updateAndroid = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const plugin_1 = require("../plugin"); +const copy_1 = require("../tasks/copy"); +const migrate_1 = require("../tasks/migrate"); +const fs_1 = require("../util/fs"); +const node_1 = require("../util/node"); +const template_1 = require("../util/template"); +const common_2 = require("./common"); +const platform = 'android'; +const debug = (0, debug_1.default)('capacitor:android:update'); +async function updateAndroid(config) { + const plugins = await getPluginsTask(config); + const capacitorPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 0 /* PluginType.Core */); + (0, plugin_1.printPlugins)(capacitorPlugins, 'android'); + await writePluginsJson(config, capacitorPlugins); + await removePluginsNativeFiles(config); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + await (0, migrate_1.patchOldCapacitorPlugins)(config); + if (cordovaPlugins.length > 0) { + await copyPluginsNativeFiles(config, cordovaPlugins); + } + if (!(await (0, utils_fs_1.pathExists)(config.android.webDirAbs))) { + await (0, copy_1.copy)(config, platform); + } + await (0, cordova_1.handleCordovaPluginsJS)(cordovaPlugins, config, platform); + await (0, cordova_1.checkPluginDependencies)(plugins, platform); + await installGradlePlugins(config, capacitorPlugins, cordovaPlugins); + await handleCordovaPluginsGradle(config, cordovaPlugins); + await (0, cordova_1.writeCordovaAndroidManifest)(cordovaPlugins, config, platform); + const incompatibleCordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 2 /* PluginType.Incompatible */); + (0, plugin_1.printPlugins)(incompatibleCordovaPlugins, platform, 'incompatible'); + await (0, common_1.checkPlatformVersions)(config, platform); +} +exports.updateAndroid = updateAndroid; +function getGradlePackageName(id) { + return id.replace('@', '').replace('/', '-'); +} +async function writePluginsJson(config, plugins) { + const classes = await findAndroidPluginClasses(plugins); + const pluginsJsonPath = (0, path_1.resolve)(config.android.assetsDirAbs, 'capacitor.plugins.json'); + await (0, utils_fs_1.writeJSON)(pluginsJsonPath, classes, { spaces: '\t' }); +} +async function findAndroidPluginClasses(plugins) { + const entries = []; + for (const plugin of plugins) { + entries.push(...(await findAndroidPluginClassesInPlugin(plugin))); + } + return entries; +} +async function findAndroidPluginClassesInPlugin(plugin) { + if (!plugin.android || (0, plugin_1.getPluginType)(plugin, platform) !== 0 /* PluginType.Core */) { + return []; + } + const srcPath = (0, path_1.resolve)(plugin.rootPath, plugin.android.path, 'src/main'); + const srcFiles = await (0, utils_fs_1.readdirp)(srcPath, { + filter: entry => !entry.stats.isDirectory() && + ['.java', '.kt'].includes((0, path_1.extname)(entry.path)), + }); + const classRegex = /^@(?:CapacitorPlugin|NativePlugin)[\s\S]+?class ([\w]+)/gm; + const packageRegex = /^package ([\w.]+);?$/gm; + debug('Searching %O source files in %O by %O regex', srcFiles.length, srcPath, classRegex); + const entries = await Promise.all(srcFiles.map(async (srcFile) => { + const srcFileContents = await (0, utils_fs_1.readFile)(srcFile, { encoding: 'utf-8' }); + classRegex.lastIndex = 0; + const classMatch = classRegex.exec(srcFileContents); + if (classMatch) { + const className = classMatch[1]; + debug('Searching %O for package by %O regex', srcFile, packageRegex); + packageRegex.lastIndex = 0; + const packageMatch = packageRegex.exec(srcFileContents.substring(0, classMatch.index)); + if (!packageMatch) { + (0, errors_1.fatal)(`Package could not be parsed from Android plugin.\n` + + `Location: ${colors_1.default.strong(srcFile)}`); + } + const packageName = packageMatch[1]; + const classpath = `${packageName}.${className}`; + debug('%O is a suitable plugin class', classpath); + return { + pkg: plugin.id, + classpath, + }; + } + })); + return entries.filter((entry) => !!entry); +} +async function installGradlePlugins(config, capacitorPlugins, cordovaPlugins) { + const capacitorAndroidPackagePath = (0, node_1.resolveNode)(config.app.rootDir, '@capacitor/android', 'package.json'); + if (!capacitorAndroidPackagePath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong('node_modules/@capacitor/android')}.\n` + + `Are you sure ${colors_1.default.strong('@capacitor/android')} is installed?`); + } + const capacitorAndroidPath = (0, path_1.resolve)((0, path_1.dirname)(capacitorAndroidPackagePath), 'capacitor'); + const settingsPath = config.android.platformDirAbs; + const dependencyPath = config.android.appDirAbs; + const relativeCapcitorAndroidPath = (0, fs_1.convertToUnixPath)((0, path_1.relative)(settingsPath, capacitorAndroidPath)); + const settingsLines = `// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('${relativeCapcitorAndroidPath}') +${capacitorPlugins + .map(p => { + if (!p.android) { + return ''; + } + const relativePluginPath = (0, fs_1.convertToUnixPath)((0, path_1.relative)(settingsPath, p.rootPath)); + return ` +include ':${getGradlePackageName(p.id)}' +project(':${getGradlePackageName(p.id)}').projectDir = new File('${relativePluginPath}/${p.android.path}') +`; + }) + .join('')}`; + const applyArray = []; + const frameworksArray = []; + let prefsArray = []; + cordovaPlugins.map(p => { + const relativePluginPath = (0, fs_1.convertToUnixPath)((0, path_1.relative)(dependencyPath, p.rootPath)); + const frameworks = (0, plugin_1.getPlatformElement)(p, platform, 'framework'); + frameworks.map((framework) => { + if (framework.$.custom && + framework.$.custom === 'true' && + framework.$.type && + framework.$.type === 'gradleReference') { + applyArray.push(`apply from: "${relativePluginPath}/${framework.$.src}"`); + } + else if (!framework.$.type && !framework.$.custom) { + if (framework.$.src.startsWith('platform(')) { + frameworksArray.push(` implementation ${framework.$.src}`); + } + else { + frameworksArray.push(` implementation "${framework.$.src}"`); + } + } + }); + prefsArray = prefsArray.concat((0, plugin_1.getAllElements)(p, platform, 'preference')); + }); + let frameworkString = frameworksArray.join('\n'); + frameworkString = await replaceFrameworkVariables(config, prefsArray, frameworkString); + const dependencyLines = `// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN + +android { + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} + +apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" +dependencies { +${capacitorPlugins + .map(p => { + return ` implementation project(':${getGradlePackageName(p.id)}')`; + }) + .join('\n')} +${frameworkString} +} +${applyArray.join('\n')} + +if (hasProperty('postBuildExtras')) { + postBuildExtras() +} +`; + await (0, utils_fs_1.writeFile)((0, path_1.join)(settingsPath, 'capacitor.settings.gradle'), settingsLines); + await (0, utils_fs_1.writeFile)((0, path_1.join)(dependencyPath, 'capacitor.build.gradle'), dependencyLines); +} +exports.installGradlePlugins = installGradlePlugins; +async function handleCordovaPluginsGradle(config, cordovaPlugins) { + var _a, _b, _c; + const pluginsGradlePath = (0, path_1.join)(config.android.cordovaPluginsDirAbs, 'build.gradle'); + const kotlinNeeded = await kotlinNeededCheck(config, cordovaPlugins); + const kotlinVersionString = (_c = (_b = (_a = config.app.extConfig.cordova) === null || _a === void 0 ? void 0 : _a.preferences) === null || _b === void 0 ? void 0 : _b.GradlePluginKotlinVersion) !== null && _c !== void 0 ? _c : '1.8.20'; + const frameworksArray = []; + let prefsArray = []; + const applyArray = []; + applyArray.push(`apply from: "cordova.variables.gradle"`); + cordovaPlugins.map(p => { + const relativePluginPath = (0, fs_1.convertToUnixPath)((0, path_1.relative)(config.android.cordovaPluginsDirAbs, p.rootPath)); + const frameworks = (0, plugin_1.getPlatformElement)(p, platform, 'framework'); + frameworks.map((framework) => { + if (!framework.$.type && !framework.$.custom) { + frameworksArray.push(framework.$.src); + } + else if (framework.$.custom && + framework.$.custom === 'true' && + framework.$.type && + framework.$.type === 'gradleReference') { + applyArray.push(`apply from: "${relativePluginPath}/${framework.$.src}"`); + } + }); + prefsArray = prefsArray.concat((0, plugin_1.getAllElements)(p, platform, 'preference')); + }); + let frameworkString = frameworksArray + .map(f => { + if (f.startsWith('platform(')) { + return ` implementation ${f}`; + } + else { + return ` implementation "${f}"`; + } + }) + .join('\n'); + frameworkString = await replaceFrameworkVariables(config, prefsArray, frameworkString); + if (kotlinNeeded) { + frameworkString += `\n implementation "androidx.core:core-ktx:$androidxCoreKTXVersion"`; + frameworkString += `\n implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"`; + } + const applyString = applyArray.join('\n'); + let buildGradle = await (0, utils_fs_1.readFile)(pluginsGradlePath, { encoding: 'utf-8' }); + buildGradle = buildGradle.replace(/(SUB-PROJECT DEPENDENCIES START)[\s\S]*(\/\/ SUB-PROJECT DEPENDENCIES END)/, '$1\n' + frameworkString.concat('\n') + ' $2'); + buildGradle = buildGradle.replace(/(PLUGIN GRADLE EXTENSIONS START)[\s\S]*(\/\/ PLUGIN GRADLE EXTENSIONS END)/, '$1\n' + applyString.concat('\n') + '$2'); + if (kotlinNeeded) { + buildGradle = buildGradle.replace(/(buildscript\s{\n(\t|\s{4})repositories\s{\n((\t{2}|\s{8}).+\n)+(\t|\s{4})}\n(\t|\s{4})dependencies\s{\n(\t{2}|\s{8}).+)\n((\t|\s{4})}\n}\n)/, `$1\n classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"\n$8`); + buildGradle = buildGradle.replace(/(ext\s{)/, `$1\n androidxCoreKTXVersion = project.hasProperty('androidxCoreKTXVersion') ? rootProject.ext.androidxCoreKTXVersion : '1.8.0'`); + buildGradle = buildGradle.replace(/(buildscript\s{)/, `$1\n ext.kotlin_version = project.hasProperty('kotlin_version') ? rootProject.ext.kotlin_version : '${kotlinVersionString}'`); + buildGradle = buildGradle.replace(/(apply\splugin:\s'com\.android\.library')/, `$1\napply plugin: 'kotlin-android'`); + buildGradle = buildGradle.replace(/(compileOptions\s{\n((\t{2}|\s{8}).+\n)+(\t|\s{4})})\n(})/, `$1\n sourceSets {\n main.java.srcDirs += 'src/main/kotlin'\n }\n$5`); + } + await (0, utils_fs_1.writeFile)(pluginsGradlePath, buildGradle); + const cordovaVariables = `// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +ext { + cdvMinSdkVersion = project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : ${config.android.minVersion} + // Plugin gradle extensions can append to this to have code run at the end. + cdvPluginPostBuildExtras = [] + cordovaConfig = [:] +}`; + await (0, utils_fs_1.writeFile)((0, path_1.join)(config.android.cordovaPluginsDirAbs, 'cordova.variables.gradle'), cordovaVariables); +} +exports.handleCordovaPluginsGradle = handleCordovaPluginsGradle; +async function kotlinNeededCheck(config, cordovaPlugins) { + var _a, _b; + if (((_b = (_a = config.app.extConfig.cordova) === null || _a === void 0 ? void 0 : _a.preferences) === null || _b === void 0 ? void 0 : _b.GradlePluginKotlinEnabled) !== + 'true') { + for (const plugin of cordovaPlugins) { + const androidPlatform = (0, plugin_1.getPluginPlatform)(plugin, platform); + const sourceFiles = androidPlatform['source-file']; + if (sourceFiles) { + for (const srcFile of sourceFiles) { + if (/^.*\.kt$/.test(srcFile['$'].src)) { + return true; + } + } + } + } + return false; + } + else { + return true; + } +} +async function copyPluginsNativeFiles(config, cordovaPlugins) { + const pluginsPath = (0, path_1.join)(config.android.cordovaPluginsDirAbs, 'src', 'main'); + for (const p of cordovaPlugins) { + const androidPlatform = (0, plugin_1.getPluginPlatform)(p, platform); + if (androidPlatform) { + const sourceFiles = androidPlatform['source-file']; + if (sourceFiles) { + for (const sourceFile of sourceFiles) { + const fileName = sourceFile.$.src.split('/').pop(); + let baseFolder = 'java/'; + if (fileName.split('.').pop() === 'aidl') { + baseFolder = 'aidl/'; + } + const target = sourceFile.$['target-dir'] + .replace('app/src/main/', '') + .replace('src/', baseFolder); + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, sourceFile.$.src), (0, path_1.join)(pluginsPath, target, fileName)); + } + } + const resourceFiles = androidPlatform['resource-file']; + if (resourceFiles) { + for (const resourceFile of resourceFiles) { + const target = resourceFile.$['target']; + if (resourceFile.$.src.split('.').pop() === 'aar') { + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, resourceFile.$.src), (0, path_1.join)(pluginsPath, 'libs', target.split('/').pop())); + } + else if (target !== '.') { + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, resourceFile.$.src), (0, path_1.join)(pluginsPath, target)); + } + } + } + const libFiles = (0, plugin_1.getPlatformElement)(p, platform, 'lib-file'); + for (const libFile of libFiles) { + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, libFile.$.src), (0, path_1.join)(pluginsPath, 'libs', libFile.$.src.split('/').pop())); + } + } + } +} +async function removePluginsNativeFiles(config) { + await (0, utils_fs_1.remove)(config.android.cordovaPluginsDirAbs); + await (0, template_1.extractTemplate)(config.cli.assets.android.cordovaPluginsTemplateArchiveAbs, config.android.cordovaPluginsDirAbs); +} +async function getPluginsTask(config) { + return await (0, common_1.runTask)('Updating Android plugins', async () => { + const allPlugins = await (0, plugin_1.getPlugins)(config, 'android'); + const androidPlugins = await (0, common_2.getAndroidPlugins)(allPlugins); + return androidPlugins; + }); +} +async function getVariablesGradleFile(config) { + const variablesFile = (0, path_1.resolve)(config.android.platformDirAbs, 'variables.gradle'); + let variablesGradle = ''; + if (await (0, utils_fs_1.pathExists)(variablesFile)) { + variablesGradle = await (0, utils_fs_1.readFile)(variablesFile, { encoding: 'utf-8' }); + } + return variablesGradle; +} +async function replaceFrameworkVariables(config, prefsArray, frameworkString) { + const variablesGradle = await getVariablesGradleFile(config); + prefsArray.map((preference) => { + if (!variablesGradle.includes(preference.$.name)) { + frameworkString = frameworkString.replace(new RegExp(('$' + preference.$.name).replace('$', '\\$&'), 'g'), preference.$.default); + } + }); + return frameworkString; +} diff --git a/@capacitor/cli/dist/colors.js b/@capacitor/cli/dist/colors.js new file mode 100644 index 00000000..8fe2c66c --- /dev/null +++ b/@capacitor/cli/dist/colors.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ancillary = exports.failure = exports.success = exports.input = exports.weak = exports.strong = void 0; +const tslib_1 = require("tslib"); +const kleur_1 = tslib_1.__importDefault(require("kleur")); +exports.strong = kleur_1.default.bold; +exports.weak = kleur_1.default.dim; +exports.input = kleur_1.default.cyan; +exports.success = kleur_1.default.green; +exports.failure = kleur_1.default.red; +exports.ancillary = kleur_1.default.cyan; +const COLORS = { + strong: exports.strong, + weak: exports.weak, + input: exports.input, + success: exports.success, + failure: exports.failure, + ancillary: exports.ancillary, + log: { + DEBUG: kleur_1.default.magenta, + INFO: kleur_1.default.cyan, + WARN: kleur_1.default.yellow, + ERROR: kleur_1.default.red, + }, +}; +exports.default = COLORS; diff --git a/@capacitor/cli/dist/common.js b/@capacitor/cli/dist/common.js new file mode 100644 index 00000000..b4e5cafc --- /dev/null +++ b/@capacitor/cli/dist/common.js @@ -0,0 +1,407 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.parseApkNameFromFlavor = exports.checkJDKMajorVersion = exports.resolvePlatform = exports.checkPlatformVersions = exports.getAddedPlatforms = exports.getPlatformTargetName = exports.promptForPlatformTarget = exports.promptForPlatform = exports.isValidEnterprisePlatform = exports.getKnownEnterprisePlatforms = exports.isValidCommunityPlatform = exports.getKnownCommunityPlatforms = exports.isValidPlatform = exports.getKnownPlatforms = exports.selectPlatforms = exports.getProjectPlatformDirectory = exports.getCLIVersion = exports.getCoreVersion = exports.getCapacitorPackageVersion = exports.requireCapacitorPackage = exports.getCapacitorPackage = exports.runTask = exports.runPlatformHook = exports.runHooks = exports.wait = exports.checkAppName = exports.checkAppId = exports.checkAppDir = exports.checkAppConfig = exports.checkCapacitorPlatform = exports.checkPackage = exports.checkWebDir = exports.check = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const errors_1 = require("./errors"); +const log_1 = require("./log"); +const plugin_1 = require("./plugin"); +const monorepotools_1 = require("./util/monorepotools"); +const node_1 = require("./util/node"); +const subprocess_1 = require("./util/subprocess"); +async function check(checks) { + const results = await Promise.all(checks.map(f => f())); + const errors = results.filter(r => r != null); + if (errors.length > 0) { + throw errors.join('\n'); + } +} +exports.check = check; +async function checkWebDir(config) { + var _a; + // We can skip checking the web dir if a server URL is set. + if ((_a = config.app.extConfig.server) === null || _a === void 0 ? void 0 : _a.url) { + return null; + } + const invalidFolders = ['', '.', '..', '../', './']; + if (invalidFolders.includes(config.app.webDir)) { + return `"${config.app.webDir}" is not a valid value for webDir`; + } + if (!(await (0, utils_fs_1.pathExists)(config.app.webDirAbs))) { + return (`Could not find the web assets directory: ${colors_1.default.strong((0, utils_terminal_1.prettyPath)(config.app.webDirAbs))}.\n` + + `Please create it and make sure it has an ${colors_1.default.strong('index.html')} file. You can change the path of this directory in ${colors_1.default.strong(config.app.extConfigName)} (${colors_1.default.input('webDir')} option). You may need to compile the web assets for your app (typically ${colors_1.default.input('npm run build')}). More info: ${colors_1.default.strong('https://capacitorjs.com/docs/basics/workflow#sync-your-project')}`); + } + if (!(await (0, utils_fs_1.pathExists)((0, path_1.join)(config.app.webDirAbs, 'index.html')))) { + return (`The web assets directory (${colors_1.default.strong((0, utils_terminal_1.prettyPath)(config.app.webDirAbs))}) must contain an ${colors_1.default.strong('index.html')} file.\n` + + `It will be the entry point for the web portion of the Capacitor app.`); + } + return null; +} +exports.checkWebDir = checkWebDir; +async function checkPackage() { + if (!(await (0, utils_fs_1.pathExists)('package.json'))) { + if (await (0, utils_fs_1.pathExists)('project.json')) { + return null; + } + else { + return (`The Capacitor CLI needs to run at the root of an npm package or in a valid NX monorepo.\n` + + `Make sure you have a package.json or project.json file in the directory where you run the Capacitor CLI.\n` + + `More info: ${colors_1.default.strong('https://docs.npmjs.com/cli/init')}`); + } + } + return null; +} +exports.checkPackage = checkPackage; +async function checkCapacitorPlatform(config, platform) { + const pkg = await getCapacitorPackage(config, platform); + if (!pkg) { + return (`Could not find the ${colors_1.default.input(platform)} platform.\n` + + `You must install it in your project first, e.g. w/ ${colors_1.default.input(`npm install @capacitor/${platform}`)}`); + } + return null; +} +exports.checkCapacitorPlatform = checkCapacitorPlatform; +async function checkAppConfig(config) { + if (!config.app.appId) { + return (`Missing ${colors_1.default.input('appId')} for new platform.\n` + + `Please add it in ${config.app.extConfigName} or run ${colors_1.default.input('npx cap init')}.`); + } + if (!config.app.appName) { + return (`Missing ${colors_1.default.input('appName')} for new platform.\n` + + `Please add it in ${config.app.extConfigName} or run ${colors_1.default.input('npx cap init')}.`); + } + const appIdError = await checkAppId(config, config.app.appId); + if (appIdError) { + return appIdError; + } + const appNameError = await checkAppName(config, config.app.appName); + if (appNameError) { + return appNameError; + } + return null; +} +exports.checkAppConfig = checkAppConfig; +async function checkAppDir(config, dir) { + if (!/^\S*$/.test(dir)) { + return `Your app directory should not contain spaces`; + } + return null; +} +exports.checkAppDir = checkAppDir; +async function checkAppId(config, id) { + if (!id) { + return `Invalid App ID. Must be in Java package form with no dashes (ex: com.example.app)`; + } + if (/^[a-z][a-z0-9_]*(\.[a-z0-9_]+)+$/.test(id.toLowerCase())) { + return null; + } + return `Invalid App ID "${id}". Must be in Java package form with no dashes (ex: com.example.app)`; +} +exports.checkAppId = checkAppId; +async function checkAppName(config, name) { + // We allow pretty much anything right now, have fun + if (!(name === null || name === void 0 ? void 0 : name.length)) { + return `Must provide an app name. For example: 'Spacebook'`; + } + return null; +} +exports.checkAppName = checkAppName; +async function wait(time) { + return new Promise(resolve => setTimeout(resolve, time)); +} +exports.wait = wait; +async function runHooks(config, platformName, dir, hook) { + await runPlatformHook(config, platformName, dir, hook); + const allPlugins = await (0, plugin_1.getPlugins)(config, platformName); + allPlugins.forEach(async (p) => { + await runPlatformHook(config, platformName, p.rootPath, hook); + }); +} +exports.runHooks = runHooks; +async function runPlatformHook(config, platformName, platformDir, hook) { + var _a; + const { spawn } = await Promise.resolve().then(() => tslib_1.__importStar(require('child_process'))); + let pkg; + if ((0, monorepotools_1.isNXMonorepo)(platformDir)) { + pkg = await (0, utils_fs_1.readJSON)((0, path_1.join)((0, monorepotools_1.findNXMonorepoRoot)(platformDir), 'package.json')); + } + else { + pkg = await (0, utils_fs_1.readJSON)((0, path_1.join)(platformDir, 'package.json')); + } + const cmd = (_a = pkg.scripts) === null || _a === void 0 ? void 0 : _a[hook]; + if (!cmd) { + return; + } + return new Promise((resolve, reject) => { + const p = spawn(cmd, { + stdio: 'inherit', + shell: true, + cwd: platformDir, + env: { + INIT_CWD: platformDir, + CAPACITOR_ROOT_DIR: config.app.rootDir, + CAPACITOR_WEB_DIR: config.app.webDirAbs, + CAPACITOR_CONFIG: JSON.stringify(config.app.extConfig), + CAPACITOR_PLATFORM_NAME: platformName, + ...process.env, + }, + }); + p.on('close', () => { + resolve(); + }); + p.on('error', err => { + reject(err); + }); + }); +} +exports.runPlatformHook = runPlatformHook; +async function runTask(title, fn) { + const chain = log_1.output.createTaskChain(); + chain.next(title); + try { + const value = await fn(); + chain.end(); + return value; + } + catch (e) { + chain.fail(); + throw e; + } +} +exports.runTask = runTask; +async function getCapacitorPackage(config, name) { + const packagePath = (0, node_1.resolveNode)(config.app.rootDir, `@capacitor/${name}`, 'package.json'); + if (!packagePath) { + return null; + } + return (0, utils_fs_1.readJSON)(packagePath); +} +exports.getCapacitorPackage = getCapacitorPackage; +async function requireCapacitorPackage(config, name) { + const pkg = await getCapacitorPackage(config, name); + if (!pkg) { + (0, errors_1.fatal)(`Unable to find node_modules/@capacitor/${name}.\n` + + `Are you sure ${colors_1.default.strong(`@capacitor/${name}`)} is installed?`); + } + return pkg; +} +exports.requireCapacitorPackage = requireCapacitorPackage; +async function getCapacitorPackageVersion(config, platform) { + return (await requireCapacitorPackage(config, platform)).version; +} +exports.getCapacitorPackageVersion = getCapacitorPackageVersion; +async function getCoreVersion(config) { + return getCapacitorPackageVersion(config, 'core'); +} +exports.getCoreVersion = getCoreVersion; +async function getCLIVersion(config) { + return getCapacitorPackageVersion(config, 'cli'); +} +exports.getCLIVersion = getCLIVersion; +function getPlatformDirectory(config, platform) { + switch (platform) { + case 'android': + return config.android.platformDirAbs; + case 'ios': + return config.ios.platformDirAbs; + case 'web': + return config.web.platformDirAbs; + } + return null; +} +async function getProjectPlatformDirectory(config, platform) { + const platformPath = getPlatformDirectory(config, platform); + if (platformPath && (await (0, utils_fs_1.pathExists)(platformPath))) { + return platformPath; + } + return null; +} +exports.getProjectPlatformDirectory = getProjectPlatformDirectory; +async function selectPlatforms(config, selectedPlatformName) { + if (selectedPlatformName) { + // already passed in a platform name + const platformName = selectedPlatformName.toLowerCase().trim(); + if (!(await isValidPlatform(platformName))) { + (0, errors_1.fatal)(`Invalid platform: ${colors_1.default.input(platformName)}`); + } + else if (!(await getProjectPlatformDirectory(config, platformName))) { + if (platformName === 'web') { + (0, errors_1.fatal)(`Could not find the web platform directory.\n` + + `Make sure ${colors_1.default.strong(config.app.webDir)} exists.`); + } + (0, errors_1.fatal)(`${colors_1.default.strong(platformName)} platform has not been added yet.\n` + + `See the docs for adding the ${colors_1.default.strong(platformName)} platform: ${colors_1.default.strong(`https://capacitorjs.com/docs/${platformName}#adding-the-${platformName}-platform`)}`); + } + // return the platform in an string array + return [platformName]; + } + // wasn't given a platform name, so let's + // get the platforms that have already been created + return getAddedPlatforms(config); +} +exports.selectPlatforms = selectPlatforms; +async function getKnownPlatforms() { + return ['web', 'android', 'ios']; +} +exports.getKnownPlatforms = getKnownPlatforms; +async function isValidPlatform(platform) { + return (await getKnownPlatforms()).includes(platform); +} +exports.isValidPlatform = isValidPlatform; +async function getKnownCommunityPlatforms() { + return ['electron']; +} +exports.getKnownCommunityPlatforms = getKnownCommunityPlatforms; +async function isValidCommunityPlatform(platform) { + return (await getKnownCommunityPlatforms()).includes(platform); +} +exports.isValidCommunityPlatform = isValidCommunityPlatform; +async function getKnownEnterprisePlatforms() { + return ['windows']; +} +exports.getKnownEnterprisePlatforms = getKnownEnterprisePlatforms; +async function isValidEnterprisePlatform(platform) { + return (await getKnownEnterprisePlatforms()).includes(platform); +} +exports.isValidEnterprisePlatform = isValidEnterprisePlatform; +async function promptForPlatform(platforms, promptMessage, selectedPlatformName) { + const { prompt } = await Promise.resolve().then(() => tslib_1.__importStar(require('prompts'))); + if (!selectedPlatformName) { + const answers = await prompt([ + { + type: 'select', + name: 'mode', + message: promptMessage, + choices: platforms.map(p => ({ title: p, value: p })), + }, + ], { onCancel: () => process.exit(1) }); + return answers.mode.toLowerCase().trim(); + } + const platformName = selectedPlatformName.toLowerCase().trim(); + if (!(await isValidPlatform(platformName))) { + const knownPlatforms = await getKnownPlatforms(); + (0, errors_1.fatal)(`Invalid platform: ${colors_1.default.input(platformName)}.\n` + + `Valid platforms include: ${knownPlatforms.join(', ')}`); + } + return platformName; +} +exports.promptForPlatform = promptForPlatform; +async function promptForPlatformTarget(targets, selectedTarget) { + const { prompt } = await Promise.resolve().then(() => tslib_1.__importStar(require('prompts'))); + const validTargets = targets.filter(t => t.id !== undefined); + if (!selectedTarget) { + if (validTargets.length === 1) { + return validTargets[0]; + } + else { + const answers = await prompt([ + { + type: 'select', + name: 'target', + message: 'Please choose a target device:', + choices: validTargets.map(t => ({ + title: `${getPlatformTargetName(t)} (${t.id})`, + value: t, + })), + }, + ], { onCancel: () => process.exit(1) }); + return answers.target; + } + } + const targetID = selectedTarget.trim(); + const target = targets.find(t => t.id === targetID); + if (!target) { + (0, errors_1.fatal)(`Invalid target ID: ${colors_1.default.input(targetID)}.\n` + + `Valid targets are: ${targets.map(t => t.id).join(', ')}`); + } + return target; +} +exports.promptForPlatformTarget = promptForPlatformTarget; +function getPlatformTargetName(target) { + var _a, _b, _c; + return `${(_c = (_b = (_a = target.name) !== null && _a !== void 0 ? _a : target.model) !== null && _b !== void 0 ? _b : target.id) !== null && _c !== void 0 ? _c : '?'}${target.virtual + ? ` (${target.platform === 'ios' ? 'simulator' : 'emulator'})` + : ''}`; +} +exports.getPlatformTargetName = getPlatformTargetName; +async function getAddedPlatforms(config) { + const platforms = []; + if (await getProjectPlatformDirectory(config, config.android.name)) { + platforms.push(config.android.name); + } + if (await getProjectPlatformDirectory(config, config.ios.name)) { + platforms.push(config.ios.name); + } + platforms.push(config.web.name); + return platforms; +} +exports.getAddedPlatforms = getAddedPlatforms; +async function checkPlatformVersions(config, platform) { + const semver = await Promise.resolve().then(() => tslib_1.__importStar(require('semver'))); + const coreVersion = await getCoreVersion(config); + const platformVersion = await getCapacitorPackageVersion(config, platform); + if (semver.diff(coreVersion, platformVersion) === 'minor' || + semver.diff(coreVersion, platformVersion) === 'major') { + log_1.logger.warn(`${colors_1.default.strong('@capacitor/core')}${colors_1.default.weak(`@${coreVersion}`)} version doesn't match ${colors_1.default.strong(`@capacitor/${platform}`)}${colors_1.default.weak(`@${platformVersion}`)} version.\n` + + `Consider updating to a matching version, e.g. w/ ${colors_1.default.input(`npm install @capacitor/core@${platformVersion}`)}`); + } +} +exports.checkPlatformVersions = checkPlatformVersions; +function resolvePlatform(config, platform) { + if (platform[0] !== '@') { + const core = (0, node_1.resolveNode)(config.app.rootDir, `@capacitor/${platform}`, 'package.json'); + if (core) { + return (0, path_1.dirname)(core); + } + const community = (0, node_1.resolveNode)(config.app.rootDir, `@capacitor-community/${platform}`, 'package.json'); + if (community) { + return (0, path_1.dirname)(community); + } + const enterprise = (0, node_1.resolveNode)(config.app.rootDir, `@ionic-enterprise/capacitor-${platform}`, 'package.json'); + if (enterprise) { + return (0, path_1.dirname)(enterprise); + } + } + // third-party + const thirdParty = (0, node_1.resolveNode)(config.app.rootDir, platform, 'package.json'); + if (thirdParty) { + return (0, path_1.dirname)(thirdParty); + } + return null; +} +exports.resolvePlatform = resolvePlatform; +async function checkJDKMajorVersion() { + try { + const string = await (0, subprocess_1.runCommand)('java', ['--version']); + const versionRegex = RegExp(/([0-9]+)\.?([0-9]*)\.?([0-9]*)/); + const versionMatch = versionRegex.exec(string); + if (versionMatch === null) { + return -1; + } + const firstVersionNumber = parseInt(versionMatch[1]); + const secondVersionNumber = parseInt(versionMatch[2]); + if (typeof firstVersionNumber === 'number' && firstVersionNumber != 1) { + return firstVersionNumber; + } + else if (typeof secondVersionNumber === 'number' && + firstVersionNumber == 1 && + secondVersionNumber < 9) { + return secondVersionNumber; + } + else { + return -1; + } + } + catch (e) { + return -1; + } +} +exports.checkJDKMajorVersion = checkJDKMajorVersion; +function parseApkNameFromFlavor(flavor) { + const convertedName = flavor.replace(/([A-Z])/g, '$1').toLowerCase(); + return `app-${convertedName ? `${convertedName}-` : ''}debug.apk`; +} +exports.parseApkNameFromFlavor = parseApkNameFromFlavor; diff --git a/@capacitor/cli/dist/config.js b/@capacitor/cli/dist/config.js new file mode 100644 index 00000000..ce072ec2 --- /dev/null +++ b/@capacitor/cli/dist/config.js @@ -0,0 +1,398 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.checkExternalConfig = exports.writeConfig = exports.loadConfig = exports.CONFIG_FILE_NAME_JSON = exports.CONFIG_FILE_NAME_JS = exports.CONFIG_FILE_NAME_TS = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const common_1 = require("./common"); +const errors_1 = require("./errors"); +const log_1 = require("./log"); +const fn_1 = require("./util/fn"); +const js_1 = require("./util/js"); +const monorepotools_1 = require("./util/monorepotools"); +const node_1 = require("./util/node"); +const promise_1 = require("./util/promise"); +const subprocess_1 = require("./util/subprocess"); +const debug = (0, debug_1.default)('capacitor:config'); +exports.CONFIG_FILE_NAME_TS = 'capacitor.config.ts'; +exports.CONFIG_FILE_NAME_JS = 'capacitor.config.js'; +exports.CONFIG_FILE_NAME_JSON = 'capacitor.config.json'; +async function loadConfig() { + var _a, _b, _c, _d; + const appRootDir = process.cwd(); + const cliRootDir = (0, path_1.dirname)(__dirname); + const conf = await loadExtConfig(appRootDir); + const depsForNx = await (async () => { + var _a, _b; + if ((0, monorepotools_1.isNXMonorepo)(appRootDir)) { + const rootOfNXMonorepo = (0, monorepotools_1.findNXMonorepoRoot)(appRootDir); + const pkgJSONOfMonorepoRoot = await (0, fn_1.tryFn)(utils_fs_1.readJSON, (0, path_1.resolve)(rootOfNXMonorepo, 'package.json')); + const devDependencies = (_a = pkgJSONOfMonorepoRoot === null || pkgJSONOfMonorepoRoot === void 0 ? void 0 : pkgJSONOfMonorepoRoot.devDependencies) !== null && _a !== void 0 ? _a : {}; + const dependencies = (_b = pkgJSONOfMonorepoRoot === null || pkgJSONOfMonorepoRoot === void 0 ? void 0 : pkgJSONOfMonorepoRoot.dependencies) !== null && _b !== void 0 ? _b : {}; + return { + devDependencies, + dependencies, + }; + } + return {}; + })(); + const appId = (_a = conf.extConfig.appId) !== null && _a !== void 0 ? _a : ''; + const appName = (_b = conf.extConfig.appName) !== null && _b !== void 0 ? _b : ''; + const webDir = (_c = conf.extConfig.webDir) !== null && _c !== void 0 ? _c : 'www'; + const cli = await loadCLIConfig(cliRootDir); + const config = { + android: await loadAndroidConfig(appRootDir, conf.extConfig, cli), + ios: await loadIOSConfig(appRootDir, conf.extConfig), + web: await loadWebConfig(appRootDir, webDir), + cli, + app: { + rootDir: appRootDir, + appId, + appName, + webDir, + webDirAbs: (0, path_1.resolve)(appRootDir, webDir), + package: (_d = (await (0, fn_1.tryFn)(utils_fs_1.readJSON, (0, path_1.resolve)(appRootDir, 'package.json')))) !== null && _d !== void 0 ? _d : { + name: appName, + version: '1.0.0', + ...depsForNx, + }, + ...conf, + }, + }; + debug('config: %O', config); + return config; +} +exports.loadConfig = loadConfig; +async function writeConfig(extConfig, extConfigFilePath) { + switch ((0, path_1.extname)(extConfigFilePath)) { + case '.json': { + await (0, utils_fs_1.writeJSON)(extConfigFilePath, extConfig, { spaces: 2 }); + break; + } + case '.ts': { + await (0, utils_fs_1.writeFile)(extConfigFilePath, formatConfigTS(extConfig)); + break; + } + } +} +exports.writeConfig = writeConfig; +async function loadExtConfigTS(rootDir, extConfigName, extConfigFilePath) { + var _a; + try { + const tsPath = (0, node_1.resolveNode)(rootDir, 'typescript'); + if (!tsPath) { + (0, errors_1.fatal)('Could not find installation of TypeScript.\n' + + `To use ${colors_1.default.strong(extConfigName)} files, you must install TypeScript in your project, e.g. w/ ${colors_1.default.input('npm install -D typescript')}`); + } + const ts = require(tsPath); // eslint-disable-line @typescript-eslint/no-var-requires + const extConfigObject = (0, node_1.requireTS)(ts, extConfigFilePath); + const extConfig = extConfigObject.default + ? await extConfigObject.default + : extConfigObject; + return { + extConfigType: 'ts', + extConfigName, + extConfigFilePath: extConfigFilePath, + extConfig, + }; + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)(`Parsing ${colors_1.default.strong(extConfigName)} failed.\n\n${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); + } + throw e; + } +} +async function loadExtConfigJS(rootDir, extConfigName, extConfigFilePath) { + var _a; + try { + return { + extConfigType: 'js', + extConfigName, + extConfigFilePath: extConfigFilePath, + extConfig: await require(extConfigFilePath), + }; + } + catch (e) { + (0, errors_1.fatal)(`Parsing ${colors_1.default.strong(extConfigName)} failed.\n\n${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`); + } +} +async function loadExtConfig(rootDir) { + var _a; + const extConfigFilePathTS = (0, path_1.resolve)(rootDir, exports.CONFIG_FILE_NAME_TS); + if (await (0, utils_fs_1.pathExists)(extConfigFilePathTS)) { + return loadExtConfigTS(rootDir, exports.CONFIG_FILE_NAME_TS, extConfigFilePathTS); + } + const extConfigFilePathJS = (0, path_1.resolve)(rootDir, exports.CONFIG_FILE_NAME_JS); + if (await (0, utils_fs_1.pathExists)(extConfigFilePathJS)) { + return loadExtConfigJS(rootDir, exports.CONFIG_FILE_NAME_JS, extConfigFilePathJS); + } + const extConfigFilePath = (0, path_1.resolve)(rootDir, exports.CONFIG_FILE_NAME_JSON); + return { + extConfigType: 'json', + extConfigName: exports.CONFIG_FILE_NAME_JSON, + extConfigFilePath: extConfigFilePath, + extConfig: (_a = (await (0, fn_1.tryFn)(utils_fs_1.readJSON, extConfigFilePath))) !== null && _a !== void 0 ? _a : {}, + }; +} +async function loadCLIConfig(rootDir) { + const assetsDir = 'assets'; + const assetsDirAbs = (0, path_1.join)(rootDir, assetsDir); + const iosPlatformTemplateArchive = 'ios-pods-template.tar.gz'; + const iosCordovaPluginsTemplateArchive = 'capacitor-cordova-ios-plugins.tar.gz'; + const androidPlatformTemplateArchive = 'android-template.tar.gz'; + const androidCordovaPluginsTemplateArchive = 'capacitor-cordova-android-plugins.tar.gz'; + return { + rootDir, + assetsDir, + assetsDirAbs, + assets: { + ios: { + platformTemplateArchive: iosPlatformTemplateArchive, + platformTemplateArchiveAbs: (0, path_1.resolve)(assetsDirAbs, iosPlatformTemplateArchive), + cordovaPluginsTemplateArchive: iosCordovaPluginsTemplateArchive, + cordovaPluginsTemplateArchiveAbs: (0, path_1.resolve)(assetsDirAbs, iosCordovaPluginsTemplateArchive), + }, + android: { + platformTemplateArchive: androidPlatformTemplateArchive, + platformTemplateArchiveAbs: (0, path_1.resolve)(assetsDirAbs, androidPlatformTemplateArchive), + cordovaPluginsTemplateArchive: androidCordovaPluginsTemplateArchive, + cordovaPluginsTemplateArchiveAbs: (0, path_1.resolve)(assetsDirAbs, androidCordovaPluginsTemplateArchive), + }, + }, + package: await (0, utils_fs_1.readJSON)((0, path_1.resolve)(rootDir, 'package.json')), + os: determineOS(process.platform), + }; +} +async function loadAndroidConfig(rootDir, extConfig, cliConfig) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s; + const name = 'android'; + const platformDir = (_b = (_a = extConfig.android) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : 'android'; + const platformDirAbs = (0, path_1.resolve)(rootDir, platformDir); + const appDir = 'app'; + const srcDir = `${appDir}/src`; + const srcMainDir = `${srcDir}/main`; + const assetsDir = `${srcMainDir}/assets`; + const webDir = `${assetsDir}/public`; + const resDir = `${srcMainDir}/res`; + let apkPath = `${appDir}/build/outputs/apk/`; + const flavor = ((_c = extConfig.android) === null || _c === void 0 ? void 0 : _c.flavor) || ''; + if ((_d = extConfig.android) === null || _d === void 0 ? void 0 : _d.flavor) { + apkPath = `${apkPath}/${(_e = extConfig.android) === null || _e === void 0 ? void 0 : _e.flavor}`; + } + const apkName = (0, common_1.parseApkNameFromFlavor)(flavor); + const buildOutputDir = `${apkPath}/debug`; + const cordovaPluginsDir = 'capacitor-cordova-android-plugins'; + const studioPath = (0, promise_1.lazy)(() => determineAndroidStudioPath(cliConfig.os)); + const buildOptions = { + keystorePath: (_g = (_f = extConfig.android) === null || _f === void 0 ? void 0 : _f.buildOptions) === null || _g === void 0 ? void 0 : _g.keystorePath, + keystorePassword: (_j = (_h = extConfig.android) === null || _h === void 0 ? void 0 : _h.buildOptions) === null || _j === void 0 ? void 0 : _j.keystorePassword, + keystoreAlias: (_l = (_k = extConfig.android) === null || _k === void 0 ? void 0 : _k.buildOptions) === null || _l === void 0 ? void 0 : _l.keystoreAlias, + keystoreAliasPassword: (_o = (_m = extConfig.android) === null || _m === void 0 ? void 0 : _m.buildOptions) === null || _o === void 0 ? void 0 : _o.keystoreAliasPassword, + signingType: (_q = (_p = extConfig.android) === null || _p === void 0 ? void 0 : _p.buildOptions) === null || _q === void 0 ? void 0 : _q.signingType, + releaseType: (_s = (_r = extConfig.android) === null || _r === void 0 ? void 0 : _r.buildOptions) === null || _s === void 0 ? void 0 : _s.releaseType, + }; + return { + name, + minVersion: '22', + studioPath, + platformDir, + platformDirAbs, + cordovaPluginsDir, + cordovaPluginsDirAbs: (0, path_1.resolve)(platformDirAbs, cordovaPluginsDir), + appDir, + appDirAbs: (0, path_1.resolve)(platformDirAbs, appDir), + srcDir, + srcDirAbs: (0, path_1.resolve)(platformDirAbs, srcDir), + srcMainDir, + srcMainDirAbs: (0, path_1.resolve)(platformDirAbs, srcMainDir), + assetsDir, + assetsDirAbs: (0, path_1.resolve)(platformDirAbs, assetsDir), + webDir, + webDirAbs: (0, path_1.resolve)(platformDirAbs, webDir), + resDir, + resDirAbs: (0, path_1.resolve)(platformDirAbs, resDir), + apkName, + buildOutputDir, + buildOutputDirAbs: (0, path_1.resolve)(platformDirAbs, buildOutputDir), + flavor, + buildOptions, + }; +} +async function loadIOSConfig(rootDir, extConfig) { + var _a, _b, _c, _d; + const name = 'ios'; + const platformDir = (_b = (_a = extConfig.ios) === null || _a === void 0 ? void 0 : _a.path) !== null && _b !== void 0 ? _b : 'ios'; + const platformDirAbs = (0, path_1.resolve)(rootDir, platformDir); + const scheme = (_d = (_c = extConfig.ios) === null || _c === void 0 ? void 0 : _c.scheme) !== null && _d !== void 0 ? _d : 'App'; + const nativeProjectDir = 'App'; + const nativeProjectDirAbs = (0, path_1.resolve)(platformDirAbs, nativeProjectDir); + const nativeTargetDir = `${nativeProjectDir}/App`; + const nativeTargetDirAbs = (0, path_1.resolve)(platformDirAbs, nativeTargetDir); + const nativeXcodeProjDir = `${nativeProjectDir}/App.xcodeproj`; + const nativeXcodeProjDirAbs = (0, path_1.resolve)(platformDirAbs, nativeXcodeProjDir); + const nativeXcodeWorkspaceDirAbs = (0, promise_1.lazy)(() => determineXcodeWorkspaceDirAbs(nativeProjectDirAbs)); + const podPath = (0, promise_1.lazy)(() => determineGemfileOrCocoapodPath(rootDir, platformDirAbs, nativeProjectDirAbs)); + const webDirAbs = (0, promise_1.lazy)(() => determineIOSWebDirAbs(nativeProjectDirAbs, nativeTargetDirAbs, nativeXcodeProjDirAbs)); + const cordovaPluginsDir = 'capacitor-cordova-ios-plugins'; + return { + name, + minVersion: '13.0', + platformDir, + platformDirAbs, + scheme, + cordovaPluginsDir, + cordovaPluginsDirAbs: (0, path_1.resolve)(platformDirAbs, cordovaPluginsDir), + nativeProjectDir, + nativeProjectDirAbs, + nativeTargetDir, + nativeTargetDirAbs, + nativeXcodeProjDir, + nativeXcodeProjDirAbs, + nativeXcodeWorkspaceDir: (0, promise_1.lazy)(async () => (0, path_1.relative)(platformDirAbs, await nativeXcodeWorkspaceDirAbs)), + nativeXcodeWorkspaceDirAbs, + webDir: (0, promise_1.lazy)(async () => (0, path_1.relative)(platformDirAbs, await webDirAbs)), + webDirAbs, + podPath, + }; +} +async function loadWebConfig(rootDir, webDir) { + const platformDir = webDir; + const platformDirAbs = (0, path_1.resolve)(rootDir, platformDir); + return { + name: 'web', + platformDir, + platformDirAbs, + }; +} +function determineOS(os) { + switch (os) { + case 'darwin': + return "mac" /* OS.Mac */; + case 'win32': + return "windows" /* OS.Windows */; + case 'linux': + return "linux" /* OS.Linux */; + } + return "unknown" /* OS.Unknown */; +} +async function determineXcodeWorkspaceDirAbs(nativeProjectDirAbs) { + return (0, path_1.resolve)(nativeProjectDirAbs, 'App.xcworkspace'); +} +async function determineIOSWebDirAbs(nativeProjectDirAbs, nativeTargetDirAbs, nativeXcodeProjDirAbs) { + const re = /path\s=\spublic[\s\S]+?sourceTree\s=\s([^;]+)/; + const pbxprojPath = (0, path_1.resolve)(nativeXcodeProjDirAbs, 'project.pbxproj'); + try { + const pbxproj = await (0, utils_fs_1.readFile)(pbxprojPath, { encoding: 'utf8' }); + const m = pbxproj.match(re); + if (m && m[1] === 'SOURCE_ROOT') { + log_1.logger.warn(`Using the iOS project root for the ${colors_1.default.strong('public')} directory is deprecated.\n` + + `Please follow the Upgrade Guide to move ${colors_1.default.strong('public')} inside the iOS target directory: ${colors_1.default.strong('https://capacitorjs.com/docs/updating/3-0#move-public-into-the-ios-target-directory')}`); + return (0, path_1.resolve)(nativeProjectDirAbs, 'public'); + } + } + catch (e) { + // ignore + } + return (0, path_1.resolve)(nativeTargetDirAbs, 'public'); +} +async function determineAndroidStudioPath(os) { + if (process.env.CAPACITOR_ANDROID_STUDIO_PATH) { + return process.env.CAPACITOR_ANDROID_STUDIO_PATH; + } + switch (os) { + case "mac" /* OS.Mac */: + return '/Applications/Android Studio.app'; + case "windows" /* OS.Windows */: { + const { runCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./util/subprocess'))); + let p = 'C:\\Program Files\\Android\\Android Studio\\bin\\studio64.exe'; + try { + if (!(await (0, utils_fs_1.pathExists)(p))) { + let commandResult = await runCommand('REG', [ + 'QUERY', + 'HKEY_LOCAL_MACHINE\\SOFTWARE\\Android Studio', + '/v', + 'Path', + ]); + commandResult = commandResult.replace(/(\r\n|\n|\r)/gm, ''); + const i = commandResult.indexOf('REG_SZ'); + if (i > 0) { + p = commandResult.substring(i + 6).trim() + '\\bin\\studio64.exe'; + } + } + } + catch (e) { + debug(`Error checking registry for Android Studio path: %O`, e); + break; + } + return p; + } + case "linux" /* OS.Linux */: + return '/usr/local/android-studio/bin/studio.sh'; + } + return ''; +} +async function determineGemfileOrCocoapodPath(rootDir, platformDir, nativeProjectDirAbs) { + if (process.env.CAPACITOR_COCOAPODS_PATH) { + return process.env.CAPACITOR_COCOAPODS_PATH; + } + let gemfilePath = ''; + if (await (0, utils_fs_1.pathExists)((0, path_1.resolve)(rootDir, 'Gemfile'))) { + gemfilePath = (0, path_1.resolve)(rootDir, 'Gemfile'); + } + else if (await (0, utils_fs_1.pathExists)((0, path_1.resolve)(platformDir, 'Gemfile'))) { + gemfilePath = (0, path_1.resolve)(platformDir, 'Gemfile'); + } + else if (await (0, utils_fs_1.pathExists)((0, path_1.resolve)(nativeProjectDirAbs, 'Gemfile'))) { + gemfilePath = (0, path_1.resolve)(nativeProjectDirAbs, 'Gemfile'); + } + const appSpecificGemfileExists = gemfilePath != ''; + // Multi-app projects might share a single global 'Gemfile' at the Git repository root directory. + if (!appSpecificGemfileExists) { + try { + const output = await (0, subprocess_1.getCommandOutput)('git', ['rev-parse', '--show-toplevel'], { cwd: rootDir }); + if (output != null) { + gemfilePath = (0, path_1.resolve)(output, 'Gemfile'); + } + } + catch (e) { + // Nothing + } + } + try { + const gemfileText = (await (0, utils_fs_1.readFile)(gemfilePath)).toString(); + if (!gemfileText) { + return 'pod'; + } + const cocoapodsInGemfile = new RegExp(/gem\s+['"]cocoapods/).test(gemfileText); + if (cocoapodsInGemfile) { + return 'bundle exec pod'; + } + else { + return 'pod'; + } + } + catch { + return 'pod'; + } +} +function formatConfigTS(extConfig) { + // TODO: tags + return `import type { CapacitorConfig } from '@capacitor/cli'; + +const config: CapacitorConfig = ${(0, js_1.formatJSObject)(extConfig)}; + +export default config;\n`; +} +function checkExternalConfig(config) { + if (typeof config.extConfig.bundledWebRuntime !== 'undefined') { + let actionMessage = `Can be safely deleted.`; + if (config.extConfig.bundledWebRuntime === true) { + actionMessage = `Please, use a bundler to bundle Capacitor and its plugins.`; + } + log_1.logger.warn(`The ${colors_1.default.strong('bundledWebRuntime')} configuration option has been deprecated. ${actionMessage}`); + } +} +exports.checkExternalConfig = checkExternalConfig; diff --git a/@capacitor/cli/dist/cordova.js b/@capacitor/cli/dist/cordova.js new file mode 100644 index 00000000..4c5bffa0 --- /dev/null +++ b/@capacitor/cli/dist/cordova.js @@ -0,0 +1,830 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.writeCordovaAndroidManifest = exports.getCordovaPreferences = exports.needsStaticPod = exports.getIncompatibleCordovaPlugins = exports.checkPluginDependencies = exports.logCordovaManualSteps = exports.getCordovaPlugins = exports.handleCordovaPluginsJS = exports.autoGenerateConfig = exports.removePluginFiles = exports.createEmptyCordovaJS = exports.copyCordovaJS = exports.copyPluginsJS = exports.generateCordovaPluginsJSFile = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const plist_1 = tslib_1.__importDefault(require("plist")); +const prompts_1 = tslib_1.__importDefault(require("prompts")); +const common_1 = require("./android/common"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const errors_1 = require("./errors"); +const common_2 = require("./ios/common"); +const log_1 = require("./log"); +const plugin_1 = require("./plugin"); +const node_1 = require("./util/node"); +const term_1 = require("./util/term"); +const xml_1 = require("./util/xml"); +/** + * Build the root cordova_plugins.js file referencing each Plugin JS file. + */ +function generateCordovaPluginsJSFile(config, plugins, platform) { + const pluginModules = []; + const pluginExports = []; + plugins.map(p => { + const pluginId = p.xml.$.id; + const jsModules = (0, plugin_1.getJSModules)(p, platform); + jsModules.map((jsModule) => { + const clobbers = []; + const merges = []; + let clobbersModule = ''; + let mergesModule = ''; + let runsModule = ''; + let clobberKey = ''; + let mergeKey = ''; + if (jsModule.clobbers) { + jsModule.clobbers.map((clobber) => { + clobbers.push(clobber.$.target); + clobberKey = clobber.$.target; + }); + clobbersModule = `, + "clobbers": [ + "${clobbers.join('",\n "')}" + ]`; + } + if (jsModule.merges) { + jsModule.merges.map((merge) => { + merges.push(merge.$.target); + mergeKey = merge.$.target; + }); + mergesModule = `, + "merges": [ + "${merges.join('",\n "')}" + ]`; + } + if (jsModule.runs) { + runsModule = ',\n "runs": true'; + } + const pluginModule = { + clobber: clobberKey, + merge: mergeKey, + // mimics Cordova's module name logic if the name attr is missing + pluginContent: `{ + "id": "${pluginId + + '.' + + (jsModule.$.name || jsModule.$.src.match(/([^/]+)\.js/)[1])}", + "file": "plugins/${pluginId}/${jsModule.$.src}", + "pluginId": "${pluginId}"${clobbersModule}${mergesModule}${runsModule} + }`, + }; + pluginModules.push(pluginModule); + }); + pluginExports.push(`"${pluginId}": "${p.xml.$.version}"`); + }); + return ` + cordova.define('cordova/plugin_list', function(require, exports, module) { + module.exports = [ + ${pluginModules + .sort((a, b) => a.clobber && b.clobber // Clobbers in alpha order + ? a.clobber.localeCompare(b.clobber) + : a.clobber || b.clobber // Clobbers before anything else + ? b.clobber.localeCompare(a.clobber) + : a.merge.localeCompare(b.merge)) + .map(e => e.pluginContent) + .join(',\n ')} + ]; + module.exports.metadata = + // TOP OF METADATA + { + ${pluginExports.join(',\n ')} + }; + // BOTTOM OF METADATA + }); + `; +} +exports.generateCordovaPluginsJSFile = generateCordovaPluginsJSFile; +/** + * Build the plugins/* files for each Cordova plugin installed. + */ +async function copyPluginsJS(config, cordovaPlugins, platform) { + const webDir = await getWebDir(config, platform); + const pluginsDir = (0, path_1.join)(webDir, 'plugins'); + const cordovaPluginsJSFile = (0, path_1.join)(webDir, 'cordova_plugins.js'); + await removePluginFiles(config, platform); + await Promise.all(cordovaPlugins.map(async (p) => { + const pluginId = p.xml.$.id; + const pluginDir = (0, path_1.join)(pluginsDir, pluginId, 'www'); + await (0, utils_fs_1.ensureDir)(pluginDir); + const jsModules = (0, plugin_1.getJSModules)(p, platform); + await Promise.all(jsModules.map(async (jsModule) => { + const filePath = (0, path_1.join)(webDir, 'plugins', pluginId, jsModule.$.src); + await (0, utils_fs_1.copy)((0, path_1.join)(p.rootPath, jsModule.$.src), filePath); + let data = await (0, utils_fs_1.readFile)(filePath, { encoding: 'utf-8' }); + data = data.trim(); + // mimics Cordova's module name logic if the name attr is missing + const name = pluginId + + '.' + + (jsModule.$.name || + (0, path_1.basename)(jsModule.$.src, (0, path_1.extname)(jsModule.$.src))); + data = `cordova.define("${name}", function(require, exports, module) { \n${data}\n});`; + data = data.replace(/)<[^<]*)*<\/script\s*>/gi, ''); + await (0, utils_fs_1.writeFile)(filePath, data, { encoding: 'utf-8' }); + })); + const assets = (0, plugin_1.getAssets)(p, platform); + await Promise.all(assets.map(async (asset) => { + const filePath = (0, path_1.join)(webDir, asset.$.target); + await (0, utils_fs_1.copy)((0, path_1.join)(p.rootPath, asset.$.src), filePath); + })); + })); + await (0, utils_fs_1.writeFile)(cordovaPluginsJSFile, generateCordovaPluginsJSFile(config, cordovaPlugins, platform)); +} +exports.copyPluginsJS = copyPluginsJS; +async function copyCordovaJS(config, platform) { + const cordovaPath = (0, node_1.resolveNode)(config.app.rootDir, '@capacitor/core', 'cordova.js'); + if (!cordovaPath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong('node_modules/@capacitor/core/cordova.js')}.\n` + `Are you sure ${colors_1.default.strong('@capacitor/core')} is installed?`); + } + return (0, utils_fs_1.copy)(cordovaPath, (0, path_1.join)(await getWebDir(config, platform), 'cordova.js')); +} +exports.copyCordovaJS = copyCordovaJS; +async function createEmptyCordovaJS(config, platform) { + const webDir = await getWebDir(config, platform); + await (0, utils_fs_1.writeFile)((0, path_1.join)(webDir, 'cordova.js'), ''); + await (0, utils_fs_1.writeFile)((0, path_1.join)(webDir, 'cordova_plugins.js'), ''); +} +exports.createEmptyCordovaJS = createEmptyCordovaJS; +async function removePluginFiles(config, platform) { + const webDir = await getWebDir(config, platform); + const pluginsDir = (0, path_1.join)(webDir, 'plugins'); + const cordovaPluginsJSFile = (0, path_1.join)(webDir, 'cordova_plugins.js'); + await (0, utils_fs_1.remove)(pluginsDir); + await (0, utils_fs_1.remove)(cordovaPluginsJSFile); +} +exports.removePluginFiles = removePluginFiles; +async function autoGenerateConfig(config, cordovaPlugins, platform) { + var _a, _b, _c, _d; + let xmlDir = (0, path_1.join)(config.android.resDirAbs, 'xml'); + const fileName = 'config.xml'; + if (platform === 'ios') { + xmlDir = config.ios.nativeTargetDirAbs; + } + await (0, utils_fs_1.ensureDir)(xmlDir); + const cordovaConfigXMLFile = (0, path_1.join)(xmlDir, fileName); + await (0, utils_fs_1.remove)(cordovaConfigXMLFile); + const pluginEntries = []; + cordovaPlugins.map(p => { + const currentPlatform = (0, plugin_1.getPluginPlatform)(p, platform); + if (currentPlatform) { + const configFiles = currentPlatform['config-file']; + if (configFiles) { + const configXMLEntries = configFiles.filter(function (item) { + var _a; + return (_a = item.$) === null || _a === void 0 ? void 0 : _a.target.includes(fileName); + }); + configXMLEntries.map((entry) => { + if (entry.feature) { + const feature = { feature: entry.feature }; + pluginEntries.push(feature); + } + }); + } + } + }); + let accessOriginString = []; + if ((_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.cordova) === null || _b === void 0 ? void 0 : _b.accessOrigins) { + accessOriginString = await Promise.all(config.app.extConfig.cordova.accessOrigins.map(async (host) => { + return ` + `; + })); + } + else { + accessOriginString.push(``); + } + const pluginEntriesString = await Promise.all(pluginEntries.map(async (item) => { + const xmlString = await (0, xml_1.writeXML)(item); + return xmlString; + })); + let pluginPreferencesString = []; + if ((_d = (_c = config.app.extConfig) === null || _c === void 0 ? void 0 : _c.cordova) === null || _d === void 0 ? void 0 : _d.preferences) { + pluginPreferencesString = await Promise.all(Object.entries(config.app.extConfig.cordova.preferences).map(async ([key, value]) => { + return ` + `; + })); + } + const content = ` + + ${accessOriginString.join('')} + ${pluginEntriesString.join('')} + ${pluginPreferencesString.join('')} +`; + await (0, utils_fs_1.writeFile)(cordovaConfigXMLFile, content); +} +exports.autoGenerateConfig = autoGenerateConfig; +async function getWebDir(config, platform) { + if (platform === 'ios') { + return config.ios.webDirAbs; + } + if (platform === 'android') { + return config.android.webDirAbs; + } + return ''; +} +async function handleCordovaPluginsJS(cordovaPlugins, config, platform) { + const webDir = await getWebDir(config, platform); + await (0, utils_fs_1.mkdirp)(webDir); + if (cordovaPlugins.length > 0) { + (0, plugin_1.printPlugins)(cordovaPlugins, platform, 'cordova'); + await copyCordovaJS(config, platform); + await copyPluginsJS(config, cordovaPlugins, platform); + } + else { + await removePluginFiles(config, platform); + await createEmptyCordovaJS(config, platform); + } + await autoGenerateConfig(config, cordovaPlugins, platform); +} +exports.handleCordovaPluginsJS = handleCordovaPluginsJS; +async function getCordovaPlugins(config, platform) { + const allPlugins = await (0, plugin_1.getPlugins)(config, platform); + let plugins = []; + if (platform === config.ios.name) { + plugins = await (0, common_2.getIOSPlugins)(allPlugins); + } + else if (platform === config.android.name) { + plugins = await (0, common_1.getAndroidPlugins)(allPlugins); + } + return plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); +} +exports.getCordovaPlugins = getCordovaPlugins; +async function logCordovaManualSteps(cordovaPlugins, config, platform) { + cordovaPlugins.map(p => { + const editConfig = (0, plugin_1.getPlatformElement)(p, platform, 'edit-config'); + const configFile = (0, plugin_1.getPlatformElement)(p, platform, 'config-file'); + editConfig.concat(configFile).map(async (configElement) => { + if (configElement.$ && !configElement.$.target.includes('config.xml')) { + if (platform === config.ios.name) { + if (configElement.$.target.includes('Info.plist')) { + logiOSPlist(configElement, config, p); + } + } + } + }); + }); +} +exports.logCordovaManualSteps = logCordovaManualSteps; +async function logiOSPlist(configElement, config, plugin) { + var _a, _b; + let plistPath = (0, path_1.resolve)(config.ios.nativeTargetDirAbs, 'Info.plist'); + if ((_a = config.app.extConfig.ios) === null || _a === void 0 ? void 0 : _a.scheme) { + plistPath = (0, path_1.resolve)(config.ios.nativeProjectDirAbs, `${(_b = config.app.extConfig.ios) === null || _b === void 0 ? void 0 : _b.scheme}-Info.plist`); + } + if (!(await (0, utils_fs_1.pathExists)(plistPath))) { + plistPath = (0, path_1.resolve)(config.ios.nativeTargetDirAbs, 'Base.lproj', 'Info.plist'); + } + if (await (0, utils_fs_1.pathExists)(plistPath)) { + const xmlMeta = await (0, xml_1.readXML)(plistPath); + const data = await (0, utils_fs_1.readFile)(plistPath, { encoding: 'utf-8' }); + const trimmedPlistData = data.replace(/(\t|\r|\n)/g, ''); + const plistData = plist_1.default.parse(data); + const dict = xmlMeta.plist.dict.pop(); + if (!dict.key.includes(configElement.$.parent)) { + let xml = buildConfigFileXml(configElement); + xml = `${configElement.$.parent}${getConfigFileTagContent(xml)}`; + log_1.logger.warn(`Configuration required for ${colors_1.default.strong(plugin.id)}.\n` + + `Add the following to Info.plist:\n` + + xml); + } + else if (configElement.array || configElement.dict) { + if (configElement.array && + configElement.array.length > 0 && + configElement.array[0].string) { + let xml = ''; + configElement.array[0].string.map((element) => { + const d = plistData[configElement.$.parent]; + if (Array.isArray(d) && !d.includes(element)) { + xml = xml.concat(`${element}\n`); + } + }); + if (xml.length > 0) { + log_1.logger.warn(`Configuration required for ${colors_1.default.strong(plugin.id)}.\n` + + `Add the following in the existing ${colors_1.default.strong(configElement.$.parent)} array of your Info.plist:\n` + + xml); + } + } + else { + let xml = buildConfigFileXml(configElement); + xml = `${configElement.$.parent}${getConfigFileTagContent(xml)}`; + xml = `${xml}`; + const parseXmlToSearchable = (childElementsObj, arrayToAddTo) => { + for (const childElement of childElementsObj) { + const childElementName = childElement['#name']; + const toAdd = { name: childElementName }; + if (childElementName === 'key' || childElementName === 'string') { + toAdd.value = childElement['_']; + } + else { + if (childElement['$']) { + toAdd.attrs = { ...childElement['$'] }; + } + if (childElement['$$']) { + toAdd.children = []; + parseXmlToSearchable(childElement['$$'], toAdd['children']); + } + } + arrayToAddTo.push(toAdd); + } + }; + const existingElements = (0, xml_1.parseXML)(trimmedPlistData, { + explicitChildren: true, + trim: true, + preserveChildrenOrder: true, + }); + const parsedExistingElements = []; + const rootKeyOfExistingElements = Object.keys(existingElements)[0]; + const rootOfExistingElementsToAdd = { name: rootKeyOfExistingElements, children: [] }; + if (existingElements[rootKeyOfExistingElements]['$']) { + rootOfExistingElementsToAdd.attrs = { + ...existingElements[rootKeyOfExistingElements]['$'], + }; + } + parseXmlToSearchable(existingElements[rootKeyOfExistingElements]['$$'], rootOfExistingElementsToAdd['children']); + parsedExistingElements.push(rootOfExistingElementsToAdd); + const requiredElements = (0, xml_1.parseXML)(xml, { + explicitChildren: true, + trim: true, + preserveChildrenOrder: true, + }); + const parsedRequiredElements = []; + const rootKeyOfRequiredElements = Object.keys(requiredElements)[0]; + const rootOfRequiredElementsToAdd = { name: rootKeyOfRequiredElements, children: [] }; + if (requiredElements[rootKeyOfRequiredElements]['$']) { + rootOfRequiredElementsToAdd.attrs = { + ...requiredElements[rootKeyOfRequiredElements]['$'], + }; + } + parseXmlToSearchable(requiredElements[rootKeyOfRequiredElements]['$$'], rootOfRequiredElementsToAdd['children']); + parsedRequiredElements.push(rootOfRequiredElementsToAdd); + const doesContainElements = (requiredElementsArray, existingElementsArray) => { + for (const requiredElement of requiredElementsArray) { + if (requiredElement.name === 'key' || + requiredElement.name === 'string') { + let foundMatch = false; + for (const existingElement of existingElementsArray) { + if (existingElement.name === requiredElement.name && + (existingElement.value === requiredElement.value || + /^[$].{1,}$/.test(requiredElement.value.trim()))) { + foundMatch = true; + break; + } + } + if (!foundMatch) { + return false; + } + } + else { + let foundMatch = false; + for (const existingElement of existingElementsArray) { + if (existingElement.name === requiredElement.name) { + if ((requiredElement.children !== undefined) === + (existingElement.children !== undefined)) { + if (doesContainElements(requiredElement.children, existingElement.children)) { + foundMatch = true; + break; + } + } + } + } + if (!foundMatch) { + return false; + } + } + } + return true; + }; + if (!doesContainElements(parsedRequiredElements, parsedExistingElements)) { + logPossibleMissingItem(configElement, plugin); + } + } + } + } + else { + logPossibleMissingItem(configElement, plugin); + } +} +function logPossibleMissingItem(configElement, plugin) { + let xml = buildConfigFileXml(configElement); + xml = getConfigFileTagContent(xml); + xml = removeOuterTags(xml); + log_1.logger.warn(`Configuration might be missing for ${colors_1.default.strong(plugin.id)}.\n` + + `Add the following to the existing ${colors_1.default.strong(configElement.$.parent)} entry of Info.plist:\n` + + xml); +} +function buildConfigFileXml(configElement) { + return (0, xml_1.buildXmlElement)(configElement, 'config-file'); +} +function getConfigFileTagContent(str) { + return str.replace(/|<\/config-file>/g, ''); +} +function removeOuterTags(str) { + const start = str.indexOf('>') + 1; + const end = str.lastIndexOf('<'); + return str.substring(start, end); +} +async function checkPluginDependencies(plugins, platform) { + const pluginDeps = new Map(); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + const incompatible = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 2 /* PluginType.Incompatible */); + await Promise.all(cordovaPlugins.map(async (p) => { + let allDependencies = []; + allDependencies = allDependencies.concat((0, plugin_1.getPlatformElement)(p, platform, 'dependency')); + if (p.xml['dependency']) { + allDependencies = allDependencies.concat(p.xml['dependency']); + } + allDependencies = allDependencies.filter((dep) => !getIncompatibleCordovaPlugins(platform).includes(dep.$.id) && + incompatible.filter(p => p.id === dep.$.id || p.xml.$.id === dep.$.id) + .length === 0); + if (allDependencies) { + await Promise.all(allDependencies.map(async (dep) => { + var _a; + let plugin = dep.$.id; + let version = dep.$.version; + if (plugin.includes('@') && plugin.indexOf('@') !== 0) { + [plugin, version] = plugin.split('@'); + } + if (cordovaPlugins.filter(p => p.id === plugin || p.xml.$.id === plugin).length === 0) { + if ((_a = dep.$.url) === null || _a === void 0 ? void 0 : _a.startsWith('http')) { + plugin = dep.$.url; + version = dep.$.commit; + } + const deps = pluginDeps.get(p.id) || []; + deps.push(`${plugin}${version ? colors_1.default.weak(` (${version})`) : ''}`); + pluginDeps.set(p.id, deps); + } + })); + } + })); + if (pluginDeps.size > 0) { + let msg = `${colors_1.default.failure(colors_1.default.strong('Plugins are missing dependencies.'))}\n` + + `Cordova plugin dependencies must be installed in your project (e.g. w/ ${colors_1.default.input('npm install')}).\n`; + for (const [plugin, deps] of pluginDeps.entries()) { + msg += + `\n ${colors_1.default.strong(plugin)} is missing dependencies:\n` + + deps.map(d => ` - ${d}`).join('\n'); + } + log_1.logger.warn(`${msg}\n`); + } +} +exports.checkPluginDependencies = checkPluginDependencies; +function getIncompatibleCordovaPlugins(platform) { + const pluginList = [ + 'cordova-plugin-splashscreen', + 'cordova-plugin-ionic-webview', + 'cordova-plugin-crosswalk-webview', + 'cordova-plugin-wkwebview-engine', + 'cordova-plugin-console', + 'cordova-plugin-music-controls', + 'cordova-plugin-add-swift-support', + 'cordova-plugin-ionic-keyboard', + 'cordova-plugin-braintree', + '@ionic-enterprise/filesystem', + '@ionic-enterprise/keyboard', + '@ionic-enterprise/splashscreen', + 'cordova-support-google-services', + ]; + if (platform === 'ios') { + pluginList.push('cordova-plugin-statusbar', '@ionic-enterprise/statusbar', 'SalesforceMobileSDK-CordovaPlugin'); + } + if (platform === 'android') { + pluginList.push('cordova-plugin-compat'); + } + return pluginList; +} +exports.getIncompatibleCordovaPlugins = getIncompatibleCordovaPlugins; +function needsStaticPod(plugin, config) { + var _a, _b, _c, _d; + let pluginList = [ + 'phonegap-plugin-push', + '@batch.com/cordova-plugin', + 'onesignal-cordova-plugin', + ]; + if ((_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.cordova) === null || _b === void 0 ? void 0 : _b.staticPlugins) { + log_1.logger.warn('cordova.staticPlugins is deprecated, make sure you are using latest version of the plugin'); + pluginList = pluginList.concat((_d = (_c = config.app.extConfig) === null || _c === void 0 ? void 0 : _c.cordova) === null || _d === void 0 ? void 0 : _d.staticPlugins); + } + return pluginList.includes(plugin.id) || useFrameworks(plugin); +} +exports.needsStaticPod = needsStaticPod; +function useFrameworks(plugin) { + const podspecs = (0, plugin_1.getPlatformElement)(plugin, 'ios', 'podspec'); + const frameworkPods = podspecs.filter((podspec) => podspec.pods.filter((pods) => pods.$ && pods.$['use-frameworks'] === 'true').length > 0); + return frameworkPods.length > 0; +} +async function getCordovaPreferences(config) { + var _a, _b, _c, _d, _e; + const configXml = (0, path_1.join)(config.app.rootDir, 'config.xml'); + let cordova = {}; + if (await (0, utils_fs_1.pathExists)(configXml)) { + cordova.preferences = {}; + const xmlMeta = await (0, xml_1.readXML)(configXml); + if (xmlMeta.widget.preference) { + xmlMeta.widget.preference.map((pref) => { + cordova.preferences[pref.$.name] = pref.$.value; + }); + } + } + if (cordova.preferences && Object.keys(cordova.preferences).length > 0) { + if ((0, term_1.isInteractive)()) { + const answers = await (0, log_1.logPrompt)(`${colors_1.default.strong(`Cordova preferences can be automatically ported to ${colors_1.default.strong(config.app.extConfigName)}.`)}\n` + + `Keep in mind: Not all values can be automatically migrated from ${colors_1.default.strong('config.xml')}. There may be more work to do.\n` + + `More info: ${colors_1.default.strong('https://capacitorjs.com/docs/cordova/migrating-from-cordova-to-capacitor')}`, { + type: 'confirm', + name: 'confirm', + message: `Migrate Cordova preferences from config.xml?`, + initial: true, + }); + if (answers.confirm) { + if ((_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.cordova) === null || _b === void 0 ? void 0 : _b.preferences) { + const answers = await (0, prompts_1.default)([ + { + type: 'confirm', + name: 'confirm', + message: `${config.app.extConfigName} already contains Cordova preferences. Overwrite?`, + }, + ], { onCancel: () => process.exit(1) }); + if (!answers.confirm) { + cordova = (_c = config.app.extConfig) === null || _c === void 0 ? void 0 : _c.cordova; + } + } + } + else { + cordova = (_d = config.app.extConfig) === null || _d === void 0 ? void 0 : _d.cordova; + } + } + } + else { + cordova = (_e = config.app.extConfig) === null || _e === void 0 ? void 0 : _e.cordova; + } + return cordova; +} +exports.getCordovaPreferences = getCordovaPreferences; +async function writeCordovaAndroidManifest(cordovaPlugins, config, platform, cleartext) { + var _a; + const manifestPath = (0, path_1.join)(config.android.cordovaPluginsDirAbs, 'src', 'main', 'AndroidManifest.xml'); + const rootXMLEntries = []; + const applicationXMLEntries = []; + const applicationXMLAttributes = []; + let prefsArray = []; + cordovaPlugins.map(async (p) => { + const editConfig = (0, plugin_1.getPlatformElement)(p, platform, 'edit-config'); + const configFile = (0, plugin_1.getPlatformElement)(p, platform, 'config-file'); + prefsArray = prefsArray.concat((0, plugin_1.getAllElements)(p, platform, 'preference')); + editConfig.concat(configFile).map(async (configElement) => { + var _a, _b; + if (configElement.$ && + (((_a = configElement.$.target) === null || _a === void 0 ? void 0 : _a.includes('AndroidManifest.xml')) || + ((_b = configElement.$.file) === null || _b === void 0 ? void 0 : _b.includes('AndroidManifest.xml')))) { + const keys = Object.keys(configElement).filter(k => k !== '$'); + keys.map(k => { + configElement[k].map(async (e) => { + const xmlElement = (0, xml_1.buildXmlElement)(e, k); + const pathParts = getPathParts(configElement.$.parent || configElement.$.target); + if (pathParts.length > 1) { + if (pathParts.pop() === 'application') { + if (configElement.$.mode && + configElement.$.mode === 'merge' && + xmlElement.startsWith(' { + applicationXMLAttributes.push(`${ek}="${e.$[ek]}"`); + }); + } + else if (!applicationXMLEntries.includes(xmlElement) && + !contains(applicationXMLEntries, xmlElement, k)) { + applicationXMLEntries.push(xmlElement); + } + } + else { + const manifestPathOfCapApp = (0, path_1.join)(config.android.appDirAbs, 'src', 'main', 'AndroidManifest.xml'); + const manifestContentTrimmed = (await (0, utils_fs_1.readFile)(manifestPathOfCapApp)) + .toString() + .trim() + .replace(/\n|\t|\r/g, '') + .replace(/[\s]{1,}[\s]{1,}/g, '>') + .replace(/[\s]{2,}/g, ' '); + const requiredManifestContentTrimmed = xmlElement + .trim() + .replace(/\n|\t|\r/g, '') + .replace(/[\s]{1,}[\s]{1,}/g, '>') + .replace(/[\s]{2,}/g, ' '); + const pathPartList = getPathParts(configElement.$.parent || configElement.$.target); + const doesXmlManifestContainRequiredInfo = (requiredElements, existingElements, pathTarget) => { + const findElementsToSearchIn = (existingElements, pathTarget) => { + const parts = [...pathTarget]; + const elementsToSearchNextIn = []; + for (const existingElement of existingElements) { + if (existingElement.name === pathTarget[0]) { + if (existingElement.children) { + for (const el of existingElement.children) { + elementsToSearchNextIn.push(el); + } + } + else { + elementsToSearchNextIn.push(existingElement); + } + } + } + if (elementsToSearchNextIn.length === 0) { + return []; + } + else { + parts.splice(0, 1); + if (parts.length <= 0) { + return elementsToSearchNextIn; + } + else { + return findElementsToSearchIn(elementsToSearchNextIn, parts); + } + } + }; + const parseXmlToSearchable = (childElementsObj, arrayToAddTo) => { + for (const childElementKey of Object.keys(childElementsObj)) { + for (const occurannceOfElement of childElementsObj[childElementKey]) { + const toAdd = { name: childElementKey }; + if (occurannceOfElement['$']) { + toAdd.attrs = { ...occurannceOfElement['$'] }; + } + if (occurannceOfElement['$$']) { + toAdd.children = []; + parseXmlToSearchable(occurannceOfElement['$$'], toAdd['children']); + } + arrayToAddTo.push(toAdd); + } + } + }; + const doesElementMatch = (requiredElement, existingElement) => { + var _a; + if (requiredElement.name !== existingElement.name) { + return false; + } + if ((requiredElement.attrs !== undefined) !== + (existingElement.attrs !== undefined)) { + return false; + } + else { + if (requiredElement.attrs !== undefined) { + const requiredELementAttrKeys = Object.keys(requiredElement.attrs); + for (const key of requiredELementAttrKeys) { + if (!/^[$].{1,}$/.test(requiredElement.attrs[key].trim())) { + if (requiredElement.attrs[key] !== + existingElement.attrs[key]) { + return false; + } + } + } + } + } + if ((requiredElement.children !== undefined) !== + (existingElement.children !== undefined) && + ((_a = requiredElement.children) === null || _a === void 0 ? void 0 : _a.length) !== 0) { + return false; + } + else { + if (requiredElement.children !== undefined) { + // each req element is in existing element + for (const requiredElementItem of requiredElement.children) { + let foundRequiredElement = false; + for (const existingElementItem of existingElement.children) { + const foundRequiredElementIn = doesElementMatch(requiredElementItem, existingElementItem); + if (foundRequiredElementIn) { + foundRequiredElement = true; + break; + } + } + if (!foundRequiredElement) { + return false; + } + } + } + else { + if (requiredElement.children === undefined && + existingElement.children === undefined) { + return true; + } + else { + let foundRequiredElement = false; + for (const existingElementItem of existingElement.children) { + const foundRequiredElementIn = doesElementMatch(requiredElement, existingElementItem); + if (foundRequiredElementIn) { + foundRequiredElement = true; + break; + } + } + if (!foundRequiredElement) { + return false; + } + } + } + } + return true; + }; + const parsedExistingElements = []; + const rootKeyOfExistingElements = Object.keys(existingElements)[0]; + const rootOfExistingElementsToAdd = { name: rootKeyOfExistingElements, children: [] }; + if (existingElements[rootKeyOfExistingElements]['$']) { + rootOfExistingElementsToAdd.attrs = { + ...existingElements[rootKeyOfExistingElements]['$'], + }; + } + parseXmlToSearchable(existingElements[rootKeyOfExistingElements]['$$'], rootOfExistingElementsToAdd['children']); + parsedExistingElements.push(rootOfExistingElementsToAdd); + const parsedRequiredElements = []; + const rootKeyOfRequiredElements = Object.keys(requiredElements)[0]; + const rootOfRequiredElementsToAdd = { name: rootKeyOfRequiredElements, children: [] }; + if (requiredElements[rootKeyOfRequiredElements]['$']) { + rootOfRequiredElementsToAdd.attrs = { + ...requiredElements[rootKeyOfRequiredElements]['$'], + }; + } + if (requiredElements[rootKeyOfRequiredElements]['$$'] !== + undefined) { + parseXmlToSearchable(requiredElements[rootKeyOfRequiredElements]['$$'], rootOfRequiredElementsToAdd['children']); + } + parsedRequiredElements.push(rootOfRequiredElementsToAdd); + const elementsToSearch = findElementsToSearchIn(parsedExistingElements, pathTarget); + for (const requiredElement of parsedRequiredElements) { + let foundMatch = false; + for (const existingElement of elementsToSearch) { + const doesContain = doesElementMatch(requiredElement, existingElement); + if (doesContain) { + foundMatch = true; + break; + } + } + if (!foundMatch) { + return false; + } + } + return true; + }; + if (!doesXmlManifestContainRequiredInfo((0, xml_1.parseXML)(requiredManifestContentTrimmed, { + explicitChildren: true, + trim: true, + }), (0, xml_1.parseXML)(manifestContentTrimmed, { + explicitChildren: true, + trim: true, + }), pathPartList)) { + log_1.logger.warn(`Android Configuration required for ${colors_1.default.strong(p.id)}.\n` + + `Add the following to AndroidManifest.xml:\n` + + xmlElement); + } + } + } + else { + if (!rootXMLEntries.includes(xmlElement) && + !contains(rootXMLEntries, xmlElement, k)) { + rootXMLEntries.push(xmlElement); + } + } + }); + }); + } + }); + }); + const cleartextString = 'android:usesCleartextTraffic="true"'; + const cleartextValue = (cleartext || ((_a = config.app.extConfig.server) === null || _a === void 0 ? void 0 : _a.cleartext)) && + !applicationXMLAttributes.includes(cleartextString) + ? cleartextString + : ''; + let content = ` + + +${applicationXMLEntries.join('\n')} + +${rootXMLEntries.join('\n')} +`; + content = content.replace(new RegExp('$PACKAGE_NAME'.replace('$', '\\$&'), 'g'), '${applicationId}'); + for (const preference of prefsArray) { + content = content.replace(new RegExp(('$' + preference.$.name).replace('$', '\\$&'), 'g'), preference.$.default); + } + if (await (0, utils_fs_1.pathExists)(manifestPath)) { + await (0, utils_fs_1.writeFile)(manifestPath, content); + } +} +exports.writeCordovaAndroidManifest = writeCordovaAndroidManifest; +function getPathParts(path) { + const rootPath = 'manifest'; + path = path.replace('/*', rootPath); + const parts = path.split('/').filter(part => part !== ''); + if (parts.length > 1 || parts.includes(rootPath)) { + return parts; + } + return [rootPath, path]; +} +function contains(entries, obj, k) { + const element = (0, xml_1.parseXML)(obj); + for (const entry of entries) { + const current = (0, xml_1.parseXML)(entry); + if (element && + current && + current[k] && + element[k] && + current[k].$ && + element[k].$ && + element[k].$['android:name'] === current[k].$['android:name']) { + return true; + } + } + return false; +} diff --git a/@capacitor/cli/dist/declarations.d.ts b/@capacitor/cli/dist/declarations.d.ts new file mode 100644 index 00000000..6cf5497a --- /dev/null +++ b/@capacitor/cli/dist/declarations.d.ts @@ -0,0 +1,592 @@ +export interface CapacitorConfig { + /** + * The unique identifier of your packaged app. + * + * This is also known as the Bundle ID in iOS and the Application ID in + * Android. It must be in reverse domain name notation, generally + * representing a domain name that you or your company owns. + * + * @since 1.0.0 + */ + appId?: string; + /** + * The human-friendly name of your app. + * + * This should be what you'd see in the App Store, but can be changed after + * within each native platform after it is generated. + * + * @since 1.0.0 + */ + appName?: string; + /** + * The directory of your compiled web assets. + * + * This directory should contain the final `index.html` of your app. + * + * @since 1.0.0 + */ + webDir?: string; + /** + * Whether to copy the Capacitor runtime bundle or not. + * + * If your app is not using a bundler, set this to `true`, then Capacitor + * will create a `capacitor.js` file that you'll need to add as a script in + * your `index.html` file. + * + * It's deprecated and will be removed in Capacitor 6 + * + * @since 1.0.0 + * @deprecated 5.0.0 + * @default false + */ + bundledWebRuntime?: boolean; + /** + * The build configuration (as defined by the native app) under which Capacitor + * will send statements to the log system. This applies to log statements in + * native code as well as statements redirected from JavaScript (`console.debug`, + * `console.error`, etc.). Enabling logging will let statements render in the + * Xcode and Android Studio windows but can leak information on device if enabled + * in released builds. + * + * 'none' = logs are never produced + * 'debug' = logs are produced in debug builds but not production builds + * 'production' = logs are always produced + * + * @since 3.0.0 + * @default debug + */ + loggingBehavior?: 'none' | 'debug' | 'production'; + /** + * User agent of Capacitor Web View. + * + * @since 1.4.0 + */ + overrideUserAgent?: string; + /** + * String to append to the original user agent of Capacitor Web View. + * + * This is disregarded if `overrideUserAgent` is used. + * + * @since 1.4.0 + */ + appendUserAgent?: string; + /** + * Background color of the Capacitor Web View. + * + * @since 1.1.0 + */ + backgroundColor?: string; + /** + * Enable zooming within the Capacitor Web View. + * + * @default false + * @since 6.0.0 + */ + zoomEnabled?: boolean; + android?: { + /** + * Specify a custom path to the native Android project. + * + * @since 3.0.0 + * @default android + */ + path?: string; + /** + * User agent of Capacitor Web View on Android. + * + * Overrides global `overrideUserAgent` option. + * + * @since 1.4.0 + */ + overrideUserAgent?: string; + /** + * String to append to the original user agent of Capacitor Web View for Android. + * + * Overrides global `appendUserAgent` option. + * + * This is disregarded if `overrideUserAgent` is used. + * + * @since 1.4.0 + */ + appendUserAgent?: string; + /** + * Background color of the Capacitor Web View for Android. + * + * Overrides global `backgroundColor` option. + * + * @since 1.1.0 + */ + backgroundColor?: string; + /** + * Enable zooming within the Capacitor Web View for Android. + * + * @default false + * @since 6.0.0 + */ + zoomEnabled?: boolean; + /** + * Enable mixed content in the Capacitor Web View for Android. + * + * [Mixed + * content](https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content) + * is disabled by default for security. During development, you may need to + * enable it to allow the Web View to load files from different schemes. + * + * **This is not intended for use in production.** + * + * @since 1.0.0 + * @default false + */ + allowMixedContent?: boolean; + /** + * This enables a simpler keyboard which may have some limitations. + * + * This will capture JS keys using an alternative + * [`InputConnection`](https://developer.android.com/reference/android/view/inputmethod/InputConnection). + * + * @since 1.0.0 + * @default false + */ + captureInput?: boolean; + /** + * Always enable debuggable web content. + * + * This is automatically enabled during development. + * + * @since 1.0.0 + * @default false + */ + webContentsDebuggingEnabled?: boolean; + /** + * The build configuration under which Capacitor will generate logs on Android. + * + * Overrides global `loggingBehavior` option. + * + * @since 3.0.0 + * @default debug + */ + loggingBehavior?: 'none' | 'debug' | 'production'; + /** + * Allowlist of plugins to include during `npx cap sync` for Android. + * + * Overrides global `includePlugins` option. + * + * @since 3.0.0 + */ + includePlugins?: string[]; + /** + * Android flavor to use. + * + * If the app has flavors declared in the `build.gradle` + * configure the flavor you want to run with `npx cap run` command. + * + * @since 3.1.0 + */ + flavor?: string; + /** + * Whether to give the webview initial focus. + * + * @since 3.5.1 + * @default true + */ + initialFocus?: boolean; + /** + * The minimum supported webview version on Android supported by your app. + * + * The minimum supported cannot be lower than version `55`, which is required for Capacitor. + * + * If the device uses a lower WebView version, an error message will be shown on Logcat. + * If `server.errorPath` is configured, the WebView will redirect to that file, so can be + * used to show a custom error. + * + * @since 4.0.0 + * @default 60 + */ + minWebViewVersion?: number; + /** + * The minimum supported Huawei webview version on Android supported by your app. + * + * The minimum supported cannot be lower than version `10`, which is required for Capacitor. + * + * If the device uses a lower WebView version, an error message will be shown on Logcat. + * If `server.errorPath` is configured, the WebView will redirect to that file, so can be + * used to show a custom error. + * + * @since 4.6.4 + * @default 10 + */ + minHuaweiWebViewVersion?: number; + buildOptions?: { + /** + * Path to your keystore + * + * @since 4.4.0 + */ + keystorePath?: string; + /** + * Password to your keystore + * + * @since 4.4.0 + */ + keystorePassword?: string; + /** + * Alias in the keystore to use + * + * @since 4.4.0 + */ + keystoreAlias?: string; + /** + * Password for the alias in the keystore to use + * + * @since 4.4.0 + */ + keystoreAliasPassword?: string; + /** + * Bundle type for your release build + * + * @since 4.4.0 + * @default "AAB" + */ + releaseType?: 'AAB' | 'APK'; + /** + * Program to sign your build with + * + * @since 5.1.0 + * @default "jarsigner" + */ + signingType?: 'apksigner' | 'jarsigner'; + }; + /** + * Use legacy [addJavascriptInterface](https://developer.android.com/reference/android/webkit/WebView#addJavascriptInterface(java.lang.Object,%20java.lang.String)) + * instead of the new and more secure [addWebMessageListener](https://developer.android.com/reference/androidx/webkit/WebViewCompat#addWebMessageListener(android.webkit.WebView,java.lang.String,java.util.Set%3Cjava.lang.String%3E,androidx.webkit.WebViewCompat.WebMessageListener)) + * + * @since 4.5.0 + * @default false + */ + useLegacyBridge?: boolean; + }; + ios?: { + /** + * Specify a custom path to the native iOS project. + * + * @since 3.0.0 + * @default ios + */ + path?: string; + /** + * iOS build scheme to use. + * + * Usually this matches your app's target in Xcode. You can use the + * following command to list schemes: + * + * ```shell + * xcodebuild -workspace ios/App/App.xcworkspace -list + * ``` + * + * @since 3.0.0 + * @default App + */ + scheme?: string; + /** + * User agent of Capacitor Web View on iOS. + * + * Overrides global `overrideUserAgent` option. + * + * @since 1.4.0 + */ + overrideUserAgent?: string; + /** + * String to append to the original user agent of Capacitor Web View for iOS. + * + * Overrides global `appendUserAgent` option. + * + * This is disregarded if `overrideUserAgent` is used. + * + * @since 1.4.0 + */ + appendUserAgent?: string; + /** + * Background color of the Capacitor Web View for iOS. + * + * Overrides global `backgroundColor` option. + * + * @since 1.1.0 + */ + backgroundColor?: string; + /** + * Enable zooming within the Capacitor Web View for iOS. + * + * @default false + * @since 6.0.0 + */ + zoomEnabled?: boolean; + /** + * Configure the scroll view's content inset adjustment behavior. + * + * This will set the + * [`contentInsetAdjustmentBehavior`](https://developer.apple.com/documentation/uikit/uiscrollview/2902261-contentinsetadjustmentbehavior) + * property on the Web View's + * [`UIScrollView`](https://developer.apple.com/documentation/uikit/uiscrollview). + * + * @since 2.0.0 + * @default never + */ + contentInset?: 'automatic' | 'scrollableAxes' | 'never' | 'always'; + /** + * Configure whether the scroll view is scrollable. + * + * This will set the + * [`isScrollEnabled`](https://developer.apple.com/documentation/uikit/uiscrollview/1619395-isscrollenabled) + * property on the Web View's + * [`UIScrollView`](https://developer.apple.com/documentation/uikit/uiscrollview). + * + * @since 1.0.0 + */ + scrollEnabled?: boolean; + /** + * Configure custom linker flags for compiling Cordova plugins. + * + * @since 1.0.0 + * @default [] + */ + cordovaLinkerFlags?: string[]; + /** + * Allow destination previews when pressing on links. + * + * This will set the + * [`allowsLinkPreview`](https://developer.apple.com/documentation/webkit/wkwebview/1415000-allowslinkpreview) + * property on the Web View, instead of using the default value. + * + * @since 2.0.0 + */ + allowsLinkPreview?: boolean; + /** + * The build configuration under which Capacitor will generate logs on iOS. + * + * Overrides global `loggingBehavior` option. + * + * @since 3.0.0 + * @default debug + */ + loggingBehavior?: 'none' | 'debug' | 'production'; + /** + * Allowlist of plugins to include during `npx cap sync` for iOS. + * + * Overrides global `includePlugins` option. + * + * @since 3.0.0 + */ + includePlugins?: string[]; + /** + * Sets WKWebView configuration for limitsNavigationsToAppBoundDomains. + * + * If the Info.plist file includes `WKAppBoundDomains` key, it's recommended to + * set this option to true, otherwise some features won't work. + * But as side effect, it blocks navigation outside the domains in the + * `WKAppBoundDomains` list. + * `localhost` (or the value configured as `server.hostname`) also needs to be + * added to the `WKAppBoundDomains` list. + * + * @since 3.1.0 + * @default false + */ + limitsNavigationsToAppBoundDomains?: boolean; + /** + * The content mode for the web view to use when it loads and renders web content. + * + * - 'recommended': The content mode that is appropriate for the current device. + * - 'desktop': The content mode that represents a desktop experience. + * - 'mobile': The content mode that represents a mobile experience. + * + * @since 4.0.0 + * @default recommended + */ + preferredContentMode?: 'recommended' | 'desktop' | 'mobile'; + /** + * Configure if Capacitor will handle local/push notifications. + * Set to false if you want to use your own UNUserNotificationCenter to handle notifications. + * + * @since 4.5.0 + * @default true + */ + handleApplicationNotifications?: boolean; + /** + * Using Xcode 14.3, on iOS 16.4 and greater, enable debuggable web content for release builds. + * + * If not set, it's `true` for development builds. + * + * @since 4.8.0 + * @default false + */ + webContentsDebuggingEnabled?: boolean; + }; + server?: { + /** + * Configure the local hostname of the device. + * + * It is recommended to keep this as `localhost` as it allows the use of + * Web APIs that would otherwise require a [secure + * context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) + * such as + * [`navigator.geolocation`](https://developer.mozilla.org/en-US/docs/Web/API/Navigator/geolocation) + * and + * [`MediaDevices.getUserMedia`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia). + * + * @since 1.0.0 + * @default localhost + */ + hostname?: string; + /** + * Configure the local scheme on iOS. + * + * [Can't be set to schemes that the WKWebView already handles, such as http or https](https://developer.apple.com/documentation/webkit/wkwebviewconfiguration/2875766-seturlschemehandler) + * This can be useful when migrating from + * [`cordova-plugin-ionic-webview`](https://github.com/ionic-team/cordova-plugin-ionic-webview), + * where the default scheme on iOS is `ionic`. + * + * @since 1.2.0 + * @default capacitor + */ + iosScheme?: string; + /** + * Configure the local scheme on Android. + * + * Custom schemes on Android are unable to change the URL path as of Webview 117. Changing this value from anything other than `http` or `https` can result in your + * application unable to resolve routing. If you must change this for some reason, consider using a hash-based url strategy, but there are no guarentees that this + * will continue to work long term as allowing non-standard schemes to modify query parameters and url fragments is only allowed for compatibility reasons. + * https://ionic.io/blog/capacitor-android-customscheme-issue-with-chrome-117 + * + * @since 1.2.0 + * @default https + */ + androidScheme?: string; + /** + * Load an external URL in the Web View. + * + * This is intended for use with live-reload servers. + * + * **This is not intended for use in production.** + * + * @since 1.0.0 + */ + url?: string; + /** + * Allow cleartext traffic in the Web View. + * + * On Android, all cleartext traffic is disabled by default as of API 28. + * + * This is intended for use with live-reload servers where unencrypted HTTP + * traffic is often used. + * + * **This is not intended for use in production.** + * + * @since 1.5.0 + * @default false + */ + cleartext?: boolean; + /** + * Set additional URLs the Web View can navigate to. + * + * By default, all external URLs are opened in the external browser (not + * the Web View). + * + * **This is not intended for use in production.** + * + * @since 1.0.0 + * @default [] + */ + allowNavigation?: string[]; + /** + * Specify path to a local html page to display in case of errors. + * On Android the html file won't have access to Capacitor plugins. + * + * @since 4.0.0 + * @default null + */ + errorPath?: string; + }; + cordova?: { + /** + * Populates tags in the config.xml with the origin set to + * the values entered here. + * If not provided, a single tag gets included. + * It only has effect on a few Cordova plugins that respect the whitelist. + * + * @since 3.3.0 + */ + accessOrigins?: string[]; + /** + * Configure Cordova preferences. + * + * @since 1.3.0 + */ + preferences?: { + [key: string]: string | undefined; + }; + /** + * List of Cordova plugins that need to be static but are not + * already in the static plugin list. + * + * It's deprecated and will be removed in Capacitor 7 + * + * @since 3.3.0 + * @deprecated 6.1.1 + */ + staticPlugins?: string[]; + }; + /** + * Configure plugins. + * + * This is an object with configuration values specified by plugin class + * name. + * + * @since 1.0.0 + */ + plugins?: PluginsConfig; + /** + * Allowlist of plugins to include during `npx cap sync`. + * + * This should be an array of strings representing the npm package name of + * plugins to include when running `npx cap sync`. If unset, Capacitor will + * inspect `package.json` for a list of potential plugins. + * + * @since 3.0.0 + */ + includePlugins?: string[]; +} +export interface PluginsConfig { + /** + * Plugin configuration by class name. + * + * @since 1.0.0 + */ + [key: string]: { + [key: string]: any; + } | undefined; + /** + * Capacitor Cookies plugin configuration + * + * @since 4.3.0 + */ + CapacitorCookies?: { + /** + * Enable CapacitorCookies to override the global `document.cookie` on native. + * + * @default false + */ + enabled?: boolean; + }; + /** + * Capacitor Http plugin configuration + * + * @since 4.3.0 + */ + CapacitorHttp?: { + /** + * Enable CapacitorHttp to override the global `fetch` and `XMLHttpRequest` on native. + * + * @default false + */ + enabled?: boolean; + }; +} diff --git a/@capacitor/cli/dist/declarations.js b/@capacitor/cli/dist/declarations.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/@capacitor/cli/dist/declarations.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/@capacitor/cli/dist/definitions.js b/@capacitor/cli/dist/definitions.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/@capacitor/cli/dist/definitions.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/@capacitor/cli/dist/errors.js b/@capacitor/cli/dist/errors.js new file mode 100644 index 00000000..061c9a91 --- /dev/null +++ b/@capacitor/cli/dist/errors.js @@ -0,0 +1,27 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isFatal = exports.fatal = exports.FatalException = exports.BaseException = void 0; +class BaseException extends Error { + constructor(message, code) { + super(message); + this.message = message; + this.code = code; + } +} +exports.BaseException = BaseException; +class FatalException extends BaseException { + constructor(message, exitCode = 1) { + super(message, 'FATAL'); + this.message = message; + this.exitCode = exitCode; + } +} +exports.FatalException = FatalException; +function fatal(message) { + throw new FatalException(message); +} +exports.fatal = fatal; +function isFatal(e) { + return e && e instanceof FatalException; +} +exports.isFatal = isFatal; diff --git a/@capacitor/cli/dist/framework-configs.js b/@capacitor/cli/dist/framework-configs.js new file mode 100644 index 00000000..2df939d7 --- /dev/null +++ b/@capacitor/cli/dist/framework-configs.js @@ -0,0 +1,109 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.detectFramework = void 0; +const FRAMEWORK_CONFIGS = [ + { + name: 'Angular', + isMatch: config => hasDependency(config, '@angular/cli'), + webDir: 'dist', + priority: 3, + }, + { + name: 'Create React App', + isMatch: config => hasDependency(config, 'react-scripts'), + webDir: 'build', + priority: 3, + }, + { + name: 'Ember', + isMatch: config => hasDependency(config, 'ember-cli'), + webDir: 'dist', + priority: 3, + }, + { + name: 'Gatsby', + isMatch: config => hasDependency(config, 'gatsby'), + webDir: 'public', + priority: 2, + }, + { + name: 'Ionic Angular', + isMatch: config => hasDependency(config, '@ionic/angular'), + webDir: 'www', + priority: 1, + }, + { + name: 'Ionic React', + isMatch: config => hasDependency(config, '@ionic/react'), + webDir: 'build', + priority: 1, + }, + { + name: 'Ionic Vue', + isMatch: config => hasDependency(config, '@ionic/vue'), + webDir: 'public', + priority: 1, + }, + { + name: 'Next', + isMatch: config => hasDependency(config, 'next'), + webDir: 'public', + priority: 2, + }, + { + name: 'Preact', + isMatch: config => hasDependency(config, 'preact-cli'), + webDir: 'build', + priority: 3, + }, + { + name: 'Stencil', + isMatch: config => hasDependency(config, '@stencil/core'), + webDir: 'www', + priority: 3, + }, + { + name: 'Svelte', + isMatch: config => hasDependency(config, 'svelte') && hasDependency(config, 'sirv-cli'), + webDir: 'public', + priority: 3, + }, + { + name: 'Vite', + isMatch: config => hasDependency(config, 'vite'), + webDir: 'dist', + priority: 2, + }, + { + name: 'Vue', + isMatch: config => hasDependency(config, '@vue/cli-service'), + webDir: 'dist', + priority: 3, + }, +]; +function detectFramework(config) { + const frameworks = FRAMEWORK_CONFIGS.filter(f => f.isMatch(config)).sort((a, b) => { + if (a.priority < b.priority) + return -1; + if (a.priority > b.priority) + return 1; + return 0; + }); + return frameworks[0]; +} +exports.detectFramework = detectFramework; +function hasDependency(config, depName) { + const deps = getDependencies(config); + return deps.includes(depName); +} +function getDependencies(config) { + var _a, _b, _c, _d; + const deps = []; + if ((_b = (_a = config === null || config === void 0 ? void 0 : config.app) === null || _a === void 0 ? void 0 : _a.package) === null || _b === void 0 ? void 0 : _b.dependencies) { + deps.push(...Object.keys(config.app.package.dependencies)); + } + if ((_d = (_c = config === null || config === void 0 ? void 0 : config.app) === null || _c === void 0 ? void 0 : _c.package) === null || _d === void 0 ? void 0 : _d.devDependencies) { + deps.push(...Object.keys(config.app.package.devDependencies)); + } + return deps; +} diff --git a/@capacitor/cli/dist/index.js b/@capacitor/cli/dist/index.js new file mode 100644 index 00000000..0a12395b --- /dev/null +++ b/@capacitor/cli/dist/index.js @@ -0,0 +1,224 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runProgram = exports.run = void 0; +const tslib_1 = require("tslib"); +const commander_1 = require("commander"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const config_1 = require("./config"); +const errors_1 = require("./errors"); +const ipc_1 = require("./ipc"); +const log_1 = require("./log"); +const telemetry_1 = require("./telemetry"); +const cli_1 = require("./util/cli"); +const emoji_1 = require("./util/emoji"); +process.on('unhandledRejection', error => { + console.error(colors_1.default.failure('[fatal]'), error); +}); +process.on('message', ipc_1.receive); +async function run() { + try { + const config = await (0, config_1.loadConfig)(); + runProgram(config); + } + catch (e) { + process.exitCode = (0, errors_1.isFatal)(e) ? e.exitCode : 1; + log_1.logger.error(e.message ? e.message : String(e)); + } +} +exports.run = run; +function runProgram(config) { + commander_1.program.version(config.cli.package.version); + commander_1.program + .command('config', { hidden: true }) + .description(`print evaluated Capacitor config`) + .option('--json', 'Print in JSON format') + .action((0, cli_1.wrapAction)(async ({ json }) => { + const { configCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/config'))); + await configCommand(config, json); + })); + commander_1.program + .command('create [directory] [name] [id]', { hidden: true }) + .description('Creates a new Capacitor project') + .action((0, cli_1.wrapAction)(async () => { + const { createCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/create'))); + await createCommand(); + })); + commander_1.program + .command('init [appName] [appId]') + .description(`Initialize Capacitor configuration`) + .option('--web-dir ', 'Optional: Directory of your projects built web assets') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (appName, appId, { webDir }) => { + const { initCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/init'))); + await initCommand(config, appName, appId, webDir); + }))); + commander_1.program + .command('serve', { hidden: true }) + .description('Serves a Capacitor Progressive Web App in the browser') + .action((0, cli_1.wrapAction)(async () => { + const { serveCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/serve'))); + await serveCommand(); + })); + commander_1.program + .command('sync [platform]') + .description(`${colors_1.default.input('copy')} + ${colors_1.default.input('update')}`) + .option('--deployment', 'Optional: if provided, pod install will use --deployment option') + .option('--inline', 'Optional: if true, all source maps will be inlined for easier debugging on mobile devices', false) + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { deployment, inline }) => { + (0, config_1.checkExternalConfig)(config.app); + const { syncCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/sync'))); + await syncCommand(config, platform, deployment, inline); + }))); + commander_1.program + .command('update [platform]') + .description(`updates the native plugins and dependencies based on ${colors_1.default.strong('package.json')}`) + .option('--deployment', 'Optional: if provided, pod install will use --deployment option') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { deployment }) => { + (0, config_1.checkExternalConfig)(config.app); + const { updateCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/update'))); + await updateCommand(config, platform, deployment); + }))); + commander_1.program + .command('copy [platform]') + .description('copies the web app build into the native app') + .option('--inline', 'Optional: if true, all source maps will be inlined for easier debugging on mobile devices', false) + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { inline }) => { + (0, config_1.checkExternalConfig)(config.app); + const { copyCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/copy'))); + await copyCommand(config, platform, inline); + }))); + commander_1.program + .command('build ') + .description('builds the release version of the selected platform') + .option('--scheme ', 'iOS Scheme to build') + .option('--flavor ', 'Android Flavor to build') + .option('--keystorepath ', 'Path to the keystore') + .option('--keystorepass ', 'Password to the keystore') + .option('--keystorealias ', 'Key Alias in the keystore') + .option('--configuration ', 'Configuration name of the iOS Scheme') + .option('--keystorealiaspass ', 'Password for the Key Alias') + .addOption(new commander_1.Option('--androidreleasetype ', 'Android release type; APK or AAB').choices(['AAB', 'APK'])) + .addOption(new commander_1.Option('--signing-type ', 'Program used to sign apps (default: jarsigner)').choices(['apksigner', 'jarsigner'])) + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { scheme, flavor, keystorepath, keystorepass, keystorealias, keystorealiaspass, androidreleasetype, signingType, configuration, }) => { + const { buildCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/build'))); + await buildCommand(config, platform, { + scheme, + flavor, + keystorepath, + keystorepass, + keystorealias, + keystorealiaspass, + androidreleasetype, + signingtype: signingType, + configuration, + }); + }))); + commander_1.program + .command(`run [platform]`) + .description(`runs ${colors_1.default.input('sync')}, then builds and deploys the native app`) + .option('--scheme ', 'set the scheme of the iOS project') + .option('--flavor ', 'set the flavor of the Android project (flavor dimensions not yet supported)') + .option('--list', 'list targets, then quit') + // TODO: remove once --json is a hidden option (https://github.com/tj/commander.js/issues/1106) + .allowUnknownOption(true) + .option('--target ', 'use a specific target') + .option('--no-sync', `do not run ${colors_1.default.input('sync')}`) + .option('--forwardPorts ', 'Automatically run "adb reverse" for better live-reloading support') + .option('-l, --live-reload', 'Enable Live Reload') + .option('--host ', 'Host used for live reload') + .option('--port ', 'Port used for live reload') + .option('--configuration ', 'Configuration name of the iOS Scheme') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { scheme, flavor, list, target, sync, forwardPorts, liveReload, host, port, configuration, }) => { + const { runCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/run'))); + await runCommand(config, platform, { + scheme, + flavor, + list, + target, + sync, + forwardPorts, + liveReload, + host, + port, + configuration, + }); + }))); + commander_1.program + .command('open [platform]') + .description('opens the native project workspace (Xcode for iOS)') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform) => { + const { openCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/open'))); + await openCommand(config, platform); + }))); + commander_1.program + .command('add [platform]') + .description('add a native platform project') + .option('--packagemanager ', 'The package manager to use for dependency installs (Cocoapods, SPM **experimental**)') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform, { packagemanager }) => { + (0, config_1.checkExternalConfig)(config.app); + const { addCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/add'))); + const configWritable = config; + if (packagemanager === 'SPM') { + configWritable.cli.assets.ios.platformTemplateArchive = + 'ios-spm-template.tar.gz'; + configWritable.cli.assets.ios.platformTemplateArchiveAbs = (0, path_1.resolve)(configWritable.cli.assetsDirAbs, configWritable.cli.assets.ios.platformTemplateArchive); + } + await addCommand(configWritable, platform); + }))); + commander_1.program + .command('ls [platform]') + .description('list installed Cordova and Capacitor plugins') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform) => { + (0, config_1.checkExternalConfig)(config.app); + const { listCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/list'))); + await listCommand(config, platform); + }))); + commander_1.program + .command('doctor [platform]') + .description('checks the current setup for common errors') + .action((0, cli_1.wrapAction)((0, telemetry_1.telemetryAction)(config, async (platform) => { + (0, config_1.checkExternalConfig)(config.app); + const { doctorCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/doctor'))); + await doctorCommand(config, platform); + }))); + commander_1.program + .command('telemetry [on|off]', { hidden: true }) + .description('enable or disable telemetry') + .action((0, cli_1.wrapAction)(async (onOrOff) => { + const { telemetryCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/telemetry'))); + await telemetryCommand(onOrOff); + })); + commander_1.program + .command('📡', { hidden: true }) + .description('IPC receiver command') + .action(() => { + // no-op: IPC messages are received via `process.on('message')` + }); + commander_1.program + .command('plugin:generate', { hidden: true }) + .description('start a new Capacitor plugin') + .action((0, cli_1.wrapAction)(async () => { + const { newPluginCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/new-plugin'))); + await newPluginCommand(); + })); + commander_1.program + .command('migrate') + .option('--noprompt', 'do not prompt for confirmation') + .option('--packagemanager ', 'The package manager to use for dependency installs (npm, pnpm, yarn)') + .description('Migrate your current Capacitor app to the latest major version of Capacitor.') + .action((0, cli_1.wrapAction)(async ({ noprompt, packagemanager }) => { + const { migrateCommand } = await Promise.resolve().then(() => tslib_1.__importStar(require('./tasks/migrate'))); + await migrateCommand(config, noprompt, packagemanager); + })); + commander_1.program.arguments('[command]').action((0, cli_1.wrapAction)(async (cmd) => { + if (typeof cmd === 'undefined') { + log_1.output.write(`\n ${(0, emoji_1.emoji)('⚡️', '--')} ${colors_1.default.strong('Capacitor - Cross-Platform apps with JavaScript and the Web')} ${(0, emoji_1.emoji)('⚡️', '--')}\n\n`); + commander_1.program.outputHelp(); + } + else { + (0, errors_1.fatal)(`Unknown command: ${colors_1.default.input(cmd)}`); + } + })); + commander_1.program.parse(process.argv); +} +exports.runProgram = runProgram; diff --git a/@capacitor/cli/dist/ios/add.js b/@capacitor/cli/dist/ios/add.js new file mode 100644 index 00000000..7472926b --- /dev/null +++ b/@capacitor/cli/dist/ios/add.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.addIOS = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const template_1 = require("../util/template"); +async function addIOS(config) { + await (0, common_1.runTask)(`Adding native Xcode project in ${colors_1.default.strong(config.ios.platformDir)}`, () => { + return (0, template_1.extractTemplate)(config.cli.assets.ios.platformTemplateArchiveAbs, config.ios.platformDirAbs); + }); +} +exports.addIOS = addIOS; diff --git a/@capacitor/cli/dist/ios/build.js b/@capacitor/cli/dist/ios/build.js new file mode 100644 index 00000000..d8e6274d --- /dev/null +++ b/@capacitor/cli/dist/ios/build.js @@ -0,0 +1,70 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildiOS = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const rimraf_1 = tslib_1.__importDefault(require("rimraf")); +const common_1 = require("../common"); +const log_1 = require("../log"); +const spm_1 = require("../util/spm"); +const subprocess_1 = require("../util/subprocess"); +async function buildiOS(config, buildOptions) { + var _a; + const theScheme = (_a = buildOptions.scheme) !== null && _a !== void 0 ? _a : 'App'; + const packageManager = await (0, spm_1.checkPackageManager)(config); + let typeOfBuild; + let projectName; + if (packageManager == 'Cocoapods') { + typeOfBuild = '-workspace'; + projectName = (0, path_1.basename)(await config.ios.nativeXcodeWorkspaceDirAbs); + } + else { + typeOfBuild = '-project'; + projectName = (0, path_1.basename)(await config.ios.nativeXcodeProjDirAbs); + } + await (0, common_1.runTask)('Building xArchive', async () => (0, subprocess_1.runCommand)('xcodebuild', [ + typeOfBuild, + projectName, + '-scheme', + `${theScheme}`, + '-destination', + `generic/platform=iOS`, + '-archivePath', + `${theScheme}.xcarchive`, + 'archive', + ], { + cwd: config.ios.nativeProjectDirAbs, + })); + const archivePlistContents = ` + + + +method +app-store + +`; + const archivePlistPath = (0, path_1.join)(`${config.ios.nativeProjectDirAbs}`, 'archive.plist'); + (0, utils_fs_1.writeFileSync)(archivePlistPath, archivePlistContents); + await (0, common_1.runTask)('Building IPA', async () => (0, subprocess_1.runCommand)('xcodebuild', [ + 'archive', + '-archivePath', + `${theScheme}.xcarchive`, + '-exportArchive', + '-exportOptionsPlist', + 'archive.plist', + '-exportPath', + 'output', + '-allowProvisioningUpdates', + '-configuration', + buildOptions.configuration, + ], { + cwd: config.ios.nativeProjectDirAbs, + })); + await (0, common_1.runTask)('Cleaning up', async () => { + (0, utils_fs_1.unlinkSync)(archivePlistPath); + rimraf_1.default.sync((0, path_1.join)(config.ios.nativeProjectDirAbs, `${theScheme}.xcarchive`)); + }); + (0, log_1.logSuccess)(`Successfully generated an IPA at: ${(0, path_1.join)(config.ios.nativeProjectDirAbs, 'output')}`); +} +exports.buildiOS = buildiOS; diff --git a/@capacitor/cli/dist/ios/common.js b/@capacitor/cli/dist/ios/common.js new file mode 100644 index 00000000..ad73c854 --- /dev/null +++ b/@capacitor/cli/dist/ios/common.js @@ -0,0 +1,103 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.editProjectSettingsIOS = exports.resolvePlugin = exports.getIOSPlugins = exports.checkCocoaPods = exports.checkBundler = exports.checkIOSPackage = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const child_process_1 = require("child_process"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const subprocess_1 = require("../util/subprocess"); +async function checkIOSPackage(config) { + return (0, common_1.checkCapacitorPlatform)(config, 'ios'); +} +exports.checkIOSPackage = checkIOSPackage; +function execBundler() { + try { + const bundleOutput = (0, child_process_1.execSync)('bundle &> /dev/null ; echo $?'); + return parseInt(bundleOutput.toString()); + } + catch (e) { + return -1; + } +} +async function checkBundler(config) { + if (config.cli.os === "mac" /* OS.Mac */) { + let bundlerResult = execBundler(); + if (bundlerResult === 1) { + // Bundler version is outdated + log_1.logger.info(`Using ${colors_1.default.strong('Gemfile')}: Bundler update needed...`); + await (0, subprocess_1.runCommand)('gem', ['install', 'bundler']); + bundlerResult = execBundler(); + } + if (bundlerResult === 0) { + // Bundler in use, all gems current + log_1.logger.info(`Using ${colors_1.default.strong('Gemfile')}: RubyGems bundle installed`); + } + } + return null; +} +exports.checkBundler = checkBundler; +async function checkCocoaPods(config) { + if (!(await (0, subprocess_1.isInstalled)(await config.ios.podPath)) && + config.cli.os === "mac" /* OS.Mac */) { + return (`CocoaPods is not installed.\n` + + `See this install guide: ${colors_1.default.strong('https://capacitorjs.com/docs/getting-started/environment-setup#homebrew')}`); + } + return null; +} +exports.checkCocoaPods = checkCocoaPods; +async function getIOSPlugins(allPlugins) { + const resolved = await Promise.all(allPlugins.map(async (plugin) => await resolvePlugin(plugin))); + return resolved.filter((plugin) => !!plugin); +} +exports.getIOSPlugins = getIOSPlugins; +async function resolvePlugin(plugin) { + var _a, _b; + const platform = 'ios'; + if ((_a = plugin.manifest) === null || _a === void 0 ? void 0 : _a.ios) { + plugin.ios = { + name: plugin.name, + type: 0 /* PluginType.Core */, + path: (_b = plugin.manifest.ios.src) !== null && _b !== void 0 ? _b : platform, + }; + } + else if (plugin.xml) { + plugin.ios = { + name: plugin.name, + type: 1 /* PluginType.Cordova */, + path: 'src/' + platform, + }; + if ((0, cordova_1.getIncompatibleCordovaPlugins)(platform).includes(plugin.id) || + !(0, plugin_1.getPluginPlatform)(plugin, platform)) { + plugin.ios.type = 2 /* PluginType.Incompatible */; + } + } + else { + return null; + } + return plugin; +} +exports.resolvePlugin = resolvePlugin; +/** + * Update the native project files with the desired app id and app name + */ +async function editProjectSettingsIOS(config) { + const appId = config.app.appId; + const appName = config.app.appName + .replace(/&/g, '&') + .replace(//g, '>'); + const pbxPath = `${config.ios.nativeXcodeProjDirAbs}/project.pbxproj`; + const plistPath = (0, path_1.resolve)(config.ios.nativeTargetDirAbs, 'Info.plist'); + let plistContent = await (0, utils_fs_1.readFile)(plistPath, { encoding: 'utf-8' }); + plistContent = plistContent.replace(/CFBundleDisplayName<\/key>[\s\S]?\s+([^<]*)<\/string>/, `CFBundleDisplayName\n ${appName}`); + let pbxContent = await (0, utils_fs_1.readFile)(pbxPath, { encoding: 'utf-8' }); + pbxContent = pbxContent.replace(/PRODUCT_BUNDLE_IDENTIFIER = ([^;]+)/g, `PRODUCT_BUNDLE_IDENTIFIER = ${appId}`); + await (0, utils_fs_1.writeFile)(plistPath, plistContent, { encoding: 'utf-8' }); + await (0, utils_fs_1.writeFile)(pbxPath, pbxContent, { encoding: 'utf-8' }); +} +exports.editProjectSettingsIOS = editProjectSettingsIOS; diff --git a/@capacitor/cli/dist/ios/doctor.js b/@capacitor/cli/dist/ios/doctor.js new file mode 100644 index 00000000..853ac183 --- /dev/null +++ b/@capacitor/cli/dist/ios/doctor.js @@ -0,0 +1,49 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.doctorIOS = void 0; +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const subprocess_1 = require("../util/subprocess"); +const common_2 = require("./common"); +async function doctorIOS(config) { + var _a; + // DOCTOR ideas for iOS: + // plugin specific warnings + // check cocoapods installed + // check projects exist + // check content in www === ios/www + // check CLI versions + // check plugins versions + // check native project deps are up-to-date === npm install + // check if npm install was updated + // check online datebase of common errors + // check if www folder is empty (index.html does not exist) + try { + await (0, common_1.check)([ + () => (0, common_2.checkBundler)(config) || (0, common_2.checkCocoaPods)(config), + () => (0, common_1.checkWebDir)(config), + checkXcode, + ]); + (0, log_1.logSuccess)('iOS looking great! 👌'); + } + catch (e) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } +} +exports.doctorIOS = doctorIOS; +async function checkXcode() { + if (!(await (0, subprocess_1.isInstalled)('xcodebuild'))) { + return `Xcode is not installed`; + } + // const matches = output.match(/^Xcode (.*)/); + // if (matches && matches.length === 2) { + // const minVersion = '9.0.0'; + // const semver = await import('semver'); + // console.log(matches[1]); + // if (semver.gt(minVersion, matches[1])) { + // return `Xcode version is too old, ${minVersion} is required`; + // } + // } + return null; +} diff --git a/@capacitor/cli/dist/ios/open.js b/@capacitor/cli/dist/ios/open.js new file mode 100644 index 00000000..6fb96144 --- /dev/null +++ b/@capacitor/cli/dist/ios/open.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.openIOS = void 0; +const tslib_1 = require("tslib"); +const open_1 = tslib_1.__importDefault(require("open")); +const common_1 = require("../common"); +const spm_1 = require("../util/spm"); +async function openIOS(config) { + if ((await (0, spm_1.checkPackageManager)(config)) == 'SPM') { + await (0, open_1.default)(config.ios.nativeXcodeProjDirAbs, { wait: false }); + } + else { + await (0, open_1.default)(await config.ios.nativeXcodeWorkspaceDirAbs, { wait: false }); + } + await (0, common_1.wait)(3000); +} +exports.openIOS = openIOS; diff --git a/@capacitor/cli/dist/ios/run.js b/@capacitor/cli/dist/ios/run.js new file mode 100644 index 00000000..24177b47 --- /dev/null +++ b/@capacitor/cli/dist/ios/run.js @@ -0,0 +1,53 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.runIOS = void 0; +const tslib_1 = require("tslib"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const native_run_1 = require("../util/native-run"); +const spm_1 = require("../util/spm"); +const subprocess_1 = require("../util/subprocess"); +const debug = (0, debug_1.default)('capacitor:ios:run'); +async function runIOS(config, { target: selectedTarget, scheme: selectedScheme, configuration: selectedConfiguration, }) { + const target = await (0, common_1.promptForPlatformTarget)(await (0, native_run_1.getPlatformTargets)('ios'), selectedTarget); + const runScheme = selectedScheme || config.ios.scheme; + const configuration = selectedConfiguration || 'Debug'; + const derivedDataPath = (0, path_1.resolve)(config.ios.platformDirAbs, 'DerivedData', target.id); + const packageManager = await (0, spm_1.checkPackageManager)(config); + let typeOfBuild; + let projectName; + if (packageManager == 'Cocoapods') { + typeOfBuild = '-workspace'; + projectName = (0, path_1.basename)(await config.ios.nativeXcodeWorkspaceDirAbs); + } + else { + typeOfBuild = '-project'; + projectName = (0, path_1.basename)(await config.ios.nativeXcodeProjDirAbs); + } + const xcodebuildArgs = [ + typeOfBuild, + projectName, + '-scheme', + runScheme, + '-configuration', + configuration, + '-destination', + `id=${target.id}`, + '-derivedDataPath', + derivedDataPath, + ]; + debug('Invoking xcodebuild with args: %O', xcodebuildArgs); + await (0, common_1.runTask)('Running xcodebuild', async () => (0, subprocess_1.runCommand)('xcrun', ['xcodebuild', ...xcodebuildArgs], { + cwd: config.ios.nativeProjectDirAbs, + })); + const appName = `${runScheme}.app`; + const appPath = (0, path_1.resolve)(derivedDataPath, 'Build/Products', target.virtual + ? `${configuration}-iphonesimulator` + : `${configuration}-iphoneos`, appName); + const nativeRunArgs = ['ios', '--app', appPath, '--target', target.id]; + debug('Invoking native-run with args: %O', nativeRunArgs); + await (0, common_1.runTask)(`Deploying ${colors_1.default.strong(appName)} to ${colors_1.default.input(target.id)}`, async () => (0, native_run_1.runNativeRun)(nativeRunArgs)); +} +exports.runIOS = runIOS; diff --git a/@capacitor/cli/dist/ios/update.js b/@capacitor/cli/dist/ios/update.js new file mode 100644 index 00000000..9a532454 --- /dev/null +++ b/@capacitor/cli/dist/ios/update.js @@ -0,0 +1,417 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.installCocoaPodsPlugins = exports.updateIOS = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const copy_1 = require("../tasks/copy"); +const fs_1 = require("../util/fs"); +const iosplugin_1 = require("../util/iosplugin"); +const node_1 = require("../util/node"); +const spm_1 = require("../util/spm"); +const subprocess_1 = require("../util/subprocess"); +const template_1 = require("../util/template"); +const common_2 = require("./common"); +const platform = 'ios'; +async function updateIOS(config, deployment) { + const plugins = await getPluginsTask(config); + const capacitorPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 0 /* PluginType.Core */); + if ((await (0, spm_1.checkPackageManager)(config)) === 'SPM') { + await (0, spm_1.generatePackageFile)(config, capacitorPlugins); + } + else { + await updateIOSCocoaPods(config, plugins, deployment); + } + (0, iosplugin_1.generateIOSPackageJSON)(config, plugins); + (0, plugin_1.printPlugins)(capacitorPlugins, 'ios'); +} +exports.updateIOS = updateIOS; +async function updateIOSCocoaPods(config, plugins, deployment) { + await removePluginsNativeFiles(config); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + if (cordovaPlugins.length > 0) { + await copyPluginsNativeFiles(config, cordovaPlugins); + } + if (!(await (0, utils_fs_1.pathExists)(await config.ios.webDirAbs))) { + await (0, copy_1.copy)(config, platform); + } + await (0, cordova_1.handleCordovaPluginsJS)(cordovaPlugins, config, platform); + await (0, cordova_1.checkPluginDependencies)(plugins, platform); + await generateCordovaPodspecs(cordovaPlugins, config); + await installCocoaPodsPlugins(config, plugins, deployment); + await (0, cordova_1.logCordovaManualSteps)(cordovaPlugins, config, platform); + const incompatibleCordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 2 /* PluginType.Incompatible */); + (0, plugin_1.printPlugins)(incompatibleCordovaPlugins, platform, 'incompatible'); + await (0, common_1.checkPlatformVersions)(config, platform); +} +async function installCocoaPodsPlugins(config, plugins, deployment) { + await (0, common_1.runTask)(`Updating iOS native dependencies with ${colors_1.default.input(`${await config.ios.podPath} install`)}`, () => { + return updatePodfile(config, plugins, deployment); + }); +} +exports.installCocoaPodsPlugins = installCocoaPodsPlugins; +async function updatePodfile(config, plugins, deployment) { + const dependenciesContent = await generatePodFile(config, plugins); + const relativeCapacitoriOSPath = await getRelativeCapacitoriOSPath(config); + const podfilePath = (0, path_1.join)(config.ios.nativeProjectDirAbs, 'Podfile'); + let podfileContent = await (0, utils_fs_1.readFile)(podfilePath, { encoding: 'utf-8' }); + podfileContent = podfileContent.replace(/(def capacitor_pods)[\s\S]+?(\nend)/, `$1${dependenciesContent}$2`); + podfileContent = podfileContent.replace(/(require_relative)[\s\S]+?(@capacitor\/ios\/scripts\/pods_helpers')/, `require_relative '${relativeCapacitoriOSPath}/scripts/pods_helpers'`); + podfileContent = podfileContent.replace(`def assertDeploymentTarget(installer) + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + # ensure IPHONEOS_DEPLOYMENT_TARGET is at least 13.0 + deployment_target = config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'].to_f + should_upgrade = deployment_target < 13.0 && deployment_target != 0.0 + if should_upgrade + config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0' + end + end + end +end`, `require_relative '${relativeCapacitoriOSPath}/scripts/pods_helpers'`); + await (0, utils_fs_1.writeFile)(podfilePath, podfileContent, { encoding: 'utf-8' }); + const podPath = await config.ios.podPath; + const useBundler = podPath.startsWith('bundle'); + const podCommandExists = await (0, subprocess_1.isInstalled)('pod'); + if (useBundler || podCommandExists) { + if (useBundler) { + await (0, subprocess_1.runCommand)('bundle', ['exec', 'pod', 'install', ...(deployment ? ['--deployment'] : [])], { cwd: config.ios.nativeProjectDirAbs }); + } + else { + await (0, subprocess_1.runCommand)(podPath, ['install', ...(deployment ? ['--deployment'] : [])], { cwd: config.ios.nativeProjectDirAbs }); + } + } + else { + log_1.logger.warn('Skipping pod install because CocoaPods is not installed'); + } + const isXcodebuildAvailable = await (0, subprocess_1.isInstalled)('xcodebuild'); + if (isXcodebuildAvailable) { + await (0, subprocess_1.runCommand)('xcodebuild', ['-project', (0, path_1.basename)(`${config.ios.nativeXcodeProjDirAbs}`), 'clean'], { + cwd: config.ios.nativeProjectDirAbs, + }); + } + else { + log_1.logger.warn('Unable to find "xcodebuild". Skipping xcodebuild clean step...'); + } +} +async function getRelativeCapacitoriOSPath(config) { + const capacitoriOSPath = (0, node_1.resolveNode)(config.app.rootDir, '@capacitor/ios', 'package.json'); + if (!capacitoriOSPath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong('node_modules/@capacitor/ios')}.\n` + + `Are you sure ${colors_1.default.strong('@capacitor/ios')} is installed?`); + } + return (0, fs_1.convertToUnixPath)((0, path_1.relative)(config.ios.nativeProjectDirAbs, await (0, utils_fs_1.realpath)((0, path_1.dirname)(capacitoriOSPath)))); +} +async function generatePodFile(config, plugins) { + const relativeCapacitoriOSPath = await getRelativeCapacitoriOSPath(config); + const capacitorPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 0 /* PluginType.Core */); + const pods = await Promise.all(capacitorPlugins.map(async (p) => { + if (!p.ios) { + return ''; + } + return ` pod '${p.ios.name}', :path => '${(0, fs_1.convertToUnixPath)((0, path_1.relative)(config.ios.nativeProjectDirAbs, await (0, utils_fs_1.realpath)(p.rootPath)))}'\n`; + })); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + cordovaPlugins.map(async (p) => { + const podspecs = (0, plugin_1.getPlatformElement)(p, platform, 'podspec'); + podspecs.map((podspec) => { + podspec.pods.map((pPods) => { + pPods.pod.map((pod) => { + if (pod.$.git) { + let gitRef = ''; + if (pod.$.tag) { + gitRef = `, :tag => '${pod.$.tag}'`; + } + else if (pod.$.branch) { + gitRef = `, :branch => '${pod.$.branch}'`; + } + else if (pod.$.commit) { + gitRef = `, :commit => '${pod.$.commit}'`; + } + pods.push(` pod '${pod.$.name}', :git => '${pod.$.git}'${gitRef}\n`); + } + }); + }); + }); + }); + const staticPlugins = cordovaPlugins.filter(p => (0, cordova_1.needsStaticPod)(p, config)); + const noStaticPlugins = cordovaPlugins.filter(el => !staticPlugins.includes(el)); + if (noStaticPlugins.length > 0) { + pods.push(` pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins'\n`); + } + if (staticPlugins.length > 0) { + pods.push(` pod 'CordovaPluginsStatic', :path => '../capacitor-cordova-ios-plugins'\n`); + } + const resourcesPlugins = cordovaPlugins.filter(filterResources); + if (resourcesPlugins.length > 0) { + pods.push(` pod 'CordovaPluginsResources', :path => '../capacitor-cordova-ios-plugins'\n`); + } + return ` + pod 'Capacitor', :path => '${relativeCapacitoriOSPath}' + pod 'CapacitorCordova', :path => '${relativeCapacitoriOSPath}' +${pods.join('').trimRight()}`; +} +function getFrameworkName(framework) { + if (isFramework(framework)) { + if (framework.$.custom && framework.$.custom === 'true') { + return framework.$.src; + } + return framework.$.src.substr(0, framework.$.src.indexOf('.')); + } + return framework.$.src + .substr(0, framework.$.src.indexOf('.')) + .replace('lib', ''); +} +function isFramework(framework) { + return framework.$.src.split('.').pop().includes('framework'); +} +async function generateCordovaPodspecs(cordovaPlugins, config) { + const staticPlugins = cordovaPlugins.filter(p => (0, cordova_1.needsStaticPod)(p, config)); + const noStaticPlugins = cordovaPlugins.filter(el => !staticPlugins.includes(el)); + generateCordovaPodspec(noStaticPlugins, config, false); + generateCordovaPodspec(staticPlugins, config, true); +} +async function generateCordovaPodspec(cordovaPlugins, config, isStatic) { + const weakFrameworks = []; + const linkedFrameworks = []; + const customFrameworks = []; + const systemLibraries = []; + const sourceFrameworks = []; + const frameworkDeps = []; + const compilerFlags = []; + let prefsArray = []; + let name = 'CordovaPlugins'; + let sourcesFolderName = 'sources'; + if (isStatic) { + name += 'Static'; + frameworkDeps.push('s.static_framework = true'); + sourcesFolderName += 'static'; + } + cordovaPlugins.map((plugin) => { + const frameworks = (0, plugin_1.getPlatformElement)(plugin, platform, 'framework'); + frameworks.map((framework) => { + if (!framework.$.type) { + const name = getFrameworkName(framework); + if (isFramework(framework)) { + if (framework.$.weak && framework.$.weak === 'true') { + if (!weakFrameworks.includes(name)) { + weakFrameworks.push(name); + } + } + else if (framework.$.custom && framework.$.custom === 'true') { + const frameworktPath = (0, path_1.join)(sourcesFolderName, plugin.name, name); + if (!customFrameworks.includes(frameworktPath)) { + customFrameworks.push(frameworktPath); + } + } + else { + if (!linkedFrameworks.includes(name)) { + linkedFrameworks.push(name); + } + } + } + else { + if (!systemLibraries.includes(name)) { + systemLibraries.push(name); + } + } + } + else if (framework.$.type && framework.$.type === 'podspec') { + let depString = `s.dependency '${framework.$.src}'`; + if (framework.$.spec && framework.$.spec !== '') { + depString += `, '${framework.$.spec}'`; + } + if (!frameworkDeps.includes(depString)) { + frameworkDeps.push(depString); + } + } + }); + prefsArray = prefsArray.concat((0, plugin_1.getAllElements)(plugin, platform, 'preference')); + const podspecs = (0, plugin_1.getPlatformElement)(plugin, platform, 'podspec'); + podspecs.map((podspec) => { + podspec.pods.map((pods) => { + pods.pod.map((pod) => { + let depString = `s.dependency '${pod.$.name}'`; + if (pod.$.spec && pod.$.spec !== '') { + depString += `, '${pod.$.spec}'`; + } + if (!frameworkDeps.includes(depString)) { + frameworkDeps.push(depString); + } + }); + }); + }); + const sourceFiles = (0, plugin_1.getPlatformElement)(plugin, platform, 'source-file'); + sourceFiles.map((sourceFile) => { + if (sourceFile.$.framework && sourceFile.$.framework === 'true') { + let fileName = sourceFile.$.src.split('/').pop(); + if (!fileName.startsWith('lib')) { + fileName = 'lib' + fileName; + } + const frameworktPath = (0, path_1.join)(sourcesFolderName, plugin.name, fileName); + if (!sourceFrameworks.includes(frameworktPath)) { + sourceFrameworks.push(frameworktPath); + } + } + else if (sourceFile.$['compiler-flags']) { + const cFlag = sourceFile.$['compiler-flags']; + if (!compilerFlags.includes(cFlag)) { + compilerFlags.push(cFlag); + } + } + }); + }); + const onlySystemLibraries = systemLibraries.filter(library => removeNoSystem(library, sourceFrameworks)); + if (weakFrameworks.length > 0) { + frameworkDeps.push(`s.weak_frameworks = '${weakFrameworks.join(`', '`)}'`); + } + if (linkedFrameworks.length > 0) { + frameworkDeps.push(`s.frameworks = '${linkedFrameworks.join(`', '`)}'`); + } + if (onlySystemLibraries.length > 0) { + frameworkDeps.push(`s.libraries = '${onlySystemLibraries.join(`', '`)}'`); + } + if (customFrameworks.length > 0) { + frameworkDeps.push(`s.vendored_frameworks = '${customFrameworks.join(`', '`)}'`); + frameworkDeps.push(`s.exclude_files = 'sources/**/*.framework/Headers/*.h', 'sources/**/*.framework/PrivateHeaders/*.h'`); + } + if (sourceFrameworks.length > 0) { + frameworkDeps.push(`s.vendored_libraries = '${sourceFrameworks.join(`', '`)}'`); + } + if (compilerFlags.length > 0) { + frameworkDeps.push(`s.compiler_flags = '${compilerFlags.join(' ')}'`); + } + const arcPlugins = cordovaPlugins.filter(filterARCFiles); + if (arcPlugins.length > 0) { + frameworkDeps.push(`s.subspec 'noarc' do |sna| + sna.requires_arc = false + sna.source_files = 'noarc/**/*.{swift,h,m,c,cc,mm,cpp}' + end`); + } + let frameworksString = frameworkDeps.join('\n '); + frameworksString = await replaceFrameworkVariables(config, prefsArray, frameworksString); + const content = ` + Pod::Spec.new do |s| + s.name = '${name}' + s.version = '${config.cli.package.version}' + s.summary = 'Autogenerated spec' + s.license = 'Unknown' + s.homepage = 'https://example.com' + s.authors = { 'Capacitor Generator' => 'hi@example.com' } + s.source = { :git => 'https://github.com/ionic-team/does-not-exist.git', :tag => '${config.cli.package.version}' } + s.source_files = '${sourcesFolderName}/**/*.{swift,h,m,c,cc,mm,cpp}' + s.ios.deployment_target = '${config.ios.minVersion}' + s.xcconfig = {'GCC_PREPROCESSOR_DEFINITIONS' => '$(inherited) COCOAPODS=1 WK_WEB_VIEW_ONLY=1' } + s.dependency 'CapacitorCordova'${getLinkerFlags(config)} + s.swift_version = '5.1' + ${frameworksString} + end`; + await (0, utils_fs_1.writeFile)((0, path_1.join)(config.ios.cordovaPluginsDirAbs, `${name}.podspec`), content); +} +function getLinkerFlags(config) { + var _a; + if ((_a = config.app.extConfig.ios) === null || _a === void 0 ? void 0 : _a.cordovaLinkerFlags) { + return `\n s.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '${config.app.extConfig.ios.cordovaLinkerFlags.join(' ')}' }`; + } + return ''; +} +async function copyPluginsNativeFiles(config, cordovaPlugins) { + for (const p of cordovaPlugins) { + const sourceFiles = (0, plugin_1.getPlatformElement)(p, platform, 'source-file'); + const headerFiles = (0, plugin_1.getPlatformElement)(p, platform, 'header-file'); + const codeFiles = sourceFiles.concat(headerFiles); + const frameworks = (0, plugin_1.getPlatformElement)(p, platform, 'framework'); + let sourcesFolderName = 'sources'; + if ((0, cordova_1.needsStaticPod)(p, config)) { + sourcesFolderName += 'static'; + } + const sourcesFolder = (0, path_1.join)(config.ios.cordovaPluginsDirAbs, sourcesFolderName, p.name); + for (const codeFile of codeFiles) { + let fileName = codeFile.$.src.split('/').pop(); + const fileExt = codeFile.$.src.split('.').pop(); + if (fileExt === 'a' && !fileName.startsWith('lib')) { + fileName = 'lib' + fileName; + } + let destFolder = sourcesFolderName; + if (codeFile.$['compiler-flags'] && + codeFile.$['compiler-flags'] === '-fno-objc-arc') { + destFolder = 'noarc'; + } + const filePath = (0, plugin_1.getFilePath)(config, p, codeFile.$.src); + const fileDest = (0, path_1.join)(config.ios.cordovaPluginsDirAbs, destFolder, p.name, fileName); + await (0, utils_fs_1.copy)(filePath, fileDest); + if (!codeFile.$.framework) { + let fileContent = await (0, utils_fs_1.readFile)(fileDest, { encoding: 'utf-8' }); + if (fileExt === 'swift') { + fileContent = 'import Cordova\n' + fileContent; + await (0, utils_fs_1.writeFile)(fileDest, fileContent, { encoding: 'utf-8' }); + } + else { + if (fileContent.includes('@import Firebase;')) { + fileContent = fileContent.replace('@import Firebase;', '#import '); + await (0, utils_fs_1.writeFile)(fileDest, fileContent, { encoding: 'utf-8' }); + } + if (fileContent.includes('[NSBundle bundleForClass:[self class]]') || + fileContent.includes('[NSBundle bundleForClass:[CDVCapture class]]')) { + fileContent = fileContent.replace('[NSBundle bundleForClass:[self class]]', '[NSBundle mainBundle]'); + fileContent = fileContent.replace('[NSBundle bundleForClass:[CDVCapture class]]', '[NSBundle mainBundle]'); + await (0, utils_fs_1.writeFile)(fileDest, fileContent, { encoding: 'utf-8' }); + } + if (fileContent.includes('[self.webView superview]') || + fileContent.includes('self.webView.superview')) { + fileContent = fileContent.replace(/\[self.webView superview\]/g, 'self.viewController.view'); + fileContent = fileContent.replace(/self.webView.superview/g, 'self.viewController.view'); + await (0, utils_fs_1.writeFile)(fileDest, fileContent, { encoding: 'utf-8' }); + } + } + } + } + const resourceFiles = (0, plugin_1.getPlatformElement)(p, platform, 'resource-file'); + for (const resourceFile of resourceFiles) { + const fileName = resourceFile.$.src.split('/').pop(); + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, resourceFile.$.src), (0, path_1.join)(config.ios.cordovaPluginsDirAbs, 'resources', fileName)); + } + for (const framework of frameworks) { + if (framework.$.custom && framework.$.custom === 'true') { + await (0, utils_fs_1.copy)((0, plugin_1.getFilePath)(config, p, framework.$.src), (0, path_1.join)(sourcesFolder, framework.$.src)); + } + } + } +} +async function removePluginsNativeFiles(config) { + await (0, utils_fs_1.remove)(config.ios.cordovaPluginsDirAbs); + await (0, template_1.extractTemplate)(config.cli.assets.ios.cordovaPluginsTemplateArchiveAbs, config.ios.cordovaPluginsDirAbs); +} +function filterResources(plugin) { + const resources = (0, plugin_1.getPlatformElement)(plugin, platform, 'resource-file'); + return resources.length > 0; +} +function filterARCFiles(plugin) { + const sources = (0, plugin_1.getPlatformElement)(plugin, platform, 'source-file'); + const sourcesARC = sources.filter((sourceFile) => sourceFile.$['compiler-flags'] && + sourceFile.$['compiler-flags'] === '-fno-objc-arc'); + return sourcesARC.length > 0; +} +function removeNoSystem(library, sourceFrameworks) { + const libraries = sourceFrameworks.filter(framework => framework.includes(library)); + return libraries.length === 0; +} +async function getPluginsTask(config) { + return await (0, common_1.runTask)('Updating iOS plugins', async () => { + const allPlugins = await (0, plugin_1.getPlugins)(config, 'ios'); + const iosPlugins = await (0, common_2.getIOSPlugins)(allPlugins); + return iosPlugins; + }); +} +async function replaceFrameworkVariables(config, prefsArray, frameworkString) { + prefsArray.map((preference) => { + frameworkString = frameworkString.replace(new RegExp(('$' + preference.$.name).replace('$', '\\$&'), 'g'), preference.$.default); + }); + return frameworkString; +} diff --git a/@capacitor/cli/dist/ipc.js b/@capacitor/cli/dist/ipc.js new file mode 100644 index 00000000..c4d30ed5 --- /dev/null +++ b/@capacitor/cli/dist/ipc.js @@ -0,0 +1,61 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.receive = exports.send = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const utils_subprocess_1 = require("@ionic/utils-subprocess"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const https_1 = require("https"); +const path_1 = require("path"); +const cli_1 = require("./util/cli"); +const debug = (0, debug_1.default)('capacitor:ipc'); +/** + * Send an IPC message to a forked process. + */ +async function send(msg) { + const dir = cli_1.ENV_PATHS.log; + await (0, utils_fs_1.mkdirp)(dir); + const logPath = (0, path_1.resolve)(dir, 'ipc.log'); + debug('Sending %O IPC message to forked process (logs: %O)', msg.type, logPath); + const fd = await (0, utils_fs_1.open)(logPath, 'a'); + const p = (0, utils_subprocess_1.fork)(process.argv[1], ['📡'], { stdio: ['ignore', fd, fd, 'ipc'] }); + p.send(msg); + p.disconnect(); + p.unref(); +} +exports.send = send; +/** + * Receive and handle an IPC message. + * + * Assume minimal context and keep external dependencies to a minimum. + */ +async function receive(msg) { + debug('Received %O IPC message', msg.type); + if (msg.type === 'telemetry') { + const now = new Date().toISOString(); + const { data } = msg; + // This request is only made if telemetry is on. + const req = (0, https_1.request)({ + hostname: 'api.ionicjs.com', + port: 443, + path: '/events/metrics', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }, response => { + debug('Sent %O metric to events service (status: %O)', data.name, response.statusCode); + if (response.statusCode !== 204) { + response.on('data', chunk => { + debug('Bad response from events service. Request body: %O', chunk.toString()); + }); + } + }); + const body = { + metrics: [data], + sent_at: now, + }; + req.end(JSON.stringify(body)); + } +} +exports.receive = receive; diff --git a/@capacitor/cli/dist/log.js b/@capacitor/cli/dist/log.js new file mode 100644 index 00000000..f7de2473 --- /dev/null +++ b/@capacitor/cli/dist/log.js @@ -0,0 +1,41 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.logSuccess = exports.logPrompt = exports.logger = exports.output = void 0; +const tslib_1 = require("tslib"); +const cli_framework_output_1 = require("@ionic/cli-framework-output"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const term_1 = require("./util/term"); +const options = { + colors: colors_1.default, + stream: process.argv.includes('--json') ? process.stderr : process.stdout, +}; +exports.output = (0, term_1.isInteractive)() + ? new cli_framework_output_1.TTYOutputStrategy(options) + : new cli_framework_output_1.StreamOutputStrategy(options); +exports.logger = (0, cli_framework_output_1.createDefaultLogger)({ + output: exports.output, + formatterOptions: { + titleize: false, + tags: new Map([ + [cli_framework_output_1.LOGGER_LEVELS.DEBUG, colors_1.default.log.DEBUG('[debug]')], + [cli_framework_output_1.LOGGER_LEVELS.INFO, colors_1.default.log.INFO('[info]')], + [cli_framework_output_1.LOGGER_LEVELS.WARN, colors_1.default.log.WARN('[warn]')], + [cli_framework_output_1.LOGGER_LEVELS.ERROR, colors_1.default.log.ERROR('[error]')], + ]), + }, +}); +async function logPrompt(msg, promptObject) { + const { wordWrap } = await Promise.resolve().then(() => tslib_1.__importStar(require('@ionic/cli-framework-output'))); + const { prompt } = await Promise.resolve().then(() => tslib_1.__importStar(require('prompts'))); + exports.logger.log({ + msg: `${colors_1.default.input('[?]')} ${wordWrap(msg, { indentation: 4 })}`, + logger: exports.logger, + format: false, + }); + return prompt(promptObject, { onCancel: () => process.exit(1) }); +} +exports.logPrompt = logPrompt; +function logSuccess(msg) { + exports.logger.msg(`${colors_1.default.success('[success]')} ${msg}`); +} +exports.logSuccess = logSuccess; diff --git a/@capacitor/cli/dist/plugin.js b/@capacitor/cli/dist/plugin.js new file mode 100644 index 00000000..c7a1cd78 --- /dev/null +++ b/@capacitor/cli/dist/plugin.js @@ -0,0 +1,186 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getAllElements = exports.getFilePath = exports.getAssets = exports.getJSModules = exports.getPluginType = exports.getPlatformElement = exports.getPluginPlatform = exports.printPlugins = exports.fixName = exports.getDependencies = exports.resolvePlugin = exports.getPlugins = exports.getIncludedPluginPackages = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const errors_1 = require("./errors"); +const log_1 = require("./log"); +const node_1 = require("./util/node"); +const xml_1 = require("./util/xml"); +function getIncludedPluginPackages(config, platform) { + var _a, _b, _c, _d; + const { extConfig } = config.app; + switch (platform) { + case 'android': + return (_b = (_a = extConfig.android) === null || _a === void 0 ? void 0 : _a.includePlugins) !== null && _b !== void 0 ? _b : extConfig.includePlugins; + case 'ios': + return (_d = (_c = extConfig.ios) === null || _c === void 0 ? void 0 : _c.includePlugins) !== null && _d !== void 0 ? _d : extConfig.includePlugins; + } +} +exports.getIncludedPluginPackages = getIncludedPluginPackages; +async function getPlugins(config, platform) { + var _a; + const possiblePlugins = (_a = getIncludedPluginPackages(config, platform)) !== null && _a !== void 0 ? _a : getDependencies(config); + const resolvedPlugins = await Promise.all(possiblePlugins.map(async (p) => resolvePlugin(config, p))); + return resolvedPlugins.filter((p) => !!p); +} +exports.getPlugins = getPlugins; +async function resolvePlugin(config, name) { + try { + const packagePath = (0, node_1.resolveNode)(config.app.rootDir, name, 'package.json'); + if (!packagePath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong(`node_modules/${name}`)}.\n` + + `Are you sure ${colors_1.default.strong(name)} is installed?`); + } + const rootPath = (0, path_1.dirname)(packagePath); + const meta = await (0, utils_fs_1.readJSON)(packagePath); + if (!meta) { + return null; + } + if (meta.capacitor) { + return { + id: name, + name: fixName(name), + version: meta.version, + rootPath, + repository: meta.repository, + manifest: meta.capacitor, + }; + } + const pluginXMLPath = (0, path_1.join)(rootPath, 'plugin.xml'); + const xmlMeta = await (0, xml_1.readXML)(pluginXMLPath); + return { + id: name, + name: fixName(name), + version: meta.version, + rootPath: rootPath, + repository: meta.repository, + xml: xmlMeta.plugin, + }; + } + catch (e) { + // ignore + } + return null; +} +exports.resolvePlugin = resolvePlugin; +function getDependencies(config) { + var _a, _b; + return [ + ...Object.keys((_a = config.app.package.dependencies) !== null && _a !== void 0 ? _a : {}), + ...Object.keys((_b = config.app.package.devDependencies) !== null && _b !== void 0 ? _b : {}), + ]; +} +exports.getDependencies = getDependencies; +function fixName(name) { + name = name + .replace(/\//g, '_') + .replace(/-/g, '_') + .replace(/@/g, '') + .replace(/_\w/g, m => m[1].toUpperCase()); + return name.charAt(0).toUpperCase() + name.slice(1); +} +exports.fixName = fixName; +function printPlugins(plugins, platform, type = 'capacitor') { + if (plugins.length === 0) { + return; + } + let msg; + const plural = plugins.length === 1 ? '' : 's'; + switch (type) { + case 'cordova': + msg = `Found ${plugins.length} Cordova plugin${plural} for ${colors_1.default.strong(platform)}:\n`; + break; + case 'incompatible': + msg = `Found ${plugins.length} incompatible Cordova plugin${plural} for ${colors_1.default.strong(platform)}, skipped install:\n`; + break; + case 'capacitor': + msg = `Found ${plugins.length} Capacitor plugin${plural} for ${colors_1.default.strong(platform)}:\n`; + break; + } + msg += plugins.map(p => `${p.id}${colors_1.default.weak(`@${p.version}`)}`).join('\n'); + log_1.logger.info(msg); +} +exports.printPlugins = printPlugins; +function getPluginPlatform(p, platform) { + const platforms = p.xml.platform; + if (platforms) { + const platforms = p.xml.platform.filter(function (item) { + return item.$.name === platform; + }); + return platforms[0]; + } + return []; +} +exports.getPluginPlatform = getPluginPlatform; +function getPlatformElement(p, platform, elementName) { + const platformTag = getPluginPlatform(p, platform); + if (platformTag) { + const element = platformTag[elementName]; + if (element) { + return element; + } + } + return []; +} +exports.getPlatformElement = getPlatformElement; +function getPluginType(p, platform) { + var _a, _b, _c, _d; + switch (platform) { + case 'ios': + return (_b = (_a = p.ios) === null || _a === void 0 ? void 0 : _a.type) !== null && _b !== void 0 ? _b : 0 /* PluginType.Core */; + case 'android': + return (_d = (_c = p.android) === null || _c === void 0 ? void 0 : _c.type) !== null && _d !== void 0 ? _d : 0 /* PluginType.Core */; + } + return 0 /* PluginType.Core */; +} +exports.getPluginType = getPluginType; +/** + * Get each JavaScript Module for the given plugin + */ +function getJSModules(p, platform) { + return getAllElements(p, platform, 'js-module'); +} +exports.getJSModules = getJSModules; +/** + * Get each asset tag for the given plugin + */ +function getAssets(p, platform) { + return getAllElements(p, platform, 'asset'); +} +exports.getAssets = getAssets; +function getFilePath(config, plugin, path) { + if (path.startsWith('node_modules')) { + let pathSegments = path.split('/').slice(1); + if (pathSegments[0].startsWith('@')) { + pathSegments = [ + pathSegments[0] + '/' + pathSegments[1], + ...pathSegments.slice(2), + ]; + } + const filePath = (0, node_1.resolveNode)(config.app.rootDir, ...pathSegments); + if (!filePath) { + throw new Error(`Can't resolve module ${pathSegments[0]}`); + } + return filePath; + } + return (0, path_1.join)(plugin.rootPath, path); +} +exports.getFilePath = getFilePath; +/** + * For a given plugin, return all the plugin.xml elements with elementName, checking root and specified platform + */ +function getAllElements(p, platform, elementName) { + let modules = []; + if (p.xml[elementName]) { + modules = modules.concat(p.xml[elementName]); + } + const platformModules = getPluginPlatform(p, platform); + if (platformModules === null || platformModules === void 0 ? void 0 : platformModules[elementName]) { + modules = modules.concat(platformModules[elementName]); + } + return modules; +} +exports.getAllElements = getAllElements; diff --git a/@capacitor/cli/dist/sysconfig.js b/@capacitor/cli/dist/sysconfig.js new file mode 100644 index 00000000..149eee54 --- /dev/null +++ b/@capacitor/cli/dist/sysconfig.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.writeConfig = exports.readConfig = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const path_1 = require("path"); +const cli_1 = require("./util/cli"); +const uuid_1 = require("./util/uuid"); +const debug = (0, debug_1.default)('capacitor:sysconfig'); +const SYSCONFIG_FILE = 'sysconfig.json'; +const SYSCONFIG_PATH = (0, path_1.resolve)(cli_1.ENV_PATHS.config, SYSCONFIG_FILE); +async function readConfig() { + debug('Reading from %O', SYSCONFIG_PATH); + try { + return await (0, utils_fs_1.readJSON)(SYSCONFIG_PATH); + } + catch (e) { + if (e.code !== 'ENOENT') { + throw e; + } + const sysconfig = { + machine: (0, uuid_1.uuidv4)(), + }; + await writeConfig(sysconfig); + return sysconfig; + } +} +exports.readConfig = readConfig; +async function writeConfig(sysconfig) { + debug('Writing to %O', SYSCONFIG_PATH); + await (0, utils_fs_1.mkdirp)((0, path_1.dirname)(SYSCONFIG_PATH)); + await (0, utils_fs_1.writeJSON)(SYSCONFIG_PATH, sysconfig, { spaces: '\t' }); +} +exports.writeConfig = writeConfig; diff --git a/@capacitor/cli/dist/tasks/add.js b/@capacitor/cli/dist/tasks/add.js new file mode 100644 index 00000000..2bb6a805 --- /dev/null +++ b/@capacitor/cli/dist/tasks/add.js @@ -0,0 +1,122 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.addCommand = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const add_1 = require("../android/add"); +const common_1 = require("../android/common"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_2 = require("../common"); +const errors_1 = require("../errors"); +const add_2 = require("../ios/add"); +const common_3 = require("../ios/common"); +const log_1 = require("../log"); +const sync_1 = require("./sync"); +async function addCommand(config, selectedPlatformName) { + var _a; + if (selectedPlatformName && !(await (0, common_2.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_2.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_2.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:add'); + } + else { + let msg = `Platform ${colors_1.default.input(selectedPlatformName)} not found.`; + if (await (0, common_2.isValidCommunityPlatform)(selectedPlatformName)) { + msg += `\nTry installing ${colors_1.default.strong(`@capacitor-community/${selectedPlatformName}`)} and adding the platform again.`; + } + if (await (0, common_2.isValidEnterprisePlatform)(selectedPlatformName)) { + msg += + `\nThis is an enterprise platform and @ionic-enterprise/capacitor-${selectedPlatformName} is not installed.\n` + + `To learn how to use this platform, visit https://ionic.io/docs/${selectedPlatformName}`; + } + log_1.logger.error(msg); + } + } + else { + const knownPlatforms = await (0, common_2.getKnownPlatforms)(); + const platformName = await (0, common_2.promptForPlatform)(knownPlatforms, `Please choose a platform to add:`, selectedPlatformName); + if (platformName === config.web.name) { + webWarning(); + return; + } + const existingPlatformDir = await (0, common_2.getProjectPlatformDirectory)(config, platformName); + if (existingPlatformDir) { + (0, errors_1.fatal)(`${colors_1.default.input(platformName)} platform already exists.\n` + + `To re-add this platform, first remove ${colors_1.default.strong((0, utils_terminal_1.prettyPath)(existingPlatformDir))}, then run this command again.\n` + + `${colors_1.default.strong('WARNING')}: Your native project will be completely removed.`); + } + try { + await (0, common_2.check)([ + () => (0, common_2.checkPackage)(), + () => (0, common_2.checkAppConfig)(config), + ...addChecks(config, platformName), + ]); + await doAdd(config, platformName); + await editPlatforms(config, platformName); + if (await (0, utils_fs_1.pathExists)(config.app.webDirAbs)) { + await (0, sync_1.sync)(config, platformName, false, false); + if (platformName === config.android.name) { + await (0, common_2.runTask)('Syncing Gradle', async () => { + return (0, add_1.createLocalProperties)(config.android.platformDirAbs); + }); + } + } + else { + log_1.logger.warn(`${colors_1.default.success(colors_1.default.strong('sync'))} could not run--missing ${colors_1.default.strong(config.app.webDir)} directory.`); + } + printNextSteps(platformName); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } + } +} +exports.addCommand = addCommand; +function printNextSteps(platformName) { + (0, log_1.logSuccess)(`${colors_1.default.strong(platformName)} platform added!`); + log_1.output.write(`Follow the Developer Workflow guide to get building:\n${colors_1.default.strong(`https://capacitorjs.com/docs/basics/workflow`)}\n`); +} +function addChecks(config, platformName) { + if (platformName === config.ios.name) { + return [ + () => (0, common_3.checkIOSPackage)(config), + () => (0, common_3.checkBundler)(config) || (0, common_3.checkCocoaPods)(config), + ]; + } + else if (platformName === config.android.name) { + return [() => (0, common_1.checkAndroidPackage)(config)]; + } + else if (platformName === config.web.name) { + return []; + } + else { + throw `Platform ${platformName} is not valid.`; + } +} +async function doAdd(config, platformName) { + await (0, common_2.runTask)(colors_1.default.success(colors_1.default.strong('add')), async () => { + if (platformName === config.ios.name) { + await (0, add_2.addIOS)(config); + } + else if (platformName === config.android.name) { + await (0, add_1.addAndroid)(config); + } + }); +} +async function editPlatforms(config, platformName) { + if (platformName === config.ios.name) { + await (0, common_3.editProjectSettingsIOS)(config); + } + else if (platformName === config.android.name) { + await (0, common_1.editProjectSettingsAndroid)(config); + } +} +function webWarning() { + log_1.logger.error(`Not adding platform ${colors_1.default.strong('web')}.\n` + + `In Capacitor, the web platform is just your web app! For example, if you have a React or Angular project, the web platform is that project.\n` + + `To add Capacitor functionality to your web app, follow the Web Getting Started Guide: ${colors_1.default.strong('https://capacitorjs.com/docs/web')}`); +} diff --git a/@capacitor/cli/dist/tasks/build.js b/@capacitor/cli/dist/tasks/build.js new file mode 100644 index 00000000..e7bfb413 --- /dev/null +++ b/@capacitor/cli/dist/tasks/build.js @@ -0,0 +1,62 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.build = exports.buildCommand = void 0; +const build_1 = require("../android/build"); +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const build_2 = require("../ios/build"); +async function buildCommand(config, selectedPlatformName, buildOptions) { + var _a; + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + let platformName; + if (platforms.length === 1) { + platformName = platforms[0]; + } + else { + platformName = await (0, common_1.promptForPlatform)(platforms.filter(createBuildablePlatformFilter(config)), `Please choose a platform to build for:`); + } + const buildCommandOptions = { + scheme: buildOptions.scheme || config.ios.scheme, + flavor: buildOptions.flavor || config.android.flavor, + keystorepath: buildOptions.keystorepath || config.android.buildOptions.keystorePath, + keystorepass: buildOptions.keystorepass || config.android.buildOptions.keystorePassword, + keystorealias: buildOptions.keystorealias || config.android.buildOptions.keystoreAlias, + keystorealiaspass: buildOptions.keystorealiaspass || + config.android.buildOptions.keystoreAliasPassword, + androidreleasetype: buildOptions.androidreleasetype || + config.android.buildOptions.releaseType || + 'AAB', + signingtype: buildOptions.signingtype || + config.android.buildOptions.signingType || + 'jarsigner', + configuration: buildOptions.configuration || 'Release', + }; + try { + await build(config, platformName, buildCommandOptions); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } +} +exports.buildCommand = buildCommand; +async function build(config, platformName, buildOptions) { + if (platformName == config.ios.name) { + await (0, build_2.buildiOS)(config, buildOptions); + } + else if (platformName === config.android.name) { + await (0, build_1.buildAndroid)(config, buildOptions); + } + else if (platformName === config.web.name) { + throw `Platform "${platformName}" is not available in the build command.`; + } + else { + throw `Platform "${platformName}" is not valid.`; + } +} +exports.build = build; +function createBuildablePlatformFilter(config) { + return platform => platform === config.ios.name || platform === config.android.name; +} diff --git a/@capacitor/cli/dist/tasks/config.js b/@capacitor/cli/dist/tasks/config.js new file mode 100644 index 00000000..6e9ac0ac --- /dev/null +++ b/@capacitor/cli/dist/tasks/config.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.configCommand = void 0; +const tslib_1 = require("tslib"); +const util_1 = tslib_1.__importDefault(require("util")); +const log_1 = require("../log"); +async function configCommand(config, json) { + const evaluatedConfig = await deepAwait(config); + if (json) { + process.stdout.write(`${JSON.stringify(evaluatedConfig)}\n`); + } + else { + log_1.output.write(`${util_1.default.inspect(evaluatedConfig, { depth: Infinity, colors: true })}\n`); + } +} +exports.configCommand = configCommand; +async function deepAwait(obj) { + if (obj && + !Array.isArray(obj) && + typeof obj === 'object' && + obj.constructor === Object) { + const o = {}; + for (const [k, v] of Object.entries(obj)) { + o[k] = await deepAwait(v); + } + return o; + } + else { + return await obj; + } +} diff --git a/@capacitor/cli/dist/tasks/copy.js b/@capacitor/cli/dist/tasks/copy.js new file mode 100644 index 00000000..4f6e48b9 --- /dev/null +++ b/@capacitor/cli/dist/tasks/copy.js @@ -0,0 +1,216 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.copy = exports.copyCommand = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const common_2 = require("../ios/common"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const iosplugin_1 = require("../util/iosplugin"); +const promise_1 = require("../util/promise"); +const copy_1 = require("../web/copy"); +const sourcemaps_1 = require("./sourcemaps"); +async function copyCommand(config, selectedPlatformName, inline = false) { + var _a; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_1.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_1.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:copy'); + } + else { + log_1.logger.error(`Platform ${colors_1.default.input(selectedPlatformName)} not found.`); + } + } + else { + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + try { + await (0, promise_1.allSerial)(platforms.map(platformName => () => copy(config, platformName, inline))); + } + catch (e) { + if ((0, errors_1.isFatal)(e)) { + throw e; + } + log_1.logger.error((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + } +} +exports.copyCommand = copyCommand; +async function copy(config, platformName, inline = false) { + await (0, common_1.runTask)(colors_1.default.success(colors_1.default.strong(`copy ${platformName}`)), async () => { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v; + const result = await (0, common_1.checkWebDir)(config); + if (result) { + throw result; + } + await (0, common_1.runHooks)(config, platformName, config.app.rootDir, 'capacitor:copy:before'); + const allPlugins = await (0, plugin_1.getPlugins)(config, platformName); + let usesFederatedCapacitor = false; + if (allPlugins.filter(plugin => plugin.id === '@ionic-enterprise/federated-capacitor').length > 0) { + usesFederatedCapacitor = true; + } + let usesLiveUpdates = false; + if (allPlugins.filter(plugin => plugin.id === '@capacitor/live-updates') + .length > 0) { + usesLiveUpdates = true; + } + let usesSSLPinning = false; + if (allPlugins.filter(plugin => plugin.id === '@ionic-enterprise/ssl-pinning') + .length > 0) { + usesSSLPinning = true; + } + if (platformName === config.ios.name) { + if (usesFederatedCapacitor) { + await copyFederatedWebDirs(config, await config.ios.webDirAbs); + if ((_c = (_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.plugins) === null || _b === void 0 ? void 0 : _b.FederatedCapacitor) === null || _c === void 0 ? void 0 : _c.liveUpdatesKey) { + await copySecureLiveUpdatesKey(config.app.extConfig.plugins.FederatedCapacitor.liveUpdatesKey, config.app.rootDir, config.ios.nativeTargetDirAbs); + } + } + else { + await copyWebDir(config, await config.ios.webDirAbs, config.app.webDirAbs); + } + if (usesLiveUpdates && ((_f = (_e = (_d = config.app.extConfig) === null || _d === void 0 ? void 0 : _d.plugins) === null || _e === void 0 ? void 0 : _e.LiveUpdates) === null || _f === void 0 ? void 0 : _f.key)) { + await copySecureLiveUpdatesKey(config.app.extConfig.plugins.LiveUpdates.key, config.app.rootDir, config.ios.nativeTargetDirAbs); + } + if (usesSSLPinning && ((_j = (_h = (_g = config.app.extConfig) === null || _g === void 0 ? void 0 : _g.plugins) === null || _h === void 0 ? void 0 : _h.SSLPinning) === null || _j === void 0 ? void 0 : _j.certs)) { + await copySSLCert((_k = config.app.extConfig.plugins.SSLPinning) === null || _k === void 0 ? void 0 : _k.certs, config.app.rootDir, await config.ios.webDirAbs); + } + await copyCapacitorConfig(config, config.ios.nativeTargetDirAbs); + const cordovaPlugins = await (0, cordova_1.getCordovaPlugins)(config, platformName); + await (0, cordova_1.handleCordovaPluginsJS)(cordovaPlugins, config, platformName); + const iosPlugins = await (0, common_2.getIOSPlugins)(allPlugins); + await (0, iosplugin_1.generateIOSPackageJSON)(config, iosPlugins); + } + else if (platformName === config.android.name) { + if (usesFederatedCapacitor) { + await copyFederatedWebDirs(config, config.android.webDirAbs); + if ((_o = (_m = (_l = config.app.extConfig) === null || _l === void 0 ? void 0 : _l.plugins) === null || _m === void 0 ? void 0 : _m.FederatedCapacitor) === null || _o === void 0 ? void 0 : _o.liveUpdatesKey) { + await copySecureLiveUpdatesKey(config.app.extConfig.plugins.FederatedCapacitor.liveUpdatesKey, config.app.rootDir, config.android.assetsDirAbs); + } + } + else { + await copyWebDir(config, config.android.webDirAbs, config.app.webDirAbs); + } + if (usesLiveUpdates && ((_r = (_q = (_p = config.app.extConfig) === null || _p === void 0 ? void 0 : _p.plugins) === null || _q === void 0 ? void 0 : _q.LiveUpdates) === null || _r === void 0 ? void 0 : _r.key)) { + await copySecureLiveUpdatesKey(config.app.extConfig.plugins.LiveUpdates.key, config.app.rootDir, config.android.assetsDirAbs); + } + if (usesSSLPinning && ((_u = (_t = (_s = config.app.extConfig) === null || _s === void 0 ? void 0 : _s.plugins) === null || _t === void 0 ? void 0 : _t.SSLPinning) === null || _u === void 0 ? void 0 : _u.certs)) { + await copySSLCert((_v = config.app.extConfig.plugins.SSLPinning) === null || _v === void 0 ? void 0 : _v.certs, config.app.rootDir, config.android.assetsDirAbs); + } + await copyCapacitorConfig(config, config.android.assetsDirAbs); + const cordovaPlugins = await (0, cordova_1.getCordovaPlugins)(config, platformName); + await (0, cordova_1.handleCordovaPluginsJS)(cordovaPlugins, config, platformName); + await (0, cordova_1.writeCordovaAndroidManifest)(cordovaPlugins, config, platformName); + } + else if (platformName === config.web.name) { + if (usesFederatedCapacitor) { + log_1.logger.info('FederatedCapacitor Plugin installed, skipping web bundling...'); + } + else { + await (0, copy_1.copyWeb)(config); + } + } + else { + throw `Platform ${platformName} is not valid.`; + } + if (inline) { + await (0, sourcemaps_1.inlineSourceMaps)(config, platformName); + } + }); + await (0, common_1.runHooks)(config, platformName, config.app.rootDir, 'capacitor:copy:after'); +} +exports.copy = copy; +async function copyCapacitorConfig(config, nativeAbsDir) { + const nativeRelDir = (0, path_1.relative)(config.app.rootDir, nativeAbsDir); + const nativeConfigFile = 'capacitor.config.json'; + const nativeConfigFilePath = (0, path_1.join)(nativeAbsDir, nativeConfigFile); + await (0, common_1.runTask)(`Creating ${colors_1.default.strong(nativeConfigFile)} in ${nativeRelDir}`, async () => { + var _a; + (_a = config.app.extConfig.android) === null || _a === void 0 ? true : delete _a.buildOptions; + await (0, utils_fs_1.writeJSON)(nativeConfigFilePath, config.app.extConfig, { + spaces: '\t', + }); + }); +} +async function copyWebDir(config, nativeAbsDir, webAbsDir) { + var _a; + const webRelDir = (0, path_1.basename)(webAbsDir); + const nativeRelDir = (0, path_1.relative)(config.app.rootDir, nativeAbsDir); + if (((_a = config.app.extConfig.server) === null || _a === void 0 ? void 0 : _a.url) && !(await (0, utils_fs_1.pathExists)(webAbsDir))) { + log_1.logger.warn(`Cannot copy web assets from ${colors_1.default.strong(webRelDir)} to ${nativeRelDir}\n` + + `Web asset directory specified by ${colors_1.default.input('webDir')} does not exist. This is not an error because ${colors_1.default.input('server.url')} is set in config.`); + return; + } + await (0, common_1.runTask)(`Copying web assets from ${colors_1.default.strong(webRelDir)} to ${nativeRelDir}`, async () => { + await (0, utils_fs_1.remove)(nativeAbsDir); + return (0, utils_fs_1.copy)(webAbsDir, nativeAbsDir); + }); +} +async function copyFederatedWebDirs(config, nativeAbsDir) { + var _a, _b; + log_1.logger.info('FederatedCapacitor Plugin Loaded - Copying Web Assets'); + if (!((_b = (_a = config.app.extConfig) === null || _a === void 0 ? void 0 : _a.plugins) === null || _b === void 0 ? void 0 : _b.FederatedCapacitor)) { + throw `FederatedCapacitor plugin is present but no valid config is defined.`; + } + const federatedConfig = config.app.extConfig.plugins.FederatedCapacitor; + if (federatedConfig) { + if (federatedConfig.shell.name === undefined) { + throw `FederatedCapacitor plugin is present but no valid Shell application is defined in the config.`; + } + if (!federatedConfig.apps.every(isFederatedApp)) { + throw `FederatedCapacitor plugin is present but there is a problem with the apps defined in the config.`; + } + const copyApps = () => { + return federatedConfig.apps.map(app => { + const appDir = (0, path_1.resolve)(config.app.rootDir, app.webDir); + return copyWebDir(config, (0, path_1.resolve)(nativeAbsDir, app.name), appDir); + }); + }; + const copyShell = () => { + return copyWebDir(config, (0, path_1.resolve)(nativeAbsDir, federatedConfig.shell.name), config.app.webDirAbs); + }; + await Promise.all([...copyApps(), copyShell()]); + } +} +function isFederatedApp(config) { + return (config.webDir !== undefined && + config.name !== undefined); +} +async function copySecureLiveUpdatesKey(secureLiveUpdatesKeyFile, rootDir, nativeAbsDir) { + const keyAbsFromPath = (0, path_1.join)(rootDir, secureLiveUpdatesKeyFile); + const keyAbsToPath = (0, path_1.join)(nativeAbsDir, (0, path_1.basename)(keyAbsFromPath)); + const keyRelToDir = (0, path_1.relative)(rootDir, nativeAbsDir); + if (!(await (0, utils_fs_1.pathExists)(keyAbsFromPath))) { + log_1.logger.warn(`Cannot copy Secure Live Updates signature file from ${colors_1.default.strong(keyAbsFromPath)} to ${keyRelToDir}\n` + + `Signature file does not exist at specified key path.`); + return; + } + await (0, common_1.runTask)(`Copying Secure Live Updates key from ${colors_1.default.strong(secureLiveUpdatesKeyFile)} to ${keyRelToDir}`, async () => { + return (0, utils_fs_1.copy)(keyAbsFromPath, keyAbsToPath); + }); +} +async function copySSLCert(sslCertPaths, rootDir, targetDir) { + const validCertPaths = []; + for (const sslCertPath of sslCertPaths) { + const certAbsFromPath = (0, path_1.join)(rootDir, sslCertPath); + if (!(await (0, utils_fs_1.pathExists)(certAbsFromPath))) { + log_1.logger.warn(`Cannot copy SSL Certificate file from ${colors_1.default.strong(certAbsFromPath)}\n` + + `SSL Certificate does not exist at specified path.`); + return; + } + validCertPaths.push(certAbsFromPath); + } + const certsDirAbsToPath = (0, path_1.join)(targetDir, 'certs'); + const certsDirRelToDir = (0, path_1.relative)(rootDir, targetDir); + await (0, common_1.runTask)(`Copying SSL Certificates from to ${certsDirRelToDir}`, async () => { + const promises = []; + for (const certPath of validCertPaths) { + promises.push((0, utils_fs_1.copy)(certPath, (0, path_1.join)(certsDirAbsToPath, (0, path_1.basename)(certPath)))); + } + return Promise.all(promises); + }); +} diff --git a/@capacitor/cli/dist/tasks/create.js b/@capacitor/cli/dist/tasks/create.js new file mode 100644 index 00000000..3b92c8b7 --- /dev/null +++ b/@capacitor/cli/dist/tasks/create.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createCommand = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +async function createCommand() { + (0, errors_1.fatal)(`The create command has been removed.\n` + + `Use ${colors_1.default.input('npm init @capacitor/app')}`); +} +exports.createCommand = createCommand; diff --git a/@capacitor/cli/dist/tasks/doctor.js b/@capacitor/cli/dist/tasks/doctor.js new file mode 100644 index 00000000..8fced771 --- /dev/null +++ b/@capacitor/cli/dist/tasks/doctor.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.doctor = exports.doctorCore = exports.doctorCommand = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const doctor_1 = require("../android/doctor"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const doctor_2 = require("../ios/doctor"); +const log_1 = require("../log"); +const emoji_1 = require("../util/emoji"); +const node_1 = require("../util/node"); +const subprocess_1 = require("../util/subprocess"); +async function doctorCommand(config, selectedPlatformName) { + log_1.output.write(`${(0, emoji_1.emoji)('💊', '')} ${colors_1.default.strong('Capacitor Doctor')} ${(0, emoji_1.emoji)('💊', '')} \n\n`); + await doctorCore(config); + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + await Promise.all(platforms.map(platformName => { + return doctor(config, platformName); + })); +} +exports.doctorCommand = doctorCommand; +async function doctorCore(config) { + const [cliVersion, coreVersion, androidVersion, iosVersion] = await Promise.all([ + (0, subprocess_1.getCommandOutput)('npm', ['info', '@capacitor/cli', 'version']), + (0, subprocess_1.getCommandOutput)('npm', ['info', '@capacitor/core', 'version']), + (0, subprocess_1.getCommandOutput)('npm', ['info', '@capacitor/android', 'version']), + (0, subprocess_1.getCommandOutput)('npm', ['info', '@capacitor/ios', 'version']), + ]); + log_1.output.write(`${colors_1.default.strong('Latest Dependencies:')}\n\n` + + ` @capacitor/cli: ${colors_1.default.weak(cliVersion !== null && cliVersion !== void 0 ? cliVersion : 'unknown')}\n` + + ` @capacitor/core: ${colors_1.default.weak(coreVersion !== null && coreVersion !== void 0 ? coreVersion : 'unknown')}\n` + + ` @capacitor/android: ${colors_1.default.weak(androidVersion !== null && androidVersion !== void 0 ? androidVersion : 'unknown')}\n` + + ` @capacitor/ios: ${colors_1.default.weak(iosVersion !== null && iosVersion !== void 0 ? iosVersion : 'unknown')}\n\n` + + `${colors_1.default.strong('Installed Dependencies:')}\n\n`); + await printInstalledPackages(config); + log_1.output.write('\n'); +} +exports.doctorCore = doctorCore; +async function printInstalledPackages(config) { + const packageNames = [ + '@capacitor/cli', + '@capacitor/core', + '@capacitor/android', + '@capacitor/ios', + ]; + await Promise.all(packageNames.map(async (packageName) => { + const packagePath = (0, node_1.resolveNode)(config.app.rootDir, packageName, 'package.json'); + await printPackageVersion(packageName, packagePath); + })); +} +async function printPackageVersion(packageName, packagePath) { + let version; + if (packagePath) { + version = (await (0, utils_fs_1.readJSON)(packagePath)).version; + } + log_1.output.write(` ${packageName}: ${colors_1.default.weak(version || 'not installed')}\n`); +} +async function doctor(config, platformName) { + if (platformName === config.ios.name) { + await (0, doctor_2.doctorIOS)(config); + } + else if (platformName === config.android.name) { + await (0, doctor_1.doctorAndroid)(config); + } + else if (platformName === config.web.name) { + return Promise.resolve(); + } + else { + throw `Platform ${platformName} is not valid.`; + } +} +exports.doctor = doctor; diff --git a/@capacitor/cli/dist/tasks/init.js b/@capacitor/cli/dist/tasks/init.js new file mode 100644 index 00000000..4e4da09a --- /dev/null +++ b/@capacitor/cli/dist/tasks/init.js @@ -0,0 +1,139 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.initCommand = void 0; +const tslib_1 = require("tslib"); +const open_1 = tslib_1.__importDefault(require("open")); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const config_1 = require("../config"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const framework_configs_1 = require("../framework-configs"); +const log_1 = require("../log"); +const sysconfig_1 = require("../sysconfig"); +const node_1 = require("../util/node"); +const term_1 = require("../util/term"); +async function initCommand(config, name, id, webDirFromCLI) { + var _a, _b; + try { + if (!(0, term_1.checkInteractive)(name, id)) { + return; + } + if (config.app.extConfigType !== 'json') { + (0, errors_1.fatal)(`Cannot run ${colors_1.default.input('init')} for a project using a non-JSON configuration file.\n` + + `Delete ${colors_1.default.strong(config.app.extConfigName)} and try again.`); + } + const isNewConfig = Object.keys(config.app.extConfig).length === 0; + const tsInstalled = !!(0, node_1.resolveNode)(config.app.rootDir, 'typescript'); + const appName = await getName(config, name); + const appId = await getAppId(config, id); + const webDir = (0, term_1.isInteractive)() + ? await getWebDir(config, webDirFromCLI) + : (_a = webDirFromCLI !== null && webDirFromCLI !== void 0 ? webDirFromCLI : config.app.extConfig.webDir) !== null && _a !== void 0 ? _a : 'www'; + await (0, common_1.check)([ + () => (0, common_1.checkAppName)(config, appName), + () => (0, common_1.checkAppId)(config, appId), + ]); + const cordova = await (0, cordova_1.getCordovaPreferences)(config); + await runMergeConfig(config, { + appId, + appName, + webDir, + cordova, + }, isNewConfig && tsInstalled ? 'ts' : 'json'); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + log_1.output.write('Usage: npx cap init appName appId\n' + + 'Example: npx cap init "My App" "com.example.myapp"\n\n'); + (0, errors_1.fatal)((_b = e.stack) !== null && _b !== void 0 ? _b : e); + } + throw e; + } +} +exports.initCommand = initCommand; +async function getName(config, name) { + var _a; + if (!name) { + const answers = await (0, log_1.logPrompt)(`${colors_1.default.strong(`What is the name of your app?`)}\n` + + `This should be a human-friendly app name, like what you'd see in the App Store.`, { + type: 'text', + name: 'name', + message: `Name`, + initial: config.app.appName + ? config.app.appName + : (_a = config.app.package.name) !== null && _a !== void 0 ? _a : 'App', + }); + return answers.name; + } + return name; +} +async function getAppId(config, id) { + if (!id) { + const answers = await (0, log_1.logPrompt)(`${colors_1.default.strong(`What should be the Package ID for your app?`)}\n` + + `Package IDs (aka Bundle ID in iOS and Application ID in Android) are unique identifiers for apps. They must be in reverse domain name notation, generally representing a domain name that you or your company owns.`, { + type: 'text', + name: 'id', + message: `Package ID`, + initial: config.app.appId ? config.app.appId : 'com.example.app', + }); + return answers.id; + } + return id; +} +async function getWebDir(config, webDir) { + if (!webDir) { + const framework = (0, framework_configs_1.detectFramework)(config); + if (framework === null || framework === void 0 ? void 0 : framework.webDir) { + return framework.webDir; + } + const answers = await (0, log_1.logPrompt)(`${colors_1.default.strong(`What is the web asset directory for your app?`)}\n` + + `This directory should contain the final ${colors_1.default.strong('index.html')} of your app.`, { + type: 'text', + name: 'webDir', + message: `Web asset directory`, + initial: config.app.webDir ? config.app.webDir : 'www', + }); + return answers.webDir; + } + return webDir; +} +async function runMergeConfig(config, extConfig, type) { + const configDirectory = (0, path_1.dirname)(config.app.extConfigFilePath); + const newConfigPath = (0, path_1.resolve)(configDirectory, type === 'ts' ? config_1.CONFIG_FILE_NAME_TS : config_1.CONFIG_FILE_NAME_JSON); + await (0, common_1.runTask)(`Creating ${colors_1.default.strong((0, path_1.basename)(newConfigPath))} in ${colors_1.default.input(config.app.rootDir)}`, async () => { + await mergeConfig(config, extConfig, newConfigPath); + }); + printNextSteps((0, path_1.basename)(newConfigPath)); + if ((0, term_1.isInteractive)()) { + let sysconfig = await (0, sysconfig_1.readConfig)(); + if (typeof sysconfig.signup === 'undefined') { + const signup = await promptToSignup(); + sysconfig = { ...sysconfig, signup }; + await (0, sysconfig_1.writeConfig)(sysconfig); + } + } +} +async function mergeConfig(config, extConfig, newConfigPath) { + const oldConfig = { ...config.app.extConfig }; + const newConfig = { ...oldConfig, ...extConfig }; + await (0, config_1.writeConfig)(newConfig, newConfigPath); +} +function printNextSteps(newConfigName) { + (0, log_1.logSuccess)(`${colors_1.default.strong(newConfigName)} created!`); + log_1.output.write(`\nNext steps: \n${colors_1.default.strong(`https://capacitorjs.com/docs/getting-started#where-to-go-next`)}\n`); +} +async function promptToSignup() { + const answers = await (0, log_1.logPrompt)(`Join the Ionic Community! 💙\n` + + `Connect with millions of developers on the Ionic Forum and get access to live events, news updates, and more.`, { + type: 'confirm', + name: 'create', + message: `Create free Ionic account?`, + initial: true, + }); + if (answers.create) { + (0, open_1.default)(`http://ionicframework.com/signup?source=capacitor`); + } + return answers.create; +} diff --git a/@capacitor/cli/dist/tasks/list.js b/@capacitor/cli/dist/tasks/list.js new file mode 100644 index 00000000..a8f05fa1 --- /dev/null +++ b/@capacitor/cli/dist/tasks/list.js @@ -0,0 +1,50 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.list = exports.listCommand = void 0; +const tslib_1 = require("tslib"); +const common_1 = require("../android/common"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_2 = require("../common"); +const errors_1 = require("../errors"); +const common_3 = require("../ios/common"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const promise_1 = require("../util/promise"); +async function listCommand(config, selectedPlatformName) { + var _a; + const platforms = await (0, common_2.selectPlatforms)(config, selectedPlatformName); + try { + await (0, promise_1.allSerial)(platforms.map(platformName => () => list(config, platformName))); + } + catch (e) { + if ((0, errors_1.isFatal)(e)) { + throw e; + } + log_1.logger.error((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } +} +exports.listCommand = listCommand; +async function list(config, platform) { + const allPlugins = await (0, plugin_1.getPlugins)(config, platform); + let plugins = []; + if (platform === config.ios.name) { + plugins = await (0, common_3.getIOSPlugins)(allPlugins); + } + else if (platform === config.android.name) { + plugins = await (0, common_1.getAndroidPlugins)(allPlugins); + } + else if (platform === config.web.name) { + log_1.logger.info(`Listing plugins for ${colors_1.default.input(platform)} is not possible.`); + return; + } + else { + throw `Platform ${colors_1.default.input(platform)} is not valid.`; + } + const capacitorPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 0 /* PluginType.Core */); + (0, plugin_1.printPlugins)(capacitorPlugins, platform); + const cordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 1 /* PluginType.Cordova */); + (0, plugin_1.printPlugins)(cordovaPlugins, platform, 'cordova'); + const incompatibleCordovaPlugins = plugins.filter(p => (0, plugin_1.getPluginType)(p, platform) === 2 /* PluginType.Incompatible */); + (0, plugin_1.printPlugins)(incompatibleCordovaPlugins, platform, 'incompatible'); +} +exports.list = list; diff --git a/@capacitor/cli/dist/tasks/migrate.js b/@capacitor/cli/dist/tasks/migrate.js new file mode 100644 index 00000000..2e1ba0b7 --- /dev/null +++ b/@capacitor/cli/dist/tasks/migrate.js @@ -0,0 +1,575 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.patchOldCapacitorPlugins = exports.migrateCommand = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const rimraf_1 = tslib_1.__importDefault(require("rimraf")); +const semver_1 = require("semver"); +const common_1 = require("../android/common"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_2 = require("../common"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const plugin_1 = require("../plugin"); +const fs_1 = require("../util/fs"); +const node_1 = require("../util/node"); +const subprocess_1 = require("../util/subprocess"); +const template_1 = require("../util/template"); +// eslint-disable-next-line prefer-const +let allDependencies = {}; +const libs = [ + '@capacitor/core', + '@capacitor/cli', + '@capacitor/ios', + '@capacitor/android', +]; +const plugins = [ + '@capacitor/action-sheet', + '@capacitor/app', + '@capacitor/app-launcher', + '@capacitor/browser', + '@capacitor/camera', + '@capacitor/clipboard', + '@capacitor/device', + '@capacitor/dialog', + '@capacitor/filesystem', + '@capacitor/geolocation', + '@capacitor/haptics', + '@capacitor/keyboard', + '@capacitor/local-notifications', + '@capacitor/motion', + '@capacitor/network', + '@capacitor/preferences', + '@capacitor/push-notifications', + '@capacitor/screen-reader', + '@capacitor/screen-orientation', + '@capacitor/share', + '@capacitor/splash-screen', + '@capacitor/status-bar', + '@capacitor/text-zoom', + '@capacitor/toast', +]; +const coreVersion = '^6.0.0'; +const pluginVersion = '^6.0.0'; +const gradleVersion = '8.2.1'; +let installFailed = false; +async function migrateCommand(config, noprompt, packagemanager) { + if (config === null) { + (0, errors_1.fatal)('Config data missing'); + } + const capMajor = await checkCapacitorMajorVersion(config); + if (capMajor < 5) { + (0, errors_1.fatal)('Migrate can only be used on capacitor 5 and above, please use the CLI in Capacitor 5 to upgrade to 5 first'); + } + const jdkMajor = await (0, common_2.checkJDKMajorVersion)(); + if (jdkMajor < 17) { + log_1.logger.warn('Capacitor 6 requires JDK 17 or higher. Some steps may fail.'); + } + const variablesAndClasspaths = await getAndroidVariablesAndClasspaths(config); + if (!variablesAndClasspaths) { + (0, errors_1.fatal)('Variable and Classpath info could not be read.'); + } + allDependencies = { + ...config.app.package.dependencies, + ...config.app.package.devDependencies, + }; + const monorepoWarning = 'Please note this tool is not intended for use in a mono-repo environment, please check out the Ionic vscode extension for this functionality.'; + log_1.logger.info(monorepoWarning); + const { migrateconfirm } = noprompt + ? { migrateconfirm: 'y' } + : await (0, log_1.logPrompt)(`Capacitor 6 sets a deployment target of iOS 13 and Android 14 (SDK 34). \n`, { + type: 'text', + name: 'migrateconfirm', + message: `Are you sure you want to migrate? (Y/n)`, + initial: 'y', + }); + if (typeof migrateconfirm === 'string' && + migrateconfirm.toLowerCase() === 'y') { + try { + const { depInstallConfirm } = noprompt + ? { depInstallConfirm: 'y' } + : await (0, log_1.logPrompt)(`Would you like the migrator to run npm, yarn, pnpm, or bun install to install the latest versions of capacitor packages? (Those using other package managers should answer N)`, { + type: 'text', + name: 'depInstallConfirm', + message: `Run Dependency Install? (Y/n)`, + initial: 'y', + }); + const runNpmInstall = typeof depInstallConfirm === 'string' && + depInstallConfirm.toLowerCase() === 'y'; + let installerType = 'npm'; + if (runNpmInstall) { + const { manager } = packagemanager + ? { manager: packagemanager } + : await (0, log_1.logPrompt)('What dependency manager do you use?', { + type: 'select', + name: 'manager', + message: `Dependency Management Tool`, + choices: [ + { title: 'NPM', value: 'npm' }, + { title: 'Yarn', value: 'yarn' }, + { title: 'PNPM', value: 'pnpm' }, + { title: 'Bun', value: 'bun' }, + ], + initial: 0, + }); + installerType = manager; + } + try { + await (0, common_2.runTask)(`Installing Latest Modules using ${installerType}.`, () => { + return installLatestLibs(installerType, runNpmInstall, config); + }); + } + catch (ex) { + log_1.logger.error(`${installerType} install failed. Try deleting node_modules folder and running ${colors_1.default.input(`${installerType} install --force`)} manually.`); + installFailed = true; + } + // Update iOS Projects + if (allDependencies['@capacitor/ios'] && + (0, utils_fs_1.existsSync)(config.ios.platformDirAbs)) { + // ios template changes + // Remove NSLocationAlwaysUsageDescription + await (0, common_2.runTask)(`Migrating Info.plist by removing NSLocationAlwaysUsageDescription key.`, () => { + return removeKey((0, path_1.join)(config.ios.nativeTargetDirAbs, 'Info.plist'), 'NSLocationAlwaysUsageDescription'); + }); + } + if (!installFailed) { + await (0, common_2.runTask)(`Running cap sync.`, () => { + return (0, subprocess_1.runCommand)('npx', ['cap', 'sync']); + }); + } + else { + log_1.logger.warn('Skipped Running cap sync.'); + } + if (allDependencies['@capacitor/android'] && + (0, utils_fs_1.existsSync)(config.android.platformDirAbs)) { + const gradleWrapperVersion = getGradleWrapperVersion((0, path_1.join)(config.android.platformDirAbs, 'gradle', 'wrapper', 'gradle-wrapper.properties')); + if (!installFailed && (0, semver_1.gt)(gradleVersion, gradleWrapperVersion)) { + try { + await (0, common_2.runTask)(`Upgrading gradle wrapper files`, () => { + return updateGradleWrapperFiles(config.android.platformDirAbs); + }); + } + catch (e) { + if (e.includes('EACCES')) { + log_1.logger.error(`gradlew file does not have executable permissions. This can happen if the Android platform was added on a Windows machine. Please run ${colors_1.default.input(`chmod +x ./${config.android.platformDir}/gradlew`)} and ${colors_1.default.input(`cd ${config.android.platformDir} && ./gradlew wrapper --distribution-type all --gradle-version ${gradleVersion} --warning-mode all`)} to update the files manually`); + } + else { + log_1.logger.error(`gradle wrapper files were not updated`); + } + } + } + else { + log_1.logger.warn('Skipped upgrading gradle wrapper files'); + } + await (0, common_2.runTask)(`Migrating build.gradle file.`, () => { + return updateBuildGradle((0, path_1.join)(config.android.platformDirAbs, 'build.gradle'), variablesAndClasspaths); + }); + // Replace deprecated compileSdkVersion + await (0, common_2.runTask)('Replacing deprecated compileSdkVersion from build.gradle', () => { + return (async () => { + const buildGradleFilename = (0, path_1.join)(config.android.platformDirAbs, 'app', 'build.gradle'); + const buildGradleText = readFile(buildGradleFilename); + if (!buildGradleText) { + log_1.logger.error(`Could not read ${buildGradleFilename}. Check its permissions and if it exists.`); + return; + } + const compileSdk = `compileSdkVersion rootProject.ext.compileSdkVersion`; + if (buildGradleText.includes(compileSdk)) { + const buildGradleReplaced = buildGradleText.replace(compileSdk, `compileSdk rootProject.ext.compileSdkVersion`); + (0, utils_fs_1.writeFileSync)(buildGradleFilename, buildGradleReplaced, 'utf-8'); + } + })(); + }); + // Variables gradle + await (0, common_2.runTask)(`Migrating variables.gradle file.`, () => { + return (async () => { + const variablesPath = (0, path_1.join)(config.android.platformDirAbs, 'variables.gradle'); + let txt = readFile(variablesPath); + if (!txt) { + return; + } + txt = txt.replace(/= {2}'/g, `= '`); + (0, utils_fs_1.writeFileSync)(variablesPath, txt, { encoding: 'utf-8' }); + for (const variable of Object.keys(variablesAndClasspaths.variables)) { + let replaceStart = `${variable} = '`; + let replaceEnd = `'\n`; + if (typeof variablesAndClasspaths.variables[variable] === 'number') { + replaceStart = `${variable} = `; + replaceEnd = `\n`; + } + if (txt.includes(replaceStart)) { + const first = txt.indexOf(replaceStart) + replaceStart.length; + const value = txt.substring(first, txt.indexOf(replaceEnd, first)); + if ((typeof variablesAndClasspaths.variables[variable] === + 'number' && + value <= variablesAndClasspaths.variables[variable]) || + (typeof variablesAndClasspaths.variables[variable] === + 'string' && + (0, semver_1.lt)(value, variablesAndClasspaths.variables[variable]))) { + await updateFile(config, variablesPath, replaceStart, replaceEnd, variablesAndClasspaths.variables[variable].toString(), true); + } + } + else { + let file = readFile(variablesPath); + if (file) { + file = file.replace('}', ` ${replaceStart}${variablesAndClasspaths.variables[variable].toString()}${replaceEnd}}`); + (0, utils_fs_1.writeFileSync)(variablesPath, file); + } + } + } + const pluginVariables = { + firebaseMessagingVersion: '23.3.1', + playServicesLocationVersion: '21.1.0', + androidxBrowserVersion: '1.7.0', + androidxMaterialVersion: '1.10.0', + androidxExifInterfaceVersion: '1.3.6', + androidxCoreKTXVersion: '1.12.0', + googleMapsPlayServicesVersion: '18.2.0', + googleMapsUtilsVersion: '3.8.2', + googleMapsKtxVersion: '5.0.0', + googleMapsUtilsKtxVersion: '5.0.0', + kotlinxCoroutinesVersion: '1.7.3', + coreSplashScreenVersion: '1.0.1', + }; + for (const variable of Object.keys(pluginVariables)) { + await updateFile(config, variablesPath, `${variable} = '`, `'`, pluginVariables[variable], true); + } + })(); + }); + rimraf_1.default.sync((0, path_1.join)(config.android.appDirAbs, 'build')); + if (!installFailed) { + await (0, common_2.runTask)('Migrating package from Manifest to build.gradle in Capacitor plugins', () => { + return patchOldCapacitorPlugins(config); + }); + } + else { + log_1.logger.warn('Skipped migrating package from Manifest to build.gradle in Capacitor plugins'); + } + } + // Write all breaking changes + await (0, common_2.runTask)(`Writing breaking changes.`, () => { + return writeBreakingChanges(); + }); + if (!installFailed) { + (0, log_1.logSuccess)(`Migration to Capacitor ${coreVersion} is complete. Run and test your app!`); + } + else { + log_1.logger.warn(`Migration to Capacitor ${coreVersion} is incomplete. Check the log messages for more information.`); + } + } + catch (err) { + (0, errors_1.fatal)(`Failed to migrate: ${err}`); + } + } + else { + (0, errors_1.fatal)(`User canceled migration.`); + } +} +exports.migrateCommand = migrateCommand; +async function checkCapacitorMajorVersion(config) { + var _a; + const capacitorVersion = await (0, common_2.getCoreVersion)(config); + const versionArray = (_a = capacitorVersion.match(/([0-9]+)\.([0-9]+)\.([0-9]+)/)) !== null && _a !== void 0 ? _a : []; + const majorVersion = parseInt(versionArray[1]); + return majorVersion; +} +async function installLatestLibs(dependencyManager, runInstall, config) { + const pkgJsonPath = (0, path_1.join)(config.app.rootDir, 'package.json'); + const pkgJsonFile = readFile(pkgJsonPath); + if (!pkgJsonFile) { + return; + } + const pkgJson = JSON.parse(pkgJsonFile); + for (const devDepKey of Object.keys(pkgJson['devDependencies'] || {})) { + if (libs.includes(devDepKey)) { + pkgJson['devDependencies'][devDepKey] = coreVersion; + } + else if (plugins.includes(devDepKey)) { + pkgJson['devDependencies'][devDepKey] = pluginVersion; + } + } + for (const depKey of Object.keys(pkgJson['dependencies'] || {})) { + if (libs.includes(depKey)) { + pkgJson['dependencies'][depKey] = coreVersion; + } + else if (plugins.includes(depKey)) { + pkgJson['dependencies'][depKey] = pluginVersion; + } + } + (0, utils_fs_1.writeFileSync)(pkgJsonPath, JSON.stringify(pkgJson, null, 2), { + encoding: 'utf-8', + }); + if (runInstall) { + rimraf_1.default.sync((0, path_1.join)(config.app.rootDir, 'node_modules/@capacitor/!(cli)')); + await (0, subprocess_1.runCommand)(dependencyManager, ['install']); + if (dependencyManager == 'yarn') { + await (0, subprocess_1.runCommand)(dependencyManager, ['upgrade']); + } + else { + await (0, subprocess_1.runCommand)(dependencyManager, ['update']); + } + } + else { + log_1.logger.info(`Please run an install command with your package manager of choice. (ex: yarn install)`); + } +} +async function writeBreakingChanges() { + const breaking = [ + '@capacitor/camera', + '@capacitor/filesystem', + '@capacitor/geolocation', + '@capacitor/google-maps', + '@capacitor/local-notifications', + ]; + const broken = []; + for (const lib of breaking) { + if (allDependencies[lib]) { + broken.push(lib); + } + } + if (broken.length > 0) { + log_1.logger.info(`IMPORTANT: Review https://capacitorjs.com/docs/next/updating/6-0#plugins for breaking changes in these plugins that you use: ${broken.join(', ')}.`); + } +} +async function getAndroidVariablesAndClasspaths(config) { + const tempAndroidTemplateFolder = (0, path_1.join)(config.cli.assetsDirAbs, 'tempAndroidTemplate'); + await (0, template_1.extractTemplate)(config.cli.assets.android.platformTemplateArchiveAbs, tempAndroidTemplateFolder); + const variablesGradleFile = readFile((0, path_1.join)(tempAndroidTemplateFolder, 'variables.gradle')); + const buildGradleFile = readFile((0, path_1.join)(tempAndroidTemplateFolder, 'build.gradle')); + if (!variablesGradleFile || !buildGradleFile) { + return; + } + (0, fs_1.deleteFolderRecursive)(tempAndroidTemplateFolder); + const firstIndxOfCATBGV = buildGradleFile.indexOf(`classpath 'com.android.tools.build:gradle:`) + 42; + const firstIndxOfCGGGS = buildGradleFile.indexOf(`com.google.gms:google-services:`) + 31; + const comAndroidToolsBuildGradleVersion = '' + + buildGradleFile.substring(firstIndxOfCATBGV, buildGradleFile.indexOf("'", firstIndxOfCATBGV)); + const comGoogleGmsGoogleServices = '' + + buildGradleFile.substring(firstIndxOfCGGGS, buildGradleFile.indexOf("'", firstIndxOfCGGGS)); + const variablesGradleAsJSON = JSON.parse(variablesGradleFile + .replace('ext ', '') + .replace(/=/g, ':') + .replace(/\n/g, ',') + .replace(/,([^:]+):/g, function (_k, p1) { + return `,"${p1}":`; + }) + .replace('{,', '{') + .replace(',}', '}') + .replace(/\s/g, '') + .replace(/'/g, '"')); + return { + 'variables': variablesGradleAsJSON, + 'com.android.tools.build:gradle': comAndroidToolsBuildGradleVersion, + 'com.google.gms:google-services': comGoogleGmsGoogleServices, + }; +} +function readFile(filename) { + try { + if (!(0, utils_fs_1.existsSync)(filename)) { + log_1.logger.error(`Unable to find ${filename}. Try updating it manually`); + return; + } + return (0, utils_fs_1.readFileSync)(filename, 'utf-8'); + } + catch (err) { + log_1.logger.error(`Unable to read ${filename}. Verify it is not already open. ${err}`); + } +} +function getGradleWrapperVersion(filename) { + var _a; + const txt = readFile(filename); + if (!txt) { + return '0.0.0'; + } + const version = txt.substring(txt.indexOf('gradle-') + 7, txt.indexOf('-all.zip')); + const semverVersion = (_a = (0, semver_1.coerce)(version)) === null || _a === void 0 ? void 0 : _a.version; + return semverVersion ? semverVersion : '0.0.0'; +} +async function updateGradleWrapperFiles(platformDir) { + await (0, subprocess_1.runCommand)(`./gradlew`, [ + 'wrapper', + '--distribution-type', + 'all', + '--gradle-version', + gradleVersion, + '--warning-mode', + 'all', + ], { + cwd: platformDir, + }); +} +async function movePackageFromManifestToBuildGradle(manifestFilename, buildGradleFilename) { + const manifestText = readFile(manifestFilename); + const buildGradleText = readFile(buildGradleFilename); + if (!manifestText) { + log_1.logger.error(`Could not read ${manifestFilename}. Check its permissions and if it exists.`); + return; + } + if (!buildGradleText) { + log_1.logger.error(`Could not read ${buildGradleFilename}. Check its permissions and if it exists.`); + return; + } + const namespaceExists = new RegExp(/\s+namespace\s+/).test(buildGradleText); + if (namespaceExists) { + log_1.logger.error('Found namespace in build.gradle already, skipping migration'); + return; + } + let packageName; + const manifestRegEx = new RegExp(/package="([^"]+)"/); + const manifestResults = manifestRegEx.exec(manifestText); + if (manifestResults === null) { + log_1.logger.error(`Unable to update Android Manifest. Package not found.`); + return; + } + else { + packageName = manifestResults[1]; + } + let manifestReplaced = manifestText; + manifestReplaced = manifestReplaced.replace(manifestRegEx, ''); + if (manifestText == manifestReplaced) { + log_1.logger.error(`Unable to update Android Manifest: no changes were detected in Android Manifest file`); + return; + } + let buildGradleReplaced = buildGradleText; + buildGradleReplaced = setAllStringIn(buildGradleText, 'android {', '\n', `\n namespace "${packageName}"`); + if (buildGradleText == buildGradleReplaced) { + log_1.logger.error(`Unable to update buildGradleText: no changes were detected in Android Manifest file`); + return; + } + (0, utils_fs_1.writeFileSync)(manifestFilename, manifestReplaced, 'utf-8'); + (0, utils_fs_1.writeFileSync)(buildGradleFilename, buildGradleReplaced, 'utf-8'); +} +async function updateBuildGradle(filename, variablesAndClasspaths) { + const txt = readFile(filename); + if (!txt) { + return; + } + const neededDeps = { + 'com.android.tools.build:gradle': variablesAndClasspaths['com.android.tools.build:gradle'], + 'com.google.gms:google-services': variablesAndClasspaths['com.google.gms:google-services'], + }; + let replaced = txt; + for (const dep of Object.keys(neededDeps)) { + if (replaced.includes(`classpath '${dep}`)) { + const firstIndex = replaced.indexOf(dep) + dep.length + 1; + const existingVersion = '' + replaced.substring(firstIndex, replaced.indexOf("'", firstIndex)); + if ((0, semver_1.gte)(neededDeps[dep], existingVersion)) { + replaced = setAllStringIn(replaced, `classpath '${dep}:`, `'`, neededDeps[dep]); + log_1.logger.info(`Set ${dep} = ${neededDeps[dep]}.`); + } + } + } + (0, utils_fs_1.writeFileSync)(filename, replaced, 'utf-8'); +} +async function updateFile(config, filename, textStart, textEnd, replacement, skipIfNotFound) { + if (config === null) { + return false; + } + const path = filename; + let txt = readFile(path); + if (!txt) { + return false; + } + if (txt.includes(textStart)) { + if (replacement) { + txt = setAllStringIn(txt, textStart, textEnd, replacement); + (0, utils_fs_1.writeFileSync)(path, txt, { encoding: 'utf-8' }); + } + else { + // Replacing in code so we need to count the number of brackets to find the end of the function in swift + const lines = txt.split('\n'); + let replaced = ''; + let keep = true; + let brackets = 0; + for (const line of lines) { + if (line.includes(textStart)) { + keep = false; + } + if (!keep) { + brackets += (line.match(/{/g) || []).length; + brackets -= (line.match(/}/g) || []).length; + if (brackets == 0) { + keep = true; + } + } + else { + replaced += line + '\n'; + } + } + (0, utils_fs_1.writeFileSync)(path, replaced, { encoding: 'utf-8' }); + } + return true; + } + else if (!skipIfNotFound) { + log_1.logger.error(`Unable to find "${textStart}" in ${filename}. Try updating it manually`); + } + return false; +} +function setAllStringIn(data, start, end, replacement) { + let position = 0; + let result = data; + let replaced = true; + while (replaced) { + const foundIdx = result.indexOf(start, position); + if (foundIdx == -1) { + replaced = false; + } + else { + const idx = foundIdx + start.length; + position = idx + replacement.length; + result = + result.substring(0, idx) + + replacement + + result.substring(result.indexOf(end, idx)); + } + } + return result; +} +async function patchOldCapacitorPlugins(config) { + const allPlugins = await (0, plugin_1.getPlugins)(config, 'android'); + const androidPlugins = await (0, common_1.getAndroidPlugins)(allPlugins); + return await Promise.all(androidPlugins.map(async (p) => { + var _a, _b; + if ((_b = (_a = p.manifest) === null || _a === void 0 ? void 0 : _a.android) === null || _b === void 0 ? void 0 : _b.src) { + const buildGradlePath = (0, node_1.resolveNode)(config.app.rootDir, p.id, p.manifest.android.src, 'build.gradle'); + const manifestPath = (0, node_1.resolveNode)(config.app.rootDir, p.id, p.manifest.android.src, 'src', 'main', 'AndroidManifest.xml'); + if (buildGradlePath && manifestPath) { + const gradleContent = readFile(buildGradlePath); + if (!(gradleContent === null || gradleContent === void 0 ? void 0 : gradleContent.includes('namespace'))) { + if (plugins.includes(p.id)) { + log_1.logger.warn(`You are using an outdated version of ${p.id}, update the plugin to version ${pluginVersion}`); + } + else { + log_1.logger.warn(`${p.id}@${p.version} doesn't officially support Capacitor ${coreVersion} yet, doing our best moving it's package to build.gradle so it builds`); + } + movePackageFromManifestToBuildGradle(manifestPath, buildGradlePath); + } + } + } + })); +} +exports.patchOldCapacitorPlugins = patchOldCapacitorPlugins; +async function removeKey(filename, key) { + const txt = readFile(filename); + if (!txt) { + return; + } + let lines = txt.split('\n'); + let removed = false; + let removing = false; + lines = lines.filter(line => { + if (removing && line.includes('')) { + removing = false; + return false; + } + if (line.includes(`${key} platform === config.ios.name || platform === config.android.name; +} +async function open(config, platformName) { + if (platformName === config.ios.name) { + await (0, common_1.runTask)('Opening the Xcode workspace...', () => { + return (0, open_2.openIOS)(config); + }); + } + else if (platformName === config.android.name) { + return (0, open_1.openAndroid)(config); + } + else if (platformName === config.web.name) { + return Promise.resolve(); + } + else { + throw `Platform ${platformName} is not valid.`; + } +} +exports.open = open; diff --git a/@capacitor/cli/dist/tasks/run.js b/@capacitor/cli/dist/tasks/run.js new file mode 100644 index 00000000..12b83b2a --- /dev/null +++ b/@capacitor/cli/dist/tasks/run.js @@ -0,0 +1,114 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.run = exports.runCommand = void 0; +const tslib_1 = require("tslib"); +const utils_process_1 = require("@ionic/utils-process"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const run_1 = require("../android/run"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const cordova_1 = require("../cordova"); +const errors_1 = require("../errors"); +const run_2 = require("../ios/run"); +const log_1 = require("../log"); +const livereload_1 = require("../util/livereload"); +const native_run_1 = require("../util/native-run"); +const sync_1 = require("./sync"); +async function runCommand(config, selectedPlatformName, options) { + var _a, _b, _c, _d; + options.host = + (_b = (_a = options.host) !== null && _a !== void 0 ? _a : livereload_1.CapLiveReloadHelper.getIpAddress()) !== null && _b !== void 0 ? _b : 'localhost'; + options.port = (_c = options.port) !== null && _c !== void 0 ? _c : '3000'; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_1.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_1.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:run'); + } + else { + log_1.logger.error(`Platform ${colors_1.default.input(selectedPlatformName)} not found.`); + } + } + else { + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + let platformName; + if (platforms.length === 1) { + platformName = platforms[0]; + } + else { + platformName = await (0, common_1.promptForPlatform)(platforms.filter(createRunnablePlatformFilter(config)), `Please choose a platform to run:`); + } + if (options.list) { + const targets = await (0, native_run_1.getPlatformTargets)(platformName); + const outputTargets = targets.map(t => { + var _a; + return ({ + name: (0, common_1.getPlatformTargetName)(t), + api: `${t.platform === 'ios' ? 'iOS' : 'API'} ${t.sdkVersion}`, + id: (_a = t.id) !== null && _a !== void 0 ? _a : '?', + }); + }); + // TODO: make hidden commander option (https://github.com/tj/commander.js/issues/1106) + if (process.argv.includes('--json')) { + process.stdout.write(`${JSON.stringify(outputTargets)}\n`); + } + else { + const rows = outputTargets.map(t => [t.name, t.api, t.id]); + log_1.output.write(`${(0, utils_terminal_1.columnar)(rows, { + headers: ['Name', 'API', 'Target ID'], + vsep: ' ', + })}\n`); + } + return; + } + try { + if (options.sync) { + await (0, sync_1.sync)(config, platformName, false, true); + } + const cordovaPlugins = await (0, cordova_1.getCordovaPlugins)(config, platformName); + if (options.liveReload) { + await livereload_1.CapLiveReloadHelper.editCapConfigForLiveReload(config, platformName, options); + if (platformName === config.android.name) { + await await (0, cordova_1.writeCordovaAndroidManifest)(cordovaPlugins, config, platformName, true); + } + } + await run(config, platformName, options); + if (options.liveReload) { + new Promise(resolve => process.on('SIGINT', resolve)) + .then(async () => { + await livereload_1.CapLiveReloadHelper.revertCapConfigForLiveReload(); + if (platformName === config.android.name) { + await (0, cordova_1.writeCordovaAndroidManifest)(cordovaPlugins, config, platformName, false); + } + }) + .then(() => process.exit()); + log_1.logger.info(`App running with live reload listing for: http://${options.host}:${options.port}. Press Ctrl+C to quit.`); + await (0, utils_process_1.sleepForever)(); + } + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_d = e.stack) !== null && _d !== void 0 ? _d : e); + } + throw e; + } + } +} +exports.runCommand = runCommand; +async function run(config, platformName, options) { + if (platformName == config.ios.name) { + await (0, run_2.runIOS)(config, options); + } + else if (platformName === config.android.name) { + await (0, run_1.runAndroid)(config, options); + } + else if (platformName === config.web.name) { + return; + } + else { + throw `Platform ${platformName} is not valid.`; + } +} +exports.run = run; +function createRunnablePlatformFilter(config) { + return platform => platform === config.ios.name || platform === config.android.name; +} diff --git a/@capacitor/cli/dist/tasks/serve.js b/@capacitor/cli/dist/tasks/serve.js new file mode 100644 index 00000000..bad369f9 --- /dev/null +++ b/@capacitor/cli/dist/tasks/serve.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.serveCommand = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +async function serveCommand() { + (0, errors_1.fatal)(`The serve command has been removed.\n` + + `Use a third-party tool for serving single page apps, such as ${colors_1.default.strong('serve')}: ${colors_1.default.strong('https://www.npmjs.com/package/serve')}`); +} +exports.serveCommand = serveCommand; diff --git a/@capacitor/cli/dist/tasks/sourcemaps.js b/@capacitor/cli/dist/tasks/sourcemaps.js new file mode 100644 index 00000000..a4396f4d --- /dev/null +++ b/@capacitor/cli/dist/tasks/sourcemaps.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.inlineSourceMaps = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const log_1 = require("../log"); +function walkDirectory(dirPath) { + const files = (0, utils_fs_1.readdirSync)(dirPath); + files.forEach(file => { + const targetFile = (0, path_1.join)(dirPath, file); + if ((0, utils_fs_1.existsSync)(targetFile) && (0, utils_fs_1.lstatSync)(targetFile).isDirectory()) { + walkDirectory(targetFile); + } + else { + const mapFile = (0, path_1.join)(dirPath, `${file}.map`); + if ((0, path_1.extname)(file) === '.js' && (0, utils_fs_1.existsSync)(mapFile)) { + const bufMap = (0, utils_fs_1.readFileSync)(mapFile).toString('base64'); + const bufFile = (0, utils_fs_1.readFileSync)(targetFile, 'utf8'); + const result = bufFile.replace(`sourceMappingURL=${file}.map`, 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + + bufMap); + (0, utils_fs_1.writeFileSync)(targetFile, result); + (0, utils_fs_1.unlinkSync)(mapFile); + } + } + }); +} +async function inlineSourceMaps(config, platformName) { + let buildDir = ''; + if (platformName == config.ios.name) { + buildDir = await config.ios.webDirAbs; + } + if (platformName == config.android.name) { + buildDir = await config.android.webDirAbs; + } + if (buildDir) { + log_1.logger.info('Inlining sourcemaps'); + walkDirectory(buildDir); + } +} +exports.inlineSourceMaps = inlineSourceMaps; diff --git a/@capacitor/cli/dist/tasks/sync.js b/@capacitor/cli/dist/tasks/sync.js new file mode 100644 index 00000000..2113c611 --- /dev/null +++ b/@capacitor/cli/dist/tasks/sync.js @@ -0,0 +1,59 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sync = exports.syncCommand = void 0; +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const promise_1 = require("../util/promise"); +const copy_1 = require("./copy"); +const update_1 = require("./update"); +/** + * Sync is a copy and an update in one. + */ +async function syncCommand(config, selectedPlatformName, deployment, inline = false) { + var _a, _b; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + try { + await (0, copy_1.copyCommand)(config, selectedPlatformName, inline); + } + catch (e) { + log_1.logger.error((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + await (0, update_1.updateCommand)(config, selectedPlatformName, deployment); + } + else { + const then = +new Date(); + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + try { + await (0, common_1.check)([ + () => (0, common_1.checkPackage)(), + () => (0, common_1.checkWebDir)(config), + ...(0, update_1.updateChecks)(config, platforms), + ]); + await (0, promise_1.allSerial)(platforms.map(platformName => () => sync(config, platformName, deployment, inline))); + const now = +new Date(); + const diff = (now - then) / 1000; + log_1.logger.info(`Sync finished in ${diff}s`); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_b = e.stack) !== null && _b !== void 0 ? _b : e); + } + throw e; + } + } +} +exports.syncCommand = syncCommand; +async function sync(config, platformName, deployment, inline = false) { + var _a; + await (0, common_1.runHooks)(config, platformName, config.app.rootDir, 'capacitor:sync:before'); + try { + await (0, copy_1.copy)(config, platformName, inline); + } + catch (e) { + log_1.logger.error((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + await (0, update_1.update)(config, platformName, deployment); + await (0, common_1.runHooks)(config, platformName, config.app.rootDir, 'capacitor:sync:after'); +} +exports.sync = sync; diff --git a/@capacitor/cli/dist/tasks/telemetry.js b/@capacitor/cli/dist/tasks/telemetry.js new file mode 100644 index 00000000..e1d4d035 --- /dev/null +++ b/@capacitor/cli/dist/tasks/telemetry.js @@ -0,0 +1,40 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.telemetryCommand = void 0; +const tslib_1 = require("tslib"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +const sysconfig_1 = require("../sysconfig"); +const telemetry_1 = require("../telemetry"); +async function telemetryCommand(onOrOff) { + const sysconfig = await (0, sysconfig_1.readConfig)(); + const enabled = interpretEnabled(onOrOff); + if (typeof enabled === 'boolean') { + if (sysconfig.telemetry === enabled) { + log_1.logger.info(`Telemetry is already ${colors_1.default.strong(enabled ? 'on' : 'off')}`); + } + else { + await (0, sysconfig_1.writeConfig)({ ...sysconfig, telemetry: enabled }); + (0, log_1.logSuccess)(`You have ${colors_1.default.strong(`opted ${enabled ? 'in' : 'out'}`)} ${enabled ? 'for' : 'of'} telemetry on this machine.`); + if (enabled) { + log_1.output.write(telemetry_1.THANK_YOU); + } + } + } + else { + log_1.logger.info(`Telemetry is ${colors_1.default.strong(sysconfig.telemetry ? 'on' : 'off')}`); + } +} +exports.telemetryCommand = telemetryCommand; +function interpretEnabled(onOrOff) { + switch (onOrOff) { + case 'on': + return true; + case 'off': + return false; + case undefined: + return undefined; + } + (0, errors_1.fatal)(`Argument must be ${colors_1.default.strong('on')} or ${colors_1.default.strong('off')} (or left unspecified)`); +} diff --git a/@capacitor/cli/dist/tasks/update.js b/@capacitor/cli/dist/tasks/update.js new file mode 100644 index 00000000..6d7fa779 --- /dev/null +++ b/@capacitor/cli/dist/tasks/update.js @@ -0,0 +1,74 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.update = exports.updateChecks = exports.updateCommand = void 0; +const tslib_1 = require("tslib"); +const update_1 = require("../android/update"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const common_2 = require("../ios/common"); +const update_2 = require("../ios/update"); +const log_1 = require("../log"); +const promise_1 = require("../util/promise"); +async function updateCommand(config, selectedPlatformName, deployment) { + var _a; + if (selectedPlatformName && !(await (0, common_1.isValidPlatform)(selectedPlatformName))) { + const platformDir = (0, common_1.resolvePlatform)(config, selectedPlatformName); + if (platformDir) { + await (0, common_1.runPlatformHook)(config, selectedPlatformName, platformDir, 'capacitor:update'); + } + else { + log_1.logger.error(`Platform ${colors_1.default.input(selectedPlatformName)} not found.`); + } + } + else { + const then = +new Date(); + const platforms = await (0, common_1.selectPlatforms)(config, selectedPlatformName); + try { + await (0, common_1.check)([() => (0, common_1.checkPackage)(), ...updateChecks(config, platforms)]); + await (0, promise_1.allSerial)(platforms.map(platformName => async () => await update(config, platformName, deployment))); + const now = +new Date(); + const diff = (now - then) / 1000; + log_1.logger.info(`Update finished in ${diff}s`); + } + catch (e) { + if (!(0, errors_1.isFatal)(e)) { + (0, errors_1.fatal)((_a = e.stack) !== null && _a !== void 0 ? _a : e); + } + throw e; + } + } +} +exports.updateCommand = updateCommand; +function updateChecks(config, platforms) { + const checks = []; + for (const platformName of platforms) { + if (platformName === config.ios.name) { + checks.push(() => (0, common_2.checkBundler)(config) || (0, common_2.checkCocoaPods)(config)); + } + else if (platformName === config.android.name) { + continue; + } + else if (platformName === config.web.name) { + continue; + } + else { + throw `Platform ${platformName} is not valid.`; + } + } + return checks; +} +exports.updateChecks = updateChecks; +async function update(config, platformName, deployment) { + await (0, common_1.runTask)(colors_1.default.success(colors_1.default.strong(`update ${platformName}`)), async () => { + await (0, common_1.runHooks)(config, platformName, config.app.rootDir, 'capacitor:update:before'); + if (platformName === config.ios.name) { + await (0, update_2.updateIOS)(config, deployment); + } + else if (platformName === config.android.name) { + await (0, update_1.updateAndroid)(config); + } + await (0, common_1.runHooks)(config, platformName, config.app.rootDir, 'capacitor:update:after'); + }); +} +exports.update = update; diff --git a/@capacitor/cli/dist/telemetry.js b/@capacitor/cli/dist/telemetry.js new file mode 100644 index 00000000..e156222b --- /dev/null +++ b/@capacitor/cli/dist/telemetry.js @@ -0,0 +1,130 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.sendMetric = exports.telemetryAction = exports.THANK_YOU = void 0; +const tslib_1 = require("tslib"); +const commander_1 = require("commander"); +const debug_1 = tslib_1.__importDefault(require("debug")); +const colors_1 = tslib_1.__importDefault(require("./colors")); +const ipc_1 = require("./ipc"); +const log_1 = require("./log"); +const sysconfig_1 = require("./sysconfig"); +const subprocess_1 = require("./util/subprocess"); +const term_1 = require("./util/term"); +const debug = (0, debug_1.default)('capacitor:telemetry'); +exports.THANK_YOU = `\nThank you for helping to make Capacitor better! 💖` + + `\nInformation about the data we collect is available on our website: ${colors_1.default.strong('https://capacitorjs.com/telemetry')}\n`; +function telemetryAction(config, action) { + return async (...actionArgs) => { + const start = new Date(); + // This is how commanderjs works--the command object is either the last + // element or second to last if there are additional options (via `.allowUnknownOption()`) + const lastArg = actionArgs[actionArgs.length - 1]; + const cmd = lastArg instanceof commander_1.Command ? lastArg : actionArgs[actionArgs.length - 2]; + const command = getFullCommandName(cmd); + let error; + try { + await action(...actionArgs); + } + catch (e) { + error = e; + } + const end = new Date(); + const duration = end.getTime() - start.getTime(); + const packages = Object.entries({ + ...config.app.package.devDependencies, + ...config.app.package.dependencies, + }); + // Only collect packages in the capacitor org: + // https://www.npmjs.com/org/capacitor + const capacitorPackages = packages.filter(([k]) => k.startsWith('@capacitor/')); + const versions = capacitorPackages.map(([k, v]) => [ + `${k.replace(/^@capacitor\//, '').replace(/-/g, '_')}_version`, + v, + ]); + const data = { + app_id: await getAppIdentifier(config), + command, + arguments: cmd.args.join(' '), + options: JSON.stringify(cmd.opts()), + duration, + error: error ? (error.message ? error.message : String(error)) : null, + node_version: process.version, + os: config.cli.os, + ...Object.fromEntries(versions), + }; + if ((0, term_1.isInteractive)()) { + let sysconfig = await (0, sysconfig_1.readConfig)(); + if (!error && typeof sysconfig.telemetry === 'undefined') { + const confirm = await promptForTelemetry(); + sysconfig = { ...sysconfig, telemetry: confirm }; + await (0, sysconfig_1.writeConfig)(sysconfig); + } + await sendMetric(sysconfig, 'capacitor_cli_command', data); + } + if (error) { + throw error; + } + }; +} +exports.telemetryAction = telemetryAction; +/** + * If telemetry is enabled, send a metric via IPC to a forked process for uploading. + */ +async function sendMetric(sysconfig, name, data) { + if (sysconfig.telemetry && (0, term_1.isInteractive)()) { + const message = { + name, + timestamp: new Date().toISOString(), + session_id: sysconfig.machine, + source: 'capacitor_cli', + value: data, + }; + await (0, ipc_1.send)({ type: 'telemetry', data: message }); + } + else { + debug('Telemetry is off (user choice, non-interactive terminal, or CI)--not sending metric'); + } +} +exports.sendMetric = sendMetric; +async function promptForTelemetry() { + const { confirm } = await (0, log_1.logPrompt)(`${colors_1.default.strong('Would you like to help improve Capacitor by sharing anonymous usage data? 💖')}\n` + + `Read more about what is being collected and why here: ${colors_1.default.strong('https://capacitorjs.com/telemetry')}. You can change your mind at any time by using the ${colors_1.default.input('npx cap telemetry')} command.`, { + type: 'confirm', + name: 'confirm', + message: 'Share anonymous usage data?', + initial: true, + }); + if (confirm) { + log_1.output.write(exports.THANK_YOU); + } + return confirm; +} +/** + * Get a unique anonymous identifier for this app. + */ +async function getAppIdentifier(config) { + const { createHash } = await Promise.resolve().then(() => tslib_1.__importStar(require('crypto'))); + // get the first commit hash, which should be universally unique + const output = await (0, subprocess_1.getCommandOutput)('git', ['rev-list', '--max-parents=0', 'HEAD'], { cwd: config.app.rootDir }); + const firstLine = output === null || output === void 0 ? void 0 : output.split('\n')[0]; + if (!firstLine) { + debug('Could not obtain unique app identifier'); + return null; + } + // use sha1 to create a one-way hash to anonymize + const id = createHash('sha1').update(firstLine).digest('hex'); + return id; +} +/** + * Walk through the command's parent tree and construct a space-separated name. + * + * Probably overkill because we don't have nested commands, but whatever. + */ +function getFullCommandName(cmd) { + const names = []; + while (cmd.parent !== null) { + names.push(cmd.name()); + cmd = cmd.parent; + } + return names.reverse().join(' '); +} diff --git a/@capacitor/cli/dist/util/cli.js b/@capacitor/cli/dist/util/cli.js new file mode 100644 index 00000000..bedab983 --- /dev/null +++ b/@capacitor/cli/dist/util/cli.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.wrapAction = exports.ENV_PATHS = void 0; +const tslib_1 = require("tslib"); +const env_paths_1 = tslib_1.__importDefault(require("env-paths")); +const errors_1 = require("../errors"); +const log_1 = require("../log"); +exports.ENV_PATHS = (0, env_paths_1.default)('capacitor', { suffix: '' }); +function wrapAction(action) { + return async (...args) => { + try { + await action(...args); + } + catch (e) { + if ((0, errors_1.isFatal)(e)) { + process.exitCode = e.exitCode; + log_1.logger.error(e.message); + } + else { + throw e; + } + } + }; +} +exports.wrapAction = wrapAction; diff --git a/@capacitor/cli/dist/util/emoji.js b/@capacitor/cli/dist/util/emoji.js new file mode 100644 index 00000000..00a9dbc8 --- /dev/null +++ b/@capacitor/cli/dist/util/emoji.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.emoji = void 0; +// Emoji falback, right now just uses fallback on windows, +// but could expand to be more sophisticated to allow emoji +// on Hyper term on windows, for example. +const emoji = (x, fallback) => { + if (process.platform === 'win32') { + return fallback; + } + return x; +}; +exports.emoji = emoji; diff --git a/@capacitor/cli/dist/util/fn.js b/@capacitor/cli/dist/util/fn.js new file mode 100644 index 00000000..9c99b90e --- /dev/null +++ b/@capacitor/cli/dist/util/fn.js @@ -0,0 +1,13 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.tryFn = void 0; +const tryFn = async (fn, ...args) => { + try { + return await fn(...args); + } + catch { + // ignore + } + return null; +}; +exports.tryFn = tryFn; diff --git a/@capacitor/cli/dist/util/fs.js b/@capacitor/cli/dist/util/fs.js new file mode 100644 index 00000000..884e83e7 --- /dev/null +++ b/@capacitor/cli/dist/util/fs.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.deleteFolderRecursive = exports.convertToUnixPath = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const convertToUnixPath = (path) => { + return path.replace(/\\/g, '/'); +}; +exports.convertToUnixPath = convertToUnixPath; +const deleteFolderRecursive = (directoryPath) => { + if ((0, utils_fs_1.existsSync)(directoryPath)) { + (0, utils_fs_1.readdirSync)(directoryPath).forEach(file => { + const curPath = (0, path_1.join)(directoryPath, file); + if ((0, utils_fs_1.lstatSync)(curPath).isDirectory()) { + (0, exports.deleteFolderRecursive)(curPath); + } + else { + (0, utils_fs_1.unlinkSync)(curPath); + } + }); + (0, utils_fs_1.rmdirSync)(directoryPath); + } +}; +exports.deleteFolderRecursive = deleteFolderRecursive; diff --git a/@capacitor/cli/dist/util/iosplugin.js b/@capacitor/cli/dist/util/iosplugin.js new file mode 100644 index 00000000..71750fad --- /dev/null +++ b/@capacitor/cli/dist/util/iosplugin.js @@ -0,0 +1,66 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generateIOSPackageJSON = exports.writePluginJSON = exports.findPluginClasses = exports.getPluginFiles = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const cordova_1 = require("../cordova"); +const plugin_1 = require("../plugin"); +async function getPluginFiles(plugins) { + var _a; + let filenameList = []; + const options = { + filter: item => { + if (item.stats.isFile() && + (item.path.endsWith('.swift') || item.path.endsWith('.m'))) { + return true; + } + else { + return false; + } + }, + }; + for (const plugin of plugins) { + if (plugin.ios && (0, plugin_1.getPluginType)(plugin, 'ios') === 0 /* PluginType.Core */) { + const pluginPath = (0, path_1.resolve)(plugin.rootPath, (_a = plugin.ios) === null || _a === void 0 ? void 0 : _a.path); + const filenames = await (0, utils_fs_1.readdirp)(pluginPath, options); + filenameList = filenameList.concat(filenames); + } + } + return filenameList; +} +exports.getPluginFiles = getPluginFiles; +async function findPluginClasses(files) { + const classList = []; + for (const file of files) { + const fileData = (0, utils_fs_1.readFileSync)(file, 'utf-8'); + const swiftPluginRegex = RegExp(/@objc\(([A-Za-z0-9_-]+)\)/); + const objcPluginRegex = RegExp(/CAP_PLUGIN\(([A-Za-z0-9_-]+)/); + const swiftMatches = swiftPluginRegex.exec(fileData); + if ((swiftMatches === null || swiftMatches === void 0 ? void 0 : swiftMatches[1]) && !classList.includes(swiftMatches[1])) { + classList.push(swiftMatches[1]); + } + const objcMatches = objcPluginRegex.exec(fileData); + if ((objcMatches === null || objcMatches === void 0 ? void 0 : objcMatches[1]) && !classList.includes(objcMatches[1])) { + classList.push(objcMatches[1]); + } + } + return classList; +} +exports.findPluginClasses = findPluginClasses; +async function writePluginJSON(config, classList) { + const capJSONFile = (0, path_1.resolve)(config.ios.nativeTargetDirAbs, 'capacitor.config.json'); + const capJSON = (0, utils_fs_1.readJSONSync)(capJSONFile); + capJSON['packageClassList'] = classList; + (0, utils_fs_1.writeJSONSync)(capJSONFile, capJSON, { spaces: '\t' }); +} +exports.writePluginJSON = writePluginJSON; +async function generateIOSPackageJSON(config, plugins) { + const fileList = await getPluginFiles(plugins); + const classList = await findPluginClasses(fileList); + const cordovaPlugins = await (0, cordova_1.getCordovaPlugins)(config, 'ios'); + if (cordovaPlugins.length > 0) { + classList.push('CDVPlugin'); + } + writePluginJSON(config, classList); +} +exports.generateIOSPackageJSON = generateIOSPackageJSON; diff --git a/@capacitor/cli/dist/util/js.js b/@capacitor/cli/dist/util/js.js new file mode 100644 index 00000000..ceabcda1 --- /dev/null +++ b/@capacitor/cli/dist/util/js.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatJSObject = void 0; +const tslib_1 = require("tslib"); +const util_1 = tslib_1.__importDefault(require("util")); +function formatJSObject(o) { + try { + o = JSON.parse(JSON.stringify(o)); + } + catch (e) { + throw new Error(`Cannot parse object as JSON: ${e.stack ? e.stack : e}`); + } + return util_1.default.inspect(o, { + compact: false, + breakLength: Infinity, + depth: Infinity, + maxArrayLength: Infinity, + maxStringLength: Infinity, + }); +} +exports.formatJSObject = formatJSObject; diff --git a/@capacitor/cli/dist/util/livereload.js b/@capacitor/cli/dist/util/livereload.js new file mode 100644 index 00000000..d017d94f --- /dev/null +++ b/@capacitor/cli/dist/util/livereload.js @@ -0,0 +1,151 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CapLiveReloadHelper = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const os_1 = require("os"); +const path_1 = require("path"); +class CapLiveReload { + constructor() { + this.configJsonToRevertTo = { + json: null, + platformPath: null, + }; + // nothing to do + } + getIpAddress(name, family) { + var _a; + const interfaces = (_a = (0, os_1.networkInterfaces)()) !== null && _a !== void 0 ? _a : {}; + const _normalizeFamily = (family) => { + if (family === 4) { + return 'ipv4'; + } + if (family === 6) { + return 'ipv6'; + } + return family ? family.toLowerCase() : 'ipv4'; + }; + const isLoopback = (addr) => { + return (/^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})/.test(addr) || + /^fe80::1$/.test(addr) || + /^::1$/.test(addr) || + /^::$/.test(addr)); + }; + const isPrivate = (addr) => { + return (/^(::f{4}:)?10\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^(::f{4}:)?192\.168\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^(::f{4}:)?172\.(1[6-9]|2\d|30|31)\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^(::f{4}:)?127\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^(::f{4}:)?169\.254\.([0-9]{1,3})\.([0-9]{1,3})$/i.test(addr) || + /^f[cd][0-9a-f]{2}:/i.test(addr) || + /^fe80:/i.test(addr) || + /^::1$/.test(addr) || + /^::$/.test(addr)); + }; + const isPublic = (addr) => { + return !isPrivate(addr); + }; + const loopback = (family) => { + // + // Default to `ipv4` + // + family = _normalizeFamily(family); + if (family !== 'ipv4' && family !== 'ipv6') { + throw new Error('family must be ipv4 or ipv6'); + } + return family === 'ipv4' ? '127.0.0.1' : 'fe80::1'; + }; + // + // Default to `ipv4` + // + family = _normalizeFamily(family); + // + // If a specific network interface has been named, + // return the address. + // + if (name && name !== 'private' && name !== 'public') { + const res = interfaces[name].filter((details) => { + const itemFamily = _normalizeFamily(details.family); + return itemFamily === family; + }); + if (res.length === 0) { + return undefined; + } + return res[0].address; + } + const all = Object.keys(interfaces) + .map(nic => { + // + // Note: name will only be `public` or `private` + // when this is called. + // + const addresses = interfaces[nic].filter((details) => { + details.family = _normalizeFamily(details.family); + if (details.family !== family || isLoopback(details.address)) { + return false; + } + if (!name) { + return true; + } + return name === 'public' + ? isPrivate(details.address) + : isPublic(details.address); + }); + return addresses.length ? addresses[0].address : undefined; + }) + .filter(Boolean); + return !all.length ? loopback(family) : all[0]; + } + // TODO remove on next major as it's unused + async editExtConfigForLiveReload(config, platformName, options, rootConfigChange = false) { + const platformAbsPath = platformName == config.ios.name + ? config.ios.nativeTargetDirAbs + : platformName == config.android.name + ? config.android.assetsDirAbs + : null; + if (platformAbsPath == null) + throw new Error('Platform not found.'); + const capConfigPath = rootConfigChange + ? config.app.extConfigFilePath + : (0, path_1.join)(platformAbsPath, 'capacitor.config.json'); + const configJson = { ...config.app.extConfig }; + this.configJsonToRevertTo.json = JSON.stringify(configJson, null, 2); + this.configJsonToRevertTo.platformPath = capConfigPath; + const url = `http://${options.host}:${options.port}`; + configJson.server = { + url, + }; + return configJson; + } + // TODO remove rootConfigChange param on next major as it's unused + async editCapConfigForLiveReload(config, platformName, options, rootConfigChange = false) { + const platformAbsPath = platformName == config.ios.name + ? config.ios.nativeTargetDirAbs + : platformName == config.android.name + ? config.android.assetsDirAbs + : null; + if (platformAbsPath == null) + throw new Error('Platform not found.'); + const capConfigPath = rootConfigChange + ? config.app.extConfigFilePath + : (0, path_1.join)(platformAbsPath, 'capacitor.config.json'); + const configJson = (0, utils_fs_1.readJSONSync)(capConfigPath); + this.configJsonToRevertTo.json = JSON.stringify(configJson, null, 2); + this.configJsonToRevertTo.platformPath = capConfigPath; + const url = `http://${options.host}:${options.port}`; + configJson.server = { + url, + }; + (0, utils_fs_1.writeJSONSync)(capConfigPath, configJson, { spaces: '\t' }); + } + async revertCapConfigForLiveReload() { + if (this.configJsonToRevertTo.json == null || + this.configJsonToRevertTo.platformPath == null) + return; + const capConfigPath = this.configJsonToRevertTo.platformPath; + const configJson = this.configJsonToRevertTo.json; + (0, utils_fs_1.writeJSONSync)(capConfigPath, JSON.parse(configJson), { spaces: '\t' }); + this.configJsonToRevertTo.json = null; + this.configJsonToRevertTo.platformPath = null; + } +} +exports.CapLiveReloadHelper = new CapLiveReload(); diff --git a/@capacitor/cli/dist/util/monorepotools.js b/@capacitor/cli/dist/util/monorepotools.js new file mode 100644 index 00000000..038dfeee --- /dev/null +++ b/@capacitor/cli/dist/util/monorepotools.js @@ -0,0 +1,110 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isNXMonorepo = exports.isMonorepo = exports.findPackageRelativePathInMonorepo = exports.findPackagePath = exports.findNXMonorepoRoot = exports.findMonorepoRoot = void 0; +const node_fs_1 = require("node:fs"); +const node_path_1 = require("node:path"); +/** + * Finds the monorepo root from the given path. + * @param currentPath - The current path to start searching from. + * @returns The path to the monorepo root. + * @throws An error if the monorepo root is not found. + */ +function findMonorepoRoot(currentPath) { + const packageJsonPath = (0, node_path_1.join)(currentPath, 'package.json'); + const pnpmWorkspacePath = (0, node_path_1.join)(currentPath, 'pnpm-workspace.yaml'); + if ((0, node_fs_1.existsSync)(pnpmWorkspacePath) || + ((0, node_fs_1.existsSync)(packageJsonPath) && + JSON.parse((0, node_fs_1.readFileSync)(packageJsonPath, 'utf-8')).workspaces)) { + return currentPath; + } + const parentPath = (0, node_path_1.dirname)(currentPath); + if (parentPath === currentPath) { + throw new Error('Monorepo root not found'); + } + return findMonorepoRoot(parentPath); +} +exports.findMonorepoRoot = findMonorepoRoot; +/** + * Finds the NX monorepo root from the given path. + * @param currentPath - The current path to start searching from. + * @returns The path to the monorepo root. + * @throws An error if the monorepo root is not found. + */ +function findNXMonorepoRoot(currentPath) { + const nxJsonPath = (0, node_path_1.join)(currentPath, 'nx.json'); + if ((0, node_fs_1.existsSync)(nxJsonPath)) { + return currentPath; + } + const parentPath = (0, node_path_1.dirname)(currentPath); + if (parentPath === currentPath) { + throw new Error('Monorepo root not found'); + } + return findNXMonorepoRoot(parentPath); +} +exports.findNXMonorepoRoot = findNXMonorepoRoot; +/** + * Finds the path to a package within the node_modules folder, + * searching up the directory hierarchy until the last possible directory is reached. + * @param packageName - The name of the package to find. + * @param currentPath - The current path to start searching from. + * @param lastPossibleDirectory - The last possible directory to search for the package. + * @returns The path to the package, or null if not found. + */ +function findPackagePath(packageName, currentPath, lastPossibleDirectory) { + const nodeModulesPath = (0, node_path_1.join)(currentPath, 'node_modules', packageName); + if ((0, node_fs_1.existsSync)(nodeModulesPath)) { + return nodeModulesPath; + } + if (currentPath === lastPossibleDirectory) { + return null; + } + const parentPath = (0, node_path_1.dirname)(currentPath); + return findPackagePath(packageName, parentPath, lastPossibleDirectory); +} +exports.findPackagePath = findPackagePath; +/** + * Finds the relative path to a package from the current directory, + * using the monorepo root as the last possible directory. + * @param packageName - The name of the package to find. + * @param currentPath - The current path to start searching from. + * @returns The relative path to the package, or null if not found. + */ +function findPackageRelativePathInMonorepo(packageName, currentPath) { + const monorepoRoot = findMonorepoRoot(currentPath); + const packagePath = findPackagePath(packageName, currentPath, monorepoRoot); + if (packagePath) { + return (0, node_path_1.relative)(currentPath, packagePath); + } + return null; +} +exports.findPackageRelativePathInMonorepo = findPackageRelativePathInMonorepo; +/** + * Detects if the current directory is part of a monorepo (npm, yarn, pnpm). + * @param currentPath - The current path to start searching from. + * @returns True if the current directory is part of a monorepo, false otherwise. + */ +function isMonorepo(currentPath) { + try { + findMonorepoRoot(currentPath); + return true; + } + catch (error) { + return false; + } +} +exports.isMonorepo = isMonorepo; +/** + * Detects if the current directory is part of a nx integrated monorepo. + * @param currentPath - The current path to start searching from. + * @returns True if the current directory is part of a monorepo, false otherwise. + */ +function isNXMonorepo(currentPath) { + try { + findNXMonorepoRoot(currentPath); + return true; + } + catch (error) { + return false; + } +} +exports.isNXMonorepo = isNXMonorepo; diff --git a/@capacitor/cli/dist/util/native-run.js b/@capacitor/cli/dist/util/native-run.js new file mode 100644 index 00000000..4b6090bb --- /dev/null +++ b/@capacitor/cli/dist/util/native-run.js @@ -0,0 +1,53 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getPlatformTargets = exports.runNativeRun = void 0; +const tslib_1 = require("tslib"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const errors_1 = require("../errors"); +const node_1 = require("./node"); +const subprocess_1 = require("./subprocess"); +async function runNativeRun(args, options = {}) { + const p = (0, node_1.resolveNode)(__dirname, (0, path_1.dirname)('native-run/package'), 'bin/native-run'); + if (!p) { + (0, errors_1.fatal)(`${colors_1.default.input('native-run')} not found.`); + } + return await (0, subprocess_1.runCommand)(p, args, options); +} +exports.runNativeRun = runNativeRun; +async function getPlatformTargets(platformName) { + const errors = []; + try { + const output = await runNativeRun([platformName, '--list', '--json']); + const parsedOutput = JSON.parse(output); + if (parsedOutput.devices.length || parsedOutput.virtualDevices.length) { + return [ + ...parsedOutput.devices.map((t) => ({ ...t, virtual: false })), + ...parsedOutput.virtualDevices.map((t) => ({ + ...t, + virtual: true, + })), + ]; + } + else { + parsedOutput.errors.map((e) => { + errors.push(e); + }); + } + } + catch (e) { + const err = JSON.parse(e); + errors.push(err); + } + const plural = errors.length > 1 ? 's' : ''; + const errMsg = `${colors_1.default.strong('native-run')} failed with error${plural}\n + ${errors + .map((e) => { + return `\t${colors_1.default.strong(e.code)}: ${e.error}`; + }) + .join('\n')} + \n\tMore details for this error${plural} may be available online: ${colors_1.default.strong('https://github.com/ionic-team/native-run/wiki/Android-Errors')} + `; + throw errMsg; +} +exports.getPlatformTargets = getPlatformTargets; diff --git a/@capacitor/cli/dist/util/node.js b/@capacitor/cli/dist/util/node.js new file mode 100644 index 00000000..3701ce13 --- /dev/null +++ b/@capacitor/cli/dist/util/node.js @@ -0,0 +1,54 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.resolveNode = exports.requireTS = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const fs_1 = require("fs"); +const path_1 = require("path"); +/** + * @see https://github.com/ionic-team/stencil/blob/HEAD/src/compiler/sys/node-require.ts + */ +const requireTS = (ts, p) => { + const id = (0, path_1.resolve)(p); + delete require.cache[id]; + require.extensions['.ts'] = (module, fileName) => { + var _a; + let sourceText = (0, utils_fs_1.readFileSync)(fileName, 'utf8'); + if (fileName.endsWith('.ts')) { + const tsResults = ts.transpileModule(sourceText, { + fileName, + compilerOptions: { + module: ts.ModuleKind.CommonJS, + moduleResolution: ts.ModuleResolutionKind.NodeJs, + esModuleInterop: true, + strict: true, + target: ts.ScriptTarget.ES2017, + }, + reportDiagnostics: true, + }); + sourceText = tsResults.outputText; + } + else { + // quick hack to turn a modern es module + // into and old school commonjs module + sourceText = sourceText.replace(/export\s+\w+\s+(\w+)/gm, 'exports.$1'); + } + (_a = module._compile) === null || _a === void 0 ? void 0 : _a.call(module, sourceText, fileName); + }; + const m = require(id); // eslint-disable-line @typescript-eslint/no-var-requires + delete require.extensions['.ts']; + return m; +}; +exports.requireTS = requireTS; +function resolveNode(root, ...pathSegments) { + try { + return require.resolve(pathSegments.join('/'), { paths: [root] }); + } + catch (e) { + const path = [root, 'node_modules', ...pathSegments].join('/'); + if ((0, fs_1.existsSync)(path)) { + return path; + } + return null; + } +} +exports.resolveNode = resolveNode; diff --git a/@capacitor/cli/dist/util/promise.js b/@capacitor/cli/dist/util/promise.js new file mode 100644 index 00000000..05c86c67 --- /dev/null +++ b/@capacitor/cli/dist/util/promise.js @@ -0,0 +1,35 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.lazy = exports.LazyPromise = exports.allSerial = void 0; +function allSerial(funcs) { + return funcs.reduce((promise, func) => promise.then(result => func().then(x => result.concat(x))), Promise.resolve([])); +} +exports.allSerial = allSerial; +class LazyPromise extends Promise { + constructor(executor) { + super(() => { + /* ignore */ + }); + this._executor = executor; + } + then(onfulfilled, onrejected) { + this._promise = this._promise || new Promise(this._executor); + return this._promise.then(onfulfilled, onrejected); + } + catch(onrejected) { + this._promise = this._promise || new Promise(this._executor); + return this._promise.catch(onrejected); + } +} +exports.LazyPromise = LazyPromise; +function lazy(fn) { + return new LazyPromise(async (resolve, reject) => { + try { + resolve(await fn()); + } + catch (e) { + reject(e); + } + }); +} +exports.lazy = lazy; diff --git a/@capacitor/cli/dist/util/spm.js b/@capacitor/cli/dist/util/spm.js new file mode 100644 index 00000000..fec701df --- /dev/null +++ b/@capacitor/cli/dist/util/spm.js @@ -0,0 +1,73 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.generatePackageFile = exports.findPackageSwiftFile = exports.checkPackageManager = void 0; +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const log_1 = require("../log"); +async function checkPackageManager(config) { + const iosDirectory = config.ios.nativeProjectDirAbs; + if ((0, utils_fs_1.existsSync)((0, path_1.resolve)(iosDirectory, 'CapApp-SPM'))) { + return 'SPM'; + } + return 'Cocoapods'; +} +exports.checkPackageManager = checkPackageManager; +async function findPackageSwiftFile(config) { + const packageDirectory = (0, path_1.resolve)(config.ios.nativeProjectDirAbs, 'CapApp-SPM'); + return (0, path_1.resolve)(packageDirectory, 'Package.swift'); +} +exports.findPackageSwiftFile = findPackageSwiftFile; +async function generatePackageFile(config, plugins) { + const packageSwiftFile = await findPackageSwiftFile(config); + try { + log_1.logger.warn('SPM Support is still experimental'); + const textToWrite = generatePackageText(config, plugins); + (0, utils_fs_1.writeFileSync)(packageSwiftFile, textToWrite); + } + catch (err) { + log_1.logger.error(`Unable to write to ${packageSwiftFile}. Verify it is not already open. \n Error: ${err}`); + } +} +exports.generatePackageFile = generatePackageFile; +function generatePackageText(config, plugins) { + var _a, _b, _c; + const pbx = (0, utils_fs_1.readFileSync)((0, path_1.join)(config.ios.nativeXcodeProjDirAbs, 'project.pbxproj'), 'utf-8'); + const searchString = 'IPHONEOS_DEPLOYMENT_TARGET = '; + const iosVersion = pbx.substring(pbx.indexOf(searchString) + searchString.length, pbx.indexOf(searchString) + searchString.length + 2); + let packageSwiftText = `// swift-tools-version: 5.9 +import PackageDescription + +// DO NOT MODIFY THIS FILE - managed by Capacitor CLI commands +let package = Package( + name: "CapApp-SPM", + platforms: [.iOS(.v${iosVersion})], + products: [ + .library( + name: "CapApp-SPM", + targets: ["CapApp-SPM"]) + ], + dependencies: [ + .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", branch: "main")`; + for (const plugin of plugins) { + const relPath = (0, path_1.relative)(config.ios.nativeXcodeProjDirAbs, plugin.rootPath); + packageSwiftText += `,\n .package(name: "${(_a = plugin.ios) === null || _a === void 0 ? void 0 : _a.name}", path: "${relPath}")`; + } + packageSwiftText += ` + ], + targets: [ + .target( + name: "CapApp-SPM", + dependencies: [ + .product(name: "Capacitor", package: "capacitor-swift-pm"), + .product(name: "Cordova", package: "capacitor-swift-pm")`; + for (const plugin of plugins) { + packageSwiftText += `,\n .product(name: "${(_b = plugin.ios) === null || _b === void 0 ? void 0 : _b.name}", package: "${(_c = plugin.ios) === null || _c === void 0 ? void 0 : _c.name}")`; + } + packageSwiftText += ` + ] + ) + ] +) +`; + return packageSwiftText; +} diff --git a/@capacitor/cli/dist/util/subprocess.js b/@capacitor/cli/dist/util/subprocess.js new file mode 100644 index 00000000..7c5d46fa --- /dev/null +++ b/@capacitor/cli/dist/util/subprocess.js @@ -0,0 +1,43 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isInstalled = exports.getCommandOutput = exports.runCommand = void 0; +const utils_subprocess_1 = require("@ionic/utils-subprocess"); +async function runCommand(command, args, options = {}) { + const p = new utils_subprocess_1.Subprocess(command, args, options); + try { + return await p.output(); + } + catch (e) { + if (e instanceof utils_subprocess_1.SubprocessError) { + // old behavior of just throwing the stdout/stderr strings + throw e.output + ? e.output + : e.code + ? e.code + : e.error + ? e.error.message + : 'Unknown error'; + } + throw e; + } +} +exports.runCommand = runCommand; +async function getCommandOutput(command, args, options = {}) { + try { + return (await runCommand(command, args, options)).trim(); + } + catch (e) { + return null; + } +} +exports.getCommandOutput = getCommandOutput; +async function isInstalled(command) { + try { + await (0, utils_subprocess_1.which)(command); + } + catch (e) { + return false; + } + return true; +} +exports.isInstalled = isInstalled; diff --git a/@capacitor/cli/dist/util/template.js b/@capacitor/cli/dist/util/template.js new file mode 100644 index 00000000..5d41a32d --- /dev/null +++ b/@capacitor/cli/dist/util/template.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.extractTemplate = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const tar_1 = tslib_1.__importDefault(require("tar")); +async function extractTemplate(src, dir) { + await (0, utils_fs_1.mkdirp)(dir); + await tar_1.default.extract({ file: src, cwd: dir }); +} +exports.extractTemplate = extractTemplate; diff --git a/@capacitor/cli/dist/util/term.js b/@capacitor/cli/dist/util/term.js new file mode 100644 index 00000000..71988b67 --- /dev/null +++ b/@capacitor/cli/dist/util/term.js @@ -0,0 +1,30 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isInteractive = exports.checkInteractive = void 0; +const tslib_1 = require("tslib"); +const utils_terminal_1 = require("@ionic/utils-terminal"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const log_1 = require("../log"); +// Given input variables to a command, make sure all are provided if the terminal +// is not interactive (because we won't be able to prompt the user) +const checkInteractive = (...args) => { + if ((0, exports.isInteractive)()) { + return true; + } + // Fail if no args are provided, treat this as just a check of whether the term is + // interactive or not. + if (!args.length) { + return false; + } + // Make sure none of the provided args are empty, otherwise print the interactive + // warning and return false + if (args.filter(arg => !arg).length) { + log_1.logger.error(`Non-interactive shell detected.\n` + + `Run the command with ${colors_1.default.input('--help')} to see a list of arguments that must be provided.`); + return false; + } + return true; +}; +exports.checkInteractive = checkInteractive; +const isInteractive = () => utils_terminal_1.TERMINAL_INFO.tty && !utils_terminal_1.TERMINAL_INFO.ci; +exports.isInteractive = isInteractive; diff --git a/@capacitor/cli/dist/util/uuid.js b/@capacitor/cli/dist/util/uuid.js new file mode 100644 index 00000000..5391cb82 --- /dev/null +++ b/@capacitor/cli/dist/util/uuid.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.uuidv4 = void 0; +function uuidv4() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => { + const r = (Math.random() * 16) | 0; + const v = c == 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +} +exports.uuidv4 = uuidv4; diff --git a/@capacitor/cli/dist/util/xml.js b/@capacitor/cli/dist/util/xml.js new file mode 100644 index 00000000..1748bfe8 --- /dev/null +++ b/@capacitor/cli/dist/util/xml.js @@ -0,0 +1,57 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.buildXmlElement = exports.writeXML = exports.parseXML = exports.readXML = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const xml2js_1 = tslib_1.__importDefault(require("xml2js")); +async function readXML(path) { + var _a; + try { + const xmlStr = await (0, utils_fs_1.readFile)(path, { encoding: 'utf-8' }); + try { + return await xml2js_1.default.parseStringPromise(xmlStr); + } + catch (e) { + throw `Error parsing: ${path}, ${(_a = e.stack) !== null && _a !== void 0 ? _a : e}`; + } + } + catch (e) { + throw `Unable to read: ${path}`; + } +} +exports.readXML = readXML; +function parseXML(xmlStr, options) { + const parser = options !== undefined + ? new xml2js_1.default.Parser({ ...options }) + : new xml2js_1.default.Parser(); + let xmlObj; + parser.parseString(xmlStr, (err, result) => { + if (!err) { + xmlObj = result; + } + }); + return xmlObj; +} +exports.parseXML = parseXML; +async function writeXML(object) { + return new Promise(resolve => { + const builder = new xml2js_1.default.Builder({ + headless: true, + explicitRoot: false, + rootName: 'deleteme', + }); + let xml = builder.buildObject(object); + xml = xml.replace('', '').replace('', ''); + resolve(xml); + }); +} +exports.writeXML = writeXML; +function buildXmlElement(configElement, rootName) { + const builder = new xml2js_1.default.Builder({ + headless: true, + explicitRoot: false, + rootName: rootName, + }); + return builder.buildObject(configElement); +} +exports.buildXmlElement = buildXmlElement; diff --git a/@capacitor/cli/dist/web/copy.js b/@capacitor/cli/dist/web/copy.js new file mode 100644 index 00000000..d815005b --- /dev/null +++ b/@capacitor/cli/dist/web/copy.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.copyWeb = void 0; +const tslib_1 = require("tslib"); +const utils_fs_1 = require("@ionic/utils-fs"); +const path_1 = require("path"); +const colors_1 = tslib_1.__importDefault(require("../colors")); +const common_1 = require("../common"); +const errors_1 = require("../errors"); +const node_1 = require("../util/node"); +async function copyWeb(config) { + if (config.app.bundledWebRuntime) { + const runtimePath = (0, node_1.resolveNode)(config.app.rootDir, '@capacitor/core', 'dist', 'capacitor.js'); + if (!runtimePath) { + (0, errors_1.fatal)(`Unable to find ${colors_1.default.strong('node_modules/@capacitor/core/dist/capacitor.js')}.\n` + `Are you sure ${colors_1.default.strong('@capacitor/core')} is installed?`); + } + return (0, common_1.runTask)(`Copying ${colors_1.default.strong('capacitor.js')} to web dir`, () => { + return (0, utils_fs_1.copy)(runtimePath, (0, path_1.join)(config.app.webDirAbs, 'capacitor.js')); + }); + } +} +exports.copyWeb = copyWeb; diff --git a/@capacitor/cli/node_modules/.bin/rimraf b/@capacitor/cli/node_modules/.bin/rimraf new file mode 120000 index 00000000..3445a8a7 --- /dev/null +++ b/@capacitor/cli/node_modules/.bin/rimraf @@ -0,0 +1 @@ +../rimraf/dist/cjs/src/bin.js \ No newline at end of file diff --git a/@capacitor/cli/node_modules/.bin/semver b/@capacitor/cli/node_modules/.bin/semver new file mode 120000 index 00000000..5aaadf42 --- /dev/null +++ b/@capacitor/cli/node_modules/.bin/semver @@ -0,0 +1 @@ +../semver/bin/semver.js \ No newline at end of file diff --git a/@capacitor/cli/node_modules/brace-expansion/.github/FUNDING.yml b/@capacitor/cli/node_modules/brace-expansion/.github/FUNDING.yml new file mode 100644 index 00000000..79d1eafc --- /dev/null +++ b/@capacitor/cli/node_modules/brace-expansion/.github/FUNDING.yml @@ -0,0 +1,2 @@ +tidelift: "npm/brace-expansion" +patreon: juliangruber diff --git a/@capacitor/cli/node_modules/brace-expansion/LICENSE b/@capacitor/cli/node_modules/brace-expansion/LICENSE new file mode 100644 index 00000000..de322667 --- /dev/null +++ b/@capacitor/cli/node_modules/brace-expansion/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2013 Julian Gruber + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/@capacitor/cli/node_modules/brace-expansion/README.md b/@capacitor/cli/node_modules/brace-expansion/README.md new file mode 100644 index 00000000..e55c583d --- /dev/null +++ b/@capacitor/cli/node_modules/brace-expansion/README.md @@ -0,0 +1,135 @@ +# brace-expansion + +[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), +as known from sh/bash, in JavaScript. + +[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion) +[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion) +[![Greenkeeper badge](https://badges.greenkeeper.io/juliangruber/brace-expansion.svg)](https://greenkeeper.io/) + +[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion) + +## Example + +```js +var expand = require('brace-expansion'); + +expand('file-{a,b,c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('-v{,,}') +// => ['-v', '-v', '-v'] + +expand('file{0..2}.jpg') +// => ['file0.jpg', 'file1.jpg', 'file2.jpg'] + +expand('file-{a..c}.jpg') +// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg'] + +expand('file{2..0}.jpg') +// => ['file2.jpg', 'file1.jpg', 'file0.jpg'] + +expand('file{0..4..2}.jpg') +// => ['file0.jpg', 'file2.jpg', 'file4.jpg'] + +expand('file-{a..e..2}.jpg') +// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg'] + +expand('file{00..10..5}.jpg') +// => ['file00.jpg', 'file05.jpg', 'file10.jpg'] + +expand('{{A..C},{a..c}}') +// => ['A', 'B', 'C', 'a', 'b', 'c'] + +expand('ppp{,config,oe{,conf}}') +// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf'] +``` + +## API + +```js +var expand = require('brace-expansion'); +``` + +### var expanded = expand(str) + +Return an array of all possible and valid expansions of `str`. If none are +found, `[str]` is returned. + +Valid expansions are: + +```js +/^(.*,)+(.+)?$/ +// {a,b,...} +``` + +A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +A numeric sequence from `x` to `y` inclusive, with optional increment. +If `x` or `y` start with a leading `0`, all the numbers will be padded +to have equal length. Negative numbers and backwards iteration work too. + +```js +/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/ +// {x..y[..incr]} +``` + +An alphabetic sequence from `x` to `y` inclusive, with optional increment. +`x` and `y` must be exactly one character, and if given, `incr` must be a +number. + +For compatibility reasons, the string `${` is not eligible for brace expansion. + +## Installation + +With [npm](https://npmjs.org) do: + +```bash +npm install brace-expansion +``` + +## Contributors + +- [Julian Gruber](https://github.com/juliangruber) +- [Isaac Z. Schlueter](https://github.com/isaacs) + +## Sponsors + +This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)! + +Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)! + +## Security contact information + +To report a security vulnerability, please use the +[Tidelift security contact](https://tidelift.com/security). +Tidelift will coordinate the fix and disclosure. + +## License + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/@capacitor/cli/node_modules/brace-expansion/index.js b/@capacitor/cli/node_modules/brace-expansion/index.js new file mode 100644 index 00000000..4af9ddee --- /dev/null +++ b/@capacitor/cli/node_modules/brace-expansion/index.js @@ -0,0 +1,203 @@ +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m) return [str]; + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + if (/\$$/.test(m.pre)) { + for (var k = 0; k < post.length; k++) { + var expansion = pre+ '{' + m.body + '}' + post[k]; + expansions.push(expansion); + } + } else { + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = []; + + for (var j = 0; j < n.length; j++) { + N.push.apply(N, expand(n[j], false)); + } + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + } + + return expansions; +} + diff --git a/@capacitor/cli/node_modules/brace-expansion/package.json b/@capacitor/cli/node_modules/brace-expansion/package.json new file mode 100644 index 00000000..7097d41e --- /dev/null +++ b/@capacitor/cli/node_modules/brace-expansion/package.json @@ -0,0 +1,46 @@ +{ + "name": "brace-expansion", + "description": "Brace expansion as known from sh/bash", + "version": "2.0.1", + "repository": { + "type": "git", + "url": "git://github.com/juliangruber/brace-expansion.git" + }, + "homepage": "https://github.com/juliangruber/brace-expansion", + "main": "index.js", + "scripts": { + "test": "tape test/*.js", + "gentest": "bash test/generate.sh", + "bench": "matcha test/perf/bench.js" + }, + "dependencies": { + "balanced-match": "^1.0.0" + }, + "devDependencies": { + "@c4312/matcha": "^1.3.1", + "tape": "^4.6.0" + }, + "keywords": [], + "author": { + "name": "Julian Gruber", + "email": "mail@juliangruber.com", + "url": "http://juliangruber.com" + }, + "license": "MIT", + "testling": { + "files": "test/*.js", + "browsers": [ + "ie/8..latest", + "firefox/20..latest", + "firefox/nightly", + "chrome/25..latest", + "chrome/canary", + "opera/12..latest", + "opera/next", + "safari/5.1..latest", + "ipad/6.0..latest", + "iphone/6.0..latest", + "android-browser/4.2..latest" + ] + } +} diff --git a/@capacitor/cli/node_modules/commander/LICENSE b/@capacitor/cli/node_modules/commander/LICENSE new file mode 100644 index 00000000..10f997ab --- /dev/null +++ b/@capacitor/cli/node_modules/commander/LICENSE @@ -0,0 +1,22 @@ +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/@capacitor/cli/node_modules/commander/Readme.md b/@capacitor/cli/node_modules/commander/Readme.md new file mode 100644 index 00000000..ed19cff6 --- /dev/null +++ b/@capacitor/cli/node_modules/commander/Readme.md @@ -0,0 +1,1129 @@ +# Commander.js + +[![Build Status](https://github.com/tj/commander.js/workflows/build/badge.svg)](https://github.com/tj/commander.js/actions?query=workflow%3A%22build%22) +[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander) +[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://npmcharts.com/compare/commander?minimal=true) +[![Install Size](https://packagephobia.now.sh/badge?p=commander)](https://packagephobia.now.sh/result?p=commander) + +The complete solution for [node.js](http://nodejs.org) command-line interfaces. + +Read this in other languages: English | [简体中文](./Readme_zh-CN.md) + +- [Commander.js](#commanderjs) + - [Installation](#installation) + - [Quick Start](#quick-start) + - [Declaring _program_ variable](#declaring-program-variable) + - [Options](#options) + - [Common option types, boolean and value](#common-option-types-boolean-and-value) + - [Default option value](#default-option-value) + - [Other option types, negatable boolean and boolean|value](#other-option-types-negatable-boolean-and-booleanvalue) + - [Required option](#required-option) + - [Variadic option](#variadic-option) + - [Version option](#version-option) + - [More configuration](#more-configuration) + - [Custom option processing](#custom-option-processing) + - [Commands](#commands) + - [Command-arguments](#command-arguments) + - [More configuration](#more-configuration-1) + - [Custom argument processing](#custom-argument-processing) + - [Action handler](#action-handler) + - [Stand-alone executable (sub)commands](#stand-alone-executable-subcommands) + - [Life cycle hooks](#life-cycle-hooks) + - [Automated help](#automated-help) + - [Custom help](#custom-help) + - [Display help after errors](#display-help-after-errors) + - [Display help from code](#display-help-from-code) + - [.name](#name) + - [.usage](#usage) + - [.description and .summary](#description-and-summary) + - [.helpOption(flags, description)](#helpoptionflags-description) + - [.addHelpCommand()](#addhelpcommand) + - [More configuration](#more-configuration-2) + - [Custom event listeners](#custom-event-listeners) + - [Bits and pieces](#bits-and-pieces) + - [.parse() and .parseAsync()](#parse-and-parseasync) + - [Parsing Configuration](#parsing-configuration) + - [Legacy options as properties](#legacy-options-as-properties) + - [TypeScript](#typescript) + - [createCommand()](#createcommand) + - [Node options such as `--harmony`](#node-options-such-as---harmony) + - [Debugging stand-alone executable subcommands](#debugging-stand-alone-executable-subcommands) + - [Display error](#display-error) + - [Override exit and output handling](#override-exit-and-output-handling) + - [Additional documentation](#additional-documentation) + - [Support](#support) + - [Commander for enterprise](#commander-for-enterprise) + +For information about terms used in this document see: [terminology](./docs/terminology.md) + +## Installation + +```sh +npm install commander +``` + +## Quick Start + +You write code to describe your command line interface. +Commander looks after parsing the arguments into options and command-arguments, +displays usage errors for problems, and implements a help system. + +Commander is strict and displays an error for unrecognised options. +The two most used option types are a boolean option, and an option which takes its value from the following argument. + +Example file: [split.js](./examples/split.js) + +```js +const { program } = require('commander'); + +program + .option('--first') + .option('-s, --separator '); + +program.parse(); + +const options = program.opts(); +const limit = options.first ? 1 : undefined; +console.log(program.args[0].split(options.separator, limit)); +``` + +```console +$ node split.js -s / --fits a/b/c +error: unknown option '--fits' +(Did you mean --first?) +$ node split.js -s / --first a/b/c +[ 'a' ] +``` + +Here is a more complete program using a subcommand and with descriptions for the help. In a multi-command program, you have an action handler for each command (or stand-alone executables for the commands). + +Example file: [string-util.js](./examples/string-util.js) + +```js +const { Command } = require('commander'); +const program = new Command(); + +program + .name('string-util') + .description('CLI to some JavaScript string utilities') + .version('0.8.0'); + +program.command('split') + .description('Split a string into substrings and display as an array') + .argument('', 'string to split') + .option('--first', 'display just the first substring') + .option('-s, --separator ', 'separator character', ',') + .action((str, options) => { + const limit = options.first ? 1 : undefined; + console.log(str.split(options.separator, limit)); + }); + +program.parse(); +``` + +```console +$ node string-util.js help split +Usage: string-util split [options] + +Split a string into substrings and display as an array. + +Arguments: + string string to split + +Options: + --first display just the first substring + -s, --separator separator character (default: ",") + -h, --help display help for command + +$ node string-util.js split --separator=/ a/b/c +[ 'a', 'b', 'c' ] +``` + +More samples can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory. + +## Declaring _program_ variable + +Commander exports a global object which is convenient for quick programs. +This is used in the examples in this README for brevity. + +```js +// CommonJS (.cjs) +const { program } = require('commander'); +``` + +For larger programs which may use commander in multiple ways, including unit testing, it is better to create a local Command object to use. + +```js +// CommonJS (.cjs) +const { Command } = require('commander'); +const program = new Command(); +``` + +```js +// ECMAScript (.mjs) +import { Command } from 'commander'; +const program = new Command(); +``` + +```ts +// TypeScript (.ts) +import { Command } from 'commander'; +const program = new Command(); +``` + +## Options + +Options are defined with the `.option()` method, also serving as documentation for the options. Each option can have a short flag (single character) and a long name, separated by a comma or space or vertical bar ('|'). + +The parsed options can be accessed by calling `.opts()` on a `Command` object, and are passed to the action handler. + +Multi-word options such as "--template-engine" are camel-cased, becoming `program.opts().templateEngine` etc. + +An option and its option-argument can be separated by a space, or combined into the same argument. The option-argument can follow the short option directly or follow an `=` for a long option. + +```sh +serve -p 80 +serve -p80 +serve --port 80 +serve --port=80 +``` + +You can use `--` to indicate the end of the options, and any remaining arguments will be used without being interpreted. + +By default options on the command line are not positional, and can be specified before or after other arguments. + +There are additional related routines for when `.opts()` is not enough: + +- `.optsWithGlobals()` returns merged local and global option values +- `.getOptionValue()` and `.setOptionValue()` work with a single option value +- `.getOptionValueSource()` and `.setOptionValueWithSource()` include where the option value came from + +### Common option types, boolean and value + +The two most used option types are a boolean option, and an option which takes its value +from the following argument (declared with angle brackets like `--expect `). Both are `undefined` unless specified on command line. + +Example file: [options-common.js](./examples/options-common.js) + +```js +program + .option('-d, --debug', 'output extra debugging') + .option('-s, --small', 'small pizza size') + .option('-p, --pizza-type ', 'flavour of pizza'); + +program.parse(process.argv); + +const options = program.opts(); +if (options.debug) console.log(options); +console.log('pizza details:'); +if (options.small) console.log('- small pizza size'); +if (options.pizzaType) console.log(`- ${options.pizzaType}`); +``` + +```console +$ pizza-options -p +error: option '-p, --pizza-type ' argument missing +$ pizza-options -d -s -p vegetarian +{ debug: true, small: true, pizzaType: 'vegetarian' } +pizza details: +- small pizza size +- vegetarian +$ pizza-options --pizza-type=cheese +pizza details: +- cheese +``` + +Multiple boolean short options may be combined together following the dash, and may be followed by a single short option taking a value. +For example `-d -s -p cheese` may be written as `-ds -p cheese` or even `-dsp cheese`. + +Options with an expected option-argument are greedy and will consume the following argument whatever the value. +So `--id -xyz` reads `-xyz` as the option-argument. + +`program.parse(arguments)` processes the arguments, leaving any args not consumed by the program options in the `program.args` array. The parameter is optional and defaults to `process.argv`. + +### Default option value + +You can specify a default value for an option. + +Example file: [options-defaults.js](./examples/options-defaults.js) + +```js +program + .option('-c, --cheese ', 'add the specified type of cheese', 'blue'); + +program.parse(); + +console.log(`cheese: ${program.opts().cheese}`); +``` + +```console +$ pizza-options +cheese: blue +$ pizza-options --cheese stilton +cheese: stilton +``` + +### Other option types, negatable boolean and boolean|value + +You can define a boolean option long name with a leading `no-` to set the option value to false when used. +Defined alone this also makes the option true by default. + +If you define `--foo` first, adding `--no-foo` does not change the default value from what it would +otherwise be. + +Example file: [options-negatable.js](./examples/options-negatable.js) + +```js +program + .option('--no-sauce', 'Remove sauce') + .option('--cheese ', 'cheese flavour', 'mozzarella') + .option('--no-cheese', 'plain with no cheese') + .parse(); + +const options = program.opts(); +const sauceStr = options.sauce ? 'sauce' : 'no sauce'; +const cheeseStr = (options.cheese === false) ? 'no cheese' : `${options.cheese} cheese`; +console.log(`You ordered a pizza with ${sauceStr} and ${cheeseStr}`); +``` + +```console +$ pizza-options +You ordered a pizza with sauce and mozzarella cheese +$ pizza-options --sauce +error: unknown option '--sauce' +$ pizza-options --cheese=blue +You ordered a pizza with sauce and blue cheese +$ pizza-options --no-sauce --no-cheese +You ordered a pizza with no sauce and no cheese +``` + +You can specify an option which may be used as a boolean option but may optionally take an option-argument +(declared with square brackets like `--optional [value]`). + +Example file: [options-boolean-or-value.js](./examples/options-boolean-or-value.js) + +```js +program + .option('-c, --cheese [type]', 'Add cheese with optional type'); + +program.parse(process.argv); + +const options = program.opts(); +if (options.cheese === undefined) console.log('no cheese'); +else if (options.cheese === true) console.log('add cheese'); +else console.log(`add cheese type ${options.cheese}`); +``` + +```console +$ pizza-options +no cheese +$ pizza-options --cheese +add cheese +$ pizza-options --cheese mozzarella +add cheese type mozzarella +``` + +Options with an optional option-argument are not greedy and will ignore arguments starting with a dash. +So `id` behaves as a boolean option for `--id -5`, but you can use a combined form if needed like `--id=-5`. + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md). + +### Required option + +You may specify a required (mandatory) option using `.requiredOption()`. The option must have a value after parsing, usually specified on the command line, or perhaps from a default value (say from environment). The method is otherwise the same as `.option()` in format, taking flags and description, and optional default value or custom processing. + +Example file: [options-required.js](./examples/options-required.js) + +```js +program + .requiredOption('-c, --cheese ', 'pizza must have cheese'); + +program.parse(); +``` + +```console +$ pizza +error: required option '-c, --cheese ' not specified +``` + +### Variadic option + +You may make an option variadic by appending `...` to the value placeholder when declaring the option. On the command line you +can then specify multiple option-arguments, and the parsed option value will be an array. The extra arguments +are read until the first argument starting with a dash. The special argument `--` stops option processing entirely. If a value +is specified in the same argument as the option then no further values are read. + +Example file: [options-variadic.js](./examples/options-variadic.js) + +```js +program + .option('-n, --number ', 'specify numbers') + .option('-l, --letter [letters...]', 'specify letters'); + +program.parse(); + +console.log('Options: ', program.opts()); +console.log('Remaining arguments: ', program.args); +``` + +```console +$ collect -n 1 2 3 --letter a b c +Options: { number: [ '1', '2', '3' ], letter: [ 'a', 'b', 'c' ] } +Remaining arguments: [] +$ collect --letter=A -n80 operand +Options: { number: [ '80' ], letter: [ 'A' ] } +Remaining arguments: [ 'operand' ] +$ collect --letter -n 1 -n 2 3 -- operand +Options: { number: [ '1', '2', '3' ], letter: true } +Remaining arguments: [ 'operand' ] +``` + +For information about possible ambiguous cases, see [options taking varying arguments](./docs/options-taking-varying-arguments.md). + +### Version option + +The optional `version` method adds handling for displaying the command version. The default option flags are `-V` and `--version`, and when present the command prints the version number and exits. + +```js +program.version('0.0.1'); +``` + +```console +$ ./examples/pizza -V +0.0.1 +``` + +You may change the flags and description by passing additional parameters to the `version` method, using +the same syntax for flags as the `option` method. + +```js +program.version('0.0.1', '-v, --vers', 'output the current version'); +``` + +### More configuration + +You can add most options using the `.option()` method, but there are some additional features available +by constructing an `Option` explicitly for less common cases. + +Example files: [options-extra.js](./examples/options-extra.js), [options-env.js](./examples/options-env.js), [options-conflicts.js](./examples/options-conflicts.js), [options-implies.js](./examples/options-implies.js) + +```js +program + .addOption(new Option('-s, --secret').hideHelp()) + .addOption(new Option('-t, --timeout ', 'timeout in seconds').default(60, 'one minute')) + .addOption(new Option('-d, --drink ', 'drink size').choices(['small', 'medium', 'large'])) + .addOption(new Option('-p, --port ', 'port number').env('PORT')) + .addOption(new Option('--donate [amount]', 'optional donation in dollars').preset('20').argParser(parseFloat)) + .addOption(new Option('--disable-server', 'disables the server').conflicts('port')) + .addOption(new Option('--free-drink', 'small drink included free ').implies({ drink: 'small' })); +``` + +```console +$ extra --help +Usage: help [options] + +Options: + -t, --timeout timeout in seconds (default: one minute) + -d, --drink drink cup size (choices: "small", "medium", "large") + -p, --port port number (env: PORT) + --donate [amount] optional donation in dollars (preset: "20") + --disable-server disables the server + --free-drink small drink included free + -h, --help display help for command + +$ extra --drink huge +error: option '-d, --drink ' argument 'huge' is invalid. Allowed choices are small, medium, large. + +$ PORT=80 extra --donate --free-drink +Options: { timeout: 60, donate: 20, port: '80', freeDrink: true, drink: 'small' } + +$ extra --disable-server --port 8000 +error: option '--disable-server' cannot be used with option '-p, --port ' +``` + +Specify a required (mandatory) option using the `Option` method `.makeOptionMandatory()`. This matches the `Command` method [.requiredOption()](#required-option). + +### Custom option processing + +You may specify a function to do custom processing of option-arguments. The callback function receives two parameters, +the user specified option-argument and the previous value for the option. It returns the new value for the option. + +This allows you to coerce the option-argument to the desired type, or accumulate values, or do entirely custom processing. + +You can optionally specify the default/starting value for the option after the function parameter. + +Example file: [options-custom-processing.js](./examples/options-custom-processing.js) + +```js +function myParseInt(value, dummyPrevious) { + // parseInt takes a string and a radix + const parsedValue = parseInt(value, 10); + if (isNaN(parsedValue)) { + throw new commander.InvalidArgumentError('Not a number.'); + } + return parsedValue; +} + +function increaseVerbosity(dummyValue, previous) { + return previous + 1; +} + +function collect(value, previous) { + return previous.concat([value]); +} + +function commaSeparatedList(value, dummyPrevious) { + return value.split(','); +} + +program + .option('-f, --float ', 'float argument', parseFloat) + .option('-i, --integer ', 'integer argument', myParseInt) + .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0) + .option('-c, --collect ', 'repeatable value', collect, []) + .option('-l, --list ', 'comma separated list', commaSeparatedList) +; + +program.parse(); + +const options = program.opts(); +if (options.float !== undefined) console.log(`float: ${options.float}`); +if (options.integer !== undefined) console.log(`integer: ${options.integer}`); +if (options.verbose > 0) console.log(`verbosity: ${options.verbose}`); +if (options.collect.length > 0) console.log(options.collect); +if (options.list !== undefined) console.log(options.list); +``` + +```console +$ custom -f 1e2 +float: 100 +$ custom --integer 2 +integer: 2 +$ custom -v -v -v +verbose: 3 +$ custom -c a -c b -c c +[ 'a', 'b', 'c' ] +$ custom --list x,y,z +[ 'x', 'y', 'z' ] +``` + +## Commands + +You can specify (sub)commands using `.command()` or `.addCommand()`. There are two ways these can be implemented: using an action handler attached to the command, or as a stand-alone executable file (described in more detail later). The subcommands may be nested ([example](./examples/nestedCommands.js)). + +In the first parameter to `.command()` you specify the command name. You may append the command-arguments after the command name, or specify them separately using `.argument()`. The arguments may be `` or `[optional]`, and the last argument may also be `variadic...`. + +You can use `.addCommand()` to add an already configured subcommand to the program. + +For example: + +```js +// Command implemented using action handler (description is supplied separately to `.command`) +// Returns new command for configuring. +program + .command('clone [destination]') + .description('clone a repository into a newly created directory') + .action((source, destination) => { + console.log('clone command called'); + }); + +// Command implemented using stand-alone executable file, indicated by adding description as second parameter to `.command`. +// Returns `this` for adding more commands. +program + .command('start ', 'start named service') + .command('stop [service]', 'stop named service, or all if no name supplied'); + +// Command prepared separately. +// Returns `this` for adding more commands. +program + .addCommand(build.makeBuildCommand()); +``` + +Configuration options can be passed with the call to `.command()` and `.addCommand()`. Specifying `hidden: true` will +remove the command from the generated help output. Specifying `isDefault: true` will run the subcommand if no other +subcommand is specified ([example](./examples/defaultCommand.js)). + +You can add alternative names for a command with `.alias()`. ([example](./examples/alias.js)) + +For safety, `.addCommand()` does not automatically copy the inherited settings from the parent command. There is a helper routine `.copyInheritedSettings()` for copying the settings when they are wanted. + +### Command-arguments + +For subcommands, you can specify the argument syntax in the call to `.command()` (as shown above). This +is the only method usable for subcommands implemented using a stand-alone executable, but for other subcommands +you can instead use the following method. + +To configure a command, you can use `.argument()` to specify each expected command-argument. +You supply the argument name and an optional description. The argument may be `` or `[optional]`. +You can specify a default value for an optional command-argument. + +Example file: [argument.js](./examples/argument.js) + +```js +program + .version('0.1.0') + .argument('', 'user to login') + .argument('[password]', 'password for user, if required', 'no password given') + .action((username, password) => { + console.log('username:', username); + console.log('password:', password); + }); +``` + + The last argument of a command can be variadic, and only the last argument. To make an argument variadic you + append `...` to the argument name. A variadic argument is passed to the action handler as an array. For example: + +```js +program + .version('0.1.0') + .command('rmdir') + .argument('') + .action(function (dirs) { + dirs.forEach((dir) => { + console.log('rmdir %s', dir); + }); + }); +``` + +There is a convenience method to add multiple arguments at once, but without descriptions: + +```js +program + .arguments(' '); +``` + +#### More configuration + +There are some additional features available by constructing an `Argument` explicitly for less common cases. + +Example file: [arguments-extra.js](./examples/arguments-extra.js) + +```js +program + .addArgument(new commander.Argument('', 'drink cup size').choices(['small', 'medium', 'large'])) + .addArgument(new commander.Argument('[timeout]', 'timeout in seconds').default(60, 'one minute')) +``` + +#### Custom argument processing + +You may specify a function to do custom processing of command-arguments (like for option-arguments). +The callback function receives two parameters, the user specified command-argument and the previous value for the argument. +It returns the new value for the argument. + +The processed argument values are passed to the action handler, and saved as `.processedArgs`. + +You can optionally specify the default/starting value for the argument after the function parameter. + +Example file: [arguments-custom-processing.js](./examples/arguments-custom-processing.js) + +```js +program + .command('add') + .argument('', 'integer argument', myParseInt) + .argument('[second]', 'integer argument', myParseInt, 1000) + .action((first, second) => { + console.log(`${first} + ${second} = ${first + second}`); + }) +; +``` + +### Action handler + +The action handler gets passed a parameter for each command-argument you declared, and two additional parameters +which are the parsed options and the command object itself. + +Example file: [thank.js](./examples/thank.js) + +```js +program + .argument('') + .option('-t, --title ', 'title to use before name') + .option('-d, --debug', 'display some debugging') + .action((name, options, command) => { + if (options.debug) { + console.error('Called %s with options %o', command.name(), options); + } + const title = options.title ? `${options.title} ` : ''; + console.log(`Thank-you ${title}${name}`); + }); +``` + +If you prefer, you can work with the command directly and skip declaring the parameters for the action handler. The `this` keyword is set to the running command and can be used from a function expression (but not from an arrow function). + +Example file: [action-this.js](./examples/action-this.js) + +```js +program + .command('serve') + .argument('

    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�G(+Brg>DC?kKQx^C*4z)MHx2!&G-EtIWB=+dPg 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�ZaAg~eH~AC@4Uvg+M+K+RBtzLs7H^7T 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