├── .gitignore ├── .vitepress ├── config.js └── theme │ ├── HomeComponent.vue │ ├── index.js │ └── tailwind.postcss ├── README.md ├── bridge-api.md ├── capacitor-proposals.md ├── custom-v-direct.md ├── event-communication.md ├── explaining-the-examples.md ├── getting-started.md ├── index.md ├── installation.md ├── introduction.md ├── migration-guide-v2-v4.md ├── migration-guide-v4-v5.md ├── native-custom.md ├── netlify.toml ├── package.json ├── postcss.config.js ├── production-tips.md ├── public ├── assets │ └── images │ │ ├── nativescript-for-capacitor.png │ │ ├── ns-swag.png │ │ └── og_banner.png └── styles.css ├── solution-145.md ├── solution-77.md ├── solution-79.md ├── swag-contest.md ├── tailwind.config.js ├── uninstall.md ├── using-build-mobile.md ├── using-dev-nativescript.md ├── what-is-native.md ├── what-is-the-bridge.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | package-lock.json 4 | .vitepress/dist -------------------------------------------------------------------------------- /.vitepress/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | lang: "en-US", 3 | title: "NativeScript Capacitor", 4 | description: "NativeScript for Capacitor", 5 | 6 | head: [ 7 | ['link', { rel: 'stylesheet', href: 'styles.css' }], 8 | 9 | // SEO 10 | ['meta', { property: 'og:image', content: "https://capacitor.nativescript.org/assets/images/og_banner.png" }], 11 | ['meta', { name: 'og:title', content: "NativeScript for Capacitor" }], 12 | ['meta', { name: 'og:url', content: "https://capacitor.nativescript.org/" }], 13 | ['meta', { name: 'og:site_name', content: "capacitor.nativescript.org" }], 14 | 15 | // SEO:twitter 16 | ['meta', { property: 'twitter:account_id', content: "44608081" }], 17 | ['meta', { name: 'twitter:title', content: "NativeScript for Capacitor" }], 18 | ['meta', { name: 'twitter:url', content: "https://capacitor.nativescript.org/" }], 19 | ['meta', { name: 'twitter:site', content: "@nativescript" }], 20 | ['meta', { name: 'twitter:creator', content: "@nativescript" }], 21 | ['meta', { name: 'twitter:card', content: "summary_large_image" }], 22 | ['meta', { name: 'twitter:image', content: "https://capacitor.nativescript.org/assets/images/og_banner.png" }], 23 | ], 24 | 25 | themeConfig: { 26 | repo: "NativeScript/capacitor-docs", 27 | docsDir: ".", 28 | docsBranch: "main", 29 | logo: "assets/images/nativescript-for-capacitor.png", 30 | 31 | editLinks: true, 32 | editLinkText: "Edit this page on GitHub", 33 | lastUpdated: "Last Updated", 34 | 35 | // algolia: { 36 | // apiKey: 'xxx', 37 | // indexName: 'xxx' 38 | // }, 39 | 40 | nav: [ 41 | { 42 | text: "v5.0.2", 43 | link: "#", 44 | activeMatch: '^nomatch$' 45 | }, 46 | { 47 | text: "Introduction", 48 | link: "/introduction", 49 | activeMatch: "^/introduction", 50 | }, 51 | { 52 | text: "Setup", 53 | link: "/installation", 54 | activeMatch: "^/(installation|getting-started)", 55 | }, 56 | { 57 | text: "Docs", 58 | link: "/explaining-the-examples", 59 | activeMatch: "^/(?!installation|introduction|getting-started|capacitor-proposals|solution-)", 60 | }, 61 | { 62 | text: "Solutions", 63 | link: "/capacitor-proposals", 64 | activeMatch: "^/(capacitor-proposals|solution-)", 65 | }, 66 | ], 67 | 68 | sidebar: { 69 | "/": getSidebar(), 70 | }, 71 | }, 72 | }; 73 | 74 | function getSidebar() { 75 | return [ 76 | { 77 | text: "Introduction", 78 | link: "/introduction" 79 | }, 80 | { 81 | text: "Setup", 82 | children: [ 83 | { text: "Installation", link: "/installation" }, 84 | { text: "Getting Started", link: "/getting-started" }, 85 | ], 86 | }, 87 | { 88 | text: "Docs", 89 | children: [ 90 | { text: "Examples", link: "/explaining-the-examples" }, 91 | { 92 | text: "Development Workflow", 93 | children: [ 94 | { text: "Using dev:nativescript", link: "/using-dev-nativescript" }, 95 | ] 96 | }, 97 | { 98 | text: "Building", 99 | children: [ 100 | { text: "Using build:mobile", link: "/using-build-mobile" }, 101 | { text: "Production Tips", link: "/production-tips" }, 102 | ] 103 | }, 104 | { 105 | text: "@nativescript/capacitor", 106 | children: [ 107 | { text: "What is 'native'?", link: "/what-is-native" }, 108 | ] 109 | }, 110 | { 111 | text: "@nativescript/capacitor/bridge", 112 | children: [ 113 | { text: "What is the 'bridge'?", link: "/what-is-the-bridge" }, 114 | { text: "API Reference", link: "/bridge-api" }, 115 | ] 116 | }, 117 | { 118 | text: "Creating your own helpers", 119 | children: [ 120 | { text: "What is native-custom.d.ts?", link: "/native-custom" }, 121 | { text: "Custom helpers vs direct native?", link: "/custom-v-direct" }, 122 | ] 123 | }, 124 | { 125 | text: "Event communication", 126 | children: [ 127 | { text: "Notify and listen to events", link: "/event-communication" }, 128 | ] 129 | }, 130 | { 131 | text: "Updating", 132 | children: [ 133 | { text: "Migrating v4 to v5", link: "/migration-guide-v4-v5" }, 134 | { text: "Migrating v2 to v4", link: "/migration-guide-v2-v4" }, 135 | ] 136 | }, 137 | ], 138 | }, 139 | { 140 | text: "Solutions", 141 | children: [ 142 | { text: "Capacitor Proposals", link: "/capacitor-proposals" }, 143 | // { text: "Swag Contest!", link: "/swag-contest" }, 144 | { text: "Brightness - #77", link: "/solution-77" }, 145 | { text: "Power Mode - #79", link: "/solution-79" }, 146 | { text: "Zip - #145", link: "/solution-145" }, 147 | ], 148 | }, 149 | { 150 | text: "Uninstall", 151 | children: [ 152 | { text: "npm uninstall", link: "/uninstall" } 153 | ] 154 | } 155 | ]; 156 | } 157 | -------------------------------------------------------------------------------- /.vitepress/theme/HomeComponent.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | NativeScript for Capacitor 10 | 11 | 12 | 13 | The platform at your fingertips. 14 | 15 | 16 | 17 | Get Started → 22 | 23 | 24 | 25 | 29 | 30 | 31 | 32 | 33 | Isolated 34 | NativeScript environment 35 | 36 | 37 | Use NativeScript within your existing Capacitor app. 38 | 39 | 40 | 41 | 44 | 45 | 46 | 47 | 48 | 49 | ./src/nativescript/zip.ts 53 | 54 | 55 | 58 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 72 | 73 | 74 | 75 | 76 | 77 | ./src/app 78 | /explore-container/explore-container.component.ts 82 | 83 | 84 | 87 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | Use anywhere in your 99 | Ionic codebase 100 | 101 | 102 | Completely inactive with zero impact on your 103 | web environment. It is only active when Capacitor is running. 104 | 105 | 106 | 107 | 108 | 109 | 110 | -------------------------------------------------------------------------------- /.vitepress/theme/index.js: -------------------------------------------------------------------------------- 1 | import DefaultTheme from 'vitepress/dist/client/theme-default' 2 | import './tailwind.postcss' 3 | 4 | export default { 5 | ...DefaultTheme, 6 | } 7 | -------------------------------------------------------------------------------- /.vitepress/theme/tailwind.postcss: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @nativescript/capacitor Docs 2 | 3 | https://capacitor.nativescript.org/ 4 | 5 | To develop locally: 6 | 7 | ``` 8 | npm install 9 | npm start 10 | ``` 11 | 12 | To build locally: 13 | 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | Preview the site: 19 | 20 | ``` 21 | http-server .vitepress/dist/ 22 | ``` 23 | -------------------------------------------------------------------------------- /bridge-api.md: -------------------------------------------------------------------------------- 1 | # @nativescript/capacitor/bridge 2 | 3 | The bridge is fundamental to NativeScript for Capacitor and also exposes a few utility methods for quick usage. 4 | 5 | ## iosRootViewController 6 | 7 | The root view controller of your Capacitor app (or topmost presenting controller if using in context of an existing modal). 8 | 9 | - `iosRootViewController()` 10 | 11 | A helper that you, yourself, could write inside `src/nativescript` on your own. We provide it as a convenience because it is so handy and often used. 12 | 13 | #### Example usage: 14 | 15 | ```typescript 16 | import { iosRootViewController } from "@nativescript/capacitor/bridge"; 17 | 18 | const vc = UIViewController.alloc().init(); 19 | vc.view.backgroundColor = UIColor.blueColor; 20 | iosRootViewController().presentModalViewControllerAnimated(vc, true); 21 | ``` 22 | 23 | The source of the helper: 24 | 25 | ```typescript 26 | export const iosRootViewController = () => { 27 | if (native.isAndroid) { 28 | console.log("iosRootViewController is iOS only."); 29 | } else { 30 | const app = UIApplication.sharedApplication; 31 | const win = 32 | app.keyWindow || 33 | (app.windows && app.windows.count > 0 && app.windows.objectAtIndex(0)); 34 | let vc = win.rootViewController; 35 | while (vc && vc.presentedViewController) { 36 | vc = vc.presentedViewController; 37 | } 38 | return vc; 39 | } 40 | }; 41 | ``` 42 | 43 | ## iosAddNotificationObserver (v2+) 44 | 45 | Add an iOS Notification observer. This will internally track the observer references however you will also receive the observer reference as the return value in case you need it. See `iosRemoveNotificationObserver` below for how to remove later. 46 | 47 | - `iosAddNotificationObserver: (notificationName: string, onReceiveCallback: (notification: NSNotification) => void) => any;` 48 | 49 | Learn more in [iOS docs](https://developer.apple.com/documentation/foundation/nsnotificationcenter). 50 | 51 | #### Example usage: 52 | 53 | ```typescript 54 | import { iosAddNotificationObserver } from "@nativescript/capacitor/bridge"; 55 | 56 | iosAddNotificationObserver('AnyEventName', (notification: NSNotification) => { 57 | console.log('AnyEventName:', notification.object) 58 | }); 59 | ``` 60 | 61 | The source of the helper: 62 | 63 | ```typescript 64 | let iosNotificationObserverClass; 65 | let iosNotificationObservers: Array; 66 | 67 | function ensureNotificationObserverClass() { 68 | if (iosNotificationObserverClass) { 69 | return; 70 | } 71 | 72 | @NativeClass 73 | class NotificationObserver extends NSObject { 74 | private _onReceiveCallback: (notification: NSNotification) => void; 75 | 76 | public static initWithCallback(onReceiveCallback: (notification: NSNotification) => void): NotificationObserver { 77 | const observer = super.new(); 78 | observer._onReceiveCallback = onReceiveCallback; 79 | 80 | return observer; 81 | } 82 | 83 | public onReceive(notification: NSNotification): void { 84 | this._onReceiveCallback(notification); 85 | } 86 | 87 | public static ObjCExposedMethods = { 88 | onReceive: { returns: interop.types.void, params: [NSNotification] }, 89 | }; 90 | } 91 | 92 | iosNotificationObserverClass = NotificationObserver; 93 | } 94 | 95 | export const iosAddNotificationObserver = (notificationName: string, onReceiveCallback: (notification: NSNotification) => void) => { 96 | ensureNotificationObserverClass(); 97 | const observer = iosNotificationObserverClass.initWithCallback(onReceiveCallback); 98 | NSNotificationCenter.defaultCenter.addObserverSelectorNameObject(observer, 'onReceive', notificationName, null); 99 | if (!iosNotificationObservers) { 100 | iosNotificationObservers = []; 101 | } 102 | iosNotificationObservers.push(observer); 103 | return observer; 104 | } 105 | ``` 106 | 107 | ## iosRemoveNotificationObserver (v2+) 108 | 109 | Remove an iOS Notification observer. 110 | 111 | - `iosRemoveNotificationObserver: (observer: any, notificationName: string) => void;` 112 | 113 | Learn more in [iOS docs](https://developer.apple.com/documentation/foundation/nsnotificationcenter). 114 | 115 | #### Example usage: 116 | 117 | ```typescript 118 | import { iosAddNotificationObserver, iosRemoveNotificationObserver } from "@nativescript/capacitor/bridge"; 119 | 120 | const observer = iosAddNotificationObserver('AnyEventName', (notification: NSNotification) => { 121 | console.log('AnyEventName:', notification.object) 122 | }); 123 | 124 | iosRemoveNotificationObserver(observer, 'AnyEventName'); 125 | ``` 126 | 127 | The source of the helper: 128 | 129 | ```typescript 130 | export const iosRemoveNotificationObserver = (observer: any, notificationName: string) => { 131 | if (iosNotificationObservers) { 132 | const index = iosNotificationObservers.indexOf(observer); 133 | if (index >= 0) { 134 | iosNotificationObservers.splice(index, 1); 135 | NSNotificationCenter.defaultCenter.removeObserverNameObject(observer, notificationName, null); 136 | } 137 | } 138 | } 139 | ``` 140 | 141 | ## androidCreateDialog 142 | 143 | Create Android fragment dialogs on the fly. 144 | 145 | - `androidCreateDialog(view: () => android.view.View, id?: string)` 146 | 147 | This method is another one that you, yourself, could write inside `src/nativescript`. It's another handy and convenient utility which can be used often for various native ui blending. 148 | 149 | #### Example usage: 150 | 151 | ```typescript 152 | androidCreateDialog(() => { 153 | const activity = (global).androidCapacitorActivity; 154 | 155 | const layout = new android.widget.LinearLayout(activity); 156 | layout.setGravity(android.view.Gravity.CENTER); 157 | layout.setOrientation(android.widget.LinearLayout.VERTICAL); 158 | 159 | const btn = new android.widget.Button(activity); 160 | btn.setText("Ionic"); 161 | layout.addView(btn); 162 | 163 | return layout; 164 | }); 165 | ``` 166 | 167 | The source of the helper: 168 | 169 | ```typescript 170 | let DialogImpl; 171 | let DialogFragmentImpl; 172 | if (native.isAndroid) { 173 | @NativeClass() 174 | class DialogImplClass extends android.app.Dialog { 175 | constructor(fragment, context, themeResId) { 176 | super(context, themeResId); 177 | return global.__native(this); 178 | } 179 | } 180 | 181 | DialogImpl = DialogImplClass; 182 | 183 | @NativeClass() 184 | class DialogFragmentImplClass extends androidx.fragment.app.DialogFragment { 185 | view: () => android.view.View; 186 | id: string; 187 | constructor(view: () => android.view.View, id?: string) { 188 | super(); 189 | this.view = view; 190 | this.id = id; 191 | return global.__native(this); 192 | } 193 | onCreateDialog(savedInstanceState) { 194 | super.onCreateDialog(savedInstanceState); 195 | const activity = (global).androidCapacitorActivity; 196 | 197 | const theme = this.getTheme(); 198 | // In fullscreen mode, get the application's theme. 199 | // theme = activity.getApplicationInfo().theme; 200 | const dialog = new DialogImpl(this, activity, theme); 201 | dialog.setCanceledOnTouchOutside(true); 202 | return dialog; 203 | } 204 | onCreateView(inflater: any, container: any, savedInstanceState: any) { 205 | return this.view(); 206 | } 207 | } 208 | DialogFragmentImpl = DialogFragmentImplClass; 209 | } 210 | 211 | export const androidCreateDialog = ( 212 | view: () => android.view.View, 213 | id?: string 214 | ) => { 215 | const df = new DialogFragmentImpl(view, id); 216 | const fragmentManager = (( 217 | global 218 | )).androidCapacitorActivity.getSupportFragmentManager(); 219 | df.show(fragmentManager, id || uniqueId()); 220 | }; 221 | 222 | // general internal utility 223 | const uniqueId = () => { 224 | return "_" + Math.random().toString(36).substr(2, 9); 225 | }; 226 | ``` 227 | 228 | ## androidBroadcastReceiverRegister 229 | 230 | Register an Android BroadcastReceiver. 231 | 232 | - `androidBroadcastReceiverRegister(intentFilter: string, onReceiveCallback: (context: android.content.Context, intent: android.content.Intent) => void): void` 233 | 234 | Learn more [in Android developer docs](https://developer.android.com/guide/components/broadcasts) as well as [the BroadcastReceiver api docs](https://developer.android.com/reference/android/content/BroadcastReceiver). 235 | 236 | #### Example usage: 237 | 238 | ```typescript 239 | const intentFilter = "android.os.action.POWER_SAVE_MODE_CHANGED"; 240 | androidBroadcastReceiverRegister(intentFilter, (context, intent) => { 241 | const manager: android.os.PowerManager = native.androidCapacitorActivity.getSystemService( 242 | android.content.Context.POWER_SERVICE 243 | ); 244 | console.log( 245 | `Power Save Mode is ${manager.isPowerSaveMode() ? "enabled" : "disabled"}` 246 | ); 247 | }); 248 | ``` 249 | 250 | ## androidBroadcastReceiverUnRegister 251 | 252 | Stop receiving broadcasts for the provided intent filter. 253 | 254 | - `androidBroadcastReceiverUnRegister(intentFilter: string): void` 255 | 256 | #### Example usage: 257 | 258 | ```typescript 259 | const intentFilter = "android.os.action.POWER_SAVE_MODE_CHANGED"; 260 | androidBroadcastReceiverUnRegister(intentFilter); 261 | ``` 262 | 263 | Both BroadcastReceiver utilities are also things you could write yourself but we provide as a convenience. 264 | 265 | The source of these helpers: 266 | 267 | ```typescript 268 | let androidBroadcastReceiverClass; 269 | let androidRegisteredReceivers: { 270 | [key: string]: android.content.BroadcastReceiver; 271 | }; 272 | 273 | function ensureBroadCastReceiverClass() { 274 | if (androidBroadcastReceiverClass) { 275 | return; 276 | } 277 | 278 | @NativeClass 279 | class BroadcastReceiver extends android.content.BroadcastReceiver { 280 | private _onReceiveCallback: ( 281 | context: android.content.Context, 282 | intent: android.content.Intent 283 | ) => void; 284 | 285 | constructor( 286 | onReceiveCallback: ( 287 | context: android.content.Context, 288 | intent: android.content.Intent 289 | ) => void 290 | ) { 291 | super(); 292 | this._onReceiveCallback = onReceiveCallback; 293 | 294 | return global.__native(this); 295 | } 296 | 297 | public onReceive( 298 | context: android.content.Context, 299 | intent: android.content.Intent 300 | ) { 301 | if (this._onReceiveCallback) { 302 | this._onReceiveCallback(context, intent); 303 | } 304 | } 305 | } 306 | 307 | androidBroadcastReceiverClass = BroadcastReceiver; 308 | } 309 | 310 | export const androidBroadcastReceiverRegister = ( 311 | intentFilter: string, 312 | onReceiveCallback: ( 313 | context: android.content.Context, 314 | intent: android.content.Intent 315 | ) => void 316 | ): void => { 317 | ensureBroadCastReceiverClass(); 318 | const registerFunc = (context: android.content.Context) => { 319 | const receiver: android.content.BroadcastReceiver = new androidBroadcastReceiverClass( 320 | onReceiveCallback 321 | ); 322 | context.registerReceiver( 323 | receiver, 324 | new android.content.IntentFilter(intentFilter) 325 | ); 326 | if (!androidRegisteredReceivers) { 327 | androidRegisteredReceivers = {}; 328 | } 329 | androidRegisteredReceivers[intentFilter] = receiver; 330 | }; 331 | 332 | if (global.androidCapacitorActivity) { 333 | registerFunc(global.androidCapacitorActivity); 334 | } 335 | }; 336 | 337 | export const androidBroadcastReceiverUnRegister = ( 338 | intentFilter: string 339 | ): void => { 340 | if (!androidRegisteredReceivers) { 341 | androidRegisteredReceivers = {}; 342 | } 343 | const receiver = androidRegisteredReceivers[intentFilter]; 344 | if (receiver) { 345 | global.androidCapacitorActivity.unregisterReceiver(receiver); 346 | androidRegisteredReceivers[intentFilter] = undefined; 347 | delete androidRegisteredReceivers[intentFilter]; 348 | } 349 | }; 350 | ``` 351 | -------------------------------------------------------------------------------- /capacitor-proposals.md: -------------------------------------------------------------------------------- 1 | # Solutions for the Capacitor Community 2 | 3 | Common solutions to Capacitor Community Proposals found here: 4 | 5 | https://github.com/capacitor-community/proposals 6 | 7 | ## How to Use 8 | 9 | Most solutions can be copy/pasted into your own `src/nativescript` files and wired into your app right away. We will try to provide explanations where needed and further instruction if required to use any posted solution. 10 | 11 | Feel free to [post your own request on the appropriate proposals](https://github.com/capacitor-community/proposals/issues) for NativeScript solutions you'd like to see here. 12 | 13 | ## Community Proposal Solutions 14 | 15 | * [Brightness - Proposal 77](solution-77.md) 16 | * [Power Mode - Proposal 79](solution-79.md) 17 | * [Zip - Proposal 145](solution-145.md) -------------------------------------------------------------------------------- /custom-v-direct.md: -------------------------------------------------------------------------------- 1 | ## When to create a custom helper vs. using "native" API's directly? 2 | 3 | The decision is solely up to you in all cases. The "native" object is quick access to your native platform so it's suitable and conveneient for a lot of quick native setters and/or getters. 4 | 5 | For more complex behavior, creating a custom helper may be cleaner. However everything you can do in a helper, you could also do directly via the "native" object. There's a lot of flexibility here. 6 | 7 | The one technical guidance we would give is that each call from the "native" object is a communication point between your native platform and Capacitor. Thus to keep the communication to a minimum, creating a native helper utility can reduce potentially multiple calls to just one method communication. 8 | 9 | -------------------------------------------------------------------------------- /event-communication.md: -------------------------------------------------------------------------------- 1 | # Notify and listen to events 2 | 3 | When needing to communicate events back and forth between Ionic/Capacitor and your NativeScript utilities you can use: 4 | 5 | * `notifyEvent: (name: string, data?: any) => void`: Notify event name with optional data. 6 | * `onEvent: (name: string, callback: Function) => void`: Listen to event name with callback. 7 | * `removeEvent: (name: string, callback?: Function) => void`: Remove event listeners. 8 | 9 | For example using the [zip example](solution-145) you can use `notifyEvent` in your NativeScript utilities to emit events: 10 | 11 | - `src/nativescript/zip.ts` 12 | 13 | ```ts 14 | // ... 15 | import { notifyEvent } from "@nativescript/capacitor/bridge"; 16 | 17 | native.fileZip = function (options: ZipOptions) { 18 | // ... 19 | 20 | Zip.zip({ 21 | directory, 22 | archive, 23 | onProgress: (progress) => { 24 | notifyEvent('zipProgress', progress); 25 | }, 26 | }).then((filePath) => { 27 | notifyEvent('zipComplete', filePath); 28 | }); 29 | } 30 | }; 31 | ``` 32 | 33 | You can then listen to those events in your Ionic components: 34 | 35 | - `src/app/explore-container.component.ts`: 36 | 37 | ```ts 38 | import { native } from '@nativescript/capacitor' 39 | 40 | // ... 41 | export class ExploreContainerComponent implements OnInit { 42 | ngOnInit() { 43 | native.onEvent('zipComplete', (filepath) => { 44 | console.log('ionic zip complete:', filepath) 45 | }) 46 | native.onEvent('zipProgress', (progress) => { 47 | console.log('ionic zip progress:', progress) 48 | }) 49 | } 50 | } 51 | ``` 52 | -------------------------------------------------------------------------------- /explaining-the-examples.md: -------------------------------------------------------------------------------- 1 | ## Explaining the examples 2 | 3 | The installation includes 1 simple example to give you ideas of possibilities. 4 | 5 | ### `examples/modal.ts` 6 | 7 | An example showing how to do some native ui blending to open a purely native platform modal. 8 | 9 | ```typescript 10 | native.openNativeModalView = () => { 11 | if (native.isAndroid) { 12 | androidCreateDialog(() => { 13 | const activity = native.androidCapacitorActivity; 14 | 15 | const layout = new android.widget.LinearLayout(activity); 16 | layout.setGravity(android.view.Gravity.CENTER); 17 | layout.setOrientation(android.widget.LinearLayout.VERTICAL); 18 | 19 | const btn = new android.widget.Button(activity); 20 | btn.setText('Ionic'); 21 | layout.addView(btn); 22 | 23 | const btn1 = new android.widget.Button(activity); 24 | btn1.setText('Capacitor'); 25 | layout.addView(btn1); 26 | 27 | return layout; 28 | }); 29 | } else { 30 | const vc = UIViewController.alloc().init(); 31 | vc.view.backgroundColor = UIColor.blueColor; 32 | const label = UILabel.alloc().initWithFrame( 33 | CGRectMake(0, 30, UIScreen.mainScreen.bounds.size.width, 50), 34 | ); 35 | label.text = `Well this is fun.`; 36 | label.textColor = UIColor.orangeColor; 37 | label.textAlignment = NSTextAlignment.Center; 38 | label.font = UIFont.systemFontOfSize(35); 39 | vc.view.addSubview(label); 40 | iosRootViewController().presentModalViewControllerAnimated(vc, true); 41 | } 42 | }; 43 | ``` 44 | 45 | Usage in your Ionic web codebase: 46 | 47 | ```typescript 48 | import { native } from '@nativescript/capacitor'; 49 | 50 | native.openNativeModalView(); // Open native modal 51 | ``` -------------------------------------------------------------------------------- /getting-started.md: -------------------------------------------------------------------------------- 1 | # @nativescript/capacitor is now ready 2 | 3 | Let's take a look at what you have at your fingertips now. 4 | 5 | ## `src/nativescript` 6 | 7 | Your project now contains a powerful isolated environment. 8 | This is where you can write as much NativeScript as your project needs for various platform features and capabilities. 9 | 10 | It is structured as follows: 11 | 12 | ``` 13 | . 14 | ├─ src/nativescript 15 | └─ examples 16 | ├─ modal.ts 17 | └─ simple.ts 18 | ├─ index.ts 19 | ├─ package.json 20 | ├─ references.d.ts 21 | └─ tsconfig.json 22 | ``` 23 | 24 | The `index.ts` alongside the `examples` folder is a great example of how you can scale out native platform features by creating your own organization of additional native helper methods to import and bundle together for your app's usage. 25 | 26 | You can make direct native platform API calls here as well as attach additional methods to the `native` object which your Ionic application can use. 27 | 28 | ### `index.ts`: 29 | 30 | The very first line is important, it initializes the Capacitor communication: 31 | 32 | ```typescript 33 | // init - keep here. 34 | import '@nativescript/capacitor/bridge'; 35 | ``` 36 | 37 | This file allows you to organize various native helpers in your own folder structure and bring together into the single bundle which is delivered with your Capacitor app. 38 | 39 | [Learn more about the bridge api here](bridge-api) 40 | 41 | ## Isolated bundle 42 | 43 | The `src/nativescript` area of your codebase is completely isolated from the rest of your web codebase. This means you are free to go wild with all sorts of native platform behavior throughout your Ionic application with confidence that the `native` object is only **active** when running on the native platform. It is bundled on it's own completely separate from your web build allowing it to operate purely as an additive power helper to your web app when running via Capacitor. 44 | 45 | [Learn more about how to optimize this bundle for production here](production-tips) 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /index.md: -------------------------------------------------------------------------------- 1 | --- 2 | customLayout: true 3 | sidebar: false 4 | --- 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | ```ts 16 | import { Zip } from "@nativescript/zip"; 17 | import { notifyEvent } from "@nativescript/capacitor/bridge"; 18 | 19 | interface ZipOptions { 20 | directory: string, 21 | archive: string 22 | } 23 | 24 | native.fileZip = function (options: ZipOptions) { 25 | const { directory, archive } = options; 26 | Zip.zip({ 27 | directory, 28 | archive, 29 | onProgress: (progress) => { 30 | notifyEvent('zipProgress', progress); 31 | }, 32 | }).then((filePath) => { 33 | notifyEvent('zipComplete', filePath); 34 | }); 35 | }; 36 | ``` 37 | 38 | 39 | 40 | 41 | 42 | ```ts 43 | import { native } from '@nativescript/capacitor'; 44 | 45 | export class ExploreContainerComponent { 46 | fileZip() { 47 | native.onEvent('zipComplete', (filePath: string) => { 48 | console.log('zip created at:', filePath); 49 | }); 50 | 51 | native.fileZip({ 52 | directory: 'assets', 53 | archive: 'assets.zip' 54 | }); 55 | } 56 | } 57 | ``` 58 | 59 | 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /installation.md: -------------------------------------------------------------------------------- 1 | # Installing @nativescript/capacitor 2 | 3 | ## 1. Follow the [Ionic](https://ionicframework.com/getting-started) or [Capacitor](https://capacitorjs.com/docs/getting-started) Getting Started Guide 4 | 5 | :::tip Note 6 | 7 | Compatible with Capacitor 5+ 8 | 9 | ::: 10 | 11 | ```bash 12 | // Ensure you have added iOS and Android platforms to your Capacitor app 13 | 14 | npx cap add android 15 | npx cap add ios 16 | ``` 17 | 18 | ## 2. Install @nativescript/capacitor 19 | 20 | ```bash 21 | npm install @nativescript/capacitor 22 | ``` 23 | 24 | ## 3. Success 25 | 26 | 1. You can now make changes to anything in `src/nativescript`. 27 | 2. In addition to using those utilities via the `native` import throughout your web codebase to access any NativeScript you write: 28 | 29 | ```ts 30 | import { native } from '@nativescript/capacitor'; 31 | ``` 32 | 33 | You can build both your Web app and NativeScript via: 34 | 35 | ```bash 36 | npm run build:mobile 37 | ``` 38 | 39 | Then sync with Capacitor before running on iOS or Android: 40 | 41 | ``` 42 | npx cap sync 43 | ``` 44 | 45 | ### Notes 46 | 47 | Before installing, ensure you have: 48 | 49 | * Followed the Ionic or Capacitor getting started guides above. Ensure you're using Capacitor 5+. 50 | 51 | * Run `npx cap init` once as mentioned in the [Capacitor docs](https://capacitorjs.com/docs/getting-started). 52 | 53 | * Run `npx cap add ios` and/or `npx cap add android` to create the Capacitor platforms. 54 | 55 | * **You can now install @nativescript/capacitor** successfully. 56 | 57 | ## Troubleshooting 58 | 59 | Whenever you `npx cap sync` you may encounter any of the following errors: 60 | 61 | ### Potential error 1 62 | 63 | ```bash 64 | Analyzing dependencies 65 | [!] Unable to satisfy the following requirements: 66 | 67 | - `NativeScriptSDK (~> 8.4.2)` required by `Podfile` 68 | 69 | None of your spec sources contain a spec satisfying the dependency: `NativeScriptSDK (~> 8.4.2)`. 70 | 71 | You have either: 72 | * out-of-date source repos which you can update with `pod repo update`. 73 | * mistyped the name or version. 74 | * not added the source repo that hosts the Podspec to your Podfile. 75 | 76 | Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default. 77 | ``` 78 | 79 | **Solution** 80 | 81 | Run: `pod repo update`, then run `npx cap sync` again. 82 | 83 | ### Potential error 2 84 | 85 | ``` 86 | ✖ Updating iOS native dependencies with pod install - failed! 87 | ✖ update ios - failed! 88 | [error] Analyzing dependencies 89 | Downloading dependencies 90 | Installing NativeScript (8.3.3) 91 | Installing NativeScriptUI (0.1.1) 92 | Installing NativescriptCapacitor 4.0.0 93 | objc[64468]: Class AMSupportURLConnectionDelegate is implemented in both /usr/lib/libauthinstall.dylib 94 | (0x21f712b90) and /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice 95 | (0x103de42c8). One of the two will be used. Which one is undefined. 96 | objc[64468]: Class AMSupportURLSession is implemented in both /usr/lib/libauthinstall.dylib (0x21f712be0) and 97 | /Library/Apple/System/Library/PrivateFrameworks/MobileDevice.framework/Versions/A/MobileDevice (0x103de4318). 98 | One of the two will be used. Which one is undefined. 99 | Searching for inspections failed: undefined method `map' for nil:NilClass 100 | ``` 101 | 102 | **Solution** 103 | 104 | This is known to happen on Mac M1 depending on your setup. You can run the following to correct it: 105 | 106 | ``` 107 | brew upgrade && sudo xcode-select -r 108 | ``` 109 | 110 | That should ensure system dependencies are correct and xcode default path is reset properly. 111 | 112 | ### Potential error 3 113 | 114 | ```bash 115 | Nanaimo::Reader::ParseError - [!] Found additional characters after parsing the root plist object 116 | # ------------------------------------------- 117 | 1> version https://git-lfs.github.com/spec/v1 118 | ^ 119 | # oid sha256:e385dc25878dba8bf63a4ec695d935413db579efc88328284d0dfbc4d440c08d 120 | # size 1463 121 | # ------------------------------------------- 122 | ``` 123 | 124 | **Solution** 125 | 126 | > Please check if you have git-lfs installed and clear cocoapod cache before running install again 127 | 128 | > To clear cache please go to ~/Library/Caches/Cocoapods/ and remove Amity SDK folder - you should be able to run a clean install afterward 129 | 130 | Context: https://community.amity.co/t/found-additional-characters-after-parsing-the-root-plist-object-nanaimo-parseerror/143 131 | 132 | 133 | ### Potential error 4 134 | 135 | For Android, if you see an error like this in Logcat: 136 | 137 | ```bash 138 | 07:39:02.434 18398-18398/? E/TNS.error: metadata folder couldn't be opened! (Error: 2) 139 | ``` 140 | 141 | **Solution** 142 | 143 | You can delete the `android/app/src/main/assets/metadata` folder and rerun. 144 | 145 | ### Potential error 5 146 | 147 | For iOS, after your very first `npx cap sync` and then running the iOS app you may see an error like this in Xcode: 148 | 149 | ```bash 150 | Build input file cannot be found: '/Users/{username}/Library/Developer/Xcode/DerivedData/App-eipugnxycvymmgcaaenuujqazunt/Build/Products/Debug-iphonesimulator/metadata-arm64.bin'. Did you forget to declare this file as an output of a script phase or custom build rule which produces it? 151 | ``` 152 | 153 | **Solution** 154 | 155 | Just run again. This error can occur on a very first fresh run while Xcode is preparing the project. 156 | 157 | -------------------------------------------------------------------------------- /introduction.md: -------------------------------------------------------------------------------- 1 | ## A Brief Introduction 2 | 3 | [Just take me to the Installation Guide!](installation.md) 4 | 5 | :::tip Note 6 | 7 | This is for Capacitor 4+ 8 | 9 | ::: 10 | 11 | ## What is NativeScript? 12 | 13 | NativeScript enables direct native platform API usage from JavaScript. 14 | 15 | It achieves this through the provided iOS and Android runtimes which create a map of each platform API to your TypeScript codebase. With the NativeScript bundle located in `src/nativescript` within your project, you allow rich platform API development to flourish right from your Ionic web codebase. 16 | 17 | The result is a liberating development experience. 18 | 19 | ## It is uniquely delightful 20 | 21 | NativeScript is a **celebration** 🎉 of the platform. In other words: 22 | 23 | * what the platform provides, NativeScript provides. 24 | 25 | * what the platform does well, NativeScript does well. 26 | 27 | * what the platform says is an error, NativeScript says is an error. 28 | 29 | * what the platform wants you to do, NativeScript wants you to do. 30 | 31 | The API's you interact with via NativeScript **are** the native platform api's. It's not "layers of abstraction" as often talked about amongst "cross platform frameworks". 32 | 33 | NativeScript simply provides a map of your platform to your TypeScript codebase and you just use everything that's made available. 34 | 35 | This means you can refer to "source" documentation like [Apple Developer Docs](https://developer.apple.com/documentation/technologies) and [Android Developer Docs](https://developer.android.com/reference) 36 | 37 | This is unique and **one of a kind**. 38 | 39 | ## Performance and Stability 40 | 41 | Performance is lightning ⚡ fast due to the "real time marshalling" of platform API calls directly from JavaScript. 42 | 43 | NativeScript is extremely stable and has been developed and deployed to enterprise production critical applications for well over 6+ years now. 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /migration-guide-v2-v4.md: -------------------------------------------------------------------------------- 1 | ## Migrating from v2 to v4 2 | 3 | @nativescript/capacitor follows Capacitor major version releases now. 4 | 5 | For existing v2 users, you can update by: 6 | 7 | 1. Update `package.json`: 8 | 9 | ```ts 10 | "@nativescript/capacitor": "^4.0.0" 11 | ``` 12 | 13 | 2. Update `AppDelegate.swift`: 14 | 15 | From this: 16 | ```ts 17 | self.nativescript?.runMainScript() 18 | ``` 19 | 20 | to this: 21 | ```ts 22 | self.nativescript?.runMainApplication() 23 | ``` 24 | 25 | 3. Update `ios/App/Podfile` to reference the latest `~8.3.3` Pod and adjust the post_install setup: 26 | 27 | ```ts 28 | require_relative '../../node_modules/@nativescript/capacitor/ios/nativescript.rb' 29 | require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' 30 | 31 | platform :ios, '13.0' 32 | use_frameworks! 33 | 34 | # workaround to avoid Xcode caching of Pods that requires 35 | # Product -> Clean Build Folder after new Cordova plugins installed 36 | # Requires CocoaPods 1.6 or newer 37 | install! 'cocoapods', :disable_input_output_paths => true 38 | 39 | def capacitor_pods 40 | pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' 41 | pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' 42 | pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' 43 | pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics' 44 | pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' 45 | pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar' 46 | pod 'NativescriptCapacitor', :path => '../../node_modules/@nativescript/capacitor' 47 | end 48 | 49 | target 'App' do 50 | capacitor_pods 51 | # Add your Pods here 52 | 53 | pod 'NativeScript', '~> 8.3.3' 54 | pod 'NativeScriptUI' 55 | end 56 | 57 | post_install do |installer| 58 | assertDeploymentTarget(installer) 59 | 60 | nativescript_capacitor_post_install(installer) 61 | end 62 | ``` 63 | 64 | 4. Ensure latest pod specs are refreshed locally 65 | 66 | You can run `pod repo update` to ensure the latest references are available on your system. 67 | 68 | 5. Clean project dependencies and ensure lock (if using) is updated to reflect latest @nativescript/capacitor 4.0.0 is installed. 69 | 70 | 6. Ensure native projects are cleaned before running with updates. 71 | -------------------------------------------------------------------------------- /migration-guide-v4-v5.md: -------------------------------------------------------------------------------- 1 | ## Migrating from v4 to v5 2 | 3 | @nativescript/capacitor follows Capacitor major version releases. 4 | 5 | For existing v4 users, you can update by: 6 | 7 | 1. Update `package.json`: 8 | 9 | ```ts 10 | "@nativescript/capacitor": "^5.0.0" 11 | ``` 12 | 13 | 2. Update `ios/App/Podfile` to reference the latest `NativeScriptSDK ~8.4.2` Pod and adjust the post_install setup: 14 | 15 | ```ts 16 | require_relative '../../node_modules/@nativescript/capacitor/ios/nativescript.rb' 17 | require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' 18 | 19 | platform :ios, '13.0' 20 | use_frameworks! 21 | 22 | # workaround to avoid Xcode caching of Pods that requires 23 | # Product -> Clean Build Folder after new Cordova plugins installed 24 | # Requires CocoaPods 1.6 or newer 25 | install! 'cocoapods', :disable_input_output_paths => true 26 | 27 | def capacitor_pods 28 | pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' 29 | pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' 30 | pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' 31 | pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics' 32 | pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' 33 | pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar' 34 | pod 'NativescriptCapacitor', :path => '../../node_modules/@nativescript/capacitor' 35 | end 36 | 37 | target 'App' do 38 | capacitor_pods 39 | # Add your Pods here 40 | 41 | pod 'NativeScriptSDK', '~> 8.4.2' 42 | pod 'NativeScriptUI', '~> 0.1.2' 43 | end 44 | 45 | post_install do |installer| 46 | assertDeploymentTarget(installer) 47 | 48 | nativescript_capacitor_post_install(installer) 49 | end 50 | 51 | ``` 52 | 53 | 3. Ensure latest pod specs are refreshed locally 54 | 55 | You can run `pod repo update` to ensure the latest references are available on your system. 56 | 57 | 4. Clean project dependencies and ensure lock (if using) is updated to reflect latest @nativescript/capacitor 5.0.0 is installed. 58 | 59 | 5. Ensure native projects are cleaned before running with updates. 60 | -------------------------------------------------------------------------------- /native-custom.md: -------------------------------------------------------------------------------- 1 | # native-custom.d.ts 2 | 3 | You can attach as many custom utilities to the "native" object as your project demands. 4 | 5 | When adding your own native helpers, you can expand this interface to provide strong type checking for extra utilities you add to your project. 6 | 7 | ```typescript 8 | declare module '@nativescript/capacitor' { 9 | export interface customNativeAPI extends nativeCustom {} 10 | } 11 | 12 | /** 13 | * Define your own strongly typed native helpers here. 14 | */ 15 | export interface nativeCustom { 16 | openNativeModalView: () => void; 17 | } 18 | 19 | ``` 20 | 21 | The example provided, `openNativeModalView`, can be found in the `nativeCustom` interface to give you guidance on how to add your own. 22 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = ".vitepress/dist" 3 | command = "yarn build" 4 | 5 | [build.environment] 6 | NETLIFY_USE_YARN = "true" 7 | YARN_FLAGS = "--ignore-engines" 8 | NODE_VERSION = "15" -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "capacitor-docs", 3 | "version": "1.0.0", 4 | "description": "NativeScript for Capacitor Docs", 5 | "main": "index.js", 6 | "repository": "https://github.com/NativeScript/capacitor-docs.git", 7 | "author": "NativeScript TSC", 8 | "license": "MIT", 9 | "private": true, 10 | "scripts": { 11 | "start": "npm run dev", 12 | "dev": "vitepress dev .", 13 | "build": "vitepress build .", 14 | "serve": "vitepress serve ." 15 | }, 16 | "devDependencies": { 17 | "autoprefixer": "^10.4.5", 18 | "postcss": "^8.4.12", 19 | "tailwindcss": "^3.0.24", 20 | "vitepress": "^0.22.3" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /production-tips.md: -------------------------------------------------------------------------------- 1 | # Production Tips 2 | 3 | You can add 2 additional flags to your NativeScript build when preparing your app for production. 4 | 5 | * `--env=uglify=true` Minifies the bundle. 6 | 7 | * `--env=production=true` Bundles with webpack's production mode on. 8 | 9 | You can either add these to the provide build script or create your own production npm scripts, for example in your `package.json` scripts: 10 | 11 | ```shell 12 | "build:nativescript:prod": "build-nativescript --env=uglify=true --env=production=true", 13 | "build:mobile:prod": "npm-run-all build build:nativescript:prod" 14 | ``` -------------------------------------------------------------------------------- /public/assets/images/nativescript-for-capacitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NativeScript/capacitor-docs/c512644bacd40d62267a1bd4f4ecc7cdcce3ae00/public/assets/images/nativescript-for-capacitor.png -------------------------------------------------------------------------------- /public/assets/images/ns-swag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NativeScript/capacitor-docs/c512644bacd40d62267a1bd4f4ecc7cdcce3ae00/public/assets/images/ns-swag.png -------------------------------------------------------------------------------- /public/assets/images/og_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NativeScript/capacitor-docs/c512644bacd40d62267a1bd4f4ecc7cdcce3ae00/public/assets/images/og_banner.png -------------------------------------------------------------------------------- /public/styles.css: -------------------------------------------------------------------------------- 1 | /** Base Styles */ 2 | :root { 3 | 4 | /** 5 | * Colors 6 | * --------------------------------------------------------------------- */ 7 | 8 | --c-white: #ffffff; 9 | --c-black: #000000; 10 | 11 | --c-divider-light: rgba(60, 60, 67, .12); 12 | --c-divider-dark: rgba(84, 84, 88, .48); 13 | 14 | --c-text-light-1: #2c3e50; 15 | --c-text-light-2: #476582; 16 | --c-text-light-3: #90a4b7; 17 | 18 | --c-brand: #65ADF1 !important; 19 | --c-brand-light: #81b4e4 !important; 20 | 21 | /** 22 | * Typography 23 | * --------------------------------------------------------------------- */ 24 | 25 | --font-family-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; 26 | --font-family-mono: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; 27 | 28 | /** 29 | * Z Indexes 30 | * 31 | * Algolia SearchBox has a z-index of 200, so make sure not to go above 32 | * that value. 33 | * --------------------------------------------------------------------- */ 34 | 35 | --z-index-navbar: 10; 36 | --z-index-sidebar: 6; 37 | 38 | /** 39 | * Shadows 40 | * --------------------------------------------------------------------- */ 41 | 42 | --shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06); 43 | --shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07); 44 | --shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08); 45 | --shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12); 46 | --shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16); 47 | 48 | /** 49 | * Sizes 50 | * --------------------------------------------------------------------- */ 51 | 52 | --header-height: 3.6rem; 53 | } 54 | 55 | /** Fallback Styles */ 56 | :root { 57 | 58 | --c-divider: var(--c-divider-light); 59 | 60 | --c-text: var(--c-text-light-1); 61 | --c-text-light: var(--c-text-light-2); 62 | --c-text-lighter: var(--c-text-light-3); 63 | 64 | --c-bg: var(--c-white); 65 | 66 | --code-line-height: 24px; 67 | --code-font-family: var(--font-family-mono); 68 | --code-font-size: 14px; 69 | --code-inline-bg-color: rgba(27, 31, 35, .05); 70 | --code-bg-color: #282c34; 71 | 72 | } 73 | 74 | .theme { 75 | --border-color: rgb(226, 232, 240); 76 | --header-height: 3.6rem; 77 | --sidebar-width: 16.4rem; 78 | --text-color: #2c3e50; 79 | --text-color-light: #476582; 80 | --code-bg-color: #282c34; 81 | --accent-color: var(--c-brand) !important; 82 | } 83 | 84 | .hero .nav-link:hover { 85 | background-color: var(--c-brand-light) !important; 86 | } 87 | 88 | .nav-bar-title .logo { 89 | height: 1.8rem !important; 90 | } 91 | 92 | /* hides site title next to the logo */ 93 | .nav-bar-title { 94 | font-size: 0 !important; 95 | } 96 | 97 | .custom-block.tip, 98 | .custom-block.warning, 99 | .custom-block.danger { 100 | margin-top: 1rem; 101 | margin-bottom: 1rem; 102 | overflow-x: auto; 103 | border-left-width: 8px; 104 | padding-left: 1.5rem; 105 | padding-right: 1.5rem; 106 | padding-top: 0.25rem; 107 | padding-bottom: 0.25rem; 108 | } 109 | 110 | .custom-block.tip { 111 | background-color: #f1f5f9; 112 | border-color: #93c5fd; 113 | } 114 | 115 | .custom-block.warning { 116 | border-color: #fcd34d; 117 | color: #78350f; 118 | background-color: #fef3c7; 119 | } 120 | 121 | .custom-block.warning .custom-block-title { 122 | color: #92400e; 123 | } 124 | 125 | .custom-block.warning a { 126 | color: #b45309; 127 | } 128 | 129 | .custom-block.danger { 130 | border-color: #dc2626; 131 | color: #7f1d1d; 132 | background-color: #fee2e2; 133 | } 134 | 135 | .custom-block.danger .custom-block-title { 136 | color: #991b1b; 137 | } 138 | 139 | .custom-block.danger a { 140 | color: #b91c1c; 141 | } 142 | 143 | .custom-block > details { 144 | position: relative; 145 | margin-top: 0.5rem; 146 | margin-bottom: 0.5rem; 147 | display: block; 148 | border-radius: 0.125rem; 149 | --tw-bg-opacity: 1; 150 | background-color: rgba(255, 255, 255, var(--tw-bg-opacity)); 151 | --tw-bg-opacity: 0.7; 152 | padding-left: 1rem; 153 | padding-right: 1rem; 154 | padding-top: 0.5rem; 155 | padding-bottom: 0.5rem; 156 | } 157 | 158 | .custom-block > details h4 { 159 | margin-top: 0px; 160 | } 161 | 162 | .custom-block > details figure:last-child, 163 | .custom-block > details p:last-child { 164 | margin-bottom: 0px; 165 | padding-bottom: 0px; 166 | } 167 | 168 | .custom-block > details summary { 169 | cursor: pointer; 170 | outline: 2px solid transparent; 171 | outline-offset: 2px; 172 | } 173 | 174 | .custom-block-title { 175 | font-weight: 700; 176 | } 177 | -------------------------------------------------------------------------------- /solution-145.md: -------------------------------------------------------------------------------- 1 | # Zip 2 | 3 | https://github.com/capacitor-community/proposals/issues/145 4 | 5 | This example uses [@nativescript/zip](https://docs.nativescript.org/plugins/zip.html) 6 | 7 | Open `ios/App/Podfile` and let Capacitor's iOS build use `SSZipArchive` as well: 8 | 9 | ```ts 10 | def capacitor_pods 11 | pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' 12 | pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' 13 | pod 'NativescriptCapacitor', :path => '../../node_modules/@nativescript/capacitor' 14 | end 15 | 16 | target 'App' do 17 | capacitor_pods 18 | # Add your Pods here 19 | 20 | # NativeScript 21 | pod 'NativeScriptSDK', '~> 8.4.2' 22 | pod 'NativeScriptUI' 23 | 24 | # Zip/Unzip 25 | pod 'SSZipArchive', '~> 2.4.3' 26 | end 27 | ``` 28 | 29 | ### `src/nativescript/index.ts`: 30 | 31 | ```typescript 32 | // Zip 33 | import "./zip"; 34 | ``` 35 | 36 | ### `src/nativescript/zip.ts`: 37 | 38 | ```typescript 39 | import { Zip } from "@nativescript/zip"; 40 | import { path, knownFolders } from "@nativescript/core"; 41 | import { notifyEvent } from "@nativescript/capacitor/bridge"; 42 | import { ZipOptions } from "../../native-custom"; 43 | 44 | native.fileZip = function (options: ZipOptions) { 45 | const directory = path.join(knownFolders.documents().path, options.directory); 46 | const archive = path.join(knownFolders.temp().path, options.archive); 47 | 48 | if (options.unzip) { 49 | Zip.unzip({ 50 | directory, 51 | archive, 52 | onProgress: (progress) => { 53 | notifyEvent("unzipProgress", progress); 54 | }, 55 | }).then((filePath) => { 56 | notifyEvent("unzipComplete", filePath); 57 | }); 58 | } else { 59 | Zip.zip({ 60 | directory, 61 | archive, 62 | onProgress: (progress) => { 63 | notifyEvent("zipProgress", progress); 64 | }, 65 | }).then((filePath) => { 66 | notifyEvent("zipComplete", filePath); 67 | }); 68 | } 69 | }; 70 | ``` 71 | 72 | ## Usage in your Ionic web codebase: 73 | 74 | Provide strong type checking for this new helper by modifying the following: 75 | 76 | ### `src/native-custom.d.ts` 77 | 78 | ```typescript 79 | /** 80 | * Define your own strongly typed native helpers here. 81 | */ 82 | export interface ZipOptions { 83 | directory: string; 84 | archive?: string; 85 | unzip?: boolean; 86 | } 87 | 88 | export interface nativeCustom { 89 | fileZip(options: ZipOptions): void; 90 | } 91 | ``` 92 | 93 | Now you can use it anywhere in your Ionic web codebase with the following: 94 | 95 | ```typescript 96 | import { native } from "@nativescript/capacitor"; 97 | 98 | native.onEvent("zipComplete", (filepath) => { 99 | console.log("ionic zip complete:", filepath); 100 | }); 101 | native.onEvent("zipProgress", (progress) => { 102 | console.log("ionic zip progress:", progress); 103 | }); 104 | 105 | native.fileZip({ 106 | directory: "assets", 107 | archive: "assets.zip" 108 | }); 109 | ``` 110 | -------------------------------------------------------------------------------- /solution-77.md: -------------------------------------------------------------------------------- 1 | # Screen Brightness 2 | 3 | https://github.com/capacitor-community/proposals/issues/77 4 | 5 | ### `src/nativescript/index.ts`: 6 | 7 | ```typescript 8 | // Screen Brightness 9 | import "./brightness"; 10 | ``` 11 | 12 | ### `src/nativescript/brightness.ts`: 13 | 14 | ```typescript 15 | native.setScreenBrightness = (value: number) => { 16 | if (native.isAndroid) { 17 | const context = native.androidCapacitorActivity; 18 | if (android.os.Build.VERSION.SDK_INT < 23) { 19 | const attr = context.getWindow().getAttributes(); 20 | attr.screenBrightness = value; 21 | context.getWindow().setAttributes(attr); 22 | } else { 23 | if (!android.provider.Settings.System.canWrite(context)) { 24 | const intent = new android.content.Intent( 25 | android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS 26 | ); 27 | intent.setData( 28 | android.net.Uri.parse("package:" + context.getPackageName()) 29 | ); 30 | intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK); 31 | context.startActivity(intent); 32 | } 33 | 34 | if (android.provider.Settings.System.canWrite(context)) { 35 | android.provider.Settings.System.putInt( 36 | context.getContentResolver(), 37 | android.provider.Settings.System.SCREEN_BRIGHTNESS, 38 | value * 100 39 | ); 40 | } 41 | } 42 | } else { 43 | UIScreen.mainScreen.brightness = value; 44 | } 45 | }; 46 | ``` 47 | 48 | ## Usage in your Ionic web codebase: 49 | 50 | Provide strong type checking for this new helper by modifying the following: 51 | 52 | ### `src/native-custom.d.ts` 53 | 54 | ```typescript 55 | /** 56 | * Define your own strongly typed native helpers here. 57 | */ 58 | export interface nativeCustom { 59 | setScreenBrightness: (value: number) => void; 60 | } 61 | ``` 62 | 63 | Now you can use it anywhere in your Ionic web codebase with the following: 64 | 65 | ```typescript 66 | import { native } from '@nativescript/capacitor'; 67 | 68 | native.setScreenBrightness(.8); 69 | ``` 70 | -------------------------------------------------------------------------------- /solution-79.md: -------------------------------------------------------------------------------- 1 | # Power Mode 2 | 3 | https://github.com/capacitor-community/proposals/issues/79 4 | 5 | ### `src/nativescript/index.ts`: 6 | 7 | ```typescript 8 | // Power Mode 9 | import "./power-mode"; 10 | ``` 11 | 12 | ### `src/nativescript/power-mode.ts`: 13 | 14 | ```typescript 15 | import { 16 | androidBroadcastReceiverRegister, 17 | androidBroadcastReceiverUnRegister, 18 | } from "@nativescript/capacitor/bridge"; 19 | 20 | let isListening = false; 21 | let clientCallback: (isEnabled: boolean) => void; 22 | let observer; 23 | 24 | native.togglePowerModeListener = (callback?: (isEnabled: boolean) => void) => { 25 | clientCallback = callback; 26 | if (native.isAndroid) { 27 | const action = "android.os.action.POWER_SAVE_MODE_CHANGED"; 28 | if (!isListening) { 29 | isListening = true; 30 | androidBroadcastReceiverRegister(action, (context, intent) => { 31 | const manager: android.os.PowerManager = native.androidCapacitorActivity.getSystemService( 32 | android.content.Context.POWER_SERVICE 33 | ); 34 | if (manager && clientCallback) { 35 | clientCallback(manager.isPowerSaveMode()); 36 | } 37 | }); 38 | } else { 39 | isListening = false; 40 | androidBroadcastReceiverUnRegister(action); 41 | } 42 | } else { 43 | if (!isListening) { 44 | isListening = true; 45 | observer = NSNotificationCenter.defaultCenter.addObserverForNameObjectQueueUsingBlock( 46 | NSProcessInfoPowerStateDidChangeNotification, 47 | null, 48 | null, 49 | (n: NSNotification) => { 50 | if (clientCallback) { 51 | clientCallback(NSProcessInfo.processInfo.lowPowerModeEnabled); 52 | } 53 | } 54 | ); 55 | } else { 56 | isListening = false; 57 | NSNotificationCenter.defaultCenter.removeObserver(observer); 58 | } 59 | } 60 | }; 61 | 62 | native.isInLowPowerMode = () => { 63 | if (native.isAndroid) { 64 | const manager: android.os.PowerManager = native.androidCapacitorActivity.getSystemService( 65 | android.content.Context.POWER_SERVICE 66 | ); 67 | if (manager) { 68 | return manager.isPowerSaveMode(); 69 | } 70 | } else { 71 | return NSProcessInfo.processInfo.lowPowerModeEnabled; 72 | } 73 | return false; 74 | }; 75 | ``` 76 | 77 | ## Usage in your Ionic web codebase: 78 | 79 | Provide strong type checking for this new helper by modifying the following: 80 | 81 | ### `src/native-custom.d.ts` 82 | 83 | ```typescript 84 | /** 85 | * Define your own strongly typed native helpers here. 86 | */ 87 | export interface nativeCustom { 88 | togglePowerModeListener: (callback?: (isEnabled: boolean) => void) => void; 89 | } 90 | ``` 91 | 92 | Now you can use it anywhere in your Ionic web codebase with the following: 93 | 94 | ```typescript 95 | import { native } from '@nativescript/capacitor'; 96 | 97 | native.togglePowerModeListener((isEnabled: boolean) => { 98 | console.log("Power Mode changed:", isEnabled); 99 | }); 100 | ``` -------------------------------------------------------------------------------- /swag-contest.md: -------------------------------------------------------------------------------- 1 | # Did someone say "Free Swag"? 2 | 3 | **Yes!** 4 | 5 | For the first 10 developers whom create helpful solutions to any of the [listed Capacitor Community proposals here](https://github.com/capacitor-community/proposals/issues) with this plugin, we will send you: 6 | 7 | * 2 sweet bottle openers 8 | 9 | * 2 sweet socks 10 | 11 | *annnndddd...* 12 | 13 | * 2 stress balls! 14 | 15 | Once you create a solution, just post a comment on that proposal linking to your solution and send an email to support@nativescript.org with a link to your comment and mailing address and we will send you a sweet goodie bag! 16 | 17 |  -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: ["./.vitepress/**/*.{vue,js,ts}"], 3 | theme: { 4 | extend: { 5 | keyframes: { 6 | "move-bg": { 7 | to: { 8 | backgroundPosition: "400% 0", 9 | }, 10 | }, 11 | }, 12 | animation: { 13 | "move-bg": "move-bg 20s infinite linear", 14 | }, 15 | }, 16 | }, 17 | plugins: [], 18 | options: { 19 | safelist: ['html', 'body'], 20 | }, 21 | corePlugins: { 22 | preflight: false 23 | } 24 | }; 25 | -------------------------------------------------------------------------------- /uninstall.md: -------------------------------------------------------------------------------- 1 | ## Doesn't fit your needs? 2 | 3 | You can remove NativeScript from Capacitor with: 4 | 5 | 1. `node ./node_modules/.bin/uninstall-nativescript.js` - will remove ios/android build steps 6 | 2. `npm uninstall @nativescript/capacitor` - will remove npm package 7 | 3. It is up to you if you'd like to archive the `src/nativescript` folder for later use; It will no longer be used regardless. 8 | 9 | If you find the uninstall doesn't clean you up enough, feel free to let us know [here](https://github.com/NativeScript/capacitor/issues). -------------------------------------------------------------------------------- /using-build-mobile.md: -------------------------------------------------------------------------------- 1 | # Building your project 2 | 3 | Some additional npm scripts the plugin added to your project: 4 | 5 | ```shell 6 | "build:nativescript": "build-nativescript", 7 | "build:mobile": "npm-run-all build build:nativescript" 8 | ``` 9 | 10 | ### `build:nativescript` 11 | 12 | Used to bundle just your NativeScript changes from `src/nativescript`. It is built into a `nativescript` folder inside your `webDir` as specified in your `capacitor.config.json` or `capacitor.config.ts`. 13 | 14 | ### `build:mobile` 15 | 16 | This will always build your web codebase and follow with bundling the NativeScript portion second which is what you will want when preparing your project for Capacitor. You can always follow this command with `npx cap sync` to then update your Capacitor platforms. 17 | 18 | Tip: When you were using `npm run build`, you can now simply use `npm run build:mobile` instead and it will achieve what you would want. 19 | 20 | ## Building .android and .ios files 21 | 22 | When organizing NativeScript by `.android.ts` and `.ios.ts` files -- something we recommend when building out a lot of NativeScript, [see more here](https://docs.nativescript.org/best-practices/platform-file-split-or-not.html), we can expand our build scripts to handle each. Doing so will create optimized bundle's with only the specific platform code in them, for example, instead of the default build scripts, we can expand them to handle each: 23 | 24 | ```json 25 | { 26 | "scripts": { 27 | "build:nativescript:android": "build-nativescript --env=platform=android", 28 | "build:nativescript:ios": "build-nativescript --env=platform=ios", 29 | "build:mobile:android": "npm-run-all build build:nativescript:android", 30 | "build:mobile:ios": "npm-run-all build build:nativescript:ios" 31 | } 32 | } 33 | ``` 34 | 35 | These are purely suggestions and you are welcome to setup your scripts anyway you wish. 36 | -------------------------------------------------------------------------------- /using-dev-nativescript.md: -------------------------------------------------------------------------------- 1 | # Development Workflow 2 | 3 | You will find a couple additional npm scripts the plugin added to your project. For example, this one can be used to auto reload the app when making changes within the `src/nativescript` folder: 4 | 5 | ```shell 6 | "dev:nativescript": "dev-nativescript" 7 | ``` 8 | 9 | You can run `yarn dev:nativescript` when focusing on various NativeScript development efforts for more app live reloading to try changes. -------------------------------------------------------------------------------- /what-is-native.md: -------------------------------------------------------------------------------- 1 | # What is 'native'? 2 | 3 | The `native` object which `@nativescript/capacitor` provides is a [JavaScript Proxy](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy). 4 | 5 | This allows the api to be *active* only when run on the native platform via Capacitor. Otherwise it is completely *inactive* when used inside a standalone web browser. 6 | 7 | The Proxy also allows each "dot notation" from it to translate and marshall "in real time" to your native platform. 8 | 9 | ## Quick access 10 | 11 | Using the `native` object is meant to be a quick access utility to anything you need from your native platform. It's also intended to be expanded upon with your own helper methods as you see fit. 12 | 13 | It exposes platform API's as made public by each native platform. 14 | 15 | All native properties which handle "primitive" types (string, number, boolean) use a standard interface for fetching native values from your platform device: 16 | 17 | ```typescript 18 | export interface NativeProperty { 19 | get: Promise 20 | set: (value: T) => Promise 21 | } 22 | ``` 23 | 24 | This means if you want to get your current device screen brightness, you could use something like this on iOS for example: 25 | 26 | ```typescript 27 | const value = await native.UIScreen.mainScreen.brightness.get; 28 | console.log(value); // your screen brightness value 29 | ``` 30 | 31 | And if you want to set the brightness: 32 | 33 | ```typescript 34 | native.UIScreen.mainScreen.brightness.set(.8); 35 | ``` 36 | 37 | -------------------------------------------------------------------------------- /what-is-the-bridge.md: -------------------------------------------------------------------------------- 1 | # What is '@nativescript/capacitor/bridge'? 2 | 3 | 1. This bridge initializes the Capacitor communication. 4 | 5 | 2. Can only be used from within `src/nativescript`. 6 | 7 | 3. Contains helper methods to aid in common behaviors. 8 | 9 | :::tip Note 10 | 11 | Additional low level helper methods will grow in time here. 12 | 13 | ::: 14 | 15 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@algolia/autocomplete-core@1.5.2": 6 | version "1.5.2" 7 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.5.2.tgz#ec0178e07b44fd74a057728ac157291b26cecf37" 8 | integrity sha512-DY0bhyczFSS1b/CqJlTE/nQRtnTAHl6IemIkBy0nEWnhDzRDdtdx4p5Uuk3vwAFxwEEgi1WqKwgSSMx6DpNL4A== 9 | dependencies: 10 | "@algolia/autocomplete-shared" "1.5.2" 11 | 12 | "@algolia/autocomplete-preset-algolia@1.5.2": 13 | version "1.5.2" 14 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.5.2.tgz#36c5638cc6dba6ea46a86e5a0314637ca40a77ca" 15 | integrity sha512-3MRYnYQFJyovANzSX2CToS6/5cfVjbLLqFsZTKcvF3abhQzxbqwwaMBlJtt620uBUOeMzhdfasKhCc40+RHiZw== 16 | dependencies: 17 | "@algolia/autocomplete-shared" "1.5.2" 18 | 19 | "@algolia/autocomplete-shared@1.5.2": 20 | version "1.5.2" 21 | resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.5.2.tgz#e157f9ad624ab8fd940ff28bd2094cdf199cdd79" 22 | integrity sha512-ylQAYv5H0YKMfHgVWX0j0NmL8XBcAeeeVQUmppnnMtzDbDnca6CzhKj3Q8eF9cHCgcdTDdb5K+3aKyGWA0obug== 23 | 24 | "@algolia/cache-browser-local-storage@4.8.5": 25 | version "4.8.5" 26 | resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.8.5.tgz" 27 | integrity sha512-9rs/Yi82ilgifweJamOy4DlJ4xPGsCN/zg+RKy4vjytNhOrkEHLRQC8vPZ3OhD8KVlw9lRQIZTlgjgFl8iMeeA== 28 | dependencies: 29 | "@algolia/cache-common" "4.8.5" 30 | 31 | "@algolia/cache-common@4.8.5": 32 | version "4.8.5" 33 | resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.8.5.tgz" 34 | integrity sha512-4SvRWnagKtwBFAy8Rsfmv0/Uk53fZL+6dy2idwdx6SjMGKSs0y1Qv+thb4h/k/H5MONisAoT9C2rgZ/mqwh5yw== 35 | 36 | "@algolia/cache-in-memory@4.8.5": 37 | version "4.8.5" 38 | resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.8.5.tgz" 39 | integrity sha512-XBBfqs28FbjwLboY3sxvuzBgYsuXdFsj2mUvkgxfb0GVEzwW4I0NM7KzSPwT+iht55WS1PgIOnynjmhPsrubCw== 40 | dependencies: 41 | "@algolia/cache-common" "4.8.5" 42 | 43 | "@algolia/client-account@4.8.5": 44 | version "4.8.5" 45 | resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.8.5.tgz" 46 | integrity sha512-DjXMpeCdY4J4IDBfowiG6Xl9ec/FhG1NpPQM0Uv4xXsc/TeeZ1JgbgNDhWe9jW0jBEALy+a/RmPrZ0vsxcadsg== 47 | dependencies: 48 | "@algolia/client-common" "4.8.5" 49 | "@algolia/client-search" "4.8.5" 50 | "@algolia/transporter" "4.8.5" 51 | 52 | "@algolia/client-analytics@4.8.5": 53 | version "4.8.5" 54 | resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.8.5.tgz" 55 | integrity sha512-PQEY+chbHmZnRJdaWsvUYzDpEPr60az0EPUexdouvXGZId15/SnDaXjnf89F7tYmCzkHdUtG4bSvPzAupQ4AFA== 56 | dependencies: 57 | "@algolia/client-common" "4.8.5" 58 | "@algolia/client-search" "4.8.5" 59 | "@algolia/requester-common" "4.8.5" 60 | "@algolia/transporter" "4.8.5" 61 | 62 | "@algolia/client-common@4.8.5": 63 | version "4.8.5" 64 | resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.8.5.tgz" 65 | integrity sha512-Dn8vog2VrGsJeOcBMcSAEIjBtPyogzUBGlh1DtVd0m8GN6q+cImCESl6DY846M2PTYWsLBKBksq37eUfSe9FxQ== 66 | dependencies: 67 | "@algolia/requester-common" "4.8.5" 68 | "@algolia/transporter" "4.8.5" 69 | 70 | "@algolia/client-recommendation@4.8.5": 71 | version "4.8.5" 72 | resolved "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.8.5.tgz" 73 | integrity sha512-ffawCC1C25rCa8/JU2niRZgwr8aV9b2qsLVMo73GXFzi2lceXPAe9K68mt/BGHU+w7PFUwVHsV2VmB+G/HQRVw== 74 | dependencies: 75 | "@algolia/client-common" "4.8.5" 76 | "@algolia/requester-common" "4.8.5" 77 | "@algolia/transporter" "4.8.5" 78 | 79 | "@algolia/client-search@4.8.5": 80 | version "4.8.5" 81 | resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.8.5.tgz" 82 | integrity sha512-Ru2MljGZWrSQ0CVsDla11oGEPL/RinmVkLJfBtQ+/pk1868VfpAQFGKtOS/b8/xLrMA0Vm4EfC3Mgclk/p3KJA== 83 | dependencies: 84 | "@algolia/client-common" "4.8.5" 85 | "@algolia/requester-common" "4.8.5" 86 | "@algolia/transporter" "4.8.5" 87 | 88 | "@algolia/logger-common@4.8.5": 89 | version "4.8.5" 90 | resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.8.5.tgz" 91 | integrity sha512-PS6NS6bpED0rAxgCPGhjZJg9why0PnoVEE7ZoCbPq6lsAOc6FPlQLri4OiLyU7wx8RWDoVtOadyzulqAAsfPSQ== 92 | 93 | "@algolia/logger-console@4.8.5": 94 | version "4.8.5" 95 | resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.8.5.tgz" 96 | integrity sha512-3+4gLSbwzuGmrb5go3IZNcFIYVMSbB4c8UMtWEJ/gDBtgGZIvT6f/KlvVSOHIhthSxaM3Y13V6Qile/SpGqc6A== 97 | dependencies: 98 | "@algolia/logger-common" "4.8.5" 99 | 100 | "@algolia/requester-browser-xhr@4.8.5": 101 | version "4.8.5" 102 | resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.8.5.tgz" 103 | integrity sha512-M/Gf2vv/fU4+CqDW+wok7HPpEcLym3NtDzU9zaPzGYI/9X7o36581oyfnzt2pNfsXSQVj5a2pZVUWC3Z4SO27w== 104 | dependencies: 105 | "@algolia/requester-common" "4.8.5" 106 | 107 | "@algolia/requester-common@4.8.5": 108 | version "4.8.5" 109 | resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.8.5.tgz" 110 | integrity sha512-OIhsdwIrJVAlVlP7cwlt+RoR5AmxAoTGrFokOY9imVmgqXUUljdKO/DjhRL8vwYGFEidZ9efIjAIQ2B3XOhT9A== 111 | 112 | "@algolia/requester-node-http@4.8.5": 113 | version "4.8.5" 114 | resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.8.5.tgz" 115 | integrity sha512-viHAjfo53A3VSE7Bb/nzgpSMZ3prPp2qti7Wg8w7qxhntppKp3Fln6t4Vp+BoPOqruLsj139xXhheAKeRcYa0w== 116 | dependencies: 117 | "@algolia/requester-common" "4.8.5" 118 | 119 | "@algolia/transporter@4.8.5": 120 | version "4.8.5" 121 | resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.8.5.tgz" 122 | integrity sha512-Rb3cMlh/GoJK0+g+49GNA3IvR/EXsDEBwpyM+FOotSwxgiGt1wGBHM0K2v0GHwIEcuww02pl6KMDVlilA+qh0g== 123 | dependencies: 124 | "@algolia/cache-common" "4.8.5" 125 | "@algolia/logger-common" "4.8.5" 126 | "@algolia/requester-common" "4.8.5" 127 | 128 | "@babel/parser@^7.16.4": 129 | version "7.17.9" 130 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" 131 | integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== 132 | 133 | "@docsearch/css@3.0.0", "@docsearch/css@^3.0.0-alpha.41": 134 | version "3.0.0" 135 | resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0.tgz#fe57b474802ffd706d3246eab25d52fac8aa3698" 136 | integrity sha512-1kkV7tkAsiuEd0shunYRByKJe3xQDG2q7wYg24SOw1nV9/2lwEd4WrUYRJC/ukGTl2/kHeFxsaUvtiOy0y6fFA== 137 | 138 | "@docsearch/js@^3.0.0-alpha.41": 139 | version "3.0.0" 140 | resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.0.0.tgz#394a99f68895503d57faf523ecec0b25b02f638c" 141 | integrity sha512-j3tUJWlgW3slYqzGB8fm7y05kh2qqrIK1dZOXHeMUm/5gdKE85fiz/ltfCPMDFb/MXF+bLZChJXSMzqY0Ck30Q== 142 | dependencies: 143 | "@docsearch/react" "3.0.0" 144 | preact "^10.0.0" 145 | 146 | "@docsearch/react@3.0.0": 147 | version "3.0.0" 148 | resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0.tgz#d02ebdc67573412185a6a4df13bc254c7c0da491" 149 | integrity sha512-yhMacqS6TVQYoBh/o603zszIb5Bl8MIXuOc6Vy617I74pirisDzzcNh0NEaYQt50fVVR3khUbeEhUEWEWipESg== 150 | dependencies: 151 | "@algolia/autocomplete-core" "1.5.2" 152 | "@algolia/autocomplete-preset-algolia" "1.5.2" 153 | "@docsearch/css" "3.0.0" 154 | algoliasearch "^4.0.0" 155 | 156 | "@nodelib/fs.scandir@2.1.4": 157 | version "2.1.4" 158 | resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz" 159 | integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== 160 | dependencies: 161 | "@nodelib/fs.stat" "2.0.4" 162 | run-parallel "^1.1.9" 163 | 164 | "@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": 165 | version "2.0.4" 166 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz" 167 | integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== 168 | 169 | "@nodelib/fs.walk@^1.2.3": 170 | version "1.2.6" 171 | resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz" 172 | integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== 173 | dependencies: 174 | "@nodelib/fs.scandir" "2.1.4" 175 | fastq "^1.6.0" 176 | 177 | "@vitejs/plugin-vue@^2.2.0": 178 | version "2.3.1" 179 | resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-2.3.1.tgz#5f286b8d3515381c6d5c8fa8eee5e6335f727e14" 180 | integrity sha512-YNzBt8+jt6bSwpt7LP890U1UcTOIZZxfpE5WOJ638PNxSEKOqAi0+FSKS0nVeukfdZ0Ai/H7AFd6k3hayfGZqQ== 181 | 182 | "@vue/compiler-core@3.2.33": 183 | version "3.2.33" 184 | resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.33.tgz#e915d59cce85898f5c5cfebe4c09e539278c3d59" 185 | integrity sha512-AAmr52ji3Zhk7IKIuigX2osWWsb2nQE5xsdFYjdnmtQ4gymmqXbjLvkSE174+fF3A3kstYrTgGkqgOEbsdLDpw== 186 | dependencies: 187 | "@babel/parser" "^7.16.4" 188 | "@vue/shared" "3.2.33" 189 | estree-walker "^2.0.2" 190 | source-map "^0.6.1" 191 | 192 | "@vue/compiler-dom@3.2.33": 193 | version "3.2.33" 194 | resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.33.tgz#6db84296f949f18e5d3e7fd5e80f943dbed7d5ec" 195 | integrity sha512-GhiG1C8X98Xz9QUX/RlA6/kgPBWJkjq0Rq6//5XTAGSYrTMBgcLpP9+CnlUg1TFxnnCVughAG+KZl28XJqw8uQ== 196 | dependencies: 197 | "@vue/compiler-core" "3.2.33" 198 | "@vue/shared" "3.2.33" 199 | 200 | "@vue/compiler-sfc@3.2.33": 201 | version "3.2.33" 202 | resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.33.tgz#7ce01dc947a8b76c099811dc6ca58494d4dc773d" 203 | integrity sha512-H8D0WqagCr295pQjUYyO8P3IejM3vEzeCO1apzByAEaAR/WimhMYczHfZVvlCE/9yBaEu/eu9RdiWr0kF8b71Q== 204 | dependencies: 205 | "@babel/parser" "^7.16.4" 206 | "@vue/compiler-core" "3.2.33" 207 | "@vue/compiler-dom" "3.2.33" 208 | "@vue/compiler-ssr" "3.2.33" 209 | "@vue/reactivity-transform" "3.2.33" 210 | "@vue/shared" "3.2.33" 211 | estree-walker "^2.0.2" 212 | magic-string "^0.25.7" 213 | postcss "^8.1.10" 214 | source-map "^0.6.1" 215 | 216 | "@vue/compiler-ssr@3.2.33": 217 | version "3.2.33" 218 | resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.33.tgz#3e820267e4eea48fde9519f006dedca3f5e42e71" 219 | integrity sha512-XQh1Xdk3VquDpXsnoCd7JnMoWec9CfAzQDQsaMcSU79OrrO2PNR0ErlIjm/mGq3GmBfkQjzZACV+7GhfRB8xMQ== 220 | dependencies: 221 | "@vue/compiler-dom" "3.2.33" 222 | "@vue/shared" "3.2.33" 223 | 224 | "@vue/reactivity-transform@3.2.33": 225 | version "3.2.33" 226 | resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.33.tgz#286063f44ca56150ae9b52f8346a26e5913fa699" 227 | integrity sha512-4UL5KOIvSQb254aqenW4q34qMXbfZcmEsV/yVidLUgvwYQQ/D21bGX3DlgPUGI3c4C+iOnNmDCkIxkILoX/Pyw== 228 | dependencies: 229 | "@babel/parser" "^7.16.4" 230 | "@vue/compiler-core" "3.2.33" 231 | "@vue/shared" "3.2.33" 232 | estree-walker "^2.0.2" 233 | magic-string "^0.25.7" 234 | 235 | "@vue/reactivity@3.2.33": 236 | version "3.2.33" 237 | resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.33.tgz#c84eedb5225138dbfc2472864c151d3efbb4b673" 238 | integrity sha512-62Sq0mp9/0bLmDuxuLD5CIaMG2susFAGARLuZ/5jkU1FCf9EDbwUuF+BO8Ub3Rbodx0ziIecM/NsmyjardBxfQ== 239 | dependencies: 240 | "@vue/shared" "3.2.33" 241 | 242 | "@vue/runtime-core@3.2.33": 243 | version "3.2.33" 244 | resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.33.tgz#2df8907c85c37c3419fbd1bdf1a2df097fa40df2" 245 | integrity sha512-N2D2vfaXsBPhzCV3JsXQa2NECjxP3eXgZlFqKh4tgakp3iX6LCGv76DLlc+IfFZq+TW10Y8QUfeihXOupJ1dGw== 246 | dependencies: 247 | "@vue/reactivity" "3.2.33" 248 | "@vue/shared" "3.2.33" 249 | 250 | "@vue/runtime-dom@3.2.33": 251 | version "3.2.33" 252 | resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.33.tgz#123b8969247029ea0d9c1983676d4706a962d848" 253 | integrity sha512-LSrJ6W7CZTSUygX5s8aFkraDWlO6K4geOwA3quFF2O+hC3QuAMZt/0Xb7JKE3C4JD4pFwCSO7oCrZmZ0BIJUnw== 254 | dependencies: 255 | "@vue/runtime-core" "3.2.33" 256 | "@vue/shared" "3.2.33" 257 | csstype "^2.6.8" 258 | 259 | "@vue/server-renderer@3.2.33": 260 | version "3.2.33" 261 | resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.33.tgz#4b45d6d2ae10ea4e3d2cf8e676804cf60f331979" 262 | integrity sha512-4jpJHRD4ORv8PlbYi+/MfP8ec1okz6rybe36MdpkDrGIdEItHEUyaHSKvz+ptNEyQpALmmVfRteHkU9F8vxOew== 263 | dependencies: 264 | "@vue/compiler-ssr" "3.2.33" 265 | "@vue/shared" "3.2.33" 266 | 267 | "@vue/shared@3.2.33": 268 | version "3.2.33" 269 | resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.33.tgz#69a8c99ceb37c1b031d5cc4aec2ff1dc77e1161e" 270 | integrity sha512-UBc1Pg1T3yZ97vsA2ueER0F6GbJebLHYlEi4ou1H5YL4KWvMOOWwpYo9/QpWq93wxKG6Wo13IY74Hcn/f7c7Bg== 271 | 272 | acorn-node@^1.6.1: 273 | version "1.8.2" 274 | resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz" 275 | integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== 276 | dependencies: 277 | acorn "^7.0.0" 278 | acorn-walk "^7.0.0" 279 | xtend "^4.0.2" 280 | 281 | acorn-walk@^7.0.0: 282 | version "7.2.0" 283 | resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" 284 | integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== 285 | 286 | acorn@^7.0.0: 287 | version "7.4.1" 288 | resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" 289 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 290 | 291 | algoliasearch@^4.0.0: 292 | version "4.8.5" 293 | resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.8.5.tgz" 294 | integrity sha512-GjKjpeevpePEJYinGokASNtIkl1t5EseNMlqDNAc+sXE8+iyyeqTyiJsN7bwlRG2BIremuslE/NlwdEfUuBLJw== 295 | dependencies: 296 | "@algolia/cache-browser-local-storage" "4.8.5" 297 | "@algolia/cache-common" "4.8.5" 298 | "@algolia/cache-in-memory" "4.8.5" 299 | "@algolia/client-account" "4.8.5" 300 | "@algolia/client-analytics" "4.8.5" 301 | "@algolia/client-common" "4.8.5" 302 | "@algolia/client-recommendation" "4.8.5" 303 | "@algolia/client-search" "4.8.5" 304 | "@algolia/logger-common" "4.8.5" 305 | "@algolia/logger-console" "4.8.5" 306 | "@algolia/requester-browser-xhr" "4.8.5" 307 | "@algolia/requester-common" "4.8.5" 308 | "@algolia/requester-node-http" "4.8.5" 309 | "@algolia/transporter" "4.8.5" 310 | 311 | anymatch@~3.1.2: 312 | version "3.1.2" 313 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" 314 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 315 | dependencies: 316 | normalize-path "^3.0.0" 317 | picomatch "^2.0.4" 318 | 319 | arg@^5.0.1: 320 | version "5.0.1" 321 | resolved "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz" 322 | integrity sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA== 323 | 324 | autoprefixer@^10.4.5: 325 | version "10.4.5" 326 | resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.5.tgz" 327 | integrity sha512-Fvd8yCoA7lNX/OUllvS+aS1I7WRBclGXsepbvT8ZaPgrH24rgXpZzF0/6Hh3ZEkwg+0AES/Osd196VZmYoEFtw== 328 | dependencies: 329 | browserslist "^4.20.2" 330 | caniuse-lite "^1.0.30001332" 331 | fraction.js "^4.2.0" 332 | normalize-range "^0.1.2" 333 | picocolors "^1.0.0" 334 | postcss-value-parser "^4.2.0" 335 | 336 | binary-extensions@^2.0.0: 337 | version "2.2.0" 338 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" 339 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 340 | 341 | braces@^3.0.2, braces@~3.0.2: 342 | version "3.0.2" 343 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 344 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 345 | dependencies: 346 | fill-range "^7.0.1" 347 | 348 | browserslist@^4.20.2: 349 | version "4.20.3" 350 | resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz" 351 | integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== 352 | dependencies: 353 | caniuse-lite "^1.0.30001332" 354 | electron-to-chromium "^1.4.118" 355 | escalade "^3.1.1" 356 | node-releases "^2.0.3" 357 | picocolors "^1.0.0" 358 | 359 | camelcase-css@^2.0.1: 360 | version "2.0.1" 361 | resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" 362 | integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== 363 | 364 | caniuse-lite@^1.0.30001332: 365 | version "1.0.30001332" 366 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001332.tgz" 367 | integrity sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw== 368 | 369 | chokidar@^3.5.3: 370 | version "3.5.3" 371 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" 372 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 373 | dependencies: 374 | anymatch "~3.1.2" 375 | braces "~3.0.2" 376 | glob-parent "~5.1.2" 377 | is-binary-path "~2.1.0" 378 | is-glob "~4.0.1" 379 | normalize-path "~3.0.0" 380 | readdirp "~3.6.0" 381 | optionalDependencies: 382 | fsevents "~2.3.2" 383 | 384 | color-name@^1.1.4: 385 | version "1.1.4" 386 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 387 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 388 | 389 | cssesc@^3.0.0: 390 | version "3.0.0" 391 | resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" 392 | integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== 393 | 394 | csstype@^2.6.8: 395 | version "2.6.14" 396 | resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.14.tgz" 397 | integrity sha512-2mSc+VEpGPblzAxyeR+vZhJKgYg0Og0nnRi7pmRXFYYxSfnOnW8A5wwQb4n4cE2nIOzqKOAzLCaEX6aBmNEv8A== 398 | 399 | defined@^1.0.0: 400 | version "1.0.0" 401 | resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" 402 | integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= 403 | 404 | detective@^5.2.0: 405 | version "5.2.0" 406 | resolved "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz" 407 | integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== 408 | dependencies: 409 | acorn-node "^1.6.1" 410 | defined "^1.0.0" 411 | minimist "^1.1.1" 412 | 413 | didyoumean@^1.2.2: 414 | version "1.2.2" 415 | resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" 416 | integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== 417 | 418 | dlv@^1.1.3: 419 | version "1.1.3" 420 | resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" 421 | integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== 422 | 423 | electron-to-chromium@^1.4.118: 424 | version "1.4.119" 425 | resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.119.tgz" 426 | integrity sha512-HPEmKy+d0xK8oCfEHc5t6wDsSAi1WmE3Ld08QrBjAPxaAzfuKP66VJ77lcTqxTt7GJmSE279s75mhW64Xh+4kw== 427 | 428 | esbuild-android-64@0.14.38: 429 | version "0.14.38" 430 | resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.38.tgz#5b94a1306df31d55055f64a62ff6b763a47b7f64" 431 | integrity sha512-aRFxR3scRKkbmNuGAK+Gee3+yFxkTJO/cx83Dkyzo4CnQl/2zVSurtG6+G86EQIZ+w+VYngVyK7P3HyTBKu3nw== 432 | 433 | esbuild-android-arm64@0.14.38: 434 | version "0.14.38" 435 | resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.38.tgz#78acc80773d16007de5219ccce544c036abd50b8" 436 | integrity sha512-L2NgQRWuHFI89IIZIlpAcINy9FvBk6xFVZ7xGdOwIm8VyhX1vNCEqUJO3DPSSy945Gzdg98cxtNt8Grv1CsyhA== 437 | 438 | esbuild-darwin-64@0.14.38: 439 | version "0.14.38" 440 | resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.38.tgz#e02b1291f629ebdc2aa46fabfacc9aa28ff6aa46" 441 | integrity sha512-5JJvgXkX87Pd1Og0u/NJuO7TSqAikAcQQ74gyJ87bqWRVeouky84ICoV4sN6VV53aTW+NE87qLdGY4QA2S7KNA== 442 | 443 | esbuild-darwin-arm64@0.14.38: 444 | version "0.14.38" 445 | resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.38.tgz#01eb6650ec010b18c990e443a6abcca1d71290a9" 446 | integrity sha512-eqF+OejMI3mC5Dlo9Kdq/Ilbki9sQBw3QlHW3wjLmsLh+quNfHmGMp3Ly1eWm981iGBMdbtSS9+LRvR2T8B3eQ== 447 | 448 | esbuild-freebsd-64@0.14.38: 449 | version "0.14.38" 450 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.38.tgz#790b8786729d4aac7be17648f9ea8e0e16475b5e" 451 | integrity sha512-epnPbhZUt93xV5cgeY36ZxPXDsQeO55DppzsIgWM8vgiG/Rz+qYDLmh5ts3e+Ln1wA9dQ+nZmVHw+RjaW3I5Ig== 452 | 453 | esbuild-freebsd-arm64@0.14.38: 454 | version "0.14.38" 455 | resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.38.tgz#b66340ab28c09c1098e6d9d8ff656db47d7211e6" 456 | integrity sha512-/9icXUYJWherhk+y5fjPI5yNUdFPtXHQlwP7/K/zg8t8lQdHVj20SqU9/udQmeUo5pDFHMYzcEFfJqgOVeKNNQ== 457 | 458 | esbuild-linux-32@0.14.38: 459 | version "0.14.38" 460 | resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.38.tgz#7927f950986fd39f0ff319e92839455912b67f70" 461 | integrity sha512-QfgfeNHRFvr2XeHFzP8kOZVnal3QvST3A0cgq32ZrHjSMFTdgXhMhmWdKzRXP/PKcfv3e2OW9tT9PpcjNvaq6g== 462 | 463 | esbuild-linux-64@0.14.38: 464 | version "0.14.38" 465 | resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.38.tgz#4893d07b229d9cfe34a2b3ce586399e73c3ac519" 466 | integrity sha512-uuZHNmqcs+Bj1qiW9k/HZU3FtIHmYiuxZ/6Aa+/KHb/pFKr7R3aVqvxlAudYI9Fw3St0VCPfv7QBpUITSmBR1Q== 467 | 468 | esbuild-linux-arm64@0.14.38: 469 | version "0.14.38" 470 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.38.tgz#8442402e37d0b8ae946ac616784d9c1a2041056a" 471 | integrity sha512-HlMGZTEsBrXrivr64eZ/EO0NQM8H8DuSENRok9d+Jtvq8hOLzrxfsAT9U94K3KOGk2XgCmkaI2KD8hX7F97lvA== 472 | 473 | esbuild-linux-arm@0.14.38: 474 | version "0.14.38" 475 | resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.38.tgz#d5dbf32d38b7f79be0ec6b5fb2f9251fd9066986" 476 | integrity sha512-FiFvQe8J3VKTDXG01JbvoVRXQ0x6UZwyrU4IaLBZeq39Bsbatd94Fuc3F1RGqPF5RbIWW7RvkVQjn79ejzysnA== 477 | 478 | esbuild-linux-mips64le@0.14.38: 479 | version "0.14.38" 480 | resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.38.tgz#95081e42f698bbe35d8ccee0e3a237594b337eb5" 481 | integrity sha512-qd1dLf2v7QBiI5wwfil9j0HG/5YMFBAmMVmdeokbNAMbcg49p25t6IlJFXAeLzogv1AvgaXRXvgFNhScYEUXGQ== 482 | 483 | esbuild-linux-ppc64le@0.14.38: 484 | version "0.14.38" 485 | resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.38.tgz#dceb0a1b186f5df679618882a7990bd422089b47" 486 | integrity sha512-mnbEm7o69gTl60jSuK+nn+pRsRHGtDPfzhrqEUXyCl7CTOCLtWN2bhK8bgsdp6J/2NyS/wHBjs1x8aBWwP2X9Q== 487 | 488 | esbuild-linux-riscv64@0.14.38: 489 | version "0.14.38" 490 | resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.38.tgz#61fb8edb75f475f9208c4a93ab2bfab63821afd2" 491 | integrity sha512-+p6YKYbuV72uikChRk14FSyNJZ4WfYkffj6Af0/Tw63/6TJX6TnIKE+6D3xtEc7DeDth1fjUOEqm+ApKFXbbVQ== 492 | 493 | esbuild-linux-s390x@0.14.38: 494 | version "0.14.38" 495 | resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.38.tgz#34c7126a4937406bf6a5e69100185fd702d12fe0" 496 | integrity sha512-0zUsiDkGJiMHxBQ7JDU8jbaanUY975CdOW1YDrurjrM0vWHfjv9tLQsW9GSyEb/heSK1L5gaweRjzfUVBFoybQ== 497 | 498 | esbuild-netbsd-64@0.14.38: 499 | version "0.14.38" 500 | resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.38.tgz#322ea9937d9e529183ee281c7996b93eb38a5d95" 501 | integrity sha512-cljBAApVwkpnJZfnRVThpRBGzCi+a+V9Ofb1fVkKhtrPLDYlHLrSYGtmnoTVWDQdU516qYI8+wOgcGZ4XIZh0Q== 502 | 503 | esbuild-openbsd-64@0.14.38: 504 | version "0.14.38" 505 | resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.38.tgz#1ca29bb7a2bf09592dcc26afdb45108f08a2cdbd" 506 | integrity sha512-CDswYr2PWPGEPpLDUO50mL3WO/07EMjnZDNKpmaxUPsrW+kVM3LoAqr/CE8UbzugpEiflYqJsGPLirThRB18IQ== 507 | 508 | esbuild-sunos-64@0.14.38: 509 | version "0.14.38" 510 | resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.38.tgz#c9446f7d8ebf45093e7bb0e7045506a88540019b" 511 | integrity sha512-2mfIoYW58gKcC3bck0j7lD3RZkqYA7MmujFYmSn9l6TiIcAMpuEvqksO+ntBgbLep/eyjpgdplF7b+4T9VJGOA== 512 | 513 | esbuild-windows-32@0.14.38: 514 | version "0.14.38" 515 | resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.38.tgz#f8e9b4602fd0ccbd48e5c8d117ec0ba4040f2ad1" 516 | integrity sha512-L2BmEeFZATAvU+FJzJiRLFUP+d9RHN+QXpgaOrs2klshoAm1AE6Us4X6fS9k33Uy5SzScn2TpcgecbqJza1Hjw== 517 | 518 | esbuild-windows-64@0.14.38: 519 | version "0.14.38" 520 | resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.38.tgz#280f58e69f78535f470905ce3e43db1746518107" 521 | integrity sha512-Khy4wVmebnzue8aeSXLC+6clo/hRYeNIm0DyikoEqX+3w3rcvrhzpoix0S+MF9vzh6JFskkIGD7Zx47ODJNyCw== 522 | 523 | esbuild-windows-arm64@0.14.38: 524 | version "0.14.38" 525 | resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.38.tgz#d97e9ac0f95a4c236d9173fa9f86c983d6a53f54" 526 | integrity sha512-k3FGCNmHBkqdJXuJszdWciAH77PukEyDsdIryEHn9cKLQFxzhT39dSumeTuggaQcXY57UlmLGIkklWZo2qzHpw== 527 | 528 | esbuild@^0.14.27: 529 | version "0.14.38" 530 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.38.tgz#99526b778cd9f35532955e26e1709a16cca2fb30" 531 | integrity sha512-12fzJ0fsm7gVZX1YQ1InkOE5f9Tl7cgf6JPYXRJtPIoE0zkWAbHdPHVPPaLi9tYAcEBqheGzqLn/3RdTOyBfcA== 532 | optionalDependencies: 533 | esbuild-android-64 "0.14.38" 534 | esbuild-android-arm64 "0.14.38" 535 | esbuild-darwin-64 "0.14.38" 536 | esbuild-darwin-arm64 "0.14.38" 537 | esbuild-freebsd-64 "0.14.38" 538 | esbuild-freebsd-arm64 "0.14.38" 539 | esbuild-linux-32 "0.14.38" 540 | esbuild-linux-64 "0.14.38" 541 | esbuild-linux-arm "0.14.38" 542 | esbuild-linux-arm64 "0.14.38" 543 | esbuild-linux-mips64le "0.14.38" 544 | esbuild-linux-ppc64le "0.14.38" 545 | esbuild-linux-riscv64 "0.14.38" 546 | esbuild-linux-s390x "0.14.38" 547 | esbuild-netbsd-64 "0.14.38" 548 | esbuild-openbsd-64 "0.14.38" 549 | esbuild-sunos-64 "0.14.38" 550 | esbuild-windows-32 "0.14.38" 551 | esbuild-windows-64 "0.14.38" 552 | esbuild-windows-arm64 "0.14.38" 553 | 554 | escalade@^3.1.1: 555 | version "3.1.1" 556 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 557 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 558 | 559 | estree-walker@^2.0.2: 560 | version "2.0.2" 561 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 562 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 563 | 564 | fast-glob@^3.2.11: 565 | version "3.2.11" 566 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz" 567 | integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== 568 | dependencies: 569 | "@nodelib/fs.stat" "^2.0.2" 570 | "@nodelib/fs.walk" "^1.2.3" 571 | glob-parent "^5.1.2" 572 | merge2 "^1.3.0" 573 | micromatch "^4.0.4" 574 | 575 | fastq@^1.6.0: 576 | version "1.10.1" 577 | resolved "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz" 578 | integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== 579 | dependencies: 580 | reusify "^1.0.4" 581 | 582 | fill-range@^7.0.1: 583 | version "7.0.1" 584 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 585 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 586 | dependencies: 587 | to-regex-range "^5.0.1" 588 | 589 | fraction.js@^4.2.0: 590 | version "4.2.0" 591 | resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" 592 | integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== 593 | 594 | fsevents@~2.3.2: 595 | version "2.3.2" 596 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" 597 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 598 | 599 | function-bind@^1.1.1: 600 | version "1.1.1" 601 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 602 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 603 | 604 | glob-parent@^5.1.2, glob-parent@~5.1.2: 605 | version "5.1.2" 606 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 607 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 608 | dependencies: 609 | is-glob "^4.0.1" 610 | 611 | glob-parent@^6.0.2: 612 | version "6.0.2" 613 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" 614 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 615 | dependencies: 616 | is-glob "^4.0.3" 617 | 618 | has@^1.0.3: 619 | version "1.0.3" 620 | resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 621 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 622 | dependencies: 623 | function-bind "^1.1.1" 624 | 625 | is-binary-path@~2.1.0: 626 | version "2.1.0" 627 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 628 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 629 | dependencies: 630 | binary-extensions "^2.0.0" 631 | 632 | is-core-module@^2.8.1: 633 | version "2.9.0" 634 | resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz" 635 | integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== 636 | dependencies: 637 | has "^1.0.3" 638 | 639 | is-extglob@^2.1.1: 640 | version "2.1.1" 641 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 642 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 643 | 644 | is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 645 | version "4.0.3" 646 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 647 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 648 | dependencies: 649 | is-extglob "^2.1.1" 650 | 651 | is-number@^7.0.0: 652 | version "7.0.0" 653 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 654 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 655 | 656 | lilconfig@^2.0.5: 657 | version "2.0.5" 658 | resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz" 659 | integrity sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg== 660 | 661 | magic-string@^0.25.7: 662 | version "0.25.7" 663 | resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz" 664 | integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== 665 | dependencies: 666 | sourcemap-codec "^1.4.4" 667 | 668 | merge2@^1.3.0: 669 | version "1.4.1" 670 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 671 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 672 | 673 | micromatch@^4.0.4: 674 | version "4.0.5" 675 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" 676 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 677 | dependencies: 678 | braces "^3.0.2" 679 | picomatch "^2.3.1" 680 | 681 | minimist@^1.1.1: 682 | version "1.2.5" 683 | resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" 684 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 685 | 686 | nanoid@^3.3.1: 687 | version "3.3.3" 688 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz" 689 | integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== 690 | 691 | node-releases@^2.0.3: 692 | version "2.0.3" 693 | resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz" 694 | integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== 695 | 696 | normalize-path@^3.0.0, normalize-path@~3.0.0: 697 | version "3.0.0" 698 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 699 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 700 | 701 | normalize-range@^0.1.2: 702 | version "0.1.2" 703 | resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" 704 | integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= 705 | 706 | object-hash@^3.0.0: 707 | version "3.0.0" 708 | resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" 709 | integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== 710 | 711 | path-parse@^1.0.7: 712 | version "1.0.7" 713 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 714 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 715 | 716 | picocolors@^1.0.0: 717 | version "1.0.0" 718 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" 719 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 720 | 721 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 722 | version "2.3.1" 723 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 724 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 725 | 726 | postcss-js@^4.0.0: 727 | version "4.0.0" 728 | resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz" 729 | integrity sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ== 730 | dependencies: 731 | camelcase-css "^2.0.1" 732 | 733 | postcss-load-config@^3.1.4: 734 | version "3.1.4" 735 | resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz" 736 | integrity sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== 737 | dependencies: 738 | lilconfig "^2.0.5" 739 | yaml "^1.10.2" 740 | 741 | postcss-nested@5.0.6: 742 | version "5.0.6" 743 | resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz" 744 | integrity sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA== 745 | dependencies: 746 | postcss-selector-parser "^6.0.6" 747 | 748 | postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.6: 749 | version "6.0.10" 750 | resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" 751 | integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== 752 | dependencies: 753 | cssesc "^3.0.0" 754 | util-deprecate "^1.0.2" 755 | 756 | postcss-value-parser@^4.2.0: 757 | version "4.2.0" 758 | resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" 759 | integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== 760 | 761 | postcss@^8.1.10, postcss@^8.4.12: 762 | version "8.4.12" 763 | resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz" 764 | integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== 765 | dependencies: 766 | nanoid "^3.3.1" 767 | picocolors "^1.0.0" 768 | source-map-js "^1.0.2" 769 | 770 | preact@^10.0.0: 771 | version "10.5.12" 772 | resolved "https://registry.npmjs.org/preact/-/preact-10.5.12.tgz" 773 | integrity sha512-r6siDkuD36oszwlCkcqDJCAKBQxGoeEGytw2DGMD5A/GGdu5Tymw+N2OBXwvOLxg6d1FeY8MgMV3cc5aVQo4Cg== 774 | 775 | prismjs@^1.25.0: 776 | version "1.28.0" 777 | resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.28.0.tgz#0d8f561fa0f7cf6ebca901747828b149147044b6" 778 | integrity sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw== 779 | 780 | queue-microtask@^1.2.2: 781 | version "1.2.2" 782 | resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz" 783 | integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== 784 | 785 | quick-lru@^5.1.1: 786 | version "5.1.1" 787 | resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" 788 | integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== 789 | 790 | readdirp@~3.6.0: 791 | version "3.6.0" 792 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" 793 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 794 | dependencies: 795 | picomatch "^2.2.1" 796 | 797 | resolve@^1.22.0: 798 | version "1.22.0" 799 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz" 800 | integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== 801 | dependencies: 802 | is-core-module "^2.8.1" 803 | path-parse "^1.0.7" 804 | supports-preserve-symlinks-flag "^1.0.0" 805 | 806 | reusify@^1.0.4: 807 | version "1.0.4" 808 | resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 809 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 810 | 811 | rollup@^2.59.0: 812 | version "2.70.2" 813 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.70.2.tgz#808d206a8851628a065097b7ba2053bd83ba0c0d" 814 | integrity sha512-EitogNZnfku65I1DD5Mxe8JYRUCy0hkK5X84IlDtUs+O6JRMpRciXTzyCUuX11b5L5pvjH+OmFXiQ3XjabcXgg== 815 | optionalDependencies: 816 | fsevents "~2.3.2" 817 | 818 | run-parallel@^1.1.9: 819 | version "1.2.0" 820 | resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 821 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 822 | dependencies: 823 | queue-microtask "^1.2.2" 824 | 825 | source-map-js@^1.0.2: 826 | version "1.0.2" 827 | resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" 828 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 829 | 830 | source-map@^0.6.1: 831 | version "0.6.1" 832 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 833 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 834 | 835 | sourcemap-codec@^1.4.4: 836 | version "1.4.8" 837 | resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" 838 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 839 | 840 | supports-preserve-symlinks-flag@^1.0.0: 841 | version "1.0.0" 842 | resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" 843 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 844 | 845 | tailwindcss@^3.0.24: 846 | version "3.0.24" 847 | resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.24.tgz" 848 | integrity sha512-H3uMmZNWzG6aqmg9q07ZIRNIawoiEcNFKDfL+YzOPuPsXuDXxJxB9icqzLgdzKNwjG3SAro2h9SYav8ewXNgig== 849 | dependencies: 850 | arg "^5.0.1" 851 | chokidar "^3.5.3" 852 | color-name "^1.1.4" 853 | detective "^5.2.0" 854 | didyoumean "^1.2.2" 855 | dlv "^1.1.3" 856 | fast-glob "^3.2.11" 857 | glob-parent "^6.0.2" 858 | is-glob "^4.0.3" 859 | lilconfig "^2.0.5" 860 | normalize-path "^3.0.0" 861 | object-hash "^3.0.0" 862 | picocolors "^1.0.0" 863 | postcss "^8.4.12" 864 | postcss-js "^4.0.0" 865 | postcss-load-config "^3.1.4" 866 | postcss-nested "5.0.6" 867 | postcss-selector-parser "^6.0.10" 868 | postcss-value-parser "^4.2.0" 869 | quick-lru "^5.1.1" 870 | resolve "^1.22.0" 871 | 872 | to-regex-range@^5.0.1: 873 | version "5.0.1" 874 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 875 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 876 | dependencies: 877 | is-number "^7.0.0" 878 | 879 | util-deprecate@^1.0.2: 880 | version "1.0.2" 881 | resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 882 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 883 | 884 | vite@^2.8.1: 885 | version "2.9.5" 886 | resolved "https://registry.yarnpkg.com/vite/-/vite-2.9.5.tgz#08ef37ac7a6d879c96f328b791732c9a00ea25ea" 887 | integrity sha512-dvMN64X2YEQgSXF1lYabKXw3BbN6e+BL67+P3Vy4MacnY+UzT1AfkHiioFSi9+uiDUiaDy7Ax/LQqivk6orilg== 888 | dependencies: 889 | esbuild "^0.14.27" 890 | postcss "^8.4.12" 891 | resolve "^1.22.0" 892 | rollup "^2.59.0" 893 | optionalDependencies: 894 | fsevents "~2.3.2" 895 | 896 | vitepress@^0.22.3: 897 | version "0.22.3" 898 | resolved "https://registry.yarnpkg.com/vitepress/-/vitepress-0.22.3.tgz#5d29741497fa4dd4d08e65d529310cf92897b52f" 899 | integrity sha512-Yfvu/rent2vp/TXIDZMutS6ft2TJPn4xngS48PYFWDEbuFI2ccUAXM481lF1qVVnCKxfh4g8e/KPvevSJdg1Bw== 900 | dependencies: 901 | "@docsearch/css" "^3.0.0-alpha.41" 902 | "@docsearch/js" "^3.0.0-alpha.41" 903 | "@vitejs/plugin-vue" "^2.2.0" 904 | prismjs "^1.25.0" 905 | vite "^2.8.1" 906 | vue "^3.2.31" 907 | 908 | vue@^3.2.31: 909 | version "3.2.33" 910 | resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.33.tgz#7867eb16a3293a28c4d190a837bc447878bd64c2" 911 | integrity sha512-si1ExAlDUrLSIg/V7D/GgA4twJwfsfgG+t9w10z38HhL/HA07132pUQ2KuwAo8qbCyMJ9e6OqrmWrOCr+jW7ZQ== 912 | dependencies: 913 | "@vue/compiler-dom" "3.2.33" 914 | "@vue/compiler-sfc" "3.2.33" 915 | "@vue/runtime-dom" "3.2.33" 916 | "@vue/server-renderer" "3.2.33" 917 | "@vue/shared" "3.2.33" 918 | 919 | xtend@^4.0.2: 920 | version "4.0.2" 921 | resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" 922 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 923 | 924 | yaml@^1.10.2: 925 | version "1.10.2" 926 | resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" 927 | integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== 928 | --------------------------------------------------------------------------------
37 | Use NativeScript within your existing Capacitor app. 38 |
102 | Completely inactive with zero impact on your 103 | web environment. It is only active when Capacitor is running. 104 |