nativescript 8.9.0-dev.2 → 8.9.0-dev.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/test-deps-versions-generated.json +1 -1
- package/lib/android-tools-info.js +9 -32
- package/lib/base-package-manager.js +47 -71
- package/lib/bootstrap.js +1 -5
- package/lib/bun-package-manager.js +65 -104
- package/lib/color.js +2 -5
- package/lib/commands/add-platform.js +14 -31
- package/lib/commands/apple-login.js +18 -30
- package/lib/commands/appstore-list.js +34 -46
- package/lib/commands/appstore-upload.js +52 -68
- package/lib/commands/build.js +57 -90
- package/lib/commands/clean.js +161 -197
- package/lib/commands/command-base.js +14 -28
- package/lib/commands/config.js +48 -71
- package/lib/commands/create-project.js +210 -235
- package/lib/commands/debug.js +66 -93
- package/lib/commands/deploy.js +30 -47
- package/lib/commands/embedding/embed.js +33 -59
- package/lib/commands/extensibility/install-extension.js +5 -17
- package/lib/commands/extensibility/list-extensions.js +13 -25
- package/lib/commands/extensibility/uninstall-extension.js +4 -16
- package/lib/commands/fonts.js +30 -42
- package/lib/commands/generate-assets.js +13 -29
- package/lib/commands/generate-help.js +2 -14
- package/lib/commands/generate.js +12 -70
- package/lib/commands/info.js +2 -14
- package/lib/commands/install.js +34 -50
- package/lib/commands/list-platforms.js +14 -26
- package/lib/commands/migrate.js +15 -27
- package/lib/commands/native-add.js +23 -51
- package/lib/commands/platform-clean.js +19 -33
- package/lib/commands/plugin/add-plugin.js +12 -26
- package/lib/commands/plugin/build-plugin.js +31 -45
- package/lib/commands/plugin/create-plugin.js +110 -138
- package/lib/commands/plugin/list-plugins.js +22 -34
- package/lib/commands/plugin/remove-plugin.js +20 -35
- package/lib/commands/plugin/update-plugin.js +20 -34
- package/lib/commands/post-install.js +20 -39
- package/lib/commands/prepare.js +22 -39
- package/lib/commands/preview.js +49 -64
- package/lib/commands/remove-platform.js +7 -19
- package/lib/commands/resources/resources-update.js +13 -28
- package/lib/commands/run.js +55 -77
- package/lib/commands/setup.js +0 -1
- package/lib/commands/start.js +6 -20
- package/lib/commands/test-init.js +123 -138
- package/lib/commands/test.js +67 -97
- package/lib/commands/typings.js +126 -143
- package/lib/commands/update-platform.js +22 -40
- package/lib/commands/update.js +30 -45
- package/lib/commands/widget.js +390 -352
- package/lib/common/bootstrap.js +0 -1
- package/lib/common/child-process.js +53 -75
- package/lib/common/codeGeneration/code-entity.js +1 -2
- package/lib/common/codeGeneration/code-printer.js +1 -2
- package/lib/common/command-params.js +7 -19
- package/lib/common/commands/analytics.js +27 -43
- package/lib/common/commands/autocompletion.js +39 -59
- package/lib/common/commands/device/device-log-stream.js +12 -24
- package/lib/common/commands/device/get-file.js +22 -35
- package/lib/common/commands/device/list-applications.js +12 -24
- package/lib/common/commands/device/list-devices.js +72 -90
- package/lib/common/commands/device/list-files.js +23 -36
- package/lib/common/commands/device/put-file.js +22 -35
- package/lib/common/commands/device/run-application.js +12 -26
- package/lib/common/commands/device/stop-application.js +11 -23
- package/lib/common/commands/device/uninstall-application.js +6 -18
- package/lib/common/commands/doctor.js +2 -3
- package/lib/common/commands/generate-messages.js +17 -29
- package/lib/common/commands/help.js +20 -34
- package/lib/common/commands/package-manager-get.js +6 -18
- package/lib/common/commands/package-manager-set.js +9 -21
- package/lib/common/commands/post-install.js +2 -14
- package/lib/common/commands/preuninstall.js +24 -48
- package/lib/common/commands/proxy/proxy-base.js +8 -23
- package/lib/common/commands/proxy/proxy-clear.js +4 -16
- package/lib/common/commands/proxy/proxy-get.js +3 -15
- package/lib/common/commands/proxy/proxy-set.js +87 -101
- package/lib/common/common-lib.js +0 -1
- package/lib/common/constants.js +11 -22
- package/lib/common/decorators.js +10 -70
- package/lib/common/dispatchers.js +80 -106
- package/lib/common/errors.js +91 -116
- package/lib/common/file-system.js +108 -141
- package/lib/common/header.js +1 -5
- package/lib/common/helpers.js +152 -267
- package/lib/common/host-info.js +37 -54
- package/lib/common/http-client.js +93 -128
- package/lib/common/logger/appenders/cli-appender.js +1 -6
- package/lib/common/logger/appenders/emit-appender.js +1 -6
- package/lib/common/logger/layouts/cli-layout.js +1 -3
- package/lib/common/logger/logger.js +4 -9
- package/lib/common/messages/messages.js +0 -6
- package/lib/common/mobile/android/android-application-manager.js +122 -162
- package/lib/common/mobile/android/android-debug-bridge-result-handler.js +1 -2
- package/lib/common/mobile/android/android-debug-bridge.js +87 -118
- package/lib/common/mobile/android/android-device-file-system.js +98 -135
- package/lib/common/mobile/android/android-device-hash-service.js +50 -78
- package/lib/common/mobile/android/android-device.js +68 -93
- package/lib/common/mobile/android/android-emulator-services.js +105 -131
- package/lib/common/mobile/android/android-ini-file-parser.js +0 -9
- package/lib/common/mobile/android/android-log-filter.js +1 -5
- package/lib/common/mobile/android/android-virtual-device-service.js +76 -123
- package/lib/common/mobile/android/device-android-debug-bridge.js +13 -30
- package/lib/common/mobile/android/genymotion/genymotion-service.js +91 -123
- package/lib/common/mobile/android/genymotion/virtualbox-service.js +64 -92
- package/lib/common/mobile/android/logcat-helper.js +108 -140
- package/lib/common/mobile/application-manager-base.js +84 -113
- package/lib/common/mobile/device-emitter.js +0 -4
- package/lib/common/mobile/device-log-emitter.js +0 -1
- package/lib/common/mobile/device-log-provider-base.js +7 -19
- package/lib/common/mobile/device-log-provider.js +0 -23
- package/lib/common/mobile/device-platforms-constants.js +0 -1
- package/lib/common/mobile/emulator-helper.js +0 -3
- package/lib/common/mobile/ios/device/ios-application-manager.js +79 -111
- package/lib/common/mobile/ios/device/ios-device-file-system.js +78 -106
- package/lib/common/mobile/ios/device/ios-device-operations.js +105 -146
- package/lib/common/mobile/ios/device/ios-device.js +20 -40
- package/lib/common/mobile/ios/ios-device-base.js +58 -82
- package/lib/common/mobile/ios/ios-device-product-name-mapper.js +0 -2
- package/lib/common/mobile/ios/ios-log-filter.js +0 -1
- package/lib/common/mobile/ios/simulator/ios-emulator-services.js +63 -96
- package/lib/common/mobile/ios/simulator/ios-sim-resolver.js +1 -2
- package/lib/common/mobile/ios/simulator/ios-simulator-application-manager.js +60 -95
- package/lib/common/mobile/ios/simulator/ios-simulator-device.js +27 -48
- package/lib/common/mobile/ios/simulator/ios-simulator-file-system.js +37 -63
- package/lib/common/mobile/ios/simulator/ios-simulator-log-provider.js +24 -36
- package/lib/common/mobile/local-to-device-path-data-factory.js +0 -1
- package/lib/common/mobile/log-filter.js +0 -2
- package/lib/common/mobile/logging-levels.js +0 -1
- package/lib/common/mobile/mobile-core/android-device-discovery.js +43 -64
- package/lib/common/mobile/mobile-core/android-emulator-discovery.js +21 -35
- package/lib/common/mobile/mobile-core/android-process-service.js +143 -214
- package/lib/common/mobile/mobile-core/device-discovery.js +2 -14
- package/lib/common/mobile/mobile-core/devices-service.js +386 -505
- package/lib/common/mobile/mobile-core/ios-device-discovery.js +24 -37
- package/lib/common/mobile/mobile-core/ios-simulator-discovery.js +47 -65
- package/lib/common/mobile/mobile-helper.js +15 -27
- package/lib/common/mobile/wp8/wp8-emulator-services.js +25 -53
- package/lib/common/opener.js +2 -3
- package/lib/common/os-info.js +0 -1
- package/lib/common/plist-parser.js +0 -1
- package/lib/common/project-helper.js +0 -1
- package/lib/common/prompter.js +91 -114
- package/lib/common/queue.js +9 -21
- package/lib/common/resource-loader.js +0 -1
- package/lib/common/services/auto-completion-service.js +40 -65
- package/lib/common/services/cancellation.js +17 -29
- package/lib/common/services/commands-service.js +146 -180
- package/lib/common/services/help-service.js +133 -166
- package/lib/common/services/hooks-service.js +93 -121
- package/lib/common/services/ios-notification-service.js +21 -35
- package/lib/common/services/json-file-settings-service.js +52 -77
- package/lib/common/services/lock-service.js +35 -58
- package/lib/common/services/message-contract-generator.js +35 -47
- package/lib/common/services/messages-service.js +0 -1
- package/lib/common/services/micro-templating-service.js +4 -21
- package/lib/common/services/net-service.js +90 -110
- package/lib/common/services/project-files-manager.js +10 -28
- package/lib/common/services/project-files-provider-base.js +0 -1
- package/lib/common/services/proxy-service.js +13 -25
- package/lib/common/services/qr.js +13 -25
- package/lib/common/services/settings-service.js +1 -2
- package/lib/common/services/xcode-select-service.js +20 -36
- package/lib/common/utils.js +2 -3
- package/lib/common/validators/project-name-validator.js +1 -2
- package/lib/common/validators/validation-result.js +1 -2
- package/lib/common/verify-node-version.js +3 -11
- package/lib/common/yok.js +35 -69
- package/lib/config.js +36 -72
- package/lib/constants-provider.js +0 -1
- package/lib/constants.js +24 -77
- package/lib/controllers/build-controller.js +82 -100
- package/lib/controllers/debug-controller.js +107 -133
- package/lib/controllers/deploy-controller.js +15 -24
- package/lib/controllers/migrate-controller.js +723 -884
- package/lib/controllers/platform-controller.js +71 -94
- package/lib/controllers/prepare-controller.js +232 -274
- package/lib/controllers/run-controller.js +397 -427
- package/lib/controllers/update-controller-base.js +16 -30
- package/lib/controllers/update-controller.js +94 -130
- package/lib/data/build-data.js +0 -1
- package/lib/data/controller-data-base.js +0 -1
- package/lib/data/debug-data.js +0 -1
- package/lib/data/platform-data.js +0 -1
- package/lib/data/prepare-data.js +4 -2
- package/lib/data/run-data.js +0 -1
- package/lib/definitions/project.d.ts +24 -24
- package/lib/detached-processes/cleanup-js-subprocess.js +5 -20
- package/lib/detached-processes/cleanup-process.js +30 -43
- package/lib/detached-processes/file-log-service.js +1 -2
- package/lib/device-path-provider.js +23 -35
- package/lib/device-sockets/ios/app-debug-socket-proxy-factory.js +149 -171
- package/lib/device-sockets/ios/notification.js +1 -4
- package/lib/device-sockets/ios/socket-request-executor.js +24 -42
- package/lib/helpers/android-bundle-validator-helper.js +2 -3
- package/lib/helpers/deploy-command-helper.js +44 -50
- package/lib/helpers/key-command-helper.js +6 -17
- package/lib/helpers/livesync-command-helper.js +137 -155
- package/lib/helpers/network-connectivity-validator.js +6 -18
- package/lib/helpers/options-track-helper.js +7 -19
- package/lib/helpers/package-path-helper.js +0 -1
- package/lib/helpers/platform-command-helper.js +101 -127
- package/lib/helpers/version-validator-helper.js +0 -1
- package/lib/key-commands/bootstrap.js +2 -3
- package/lib/key-commands/index.js +154 -205
- package/lib/nativescript-cli-lib-bootstrap.js +0 -4
- package/lib/nativescript-cli-lib.js +0 -1
- package/lib/nativescript-cli.js +6 -24
- package/lib/node/pbxproj-dom-xcode.js +0 -1
- package/lib/node/xcode.js +0 -1
- package/lib/node-package-manager.js +81 -114
- package/lib/options.js +122 -156
- package/lib/package-installation-manager.js +130 -172
- package/lib/package-manager.js +63 -88
- package/lib/platform-command-param.js +4 -16
- package/lib/pnpm-package-manager.js +59 -81
- package/lib/project-data.js +1 -13
- package/lib/providers/project-files-provider.js +1 -2
- package/lib/resolvers/livesync-service-resolver.js +0 -1
- package/lib/services/analytics/analytics-broker-process.js +19 -32
- package/lib/services/analytics/analytics-broker.js +17 -31
- package/lib/services/analytics/analytics-service.js +170 -210
- package/lib/services/analytics/google-analytics-provider.js +43 -59
- package/lib/services/analytics-settings-service.js +15 -37
- package/lib/services/android/android-bundle-tool-service.js +43 -61
- package/lib/services/android/gradle-build-args-service.js +9 -23
- package/lib/services/android/gradle-build-service.js +22 -36
- package/lib/services/android/gradle-command-service.js +22 -36
- package/lib/services/android-device-debug-service.js +90 -123
- package/lib/services/android-plugin-build-service.js +205 -260
- package/lib/services/android-project-service.js +129 -241
- package/lib/services/android-resources-migration-service.js +51 -71
- package/lib/services/apple-portal/apple-portal-application-service.js +46 -64
- package/lib/services/apple-portal/apple-portal-cookie-service.js +0 -1
- package/lib/services/apple-portal/apple-portal-session-service.js +197 -218
- package/lib/services/apple-portal/srp/srp-wrapper.js +43 -61
- package/lib/services/assets-generation/assets-generation-service.js +103 -128
- package/lib/services/build-artifacts-service.js +10 -22
- package/lib/services/build-data-service.js +0 -1
- package/lib/services/build-info-file-service.js +20 -36
- package/lib/services/cleanup-service.js +48 -81
- package/lib/services/cocoapods-platform-manager.js +0 -9
- package/lib/services/cocoapods-service.js +112 -153
- package/lib/services/debug-data-service.js +0 -1
- package/lib/services/debug-service-base.js +0 -7
- package/lib/services/device/device-install-app-service.js +54 -72
- package/lib/services/doctor-service.js +101 -135
- package/lib/services/extensibility-service.js +81 -108
- package/lib/services/files-hash-service.js +26 -44
- package/lib/services/hmr-status-service.js +1 -3
- package/lib/services/info-service.js +0 -1
- package/lib/services/initialize-service.js +37 -54
- package/lib/services/ios/export-options-plist-service.js +38 -55
- package/lib/services/ios/ios-signing-service.js +168 -191
- package/lib/services/ios/spm-service.js +46 -70
- package/lib/services/ios/xcodebuild-args-service.js +77 -103
- package/lib/services/ios/xcodebuild-command-service.js +14 -26
- package/lib/services/ios/xcodebuild-service.js +52 -72
- package/lib/services/ios-debugger-port-service.js +24 -38
- package/lib/services/ios-device-debug-service.js +75 -103
- package/lib/services/ios-entitlements-service.js +31 -43
- package/lib/services/ios-extensions-service.js +18 -30
- package/lib/services/ios-log-filter.js +0 -20
- package/lib/services/ios-native-target-service.js +4 -6
- package/lib/services/ios-project-service.js +452 -603
- package/lib/services/ios-provision-service.js +108 -132
- package/lib/services/ios-watch-app-service.js +21 -33
- package/lib/services/ip-service.js +38 -55
- package/lib/services/itmstransporter-service.js +129 -153
- package/lib/services/karma-execution.js +0 -2
- package/lib/services/livesync/android-device-livesync-service-base.js +31 -49
- package/lib/services/livesync/android-device-livesync-service.js +120 -151
- package/lib/services/livesync/android-device-livesync-sockets-service.js +121 -155
- package/lib/services/livesync/android-livesync-service.js +14 -36
- package/lib/services/livesync/android-livesync-tool.js +90 -117
- package/lib/services/livesync/device-livesync-service-base.js +15 -30
- package/lib/services/livesync/ios-device-livesync-service.js +114 -150
- package/lib/services/livesync/ios-livesync-service.js +42 -60
- package/lib/services/livesync/livesync-socket.js +0 -1
- package/lib/services/livesync/platform-livesync-service-base.js +94 -124
- package/lib/services/livesync-process-data-service.js +0 -1
- package/lib/services/log-parser-service.js +1 -2
- package/lib/services/log-source-map-service.js +30 -56
- package/lib/services/marking-mode-service.js +17 -33
- package/lib/services/metadata-filtering-service.js +0 -1
- package/lib/services/npm-config-service.js +1 -5
- package/lib/services/pacote-service.js +49 -71
- package/lib/services/performance-service.js +2 -4
- package/lib/services/platform/add-platform-service.js +51 -119
- package/lib/services/platform/platform-validation-service.js +22 -34
- package/lib/services/platform/prepare-native-platform-service.js +49 -65
- package/lib/services/platform-environment-requirements.js +27 -43
- package/lib/services/platform-project-service-base.js +0 -1
- package/lib/services/platforms-data-service.js +0 -1
- package/lib/services/plugins-service.js +125 -168
- package/lib/services/prepare-data-service.js +0 -1
- package/lib/services/project-backup-service.js +1 -5
- package/lib/services/project-changes-service.js +124 -152
- package/lib/services/project-cleanup-service.js +64 -79
- package/lib/services/project-config-service.js +73 -102
- package/lib/services/project-data-service.js +108 -154
- package/lib/services/project-name-service.js +28 -44
- package/lib/services/project-service.js +84 -113
- package/lib/services/project-templates-service.js +52 -68
- package/lib/services/qr-code-terminal-service.js +0 -1
- package/lib/services/require-service.js +0 -1
- package/lib/services/start-service.js +41 -60
- package/lib/services/temp-service.js +8 -22
- package/lib/services/terminal-spinner-service.js +15 -28
- package/lib/services/test-execution-service.js +59 -79
- package/lib/services/test-initialization-service.js +2 -6
- package/lib/services/timeline-profiler-service.js +1 -2
- package/lib/services/user-settings-service.js +0 -1
- package/lib/services/versions-service.js +119 -140
- package/lib/services/watch-ignore-list-service.js +0 -1
- package/lib/services/webpack/webpack-compiler-service.js +215 -279
- package/lib/services/xcconfig-service.js +8 -21
- package/lib/services/xcproj-service.js +0 -1
- package/lib/shared-event-bus.js +0 -6
- package/lib/sys-info.js +45 -63
- package/lib/tools/config-manipulation/config-transformer.js +0 -12
- package/lib/tools/node-modules/node-modules-builder.js +16 -28
- package/lib/tools/node-modules/node-modules-dependencies-builder.js +0 -6
- package/lib/yarn-package-manager.js +59 -79
- package/lib/yarn2-package-manager.js +60 -82
- package/package.json +65 -80
- package/node_modules/@npmcli/move-file/LICENSE.md +0 -22
- package/node_modules/@npmcli/move-file/README.md +0 -69
- package/node_modules/@npmcli/move-file/lib/index.js +0 -185
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/LICENSE +0 -21
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/bin/cmd.js +0 -68
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/index.js +0 -31
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/find-made.js +0 -29
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/mkdirp-manual.js +0 -64
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/mkdirp-native.js +0 -39
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/opts-arg.js +0 -23
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/path-arg.js +0 -29
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/lib/use-native.js +0 -10
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/package.json +0 -44
- package/node_modules/@npmcli/move-file/node_modules/mkdirp/readme.markdown +0 -266
- package/node_modules/@npmcli/move-file/package.json +0 -47
- package/node_modules/balanced-match/.github/FUNDING.yml +0 -2
- package/node_modules/balanced-match/LICENSE.md +0 -21
- package/node_modules/balanced-match/README.md +0 -97
- package/node_modules/balanced-match/index.js +0 -62
- package/node_modules/balanced-match/package.json +0 -48
- package/node_modules/concat-map/.travis.yml +0 -4
- package/node_modules/concat-map/LICENSE +0 -18
- package/node_modules/concat-map/README.markdown +0 -62
- package/node_modules/concat-map/example/map.js +0 -6
- package/node_modules/concat-map/index.js +0 -13
- package/node_modules/concat-map/package.json +0 -43
- package/node_modules/concat-map/test/map.js +0 -39
- package/node_modules/fs.realpath/LICENSE +0 -43
- package/node_modules/fs.realpath/README.md +0 -33
- package/node_modules/fs.realpath/index.js +0 -66
- package/node_modules/fs.realpath/old.js +0 -303
- package/node_modules/fs.realpath/package.json +0 -26
- package/node_modules/inflight/LICENSE +0 -15
- package/node_modules/inflight/README.md +0 -37
- package/node_modules/inflight/inflight.js +0 -54
- package/node_modules/inflight/package.json +0 -29
- package/node_modules/inherits/LICENSE +0 -16
- package/node_modules/inherits/README.md +0 -42
- package/node_modules/inherits/inherits.js +0 -9
- package/node_modules/inherits/inherits_browser.js +0 -27
- package/node_modules/inherits/package.json +0 -29
- package/node_modules/once/LICENSE +0 -15
- package/node_modules/once/README.md +0 -79
- package/node_modules/once/once.js +0 -42
- package/node_modules/once/package.json +0 -33
- package/node_modules/path-is-absolute/index.js +0 -20
- package/node_modules/path-is-absolute/license +0 -21
- package/node_modules/path-is-absolute/package.json +0 -43
- package/node_modules/path-is-absolute/readme.md +0 -59
- package/node_modules/rimraf/LICENSE +0 -15
- package/node_modules/rimraf/README.md +0 -101
- package/node_modules/rimraf/bin.js +0 -68
- package/node_modules/rimraf/node_modules/brace-expansion/LICENSE +0 -21
- package/node_modules/rimraf/node_modules/brace-expansion/README.md +0 -129
- package/node_modules/rimraf/node_modules/brace-expansion/index.js +0 -201
- package/node_modules/rimraf/node_modules/brace-expansion/package.json +0 -47
- package/node_modules/rimraf/node_modules/glob/LICENSE +0 -21
- package/node_modules/rimraf/node_modules/glob/README.md +0 -378
- package/node_modules/rimraf/node_modules/glob/common.js +0 -238
- package/node_modules/rimraf/node_modules/glob/glob.js +0 -790
- package/node_modules/rimraf/node_modules/glob/package.json +0 -55
- package/node_modules/rimraf/node_modules/glob/sync.js +0 -486
- package/node_modules/rimraf/node_modules/minimatch/LICENSE +0 -15
- package/node_modules/rimraf/node_modules/minimatch/README.md +0 -230
- package/node_modules/rimraf/node_modules/minimatch/minimatch.js +0 -947
- package/node_modules/rimraf/node_modules/minimatch/package.json +0 -33
- package/node_modules/rimraf/package.json +0 -32
- package/node_modules/rimraf/rimraf.js +0 -360
- package/node_modules/stringify-package/LICENSE +0 -13
- package/node_modules/stringify-package/README.md +0 -55
- package/node_modules/stringify-package/index.js +0 -18
- package/node_modules/stringify-package/package.json +0 -38
- package/node_modules/wrappy/LICENSE +0 -15
- package/node_modules/wrappy/README.md +0 -36
- package/node_modules/wrappy/package.json +0 -29
- package/node_modules/wrappy/wrappy.js +0 -33
package/lib/commands/widget.js
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
-
});
|
|
10
|
-
};
|
|
11
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
3
|
exports.WidgetIOSCommand = exports.WidgetCommand = void 0;
|
|
13
4
|
const fs = require("fs");
|
|
@@ -26,20 +17,16 @@ class WidgetCommand {
|
|
|
26
17
|
this.allowedParameters = [];
|
|
27
18
|
this.$projectData.initializeProjectData();
|
|
28
19
|
}
|
|
29
|
-
execute(args) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return Promise.resolve();
|
|
33
|
-
});
|
|
20
|
+
async execute(args) {
|
|
21
|
+
this.failWithUsage();
|
|
22
|
+
return Promise.resolve();
|
|
34
23
|
}
|
|
35
24
|
failWithUsage() {
|
|
36
25
|
this.$errors.failWithHelp("Usage: ns widget ios");
|
|
37
26
|
}
|
|
38
|
-
canExecute(args) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
return false;
|
|
42
|
-
});
|
|
27
|
+
async canExecute(args) {
|
|
28
|
+
this.failWithUsage();
|
|
29
|
+
return false;
|
|
43
30
|
}
|
|
44
31
|
getIosSourcePathBase() {
|
|
45
32
|
const resources = this.$projectData.getAppResourcesDirectoryPath();
|
|
@@ -51,77 +38,71 @@ class WidgetIOSCommand extends WidgetCommand {
|
|
|
51
38
|
constructor($projectData, $projectConfigService, $logger, $errors) {
|
|
52
39
|
super($projectData, $projectConfigService, $logger, $errors);
|
|
53
40
|
}
|
|
54
|
-
canExecute(args) {
|
|
55
|
-
return
|
|
56
|
-
return true;
|
|
57
|
-
});
|
|
41
|
+
async canExecute(args) {
|
|
42
|
+
return true;
|
|
58
43
|
}
|
|
59
|
-
execute(args) {
|
|
60
|
-
|
|
61
|
-
this.startPrompt(args);
|
|
62
|
-
});
|
|
44
|
+
async execute(args) {
|
|
45
|
+
this.startPrompt(args);
|
|
63
46
|
}
|
|
64
|
-
startPrompt(args) {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
message: `What name would you like for this widget? (Default is 'widget')`,
|
|
70
|
-
});
|
|
71
|
-
const name = (result.name || "widget").toLowerCase();
|
|
72
|
-
result = yield prompts.prompt({
|
|
73
|
-
type: "select",
|
|
74
|
-
name: "value",
|
|
75
|
-
message: `What type of widget would you like? (Request more options: https://github.com/NativeScript/nativescript-cli/issues)`,
|
|
76
|
-
choices: [
|
|
77
|
-
{
|
|
78
|
-
title: "Live Activity",
|
|
79
|
-
description: "This will create a Live Activity that will display on the iOS Lock Screen.",
|
|
80
|
-
value: 0,
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
title: "Live Activity with Home Screen Widget",
|
|
84
|
-
description: "This will create a Live Activity that will display on the iOS Lock Screen with an optional Widget.",
|
|
85
|
-
value: 1,
|
|
86
|
-
},
|
|
87
|
-
{
|
|
88
|
-
title: "Home Screen Widget",
|
|
89
|
-
description: "This will create just a Home Screen Widget.",
|
|
90
|
-
value: 2,
|
|
91
|
-
},
|
|
92
|
-
],
|
|
93
|
-
initial: 1,
|
|
94
|
-
});
|
|
95
|
-
switch (result.value) {
|
|
96
|
-
case 0:
|
|
97
|
-
this.$logger.info("TODO");
|
|
98
|
-
break;
|
|
99
|
-
case 1:
|
|
100
|
-
yield this.generateSharedWidgetPackage(this.$projectData.projectDir, name);
|
|
101
|
-
this.generateWidget(this.$projectData.projectDir, name, result.value);
|
|
102
|
-
this.generateAppleUtility(this.$projectData.projectDir, name);
|
|
103
|
-
break;
|
|
104
|
-
case 2:
|
|
105
|
-
this.$logger.info("TODO");
|
|
106
|
-
break;
|
|
107
|
-
}
|
|
47
|
+
async startPrompt(args) {
|
|
48
|
+
let result = await prompts.prompt({
|
|
49
|
+
type: "text",
|
|
50
|
+
name: "name",
|
|
51
|
+
message: `What name would you like for this widget? (Default is 'widget')`,
|
|
108
52
|
});
|
|
53
|
+
const name = (result.name || "widget").toLowerCase();
|
|
54
|
+
result = await prompts.prompt({
|
|
55
|
+
type: "select",
|
|
56
|
+
name: "value",
|
|
57
|
+
message: `What type of widget would you like?`,
|
|
58
|
+
choices: [
|
|
59
|
+
{
|
|
60
|
+
title: "Live Activity",
|
|
61
|
+
description: "This will create a Live Activity that will display on the iOS Lock Screen.",
|
|
62
|
+
value: 0,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
title: "Live Activity with Home Screen Widget",
|
|
66
|
+
description: "This will create a Live Activity that will display on the iOS Lock Screen with an optional Widget.",
|
|
67
|
+
value: 1,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
title: "Home Screen Widget",
|
|
71
|
+
description: "This will create just a Home Screen Widget.",
|
|
72
|
+
value: 2,
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
initial: 1,
|
|
76
|
+
});
|
|
77
|
+
const bundleId = this.$projectConfigService.getValue(`id`, "");
|
|
78
|
+
switch (result.value) {
|
|
79
|
+
case 0:
|
|
80
|
+
this.$logger.info("TODO");
|
|
81
|
+
break;
|
|
82
|
+
case 1:
|
|
83
|
+
await this.generateSharedWidgetPackage(this.$projectData.projectDir, name);
|
|
84
|
+
this.generateWidget(this.$projectData.projectDir, name, bundleId, result.value);
|
|
85
|
+
this.generateAppleUtility(this.$projectData.projectDir, name, bundleId);
|
|
86
|
+
break;
|
|
87
|
+
case 2:
|
|
88
|
+
this.$logger.info("TODO");
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
109
91
|
}
|
|
110
|
-
generateSharedWidgetPackage(projectDir, name) {
|
|
92
|
+
async generateSharedWidgetPackage(projectDir, name) {
|
|
111
93
|
var _a;
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
let content = `// swift-tools-version:5.9
|
|
94
|
+
const sharedWidgetDir = "Shared_Resources/iOS/SharedWidget";
|
|
95
|
+
const sharedWidgetPath = path.join(projectDir, sharedWidgetDir);
|
|
96
|
+
const sharedWidgetSourceDir = "Sources/SharedWidget";
|
|
97
|
+
const sharedWidgetPackagePath = path.join(projectDir, `${sharedWidgetDir}/Package.swift`);
|
|
98
|
+
const sharedWidgetSourcePath = path.join(sharedWidgetPath, `${sharedWidgetSourceDir}/${(0, utils_1.capitalizeFirstLetter)(name)}Model.swift`);
|
|
99
|
+
const gitIgnorePath = path.join(projectDir, ".gitignore");
|
|
100
|
+
if (!fs.existsSync(sharedWidgetPackagePath)) {
|
|
101
|
+
fs.mkdirSync(sharedWidgetPath, { recursive: true });
|
|
102
|
+
fs.mkdirSync(path.join(sharedWidgetPath, sharedWidgetSourceDir), {
|
|
103
|
+
recursive: true,
|
|
104
|
+
});
|
|
105
|
+
let content = `// swift-tools-version:5.9
|
|
125
106
|
import PackageDescription
|
|
126
107
|
|
|
127
108
|
let package = Package(
|
|
@@ -144,8 +125,8 @@ let package = Package(
|
|
|
144
125
|
)
|
|
145
126
|
]
|
|
146
127
|
)${os_1.EOL}`;
|
|
147
|
-
|
|
148
|
-
|
|
128
|
+
fs.writeFileSync(sharedWidgetPackagePath, content);
|
|
129
|
+
content = `import ActivityKit
|
|
149
130
|
import WidgetKit
|
|
150
131
|
|
|
151
132
|
public struct ${(0, utils_1.capitalizeFirstLetter)(name)}Model: ActivityAttributes {
|
|
@@ -153,12 +134,12 @@ public struct ${(0, utils_1.capitalizeFirstLetter)(name)}Model: ActivityAttribut
|
|
|
153
134
|
|
|
154
135
|
public struct ContentState: Codable, Hashable {
|
|
155
136
|
// Dynamic stateful properties about your activity go here!
|
|
156
|
-
public var
|
|
157
|
-
public var
|
|
137
|
+
public var message: String
|
|
138
|
+
public var deliveryTime: Double
|
|
158
139
|
|
|
159
|
-
public init(
|
|
160
|
-
self.
|
|
161
|
-
self.
|
|
140
|
+
public init(message: String, deliveryTime: Double) {
|
|
141
|
+
self.message = message
|
|
142
|
+
self.deliveryTime = deliveryTime
|
|
162
143
|
}
|
|
163
144
|
}
|
|
164
145
|
|
|
@@ -171,52 +152,47 @@ public struct ${(0, utils_1.capitalizeFirstLetter)(name)}Model: ActivityAttribut
|
|
|
171
152
|
self.totalAmount = totalAmount
|
|
172
153
|
}
|
|
173
154
|
}${os_1.EOL}`;
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
// add target if needed
|
|
196
|
-
if (!((_a = sharedWidgetPackage.targets) === null || _a === void 0 ? void 0 : _a.includes(name))) {
|
|
197
|
-
sharedWidgetPackage.targets.push(name);
|
|
198
|
-
}
|
|
155
|
+
fs.writeFileSync(sharedWidgetSourcePath, content);
|
|
156
|
+
const configData = this.$projectConfigService.readConfig(projectDir);
|
|
157
|
+
if (!configData.ios) {
|
|
158
|
+
configData.ios = {};
|
|
159
|
+
}
|
|
160
|
+
if (!configData.ios.SPMPackages) {
|
|
161
|
+
configData.ios.SPMPackages = [];
|
|
162
|
+
}
|
|
163
|
+
const spmPackages = configData.ios.SPMPackages;
|
|
164
|
+
const sharedWidgetPackage = spmPackages === null || spmPackages === void 0 ? void 0 : spmPackages.find((p) => p.name === "SharedWidget");
|
|
165
|
+
if (!sharedWidgetPackage) {
|
|
166
|
+
spmPackages.push({
|
|
167
|
+
name: "SharedWidget",
|
|
168
|
+
libs: ["SharedWidget"],
|
|
169
|
+
path: "./Shared_Resources/iOS/SharedWidget",
|
|
170
|
+
targets: [name],
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
if (!((_a = sharedWidgetPackage.targets) === null || _a === void 0 ? void 0 : _a.includes(name))) {
|
|
175
|
+
sharedWidgetPackage.targets.push(name);
|
|
199
176
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
177
|
+
}
|
|
178
|
+
configData.ios.SPMPackages = spmPackages;
|
|
179
|
+
await this.$projectConfigService.setValue("", configData);
|
|
180
|
+
if (fs.existsSync(gitIgnorePath)) {
|
|
181
|
+
const gitIgnore = fs.readFileSync(gitIgnorePath, {
|
|
182
|
+
encoding: "utf-8",
|
|
183
|
+
});
|
|
184
|
+
const swiftBuildIgnore = `# Swift
|
|
208
185
|
.build
|
|
209
186
|
.swiftpm`;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
}
|
|
187
|
+
if (gitIgnore.indexOf(swiftBuildIgnore) === -1) {
|
|
188
|
+
content = `${gitIgnore}${os_1.EOL}${swiftBuildIgnore}${os_1.EOL}`;
|
|
189
|
+
fs.writeFileSync(gitIgnorePath, content);
|
|
214
190
|
}
|
|
215
|
-
console.log(`\nCreated Shared Resources: ${sharedWidgetDir}.\n`);
|
|
216
191
|
}
|
|
217
|
-
|
|
192
|
+
console.log(`\nCreated Shared Resources: ${sharedWidgetDir}.\n`);
|
|
193
|
+
}
|
|
218
194
|
}
|
|
219
|
-
generateWidget(projectDir, name, type) {
|
|
195
|
+
generateWidget(projectDir, name, bundleId, type) {
|
|
220
196
|
const appResourcePath = this.$projectData.appResourcesDirectoryPath;
|
|
221
197
|
const capitalName = (0, utils_1.capitalizeFirstLetter)(name);
|
|
222
198
|
const appInfoPlistPath = path.join(appResourcePath, "iOS", "Info.plist");
|
|
@@ -230,11 +206,6 @@ public struct ${(0, utils_1.capitalizeFirstLetter)(name)}Model: ActivityAttribut
|
|
|
230
206
|
const widgetBundlePath = path.join(widgetPath, `${capitalName}Bundle.swift`);
|
|
231
207
|
const widgetHomeScreenPath = path.join(widgetPath, `${capitalName}HomeScreenWidget.swift`);
|
|
232
208
|
const widgetLiveActivityPath = path.join(widgetPath, `${capitalName}LiveActivity.swift`);
|
|
233
|
-
const appIntentPath = path.join(widgetPath, `AppIntent.swift`);
|
|
234
|
-
// const widgetLockScreenControlPath = path.join(
|
|
235
|
-
// widgetPath,
|
|
236
|
-
// `${capitalName}LockScreenControl.swift`
|
|
237
|
-
// );
|
|
238
209
|
const appEntitlementsPath = path.join(appResourcePath, "iOS", "app.entitlements");
|
|
239
210
|
if (!fs.existsSync(extensionsConfigPath)) {
|
|
240
211
|
fs.mkdirSync(widgetPath, { recursive: true });
|
|
@@ -247,6 +218,10 @@ public struct ${(0, utils_1.capitalizeFirstLetter)(name)}Model: ActivityAttribut
|
|
|
247
218
|
<key>NSExtensionPointIdentifier</key>
|
|
248
219
|
<string>com.apple.widgetkit-extension</string>
|
|
249
220
|
</dict>
|
|
221
|
+
<key>CFBundleShortVersionString</key>
|
|
222
|
+
<string>1.0</string>
|
|
223
|
+
<key>CFBundleVersion</key>
|
|
224
|
+
<string>1.0</string>
|
|
250
225
|
</dict>
|
|
251
226
|
</plist>${os_1.EOL}`;
|
|
252
227
|
fs.writeFileSync(extensionsInfoPath, content);
|
|
@@ -272,123 +247,128 @@ public struct ${(0, utils_1.capitalizeFirstLetter)(name)}Model: ActivityAttribut
|
|
|
272
247
|
</dict>
|
|
273
248
|
</plist>${os_1.EOL}`;
|
|
274
249
|
fs.writeFileSync(extensionsPrivacyPath, content);
|
|
275
|
-
// TODO: can add control (lock screen custom control icon handler) in future
|
|
276
|
-
// ${[1, 2].includes(type) ? capitalName + "LockScreenControl()" : ""}
|
|
277
250
|
content = `import WidgetKit
|
|
278
251
|
import SwiftUI
|
|
279
252
|
|
|
280
253
|
@main
|
|
281
|
-
struct ${capitalName}Bundle: WidgetBundle {
|
|
254
|
+
struct ${capitalName}Bundle: SwiftUI.WidgetBundle {
|
|
282
255
|
var body: some Widget {
|
|
283
256
|
${[1, 2].includes(type) ? capitalName + "HomeScreenWidget()" : ""}
|
|
284
257
|
${[0, 1].includes(type) ? capitalName + "LiveActivity()" : ""}
|
|
285
258
|
}
|
|
286
259
|
}${os_1.EOL}`;
|
|
287
260
|
fs.writeFileSync(widgetBundlePath, content);
|
|
288
|
-
content = `import WidgetKit
|
|
289
|
-
import AppIntents
|
|
290
|
-
|
|
291
|
-
struct ConfigurationAppIntent: WidgetConfigurationIntent {
|
|
292
|
-
static var title: LocalizedStringResource { "Pizza Delivery" }
|
|
293
|
-
static var description: IntentDescription { "Get up to date delivery details" }
|
|
294
|
-
|
|
295
|
-
// An example configurable parameter.
|
|
296
|
-
@Parameter(title: "Favorite Pizza", default: "🍕")
|
|
297
|
-
var favoritePizza: String
|
|
298
|
-
|
|
299
|
-
@Parameter(title: "Random", default: "Hello")
|
|
300
|
-
var random: String
|
|
301
|
-
}${os_1.EOL}`;
|
|
302
|
-
fs.writeFileSync(appIntentPath, content);
|
|
303
261
|
if ([0, 1].includes(type)) {
|
|
304
262
|
content = `import ActivityKit
|
|
305
263
|
import SwiftUI
|
|
306
264
|
import WidgetKit
|
|
307
265
|
import Foundation
|
|
308
266
|
import SharedWidget
|
|
267
|
+
import os
|
|
309
268
|
|
|
310
269
|
struct ${capitalName}LiveActivity: Widget {
|
|
311
|
-
var body: some WidgetConfiguration {
|
|
312
|
-
ActivityConfiguration(for: ${capitalName}Model.self) { context in
|
|
313
|
-
// Lock screen/banner UI goes here
|
|
314
|
-
ContentView(driver: context.state.driverName)
|
|
315
|
-
.activityBackgroundTint(Color.black)
|
|
316
|
-
.activitySystemActionForegroundColor(Color.white)
|
|
317
|
-
|
|
318
|
-
} dynamicIsland: { context in
|
|
319
|
-
DynamicIsland {
|
|
320
|
-
// Expanded UI goes here. Compose the expanded UI through
|
|
321
|
-
// various regions, like leading/trailing/center/bottom
|
|
322
|
-
DynamicIslandExpandedRegion(.leading) {
|
|
323
|
-
if let timeLeft = timeLeft(range1: Date(), range2: context.state.estimatedDeliveryTime) {
|
|
324
|
-
Image(systemName: "car")
|
|
325
|
-
.resizable()
|
|
326
|
-
.scaledToFit()
|
|
327
|
-
.frame(width: 50, height: 50) // Adjust size
|
|
328
|
-
.foregroundColor(timeLeft <= 1000 ? Color.green : Color.orange)
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
DynamicIslandExpandedRegion(.trailing) {
|
|
332
|
-
if let timeLeft = timeLeft(range1: Date(), range2: context.state.estimatedDeliveryTime) {
|
|
333
|
-
ProgressView(value: timeLeft, total: 3600)
|
|
334
|
-
.progressViewStyle(.circular)
|
|
335
|
-
.tint(timeLeft <= 1000 ? Color.green : Color.orange)
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
DynamicIslandExpandedRegion(.bottom) {
|
|
339
|
-
if let timeLeft = timeLeft(range1: Date(), range2: context.state.estimatedDeliveryTime) {
|
|
340
|
-
Text("\\(context.state.driverName) \\(timeLeft <= 0 ? "has arrived!" : String(format: "is %.1f min away", timeLeft / 60))")
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
} compactLeading: {
|
|
344
|
-
if let timeLeft = timeLeft(range1: Date(), range2: context.state.estimatedDeliveryTime) {
|
|
345
|
-
Image(systemName: "car")
|
|
346
|
-
.resizable()
|
|
347
|
-
.scaledToFit()
|
|
348
|
-
.frame(width: 20, height: 20)
|
|
349
|
-
.foregroundColor(timeLeft <= 0 ? .green : .orange)
|
|
350
|
-
}
|
|
351
|
-
} compactTrailing: {
|
|
352
|
-
if let timeLeft = timeLeft(range1: Date(), range2: context.state.estimatedDeliveryTime) {
|
|
353
|
-
Image(systemName: "timer.circle.fill")
|
|
354
|
-
.resizable()
|
|
355
|
-
.scaledToFit()
|
|
356
|
-
.frame(width: 20, height: 20)
|
|
357
|
-
.foregroundColor(timeLeft <= 0 ? .green : .orange)
|
|
358
|
-
}
|
|
359
|
-
} minimal: {
|
|
360
|
-
Text(context.state.driverName).font(.system(size: 12))
|
|
361
|
-
}
|
|
362
|
-
.widgetURL(URL(string: "http://www.apple.com"))
|
|
363
|
-
.keylineTint(Color.red)
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
270
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
271
|
+
var body: some WidgetConfiguration {
|
|
272
|
+
ActivityConfiguration(for: ${capitalName}Model.self) { context in
|
|
273
|
+
|
|
274
|
+
LockScreenView(message: context.state.message, deliveryTime: context.state.deliveryTime)
|
|
275
|
+
.activityBackgroundTint(Color.black)
|
|
276
|
+
.activitySystemActionForegroundColor(Color.white)
|
|
277
|
+
|
|
278
|
+
} dynamicIsland: { context in
|
|
279
|
+
DynamicIsland {
|
|
280
|
+
DynamicIslandExpandedRegion(.leading) {
|
|
281
|
+
Image(systemName: context.state.deliveryTime >= 0 ? "car.side.arrowtriangle.up.fill" : "face.smiling.inverse")
|
|
282
|
+
.resizable()
|
|
283
|
+
.scaledToFit()
|
|
284
|
+
.frame(width: 50, height: 50)
|
|
285
|
+
.foregroundColor(context.state.deliveryTime >= 0 ? Color.green : Color.blue)
|
|
286
|
+
}
|
|
287
|
+
DynamicIslandExpandedRegion(.trailing) {
|
|
288
|
+
if (context.state.deliveryTime >= 0) {
|
|
289
|
+
ZStack {
|
|
290
|
+
ProgressView(value: context.state.deliveryTime, total: 60)
|
|
291
|
+
.progressViewStyle(.circular)
|
|
292
|
+
.tint(Color.green)
|
|
293
|
+
.frame(width: 75, height: 75)
|
|
294
|
+
Text("\\(formatter.string(for: context.state.deliveryTime) ?? "") mins")
|
|
295
|
+
.font(.system(size: 11))
|
|
296
|
+
.foregroundStyle(.white)
|
|
297
|
+
}.frame(width: 75, height: 75)
|
|
298
|
+
} else {
|
|
299
|
+
Image(systemName: "checkmark.circle.fill")
|
|
300
|
+
.resizable()
|
|
301
|
+
.scaledToFit()
|
|
302
|
+
.frame(width: 50, height: 50)
|
|
303
|
+
.foregroundColor(.blue)
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
DynamicIslandExpandedRegion(.bottom) {
|
|
307
|
+
Text("\\(context.state.message)")
|
|
308
|
+
}
|
|
309
|
+
} compactLeading: {
|
|
310
|
+
Image(systemName: context.state.deliveryTime >= 0 ? "car.side.arrowtriangle.up.fill" : "face.smiling.inverse")
|
|
311
|
+
.resizable()
|
|
312
|
+
.scaledToFit()
|
|
313
|
+
.frame(width: 20, height: 20)
|
|
314
|
+
.foregroundColor(context.state.deliveryTime >= 0 ? .green : .blue)
|
|
315
|
+
} compactTrailing: {
|
|
316
|
+
Image(systemName: context.state.deliveryTime >= 0 ? "timer.circle.fill" : "checkmark.circle.fill")
|
|
317
|
+
.resizable()
|
|
318
|
+
.scaledToFit()
|
|
319
|
+
.frame(width: 20, height: 20)
|
|
320
|
+
.foregroundColor(context.state.deliveryTime >= 0 ? .green : .blue)
|
|
321
|
+
} minimal: {
|
|
322
|
+
Text(context.state.message).font(.system(size: 12))
|
|
323
|
+
}
|
|
324
|
+
.widgetURL(URL(string: "http://www.apple.com"))
|
|
325
|
+
.keylineTint(Color.red)
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
private let formatter: NumberFormatter = {
|
|
330
|
+
let formatter = NumberFormatter()
|
|
331
|
+
formatter.maximumFractionDigits = 0
|
|
332
|
+
formatter.minimumFractionDigits = 0
|
|
333
|
+
return formatter
|
|
334
|
+
}()
|
|
378
335
|
}
|
|
379
336
|
|
|
380
|
-
struct
|
|
381
|
-
|
|
337
|
+
struct LockScreenView: View {
|
|
338
|
+
@State private var message = ""
|
|
339
|
+
@State private var deliveryTime: Double = 0
|
|
340
|
+
// for console debugging
|
|
341
|
+
let logger = Logger(subsystem: "${bundleId}.${name}", category: "Widget")
|
|
382
342
|
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
343
|
+
var body: some View {
|
|
344
|
+
ZStack {
|
|
345
|
+
LinearGradient(
|
|
346
|
+
gradient: Gradient(colors: [Color.gray.opacity(0.3), Color.black]),
|
|
347
|
+
startPoint: .top,
|
|
348
|
+
endPoint: .bottom
|
|
349
|
+
)
|
|
350
|
+
VStack {
|
|
351
|
+
Spacer()
|
|
352
|
+
Image(systemName: deliveryTime >= 0 ? "car.side.arrowtriangle.up.fill" : "face.smiling.inverse")
|
|
353
|
+
.resizable()
|
|
354
|
+
.scaledToFit()
|
|
355
|
+
.frame(width: 50, height: 50)
|
|
356
|
+
.foregroundColor(deliveryTime >= 0 ? .green : .blue)
|
|
357
|
+
Spacer()
|
|
358
|
+
Text("\\(message)")
|
|
359
|
+
.foregroundStyle(.white)
|
|
360
|
+
Spacer()
|
|
361
|
+
}
|
|
362
|
+
}.frame(maxWidth: .infinity, maxHeight: .infinity)
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
init(message: String = "", deliveryTime: Double = 0) {
|
|
366
|
+
_message = State(initialValue: message)
|
|
367
|
+
_deliveryTime = State(initialValue: deliveryTime)
|
|
368
|
+
|
|
369
|
+
// Logs the deliveryTime at init for debugging purposes if needed
|
|
370
|
+
logger.log("deliveryTime: \\(deliveryTime)")
|
|
371
|
+
}
|
|
392
372
|
}${os_1.EOL}`;
|
|
393
373
|
fs.writeFileSync(widgetLiveActivityPath, content);
|
|
394
374
|
}
|
|
@@ -396,129 +376,179 @@ struct ContentView: View {
|
|
|
396
376
|
content = `import SwiftUI
|
|
397
377
|
import WidgetKit
|
|
398
378
|
|
|
399
|
-
|
|
379
|
+
/**
|
|
380
|
+
* Widget data shared between the app and the widget extension.
|
|
381
|
+
*/
|
|
382
|
+
struct WidgetData: Codable {
|
|
383
|
+
let pizzas: [String]
|
|
384
|
+
let orderTime: Double
|
|
385
|
+
let delivered: Bool
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
struct Provider: TimelineProvider {
|
|
389
|
+
|
|
400
390
|
func placeholder(in context: Context) -> SimpleEntry {
|
|
401
|
-
SimpleEntry(date: Date(),
|
|
391
|
+
SimpleEntry(date: Date(), pizza: "Pepperoni", delivered: false, orderTime: Date())
|
|
402
392
|
}
|
|
403
|
-
|
|
404
|
-
func
|
|
405
|
-
|
|
406
|
-
|
|
393
|
+
|
|
394
|
+
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
|
|
395
|
+
let entry = SimpleEntry(date: Date(), pizza: "Pepperoni", delivered: false, orderTime: Date())
|
|
396
|
+
completion(entry)
|
|
407
397
|
}
|
|
408
|
-
|
|
409
|
-
func
|
|
410
|
-
SimpleEntry
|
|
411
|
-
> {
|
|
398
|
+
|
|
399
|
+
func getTimeline(in context: Context, completion: @escaping @Sendable (Timeline<Entry>) -> ()) {
|
|
412
400
|
var entries: [SimpleEntry] = []
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
401
|
+
|
|
402
|
+
if let sharedDefaults = UserDefaults(suiteName: "group.${bundleId}") {
|
|
403
|
+
let currentDate = Date()
|
|
404
|
+
if let jsonString = sharedDefaults.string(forKey: "widgetData") {
|
|
405
|
+
if let jsonData = jsonString.data(using: .utf8) {
|
|
406
|
+
do {
|
|
407
|
+
let widgetData = try JSONDecoder().decode(WidgetData.self, from: jsonData)
|
|
408
|
+
let pizzas = widgetData.pizzas
|
|
409
|
+
let orderTime = Date(timeIntervalSince1970: widgetData.orderTime/1000)
|
|
410
|
+
let delivered = widgetData.delivered
|
|
411
|
+
|
|
412
|
+
// Generate a timeline of entries 1 second apart, starting from the current date.
|
|
413
|
+
for secondOffset in 0..<pizzas.count {
|
|
414
|
+
let entryDate = Calendar.current.date(
|
|
415
|
+
byAdding: .second, value: secondOffset, to: currentDate)!
|
|
416
|
+
let entry = SimpleEntry(date: entryDate, pizza: secondOffset < pizzas.count ? pizzas[secondOffset] : pizzas[0], delivered: delivered, orderTime: orderTime)
|
|
417
|
+
entries.append(entry)
|
|
418
|
+
}
|
|
419
|
+
} catch {
|
|
420
|
+
print("Failed to decode JSON: (error)")
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
} else {
|
|
424
|
+
let entry = SimpleEntry(date: currentDate, pizza: "", delivered: false, orderTime: nil)
|
|
425
|
+
entries.append(entry)
|
|
431
426
|
}
|
|
432
|
-
let entry = SimpleEntry(date: entryDate, random: config.random, configuration: config)
|
|
433
|
-
entries.append(entry)
|
|
434
427
|
}
|
|
435
|
-
|
|
436
|
-
|
|
428
|
+
|
|
429
|
+
let timeline = Timeline(entries: entries, policy: .atEnd)
|
|
430
|
+
completion(timeline)
|
|
437
431
|
}
|
|
432
|
+
|
|
433
|
+
// func relevances() async -> WidgetRelevances<Void> {
|
|
434
|
+
// // Generate a list containing the contexts this widget is relevant in.
|
|
435
|
+
// }
|
|
438
436
|
}
|
|
439
437
|
|
|
440
438
|
struct SimpleEntry: TimelineEntry {
|
|
441
439
|
let date: Date
|
|
442
|
-
let
|
|
443
|
-
let
|
|
440
|
+
let pizza: String
|
|
441
|
+
let delivered: Bool
|
|
442
|
+
let orderTime: Date?
|
|
444
443
|
}
|
|
445
444
|
|
|
446
445
|
struct WidgetView: View {
|
|
446
|
+
@Environment(\\.widgetFamily) var widgetFamily
|
|
447
447
|
var entry: Provider.Entry
|
|
448
448
|
|
|
449
449
|
var body: some View {
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
.
|
|
456
|
-
|
|
457
|
-
.
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
450
|
+
VStack {
|
|
451
|
+
if (entry.pizza != "") {
|
|
452
|
+
Spacer()
|
|
453
|
+
Image(systemName: entry.delivered ? "face.smiling.inverse" : "car.side")
|
|
454
|
+
.resizable()
|
|
455
|
+
.scaledToFit()
|
|
456
|
+
.frame(width: iconSize(for: widgetFamily), height: iconSize(for: widgetFamily))
|
|
457
|
+
.foregroundColor(entry.delivered ? .blue : .green)
|
|
458
|
+
Spacer()
|
|
459
|
+
if (entry.delivered) {
|
|
460
|
+
Text("Pizza Delivered!")
|
|
461
|
+
.font(.system(size: fontSize(for: widgetFamily), weight: .bold))
|
|
462
|
+
.foregroundStyle(.white)
|
|
463
|
+
} else {
|
|
464
|
+
HStack(spacing: 4) {
|
|
465
|
+
Text("Ordered:")
|
|
466
|
+
.font(.system(size: fontSize(for: widgetFamily)))
|
|
467
|
+
.foregroundStyle(.white)
|
|
468
|
+
Text(entry.orderTime!, style: .time)
|
|
469
|
+
.font(.system(size: fontSize(for: widgetFamily), weight: .bold))
|
|
470
|
+
.foregroundStyle(.white)
|
|
471
|
+
}
|
|
472
|
+
HStack(spacing: 4) {
|
|
473
|
+
Text("Pizza:")
|
|
474
|
+
.font(.system(size: fontSize(for: widgetFamily)))
|
|
475
|
+
.foregroundStyle(.white)
|
|
476
|
+
Text(entry.pizza)
|
|
477
|
+
.font(.system(size: fontSize(for: widgetFamily), weight: .bold))
|
|
478
|
+
.foregroundStyle(.white)
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
Spacer()
|
|
482
|
+
} else {
|
|
483
|
+
Spacer()
|
|
484
|
+
Image(systemName: "car.side.rear.open")
|
|
485
|
+
.resizable()
|
|
486
|
+
.scaledToFit()
|
|
487
|
+
.frame(width: iconSize(for: widgetFamily), height: iconSize(for: widgetFamily))
|
|
488
|
+
.foregroundColor(.gray)
|
|
489
|
+
Spacer()
|
|
490
|
+
Text("Awaiting orders...")
|
|
465
491
|
.foregroundStyle(.white)
|
|
492
|
+
Spacer()
|
|
466
493
|
}
|
|
467
494
|
}.frame(maxWidth: .infinity, maxHeight: .infinity)
|
|
468
495
|
}
|
|
496
|
+
|
|
497
|
+
private func iconSize(for family: WidgetFamily) -> CGFloat {
|
|
498
|
+
switch family {
|
|
499
|
+
case .systemSmall:
|
|
500
|
+
return 65
|
|
501
|
+
case .systemMedium:
|
|
502
|
+
return 85
|
|
503
|
+
case .systemLarge:
|
|
504
|
+
return 150
|
|
505
|
+
default:
|
|
506
|
+
return 65
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
private func fontSize(for family: WidgetFamily) -> CGFloat {
|
|
511
|
+
switch family {
|
|
512
|
+
case .systemSmall:
|
|
513
|
+
return 12
|
|
514
|
+
case .systemMedium:
|
|
515
|
+
return 14
|
|
516
|
+
case .systemLarge:
|
|
517
|
+
return 18
|
|
518
|
+
default:
|
|
519
|
+
return 14
|
|
520
|
+
}
|
|
521
|
+
}
|
|
469
522
|
}
|
|
470
523
|
|
|
471
524
|
@available(iOSApplicationExtension 17.0, *)
|
|
472
525
|
struct ${capitalName}HomeScreenWidget: Widget {
|
|
473
526
|
let kind: String = "widget"
|
|
474
|
-
|
|
527
|
+
|
|
475
528
|
var body: some WidgetConfiguration {
|
|
476
|
-
|
|
477
|
-
entry in
|
|
529
|
+
StaticConfiguration(kind: kind, provider: Provider()) { entry in
|
|
478
530
|
WidgetView(entry: entry)
|
|
479
|
-
.containerBackground(
|
|
531
|
+
.containerBackground(for: .widget) {
|
|
532
|
+
LinearGradient(
|
|
533
|
+
gradient: Gradient(colors: [Color.black.opacity(0.6), Color.black]),
|
|
534
|
+
startPoint: .top,
|
|
535
|
+
endPoint: .bottom
|
|
536
|
+
)
|
|
537
|
+
}
|
|
480
538
|
}
|
|
481
|
-
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
extension ConfigurationAppIntent {
|
|
485
|
-
fileprivate static var pepperoni: ConfigurationAppIntent {
|
|
486
|
-
let intent = ConfigurationAppIntent()
|
|
487
|
-
intent.favoritePizza = "Pepperoni"
|
|
488
|
-
intent.random = "Georgia"
|
|
489
|
-
return intent
|
|
490
|
-
}
|
|
491
|
-
fileprivate static var supreme: ConfigurationAppIntent {
|
|
492
|
-
let intent = ConfigurationAppIntent()
|
|
493
|
-
intent.favoritePizza = "Supreme"
|
|
494
|
-
intent.random = "Kansas City"
|
|
495
|
-
return intent
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
fileprivate static var cowboy: ConfigurationAppIntent {
|
|
499
|
-
let intent = ConfigurationAppIntent()
|
|
500
|
-
intent.favoritePizza = "Cowboy"
|
|
501
|
-
intent.random = "Nashville"
|
|
502
|
-
return intent
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
fileprivate static var pineswine: ConfigurationAppIntent {
|
|
506
|
-
let intent = ConfigurationAppIntent()
|
|
507
|
-
intent.favoritePizza = "Pine & Swine"
|
|
508
|
-
intent.random = "Portland"
|
|
509
|
-
return intent
|
|
539
|
+
.configurationDisplayName("${capitalName} Widget")
|
|
540
|
+
.description("${capitalName} delivery service.")
|
|
510
541
|
}
|
|
511
542
|
}
|
|
512
543
|
|
|
513
544
|
#Preview(as: .systemSmall) {
|
|
514
545
|
${capitalName}HomeScreenWidget()
|
|
515
546
|
} timeline: {
|
|
516
|
-
SimpleEntry(date: .now,
|
|
517
|
-
SimpleEntry(date: .now,
|
|
547
|
+
SimpleEntry(date: .now, pizza: "Pepperoni", delivered: false, orderTime: Date())
|
|
548
|
+
SimpleEntry(date: .now, pizza: "Hawaiian", delivered: false, orderTime: Date())
|
|
518
549
|
}${os_1.EOL}`;
|
|
519
550
|
fs.writeFileSync(widgetHomeScreenPath, content);
|
|
520
551
|
}
|
|
521
|
-
const bundleId = this.$projectConfigService.getValue(`id`, "");
|
|
522
552
|
content = `{
|
|
523
553
|
"${bundleId}.${name}": "{set-your-provision-profile-id}"
|
|
524
554
|
}`;
|
|
@@ -540,7 +570,6 @@ extension ConfigurationAppIntent {
|
|
|
540
570
|
encoding: "utf-8",
|
|
541
571
|
}));
|
|
542
572
|
if (!appInfoPlist[appSupportLiveActivity]) {
|
|
543
|
-
// @ts-ignore
|
|
544
573
|
appInfoPlist[appSupportLiveActivity] = true;
|
|
545
574
|
const appPlist = plist.build(appInfoPlist);
|
|
546
575
|
fs.writeFileSync(appInfoPlistPath, appPlist);
|
|
@@ -552,7 +581,6 @@ extension ConfigurationAppIntent {
|
|
|
552
581
|
encoding: "utf-8",
|
|
553
582
|
}));
|
|
554
583
|
if (!appEntitlementsPlist[appGroupKey]) {
|
|
555
|
-
// @ts-ignore
|
|
556
584
|
appEntitlementsPlist[appGroupKey] = [`group.${bundleId}`];
|
|
557
585
|
const appEntitlements = plist.build(appEntitlementsPlist);
|
|
558
586
|
console.log("appentitlement:", appEntitlements);
|
|
@@ -625,17 +653,15 @@ extension ConfigurationAppIntent {
|
|
|
625
653
|
fs.writeFileSync(extensionsConfigPath, content);
|
|
626
654
|
console.log(`🚀 Your widget is now ready to develop: App_Resources/iOS/extensions/${name}.\n`);
|
|
627
655
|
console.log(`Followup steps:\n
|
|
656
|
+
- Check App_Resources/iOS/build.xcconfig uses IPHONEOS_DEPLOYMENT_TARGET=17 or higher.
|
|
628
657
|
- Update App_Resources/iOS/extensions/provisioning.json with your profile id.
|
|
629
658
|
- Customize App_Resources/iOS/extensions/${name}/${(0, utils_1.capitalizeFirstLetter)(name)}LiveActivity.swift for your display.
|
|
630
659
|
- Customize Shared_Resources/iOS/SharedWidget/Sources/SharedWidget/${(0, utils_1.capitalizeFirstLetter)(name)}Model.swift for your data.
|
|
631
660
|
`);
|
|
632
661
|
}
|
|
633
|
-
// if (fs.existsSync(filePath)) {
|
|
634
|
-
// this.$errors.failWithHelp(`Error: File '${filePath}' already exists.`);
|
|
635
|
-
// return;
|
|
636
|
-
// }
|
|
637
662
|
}
|
|
638
|
-
generateAppleUtility(projectDir, name) {
|
|
663
|
+
generateAppleUtility(projectDir, name, bundleId) {
|
|
664
|
+
const capitalName = (0, utils_1.capitalizeFirstLetter)(name);
|
|
639
665
|
const appResourcePath = this.$projectData.appResourcesDirectoryPath;
|
|
640
666
|
const appResourceSrcPath = path.join(appResourcePath, "iOS", "src");
|
|
641
667
|
const appleUtilityPath = path.join(appResourceSrcPath, `AppleWidgetUtils.swift`);
|
|
@@ -659,16 +685,16 @@ public class AppleWidgetUtils: NSObject {
|
|
|
659
685
|
if ActivityAuthorizationInfo().areActivitiesEnabled {
|
|
660
686
|
let numberOfPizzas = data.object(forKey: "numberOfPizzas") as! Int
|
|
661
687
|
let totalAmount = data.object(forKey: "totalAmount") as! String
|
|
662
|
-
let attrs = ${
|
|
688
|
+
let attrs = ${capitalName}Model(numberOfPizzas: numberOfPizzas, totalAmount: totalAmount)
|
|
663
689
|
|
|
664
|
-
let
|
|
665
|
-
let deliveryTime = data.object(forKey: "deliveryTime") as!
|
|
666
|
-
let initialStatus = ${
|
|
667
|
-
|
|
690
|
+
let message = data.object(forKey: "message") as! String
|
|
691
|
+
let deliveryTime = data.object(forKey: "deliveryTime") as! Double
|
|
692
|
+
let initialStatus = ${capitalName}Model.DeliveryStatus(
|
|
693
|
+
message: message, deliveryTime: deliveryTime)
|
|
668
694
|
let content = ActivityContent(state: initialStatus, staleDate: nil)
|
|
669
695
|
|
|
670
696
|
do {
|
|
671
|
-
let activity = try Activity<${
|
|
697
|
+
let activity = try Activity<${capitalName}Model>.request(
|
|
672
698
|
attributes: attrs,
|
|
673
699
|
content: content,
|
|
674
700
|
pushType: nil)
|
|
@@ -681,13 +707,13 @@ public class AppleWidgetUtils: NSObject {
|
|
|
681
707
|
public static func updateActivity(_ data: NSDictionary) {
|
|
682
708
|
if ActivityAuthorizationInfo().areActivitiesEnabled {
|
|
683
709
|
Task {
|
|
684
|
-
let
|
|
685
|
-
let deliveryTime = data.object(forKey: "deliveryTime") as!
|
|
686
|
-
let status = ${
|
|
687
|
-
|
|
710
|
+
let message = data.object(forKey: "message") as! String
|
|
711
|
+
let deliveryTime = data.object(forKey: "deliveryTime") as! Double
|
|
712
|
+
let status = ${capitalName}Model.DeliveryStatus(
|
|
713
|
+
message: message, deliveryTime: deliveryTime)
|
|
688
714
|
let content = ActivityContent(state: status, staleDate: nil)
|
|
689
715
|
|
|
690
|
-
for activity in Activity<${
|
|
716
|
+
for activity in Activity<${capitalName}Model>.activities {
|
|
691
717
|
await activity.update(content)
|
|
692
718
|
}
|
|
693
719
|
}
|
|
@@ -696,26 +722,37 @@ public class AppleWidgetUtils: NSObject {
|
|
|
696
722
|
public static func cancelActivity(_ data: NSDictionary) {
|
|
697
723
|
if ActivityAuthorizationInfo().areActivitiesEnabled {
|
|
698
724
|
Task {
|
|
699
|
-
let
|
|
700
|
-
let status = ${
|
|
701
|
-
|
|
725
|
+
let message = data.object(forKey: "message") as! String
|
|
726
|
+
let status = ${capitalName}Model.DeliveryStatus(
|
|
727
|
+
message: message, deliveryTime: 0)
|
|
702
728
|
let content = ActivityContent(state: status, staleDate: nil)
|
|
703
729
|
|
|
704
|
-
for activity in Activity<${
|
|
730
|
+
for activity in Activity<${capitalName}Model>.activities {
|
|
705
731
|
await activity.end(content, dismissalPolicy: .immediate)
|
|
706
732
|
}
|
|
707
733
|
}
|
|
708
734
|
}
|
|
709
735
|
}
|
|
710
|
-
public static func
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
736
|
+
public static func getData(key: String) -> String? {
|
|
737
|
+
guard let sharedDefaults = UserDefaults(suiteName: "group.${bundleId}") else {
|
|
738
|
+
return nil
|
|
739
|
+
}
|
|
740
|
+
return sharedDefaults.object(forKey: key) as? String
|
|
741
|
+
}
|
|
742
|
+
public static func updateData(key: String, _ data: String) {
|
|
743
|
+
guard let sharedDefaults = UserDefaults(suiteName: "group.${bundleId}") else {
|
|
744
|
+
return
|
|
745
|
+
}
|
|
746
|
+
sharedDefaults.set(data, forKey: key)
|
|
747
|
+
sharedDefaults.synchronize()
|
|
748
|
+
}
|
|
749
|
+
public static func removeData(key: String) {
|
|
750
|
+
guard let sharedDefaults = UserDefaults(suiteName: "group.${bundleId}") else {
|
|
751
|
+
return
|
|
752
|
+
}
|
|
753
|
+
sharedDefaults.removeObject(forKey: key)
|
|
754
|
+
sharedDefaults.synchronize()
|
|
755
|
+
}
|
|
719
756
|
|
|
720
757
|
// Home Screen Widget Handling
|
|
721
758
|
public static func updateWidget() {
|
|
@@ -739,11 +776,13 @@ declare interface AppleWidgetModelData {
|
|
|
739
776
|
declare class AppleWidgetUtils extends NSObject {
|
|
740
777
|
static startActivity(data: AppleWidgetModelData): void;
|
|
741
778
|
static updateActivity(
|
|
742
|
-
data: Pick<AppleWidgetModelData, "
|
|
779
|
+
data: Pick<AppleWidgetModelData, "message" | "deliveryTime">
|
|
743
780
|
): void;
|
|
744
|
-
static cancelActivity(data: Pick<AppleWidgetModelData, "
|
|
745
|
-
static showAllActivities(): void;
|
|
781
|
+
static cancelActivity(data: Pick<AppleWidgetModelData, "message">): void;
|
|
746
782
|
static updateWidget(): void;
|
|
783
|
+
static updateDataWithKey(key: string, data: string): void;
|
|
784
|
+
static getDataWithKey(key: string): string;
|
|
785
|
+
static removeDataWithKey(key: string): void;
|
|
747
786
|
}${os_1.EOL}`;
|
|
748
787
|
if (!fs.existsSync(referenceTypesPath)) {
|
|
749
788
|
const references = `/// <reference path="./node_modules/@nativescript/types-android/index.d.ts" />
|
|
@@ -764,4 +803,3 @@ declare class AppleWidgetUtils extends NSObject {
|
|
|
764
803
|
exports.WidgetIOSCommand = WidgetIOSCommand;
|
|
765
804
|
yok_1.injector.registerCommand(["widget"], WidgetCommand);
|
|
766
805
|
yok_1.injector.registerCommand(["widget|ios"], WidgetIOSCommand);
|
|
767
|
-
//# sourceMappingURL=widget.js.map
|