diff --git a/blog/2025-08-07-psadt-4.1.md b/blog/2025-08-07-psadt-4.1.md index c55a2a5..59e9689 100644 --- a/blog/2025-08-07-psadt-4.1.md +++ b/blog/2025-08-07-psadt-4.1.md @@ -58,7 +58,7 @@ It's now possible to set PSADT configuration settings via Group Policy using the - Default `DeferExitCode` changed from `60012` to `1602` (natively recognized by ConfigMgr and Intune) - UI functions no longer minimize windows by default -For full details, see the [release notes](/docs/getting-started/release-notes) and the [upgrade guidance](/docs/getting-started/upgrade-guidance-4x-to-v41). +For full details, see the [release notes](/docs/reference/release-notes) and the [upgrade guidance](/docs/how-to/upgrade-from-v4-0). ### Download diff --git a/blog/2025-10-17-psadt-4.1.6.md b/blog/2025-10-17-psadt-4.1.6.md index b928a91..3f483fd 100644 --- a/blog/2025-10-17-psadt-4.1.6.md +++ b/blog/2025-10-17-psadt-4.1.6.md @@ -44,7 +44,7 @@ Fixed an issue where the UI could fail to display when `explorer.exe` is being e - **v3 compatibility**: Fixed passing parameters from the command-line to a v3 compatibility template - **Classic Dialogs**: Tags are now correctly stripped from dialog strings (formatting only works in Fluent UI) -For the full list of changes, see the [release notes](/docs/getting-started/release-notes). +For the full list of changes, see the [release notes](/docs/reference/release-notes). ### v4.1.7 hotfix diff --git a/blog/2026-01-14-psadt-4.1.8.md b/blog/2026-01-14-psadt-4.1.8.md index d3aa464..1e0d790 100644 --- a/blog/2026-01-14-psadt-4.1.8.md +++ b/blog/2026-01-14-psadt-4.1.8.md @@ -61,7 +61,7 @@ Build performance has been significantly improved with parallelized code signing - Added `IsAdmin` property to `RunAsActiveUser` object -For the full list of changes, see the [release notes](/docs/getting-started/release-notes). +For the full list of changes, see the [release notes](/docs/reference/release-notes). ### Download diff --git a/docs/deployment-concepts/_category_.json b/docs/deployment-concepts/_category_.json deleted file mode 100644 index 2646532..0000000 --- a/docs/deployment-concepts/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Understanding the layout", - "position": 3 -} \ No newline at end of file diff --git a/docs/deployment-concepts/deployment-structure.mdx b/docs/deployment-concepts/deployment-structure.mdx deleted file mode 100644 index b531715..0000000 --- a/docs/deployment-concepts/deployment-structure.mdx +++ /dev/null @@ -1,228 +0,0 @@ ---- -sidebar_position: 1 -title: 'Deployment Structure' -description: 'The file / folder structure a PSADT deployment explained.' -slug: /deployment-concepts/deployment-structure -hide_title: true -tags: - - Usage - - Archive - - Deployment Concepts ---- - -## Deployment Structure - -### Understanding PSAppDeployToolkit Architecture - -PSAppDeployToolkit v4.1 represents a significant architectural evolution from previous versions, designed with enterprise deployment scenarios in mind. The toolkit operates on a modular, session-based architecture that provides unprecedented flexibility and control over the deployment process. - -#### Core Architecture Principles - -**Session-Based Management**: PSADT v4.1 **introduces the `ADTSession` object**, which encapsulates all deployment state, configuration, and context. This object-oriented approach provides better isolation, state management, and extensibility compared to the global variable approach used in v3. - -**Security-First Design**: The v4.1 architecture **separates user interaction from system-level operations**, eliminating the need for ServiceUI and providing a more secure deployment experience. User interfaces run in the user's session context, while system operations execute in the appropriate security context. - -**Modular Function Library**: The toolkit provides **130+ specialized functions** organized into logical categories (Installation, Registry, File System, User Interface, etc.), each designed for specific deployment scenarios. - -## V4 Native Deployment Template - -The **v4 native deployment template** is designed to be more modular, flexible, and user-friendly than the v3 structure, while still containing all core PSADT module files. This structure represents the recommended approach for new deployments and provides the full feature set of PSADT v4.1. - -:::info -The **v4 native deployment template** structure is considerably more sophisticated than the V3 deployment structure. At first glance, it can seem overly complex and daunting. However, you can avoid getting overwhelmed by focusing on just the files you need to know about. -::: - -### Template Structure - -The v4 template follows a clear separation of concerns, with each folder serving a specific purpose in the deployment ecosystem: - -| Folder | File | Purpose | -| :---------------------------------- | :--------------------------- | :-------------------------------------------------------------------------------------------------------------- | -| **/** | Invoke- AppDeployToolkit.ps1 | PSADT Deployment PowerShell script. This is the main entry point for your deployment. | -| | Invoke- AppDeployToolkit.exe | PSADT Deployment executable. This is a wrapper around the above script to easily launch it. | -| | **PSAppDeployToolkit/** | | -| | | PSADT core module files. Please do not modify anything under this folder. | -| **PSAppDeployToolkit. Extensions/** | | | -| | | PSADT optional extensions. Ignore this folder if you are not using any custom functions. | -| **Files/** | | | -| | | [***Put installation files here***] | -| | Setup.Exe | Example Setup executable. | -| | AppInstaller.msi | Example Windows Installer MSI | -| **SupportFiles/** | | | -| | | [***Put optional install support files here***] | -| | PerUserSettings.reg | Example installation support file. | -| **Assets/** | | | -| | AppIcon.png | PSADT App Icon. Used to display the application icon, or your organizations logo. Should be a 256x256 PNG file. | -| **Config/** | | | -| | config.psd1 | PSADT configuration file. Contains settings that control the behavior | -| **Strings/** | | | -| | strings.psd1 | PSADT User Interface strings file. This changes the text displayed in the PSADT User Interface. | - -## V3 Compatibility Deployment Template - -The v3 compatibility deployment structure is designed to allow you to use an existing v3 deployment script with the v4 PSADT framework. This v3 compatibility structure allows you to leverage your existing v3 script paths and function references, mapping them to their new v4 equivalents. - -The structure is laid out similarly to v4, however some file and folder names are kept the same as v3. This is so that we can use leverage any file paths you may have used within your script. And we also leverage the folder structure to impersonate the v3 PSADT framework, while remapping each function to the new v4 equivilent. - -This allows you to use your existing v3 deployment scripts with the v4 PSADT framework, taking advantage of the new features and improvements in v4, but without having to make any functional change to your existing script. - -### Template Structure Deep Dive - -#### Root Directory (`/`) - -The root directory serves as the deployment entry point and contains the essential files needed to launch a PSADT deployment: - -- **`Invoke-AppDeployToolkit.ps1`**: This is your primary development file. It contains: - - Session variables that define your application metadata - - Deployment phase logic (Pre-Install, Install, Post-Install, etc.) - - Custom PowerShell code for handling complex deployment scenarios - - Error handling and logging configuration - - User interface customization - -- **`Invoke-AppDeployToolkit.exe`**: A native Windows executable that provides: - - Secure PowerShell execution without exposing script content - - Command-line parameter support for deployment automation - - Debug mode (`/Debug`) for troubleshooting - - Architecture selection (`/32` for x86, `/Core` for PowerShell 7) - - Custom script execution (`-File` parameter) - -#### PSAppDeployToolkit Directory - -This directory contains the complete PSADT v4.1 framework and should never be modified: - -- **Core Module Files**: The main PSADT PowerShell module with over 200 specialized functions -- **UI Components**: Both Classic and Fluent UI frameworks for user interaction -- **Security Components**: Session management, privilege handling, and security context management -- **Function Libraries**: Organized collections of functions for installation, registry, file system, and UI operations -- **Runtime Dependencies**: Required .NET assemblies and supporting libraries - -#### Files Directory - -The primary location for application installation media: - -- **Supported File Types**: - - Executable installers (`.exe`, `.msi`, `.msm`) - - Windows Installer patches (`.msp`) - - Transform files (`.mst`) - - WIM images ()`.wim`) - - Archive files (`.zip`, `.7z`) - - Configuration files and templates - -- **Zero-Config Support**: PSADT can automatically detect and install MSI files and MSI in WIM files without custom scripting -- **File Organization**: Maintain clear naming conventions for easier maintenance and troubleshooting - -#### SupportFiles Directory - -Contains auxiliary files needed during or after installation: - -- **Registry Files**: `.reg` files for applying system or user settings -- **Configuration Templates**: Application configuration files that need customization -- **Documentation**: User guides, release notes, or other documentation -- **Shortcuts**: Custom desktop or start menu shortcuts -- **License Files**: Software licenses or activation files - -#### Assets Directory - -Visual elements for UI customization and branding: - -- **Icon Requirements**: 256x256 PNG format for optimal quality -- **Theme Support**: Separate assets for light and dark themes -- **Branding Elements**: Logos, banners, and other visual components -- **Accessibility**: High-contrast and high-DPI support - -#### Config Directory - -Configuration management for deployment behavior: - -- **`config.psd1`**: PowerShell data file containing: - - Logging configuration (paths, levels, rotation) - - UI preferences (timeouts, dialog behavior) - - MSI parameters and execution settings - - Security and privilege settings - - Performance optimization settings - -- **Group Policy Integration**: Settings can be overridden by Group Policy ADMX templates -- **Hierarchical Configuration**: Built-in defaults → Local config → Group Policy - -#### Strings Directory - -Localization and UI text customization: - -- **`strings.psd1`**: Contains all user-facing text strings -- **Multi-language Support**: Separate language sections for international deployments -- **Customization**: Modify dialog text, error messages, and user prompts -- **Consistency**: Centralized text management ensures consistent user experience - -#### Example Deployment Structure - -For large-scale enterprise deployments, a deployment folder structure might look something like this: - -```text -YourApp-Deployment/ -├── Invoke-AppDeployToolkit.ps1 -├── Invoke-AppDeployToolkit.exe -├── PSAppDeployToolkit/ # Core framework -├── PSAppDeployToolkit.Extensions/ # Custom functions -├── Files/ -│ ├── YourApp-Setup.exe -│ ├── YourApp-Setup.msi -│ ├── YourApp-Patch.msp -│ └── YourApp-Config.mst -├── SupportFiles/ -│ ├── UserSettings.reg -│ ├── SystemSettings.reg -│ └── Config/ -│ ├── AppConfig.xml -│ └── UserPreferences.json -├── Assets/ -│ ├── AppIcon.png -│ ├── AppIcon-Dark.png -│ ├── CompanyLogo.png -│ └── Banner.png -├── Config/ -│ └── config.psd1 -└── Strings/ - ├── strings.psd1 - └── de-DE/ - └── strings.psd1 -``` - -#### Example Multi-Architecture Deployment Structure - -For applications with multiple versions or architectures: - -```text -YourApp-Deployment/ -├── Files/ -│ ├── x64/ -│ │ ├── YourApp-x64-Setup.exe -│ │ └── YourApp-x64-Patch.msp -│ ├── x86/ -│ │ ├── YourApp-x86-Setup.exe -│ │ └── YourApp-x86-Patch.msp -│ └── Common/ -│ ├── SharedComponents.msi -│ └── License.lic -``` - -:::info -The PSADT v4 compatibility deployment template structure is considerably more sophisticated than the V3 deployment structure. At first glance, it can seem overly complex and daunting. However, you can avoid getting overwhelmed by focusing on just the files you need to know about. -::: - -| Folder | File | Purpose | -| :---------------------------------------- | :--------------- | :-------------------------------------------------------------------------------------------------------------- | -| **/** | | Compatibility shim script. Used to restore v3 function wrappers. | -| | | Communityextensions scripts. Used for your custom v3 functions. | -| **AppDeployToolkit/ PSAppDeployToolkit/** | | | -| | | PSADT core module files. Please do not modify anything under this folder. | -| **Files/** | | [***Put installation files here***] | -| | Setup.Exe | Example Setup executable1. | -| | AppInstaller.msi | Example Windows Installer MSI file | -| **SupportFiles/** | | | -| | | [***Put optional install support files here***] | -| **Assets/** | | | -| | AppIcon.png | PSADT App Icon. Used to display the application icon, or your organizations logo. Should be a 256x256 PNG file. | -| **Config/** | | | -| | config.psd1 | PSADT configuration file. Contains settings that control the behavior | -| **Strings/** | | | -| | strings.psd1 | PSADT User Interface strings file. This changes the text displayed in the PSADT User Interface. | diff --git a/docs/deployment-concepts/invoke-appdeploytoolkit.mdx b/docs/deployment-concepts/invoke-appdeploytoolkit.mdx deleted file mode 100644 index 9e376b4..0000000 --- a/docs/deployment-concepts/invoke-appdeploytoolkit.mdx +++ /dev/null @@ -1,162 +0,0 @@ ---- -sidebar_position: 2 -title: 'Invoke-AppDeployToolkit' -description: 'Understanding how a PSAppDeployToolkit deployment is structured.' -slug: /deployment-concepts/invoke-appdeploytoolkit -hide_title: true - -tags: - - Usage - - Invoke-AppDeployToolkit - - Deployment Concepts ---- - -## Deployment Script - -The `Invoke-AppDeployToolkit.ps1` script is where you will spend most of your time when using PSAppDeployToolkit. This script is the main entry point of the deployment, responsible for executing the deployment phases. - -### Understanding the Deployment Script Architecture - -PSAppDeployToolkit v4 uses a session-based architecture to provide flexible control over the deployment process. Understanding this architecture is crucial for both beginners and advanced users. - -### Core Concepts - -#### ADTSession Object - -The heart of PSADT v4 is the `ADTSession` object, which encapsulates all deployment state, configuration, and context. This object-oriented approach provides better isolation, state management, and extensibility compared to the global variable approach used in v3. - -#### Session Properties - -These are the first thing to edit in your deployment script and are stored within the `ADTSession` object, providing better encapsulation and state management compared to global variables in v3. Session Properties define your application's metadata, behavior, and deployment requirements. - -| Property | Example | Description | -| :-------------------- | :--------------------------------------------------------- | :------------------------------------------------------------------------------------ | -| `AppVendor` | `Microsoft` | The vendor name of the application | -| `AppName` | `Office 365` | The name of the application | -| `AppVersion` | `16.0` | The version of the application | -| `AppArch` | `x64` | The architecture of the application (x86 or x64) | -| `AppLang` | `EN` | The language of the application | -| `AppRevision` | `01` | The revision of the application package | -| `AppSuccessExitCodes` | `@(0)` | Exit codes that indicate success | -| `AppRebootExitCodes` | `@(1641, 3010)` | Exit codes that indicate a reboot is required | -| `AppProcessesToClose` | `@(@{ Name = 'winword'; Description = 'Microsoft Word' })` | **New in v4.1**. Processes that should be closed before install / uninstall / repair. | -| `RequireAdmin` | `$true` | **New in v4.1**. Whether the script requires administrative privileges | - -:::warning[PSAppDeployToolkit variables] -If trying to use a PSAppDeployToolkit variables such as $envProgramFiles in this section, it will not work because the module has typically not been imported and initialized this early on in the script. -::: - -:::warning[Breaking Changes in v4.1] -If you are upgrading from v4.0 or earlier, you must move any `RequireAdmin` setting from your config file to the session object in your deployment script, and use `AppProcessesToClose` instead of specifying the processes directly on the `-CloseProcesses` parameter of `Show-ADTInstallationWelcome`. -::: - -:::info[New in v4.1: RequireAdmin] -PSADT v4.1 contains a new variable `RequireAdmin` that allows you to check for administrative privileges on a per-application basis without needing to modify the PSADT configuration file. - -- `RequireAdmin = $true`, will fail the deployment if administrative privileges are not available. -- `RequireAdmin = $false`, will not check for administrative privileges. - -Note that `Invoke-AppDeployToolkit.exe` no longer checks this value to figure out if it needs to relaunch itself elevated. If your deployment requires administrative privileges, you must ensure that the launcher is run elevated. -::: - -:::info[New in v4.1: AppProcessesToClose] -PSADT v4.1 contains a new variable `AppProcessesToClose` that allows you to specify processes to be closed before the installation, uninstallation, or repair phases. This replaces the previous method of using the -CloseApps parameter on `Show-InstallationWelcome` - -- `AppProcessesToClose = `, will automatically close the specified processes before proceeding with the deployment. -::: - -:::info -Use hashtable objects on `AppProcessesToClose` with `Name` and `Description` properties for better user experience. - -```PowerShell -AppProcessesToClose = @(@{ Name = 'winword'; Description = 'Microsoft Word' }) -``` - -::: - -### Deployment Types & Phases - -There are three types of deployments you can perform using PSAppDeployToolkit. - -- **Install**, **Uninstall** and **Repair**. - -Each deployment type (Install, Uninstall, Repair) follows a structured three-phase approach: - -- **Pre-Phase**: Preparation, validation, and user interaction -- **Main Phase**: Core deployment operations -- **Post-Phase**: Cleanup, configuration, and finalization - -#### Understanding Deployment Phases - -Each deployment phase serves a specific purpose in the deployment lifecycle. Understanding these phases is crucial for creating effective deployment scripts. - -##### Pre-Phase Operations - -The Pre-Phase is responsible for preparation, validation, and user interaction: - -**Common Pre-Phase Tasks:** - -- Display welcome messages and user notifications -- Check system requirements and prerequisites -- Close conflicting applications -- Handle user deferrals and scheduling -- Validate installation media and files -- Check disk space and system resources -- Uninstall previous versions if required - -##### Main Phase Operations - -The Main Phase performs the core deployment operations: - -**Install Phase Tasks:** - -- Execute application installer -- Apply transforms and patches -- Configure application settings -- Handle installation errors and rollback - -**Uninstall Phase Tasks:** - -- Execute application uninstaller -- Remove application files and registry entries -- Clean up user data (if configured) -- Handle uninstall errors - -**Repair Phase Tasks:** - -- Reinstall or repair application components -- Restore corrupted files -- Reapply configuration settings -- Verify installation integrity - -##### Post-Phase Operations - -The Post-Phase handles cleanup, configuration, and finalization: - -**Common Post-Phase Tasks:** - -- Apply registry settings and configurations -- Copy additional files and shortcuts -- Configure user preferences -- Update system settings -- Display completion messages -- Prompt for restart if required -- Clean up temporary files - -### Script Structure - -The script is broken down into the following sections: - -| Install Type | Phase | Deployment Tasks | -| :------------------------ | :--------------- | :---------------------------------------------------------------------------------- | -| `Install-ADTDeployment` | `Pre-Install` | Prompt to close processes, allow defer, uninstall / clean-up previous versions | -| | `Install` | Install application | -| | `Post-Install` | Drop additional files, registry tweaks, cleanup, prompt for restart | -| | | | -| `Uninstall-ADTDeployment` | `Pre-Uninstall` | Display end user messaging, close processes | -| | `Uninstall` | Uninstall application | -| | `Post-Uninstall` | Prompt for restart | -| | | | -| `Repair-ADTDeployment` | `Pre-Repair` | Display end user messaging, close processes, uninstall / clean up previous versions | -| | `Repair` | Repair application | -| | `Post-Repair` | Drop additional files, registry tweaks, reset settings, prompt for restart | diff --git a/docs/deployment-concepts/zero-config-deployment.mdx b/docs/deployment-concepts/zero-config-deployment.mdx deleted file mode 100644 index aff811d..0000000 --- a/docs/deployment-concepts/zero-config-deployment.mdx +++ /dev/null @@ -1,25 +0,0 @@ ---- -sidebar_position: 3 -title: 'Zero-Config Deployment' -description: 'How to leverage the zero-configuration feature for zero-effort deployments.' -slug: /deployment-concepts/zero-config-deployment -hide_title: true - -tags: - - Zero-Config Deployment - - Deployment Concepts ---- - -## Zero-Configuration MSI Deployment - -### Simple Deployment Method - -Now that you understand the basics of how a deployment works, you can try a simple MSI-based deployment with no effort. PSAppDeployToolkit has a zero-config MSI install feature that lets you quickly install an MSI with no script configuration. - -To use this feature: - -1. Ensure the `AppName` is left empty in `Invoke-AppDeployToolkit.ps1` to activate zero-config mode. -2. Place your MSI file into the `Files` folder of the PSAppDeployToolkit deployment template. This method only supports the installation of one MSI, so if more than one MSI is found, then only the first one is selected. -3. If you have an MST file, then also place this into the `Files` folder. The MST file must have the same name as the MSI file. For example, if your MSI file name is `test01.msi`, then the MST file must be named `test01.mst`. -4. If you have any MSP files, then also place them into the `Files` folder. You can place more than one MSP file in the folder, but you must name the files in alphabetical order to control the order in which they are installed. -5. You can also compress all of these files along with any other installation content required into a WIM file, and it will be automatically mounted and used. diff --git a/docs/examples/_category_.json b/docs/examples/_category_.json deleted file mode 100644 index 5a01990..0000000 --- a/docs/examples/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Examples", - "position": 5 -} \ No newline at end of file diff --git a/docs/examples/admxtemplate-LogPath.mdx b/docs/examples/admxtemplate-LogPath.mdx deleted file mode 100644 index 92f573b..0000000 --- a/docs/examples/admxtemplate-LogPath.mdx +++ /dev/null @@ -1,126 +0,0 @@ ---- -sidebar_position: 1 -title: 'GPO - Toolkit LogPath' -description: 'How to define the Toolkit LogPath using a Group Policy Object' -slug: /examples/admxtemplate-LogPath -hide_title: true -tags: - - Group Policy - - ADMX Template - - Examples ---- - -## Group Policy - Toolkit LogPath - -### Introduction - -In this example, we will create a Group Policy Object to define the log path for our PSADT 4.1.x package deployments. - -This provides the benefit of: - -- Standardizing your PSADT deployment logging location -- Not having to config each deployment package with the correct log path - -Assumptions: - -- You need to have already imported the ADMX Templates into your Central Store. - -### Create a new Group Policy Object - -- Start by opening the Group Policy Management Editor -- Then Right-Click on 'Group Policy Objects' and select 'New' - - ![Create New GPO](../images/example-admx-LogPath-00-GPO-new.png) - -- Enter a name - - In this example, I'm using `PSADT 4.1` - - ![Create New GPO - Name](../images/example-admx-LogPath-01-GPO-new.png) - -### Edit the Group Policy Object - -- After creating the GPO, find it under `Group Policy Objects` -- Right-Click and select `Edit` - - ![Edit GPO](../images/example-admx-LogPath-02-GPO-new.png) - -- Expand down to `Toolkit` -- Right-Click on `LogPath` and select `Edit` - - ``` -Computer Configuration -└───Policies - └───Administrative Templates: Policy definitions - └───PSAppDeployToolkit - └───Toolkit -``` - - ![Edit GPO Policy](../images/example-admx-LogPath-03-GPO-new.png) - -- Select `Enable`, and then define a Path. -- In this example, I'm using the Intune Management Extension Log folder: - - ```powershell - $envProgramData\Microsoft\IntuneManagementExtension\Logs - ``` - -![Configure Policy](../images/example-admx-LogPath-04-GPO-new.png) - -- Select `OK` to close the Policy window -- Configure any other desired policies -- Close the Policy Editor window - -### Link the GPO - -Now that we have the GPO created and configured, lets link it to the domain or desired OU. - -- Navigate to the Desired location you want to link the GPO -- Right-Click and select `Link an Existing GPO...` - -![Link Policy](../images/example-admx-LogPath-05-GPO-new.png) - -- Select the previously created and configured policy and then click `OK` - -![Select Link Policy](../images/example-admx-LogPath-06-GPO-new.png) - -- You will now see the GPO Linked to the location you select - -![Link Policy Success](../images/example-admx-LogPath-07-GPO-new.png) - -### Update Group Policy - -On a machine that is scoped for the policy, run the below command to update Group Policy - -``` -gpupdate /force -``` - -![Update Group Policy](../images/example-admx-LogPath-08-GPO-new.png) - -### Verify the Group Policy Applied - -You can verify the status of the policy by running the below command - -``` -gpresult /r /scope computer -``` - -![Verify Group Policy](../images/example-admx-LogPath-09-GPO-new.png) - -#### Verify the Policies in the Registry - -You should see the setting applied within the Registry - -```text -Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\PSAppDeployToolkit\Config\Toolkit -``` - -![Verify Group Policy](../images/example-admx-LogPath-10-GPO-new.png) - -### Run a Deployment - -Now when a deployment is run, PSAppDeployToolkit will import any settings in Group Policy as it initializes. - -Below we can see that the deployment is running and the log file was created in the `ProgramData\Microsoft\IntuneManagementExtension\Logs` folder - -![Run a Deployment](../images/example-admx-LogPath-11-GPO-new.png) diff --git a/docs/examples/googlechrome-configmgr.mdx b/docs/examples/googlechrome-configmgr.mdx deleted file mode 100644 index e657dd4..0000000 --- a/docs/examples/googlechrome-configmgr.mdx +++ /dev/null @@ -1,15 +0,0 @@ ---- -sidebar_position: 2 -title: 'Config Manager - Google Chrome' -description: 'How to package and deploy Google Chrome Enterprise using Microsoft Configuration Manager.' -slug: /examples/googlechrome-configmgr -hide_title: true -tags: - - Google Chrome - - Microsoft Configuration Manager - - Examples ---- - -## Google Chrome Enterprise - -Work In Progress - Coming Soon! diff --git a/docs/explanation/_category_.json b/docs/explanation/_category_.json new file mode 100644 index 0000000..2c5eb7d --- /dev/null +++ b/docs/explanation/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Explanation", + "position": 4 +} diff --git a/docs/explanation/architecture.mdx b/docs/explanation/architecture.mdx new file mode 100644 index 0000000..eb0f45a --- /dev/null +++ b/docs/explanation/architecture.mdx @@ -0,0 +1,107 @@ +--- +sidebar_position: 1 +title: 'Architecture' +description: 'Why PSAppDeployToolkit v4 is built the way it is.' +slug: /explanation/architecture +hide_title: true +tags: + - Architecture + - Explanation +--- + +## Architecture + +PSAppDeployToolkit v4 is a rewrite rather than an evolution of v3. Three changes account for most of +the differences: state lives in an object, the user interface runs in its own process, and the +toolkit ships as a PowerShell module that packages consume rather than a script library they copy. + +## State lives in a session object + +In v3, a deployment's state was a large collection of global variables. Any function could read or +write them, nothing was namespaced, and two deployments could not sensibly coexist in one process. + +v4 replaces that with the `ADTSession` object, created by +[`Open-ADTSession`](../reference/functions/Open-ADTSession.mdx) and closed by +[`Close-ADTSession`](../reference/functions/Close-ADTSession.mdx). Everything about the deployment in +progress hangs off that object: the application metadata, the resolved deployment mode, the log path, +and the current phase. + +The practical consequences: + +- Deployment-specific values are addressed explicitly, as `$adtSession.AppName` rather than + `$appName`, so it is obvious where a value came from. +- The session has a defined lifetime. Opening it is when detection runs and the log begins; closing + it is when the exit code is decided. +- More than one session can exist during a run. The module tracks open sessions as a list and + [`Get-ADTSession`](../reference/functions/Get-ADTSession.mdx) returns the current one, which is what + makes multi-part deployments workable: a dependency first, then the application. + +Environment-level values such as `$envProgramFiles` and `$envOSVersion` are not session state and +remain plain variables, populated when a session opens or on demand via +[`Export-ADTEnvironmentTableToSessionState`](../reference/functions/Export-ADTEnvironmentTableToSessionState.mdx). +The split is deliberate. Facts about the machine are not facts about the deployment. + +Further reading: [The deployment script](./the-deployment-script.mdx), +[ADTSession Object reference](../reference/adtsession-object.mdx). + +## The user interface is a separate process + +A deployment normally runs as SYSTEM, in session 0. A process in session 0 cannot draw a window that +a logged-on user will see. v3 worked around this with `ServiceUI.exe`, which relaunched the whole +deployment in the user's session, including the parts that needed to be SYSTEM. + +v4 inverts that. The deployment stays where it belongs, and only the dialogs are launched into the +user's session as a separate process. Nothing privileged crosses the boundary. + +This is why, from v4.1, Intune packages need no `ServiceUI` workaround and Configuration Manager +packages need no "allow users to interact" setting. It also means the surface a user can reach is +much smaller. A file dialog in a SYSTEM-context installer is a well-known route to a SYSTEM command +prompt, and that route no longer exists by default. + +Further reading: [The user interface](./user-interface.mdx). + +## The toolkit is a module, not a copied script library + +v3 packages carried a folder of scripts that each package could modify, and often did. Upgrading +meant reconciling local edits against a new version. + +In v4 the toolkit is a signed PowerShell module. The package either bundles the module folder or +relies on it being installed on the endpoint, and in both cases the module is treated as read-only. +Everything a package needs to change lives outside it: + +| Concern | Where it lives | +| ------------------- | --------------------------- | +| Deployment logic | `Invoke-AppDeployToolkit.ps1` | +| Settings | `Config\config.psd1` | +| User-facing text | `Strings\strings.psd1` | +| Branding | `Assets\` | +| Your own functions | `PSAppDeployToolkit.Extensions\` | + +Because none of these are inside the module folder, updating the toolkit in an existing package is +usually a folder swap, which is the reason for the separation. + +The cost is a folder structure that looks more complicated than v3's at first glance. Most of it is +not yours to touch; see the [Deployment Template reference](../reference/deployment-template.mdx). + +## A consistent set of commands + +The module exposes more than 130 commands covering process execution, registry and file operations, +user and session queries, dialogs, and logging. They share a common shape: consistent parameter +naming, structured error handling, and logging to the deployment log by default. + +A deployment script that uses `Copy-ADTFile` rather than `Copy-Item` gains logging and error handling +for free, and anyone reading the log later sees the same format regardless of which package produced +it. The same conventions are available to your own code; see +[extending the toolkit](../how-to/extend-the-toolkit-with-custom-functions.mdx). + +## What this means when things go wrong + +Each decision above shows up in troubleshooting: + +- Session state means the log records what the session resolved to, and why, including the deployment + mode. +- The separate UI process means "no dialogs appeared" is usually a mode decision, not a UI failure. +- The read-only module means a package that misbehaves after an upgrade is nearly always a config or + script issue, not a modified toolkit. + +See [How to troubleshoot a deployment](../how-to/troubleshoot-a-deployment.mdx). diff --git a/docs/explanation/configuration.mdx b/docs/explanation/configuration.mdx new file mode 100644 index 0000000..bb7baed --- /dev/null +++ b/docs/explanation/configuration.mdx @@ -0,0 +1,82 @@ +--- +sidebar_position: 4 +title: 'Configuration' +description: 'The configuration layers, and what belongs in each of them.' +slug: /explanation/configuration +hide_title: true +tags: + - Configuration + - Explanation +--- + +## Configuration + +A deployment's behaviour comes from three places, and knowing which one a given setting belongs in +saves a lot of time later. + +## Three layers, in order + +| Layer | Lives in | Scope | +| :---------------------- | :------------------------------------------ | :-------------------------- | +| Built-in defaults | `config.psd1` inside the module folder | Every deployment, everywhere | +| Package configuration | `Config\config.psd1` in the deployment | One package | +| Group Policy | `HKLM\SOFTWARE\Policies\PSAppDeployToolkit` | Every deployment on the device | + +Later layers win. Group Policy beats the package, and the package beats the built-in defaults. Each +layer only needs to state what it changes; anything it omits falls through to the layer beneath. + +That ordering is deliberate. The organization's decisions about where logs go, what the accent colour +is, and how long a prompt persists should not be re-litigated by every packager, and should not be +overridable by a package that predates the decision. A packager, meanwhile, should not have to ask for +a policy change to alter something that only affects their own application. + +## Why the module's copy is off-limits + +The module ships its own `config.psd1` holding the defaults. It is there to be read, not edited. +Editing it means the next module update silently reverts your change, and means two packages using +the same module version behave differently depending on when they were built. + +Put changes in the deployment's `Config\config.psd1` instead (see +[how to customize a deployment](../how-to/customize-a-deployment.mdx)), or in Group Policy if they +should apply everywhere. + +## Configuration is not session properties + +The two are easy to confuse, because both are "settings". + +- **Configuration** describes the *environment*: where logs are written, what MSI parameters to use + by default, how the dialogs look. It is the same for every application in an estate, so it lives in + a config file or a policy. +- **Session properties** describe the *package*: what it is called, which processes it conflicts + with, whether it needs administrative rights. They belong to one application, so they live in + `Invoke-AppDeployToolkit.ps1`. + +v4.1 moved three settings across this line. `RequireAdmin`, `OobeDetection` and `SessionDetection` +went from config to session properties, because they describe the package rather than the +environment. A single config file cannot say "this application needs admin rights and that one does +not". See [how to upgrade from v4.0](../how-to/upgrade-from-v4-0.mdx). + +## Why PowerShell data files + +`config.psd1` and `strings.psd1` are PowerShell data files, not the XML that v3 used. A `.psd1` is a +restricted subset of PowerShell that declares data and cannot execute anything, so it is safe to +load, and it is the same syntax packagers already write in the deployment script. Nested settings +read as nested hashtables, which is how they are addressed in code and in this documentation: +`Toolkit.LogPath`, `UI.DeferExitCode`. + +The cost is that config changes do not migrate automatically from v3's `config.xml`. There is no +converter for it; the settings must be re-applied by hand. + +## Text is configured separately + +User-facing text lives in `strings.psd1`, not `config.psd1`, and ships pre-translated into 25 +languages. Keeping it separate means a package can be re-branded or re-worded without touching +behavioural settings, and that a translation update is a file swap. The language is selected from the +operating system unless `UI.LanguageOverride` says otherwise. + +## Related + +- [Configuration Settings reference](../reference/config-settings.mdx) +- [Language Strings reference](../reference/language-strings.mdx) +- [How to configure the toolkit with Group Policy](../how-to/configure-with-group-policy.mdx) +- [Logging](./logging.mdx) diff --git a/docs/explanation/deployment-modes.mdx b/docs/explanation/deployment-modes.mdx new file mode 100644 index 0000000..1b45228 --- /dev/null +++ b/docs/explanation/deployment-modes.mdx @@ -0,0 +1,114 @@ +--- +sidebar_position: 3 +title: 'Deployment modes' +description: 'What DeployMode does, and how Auto decides between interactive and silent.' +slug: /explanation/deployment-modes +hide_title: true +tags: + - DeployMode + - Explanation +--- + +import ThemedImage from '@theme/ThemedImage'; + +## Deployment modes + +`DeployMode` answers one question: how much may this deployment involve the user? It gets blamed for +"the dialogs didn't appear" more often than anything else, and in most of those cases it is doing +exactly what it was asked to do. + +## The four modes + +| Mode | Behaviour | +| :--------------- | :---------------------------------------------------------------------------------------------------- | +| `Interactive` | All dialogs shown, including those that ask the user to do something. | +| `NonInteractive` | Dialogs that only inform, such as progress, are shown. Anything requiring input is suppressed. | +| `Silent` | No dialogs at all. | +| `Auto` | Resolved at runtime to one of the three above. This is the default. | + +`NonInteractive` exists for the case where a user is present but must not be asked to make a +decision. Autopilot enrolment is the usual example: a prompt would block provisioning, but progress +is still worth showing. + + + +In `Silent`, even this is suppressed. + +## Why Auto is the default + +A package is written once and then runs everywhere: on a device with a user at the keyboard, on a +device in a bare provisioning phase, on a server with nobody logged on, and from a task sequence. +Hard-coding a mode means the package is wrong in at least one of those situations. + +Before v4.1, packagers worked around this by passing `-DeployMode Silent` from the management system +for some deployments and not others, or by branching in the script. `Auto` moves that decision to +where the facts are: the device, at the moment the session opens. + +## How Auto resolves + +When the session opens, the toolkit works through the following checks in order. The **first** check +that applies sets the mode; later checks are logged but do not override it. Explicitly setting +`DeployMode` to anything other than `Auto` disables all of them. + +1. **Is the device still in the OOBE?** If so, the mode becomes `NonInteractive`. Bypass with the + `NoOobeDetection` session property. +2. **Is the device in the ESP user account setup phase?** Detected via the `WWAHost` process and the + enrolment's first-sync state for the logged-on user. If so, the mode becomes `NonInteractive`. + Also bypassed by `NoOobeDetection`. +3. **Is this session 0?** If the process cannot present a user interface, or if there is no logged-on + user and the process is non-interactive, the mode becomes `Silent`. If a user is logged on, the + mode is left alone, because there is somebody to talk to. Bypass with the `NoSessionDetection` + session property. +4. **Are the declared processes running?** If `AppProcessesToClose` is populated but none of those + processes is currently running, the mode becomes `Silent`. There is nothing to ask the user to + close, so there is no reason to interrupt them. Bypass with the `NoProcessDetection` session + property. +5. **Were no processes declared at all?** From template version 4.2.0 onward, a deployment that + declares no processes to close resolves to `Silent` for the same reason. Packages built on + earlier templates keep the older behaviour, so upgrading the module alone does not change how + they run. An older template can buy into the newer silent-when-empty behaviour by setting + `DeployAppScriptVersion` to 4.2.0 or higher. +6. **Still `Auto`?** The mode becomes `Interactive`. + +There is one further adjustment after the fact: a deployment set to `NonInteractive` with no suitable +logged-on user and a non-interactive process is downgraded to `Silent`, since there is no session to +draw a progress dialog in. + +Every one of these decisions is written to the log, with the reason. When a deployment ran more +quietly than you expected, the log tells you which check fired. + +## When to override + +Set an explicit mode when the deployment's audience is known in advance and does not match what the +checks would infer: + +- `Silent` for anything genuinely unattended, where a dialog would be an error rather than a + courtesy. +- `Interactive` for a self-service install the user launched themselves. +- `NonInteractive` when you want progress shown but no decisions asked. + +Prefer the bypass properties over an explicit mode when only one check is wrong. Wanting the UI +during ESP is a reason to set `NoOobeDetection`, not a reason to abandon `Auto` and lose the other +three checks. + +## Consequences elsewhere + +- `Silent` implies `NonInteractive`; both suppress prompts, and `Silent` additionally suppresses + informational dialogs. +- A user cannot defer a deployment that never shows them a dialog. Deferral is an interactive + feature; see [closing apps and allowing deferral](../how-to/close-apps-and-allow-deferral.mdx). +- Mode affects the user experience only. It does not change what gets installed, or the exit code. + +## Related + +- [Command-Line Parameters](../reference/command-line-parameters.mdx) +- [ADTSession Object reference](../reference/adtsession-object.mdx), covering `NoOobeDetection`, + `NoSessionDetection` and `NoProcessDetection` +- [The user interface](./user-interface.mdx) diff --git a/docs/explanation/logging.mdx b/docs/explanation/logging.mdx new file mode 100644 index 0000000..f8dba26 --- /dev/null +++ b/docs/explanation/logging.mdx @@ -0,0 +1,94 @@ +--- +sidebar_position: 5 +title: 'Logging' +description: 'What the toolkit logs, where it goes, and why it is shaped that way.' +slug: /explanation/logging +hide_title: true +tags: + - Logging + - Explanation +--- + +## Logging + +A deployment runs unattended, as SYSTEM, on a machine you cannot see, and usually fails for the first +time in front of somebody else. The log is the only account of what happened, so the toolkit logs by +default and logs a lot. + +## Everything is logged, without being asked + +Every toolkit command writes to the deployment log as a matter of course: what it was called with, +what it found, what it returned, and how long it took. That is why `Copy-ADTFile` is preferable to +`Copy-Item` inside a deployment. The copy shows up in the log with the rest of the story. + +The same applies to your own code, provided it uses +[`Write-ADTLogEntry`](../reference/functions/Write-ADTLogEntry.mdx) rather than `Write-Host`, and +that custom functions are built on the toolkit's function skeleton. See +[extending the toolkit](../how-to/extend-the-toolkit-with-custom-functions.mdx). + +## One log per package, one per MSI action + +The deployment log is named after the package, so it sorts alongside its siblings on a shared log +share: + +```text +Oracle_JavaRuntime_1.7.0.17_EN_01_PSAppDeployToolkit.log +``` + +MSI operations are logged separately by Windows Installer, one file per action: + +```text +Oracle_JavaRuntimeEnvironmentx86_1.7.0.17_EN_01_Install.log +Oracle_JavaRuntimeEnvironmentx86_1.7.0.17_EN_01_Repair.log +Oracle_JavaRuntimeEnvironmentx86_1.7.0.17_EN_01_Patch.log +Oracle_JavaRuntimeEnvironmentx86_1.7.0.17_EN_01_Uninstall.log +``` + +For an uninstall, the product code is resolved back to the application name and version so the +filename matches the pattern used at install time, which means the same application produces the same +filename regardless of which action ran. + +Logs default to `C:\Windows\Logs\Software`. Where they actually go depends on the configuration +layers, since a Group Policy setting overrides the package's own. See +[Configuration](./configuration.mdx). + +## Why there is a separate path for non-admin runs + +`Toolkit.LogPathNoAdminRights` exists because a deployment that runs in a user's context cannot +write to `C:\Windows\Logs`. Rather than failing, or silently losing the log, the toolkit falls back +to a location the user can write to. The same reasoning gives the toolkit separate registry and +temporary paths for non-admin runs. + +## Why log compression exists + +Set `Toolkit.CompressLogs` and all logs are written to a temporary folder instead, exposed as +`$adtSession.LogTempFolder` and defaulting to `$envTemp\$installName`. When the session closes they +are zipped into the configured log folder and the temporary folder is removed. + +This matters when a deployment produces more than one log: the toolkit's, the MSI's, and whatever +the vendor's installer writes. Anything your script drops into `LogTempFolder` is collected too, so +a support request becomes one file rather than a scavenger hunt. The zip is named for the deployment +type and timestamped, so consecutive attempts do not overwrite each other. + +The cost is that nothing is readable in the usual location until the run finishes, which is why it is +not on by default. + +## Reading the log + +`Toolkit.LogStyle` selects between CMTrace format and plain text. CMTrace format carries severity and +component metadata that CMTrace and OneTrace render as colour and columns, which is worth having +where those tools are already in use. + +`Toolkit.LogDebugMessage` adds the toolkit's internal diagnostics. It is off by default because it is +noise during normal operation and indispensable during a failure. + +Other settings govern rotation and structure. `LogMaxSize`, `LogMaxHistory` and `LogAppend` control +how long logs live and whether they are overwritten. `LogToSubfolder` and `LogToHierarchy` will file +logs under `InstallName`, or under `AppVendor\AppName\AppVersion`, when a flat folder becomes +unmanageable. + +## Related + +- [Configuration Settings reference](../reference/config-settings.mdx) +- [How to troubleshoot a deployment](../how-to/troubleshoot-a-deployment.mdx) +- [How to set the log path with Group Policy](../how-to/set-the-log-path-with-group-policy.mdx) diff --git a/docs/explanation/the-deployment-script.mdx b/docs/explanation/the-deployment-script.mdx new file mode 100644 index 0000000..94c15da --- /dev/null +++ b/docs/explanation/the-deployment-script.mdx @@ -0,0 +1,116 @@ +--- +sidebar_position: 2 +title: 'The deployment script' +description: 'How Invoke-AppDeployToolkit.ps1 is organized, and why.' +slug: /explanation/the-deployment-script +hide_title: true +tags: + - Invoke-AppDeployToolkit + - Explanation +--- + +## The deployment script + +`Invoke-AppDeployToolkit.ps1` is where you will spend nearly all of your time. It is the entry point +of a deployment, and the only file in the template that is unambiguously yours to write. + +It has three parts: the properties that describe the deployment, the script blocks that do the work, +and a fixed block at the bottom that opens the session, runs the right blocks, and closes the +session again. Only the first two are meant to be edited. + +## The properties describe, they do not execute + +The `$adtSession` hashtable at the top of the script is data, not logic. It is assembled before the +module is imported and handed to +[`Open-ADTSession`](../reference/functions/Open-ADTSession.mdx), which turns it into the session +object the rest of the deployment reads from. + +This is why toolkit variables such as `$envProgramFiles` do not work up there: at that point the +module has not been imported and nothing has been populated. Anything that needs to inspect the +machine belongs inside a phase block, which runs after the session is open. + +The full list of properties is in the +[ADTSession Object reference](../reference/adtsession-object.mdx). Two of them are worth +understanding rather than just looking up: + +**`AppProcessesToClose`** declares the applications that must not be running. Declaring them here +rather than passing them to each dialog call means the same list is used for install, uninstall and +repair. It also means the session sees the list when it opens, so it can decide whether a user needs +to be involved at all. Give each entry a `Name` and a `Description` where the process name would mean +nothing to a user: + +```powershell +AppProcessesToClose = @(@{ Name = 'winword'; Description = 'Microsoft Word' }) +``` + +**`RequireAdmin`** states whether the deployment needs administrative rights. It is a property of the +package, not of the environment, which is why it moved out of the config file in v4.1. When it is +`$true` and the process is not elevated, the session refuses to open. Note that +`Invoke-AppDeployToolkit.exe` does not elevate itself on the strength of this setting. That is the +caller's job. + +Both properties are new in v4.1; if you are coming from v4.0, see +[how to upgrade](../how-to/upgrade-from-v4-0.mdx). + +## Three deployment types, three phases each + +A deployment is one of **Install**, **Uninstall** or **Repair**, chosen by `-DeploymentType` at +launch. Each is expressed as three script blocks: + +| Deployment type | Blocks | +| :-------------- | :------------------------------------------- | +| Install | `Pre-Install`, `Install`, `Post-Install` | +| Uninstall | `Pre-Uninstall`, `Uninstall`, `Post-Uninstall` | +| Repair | `Pre-Repair`, `Repair`, `Post-Repair` | + +At runtime the script looks up the three blocks matching the deployment type, sets +`$adtSession.InstallPhase` to each block's name, and runs them in order. Nothing else is executed, so +code that belongs to an uninstall cannot accidentally run during an install. + +The split into three separates work that has different failure consequences: + +- **Pre** is everything that happens *before* the system is changed: telling the user what is about + to happen, closing conflicting applications, checking disk space, removing an older version. + Failing here is cheap, because nothing has been modified yet. This is also where a user gets the + chance to defer. +- **The main phase** is the change itself: running the installer or uninstaller. It should be as + small as possible, because this is the part that cannot be cleanly abandoned halfway. +- **Post** is everything that only makes sense once the change succeeded: registry tweaks, dropping + configuration files, removing unwanted shortcuts, telling the user it is done, prompting for a + restart. + +Because `InstallPhase` is recorded in the log as each block starts, a failure in the log is +immediately attributable to one of the three. + +## The initialization block + +The block at the bottom of the script is deliberately uninteresting, and deliberately fixed. It: + +1. Imports the module, using the copy bundled in the package if there is one and otherwise the + installed one, pinned to a specific version and GUID. +2. Strips empty values out of `$adtSession` and opens the session, capturing the returned object back + into `$adtSession`. +3. Imports any `PSAppDeployToolkit.*` extension modules sitting alongside the script. +4. Runs the three blocks for the deployment type. +5. Calls [`Close-ADTSession`](../reference/functions/Close-ADTSession.mdx), which decides the exit + code. + +If step 1 or 2 fails there is no session and therefore no log, so the script exits with `60008` and +writes the error to the console. That is why +[`/Debug`](../reference/command-line-parameters.mdx) is the first thing to reach for when a +deployment dies immediately. An unhandled error anywhere in steps 3 to 4 is logged and the session is +closed with `60001`. + +## What this shape buys you + +Every package built this way has the same skeleton. Someone who has never seen your package can open +it, read the properties to learn what it deploys, and jump straight to the phase that matters. The +log they get back is in the same format, with the same phase names, as every other package in the +estate. + +## Related + +- [Deployment Modes](./deployment-modes.mdx), on how `DeployMode` resolves at runtime +- [Deployment Template reference](../reference/deployment-template.mdx), on the folders around the + script +- [How to create a new deployment](../how-to/create-a-deployment.mdx) diff --git a/docs/explanation/user-interface.mdx b/docs/explanation/user-interface.mdx new file mode 100644 index 0000000..89f8bdd --- /dev/null +++ b/docs/explanation/user-interface.mdx @@ -0,0 +1,109 @@ +--- +sidebar_position: 6 +title: 'The user interface' +description: 'Why the toolkit UI runs in its own process, and what Fluent and Classic mean.' +slug: /explanation/user-interface +hide_title: true +tags: + - User Interface + - Explanation +--- + +import ThemedImage from '@theme/ThemedImage'; + +## The user interface + +Showing a dialog from a deployment is harder than it sounds, because the deployment and the person +who needs to see the dialog are not in the same place. + +## The session 0 problem + +An application deployed by Intune or Configuration Manager runs as SYSTEM in session 0. Interactive +users log on to session 1 and above. Windows isolates session 0 from user sessions deliberately: a +window drawn there is not shown to anybody, and if it were, it would be a window drawn by a +privileged process on a desktop that an unprivileged user controls. + +v3's answer was `ServiceUI.exe`, which relaunched the deployment inside the user's session so its +windows would be visible. It worked, but it moved the *whole* deployment across the boundary, +including the parts that had to be SYSTEM, and it left an interactive window belonging to a +privileged process where a user could reach it. Any file dialog, any hyperlink, any "open containing +folder" is a route from there to a SYSTEM command prompt. + +## What v4.1 does instead + +The deployment stays in session 0. When a dialog is needed, the toolkit launches a separate process +in the user's session whose only job is to display it and report the answer back. The privileged work +never crosses the boundary, and the process the user can interact with holds no privileges worth +stealing. + +The consequences are visible in day-to-day use: + +- Intune deployments show dialogs with no `ServiceUI` workaround. +- Configuration Manager deployments no longer need **Allow users to view and interact with the + program installation**. +- `Invoke-ServiceUI.ps1` was removed from the toolkit, because there is nothing left for it to do. + +You can still ship `ServiceUI.exe` in a package and use it to launch an installer interactively. The +security cost described above is unchanged, and is now a choice rather than a requirement. + +## Fluent and Classic + +Two dialog sets ship with the toolkit. + +**Fluent** is the current one: modern Windows styling, light and dark themes, a logo rather than a +banner, an accent colour, and support for +[rich text formatting](../reference/text-formatting.mdx) in messages. New deployments should use it. + + + +**Classic** reproduces the v3 dialogs. It exists for two reasons: estates that have standardized on +that look and do not want a visual change mid-rollout, and v3 compatibility mode, where it is the +only option. The v3 functions do not accept parameters the Fluent dialogs need, `SubTitle` being one +example, so compatibility mode cannot offer Fluent without changing the v3 function signatures, which +would defeat the purpose of compatibility mode. + +Which set is used is set by `UI.DialogStyle`. Branding differs between them: Fluent uses a logo, +Classic uses a banner, and each ignores the other's asset. See +[how to brand the user interface](../how-to/brand-the-user-interface.mdx). + +## Dialogs do not change the outcome + +Nothing about a deployment's result depends on a dialog being shown. The same package installs the +same software whether the user saw a welcome prompt or not. The dialogs affect when the work happens +and how much warning the user gets, not what is installed. Whether they appear at all is decided by +[the deployment mode](./deployment-modes.mdx). + +The one exception is deferral, which is a genuine decision the user makes. A deferred deployment +exits with `UI.DeferExitCode`, and the management system decides what happens next, which is why that +exit code needs mapping. See +[closing apps and allowing deferral](../how-to/close-apps-and-allow-deferral.mdx). + +## Localization + +All dialog text comes from `strings.psd1`, pre-translated into 25 languages, selected from the +operating system's settings unless `UI.LanguageOverride` overrides it. Because the text is +externalized, a package built in one language works in another without being rebuilt. + + + +Nothing in the package changed to produce this; only the language selection did. + +## Related + +- [Dialogs reference](../reference/dialogs.mdx), covering every dialog with screenshots +- [Language Strings reference](../reference/language-strings.mdx) +- [Text Formatting reference](../reference/text-formatting.mdx) diff --git a/docs/getting-started/_category_.json b/docs/getting-started/_category_.json deleted file mode 100644 index 877a378..0000000 --- a/docs/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting Started", - "position": 2 -} diff --git a/docs/getting-started/creating-a-new-deployment.mdx b/docs/getting-started/creating-a-new-deployment.mdx deleted file mode 100644 index d74466a..0000000 --- a/docs/getting-started/creating-a-new-deployment.mdx +++ /dev/null @@ -1,48 +0,0 @@ ---- -sidebar_position: 4 -title: 'Creating a new deployment' -description: 'How to create a new deployment from a deployment template.' -slug: /getting-started/creating-a-new-deployment -hide_title: true -tags: - - Usage - - Template - - Scaffold - - Getting Started ---- - -## Creating a new deployment - -:::info - -A **deployment template** contains the source files for an application deployment, the deployment script that defines the deployment logic, and the PSADT module and configuration. It is typically entirely self-contained and can be shared with others to deploy the application in a consistent manner. -::: - -### Using the module - -The PSAppDeployToolkit module can create a new deployment from PSADT's internal templates. - -To create a new deployment using the PSADT v3 compatible template, run: - -```powershell -New-ADTTemplate -Destination C:\Temp -Name "PSAppDeployToolkitv3" -Version 3 -``` - -To create a new deployment using the PSADT v4 native deployment template, run: - -```powershell -New-ADTTemplate -Destination C:\Temp -Name "PSAppDeployToolkitv4" -``` - -### Using the downloadable templates - -The PSAppDeployToolkit GitHub Releases page includes several templates for creating a new deployment. - -- `PSAppDeployToolkit_Template_v4.zip` - PSADT v4 native deployment template -- `PSAppDeployToolkit_Template_v3.zip` - PSADT v3 compatible deployment template - -To create a new deployment using the templates, follow these steps: - -1. Download the PSAppDeployToolkit template you require from the [PSAppDeployToolkit GitHub Releases page](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit/releases/latest). -2. Extract the contents to a folder on your computer. -3. Open the folder and review the contents. We will discuss the contents in the next section. diff --git a/docs/getting-started/download.mdx b/docs/getting-started/download.mdx deleted file mode 100644 index 1e833b7..0000000 --- a/docs/getting-started/download.mdx +++ /dev/null @@ -1,59 +0,0 @@ ---- -sidebar_position: 3 -title: 'Download' -description: 'How to download a copy of PSAppDeployToolkit.' -slug: /getting-started/download -hide_title: true -tags: - - Download - - Getting Started ---- - -## How to download PSAppDeployToolkit - -PSAppDeployToolkit is available as a module on the PowerShell Gallery or as a self-contained zip file archive on GitHub, which includes the PSAppDeployToolkit module. Both downloads provide the functions required to scaffold a new deployment. - -### Installing from the PowerShell Gallery - -You can install the PSAppDeployToolkit module from the PowerShell Gallery by running: - -```powershell -Install-Module -Name PSAppDeployToolkit -Scope CurrentUser -``` - -### Grabbing the archive / zip files from GitHub releases - -Alternatively, you can download the release assets: - -- [PSAppDeployToolkit Latest Release](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit/releases) - -Here you will see the latest release of PSAppDeployToolkit. Click the `Assets` dropdown to view the available downloads. You should see the following: - -| Filename | Description | -|--------------------------------------|-----------------------------------------------------------------------------------------------| -| `PSAppDeployToolkit_ModuleOnly.zip` | Zip file containing the latest version of the module. At a minimum, you should download this. | -| `PSAppDeployToolkit_Template_v3.zip` | Zip file containing the v3 template. Contains the scaffold for a v3 compatible deployment. | -| `PSAppDeployToolkit_Template_v4.zip` | Zip file containing the v4 template. Contains the scaffold for a v4 native deployment. | -| `Source code (zip)` | Zip file containing the source code. | - -Once extracted, you will see a file and folder structure similar to the one described on the next page. - -### Downloading PSAppDeployToolkit.Tools - -PSAppDeployToolkit.Tools is a companion module designed for functions that help you create packages rather than deploy them. - -At present, this is in pre-release status, so installing from the PowerShell Gallery requires an additional switch: - -```powershell -Install-Module PSAppDeployToolkit.Tools -Scope CurrentUser -AllowPreRelease -``` - -If this produces an error that the -AllowPreRelease parameter is not recognized, then first update PowerShellGet and then restart your PowerShell console: - -```powershell -Install-Module PowerShellGet -Force -Scope CurrentUser -``` - -Alternatively, you can download the release assets: - -- [PSAppDeployToolkit.Tools Latest Release](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools/releases/latest) diff --git a/docs/getting-started/upgrade-guidance-4x-to-v41.mdx b/docs/getting-started/upgrade-guidance-4x-to-v41.mdx deleted file mode 100644 index 21571bf..0000000 --- a/docs/getting-started/upgrade-guidance-4x-to-v41.mdx +++ /dev/null @@ -1,115 +0,0 @@ ---- -sidebar_position: 6 -title: 'Upgrade Guidance: v4 to v4.1' -description: 'Upgrade guidance for those coming from v4.0.' -slug: /getting-started/upgrade-guidance-4x-to-v41 -hide_title: true -tags: - - Usage - - Migration - - Getting Started ---- - -## Upgrade Guidance: v4 to v4.1 - -### Breaking Changes in v4.1 - -:::warning - -- `DeployMode` now defaults to a new mode `Auto`, which defaults to interactive but reverts to silent if the device is in OOBE/ESP phases, there is no user logged on, or there are no processes to close. -- `OOBEDetection` and `SessionDetection` are no longer set in Config.psd1. They can be set per-deployment by adding the `NoOOBEDetection` and `NoSessionDetection` options to the session properties if required. -- `AppProcessesToClose` is a new session property that allows you to define processes to close during Install/Uninstall/Repair in one place instead of specifying the processes directly on the `-CloseProcesses` parameter of `Show-ADTInstallationWelcome`. -- `RequireAdmin` is no longer set in Config.psd1. It must be set per-deployment in the session properties. -- `Invoke-AppDeployToolkit.exe` no longer requests elevation if RequireAdmin is set; you must elevate this yourself. -- Several config options have been removed or had their default values changed. See below for details. -- Deprecated functions and parameters are scheduled for removal in 4.2.0. Update your scripts accordingly. - -::: - -### Updating an Existing v4.0 Deployment to v4.1 - -For patch releases (e.g. v4.0.5 to v4.0.6), all that is normally required is to replace the PSAppDeployToolkit folder within the package. - -However there are a number of changes to various toolkit files in 4.1 to be aware of. - -### Changes in Invoke-AppDeployToolkit.ps1 - -:::info -`AppProcessesToClose` and `RequireAdmin` are now set in the `$adtSession` object. This is a breaking change from previous versions. See the examples below for the new pattern. -::: - -There are 2 new additions to the $adtSession hashtable: - -```powershell -$adtSession = @{ - # App variables. - - AppProcessesToClose = @('excel', @{ Name = 'winword'; Description = 'Microsoft Word' }) - - RequireAdmin = $true -} -``` - -- `AppProcessesToClose` allows you to specify the processes to be closed in one place, saving you from copying the same list to the Uninstall and Repair sections of your script. If `DeployMode` is set to `Auto` (the default), the toolkit will automatically switch to `Silent` if none of the defined processes are running when the session is opened. This can be disabled by setting the `-NoProcessDetection` option when opening the session. -- `RequireAdmin` has been moved from the config file to the template, since it is a per-package setting. If set to `$true`, the script will fail at the point of opening the session if the user does not have administrative privileges. - -The `Show-ADTInstallationWelcome` example has been updated to use [splatting](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting): - -```powershell -$saiwParams = @{ - AllowDefer = $true - DeferTimes = 3 - CheckDiskSpace = $true - PersistPrompt = $true -} -if ($adtSession.AppProcessesToClose.Count -gt 0) -{ - $saiwParams.Add('CloseProcesses', $adtSession.AppProcessesToClose) -} -Show-ADTInstallationWelcome @saiwParams -``` - -This allows you to more easily read the options being set, and will only add CloseProcesses to the parameter list if it's not empty. You are still welcome to use the method from the v4.0 template if you prefer - the template is provided for your customisation. - -The last important change is this line that calls `Remove-ADTHashtableNullOrEmptyValues` to strip out any null or empty values from the `$adtSession` hashtable before it is passed to the `Open-ADTSession` function: - -```powershell - $adtSession = Remove-ADTHashtableNullOrEmptyValues -Hashtable $adtSession ⬅️ - $adtSession = Open-ADTSession @adtSession @iadtParams -PassThru -``` - -### OOBE and Session Detection Changes - -:::warning -OOBE and session detection logic has changed in 4.1. OOBE detection now includes the User ESP phase, and you can now bypass OOBE or session detection per deployment using the new `NoOobeDetection` and `NoSessionDetection` session parameters. Review your scripts and config if you rely on the old behavior. -::: - -### Changes in Config.psd1 - -Changed defaults: - -| Option | Default | Description | -| ------------------------ | ------------------------- | ------------------------------------------------------------------ | -| MSI.InstallParams | /qn REBOOT=ReallySuppress | Default MSI parameters for installation. | -| MSI.LogPath | | Now uses the same path as Toolkit.LogPath when empty. | -| MSI.LogPathNoAdminRights | | Now uses the same path as Toolkit.LogPathNoAdminRights when empty. | -| UI.DeferExitCode | 1602 | Default exit code for deferred installations. | - -Removed options: - -- Toolkit.OobeDetection -- Toolkit.SessionDetection -- Toolkit.RequireAdmin - -### Changes in Strings.psd1 - -There have been extensive changes to the Strings.psd1 files for each language, too many to list here. Please submit an issue or pull request on GitHub if you are able to improve any of the translations! - -### Additional Migration Notes - -:::info - -- Use the migration tools (`Test-ADTCompatibility`, `Convert-ADTDeployment`) to help update your scripts. -- Review all function and parameter deprecations in the [release notes](../getting-started/release-notes.mdx). - -::: diff --git a/docs/getting-started/upgrade-guidance-v3x-to-v41.mdx b/docs/getting-started/upgrade-guidance-v3x-to-v41.mdx deleted file mode 100644 index 6c133c3..0000000 --- a/docs/getting-started/upgrade-guidance-v3x-to-v41.mdx +++ /dev/null @@ -1,71 +0,0 @@ ---- -sidebar_position: 7 -title: 'Upgrade Guidance: v3.x to v4.1' -description: 'Upgrade guidance for those coming from v3.' -slug: /getting-started/upgrade-guidance-v3x-to-v41 -hide_title: true -tags: - - Usage - - Migration - - Getting Started ---- - -## Upgrade Guidance: v3.x to v4.1 - -Before proceeding, ensure that you have reviewed the changes in the [release notes](../getting-started/release-notes.mdx). - -### Using v4 in v3 Compatibility Mode - -See the [Creating a new deployment](../getting-started/creating-a-new-deployment.mdx) page for instructions on creating a v3-compatible deployment template or downloading one from GitHub. - -This layout allows you to drop in your existing v3 **Deploy-Application.ps1** scripts (along with **AppDeployToolkit\AppDeployToolkitExtensions.ps1**), which will continue to function with the following caveats: - -- If you customized **config.xml** in your previous v3 deployment, you will now need to modify **Config\config.psd1** and/or **Strings\strings.psd1** accordingly. -- Copy your custom banner to **Assets\Banner.Classic.png**. -- Compatibility mode does not support the new Fluent UI. - -### Migration Tools in PSAppDeployToolkit.Tools - -[PSAppDeployToolkit.Tools](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools) provides the following commands to help you migrate from v3: - -- **Test-ADTCompatibility** - Tests your PSAppDeployToolkit v3 scripts to generate a full report on which functions and variables have changed in v4. -- **Convert-ADTDeployment** - Converts a PSAppDeployToolkit v3 script or an entire package folder to v4 standards. - -The [Downloading](../getting-started/download.mdx) page covers how to download and install this additional module. - -#### Test-ADTCompatibility - -Example command usage: - -```powershell -Test-ADTCompatibility -FilePath .\Deploy-Application.ps1 -Format Grid -``` - -This command analyzes **Deploy-Application.ps1** and displays the results in a grid view. - -#### Convert-ADTDeployment - -Example command usage: - -```powershell -Convert-ADTDeployment -Path .\Deploy-Application.ps1 -``` - -This command converts **Deploy-Application.ps1** to **Invoke-AppDeployToolkit.ps1** in the same folder. - -```powershell -Convert-ADTDeployment -Path .\PackageFolder -``` - -This command converts **PackageFolder** to **PackageFolder_Converted** in the same folder. - -Conversion limitations: - -- Known toolkit variables, such as `$appName`, are copied over to the hashtable that creates `$adtSession`. -- The main Install, Uninstall, and Repair scriptblocks are converted and copied to the new script. -- Any other custom variables, function declarations, or code located outside these blocks will not be transferred. -- **Files** and **SupportFiles** contents are transferred if a package folder is supplied as the path rather than a **Deploy-Application.ps1** file. -- **Config.xml** changes will not be ported to the new .psd1 files. -- Customized assets or banners are not currently copied over. - -**PSAppDeployToolkit.Tools** is currently in pre-release to gather early feedback. If you encounter any conversion issues, please submit a [GitHub Issue](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools/issues). diff --git a/docs/how-to/_category_.json b/docs/how-to/_category_.json new file mode 100644 index 0000000..9529feb --- /dev/null +++ b/docs/how-to/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "How-to Guides", + "position": 3 +} diff --git a/docs/how-to/brand-the-user-interface.mdx b/docs/how-to/brand-the-user-interface.mdx new file mode 100644 index 0000000..cacccd8 --- /dev/null +++ b/docs/how-to/brand-the-user-interface.mdx @@ -0,0 +1,159 @@ +--- +sidebar_position: 15 +title: 'How to brand the user interface' +description: 'How to apply your own logo, banner, accent colour and wording to the toolkit dialogs.' +slug: /how-to/brand-the-user-interface +hide_title: true +tags: + - User Interface + - Customizing + - How-to +--- + +import ThemedImage from '@theme/ThemedImage'; + +## How to brand the user interface + +Branding is applied per deployment, in the `Assets` and `Config` folders of the package, or centrally +with [Group Policy](./configure-with-group-policy.mdx). + +## Replace the logo + +The Fluent dialogs show a logo. Replace `Assets\AppIcon.png` with your own file, keeping the +filename. Use a 256x256 PNG. + +To use a different image in dark mode, set `Assets.LogoDark` in `config.psd1`: + +```powershell +@{ + Assets = @{ + Logo = 'AppIcon.png' + LogoDark = 'AppIcon.Dark.png' + } +} +``` + +Both settings accept either a filename relative to the `Assets` folder or a Base64 string, which is +useful when you want branding embedded in a policy rather than in every package. + +## Replace the Classic banner + +The Classic dialogs show a banner instead of a logo. Replace `Assets\Banner.Classic.png`, keeping +the filename. The file must be a PNG, 450 x 50 pixels. + +The banner is ignored by the Fluent dialogs. + +## Set the accent colour + +```powershell +@{ + UI = @{ + FluentAccentColor = 0xFF0078D4 + FluentAccentColorDark = 0xFF4CC2FF + } +} +``` + +The accent colour is used by the Fluent dialogs and by the `[accent]` tag in +[text formatting](../reference/text-formatting.mdx). + +## Set the company name + +Dialog subtitles default to your company name. Set it once: + +```powershell +@{ + Toolkit = @{ + CompanyName = 'Contoso' + } +} +``` + +## Choose the dialog style + +`UI.DialogStyle` selects between the Fluent and Classic dialog sets. New deployments should use +Fluent; Classic exists for continuity with v3 and is the only style available in +[v3 compatibility mode](./upgrade-from-v3.mdx). + +## Change the wording + +Dialog text lives in `Strings\strings.psd1`, not in the assets. See +[How to customize a deployment](./customize-a-deployment.mdx) and the +[Language Strings reference](../reference/language-strings.mdx). + +### Writing dialog copy + +Messages support [text formatting](../reference/text-formatting.mdx) tags. A few rules keep the +result readable: + +**Use formatting sparingly.** When everything is formatted, nothing stands out. + +Avoid: + +```text +[bold][italic][accent]Everything[/accent][/italic][/bold] is [bold]formatted[/bold] [italic]differently[/italic]! +``` + +Prefer: + +```text +[bold]Important:[/bold] Please [accent]save your work[/accent] before continuing. +``` + +**Be consistent.** Pick a role for each tag and keep to it across every package: + +- `[bold]` for headings and important labels +- `[accent]` for critical information or warnings +- `[italic]` for supplementary information or examples +- `[url]` for support links and resources + +**Keep it accessible.** Ensure the accent colour has sufficient contrast against both themes, never +rely on formatting alone to carry meaning, and test your text in light and dark mode. + +**Close tags in reverse order.** `[bold][italic]Text[/italic][/bold]` is valid; +`[bold][italic]Text[/bold][/italic]` is not. + +## Apply branding across the estate + +Every setting above is also exposed as a Group Policy setting, so you can brand centrally instead of +per package. See [How to configure the toolkit with Group Policy](./configure-with-group-policy.mdx). +Policy wins over the package's own `config.psd1`. + +## Check the result + +Out of the box, a deployment shows the toolkit's own logo and the default blue accent: + + + +With `Assets\AppIcon.png` replaced and `FluentAccentColor` set, the same deployment looks like this: + + + +Every dialog and how it looks in light and dark mode is shown in the +[Dialogs reference](../reference/dialogs.mdx). + +## Troubleshooting + +### The logo did not change + +The package's `Assets` folder was updated but `Assets.Logo` points somewhere else, or a Group Policy +setting is overriding it. Policy takes precedence; see +[Configuration](../explanation/configuration.mdx). + +### The banner is ignored + +The deployment is using the Fluent dialogs. Banners are Classic-only. diff --git a/docs/how-to/close-apps-and-allow-deferral.mdx b/docs/how-to/close-apps-and-allow-deferral.mdx new file mode 100644 index 0000000..b17e9c6 --- /dev/null +++ b/docs/how-to/close-apps-and-allow-deferral.mdx @@ -0,0 +1,153 @@ +--- +sidebar_position: 14 +title: 'How to close applications and allow deferral' +description: 'How to prompt users to close applications, and how to let them defer a deployment.' +slug: /how-to/close-apps-and-allow-deferral +hide_title: true +tags: + - User Interface + - Deferral + - How-to +--- + +import ThemedImage from '@theme/ThemedImage'; + +## How to close applications and allow deferral + +Installers that replace files in use need the application closed first. +[`Show-ADTInstallationWelcome`](../reference/functions/Show-ADTInstallationWelcome.mdx) asks the +user to do that, and can offer a deferral so they are not interrupted mid-task. + +## 1. Declare the processes once + +Set `AppProcessesToClose` in the session properties rather than passing the same list to each call: + +```powershell +$adtSession = @{ + # ... + AppProcessesToClose = @('excel', @{ Name = 'winword'; Description = 'Microsoft Word' }) +} +``` + +By default, the description will be pulled from the process itself. To override this, use a hashtable with `Name` and `Description` values. + +Declaring processes here also affects mode selection: with `DeployMode` at its default of `Auto`, +the deployment runs silently when none of these processes are running. See [Deployment Modes](../explanation/deployment-modes.mdx). + +## 2. Show the welcome dialog + +The supplied template already wires the property into the dialog: + +```powershell +$saiwParams = @{ + AllowDefer = $true + DeferTimes = 3 + CheckDiskSpace = $true + PersistPrompt = $true +} +if ($adtSession.AppProcessesToClose.Count -gt 0) +{ + $saiwParams.Add('CloseProcesses', $adtSession.AppProcessesToClose) +} +Show-ADTInstallationWelcome @saiwParams +``` + +## 3. Choose how deferral behaves + +| Goal | Use | +| -------------------------------------------------------------- | ---------------------------------------------------------------- | +| Always offer a defer button | `-AllowDefer` | +| Offer defer only when one of the apps is actually open | `-AllowDeferCloseProcesses` (this implies `-AllowDefer`) | +| Limit to a number of deferrals | `-DeferTimes 3` | +| Limit by elapsed time since first run | `-DeferDays 5` | +| Stop deferrals at a fixed date | `-DeferDeadline '2026-08-25 18:00:00Z'` | +| Avoid re-prompting immediately after a deferral | `-DeferRunInterval ([System.TimeSpan]::FromHours(4))` | + +With `-AllowDefer` set and none of the declared applications running, the dialog simply asks the +user to choose when to start. + + + +`-DeferDays` is converted to a deadline on first run. For `-DeferDeadline`, use the universal +sortable format (`2026-08-25 11:51:52Z`) if the package runs on machines of differing cultures. + +:::tip[Intune] +Intune could potentially retry a failed install within minutes, so a user who defers could be prompted again almost +immediately. `-DeferRunInterval` suppresses the prompt until the interval has elapsed. +::: + +## 4. Choose how closing behaves + +| Goal | Use | +| -------------------------------------------------------------------- | -------------------------------------- | +| Count down, then close the apps, once deferrals are exhausted | `-CloseProcessesCountdown 300` | +| Count down and close regardless of whether deferral is allowed | `-ForceCloseProcessesCountdown 300` | +| Count down, then continue, when deferral is enabled | `-ForceCountdown 300` | +| Ask applications to save work before closing | `-PromptToSave` | +| Stop the user reopening the apps during the deployment | `-BlockExecution` | +| Re-show the dialog if the user dismisses it | `-PersistPrompt` | +| Skip the dialog entirely and just close the apps | `-Silent` | + +Countdown parameters take a `TimeSpan`, but plain numbers are interpreted as seconds. + + + +When the countdown reaches zero the listed applications are closed and the deployment continues. + +## 5. Handle the deferral exit code + +When the user defers, the deployment exits with `UI.DeferExitCode`, which is `1602` by default. ConfigMgr and Intune +interpret that as an error with the description 'User cancelled the installation'. + +- ConfigMgr will retry the deployment when the app eval cycle next runs; this is configurable in the client settings and the default is every 7 days. +- Intune will retry the deployment the following day. + +To get the deployment system to recognise this as a 'retry' rather than an 'error', you have the option of either modifying +`UI.DeferExitCode` in `config.psd1` to 1618, or you could map 1602 to Retry (Intune) or Fast Retry (ConfigMgr) in the return +code handling when publishing the package. + +- ConfigMgr (Application model) will retry every 2 hours, up to 10 times. +- ConfigMgr (Package model) will retry every 10 minutes up to 1008 times. +- Intune will retry every 5 minutes up to 3 times. + +If you do make these changes to the defer return codes or their handling, this may result in the user being prompted again +too soon. You can make use of the `-DeferRunInterval` parameter of [`Show-ADTInstallationWelcome`](../reference/functions/Show-ADTInstallationWelcome.mdx) +to silently defer again if the required interval has not yet elapsed since the last attempt. + +Refer to [Deploy with Intune](./deploy-with-intune.mdx) and [Deploy with ConfigMgr](./deploy-with-configmgr.mdx) for further details on configuring deployments. + +## Example + +Offer three deferrals, only when Word or Excel is open, then force a five minute countdown and +block the apps from restarting during the install: + +```powershell +Show-ADTInstallationWelcome -CloseProcesses $adtSession.AppProcessesToClose ` + -AllowDeferCloseProcesses -DeferTimes 3 ` + -CloseProcessesCountdown 300 -PromptToSave -BlockExecution -PersistPrompt +``` + +## Troubleshooting + +### The dialog never appears + +The deployment resolved to `Silent` or `NonInteractive`. Check the log for the mode and the reason. +See [Deployment Modes](../explanation/deployment-modes.mdx). + +### Deferrals do not reset between versions + +Defer history is tracked per package. Use [`Reset-ADTDeferHistory`](../reference/functions/Reset-ADTDeferHistory.mdx) if you need to clear it. diff --git a/docs/how-to/configure-with-group-policy.mdx b/docs/how-to/configure-with-group-policy.mdx new file mode 100644 index 0000000..1c0be81 --- /dev/null +++ b/docs/how-to/configure-with-group-policy.mdx @@ -0,0 +1,85 @@ +--- +sidebar_position: 7 +title: 'How to configure the toolkit with Group Policy' +description: 'How to import and use the supplied ADMX templates to enforce toolkit settings.' +slug: /how-to/configure-with-group-policy +hide_title: true +tags: + - Customizing + - Group Policy + - ADMX Template + - How-to +--- + +## How to configure the toolkit with Group Policy + +The supplied ADMX templates let you change, update or enforce toolkit settings across an +organization, without editing `config.psd1` in every package. + +Group Policy settings take precedence over the deployment's local config and over the built-in +defaults. See [Configuration](../explanation/configuration.mdx). + +## Find the template files + +The `ADMX` folder ships in two places. Either copy works. + +In the module folder: + +![ADMX folder in the Module](../images/psadt-admx-files-module.png) + +In the `PSAppDeployToolkit` folder of a deployment template: + +![ADMX folder in a Deployment Template](../images/psadt-admx-files-deployment-template.png) + +It contains the language-neutral policy definitions and the `en-US` descriptions: + +| Folder | File | Purpose | +| :--------- | :---------------------- | :-------------------------------------- | +| **ADMX/** | | | +| | PSAppDeployToolkit.admx | Language-neutral policy settings file | +| **en-US/** | | | +| | PSAppDeployToolkit.adml | en-US language policy descriptions file | + +![ADMX Files](../images/psadt-admx-files.png) + +## Import the templates + +Copy `PSAppDeployToolkit.admx` into your Central Store, and `en-US\PSAppDeployToolkit.adml` into the +matching language subfolder. You can also import both into Intune. + +## Configure the settings + +After importing, the settings appear in the Group Policy Management Editor under: + +```text +Computer Configuration +└───Policies + └───Administrative Templates: Policy definitions + └───PSAppDeployToolkit + ├───Assets + ├───MSI + ├───Toolkit + └───UI +``` + +![ADMX Files](../images/psadt-admx-gpme.png) + +Which settings are available, and what they do, is listed in the +[Configuration Settings reference](../reference/config-settings.mdx). + +## Verify the result + +Applied policies land in the registry at: + +```text +HKEY_LOCAL_MACHINE\SOFTWARE\Policies\PSAppDeployToolkit +``` + +![Registry Policy Location](../images/psadt-admx-registry.png) + +The toolkit reads them as it initializes, so a deployment started after the policy applies picks +them up. + +## Worked example + +- [How to set the log path with Group Policy](../how-to/set-the-log-path-with-group-policy.mdx) diff --git a/docs/how-to/create-a-deployment.mdx b/docs/how-to/create-a-deployment.mdx new file mode 100644 index 0000000..dc93f8b --- /dev/null +++ b/docs/how-to/create-a-deployment.mdx @@ -0,0 +1,71 @@ +--- +sidebar_position: 2 +title: 'How to create a new deployment' +description: 'How to create a new deployment folder from a PSAppDeployToolkit template.' +slug: /how-to/create-a-deployment +hide_title: true +tags: + - Template + - Scaffold + - How-to +--- + +## How to create a new deployment + +A **deployment** is a self-contained folder holding your application source files, the deployment +script that drives the install, and the PSAppDeployToolkit module and its configuration. You create +one from a template, then edit it. + +## Prerequisites + +- PSAppDeployToolkit [installed](./install-the-toolkit.mdx), or a downloaded template archive. + +## Create from the module + +If you installed the module, use [`New-ADTTemplate`](../reference/functions/New-ADTTemplate.mdx). + +For a v4 native deployment, which is what all new work should use: + +```powershell +New-ADTTemplate -Destination C:\Temp -Name 'PSAppDeployToolkitv4' +``` + +For a v3 compatibility deployment, which you only need when dropping in an existing v3 +`Deploy-Application.ps1`: + +```powershell +New-ADTTemplate -Destination C:\Temp -Name 'PSAppDeployToolkitv3' -Version 3 +``` + +## Create from a downloaded template + +1. Download `PSAppDeployToolkit_Template_v4.zip` (or `_v3.zip`) from the + [releases page](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit/releases/latest). +2. Extract the contents to a folder on your packaging machine. +3. Unblock the extracted files if they were flagged by Windows: + + ```powershell + Get-ChildItem -Path C:\Temp\PSAppDeployToolkitv4 -Recurse -File | Unblock-File + ``` + +## Add your application + +1. Copy your installer and its media into the `Files` folder. +2. Copy any additional assets into `SupportFiles`: `.reg` files, configuration files, licence files. +3. Open `Invoke-AppDeployToolkit.ps1` and fill in the `$adtSession` properties at the top of the + script (`AppVendor`, `AppName`, `AppVersion`, and so on). +4. Add your install, uninstall and repair logic to the matching script blocks. + +Refer to the [Deployment Template reference](../reference/deployment-template.mdx) for what each +folder is for, and to the [ADTSession Object reference](../reference/adtsession-object.mdx) for +every property you can set. + +:::tip +If your package installs a single MSI, you may not need to write any script logic at all. See +[Deploy an MSI with zero-config](./deploy-an-msi-with-zero-config.mdx). +::: + +## Next steps + +- [Install applications](./install-applications.mdx) +- [Run a deployment](./run-a-deployment.mdx) diff --git a/docs/how-to/customize-a-deployment.mdx b/docs/how-to/customize-a-deployment.mdx new file mode 100644 index 0000000..aa78df8 --- /dev/null +++ b/docs/how-to/customize-a-deployment.mdx @@ -0,0 +1,74 @@ +--- +sidebar_position: 6 +title: 'How to customize a deployment' +description: 'How to change the configuration, UI text and behaviour of a deployment.' +slug: /how-to/customize-a-deployment +hide_title: true +tags: + - Customizing + - How-to +--- + +## How to customize a deployment + +Beyond the logic in `Invoke-AppDeployToolkit.ps1`, a deployment needs no configuration to work. +When you do need to change something, there are three places to do it. + +## Change toolkit settings + +Edit `Config\config.psd1` in the **deployment folder**, not the copy inside the +`PSAppDeployToolkit` module folder. The deployment copy is layered over the module defaults, so you +only need to include the settings you are changing. + +Common changes: + +```powershell +@{ + Toolkit = @{ + LogPath = 'C:\Windows\Logs\Software' + CompressLogs = $true + } + MSI = @{ + InstallParams = '/qn REBOOT=ReallySuppress' + } +} +``` + +Every available setting is listed in the +[Configuration Settings reference](../reference/config-settings.mdx). How the layers combine is +covered in [Configuration](../explanation/configuration.mdx). + +To enforce settings across an estate rather than per package, use +[Group Policy](./configure-with-group-policy.mdx). + +## Change the text shown to users + +Edit `Strings\strings.psd1`. The English strings live in the root of the `Strings` folder; other +languages live in their own subfolders and ship pre-translated into 25 languages. + +The language is chosen from the operating system settings. To force one, set `UI.LanguageOverride` +in `config.psd1`. + +Every string key is listed in the +[Language Strings reference](../reference/language-strings.mdx). Strings support rich formatting; see +[Text Formatting](../reference/text-formatting.mdx). + +## Change the branding + +Replace the files in the `Assets` folder. See +[How to brand the user interface](./brand-the-user-interface.mdx). + +## Change where logs go + +Set `Toolkit.LogPath` in `config.psd1`, or apply it centrally with +[Group Policy](../how-to/set-the-log-path-with-group-policy.mdx). To collect all logs from a deployment into +a single zip, set `Toolkit.CompressLogs = $true`; anything your package writes to +`$adtSession.LogTempFolder` is included. + +What gets logged, and how log files are named, is described in +[Logging](../explanation/logging.mdx). + +## Add your own functions + +Custom functions belong in the `PSAppDeployToolkit.Extensions` module rather than in the deployment +script. See [How to extend the toolkit](./extend-the-toolkit-with-custom-functions.mdx). diff --git a/docs/how-to/deploy-an-msi-with-zero-config.mdx b/docs/how-to/deploy-an-msi-with-zero-config.mdx new file mode 100644 index 0000000..fc4f71b --- /dev/null +++ b/docs/how-to/deploy-an-msi-with-zero-config.mdx @@ -0,0 +1,55 @@ +--- +sidebar_position: 4 +title: 'How to deploy an MSI with zero-config' +description: 'How to install an MSI with no deployment script logic at all.' +slug: /how-to/deploy-an-msi-with-zero-config +hide_title: true +tags: + - Zero-Config Deployment + - How-to +--- + +## How to deploy an MSI with zero-config + +Zero-config mode installs a single MSI without you writing any script logic. The toolkit finds the +MSI in the `Files` folder and builds the install, uninstall and repair actions from it. + +## Steps + +1. Ensure you have either downloaded the ZeroConfig template or have used `New-ADTTemplate -ZeroConfig` to create one. +2. Leave `AppName` empty in the `$adtSession` hashtable in `Invoke-AppDeployToolkit.ps1`. An empty + `AppName` is what activates zero-config mode. +3. Put your MSI into the `Files` folder. Only one MSI is supported; if more than one is present, the + first is used. +4. If you have a transform, put the MST into `Files` as well, named identically to the MSI. For + `test01.msi` the transform must be `test01.mst`. +5. If you have patches, put the MSP files into `Files`. Multiple patches are supported; they are + applied in alphabetical order, so name them accordingly. +6. Run the deployment as normal. See [How to run a deployment](./run-a-deployment.mdx). + +## Using a WIM instead + +You can compress the MSI and any supporting content into a `.wim` file and place that in `Files` +instead. The toolkit mounts it automatically and treats its contents as the source. + +To force WIM detection even when `AppName` is set, add `ForceWimDetection = $true` to the session +properties. + +## Forcing zero-config on a named package + +Zero-config is normally suppressed once `AppName` is set. To keep your app metadata *and* have the +toolkit derive the MSI actions, set `ForceMsiDetection = $true` in the session properties. + +Both properties are listed in the +[ADTSession Object reference](../reference/adtsession-object.mdx). + +## Troubleshooting + +### The wrong MSI is installed + +More than one MSI is present in `Files`. Remove the extras, or set `AppName` and call +[`Start-ADTMsiProcess`](../reference/functions/Start-ADTMsiProcess.mdx) explicitly instead. + +### The transform is ignored + +The MST filename does not match the MSI filename exactly. diff --git a/docs/how-to/deploy-google-chrome-with-configmgr.mdx b/docs/how-to/deploy-google-chrome-with-configmgr.mdx new file mode 100644 index 0000000..16e441b --- /dev/null +++ b/docs/how-to/deploy-google-chrome-with-configmgr.mdx @@ -0,0 +1,111 @@ +--- +sidebar_position: 13 +title: 'How to deploy Google Chrome with Configuration Manager' +description: 'A worked example of packaging and deploying Google Chrome Enterprise with PSAppDeployToolkit.' +slug: /how-to/deploy-google-chrome-with-configmgr +hide_title: true +tags: + - Google Chrome + - Microsoft Configuration Manager + - How-to +--- + +## How to deploy Google Chrome with Configuration Manager + +A worked example: an MSI that must not install while the browser is open, with a deferral for users +who are mid-task. The general steps for the Configuration Manager side are in +[How to deploy with Configuration Manager](../how-to/deploy-with-configmgr.mdx). This page covers what is +specific to Chrome. + +## Prerequisites + +- The Chrome Enterprise MSI bundle downloaded from Google. The 64-bit installer is named + `GoogleChromeStandaloneEnterprise64.msi`. +- A deployment folder created as described in + [How to create a new deployment](../how-to/create-a-deployment.mdx). + +## 1. Add the source files + +Copy the MSI into the `Files` folder of the deployment. + +## 2. Fill in the session properties + +Chrome must be closed before the MSI runs, so declare it in `AppProcessesToClose` rather than +passing it to each dialog call: + +```powershell +$adtSession = @{ + AppVendor = 'Google' + AppName = 'Chrome' + AppVersion = '120.0.6099.130' + AppArch = 'x64' + AppLang = 'EN' + AppRevision = '01' + AppProcessesToClose = @(@{ Name = 'chrome'; Description = 'Google Chrome' }) + RequireAdmin = $true + + AppScriptVersion = '1.0.0' + AppScriptAuthor = 'Your Name' +} +``` + +Declaring the process this way also means a device with Chrome closed installs silently, because +`DeployMode` defaults to `Auto`. See [Deployment Modes](../explanation/deployment-modes.mdx). + +## 3. Write the install logic + +`Pre-Install` in the supplied template already shows the welcome dialog and the progress dialog +using `AppProcessesToClose`, so only the `Install` block needs filling in: + +```powershell +## MARK: Install +New-Variable -Name Install -Force -Value { + Start-ADTMsiProcess -Action Install -FilePath 'GoogleChromeStandaloneEnterprise64.msi' +} +``` + +Chrome's MSI accepts the toolkit's configured default parameters, so no argument list is needed. + +Remove the desktop shortcut Chrome creates for every user, in `Post-Install`: + +```powershell +## MARK: Post-Install +New-Variable -Name Post-Install -Force -Value { + Remove-ADTFile -Path "$envCommonDesktop\Google Chrome.lnk" +} +``` + +## 4. Write the uninstall logic + +Uninstall by looking the application up rather than hard-coding a product code, so the package keeps +working across Chrome versions: + +```powershell +## MARK: Uninstall +New-Variable -Name Uninstall -Force -Value { + Get-ADTApplication -Name 'Google Chrome' -ApplicationType MSI | Start-ADTMsiProcess -Action Uninstall +} +``` + +## 5. Test locally + +From an elevated prompt in the package folder: + +```powershell +Invoke-AppDeployToolkit.exe /Debug -DeploymentType Install +``` + +Open Chrome first, so you can confirm the close/defer dialog behaves as you expect. + +## 6. Create the Configuration Manager application + +Follow [How to deploy with Configuration Manager](../how-to/deploy-with-configmgr.mdx). For detection, use +the MSI product code of the Chrome build you packaged, or the file version of +`chrome.exe`. + +## Notes + +- Chrome keeps itself updated through Google Update. If your organization manages Chrome versions + centrally, configure that policy separately. It is not something the deployment controls. +- Chrome's own ADMX templates are distributed by Google and are unrelated to the + [toolkit's ADMX templates](../how-to/configure-with-group-policy.mdx). diff --git a/docs/how-to/deploy-with-configmgr.mdx b/docs/how-to/deploy-with-configmgr.mdx new file mode 100644 index 0000000..3365a73 --- /dev/null +++ b/docs/how-to/deploy-with-configmgr.mdx @@ -0,0 +1,95 @@ +--- +sidebar_position: 10 +title: 'How to deploy with Configuration Manager' +description: 'How to deploy a PSAppDeployToolkit package with Microsoft Configuration Manager.' +slug: /how-to/deploy-with-configmgr +hide_title: true +tags: + - Configuration Manager + - How-to +--- + +## How to deploy with Configuration Manager + +This guide deploys a finished deployment folder as a Configuration Manager application. + +## Prerequisites + +- A working deployment folder that runs correctly when launched locally. See + [How to run a deployment](./run-a-deployment.mdx). +- The folder placed on a content source share that the site server can read. + +## 1. Create the application + +Create a new application and choose to specify the information manually, then add a deployment type +of type **Script Installer**. Point the content location at the deployment folder. The entire folder +is the content, not just the script. + +## 2. Set the programs + +| Field | Value | +| ----------------- | -------------------------------------------------------- | +| Installation program | `Invoke-AppDeployToolkit.exe -DeploymentType Install` | +| Uninstall program | `Invoke-AppDeployToolkit.exe -DeploymentType Uninstall` | +| Repair program | `Invoke-AppDeployToolkit.exe -DeploymentType Repair` | + +Leave `DeployMode` off the command line unless you need to force a mode. + +## 3. Set the user experience + +| Field | Value | +| --------------------------- | ---------------------------------------- | +| Installation behavior | Install for system | +| Logon requirement | Whether or not a user is logged on | +| Installation program visibility | Normal or Hidden; the toolkit's own UI is unaffected | + +:::info +**Allow users to view and interact with the program installation** is no longer required. From +v4.1.0 the UI runs in its own process in the user's session, so it appears regardless of that +setting. See [The user interface](../explanation/user-interface.mdx). +::: + +## 4. Map the return codes + +On the deployment type's **Return Codes** tab, the default values are as below: + +| Return code | Map to | +| ----------- | ----------- | +| `0` | Success | +| `3010` | Soft reboot | +| `1641` | Hard reboot | +| `1618` | Fast retry | + +To make Configuration Manager retry more frequently than the client's App Eval cycle period, you can +either set `UI.DeferExitCode` to `1618` in `config.psd1` or map `1602` to `Fast retry` here. You may +want to make use of `-DeferRunInterval` on +[`Show-ADTInstallationWelcome`](../reference/functions/Show-ADTInstallationWelcome.mdx) if doing this - +refer to [How to close applications and allow deferral](../how-to/close-apps-and-allow-deferral.mdx). + +## 5. Set the detection method + +Use a product code, file version or registry value. Detection is Configuration Manager's +responsibility, and the toolkit does not participate in it. + +## Task sequences + +A deployment run from a task sequence is non-interactive by design. The toolkit detects this and +logs that it is running inside a ConfigMgr task sequence; `$RunningTaskSequence` is available to +your script if you need to branch on it. See the [Variables reference](../reference/variables.mdx). + +## Troubleshooting + +### The deployment reports success but nothing installed + +The detection method matched before the install ran, or the install exited with a code you mapped to +success. Check the toolkit log and the exit code it recorded. + +### The UI never appears + +Check whether `DeployMode` resolved to `Silent`. The log records the mode and the reason. See +[Deployment Modes](../explanation/deployment-modes.mdx). + +### Content is missing at runtime + +Only the folder set as the content location is delivered. Confirm `Files` and `SupportFiles` are +inside it and that the distribution point content is up to date. diff --git a/docs/how-to/deploy-with-intune.mdx b/docs/how-to/deploy-with-intune.mdx new file mode 100644 index 0000000..4d21d5a --- /dev/null +++ b/docs/how-to/deploy-with-intune.mdx @@ -0,0 +1,107 @@ +--- +sidebar_position: 9 +title: 'How to deploy with Microsoft Intune' +description: 'How to package a PSAppDeployToolkit deployment as an Intune Win32 app.' +slug: /how-to/deploy-with-intune +hide_title: true +tags: + - Intune + - How-to +--- + +## How to deploy with Microsoft Intune + +This guide packages a finished deployment folder as a Win32 app and deploys it with Intune. + +## Prerequisites + +- A working deployment folder that runs correctly when launched locally. See + [How to run a deployment](./run-a-deployment.mdx). +- The Microsoft Win32 Content Prep Tool (`IntuneWinAppUtil.exe`). + +## 1. Wrap the package + +Run the content prep tool against the deployment folder, using the launcher as the setup file: + +```text +IntuneWinAppUtil.exe -c C:\Packages\YourApp -s Invoke-AppDeployToolkit.exe -o C:\Output +``` + +The whole folder goes into the resulting `.intunewin`: `Files`, `SupportFiles`, `Config`, `Strings`, +`Assets` and the `PSAppDeployToolkit` module. + +## 2. Create the Win32 app + +In Intune, add a new **Windows app (Win32)** and upload the `.intunewin` file. + +Set the commands to: + +| Field | Value | +| ----------------- | -------------------------------------------------- | +| Install command | `Invoke-AppDeployToolkit.exe -DeploymentType Install` | +| Uninstall command | `Invoke-AppDeployToolkit.exe -DeploymentType Uninstall` | +| Install behavior | System | + +Leave `DeployMode` off the command line unless you need to force a mode. The default, `Auto`, +already falls back to silent when there is nobody to show a dialog to. See +[Deployment Modes](../explanation/deployment-modes.mdx). + +For an application that installs per-user, set **Install behavior** to *User* and either omit +`RequireAdmin` (template default) or set it to `$false` in the session properties. + +## 3. Map the return codes + +Intune's default return code mapping is as below: + +| Return code | Map to | +| ----------- | ----------- | +| `0` | Success | +| `3010` | Soft reboot | +| `1641` | Hard reboot | +| `1618` | Retry | + +To make Intune retry more frequently than the default 24 hours, you can either set `UI.DeferExitCode` +to `1618` in `config.psd1` or map `1602` to `Retry` here. + +:::warning[Retry handling in Intune] +If the deferral exit code is interpreted by Intune as Retry rather than Failed, it will retry every 5 minutes for a maximum +of 3 times.
+Take care if modifying the defer exit code to 1618 or mapping 1602 as Retry, as this can result in +re-prompting the user too soon.
+Use the `-DeferRunInterval` parameter of +[`Show-ADTInstallationWelcome`](../reference/functions/Show-ADTInstallationWelcome.mdx) to abort the run +if the deployment was already deferred within a given timespan - refer to +[How to close applications and allow deferral](../how-to/close-apps-and-allow-deferral.mdx). +::: + +## 4. Set the detection rule + +Detection is Intune's business, not the toolkit's. Use an MSI product code, a file version, or a +registry value written by your `Post-Install` phase. + +## Notes on the user interface + +As of v4.1.0 the UI runs in its own process in the user's session, so **no `ServiceUI.exe` +workaround is needed** for the dialogs to appear. + +During Autopilot, the toolkit detects the OOBE and ESP phases and runs `NonInteractive`, so progress +dialogs are suppressed but the install proceeds. To show the UI during ESP anyway, set +`NoOobeDetection = $true` in the session properties. + +## Troubleshooting + +### The app reports failure with 60008 + +The module failed to import or the session failed to open. Check the toolkit log, then see +[How to troubleshoot a deployment](./troubleshoot-a-deployment.mdx). + +### Nothing is shown to the user + +Expected when the device is in OOBE/ESP, no user is logged on, or `AppProcessesToClose` is set and +none of those processes are running. See [Deployment Modes](../explanation/deployment-modes.mdx). + +### Logs are hard to find alongside Intune's + +Point `Toolkit.LogPath` at the Intune Management Extension log folder, either in `config.psd1` or +centrally: see +[How to set the log path with Group Policy](../how-to/set-the-log-path-with-group-policy.mdx). diff --git a/docs/how-to/extend-the-toolkit-with-custom-functions.mdx b/docs/how-to/extend-the-toolkit-with-custom-functions.mdx new file mode 100644 index 0000000..0208b0c --- /dev/null +++ b/docs/how-to/extend-the-toolkit-with-custom-functions.mdx @@ -0,0 +1,124 @@ +--- +sidebar_position: 16 +title: 'How to extend the toolkit with custom functions' +description: 'How to add your own reusable functions using the PSAppDeployToolkit.Extensions module.' +slug: /how-to/extend-the-toolkit-with-custom-functions +hide_title: true +tags: + - Extensions + - How-to +--- + +## How to extend the toolkit with custom functions + +Reusable logic belongs in the `PSAppDeployToolkit.Extensions` module that ships with the v4 template, +not inline in `Invoke-AppDeployToolkit.ps1`. The deployment script imports every +`PSAppDeployToolkit.*` folder next to it automatically, so functions you add there are available in +all phases. + +## 1. Open the extensions module + +In the deployment folder: + +```text +PSAppDeployToolkit.Extensions/ +├── PSAppDeployToolkit.Extensions.psd1 +└── PSAppDeployToolkit.Extensions.psm1 +``` + +Add your functions to the `.psm1`. The supplied `New-ADTExampleFunction` is a working skeleton to +copy. + +## 2. Follow the function skeleton + +Toolkit functions bracket their work with three helpers so that logging, error handling and session +state behave the same as every built-in command: + +```powershell +function Set-ContosoAppSettings +{ + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [System.String]$SettingsPath + ) + + begin + { + Initialize-ADTFunction -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState + } + + process + { + try + { + try + { + Write-ADTLogEntry -Message "Applying settings from [$SettingsPath]." + # your logic here + } + catch + { + # Re-writing the ErrorRecord with Write-Error ensures the correct PositionMessage is used. + Write-Error -ErrorRecord $_ + } + } + catch + { + Invoke-ADTFunctionErrorHandler -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState -ErrorRecord $_ + } + } + + end + { + Complete-ADTFunction -Cmdlet $PSCmdlet + } +} +``` + +- [`Initialize-ADTFunction`](../reference/functions/Initialize-ADTFunction.mdx) logs the function + entry and inherits the caller's preferences. +- [`Invoke-ADTFunctionErrorHandler`](../reference/functions/Invoke-ADTFunctionErrorHandler.mdx) logs + the error and rethrows according to the caller's `ErrorAction`. +- [`Complete-ADTFunction`](../reference/functions/Complete-ADTFunction.mdx) logs the exit. + +Use [`Write-ADTLogEntry`](../reference/functions/Write-ADTLogEntry.mdx) for output so your messages +land in the deployment log alongside everything else. + +## 3. Export the function + +Add the function name to `FunctionsToExport` in `PSAppDeployToolkit.Extensions.psd1`. Functions that +are not exported are not visible to the deployment script. + +## 4. Call it from the deployment script + +```powershell +## MARK: Post-Install +New-Variable -Name Post-Install -Force -Value { + Set-ContosoAppSettings -SettingsPath "$($adtSession.DirSupportFiles)\settings.json" +} +``` + +## Reserve your own exit codes + +`70000` to `79999` is reserved for exit codes raised from the extensions module, so they do not +collide with the toolkit's own. See the [Exit Codes reference](../reference/exit-codes.mdx). + +## Sharing extensions across packages + +The import is driven by folder name: any directory alongside the deployment script matching +`PSAppDeployToolkit.*` is imported. Keep your organization's extensions in source control and copy +the folder into each package, or publish it as a module and pre-install it on packaging machines. + +## Troubleshooting + +### The function is not recognized + +It is not listed in `FunctionsToExport`, or the folder does not match the `PSAppDeployToolkit.*` +naming pattern. + +### The module imports but logs nothing + +`Write-ADTLogEntry` needs an open session. Anything running before `Open-ADTSession` has no log to +write to. diff --git a/docs/how-to/install-applications.mdx b/docs/how-to/install-applications.mdx new file mode 100644 index 0000000..2c64595 --- /dev/null +++ b/docs/how-to/install-applications.mdx @@ -0,0 +1,117 @@ +--- +sidebar_position: 5 +title: 'How to install applications' +description: 'How to run installers from a PSAppDeployToolkit deployment script.' +slug: /how-to/install-applications +hide_title: true +tags: + - Installing Applications + - How-to +--- + +## How to install applications + +Put these commands in the `Install`, `Uninstall` or `Repair` script block of +`Invoke-AppDeployToolkit.ps1`. Every one of them logs to the deployment log and applies the +toolkit's exit-code handling. + +The parameters most often used are listed in the +[Process Execution Parameters reference](../reference/process-execution.mdx). + +## Install an EXE + +Use [`Start-ADTProcess`](../reference/functions/Start-ADTProcess.mdx). Files placed directly in the +`Files` folder can be referenced by name alone: + +```powershell +Start-ADTProcess -FilePath 'setup.exe' -ArgumentList '/S' +``` + +If the installer is known to install an embedded MSI package and you want to wait for MsiExec to become available before starting: + +```powershell +Start-ADTProcess -FilePath 'setup.exe' -ArgumentList '/S' -WaitForMsiExec +``` + +If the installer hands off to a child process and exits early, wait for the child processes so the +deployment does not report success too soon: + +```powershell +Start-ADTProcess -FilePath 'setup.exe' -ArgumentList '/S' -WaitForChildProcesses +``` + +If the installer launches an application post-install which you don't want left running as SYSTEM, yoou can terminate them when the installer completes: + +```powershell +Start-ADTProcess -FilePath 'setup.exe' -ArgumentList '/S' -KillChildProcessesWithParent +``` + +If the installer returns a vendor-specific code you want treated as success: + +```powershell +Start-ADTProcess -FilePath 'setup.exe' -ArgumentList '/S' -SuccessExitCodes 0, 3010, 1641 +``` + +If the arguments contain a licence key or password, keep them out of the log: + +```powershell +Start-ADTProcess -FilePath 'setup.exe' -ArgumentList "/S /KEY=$key" -SecureArgumentList +``` + +## Install an MSI + +Use [`Start-ADTMsiProcess`](../reference/functions/Start-ADTMsiProcess.mdx): + +```powershell +Start-ADTMsiProcess -Action Install -FilePath 'SomeApp.msi' -Transforms 'SomeApp.mst' -AdditionalArgumentList 'SERIAL=12345' -SecureArgumentList +``` + +Use `-AdditionalArgumentList` to add MSI properties on top of the configured defaults. Use +`-ArgumentList` only when you intend to **replace** the defaults such as +`/qn REBOOT=ReallySuppress`. + +To uninstall an MSI you no longer have the source for, pipe it in from +[`Get-ADTApplication`](../reference/functions/Get-ADTApplication.mdx): + +```powershell +Get-ADTApplication -Name 'SomeApp' | Start-ADTMsiProcess -Action Uninstall +``` + +If your package needs to install a single MSI and nothing else, consider +[zero-config deployment](./deploy-an-msi-with-zero-config.mdx) instead of scripting it. + +## Run something as the logged-on user + +Use [`Start-ADTProcessAsUser`](../reference/functions/Start-ADTProcessAsUser.mdx) when a step has to +run in the user's context rather than as SYSTEM. Typical cases: + +- A "machine-wide" installer that writes an `HKLM` `Run` key so a per-user stub installs at next + logon. Running that stub now completes the install without a logoff. +- Replacing a per-user installation with a machine-wide one, where the old uninstaller has to run as + the user first. +- A configuration or licensing tool that must run once in user context before the app is usable. + +```powershell +Start-ADTProcessAsUser -FilePath '%LOCALAPPDATA%\Programs\SomeApp\Uninstall.exe' -ArgumentList '/S' -ExpandEnvironmentVariables +``` + +:::tip +For an application that is genuinely per-user, prefer building a user-context deployment with +user-context detection rules over running an installer as the user from a SYSTEM deployment. +::: + +## Troubleshooting + +### The installer fails only when run by the toolkit + +The toolkit runs as SYSTEM. Some installers refuse to run elevated, or expect a user profile. Try +`-UseUnelevatedToken`, or move the step to `Start-ADTProcessAsUser`. + +### The deployment finishes before the installer does + +The installer spawned a child process and exited. Add `-WaitForChildProcesses`. + +### Uninstalling an MSI returns 1605 + +The product is not installed under the account running the uninstall. See the +[Troubleshooting reference](../reference/troubleshooting.mdx). diff --git a/docs/how-to/install-the-toolkit.mdx b/docs/how-to/install-the-toolkit.mdx new file mode 100644 index 0000000..0792e54 --- /dev/null +++ b/docs/how-to/install-the-toolkit.mdx @@ -0,0 +1,71 @@ +--- +sidebar_position: 1 +title: 'How to install PSAppDeployToolkit' +description: 'How to obtain PSAppDeployToolkit from the PowerShell Gallery or GitHub.' +slug: /how-to/install-the-toolkit +hide_title: true +tags: + - Download + - How-to +--- + +## How to install PSAppDeployToolkit + +PSAppDeployToolkit is distributed as a PowerShell module on the PowerShell Gallery, and as +self-contained zip archives on GitHub. Either source gives you everything needed to create a +deployment. + +Check the [Requirements](../reference/requirements.mdx) before you begin. + +## Install from the PowerShell Gallery + +Run: + +```powershell +Install-Module -Name PSAppDeployToolkit -Scope CurrentUser +``` + +This is the recommended option when you intend to create deployments with +[`New-ADTTemplate`](../reference/functions/New-ADTTemplate.mdx), because the module is then +available in every PowerShell session on the packaging machine. + +## Download from GitHub releases + +Go to the [PSAppDeployToolkit releases page](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit/releases/latest) +and open the `Assets` dropdown. Download the asset that matches what you need: + +| Asset | Use it when | +| ------------------------------------ | -------------------------------------------------------------------------- | +| `PSAppDeployToolkit_ModuleOnly.zip` | You only want the module, for example to update an existing package. | +| `PSAppDeployToolkit_Template_v4.zip` | You want a ready-made v4 native deployment folder. | +| `PSAppDeployToolkit_Template_v3.zip` | You want a ready-made v3 compatibility deployment folder. | +| `Source code (zip)` | You want to read or build the source. | + +Extract the archive. The folder layout you get is described in the +[Deployment Template reference](../reference/deployment-template.mdx). + +## Install PSAppDeployToolkit.Tools + +`PSAppDeployToolkit.Tools` is a companion module for functions that help you *create* packages +rather than deploy them, including the [v3 migration tools](./upgrade-from-v3.mdx). + +It is currently in pre-release, so the PowerShell Gallery install needs an extra switch: + +```powershell +Install-Module PSAppDeployToolkit.Tools -Scope CurrentUser -AllowPreRelease +``` + +If PowerShell reports that `-AllowPreRelease` is not recognized, update PowerShellGet first, then +restart your PowerShell console and retry: + +```powershell +Install-Module PowerShellGet -Force -Scope CurrentUser +``` + +Release assets are also available from the +[PSAppDeployToolkit.Tools releases page](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools/releases/latest). + +## Next steps + +- [Create a new deployment](./create-a-deployment.mdx) +- [Your first deployment](../tutorials/your-first-deployment.mdx), a guided walkthrough diff --git a/docs/how-to/run-a-deployment.mdx b/docs/how-to/run-a-deployment.mdx new file mode 100644 index 0000000..a49d705 --- /dev/null +++ b/docs/how-to/run-a-deployment.mdx @@ -0,0 +1,118 @@ +--- +sidebar_position: 3 +title: 'How to run a deployment' +description: 'How to launch a PSAppDeployToolkit deployment from the command line.' +slug: /how-to/run-a-deployment +hide_title: true +tags: + - How to Deploy + - How-to +--- + +## How to run a deployment + +There are two ways to launch a deployment. + +Run the supplied launcher, which starts the same script in a hidden PowerShell window: + +```text +Invoke-AppDeployToolkit.exe +``` + +Or run the script directly with PowerShell: + +```text +%SystemRoot%\System32\WindowsPowerShell\v1.0\PowerShell.exe -ExecutionPolicy Bypass -NoProfile -File Invoke-AppDeployToolkit.ps1 +``` + +For every accepted parameter, see the +[Command-Line Parameters reference](../reference/command-line-parameters.mdx). + +:::info[Elevation] +If your script sets `RequireAdmin = $true`, launch it from an elevated context. The launcher does +not request elevation on your behalf. +::: + +## Common invocations + +Install in auto mode, which is the default (the toolkit decides whether to run silently or interactively): + +```powershell +Invoke-AppDeployToolkit.exe +``` + +Install interactively, which is what you would specify if the deployment *must* be interactive, and should fail if it cannot be: + +```powershell +Invoke-AppDeployToolkit.exe -DeployMode Interactive +``` + +Install silently, converting reboot exit codes to `0`: + +```powershell +Invoke-AppDeployToolkit.exe -DeploymentType Install -DeployMode Silent -SuppressRebootPassThru +``` + +Uninstall without prompting the user, but still showing progress dialogs: + +```powershell +Invoke-AppDeployToolkit.ps1 -DeploymentType Uninstall -DeployMode NonInteractive +``` + +Install silently under PowerShell x86, with a debug console: + +```powershell +Invoke-AppDeployToolkit.exe /32 /Debug -DeploymentType Install -DeployMode Silent +``` + +Install silently under PowerShell Core: + +```powershell +Invoke-AppDeployToolkit.exe /Core -DeploymentType Install -DeployMode Silent +``` + +Run a script other than the default: + +```powershell +Invoke-AppDeployToolkit.exe Custom-Script.ps1 +``` + +```powershell +Invoke-AppDeployToolkit.exe -File Custom-Script.ps1 +``` + +## Running from a management system + +- [Deploy with Microsoft Intune](./deploy-with-intune.mdx) +- [Deploy with Microsoft Configuration Manager](./deploy-with-configmgr.mdx) + +:::info[ServiceUI is no longer needed] +As of v4.1.0 the user interface runs in its own process in the user's session, so: + +- Intune deployments no longer need `ServiceUI.exe` workarounds to show the UI. +- Configuration Manager deployments no longer need **Allow users to view and interact with the + program installation**. +- `Invoke-ServiceUI.ps1` has been removed from the toolkit. + +Why this changed is covered in [The user interface](../explanation/user-interface.mdx). +::: + +:::warning +You can still include `ServiceUI.exe` in a package and use it to launch an installer interactively, +but doing so is a security risk. Any file dialog or hyperlink the installer exposes can be abused by +the user to gain SYSTEM access. +::: + +## Troubleshooting + +### The deployment exits immediately with 60008 + +The module failed to import, or the session failed to open. Run the launcher with `/Debug` from an +interactive session to see the error on screen. See +[How to troubleshoot a deployment](./troubleshoot-a-deployment.mdx). + +### No dialogs appear + +`DeployMode` resolved to `Silent`. This is expected when no user is logged on, when the device is in +OOBE/ESP, or when there are no running processes to close. See +[Deployment Modes](../explanation/deployment-modes.mdx). diff --git a/docs/how-to/set-the-log-path-with-group-policy.mdx b/docs/how-to/set-the-log-path-with-group-policy.mdx new file mode 100644 index 0000000..43aa2ab --- /dev/null +++ b/docs/how-to/set-the-log-path-with-group-policy.mdx @@ -0,0 +1,116 @@ +--- +sidebar_position: 8 +title: 'How to set the log path with Group Policy' +description: 'How to define the Toolkit LogPath centrally using a Group Policy Object.' +slug: /how-to/set-the-log-path-with-group-policy +hide_title: true +tags: + - Group Policy + - ADMX Template + - How-to + +--- + +## How to set the log path with Group Policy + +This guide creates a Group Policy Object that defines the log path for every PSAppDeployToolkit +deployment in scope, so you do not have to configure `config.psd1` in each package. + +## Prerequisites + +- The [ADMX templates are imported](../how-to/configure-with-group-policy.mdx) into your Central Store. +- Rights to create and link Group Policy Objects. + +## 1. Create the Group Policy Object + +Open the Group Policy Management Editor, right-click **Group Policy Objects** and select **New**. + +![Create New GPO](../images/example-admx-LogPath-00-GPO-new.png) + +Give it a name. `PSADT 4.1` is used here. + +![Create New GPO - Name](../images/example-admx-LogPath-01-GPO-new.png) + +## 2. Configure the LogPath policy + +Find the new GPO under **Group Policy Objects**, right-click it and select **Edit**. + +![Edit GPO](../images/example-admx-LogPath-02-GPO-new.png) + +Navigate to **Toolkit**, right-click **LogPath** and select **Edit**: + +```text +Computer Configuration +└───Policies + └───Administrative Templates: Policy definitions + └───PSAppDeployToolkit + └───Toolkit +``` + +![Edit GPO Policy](../images/example-admx-LogPath-03-GPO-new.png) + +Select **Enable** and define the path. This example uses the Intune Management Extension log folder, +so PSADT logs are collected alongside Intune's own: + +```powershell +$envProgramData\Microsoft\IntuneManagementExtension\Logs +``` + +![Configure Policy](../images/example-admx-LogPath-04-GPO-new.png) + +Select **OK**, configure any other policies you need, and close the editor. + +## 3. Link the GPO + +Navigate to the domain or OU you want the policy to apply to, right-click and select +**Link an Existing GPO...** + +![Link Policy](../images/example-admx-LogPath-05-GPO-new.png) + +Select the GPO and click **OK**. + +![Select Link Policy](../images/example-admx-LogPath-06-GPO-new.png) + +The GPO now appears linked at that location. + +![Link Policy Success](../images/example-admx-LogPath-07-GPO-new.png) + +## 4. Apply and verify + +On a machine in scope, refresh policy: + +```text +gpupdate /force +``` + +![Update Group Policy](../images/example-admx-LogPath-08-GPO-new.png) + +Confirm the GPO applied: + +```text +gpresult /r /scope computer +``` + +![Verify Group Policy](../images/example-admx-LogPath-09-GPO-new.png) + +Confirm the setting reached the registry: + +```text +Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Policies\PSAppDeployToolkit\Config\Toolkit +``` + +![Verify Group Policy](../images/example-admx-LogPath-10-GPO-new.png) + +## 5. Run a deployment + +The toolkit imports Group Policy settings as it initializes, so the next deployment writes its log +to the configured folder, in this case `ProgramData\Microsoft\IntuneManagementExtension\Logs`. + +![Run a Deployment](../images/example-admx-LogPath-11-GPO-new.png) + +## Troubleshooting + +### Logs still go to the old location + +The deployment started before policy refreshed, or the machine is out of scope. Re-check +`gpresult /r /scope computer` and confirm the registry value exists. diff --git a/docs/how-to/troubleshoot-a-deployment.mdx b/docs/how-to/troubleshoot-a-deployment.mdx new file mode 100644 index 0000000..538bb71 --- /dev/null +++ b/docs/how-to/troubleshoot-a-deployment.mdx @@ -0,0 +1,93 @@ +--- +sidebar_position: 17 +title: 'How to troubleshoot a deployment' +description: 'How to work out why a PSAppDeployToolkit deployment failed.' +slug: /how-to/troubleshoot-a-deployment +hide_title: true +tags: + - Troubleshooting + - Logging + - How-to +--- + +## How to troubleshoot a deployment + +Work through these in order. Most failures are identified by step 2. + +## 1. Reproduce it interactively + +Run the package by hand on an affected device, from an elevated prompt, with the debug console +attached: + +```powershell +Invoke-AppDeployToolkit.exe /Debug -DeploymentType Install +``` + +`/Debug` allocates a console and streams the log to the screen as it runs, so you see the failure in +context instead of reading it back afterwards. + +To reproduce what a management system sees, with no interactive user and no dialogs, add +`-DeployMode Silent`. + +## 2. Read the log + +The deployment log defaults to `C:\Windows\Logs\Software`, unless `Toolkit.LogPath` has been changed +in `config.psd1` or by [Group Policy](../how-to/set-the-log-path-with-group-policy.mdx). The file is named +after the package, for example: + +```text +Oracle_JavaRuntime_1.7.0.17_EN_01_PSAppDeployToolkit.log +``` + +MSI actions get their own log per action: `..._Install.log`, `..._Uninstall.log`, `..._Repair.log` +and `..._Patch.log`. + +Open it in CMTrace or OneTrace if `Toolkit.LogStyle` is `CMTrace`; otherwise any text editor will do. + +Look for: + +- The line recording which `DeployMode` was chosen and why. +- The `Initialization` entries confirming the module and any extensions imported. +- The last `Write-ADTLogEntry` before the failure, which names the phase that was running. +- The exit code the session closed with. + +## 3. Turn on debug logging + +If the log is not detailed enough, set `Toolkit.LogDebugMessage = $true` in `config.psd1` and run +again. This adds the toolkit's own diagnostic messages. + +## 4. Identify the exit code + +Match the code against the [Exit Codes reference](../reference/exit-codes.mdx). In short: + +- `60001` is an error in your script logic. +- `60008` means the module failed to import, or the session failed to open. The failure happened + before logging started, so use `/Debug` to see it. +- `60010` and `60011` mean the launcher could not start PowerShell at all. + +## 5. Check known causes + +Common symptoms and their causes are listed in the +[Troubleshooting reference](../reference/troubleshooting.mdx). + +## 6. Collect everything + +If you need to hand the problem to someone else, set `Toolkit.CompressLogs = $true` and run again. +All logs are written to `$adtSession.LogTempFolder` and zipped into the log folder at the end of the +run, timestamped so earlier runs are not overwritten. Anything your own script writes to that folder +is included. + +## Inspecting the toolkit interactively + +To explore the available commands and their help on a machine with the module installed: + +```powershell +Show-ADTHelpConsole +``` + +The help console listing the toolkit's commands with the help for the selected one + +## Getting help + +If you are still stuck, the [community channels](../introduction.mdx) can help. Include the log, the +exit code, the toolkit version, and how the package was launched. diff --git a/docs/how-to/upgrade-from-v3.mdx b/docs/how-to/upgrade-from-v3.mdx new file mode 100644 index 0000000..c361095 --- /dev/null +++ b/docs/how-to/upgrade-from-v3.mdx @@ -0,0 +1,79 @@ +--- +sidebar_position: 12 +title: 'How to upgrade from v3.x to v4.1' +description: 'Upgrade guidance for those coming from v3.' +slug: /how-to/upgrade-from-v3 +hide_title: true +tags: + - Migration + - How-to +--- + +## How to upgrade from v3.x to v4.1 + +There are two routes: run your existing v3 script unchanged under the v4 engine, or convert the +package to v4 native. Review the [release notes](../reference/release-notes.mdx) before you start, +and use the [v4 Function Mapping](../reference/v4-function-mapping.mdx) to see what each v3 function +became. + +## Option 1: run v3 scripts in compatibility mode + +Create a v3 compatibility deployment, as described in +[How to create a new deployment](./create-a-deployment.mdx), then drop in your existing +`Deploy-Application.ps1` and `AppDeployToolkit\AppDeployToolkitExtensions.ps1`. + +Your script continues to work, with these caveats: + +- If you customized **config.xml**, re-apply those changes to **Config\config.psd1** and/or + **Strings\strings.psd1**. The XML file is not read. +- Copy your custom banner to **Assets\Banner.Classic.png**. +- Compatibility mode supports the Classic UI only. The Fluent UI has parameters, such as `SubTitle`, + that the v3 functions do not accept. + +## Option 2: convert the package to v4 + +[PSAppDeployToolkit.Tools](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools) provides +two commands for this. Installing it is covered in +[How to install PSAppDeployToolkit](./install-the-toolkit.mdx). + +### Report on what will change + +`Test-ADTCompatibility` reports which functions and variables in your script changed in v4: + +```powershell +Test-ADTCompatibility -FilePath .\Deploy-Application.ps1 -Format Grid +``` + +### Convert the script or the package + +Convert a single script, which produces `Invoke-AppDeployToolkit.ps1` alongside it: + +```powershell +Convert-ADTDeployment -Path .\Deploy-Application.ps1 +``` + +Convert a whole package, which produces `PackageFolder_Converted`: + +```powershell +Convert-ADTDeployment -Path .\PackageFolder +``` + +### Finish the conversion by hand + +The converter does not do everything. Expect to complete these yourself: + +- Known toolkit variables such as `$appName` are copied into the hashtable that creates + `$adtSession`. Custom variables, function declarations, and any code outside the Install, + Uninstall and Repair blocks are **not** transferred. +- **Files** and **SupportFiles** are transferred only when you pass a package folder, not a single + `Deploy-Application.ps1`. +- **Config.xml** changes are not ported to the new `.psd1` files. +- Customized assets and banners are not copied. + +`PSAppDeployToolkit.Tools` is pre-release while feedback is gathered. Report conversion problems as +a [GitHub Issue](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools/issues). + +## Next steps + +Once converted, review [How to upgrade from v4.0 to v4.1](./upgrade-from-v4-0.mdx). The v4.1 session +properties described there apply to converted packages too. diff --git a/docs/how-to/upgrade-from-v4-0.mdx b/docs/how-to/upgrade-from-v4-0.mdx new file mode 100644 index 0000000..53f427a --- /dev/null +++ b/docs/how-to/upgrade-from-v4-0.mdx @@ -0,0 +1,125 @@ +--- +sidebar_position: 11 +title: 'How to upgrade from v4.0 to v4.1' +description: 'Upgrade guidance for those coming from v4.0.' +slug: /how-to/upgrade-from-v4-0 +hide_title: true +tags: + - Migration + - How-to +--- + +## How to upgrade from v4.0 to v4.1 + +For a patch release, say v4.0.5 to v4.0.6, replacing the `PSAppDeployToolkit` folder inside the +package is normally all that is required. Moving from v4.0 to v4.1 needs the changes below. + +:::warning[Breaking changes in v4.1] + +- `DeployMode` now defaults to `Auto`, which resolves to interactive but falls back to silent when + the device is in the OOBE/ESP phase, no user is logged on, or there are no processes to close. +- `OOBEDetection` and `SessionDetection` are no longer set in `Config.psd1`. They are now + per-deployment session properties, `NoOOBEDetection` and `NoSessionDetection`. +- `AppProcessesToClose` is a new session property that defines the processes to close for + Install/Uninstall/Repair in one place, instead of passing them to `-CloseProcesses` on each call + to `Show-ADTInstallationWelcome`. +- `RequireAdmin` is no longer set in `Config.psd1`. It must be set per deployment in the session + properties. +- `Invoke-AppDeployToolkit.exe` no longer requests elevation when `RequireAdmin` is set. You must + launch it elevated yourself. +- Several config options were removed or had their defaults changed. See below. +- Deprecated functions and parameters are scheduled for removal in 4.2.0. Update your scripts. + +::: + +## 1. Replace the module + +Replace the `PSAppDeployToolkit` folder inside the package with the v4.1 version. + +## 2. Update Invoke-AppDeployToolkit.ps1 + +Add the two new session properties to the `$adtSession` hashtable: + +```powershell +$adtSession = @{ + # App variables. + + AppProcessesToClose = @('excel', @{ Name = 'winword'; Description = 'Microsoft Word' }) + + RequireAdmin = $true +} +``` + +- `AppProcessesToClose` defines the processes to close once, instead of repeating the list in the + Install, Uninstall and Repair sections. When `DeployMode` is `Auto`, the toolkit switches to + `Silent` if none of these processes are running when the session opens. Set the + `NoProcessDetection` session property to disable that behaviour. +- `RequireAdmin` moved from the config file to the template, because it is a per-package setting. + When `$true`, the script fails at the point the session opens if the user is not an administrator. + +Update the `Show-ADTInstallationWelcome` call to feed from the new property. The v4.1 template uses +[splatting](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_splatting): + +```powershell +$saiwParams = @{ + AllowDefer = $true + DeferTimes = 3 + CheckDiskSpace = $true + PersistPrompt = $true +} +if ($adtSession.AppProcessesToClose.Count -gt 0) +{ + $saiwParams.Add('CloseProcesses', $adtSession.AppProcessesToClose) +} +Show-ADTInstallationWelcome @saiwParams +``` + +This only adds `CloseProcesses` when the list is non-empty. The v4.0 pattern still works, and the +template is yours to customize. + +Finally, add the call that strips null and empty values from the hashtable before it reaches +`Open-ADTSession`: + +```powershell + $adtSession = Remove-ADTHashtableNullOrEmptyValues -Hashtable $adtSession ⬅️ + $adtSession = Open-ADTSession @adtSession @iadtParams -PassThru +``` + +## 3. Update Config.psd1 + +Remove these options, which no longer exist: + +- `Toolkit.OobeDetection` +- `Toolkit.SessionDetection` +- `Toolkit.RequireAdmin` + +Check whether you were relying on any default that has changed: + +| Option | New default | Notes | +| ------------------------ | ------------------------- | ------------------------------------------------------------------ | +| MSI.InstallParams | /qn REBOOT=ReallySuppress | Default MSI parameters for installation. | +| MSI.LogPath | | Now uses the same path as Toolkit.LogPath when empty. | +| MSI.LogPathNoAdminRights | | Now uses the same path as Toolkit.LogPathNoAdminRights when empty. | +| UI.DeferExitCode | 1602 | Default exit code for deferred installations. | + +:::warning[OOBE and session detection] +Detection logic changed in 4.1. OOBE detection now includes the User ESP phase, and both OOBE and +session detection can be bypassed per deployment with the `NoOobeDetection` and `NoSessionDetection` +session properties. Review any script or config that relied on the old behaviour; +[Deployment Modes](../explanation/deployment-modes.mdx) describes what happens now. +::: + +## 4. Review Strings.psd1 + +The `Strings.psd1` files changed extensively for every language, too many changes to list. If you +customized yours, re-apply your changes on top of the new file rather than keeping the old one. + +Translation improvements are welcome as issues or pull requests on GitHub. + +## 5. Check for deprecations + +- Run `Test-ADTCompatibility` from + [PSAppDeployToolkit.Tools](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools) against + your script. +- Review the function and parameter deprecations in the + [release notes](../reference/release-notes.mdx). Deprecated items are removed in 4.2.0. diff --git a/docs/images/dialogbox_okcancel_dark.png b/docs/images/dialogbox_okcancel_dark.png new file mode 100644 index 0000000..e69fad0 Binary files /dev/null and b/docs/images/dialogbox_okcancel_dark.png differ diff --git a/docs/images/dialogbox_okcancel_light.png b/docs/images/dialogbox_okcancel_light.png new file mode 100644 index 0000000..17bbe0d Binary files /dev/null and b/docs/images/dialogbox_okcancel_light.png differ diff --git a/docs/images/dialogbox_yesnocancel_dark.png b/docs/images/dialogbox_yesnocancel_dark.png new file mode 100644 index 0000000..4c67270 Binary files /dev/null and b/docs/images/dialogbox_yesnocancel_dark.png differ diff --git a/docs/images/dialogbox_yesnocancel_light.png b/docs/images/dialogbox_yesnocancel_light.png new file mode 100644 index 0000000..e05c853 Binary files /dev/null and b/docs/images/dialogbox_yesnocancel_light.png differ diff --git a/docs/images/helpconsole_42.png b/docs/images/helpconsole_42.png new file mode 100644 index 0000000..de88d32 Binary files /dev/null and b/docs/images/helpconsole_42.png differ diff --git a/docs/images/progress_detail_75_dark.png b/docs/images/progress_detail_75_dark.png new file mode 100644 index 0000000..2b5d731 Binary files /dev/null and b/docs/images/progress_detail_75_dark.png differ diff --git a/docs/images/progress_detail_75_light.png b/docs/images/progress_detail_75_light.png new file mode 100644 index 0000000..6952c89 Binary files /dev/null and b/docs/images/progress_detail_75_light.png differ diff --git a/docs/images/progress_indeterminate_dark.png b/docs/images/progress_indeterminate_dark.png new file mode 100644 index 0000000..189f2c6 Binary files /dev/null and b/docs/images/progress_indeterminate_dark.png differ diff --git a/docs/images/progress_indeterminate_light.png b/docs/images/progress_indeterminate_light.png new file mode 100644 index 0000000..9360eba Binary files /dev/null and b/docs/images/progress_indeterminate_light.png differ diff --git a/docs/images/progress_plain_dark.png b/docs/images/progress_plain_dark.png new file mode 100644 index 0000000..14767bd Binary files /dev/null and b/docs/images/progress_plain_dark.png differ diff --git a/docs/images/progress_plain_light.png b/docs/images/progress_plain_light.png new file mode 100644 index 0000000..a2aea9f Binary files /dev/null and b/docs/images/progress_plain_light.png differ diff --git a/docs/images/prompt_complete_dark.png b/docs/images/prompt_complete_dark.png new file mode 100644 index 0000000..49b75f5 Binary files /dev/null and b/docs/images/prompt_complete_dark.png differ diff --git a/docs/images/prompt_complete_light.png b/docs/images/prompt_complete_light.png new file mode 100644 index 0000000..0086b0b Binary files /dev/null and b/docs/images/prompt_complete_light.png differ diff --git a/docs/images/prompt_formatting_dark.png b/docs/images/prompt_formatting_dark.png new file mode 100644 index 0000000..011183c Binary files /dev/null and b/docs/images/prompt_formatting_dark.png differ diff --git a/docs/images/prompt_formatting_light.png b/docs/images/prompt_formatting_light.png new file mode 100644 index 0000000..0877537 Binary files /dev/null and b/docs/images/prompt_formatting_light.png differ diff --git a/docs/images/prompt_info_dark.png b/docs/images/prompt_info_dark.png new file mode 100644 index 0000000..75eb91b Binary files /dev/null and b/docs/images/prompt_info_dark.png differ diff --git a/docs/images/prompt_info_light.png b/docs/images/prompt_info_light.png new file mode 100644 index 0000000..f4aeb32 Binary files /dev/null and b/docs/images/prompt_info_light.png differ diff --git a/docs/images/prompt_input_dark.png b/docs/images/prompt_input_dark.png new file mode 100644 index 0000000..2fc34a2 Binary files /dev/null and b/docs/images/prompt_input_dark.png differ diff --git a/docs/images/prompt_input_default_dark.png b/docs/images/prompt_input_default_dark.png new file mode 100644 index 0000000..b986953 Binary files /dev/null and b/docs/images/prompt_input_default_dark.png differ diff --git a/docs/images/prompt_input_default_light.png b/docs/images/prompt_input_default_light.png new file mode 100644 index 0000000..0ad3ba6 Binary files /dev/null and b/docs/images/prompt_input_default_light.png differ diff --git a/docs/images/prompt_input_light.png b/docs/images/prompt_input_light.png new file mode 100644 index 0000000..7ba9175 Binary files /dev/null and b/docs/images/prompt_input_light.png differ diff --git a/docs/images/prompt_input_secure_dark.png b/docs/images/prompt_input_secure_dark.png new file mode 100644 index 0000000..84c64a7 Binary files /dev/null and b/docs/images/prompt_input_secure_dark.png differ diff --git a/docs/images/prompt_input_secure_light.png b/docs/images/prompt_input_secure_light.png new file mode 100644 index 0000000..b404cd1 Binary files /dev/null and b/docs/images/prompt_input_secure_light.png differ diff --git a/docs/images/prompt_list_dark.png b/docs/images/prompt_list_dark.png new file mode 100644 index 0000000..3d57bb5 Binary files /dev/null and b/docs/images/prompt_list_dark.png differ diff --git a/docs/images/prompt_list_light.png b/docs/images/prompt_list_light.png new file mode 100644 index 0000000..e383df7 Binary files /dev/null and b/docs/images/prompt_list_light.png differ diff --git a/docs/images/prompt_three_button_dark.png b/docs/images/prompt_three_button_dark.png new file mode 100644 index 0000000..10b1abb Binary files /dev/null and b/docs/images/prompt_three_button_dark.png differ diff --git a/docs/images/prompt_three_button_light.png b/docs/images/prompt_three_button_light.png new file mode 100644 index 0000000..76cf239 Binary files /dev/null and b/docs/images/prompt_three_button_light.png differ diff --git a/docs/images/prompt_two_button_dark.png b/docs/images/prompt_two_button_dark.png new file mode 100644 index 0000000..94572eb Binary files /dev/null and b/docs/images/prompt_two_button_dark.png differ diff --git a/docs/images/prompt_two_button_light.png b/docs/images/prompt_two_button_light.png new file mode 100644 index 0000000..a7f8a75 Binary files /dev/null and b/docs/images/prompt_two_button_light.png differ diff --git a/docs/images/restart_countdown_dark.png b/docs/images/restart_countdown_dark.png new file mode 100644 index 0000000..242c234 Binary files /dev/null and b/docs/images/restart_countdown_dark.png differ diff --git a/docs/images/restart_countdown_light.png b/docs/images/restart_countdown_light.png new file mode 100644 index 0000000..fb47053 Binary files /dev/null and b/docs/images/restart_countdown_light.png differ diff --git a/docs/images/restart_countdown_nohide_dark.png b/docs/images/restart_countdown_nohide_dark.png new file mode 100644 index 0000000..ddf7b88 Binary files /dev/null and b/docs/images/restart_countdown_nohide_dark.png differ diff --git a/docs/images/restart_countdown_nohide_light.png b/docs/images/restart_countdown_nohide_light.png new file mode 100644 index 0000000..7878d2c Binary files /dev/null and b/docs/images/restart_countdown_nohide_light.png differ diff --git a/docs/images/restart_nocountdown_dark.png b/docs/images/restart_nocountdown_dark.png new file mode 100644 index 0000000..4bdd826 Binary files /dev/null and b/docs/images/restart_nocountdown_dark.png differ diff --git a/docs/images/restart_nocountdown_light.png b/docs/images/restart_nocountdown_light.png new file mode 100644 index 0000000..2f53e8b Binary files /dev/null and b/docs/images/restart_nocountdown_light.png differ diff --git a/docs/images/welcome_branded_dark.png b/docs/images/welcome_branded_dark.png new file mode 100644 index 0000000..6743eb1 Binary files /dev/null and b/docs/images/welcome_branded_dark.png differ diff --git a/docs/images/welcome_branded_light.png b/docs/images/welcome_branded_light.png new file mode 100644 index 0000000..c06aab7 Binary files /dev/null and b/docs/images/welcome_branded_light.png differ diff --git a/docs/images/welcome_countdown_dark.png b/docs/images/welcome_countdown_dark.png new file mode 100644 index 0000000..07334b1 Binary files /dev/null and b/docs/images/welcome_countdown_dark.png differ diff --git a/docs/images/welcome_countdown_light.png b/docs/images/welcome_countdown_light.png new file mode 100644 index 0000000..ebeff58 Binary files /dev/null and b/docs/images/welcome_countdown_light.png differ diff --git a/docs/images/welcome_deadline_force_dark.png b/docs/images/welcome_deadline_force_dark.png new file mode 100644 index 0000000..9c070f3 Binary files /dev/null and b/docs/images/welcome_deadline_force_dark.png differ diff --git a/docs/images/welcome_deadline_force_light.png b/docs/images/welcome_deadline_force_light.png new file mode 100644 index 0000000..10fe453 Binary files /dev/null and b/docs/images/welcome_deadline_force_light.png differ diff --git a/docs/images/welcome_defer_only_dark.png b/docs/images/welcome_defer_only_dark.png new file mode 100644 index 0000000..787dc79 Binary files /dev/null and b/docs/images/welcome_defer_only_dark.png differ diff --git a/docs/images/welcome_defer_only_light.png b/docs/images/welcome_defer_only_light.png new file mode 100644 index 0000000..e638ddd Binary files /dev/null and b/docs/images/welcome_defer_only_light.png differ diff --git a/docs/images/welcome_fluent_dark.png b/docs/images/welcome_fluent_dark.png new file mode 100644 index 0000000..23d835b Binary files /dev/null and b/docs/images/welcome_fluent_dark.png differ diff --git a/docs/images/welcome_fluent_light.png b/docs/images/welcome_fluent_light.png new file mode 100644 index 0000000..0696736 Binary files /dev/null and b/docs/images/welcome_fluent_light.png differ diff --git a/docs/images/welcome_german_dark.png b/docs/images/welcome_german_dark.png new file mode 100644 index 0000000..8145dec Binary files /dev/null and b/docs/images/welcome_german_dark.png differ diff --git a/docs/images/welcome_german_light.png b/docs/images/welcome_german_light.png new file mode 100644 index 0000000..f76ec86 Binary files /dev/null and b/docs/images/welcome_german_light.png differ diff --git a/docs/images/welcome_notepad_defer_dark.png b/docs/images/welcome_notepad_defer_dark.png new file mode 100644 index 0000000..60d2dd7 Binary files /dev/null and b/docs/images/welcome_notepad_defer_dark.png differ diff --git a/docs/images/welcome_notepad_defer_light.png b/docs/images/welcome_notepad_defer_light.png new file mode 100644 index 0000000..f8c68b4 Binary files /dev/null and b/docs/images/welcome_notepad_defer_light.png differ diff --git a/docs/images/welcome_notepad_nodefer_dark.png b/docs/images/welcome_notepad_nodefer_dark.png new file mode 100644 index 0000000..15ac064 Binary files /dev/null and b/docs/images/welcome_notepad_nodefer_dark.png differ diff --git a/docs/images/welcome_notepad_nodefer_light.png b/docs/images/welcome_notepad_nodefer_light.png new file mode 100644 index 0000000..2e713b9 Binary files /dev/null and b/docs/images/welcome_notepad_nodefer_light.png differ diff --git a/docs/introduction.mdx b/docs/introduction.mdx index 59c181f..a29e306 100644 --- a/docs/introduction.mdx +++ b/docs/introduction.mdx @@ -1,4 +1,4 @@ ---- +--- sidebar_position: 1 title: 'Introduction' description: Get up and running with PSAppDeployToolkit in minutes. @@ -21,17 +21,48 @@ It is typically used to wrap an existing vendor-supplied installer package (e.g. ... which results in a **consistent and brandable user experience** and **highly successful deployments**. -In this documentation, you'll find information on how to quickly get up and running with PSADT, how to get to grips with creating you first deployment, guides on how to use some of the more advanced features, and a reference for every function and variable available to use. +## Finding your way around + +This documentation is organized by what you are trying to do. + +**[Tutorials](./tutorials/your-first-deployment.mdx)** are the place to start if you are new. They +are lessons to work through, and each one ends with something working on your machine. + +- [Your first deployment](./tutorials/your-first-deployment.mdx) +- [Adding a user experience](./tutorials/adding-a-user-experience.mdx) + +**[How-to guides](./how-to/install-the-toolkit.mdx)** are recipes for specific goals, for when you +already know what you want to achieve. + +- [Install the toolkit](./how-to/install-the-toolkit.mdx) and + [create a deployment](./how-to/create-a-deployment.mdx) +- Deploy with [Intune](./how-to/deploy-with-intune.mdx) or + [Configuration Manager](./how-to/deploy-with-configmgr.mdx) +- [Upgrade from v3.x](./how-to/upgrade-from-v3.mdx) or + [from v4.0](./how-to/upgrade-from-v4-0.mdx) +- [Troubleshoot a deployment](./how-to/troubleshoot-a-deployment.mdx) + +**[Explanation](./explanation/architecture.mdx)** covers background and reasoning, for when you want +to understand why the toolkit behaves the way it does. + +- [Architecture](./explanation/architecture.mdx) and + [the deployment script](./explanation/the-deployment-script.mdx) +- [Deployment modes](./explanation/deployment-modes.mdx), or why your dialogs did or did not appear +- [Configuration](./explanation/configuration.mdx), [logging](./explanation/logging.mdx) and + [the user interface](./explanation/user-interface.mdx) + +**[Reference](./reference.mdx)** is the precise technical description, for looking things up. + +- [Every function](./category/functions), with parameters and examples +- [ADTSession properties](./reference/adtsession-object.mdx), + [variables](./reference/variables.mdx), [settings](./reference/config-settings.mdx) and + [exit codes](./reference/exit-codes.mdx) +- [Troubleshooting](./reference/troubleshooting.mdx) and [FAQ](./reference/faq.mdx) ## Getting Help / Support PSAppDeployToolkit is open-source software and provided free for anyone to use. The development team provide support on a best-effort basis. In our experience, most questions can be answered by searching the documentation or the community platforms for an answer. -- [Documentation](./introduction.mdx) - - Everything you need to know about how to use PSAppDeployToolkit, including step-by-step guides. -- [Functions Reference](./category/functions) - - A reference for all the functions provided by PSAppDeployToolkit, including parameters and examples of how to use them. - :::info[Enterprise Support] We recognize that some enterprises face adoption challenges due to audit requirements for vendor support. Patch My PC are stewards of the PSADT Project and, as experts in open-source deployment, are uniquely positioned to offer both deep technical knowledge and enterprise-level support - allowing customers to fully benefit from open-source tools without compromise. [Learn more about Patch My PC's support for PSADT](https://patchmypc.com/support/psappdeploytoolkit-support). ::: diff --git a/docs/reference.mdx b/docs/reference.mdx index 1367d9f..5c11cc1 100644 --- a/docs/reference.mdx +++ b/docs/reference.mdx @@ -1,7 +1,7 @@ ---- +--- sidebar_position: 1 title: 'Reference' -description: 'A handy reference to the PSAppDeployToolkit library of functions, ADTSession object properties, and exit codes.' +description: 'Technical reference for the PSAppDeployToolkit function library, session object, settings, strings and exit codes.' id: reference hide_title: true tags: @@ -10,18 +10,54 @@ tags: ## Reference -You can find extensive details on all of the available Functions, `ADTSession` properties, Variables, Configuration Settings, Langauge Strings, Text Formatting and Exit Codes in the sidebar or by using the search bar. +Precise descriptions of what PSAppDeployToolkit provides. Use the sidebar or the search bar to find +what you need; if you are looking for instructions rather than facts, start from the +[documentation](./introduction.mdx). ---- -- PSAppDeployToolkit has an **extensive library of functions** to simplify common deployment tasks. Every function adheres to the same security standards and best practices, including documentation. -- The **`ADTSession`** object is a core component of PSAppDeployToolkit, managing the state and information throughout a deployment session. It gathers essential details about the deployment environment and provides convenient properties and methods for use in scripts. -- When you open an `ADTSession` several useful **Variables** are created. These include hardware information, system and user paths, and Active Directory domain details, among others. -- PSADT provides comprehensive **Configuration Settings** through multiple layers. -- You can customize all of the User Interface text strings for English or any other language using **Language Strings**. -- PSADT supports rich **Text Formatting** in dialog messages, allowing you to create more visually appealing and informative user interfaces. -- Pre-defined **Exit Codes** are used to indicate the success or failure of a deployment and can be used to control the flow of your deployment logic, or just to understand what happened during a deployment. +### The package + +- [Requirements](./reference/requirements.mdx): supported PowerShell, .NET and Windows versions. +- [Deployment Template](./reference/deployment-template.mdx): the folders and files that make up a + deployment, for both the v4 native and v3 compatibility templates. +- [Module Structure](./reference/module-structure.mdx): what is inside the module folder. + +### Running a deployment + +- [ADTSession Object](./reference/adtsession-object.mdx): every property of the object that governs + a deployment session. +- [Command-Line Parameters](./reference/command-line-parameters.mdx): parameters accepted by the + deployment script and its launcher. +- [Variables](./reference/variables.mdx): the hardware, path, account and domain variables created + when a session opens. +- [Exit Codes](./reference/exit-codes.mdx): the codes a deployment can return, and the ranges + reserved for your own. + +### Configuration and text + +- [Configuration Settings](./reference/config-settings.mdx): every key in `config.psd1`. +- [Language Strings](./reference/language-strings.mdx): every key in `strings.psd1`. +- [Text Formatting](./reference/text-formatting.mdx): markup tags supported in dialog messages. +- [Dialogs](./reference/dialogs.mdx): every dialog the toolkit can display. + +### Commands + +- [Functions](./category/functions): the full library. Every command documents its parameters, + inputs, outputs and examples. +- [Process Execution Parameters](./reference/process-execution.mdx): the parameters most commonly + used when running installers. +- [v4 Function Mapping](./reference/v4-function-mapping.mdx): each v3 function and its v4 + equivalent. + +### When something goes wrong + +- [Troubleshooting](./reference/troubleshooting.mdx): known symptoms, causes and resolutions. +- [FAQ](./reference/faq.mdx): frequently asked questions. +- [Release Notes](./reference/release-notes.mdx): what changed, and when. +- [Licensing](./reference/licensing.mdx): the licence the toolkit is published under. ### Something missing? -If you find issues with the documentation or have suggestions on how to improve the documentation or the project in general, please [file an issue](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit/issues) for us. +If you find issues with the documentation, or have suggestions for improving it or the project in +general, please [file an issue](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit/issues). diff --git a/docs/reference/adtsession-object.mdx b/docs/reference/adtsession-object.mdx index d7beba1..d05f577 100644 --- a/docs/reference/adtsession-object.mdx +++ b/docs/reference/adtsession-object.mdx @@ -1,8 +1,8 @@ --- -sidebar_position: 1 +sidebar_position: 4 sidebar_label: 'ADTSession Object' title: 'ADTSession Object' -description: 'PSAppDeployToolkit uses ADTSession to govern each deployment. You can find more information here' +description: 'Every property of the ADTSession object that governs a deployment.' slug: /reference/adtsession-object hide_title: true tags: @@ -26,6 +26,11 @@ This initializes the session and gathers information about the deployment, user, In addition, opening a session creates additional variables in your PowerShell environment that are independent of any particular deployment. More information about these variables can be found in the [Variables](./variables.mdx) page. +Why deployment state is held in a session object at all is discussed in +[Architecture](../explanation/architecture.mdx). In a deployment built from the template, these +properties are set in the `$adtSession` hashtable at the top of `Invoke-AppDeployToolkit.ps1`. See +[The deployment script](../explanation/the-deployment-script.mdx). + ## Properties The ADTSession object exposes several properties, which can be accessed using `$adtSession.`, e.g `$adtSession.AppName`. diff --git a/docs/reference/command-line-parameters.mdx b/docs/reference/command-line-parameters.mdx new file mode 100644 index 0000000..f705864 --- /dev/null +++ b/docs/reference/command-line-parameters.mdx @@ -0,0 +1,66 @@ +--- +sidebar_position: 6 +sidebar_label: 'Command-Line Parameters' +title: 'Command-Line Parameters' +description: 'Parameters accepted by Invoke-AppDeployToolkit.ps1 and Invoke-AppDeployToolkit.exe.' +slug: /reference/command-line-parameters +hide_title: true +tags: + - Command Line + - Reference +--- + +## Command-Line Parameters + +`Invoke-AppDeployToolkit.ps1` is the deployment script supplied by the v4 template. +`Invoke-AppDeployToolkit.exe` is a launcher that starts that script in a PowerShell process. + +## Script parameters + +Accepted by both `Invoke-AppDeployToolkit.ps1` and `Invoke-AppDeployToolkit.exe`. + +| Parameter | Values | Description | +| ------------------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `-DeploymentType` | `Install` *(default)*
`Uninstall`
`Repair` | The deployment action to perform. | +| `-DeployMode` | `Auto` *(default)*
`Interactive`
`NonInteractive`
`Silent` | Controls dialog behaviour. `Auto` resolves at runtime; see [Deployment Modes](../explanation/deployment-modes.mdx). | +| `-SuppressRebootPassThru` | *(switch)* | Returns `0` instead of a reboot exit code such as `3010`. | + +:::info +These are the parameters declared by the template script itself. Because the template is yours to +edit, you can add parameters of your own. Everything else that governs a deployment, such as +`TerminalServerMode`, `DisableLogging` or `RequireAdmin`, is set as a session property inside the +script. See the [ADTSession Object reference](./adtsession-object.mdx). +::: + +## Launcher parameters + +Accepted only by `Invoke-AppDeployToolkit.exe`. They are consumed by the launcher and are not +passed through to the script. + +| Parameter | Values | Description | +| --------- | ------- | -------------------------------------------------------------------------------------------------------------------- | +| `/Debug` | | Allocates a console and displays live logging output on screen. Only takes effect in an interactive user session. | +| `/32` | | Runs the script under Windows PowerShell x86. Cannot be combined with `/Core`. | +| `/Core` | | Runs the script under PowerShell Core (`pwsh.exe`). Cannot be combined with `/32`. | +| `-File` | `*.ps1` | Runs the specified script instead of the default. The rest of the command line is passed through untouched. | +| `*.ps1` | | A bare `.ps1` path anywhere on the command line is treated the same as `-File`. | + +If neither `/32` nor `/Core` is supplied, the launcher runs Windows PowerShell, unless its parent +process is PowerShell Core, in which case it follows the parent. + +`-Command` is rejected: the launcher throws an error and directs you to `-File`, because `-Command` +does not propagate exit codes reliably. + +### Default script name + +With no script specified, the launcher runs the `.ps1` file that shares its own base name in the +same folder, so `Invoke-AppDeployToolkit.exe` runs `Invoke-AppDeployToolkit.ps1`. Renaming the +launcher therefore changes which script it looks for. + +## Exit codes + +See the [Exit Codes reference](./exit-codes.mdx). + +## Examples + +See [How to run a deployment](../how-to/run-a-deployment.mdx). diff --git a/docs/reference/config-settings.mdx b/docs/reference/config-settings.mdx index 9f97f18..2d84867 100644 --- a/docs/reference/config-settings.mdx +++ b/docs/reference/config-settings.mdx @@ -1,8 +1,8 @@ --- -sidebar_position: 3 +sidebar_position: 5 sidebar_label: 'Configuration Settings' title: 'Configuration Settings' -description: 'PSAppDeployToolkit uses ADTSession to govern each deployment. You can find more information here' +description: 'Every setting available in config.psd1, and the Group Policy equivalents.' slug: /reference/config-settings hide_title: true tags: @@ -12,7 +12,10 @@ tags: ## Configuration Settings -PSAppDeployToolkit provides comprehensive configuration management through multiple layers: Group Policy (highest precedence), local configuration files, and built-in defaults. +Settings are resolved from three layers, in increasing order of precedence: the module's built-in +defaults, the deployment's `Config\config.psd1`, and Group Policy. How the layers interact is +described in [Configuration](../explanation/configuration.mdx); applying them centrally is covered +in [How to configure the toolkit with Group Policy](../how-to/configure-with-group-policy.mdx). ### Settings @@ -58,10 +61,10 @@ PSAppDeployToolkit provides comprehensive configuration management through multi | Setting | Description | | :------------------------- | :---------------------------------------------------------------------------------------------------------------------- | -| `MSI.InstallParams` | Defines the installation parameters for MSI. **Default changed to `/qn REBOOT=ReallySuppress`** | +| `MSI.InstallParams` | Installation parameters for MSI. Defaults to `/qn REBOOT=ReallySuppress`. | | `MSI.LoggingOptions` | Specifies the logging options for MSI. | -| `MSI.LogPath` | Specifies the log path for MSI. **Now uses Toolkit.LogPath when empty** | -| `MSI.LogPathNoAdminRights` | Specifies the log path for MSI when no administrative privileges are available. **Now uses Toolkit.LogPathNoAdminRights when empty** | +| `MSI.LogPath` | Log path for MSI. Falls back to `Toolkit.LogPath` when empty. | +| `MSI.LogPathNoAdminRights` | Log path for MSI when no administrative privileges are available. Falls back to `Toolkit.LogPathNoAdminRights` when empty. | | `MSI.MutexWaitTime` | Sets the mutex wait time for MSI. | | `MSI.SilentParams` | Defines the silent parameters for MSI. | | `MSI.UninstallParams` | Defines the uninstall parameters for MSI. | @@ -74,7 +77,7 @@ PSAppDeployToolkit provides comprehensive configuration management through multi | `UI.DefaultExitCode` | Specifies the default exit code for the UI. | | `UI.DefaultPromptPersistInterval` | Sets the default interval for prompt persistence. | | `UI.DefaultTimeout` | Defines the default timeout for the UI. | -| `UI.DeferExitCode` | Specifies the exit code for deferred actions. **Default changed to 1602** | +| `UI.DeferExitCode` | Exit code returned when the user defers. Defaults to 1602. | | `UI.DialogStyle` | Defines the appearance of dialogs. | | `UI.FluentAccentColor` | Specifies the accent color for Fluent UI dialogs. | | `UI.FluentAccentColorDark` | Specifies the accent color for Fluent UI dialogs (for dark mode). | diff --git a/docs/reference/deployment-template.mdx b/docs/reference/deployment-template.mdx new file mode 100644 index 0000000..92432d8 --- /dev/null +++ b/docs/reference/deployment-template.mdx @@ -0,0 +1,160 @@ +--- +sidebar_position: 2 +sidebar_label: 'Deployment Template' +title: 'Deployment Template' +description: 'The file and folder structure of a PSAppDeployToolkit deployment.' +slug: /reference/deployment-template +hide_title: true +tags: + - Deployment Template + - Reference +--- + +## Deployment Template + +Two templates ship with PSAppDeployToolkit: the **v4 native** template, used for all new work, and +the **v3 compatibility** template, used to run existing v3 scripts under the v4 engine. Both are +produced by [`New-ADTTemplate`](./functions/New-ADTTemplate.mdx) or downloaded from the releases +page. + +Why the structure is shaped this way is covered in [Architecture](../explanation/architecture.mdx). + +## V4 native template + +| Folder | File | Purpose | +| :--------------------------------- | :-------------------------- | :------------------------------------------------------------------------------------------------------------- | +| **/** | Invoke-AppDeployToolkit.ps1 | The deployment script. Main entry point, and the file you edit. | +| | Invoke-AppDeployToolkit.exe | Launcher that starts the script in a PowerShell process. | +| **PSAppDeployToolkit/** | | PSADT core module files. Do not modify anything under this folder. | +| **PSAppDeployToolkit.Extensions/** | | Optional custom functions. Ignore this folder if you are not using any. | +| **Files/** | | Installation media. *Put installation files here.* | +| | Setup.exe | Example setup executable. | +| | AppInstaller.msi | Example Windows Installer MSI. | +| **SupportFiles/** | | Auxiliary files used during or after installation. *Put optional install support files here.* | +| | PerUserSettings.reg | Example installation support file. | +| **Assets/** | AppIcon.png | Application icon or organization logo. 256x256 PNG. | +| **Config/** | config.psd1 | Deployment configuration. Layered over the module defaults. | +| **Strings/** | strings.psd1 | User interface text. English in the root; other languages in subfolders. | + +### Root directory + +- **`Invoke-AppDeployToolkit.ps1`** holds the session properties, the Install/Uninstall/Repair phase + blocks, and the fixed initialization block. See + [The deployment script](../explanation/the-deployment-script.mdx). +- **`Invoke-AppDeployToolkit.exe`** launches the script without exposing its contents in a command + line, and accepts `/Debug`, `/32`, `/Core` and `-File`. See + [Command-Line Parameters](./command-line-parameters.mdx). + +### PSAppDeployToolkit + +The complete framework: module files, both UI dialog sets, session and privilege management, the +function library, and the required .NET assemblies. It is signed and is not intended to be modified. +Its contents are listed in [Module Structure](./module-structure.mdx). + +### Files + +The primary location for installation media. Commonly used file types: + +- Executable installers: `.exe`, `.msi`, `.msm` +- Windows Installer patches: `.msp` +- Transform files: `.mst` +- WIM images: `.wim` +- Archive files: `.zip`, `.7z` + +An MSI, MST, MSP or WIM placed here can be picked up automatically; see +[zero-config deployment](../how-to/deploy-an-msi-with-zero-config.mdx). The folder's path is +available to the script as `$adtSession.DirFiles`. + +### SupportFiles + +Auxiliary content that is not the installer itself: `.reg` files, configuration templates, +documentation, shortcuts, licence files. Available to the script as `$adtSession.DirSupportFiles`. + +### Assets + +Branding used by the dialogs. The Fluent dialogs use a logo, the Classic dialogs use a banner, and +each ignores the other's asset. See +[How to brand the user interface](../how-to/brand-the-user-interface.mdx). + +### Config + +`config.psd1` holds deployment settings: logging paths and behaviour, dialog defaults, and MSI +parameters. Settings are resolved from built-in defaults, then this file, then Group Policy. Every +key is listed in [Configuration Settings](./config-settings.mdx). + +### Strings + +`strings.psd1` holds all user-facing text. English lives in the root of the folder; other languages +live in their own subfolders. See [Language Strings](./language-strings.mdx). + +## V3 compatibility template + +The v3 compatibility template lets an existing v3 `Deploy-Application.ps1` run on the v4 engine. It +keeps the v3 file and folder names, so paths inside your script still resolve, and maps each v3 +function to its v4 equivalent. + +| Folder | File | Purpose | +| :--------------------------------------- | :--------------- | :--------------------------------------------------------------------------- | +| **/** | | Compatibility shim script, restoring the v3 function wrappers. | +| | | Community extension scripts, for your custom v3 functions. | +| **AppDeployToolkit/PSAppDeployToolkit/** | | PSADT core module files. Do not modify anything under this folder. | +| **Files/** | | Installation media. *Put installation files here.* | +| | Setup.exe | Example setup executable. | +| | AppInstaller.msi | Example Windows Installer MSI. | +| **SupportFiles/** | | *Put optional install support files here.* | +| **Assets/** | AppIcon.png | Application icon or organization logo. 256x256 PNG. | +| **Config/** | config.psd1 | Deployment configuration. | +| **Strings/** | strings.psd1 | User interface text. | + +Compatibility mode supports the Classic dialogs only, and `config.xml` is not read. See +[How to upgrade from v3.x](../how-to/upgrade-from-v3.mdx). + +## Example layouts + +A deployment for a single application: + +```text +YourApp-Deployment/ +├── Invoke-AppDeployToolkit.ps1 +├── Invoke-AppDeployToolkit.exe +├── PSAppDeployToolkit/ # Core framework +├── PSAppDeployToolkit.Extensions/ # Custom functions +├── Files/ +│ ├── YourApp-Setup.exe +│ ├── YourApp-Setup.msi +│ ├── YourApp-Patch.msp +│ └── YourApp-Config.mst +├── SupportFiles/ +│ ├── UserSettings.reg +│ ├── SystemSettings.reg +│ └── Config/ +│ ├── AppConfig.xml +│ └── UserPreferences.json +├── Assets/ +│ ├── AppIcon.png +│ ├── AppIcon-Dark.png +│ ├── CompanyLogo.png +│ └── Banner.png +├── Config/ +│ └── config.psd1 +└── Strings/ + ├── strings.psd1 + └── de-DE/ + └── strings.psd1 +``` + +A deployment carrying multiple architectures: + +```text +YourApp-Deployment/ +├── Files/ +│ ├── x64/ +│ │ ├── YourApp-x64-Setup.exe +│ │ └── YourApp-x64-Patch.msp +│ ├── x86/ +│ │ ├── YourApp-x86-Setup.exe +│ │ └── YourApp-x86-Patch.msp +│ └── Common/ +│ ├── SharedComponents.msi +│ └── License.lic +``` diff --git a/docs/reference/dialogs.mdx b/docs/reference/dialogs.mdx new file mode 100644 index 0000000..5eb766d --- /dev/null +++ b/docs/reference/dialogs.mdx @@ -0,0 +1,290 @@ +--- +sidebar_position: 10 +sidebar_label: 'Dialogs' +title: 'Dialogs' +description: 'The dialogs PSAppDeployToolkit can display, and the commands that show them.' +slug: /reference/dialogs +hide_title: true +tags: + - User Interface + - Reference +--- + +import ThemedImage from '@theme/ThemedImage'; + +## Dialogs + +The dialogs below are shown by the commands listed against each one. All of them: + +- Take their text from `strings.psd1`, localized into 25 languages, selected from the operating + system unless `UI.LanguageOverride` is set. See [Language Strings](./language-strings.mdx). +- Follow the light or dark theme of the user's session. (the screenshots in this documentation + will follow the current desktop theme. You can change between light / dark by adjusting the + selected theme in the top right hand corner of this page). +- Are branded from the `Assets` folder, using a logo for the Fluent dialogs and a banner for the + Classic dialogs. +- Are suppressed according to the deployment mode. `-DeployMode Silent` shows none of them; see + [Deployment Modes](../explanation/deployment-modes.mdx). + +The screenshots show the Fluent dialogs, which is the default for any new deployments. The +Classic dialogs are shown when `UI.DialogStyle` is `Classic`, and are the only set available in +v3 compatibility mode. + +## Installation progress + +Displays a progress bar and status text. Shown by +[`Show-ADTInstallationProgress`](./functions/Show-ADTInstallationProgress.mdx); closed by +[`Close-ADTInstallationProgress`](./functions/Close-ADTInstallationProgress.mdx). + +The bar is indeterminate by default, which is the right choice when your script cannot tell how far +along it is. + + + +Calling the command again while the dialog is open updates it in place rather than opening a second +dialog, which is how a long install is narrated. Supplying `-StatusBarPercentage` switches the bar +to show a specific percentage, and `-StatusMessageDetail` adds a second line beneath the message. + + + +## Installation welcome + +Lists applications that must be closed, and optionally offers deferral and a countdown. Shown by +[`Show-ADTInstallationWelcome`](./functions/Show-ADTInstallationWelcome.mdx). + +With applications to close and deferral offered, the dialog lists each application and shows how +many deferrals are left. + + + +With `-AllowDefer` but nothing running to close, the dialog asks only when to start. + + + +`-CloseProcessesCountdown` adds a countdown, after which the listed applications are closed and the +deployment continues. + + + +The limits combine. Here `-DeferDeadline` fixes the date after which deferral is no longer offered, +while `-ForceCountdown` starts the installation automatically when its timer expires, so the dialog +shows both. + + + +Usage is covered in +[How to close applications and allow deferral](../how-to/close-apps-and-allow-deferral.mdx). + +## Installation prompt + +A branded prompt with a custom title, message and buttons. Shown by +[`Show-ADTInstallationPrompt`](./functions/Show-ADTInstallationPrompt.mdx). Message text supports +[text formatting](./text-formatting.mdx). + +With one button it reports a result and waits for acknowledgement. + + + +`-ButtonLeftText` and `-ButtonRightText` give two choices. + + + +Adding `-ButtonMiddleText` gives three. + + + +`-RequestInput` collects a value from the user. + + + +`-DefaultValue` pre-fills the field, which turns the question into a confirmation. + + + +`-SecureInput` masks what is typed, for licence keys and similar. The field looks the same until +the user types into it. + + + +`-ListItems` presents a list to choose from, with `-DefaultIndex` selecting the initial entry. One +item is chosen, not several. + + + +:::note +`-Icon` is accepted but has no effect on the Fluent dialogs. It applies to the Classic dialogs only. +::: + +## Installation restart prompt + +Asks the user to restart. Shown by +[`Show-ADTInstallationRestartPrompt`](./functions/Show-ADTInstallationRestartPrompt.mdx). The prompt +runs in a separate PowerShell session, so the deployment still returns its exit code to the parent +process. + +`-NoCountdown` asks without imposing a deadline. Nothing happens until the user chooses. + + + +`-Countdown` restarts the computer automatically when the timer reaches zero. + + + +`-CountdownNoHide` runs the same countdown but takes away the option to minimise it. + + + +## Dialog box + +A generic, unbranded message box with configurable system icon and buttons. Shown by +[`Show-ADTDialogBox`](./functions/Show-ADTDialogBox.mdx). Because it is a Windows message box rather +than a toolkit dialog, it takes no branding and ignores the dialog style. + + + +`-Buttons` selects the combination, from `Ok` through to `CancelTryContinue`. + + + +## Balloon tips and notifications + +Transient notifications are shown by +[`Show-ADTBalloonTip`](./functions/Show-ADTBalloonTip.mdx), and the notification area icon by +[`Show-ADTNotifyIcon`](./functions/Show-ADTNotifyIcon.mdx) and +[`Close-ADTNotifyIcon`](./functions/Close-ADTNotifyIcon.mdx). Balloon notifications are governed by +the `UI.BalloonNotifications` setting, and are delivered by Windows rather than drawn by the +toolkit, so they follow whatever notification settings apply to the device. + +## Help console + +A browsable list of the toolkit's commands and their help, shown by +[`Show-ADTHelpConsole`](./functions/Show-ADTHelpConsole.mdx). Intended for use while authoring a +package, not during a deployment. + +The help console listing the toolkit's commands with the help for the selected one diff --git a/docs/getting-started/faq.mdx b/docs/reference/faq.mdx similarity index 92% rename from docs/getting-started/faq.mdx rename to docs/reference/faq.mdx index ea0a8d8..ba6760a 100644 --- a/docs/getting-started/faq.mdx +++ b/docs/reference/faq.mdx @@ -1,24 +1,29 @@ --- -sidebar_position: 9 +sidebar_position: 13 +sidebar_label: 'FAQ' title: 'FAQ' description: 'Frequently Asked Questions' -slug: /getting-started/faq +slug: /reference/faq hide_title: true tags: - - Getting Started + - Reference - FAQ --- ## Frequently Asked Questions +For symptoms with a known cause and fix, see [Troubleshooting](./troubleshooting.mdx). For a +diagnostic process, see +[How to troubleshoot a deployment](../how-to/troubleshoot-a-deployment.mdx). +
Everything has changed since v3! Where do I begin? Some useful links to get you started: -- [Release Notes](../getting-started/release-notes.mdx) +- [Release Notes](../reference/release-notes.mdx) - [v4 Function Mapping](../reference/v4-function-mapping.mdx) -- [Upgrade Guidance: v3.x to v4.1](../getting-started/upgrade-guidance-v3x-to-v41.mdx) +- [Upgrade Guidance: v3.x to v4.1](../how-to/upgrade-from-v3.mdx)
@@ -72,7 +77,7 @@ tags:
How can I update the version of the toolkit that my package uses? - To update a PSAppDeployToolkit v3 package to v4, there is a `Convert-ADTDeployment` command in the companion [PSAppDeployToolkit.Tools](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools) module (see [Upgrade Guidance: v3.x to v4.1](../getting-started/upgrade-guidance-v3x-to-v41.mdx) for further details). + To update a PSAppDeployToolkit v3 package to v4, there is a `Convert-ADTDeployment` command in the companion [PSAppDeployToolkit.Tools](https://github.com/PSAppDeployToolkit/PSAppDeployToolkit.Tools) module (see [Upgrade Guidance: v3.x to v4.1](../how-to/upgrade-from-v3.mdx) for further details). To update a v4 package to a newer version, because the config and asset folders are externalized, you can simply replace the PSAppDeployToolkit folder with the new version. There should be no breaking changes if you apply a patch release (for example, upgrading from 4.0.0 to 4.0.4). diff --git a/docs/reference/language-strings.mdx b/docs/reference/language-strings.mdx index 52ef363..2a69859 100644 --- a/docs/reference/language-strings.mdx +++ b/docs/reference/language-strings.mdx @@ -1,8 +1,8 @@ --- -sidebar_position: 4 +sidebar_position: 8 sidebar_label: 'Language Strings' title: 'Language Strings' -description: 'PSAppDeployToolkit exposes all of the text used in the UI.' +description: 'The UI text strings PSAppDeployToolkit exposes for customization and translation.' slug: /reference/language-strings hide_title: true tags: @@ -12,13 +12,18 @@ tags: ## Language Strings -Each setting in the config.psd1 is exposed through the `Get-ADTConfig` function, allowing you to retrieve text used by the UI. +All user-facing text is defined in `strings.psd1`. The module ships defaults for 25 languages; +English lives in the root of the `Strings` folder and other languages in their own subfolders. A +deployment overrides them by supplying its own `Strings\strings.psd1`. -### Settings +The active string table is available to scripts through +[`Get-ADTStringTable`](./functions/Get-ADTStringTable.mdx). The language is selected from the +operating system unless `UI.LanguageOverride` is set; see +[Configuration Settings](./config-settings.mdx). -#### General Strings +String values support markup, as described in [Text Formatting](./text-formatting.mdx). -#### Close Prompts +## Close prompts | Setting | Description | | :--------------------------- | :------------------------------------------- | @@ -26,7 +31,7 @@ Each setting in the config.psd1 is exposed through the `Get-ADTConfig` function, | `ClosePrompt.ButtonContinue` | Button text for continuing the close prompt. | | `ClosePrompt.ButtonDefer` | Button text for deferring the close prompt. | -#### Progress Messages +## Progress messages | Setting | Description | | :-------------------------------- | :------------------------------------------------ | @@ -37,13 +42,13 @@ Each setting in the config.psd1 is exposed through the `Get-ADTConfig` function, | `Progress.MessageUninstall` | Message displayed during uninstallation. | | `Progress.MessageUninstallDetail` | Detailed message displayed during uninstallation. | -#### Disk Space +## Disk space -| Setting | Descriptionm | -| :------------------ | :------------------------------------------- | -| `DiskSpace.Message` | Message displayed when checking disk space. | +| Setting | Description | +| :------------------ | :------------------------------------------ | +| `DiskSpace.Message` | Message displayed when checking disk space. | -#### Deployment Types +## Deployment types | Setting | Description | | :------------------------- | :---------------------------------- | @@ -51,20 +56,20 @@ Each setting in the config.psd1 is exposed through the `Get-ADTConfig` function, | `DeploymentType.Repair` | Text for repair deployment type. | | `DeploymentType.Uninstall` | Text for uninstall deployment type. | -#### Welcome Prompts +## Welcome prompts -| Setting | Description | -| :------ | :-- -------- | +| Setting | Description | +| :---------------------- | :---------------------------- | | `WelcomePrompt.Classic` | Classic style welcome prompt. | -| `WelcomePrompt.Fluent` | Fluent style welcome prompt. | +| `WelcomePrompt.Fluent` | Fluent style welcome prompt. | -### Block Execution +## Block execution | Setting | Description | | :----------------------- | :------------------------------------------- | | `BlockExecution.Message` | Message displayed when execution is blocked. | -### Balloon Texts +## Balloon text | Setting | Description | | :---------------------------- | :--------------------------------- | @@ -74,7 +79,7 @@ Each setting in the config.psd1 is exposed through the `Get-ADTConfig` function, | `BalloonText.RestartRequired` | Balloon text for restart required. | | `BalloonText.Start` | Balloon text for start. | -#### Restart Prompts +## Restart prompts | Setting | Description | | :--------------------------------- | :-------------------------------------------- | @@ -86,7 +91,7 @@ Each setting in the config.psd1 is exposed through the `Get-ADTConfig` function, | `RestartPrompt.TimeRemaining` | Time remaining message for restart. | | `RestartPrompt.Title` | Title for restart prompt. | -#### Defer Prompts +## Defer prompts | Setting | Description | | :------------------------------- | :-------------------------------------------- | diff --git a/docs/getting-started/licensing.mdx b/docs/reference/licensing.mdx similarity index 98% rename from docs/getting-started/licensing.mdx rename to docs/reference/licensing.mdx index 3faf458..0e9f266 100644 --- a/docs/getting-started/licensing.mdx +++ b/docs/reference/licensing.mdx @@ -1,12 +1,13 @@ --- -sidebar_position: 1 +sidebar_position: 15 +sidebar_label: 'Licensing' title: 'Licensing' description: 'Information on how PSAppDeployToolkit is licensed.' -slug: /getting-started/licensing +slug: /reference/licensing hide_title: true tags: - Licensing - - Getting Started + - Reference --- ## Licensing diff --git a/docs/reference/module-structure.mdx b/docs/reference/module-structure.mdx index 1f35e73..5d0d666 100644 --- a/docs/reference/module-structure.mdx +++ b/docs/reference/module-structure.mdx @@ -1,52 +1,49 @@ --- -sidebar_position: 1 +sidebar_position: 3 +sidebar_label: 'Module Structure' title: 'Module Structure' description: 'The file / folder structure of the PSADT module explained.' slug: /reference/module-structure hide_title: true tags: - - Usage - - Archive + - Module Structure - Reference --- -## Deployment Structure - -### PSADT Core Module Files - -The PSADT core module files are located in the `PSAppDeployToolkit/` folder. This folder contains all the necessary files for the PSADT module to function correctly. You should not modify any files in this folder, as they are essential for the proper operation of the PSADT module. - -These are here for reference only, and you should not modify them. If you need to customize the PSADT module, you can create your own custom functions in the `PSAppDeployToolkit.Extensions/` folder. - -| Folder | File | Purpose | -| :---------------------- | :---------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **PSAppDeployToolkit/** | | | -| | PSAppDeployToolkit.cer | PSADT Public Certificate. Used to verify the deployment scripts and executables. | -| | PSAppDeployToolkit.psd1 | PSADT Module Manifest file. Contains metadata about the module, such as its version and dependencies. | -| | PSAppDeployToolkit.psm1 | PSADT Module file. This is automatically loaded by the deployment script. | -| **ADMX/** | | | -| | | PSADT Group Policy ADMX files. These files are used to integrate the PSADT module with Group Policy. They allow you to configure PSADT settings via Group Policy. You can import these files into your Group Policy Management Console. | -| **Assets** | | | -| | AppIcon.png | PSADT Default App Icon. This is the fallback if you do not customize it. You should NOT modify this file. | -| **Config/** | | | -| | config.psd1 | PSADT Default Configuration file. This file contains the default configuration settings for the PSADT module. You should NOT modify this file. | -| **Strings/** | | | -| | strings.psd1 | PSADT Default User Interface strings file. This changes the text displayed in the PSADT User Interface. It contains the default English strings. If a specific language is not available, this will be used as a fallback. You should NOT modify this file. | -| **Strings/** | | | -| | strings.psd1 | PSADT Default User Interface strings file. This changes the text displayed in the PSADT User Interface. It contains the default English strings. If a specific language is not available, this will be used as a fallback. You should NOT modify this file. | -| **FrontEnd/** | | | -| | | PSADT Default deployment script files. Contains the templates for the deployment scripts. You should NOT modify these files. | -| **Lib/** | | | -| | | PSADT Library files. Contains additional logic and functionality used by the PSADT module. These files are used to extend the functionality of the PSADT module. You should NOT modify these files. | - -## PSADT Extensions Module Files - -These files are part of the PSADT Extensions module, which provides additional functionality for the PSADT framework. - -The PSADT Extensions module is designed to allow you to create your own custom functions and logic that can be used in your deployment scripts. The module will be automatically imported by the PSADT core module, so you do not need to import it manually. - -| Folder | File | Purpose | -| :---------------------------------- | :---------------------------------- | :--------------------------------------------------------------------------------------- | -| **PSAppDeployToolkit. Extensions/** | | | -| | PSAppDeployToolkit. Extensions.psd1 | PSADT Extensions module manifest. Contains metadata about the module and its version. | -| | PSAppDeployToolkit. Extensions.psm1 | PSADT Extensions module script. Contains all the functions and logic for the extensions. | +## Module Structure + +The contents of the `PSAppDeployToolkit/` folder, listed for reference. Nothing in this folder is +intended to be modified. Custom functions belong in +[`PSAppDeployToolkit.Extensions`](../how-to/extend-the-toolkit-with-custom-functions.mdx), and +settings belong in the deployment's own `Config` and `Strings` folders. + +## Core module files + +| Folder | File | Purpose | +| :---------------------- | :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| **PSAppDeployToolkit/** | | | +| | PSAppDeployToolkit.cer | Public certificate. Used to verify the deployment scripts and executables. | +| | PSAppDeployToolkit.psd1 | Module manifest. Contains metadata about the module, such as its version and dependencies. | +| | PSAppDeployToolkit.psm1 | Module file. Automatically loaded by the deployment script. | +| **ADMX/** | | Group Policy ADMX files, for configuring the toolkit centrally. Import these into your Central Store or Intune; see [how to use them](../how-to/configure-with-group-policy.mdx). | +| **Assets/** | AppIcon.png | Default app icon. Used as a fallback when a deployment does not supply its own. | +| **Config/** | config.psd1 | Default configuration. The bottom layer of the [configuration hierarchy](../explanation/configuration.mdx). | +| **Strings/** | strings.psd1 | Default UI strings. Contains the default English strings, used as a fallback when a language is unavailable. | +| **Frontend/** | | Deployment script templates used by [`New-ADTTemplate`](./functions/New-ADTTemplate.mdx). | +| **Lib/** | | Supporting libraries and .NET assemblies used by the module. | + +## Extensions module files + +The extensions module is a template for your own reusable functions. It is imported automatically by +the deployment script, so no manual import is required. + +| Folder | File | Purpose | +| :--------------------------------- | :--------------------------------- | :--------------------------------------------------------------------------------- | +| **PSAppDeployToolkit.Extensions/** | | | +| | PSAppDeployToolkit.Extensions.psd1 | Extensions module manifest. Contains metadata and the list of exported functions. | +| | PSAppDeployToolkit.Extensions.psm1 | Extensions module script. Contains your functions. | + +## Related + +- [Deployment Template](./deployment-template.mdx), covering the folders around the module +- [How to extend the toolkit with custom functions](../how-to/extend-the-toolkit-with-custom-functions.mdx) diff --git a/docs/reference/process-execution.mdx b/docs/reference/process-execution.mdx new file mode 100644 index 0000000..2cb7ec6 --- /dev/null +++ b/docs/reference/process-execution.mdx @@ -0,0 +1,83 @@ +--- +sidebar_position: 7 +sidebar_label: 'Process Execution Parameters' +title: 'Process Execution Parameters' +description: 'The most commonly used parameters of the PSAppDeployToolkit process execution commands.' +slug: /reference/process-execution +hide_title: true +tags: + - Process Execution + - Reference +--- + +## Process Execution Parameters + +The commands below are the ones used to run installers. Each function's page carries the complete, +generated parameter documentation; this page lists the parameters most often reached for. + +## Start-ADTProcess + +Executes a process, typically a `setup.exe`, with toolkit logging and exit-code handling. +Full documentation: [`Start-ADTProcess`](./functions/Start-ADTProcess.mdx). + +| Parameter | Description | +| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `-FilePath` | Path to the file to be executed. If the file is located directly in the **Files** directory, only the filename needs to be specified. | +| `-ArgumentList` | Arguments to be passed to the executable. | +| `-SecureArgumentList` | Hide ArgumentList from the log file. | +| `-WorkingDirectory` | The working directory used for executing the process. Defaults to the directory of the file being executed. | +| `-WindowStyle` | Style of the window of the process executed. Options: Normal, Hidden, Maximized, Minimized. | +| `-CreateNoWindow` | Used with console apps, stop a new window being created and allows capture of the standard output streams. | +| `-WaitForMsiExec` | Wait until Windows Installer is free before starting the process. | +| `-WaitForChildProcesses` | Wait for all child processes to complete. Useful for installers or uninstallers that exit early and hand off to a child process. | +| `-KillChildProcessesWithParent` | Terminate all child processes once the main process closes. Useful when an installer launches the application once complete and you want it closed. | +| `-UseUnelevatedToken` | Force the process to be started with the user's unelevated token. Useful when installing user-context apps that refuse to install when elevated, or to work around Windows 11 Administrator Protection issues. | +| `-Verb` | Use `-Verb RunAs` to force the process to run elevated. Note that this does not magically make standard users into admins. | +| `-UseShellExecute` | Useful for opening a file or URL and letting the Windows shell figure out which application to open it with. | +| `-NoWait` | Do not wait for the process to complete. This is useful for launching processes that run in the background or when you do not need to wait for the process to finish before continuing with the script. | +| `-Timeout` | Specifies the maximum time to wait for the process to complete. | +| `-TimeoutAction` | Specifies the action to take if the process does not complete within the specified timeout period. | +| `-NoTerminateOnTimeout` | Specifies that the process should be left running if the timeout is reached. | +| `-SuccessExitCodes` | List of exit codes to be considered successful. | +| `-RebootExitCodes` | List of exit codes to indicate a reboot is required. | +| `-IgnoreExitCodes` | List the exit codes to ignore, or `*` to ignore all exit codes. | +| `-PassThru` | Returns an object with ExitCode, StdOut, and StdErr output from the process. | + +## Start-ADTProcessAsUser + +Runs a process in the context of the currently logged-on user. It wraps `Start-ADTProcess` and +accepts a `-Username` parameter in addition to the parameters above. +Full documentation: [`Start-ADTProcessAsUser`](./functions/Start-ADTProcessAsUser.mdx). + +The following parameters are only relevant when starting a process as a user: + +| Parameter | Description | +| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `-UseLinkedAdminToken` | Run the process with the user's admin token if available. | +| `-InheritEnvironmentVariables` | Inherit environment variables from the current deployment process; user environment variables such as `APPDATA` are always layered on top so take precedence. | +| `-ExpandEnvironmentVariables` | Expand environment variables such as `%APPDATA%` in the file path, arguments, and working directory. | + +## Start-ADTMsiProcess + +Installs, uninstalls, repairs or patches an MSI. It also wraps `Start-ADTProcess` and shares most of +its parameters. Full documentation: [`Start-ADTMsiProcess`](./functions/Start-ADTMsiProcess.mdx). + +| Parameter | Description | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `-Action` | The action to perform on the MSI file. Options: Install, Uninstall, Repair, Patch. Defaults to Install. | +| `-FilePath` | Path to the MSI file to be executed. If the file is located directly in the **Files** directory, only the filename needs to be specified. | +| `-ProductCode` | The product code of an installed MSI; only valid for Repair/Uninstall operations. | +| `-InstalledApplication` | Allows you to perform MSI operations by piping output from the [`Get-ADTApplication`](./functions/Get-ADTApplication.mdx) function. | +| `-ArgumentList` | Arguments to be passed to the MSI file. Note that this **replaces** the default MSI parameters defined in the config (e.g. `/qn REBOOT=ReallySuppress`). | +| `-AdditionalArgumentList` | Additional arguments to be appended to the default MSI parameters defined in the config. This is what you will typically use when setting MSI properties. | +| `-Transforms` | Names of the MST transform files to be applied to the MSI. MST files should be located in the same directory as the MSI file. | +| `-Patches` | Names of the MSP patch files to be applied to the MSI. MSP files should be located in the same directory as the MSI file. | +| `-RepairMode` | Specify `Reinstall` (default) to reinstall by adding `REINSTALL=ALL REINSTALLMODE=omus` to the standard InstallParams, or `Repair` to repair via `msiexec.exe /p` (which can trigger unsuppressable reboots). | +| `-RepairFromSource` | Adds `REINSTALLMODE=vomus` to the command line to force the cached MSI to be replaced with the source MSI file. | +| `-SkipMSIAlreadyInstalledCheck` | Attempt to install if already installed, or uninstall if not detected. | + +## Related + +- [How to install applications](../how-to/install-applications.mdx) +- [Configuration Settings](./config-settings.mdx), covering the `MSI.*` defaults these commands + build on diff --git a/docs/getting-started/release-notes.mdx b/docs/reference/release-notes.mdx similarity index 96% rename from docs/getting-started/release-notes.mdx rename to docs/reference/release-notes.mdx index af0853c..5e19546 100644 --- a/docs/getting-started/release-notes.mdx +++ b/docs/reference/release-notes.mdx @@ -1,12 +1,13 @@ --- -sidebar_position: 5 +sidebar_position: 12 +sidebar_label: 'Release Notes' title: 'Release Notes' description: 'Release notes for PSAppDeployToolkit v4.1' -slug: /getting-started/release-notes +slug: /reference/release-notes hide_title: true tags: - Changes - - Getting Started + - Reference --- ## Release Notes @@ -265,8 +266,8 @@ This release strengthens Windows Installer (.msi) and Patch (.msp) deployment re - Reworked `Invoke-AppDeployToolkit.exe` to be more compliant within `WDAC` environments - Added `-NoWait` support to [Show-ADTDialogBox](../reference/functions/Show-ADTDialogBox) - Added process detection code to enable automatic silent deployments when processes aren't running -- Added `/Debug` switch to [Invoke-AppDeployToolkit.exe](../deployment-concepts/invoke-appdeploytoolkit) to show terminal output for debugging purposes -- Added `/Core` switch to [Invoke-AppDeployToolkit.exe](../deployment-concepts/invoke-appdeploytoolkit) to allow PowerShell 7 usage +- Added `/Debug` switch to [Invoke-AppDeployToolkit.exe](../explanation/the-deployment-script.mdx) to show terminal output for debugging purposes +- Added `/Core` switch to [Invoke-AppDeployToolkit.exe](../explanation/the-deployment-script.mdx) to allow PowerShell 7 usage - Added support for running processes from network drives #### ️ Changes @@ -324,19 +325,19 @@ This release strengthens Windows Installer (.msi) and Patch (.msp) deployment re #### Key Filename Changes :::info -Further changes to the deployment layout are detailed in the [Deployment Structure](../deployment-concepts/deployment-structure.mdx) page. +Further changes to the deployment layout are detailed in the [Deployment Structure](../reference/deployment-template.mdx) page. ::: | Old Name | New Name | More Information | | :--------------------------- | :---------------------------- | :---------------------------------------------------------------------------- | -| `Deploy-Application.ps1` | `Invoke-AppDeployToolkit.ps1` | [Invoke-AppDeployToolkit](../deployment-concepts/invoke-appdeploytoolkit.mdx) | -| `Deploy-Application.exe` | `Invoke-AppDeployToolkit.exe` | [Invoke-AppDeployToolkit](../deployment-concepts/invoke-appdeploytoolkit.mdx) | +| `Deploy-Application.ps1` | `Invoke-AppDeployToolkit.ps1` | [Invoke-AppDeployToolkit](../explanation/the-deployment-script.mdx) | +| `Deploy-Application.exe` | `Invoke-AppDeployToolkit.exe` | [Invoke-AppDeployToolkit](../explanation/the-deployment-script.mdx) | | `AppDeployToolkitConfig.xml` | `Config\Config.psd1` | [Configuration Settings](../reference/config-settings.mdx) | | *Was part of Config file* | `Strings\Strings.psd1` | [Language Strings](../reference/language-strings.mdx) | #### New Configuration Format -- Changed to .psd1 as the native PowerShell config file format. See [Customizing Deployments](../usage/customizing-deployments.mdx) for more information. +- Changed to .psd1 as the native PowerShell config file format. See [Customizing Deployments](../how-to/customize-a-deployment.mdx) for more information. #### Key Function Name Changes @@ -413,4 +414,4 @@ Added `-LoadProfilePaths` switch to [Get-ADTUserProfiles](../reference/functions Added support for compressing file content into a `WIM` archive and mounting it during installation. You can manage this manually using [Mount-ADTWimFile](../reference/functions/Mount-ADTWimFile.mdx) and [Dismount-ADTWimFile](../reference/functions/Dismount-ADTWimFile.mdx), or you can use the `-ForceWimDetection` switch with [Open-ADTSession](../reference/functions/Open-ADTSession.mdx) to auto-mount and dismount any `WIM` files found. -Added [Zero Config](../deployment-concepts/zero-config-deployment.mdx) feature that starts automatically if you leave the **AppName** blank, mounts any `WIM` file found, and installs the `MSI` located inside. +Added [Zero Config](../how-to/deploy-an-msi-with-zero-config.mdx) feature that starts automatically if you leave the **AppName** blank, mounts any `WIM` file found, and installs the `MSI` located inside. diff --git a/docs/getting-started/requirements.mdx b/docs/reference/requirements.mdx similarity index 91% rename from docs/getting-started/requirements.mdx rename to docs/reference/requirements.mdx index d9aebea..5aee543 100644 --- a/docs/getting-started/requirements.mdx +++ b/docs/reference/requirements.mdx @@ -1,12 +1,13 @@ --- -sidebar_position: 2 +sidebar_position: 1 +sidebar_label: 'Requirements' title: 'Requirements' description: 'The requirements for running PSAppDeployToolkit.' -slug: /getting-started/requirements +slug: /reference/requirements hide_title: true tags: - Requirements - - Getting Started + - Reference --- ## Requirements diff --git a/docs/reference/text-formatting.mdx b/docs/reference/text-formatting.mdx index 14c5314..9a0d068 100644 --- a/docs/reference/text-formatting.mdx +++ b/docs/reference/text-formatting.mdx @@ -1,28 +1,23 @@ --- -sidebar_position: 10 +sidebar_position: 9 sidebar_label: 'Text Formatting' title: 'Text Formatting' -description: 'Learn how to use rich text formatting in PSAppDeployToolkit dialogs' +description: 'The markup tags supported in PSAppDeployToolkit dialog messages.' slug: /reference/text-formatting hide_title: true tags: - Text Formatting - - UI Customization - Reference --- -## Text Formatting - -PSAppDeployToolkit v4.1 supports rich text formatting in dialog messages, allowing you to create more visually appealing and informative user interfaces. This feature works with the Fluent dialog style and supports nested formatting for complex text styling. +import ThemedImage from '@theme/ThemedImage'; -The text formatting system allows you to apply various styles to text displayed in dialogs using simple markup tags. These tags can be: - -- Used individually for simple formatting -- Combined for cumulative effects +## Text Formatting -### Supported Formatting Tags +Dialog messages support rich text formatting through markup tags. Formatting is rendered by the +Fluent dialogs and supports nesting. -#### Basic Formatting +## Tags | Tag | Description | Example | | :-------------------------------- | :----------------------------------------------------------------------- | :---------------------------------------------------------------------- | @@ -32,15 +27,13 @@ The text formatting system allows you to apply various styles to text displayed | `[url]...[/url]` | Creates a simple clickable hyperlink | `[url]https://psappdeploytoolkit.com[/url]` | | `[url=...]Link Description[/url]` | Creates a clickable hyperlink with a link description instead of the URL | `[url=https://psappdeploytoolkit.com]PSAppDeployToolkit Homepage[/url]` | -The formatting system automatically adapts to the user's theme: +Rendering adapts to the user's theme: accent colors adjust for contrast, hyperlinks take +theme-appropriate colors, and bold and italic are unchanged between themes. -- Accent colors adjust for optimal contrast -- Hyperlinks use theme-appropriate colors -- Bold and italic formatting remain consistent +## Nesting -### Nested Formatting - -The formatting system supports nesting tags for combined effects: +Tags may be nested for combined effects, and must be closed in the reverse of the order they were +opened. ```text [bold]This is bold [accent]and this is bold with accent color[/accent][/bold] @@ -50,9 +43,21 @@ The formatting system supports nesting tags for combined effects: [bold][accent][italic]All three formats combined![/italic][/accent][/bold] ``` -### Accent Color Configuration +Correct: + +```text +[bold][italic]Text[/italic][/bold] +``` + +Incorrect: + +```text +[bold][italic]Text[/bold][/italic] +``` + +## Accent color -The accent color used by `[accent]` tags can be configured in your deployment: +The color applied by `[accent]` is set in `config.psd1`: ```powershell # In Config\config.psd1 @@ -63,11 +68,12 @@ The accent color used by `[accent]` tags can be configured in your deployment: } ``` -### Usage in Dialogs +`UI.FluentAccentColorDark` sets the equivalent for dark mode. See +[Configuration Settings](./config-settings.mdx). -#### Configuration Strings +## Where formatting can be used -Text formatting can be used in your `Strings\strings.psd1` configuration: +### In strings.psd1 ```powershell @{ @@ -80,9 +86,7 @@ Text formatting can be used in your `Strings\strings.psd1` configuration: } ``` -#### Custom Messages - -You can use formatting tags in custom messages passed to dialogs: +### In messages passed to dialog commands ```powershell Show-ADTInstallationPrompt -Message "[bold]Installation Notice[/bold] @@ -92,69 +96,16 @@ Show-ADTInstallationPrompt -Message "[bold]Installation Notice[/bold] For help, visit [url]https://support.company.com[/url]" -ButtonText "OK" ``` -### Best Practices - -#### 1. Use Formatting Sparingly +## URL examples -While formatting enhances readability, overuse can make text difficult to read: - -❌ **Bad:** - -```text -[bold][italic][accent]Everything[/accent][/italic][/bold] is [bold]formatted[/bold] [italic]differently[/italic]! -``` - -✅ **Good:** - -```text -[bold]Important:[/bold] Please [accent]save your work[/accent] before continuing. -``` - -### 2. Maintain Consistency - -Use formatting consistently throughout your deployment: - -- **[bold]** for headings and important labels -- **[accent]** for critical information or warnings -- **[italic]** for supplementary information or examples -- **[url]** for support links and resources - -### 3. Consider Accessibility - -- Ensure sufficient contrast between accent colors and backgrounds -- Don't rely solely on formatting to convey critical information -- Test your formatted text in both light and dark themes - -#### 4. Close Tags Properly - -Always close tags in the reverse order they were opened: - -❌ **Incorrect:** - -```text -[bold][italic]Text[/bold][/italic] -``` - -✅ **Correct:** - -```text -[bold][italic]Text[/italic][/bold] -``` - -## URL Formatting Examples - -### Simple URL Format - -Use the simple format when you want to display the actual URL: +Displaying the URL itself: ```text Need help? Visit [url]https://support.company.com[/url] Email us at [url]support@company.com[/url] ``` -#### Descriptive URL Format - -Use the descriptive format when you want to display custom text instead of the URL: +Displaying custom link text: ```text For help, visit our [url=https://support.company.com]Support Portal[/url] @@ -162,9 +113,7 @@ Download the latest version from [url=https://github.com/PSAppDeployToolkit/PSAp Contact [url=mailto:admin@company.com]IT Support[/url] for assistance ``` -#### Mixed URL Formats - -You can combine both formats in the same text: +Both forms in one message: ```text [bold]Resources Available:[/bold] @@ -174,9 +123,9 @@ You can combine both formats in the same text: • Report Issues: [url=https://github.com/PSAppDeployToolkit/PSAppDeployToolkit/issues]Submit a Bug Report[/url] ``` -### Complex Formatting Examples +## Extended examples -#### Corporate Deployment Message +A deployment notice: ```text [bold]Software Deployment Notice[/bold] @@ -200,7 +149,18 @@ For more information, visit our [url]https://intranet.company.com/office365[/url [italic]Thank you for your cooperation.[/italic] ``` -#### Security Update Notification +Rendered, that message looks like this: + + + +A security update notification: ```text [bold][accent]SECURITY UPDATE REQUIRED[/accent][/bold] @@ -214,3 +174,9 @@ This update addresses: Learn more: [url]https://adobe.com/security[/url] ``` + +## Related + +- [Language Strings](./language-strings.mdx) +- [How to brand the user interface](../how-to/brand-the-user-interface.mdx), which covers writing + dialog copy diff --git a/docs/reference/troubleshooting.mdx b/docs/reference/troubleshooting.mdx new file mode 100644 index 0000000..72e2e01 --- /dev/null +++ b/docs/reference/troubleshooting.mdx @@ -0,0 +1,65 @@ +--- +sidebar_position: 11 +sidebar_label: 'Troubleshooting' +title: 'Troubleshooting' +description: 'Known symptoms, their causes and their resolutions.' +slug: /reference/troubleshooting +hide_title: true +tags: + - Troubleshooting + - Reference +--- + +## Troubleshooting + +A lookup table of known symptoms. For the diagnostic process, see +[How to troubleshoot a deployment](../how-to/troubleshoot-a-deployment.mdx). + +## Startup and module loading + +| Symptom | Cause | Resolution | +| :---------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------- | +| Exit code `60008`, no log file produced | The module failed to import or the session failed to open, before logging began. | Re-run with `Invoke-AppDeployToolkit.exe /Debug` to see the error on screen. | +| `A PSAppDeployToolkit assembly of a different file hash is already loaded` | A different version of the toolkit's assemblies is already loaded in the PowerShell session. Loaded DLLs cannot be unloaded. | Restart PowerShell, or test in a separate shell. Keep the installed module and the package's bundled module on the same version. | +| Exit code `60010` or `60011` | `Invoke-AppDeployToolkit.exe` could not launch, or could not execute, the PowerShell process. | Check that the requested PowerShell exists (`/Core` requires `pwsh.exe` to be installed) and that execution is not blocked by security tooling. | +| Exit code `60001` | An unhandled error in the deployment script. | Check the log for the last phase that ran, and the error record recorded with it. | +| Toolkit variables such as `$envProgramFiles` are empty | The module has not been imported and initialized yet; the `$adtSession` hashtable at the top of the script runs too early. | Use these variables inside the phase script blocks, or call [`Export-ADTEnvironmentTableToSessionState`](./functions/Export-ADTEnvironmentTableToSessionState.mdx). | +| The script fails immediately when a standard user runs it | `RequireAdmin = $true` and the process is not elevated. The launcher does not elevate itself. | Launch elevated, or set `RequireAdmin = $false` for a genuinely user-context package. | + +## User interface + +| Symptom | Cause | Resolution | +| :------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------- | +| No dialogs appear at all | `DeployMode` resolved to `Silent`: no user logged on, device in OOBE/ESP, or no processes to close running. | Check the mode and reason recorded in the log. See [Deployment Modes](../explanation/deployment-modes.mdx). | +| No dialogs during Autopilot / ESP | OOBE detection switched the deployment to `NonInteractive`. | Set `NoOobeDetection = $true` in the session properties if the UI must be shown during ESP. | +| Dialogs appear but prompts are skipped | `DeployMode` is `NonInteractive`: progress dialogs are allowed, anything needing input is suppressed. | Use `Interactive` if user input is required. | +| The Fluent UI is unavailable in a v3 compatibility deployment | The Fluent dialogs take parameters, such as `SubTitle`, that the v3 functions do not have. | Only the Classic UI is supported in compatibility mode. Convert the package to v4 native to use Fluent. | +| Branding changes have no effect | A Group Policy setting is overriding the package's `config.psd1`. | Policy wins. See [Configuration](../explanation/configuration.mdx). | +| The banner is ignored | Banners are used by the Classic dialogs only. | Replace `Assets\AppIcon.png`, or set `Assets.Logo`, for the Fluent dialogs. | + +## Installing and uninstalling + +| Symptom | Cause | Resolution | +| :---------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------ | :------------------------------------------------------------------------------------------------------------------ | +| Uninstalling an MSI returns `1605` | The product is not installed. Common when a per-user install was made under a different account. | Use `-IgnoreExitCodes 1605` on [`Uninstall-ADTApplication`](./functions/Uninstall-ADTApplication.mdx). | +| The deployment succeeds but the application is not installed | The installer spawned a child process and exited early. | Add `-WaitForChildProcesses` to [`Start-ADTProcess`](./functions/Start-ADTProcess.mdx). | +| An MSI property is ignored | `-ArgumentList` replaces the configured default MSI parameters rather than adding to them. | Use `-AdditionalArgumentList` for properties. | +| Zero-config picks the wrong MSI | More than one MSI is present in `Files`; the first is used. | Leave only one MSI, or script the install explicitly. | +| A transform is not applied in zero-config mode | The MST filename does not match the MSI filename. | Rename the MST to match, e.g. `test01.msi` and `test01.mst`. | +| An installer fails only when run by the toolkit | The toolkit runs as SYSTEM; the installer expects a user context, or refuses to run elevated. | Try `-UseUnelevatedToken`, or run the step with [`Start-ADTProcessAsUser`](./functions/Start-ADTProcessAsUser.mdx). | + +## Deferral and retries + +| Symptom | Cause | Resolution | +| :------------------------------------------------------------- | :--------------------------------------------------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------- | +| The user is re-prompted moments after deferring | The management system retried. Intune's retry interval is short and not configurable. | Set `-DeferRunInterval` on [`Show-ADTInstallationWelcome`](./functions/Show-ADTInstallationWelcome.mdx). | +| A deferral is recorded as a failed deployment | The deferral exit code, `1602` by default, is not mapped to a retry. | Map `1602` to *Retry* in Intune, or set `UI.DeferExitCode` to `1618` for Configuration Manager fast retry. | +| Reboot exit codes are reported as failures | `3010` and `1641` are not mapped in the management system. | Map them, or use `-SuppressRebootPassThru` to return `0`. | + +## Packages and versions + +| Symptom | Cause | Resolution | +| :----------------------------------------------------------- | :----------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------ | +| A package works on the packaging machine but not on endpoints | The endpoint has a different toolkit version pre-installed than the one the package was tested with. | Ship the module inside the package, or standardize the pre-installed version. See the [FAQ](./faq.mdx). | +| An upgrade from v4.0 to v4.1 fails at session open | `RequireAdmin`, `OobeDetection` or `SessionDetection` are still set in `config.psd1`. | Remove them and set the equivalents as session properties. See [upgrading from v4.0](../how-to/upgrade-from-v4-0.mdx). | +| A converted v3 script is missing custom logic | `Convert-ADTDeployment` transfers only the Install, Uninstall and Repair blocks and known variables. | Port the remaining code by hand. See [upgrading from v3](../how-to/upgrade-from-v3.mdx). | diff --git a/docs/reference/v4-function-mapping.mdx b/docs/reference/v4-function-mapping.mdx index 471997c..a6741ad 100644 --- a/docs/reference/v4-function-mapping.mdx +++ b/docs/reference/v4-function-mapping.mdx @@ -16,89 +16,89 @@ The following table lists the v3 functions and their compatibility with v4. If a | v3 Function | Compat Wrapper? | v4 Function | | :-------------------------------------------------------------------------------------------------------------------------------------- | :-------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Block-AppExecution](/versioned_docs/version-3.10.2/reference/functions/Block-AppExecution.mdx) | Yes | [Block-ADTAppExecution](/versioned_docs/version-4.0.x/reference/functions/Block-ADTAppExecution.mdx) | -| [Close-InstallationProgress](/versioned_docs/version-3.10.2/reference/functions/Close-InstallationProgress.mdx) | Yes | [Close-ADTInstallationProgress](/versioned_docs/version-4.0.x/reference/functions/Close-ADTInstallationProgress.mdx) | -| [Configure-EdgeExtension](/versioned_docs/version-3.10.2/reference/functions/Configure-EdgeExtension.mdx) | Yes | [Add-ADTEdgeExtension](/versioned_docs/version-4.0.x/reference/functions/Add-ADTEdgeExtension.mdx) / [Remove-ADTEdgeExtension](/versioned_docs/version-4.0.x/reference/functions/Remove-ADTEdgeExtension.mdx) | -| [Convert-RegistryPath](/versioned_docs/version-3.10.2/reference/functions/Convert-RegistryPath.mdx) | Yes | [Convert-ADTRegistryPath](/versioned_docs/version-4.0.x/reference/functions/Convert-ADTRegistryPath.mdx) | -| [ConvertTo-NTAccountOrSID](/versioned_docs/version-3.10.2/reference/functions/ConvertTo-NTAccountOrSID.mdx) | Yes | [ConvertTo-ADTNTAccountOrSID](/versioned_docs/version-4.0.x/reference/functions/ConvertTo-ADTNTAccountOrSID.mdx) | -| [Copy-ContentToCache](/versioned_docs/version-3.10.2/reference/functions/Copy-ContentToCache.mdx) | Yes | [Copy-ADTContentToCache](/versioned_docs/version-4.0.x/reference/functions/Copy-ADTContentToCache.mdx) | -| [Copy-File](/versioned_docs/version-3.10.2/reference/functions/Copy-File.mdx) | Yes | [Copy-ADTFile](/versioned_docs/version-4.0.x/reference/functions/Copy-ADTFile.mdx) | -| [Copy-FileToUserProfiles](/versioned_docs/version-3.10.2/reference/functions/Copy-FileToUserProfiles.mdx) | Yes | [Copy-ADTFileToUserProfiles](/versioned_docs/version-4.0.x/reference/functions/Copy-ADTFileToUserProfiles.mdx) | -| [Disable-TerminalServerInstallMode](/versioned_docs/version-3.10.2/reference/functions/Disable-TerminalServerInstallMode.mdx) | Yes | [Disable-ADTTerminalServerInstallMode](/versioned_docs/version-4.0.x/reference/functions/Disable-ADTTerminalServerInstallMode.mdx) | -| [Enable-TerminalServerInstallMode](/versioned_docs/version-3.10.2/reference/functions/Enable-TerminalServerInstallMode.mdx) | Yes | [Enable-ADTTerminalServerInstallMode](/versioned_docs/version-4.0.x/reference/functions/Enable-ADTTerminalServerInstallMode.mdx) | -| [Execute-MSI](/versioned_docs/version-3.10.2/reference/functions/Execute-MSI.mdx) | Yes | [Start-ADTMsiProcess](/versioned_docs/version-4.0.x/reference/functions/Start-ADTMsiProcess.mdx) | -| [Execute-MSP](/versioned_docs/version-3.10.2/reference/functions/Execute-MSP.mdx) | Yes | [Start-ADTMspProcess](/versioned_docs/version-4.0.x/reference/functions/Start-ADTMspProcess.mdx) | -| [Execute-Process](/versioned_docs/version-3.10.2/reference/functions/Execute-Process.mdx) | Yes | [Start-ADTProcess](/versioned_docs/version-4.0.x/reference/functions/Start-ADTProcess.mdx) | -| [Execute-ProcessAsUser](/versioned_docs/version-3.10.2/reference/functions/Execute-ProcessAsUser.mdx) | Yes | [Start-ADTProcessAsUser](/versioned_docs/version-4.0.x/reference/functions/Start-ADTProcessAsUser.mdx) | -| [Exit-Script](/versioned_docs/version-3.10.2/reference/functions/Exit-Script.mdx) | Yes | [Close-ADTSession](/versioned_docs/version-4.0.x/reference/functions/Close-ADTSession.mdx) | -| [Get-DeferHistory](/versioned_docs/version-3.10.2/reference/functions/Get-DeferHistory.mdx) | Yes | [Get-ADTDeferHistory](/versioned_docs/version-4.0.x/reference/functions/Get-ADTDeferHistory.mdx) | -| [Get-FileVersion](/versioned_docs/version-3.10.2/reference/functions/Get-FileVersion.mdx) | Yes | [Get-ADTFileVersion](/versioned_docs/version-4.0.x/reference/functions/Get-ADTFileVersion.mdx) | -| [Get-FreeDiskSpace](/versioned_docs/version-3.10.2/reference/functions/Get-FreeDiskSpace.mdx) | Yes | [Get-ADTFreeDiskSpace](/versioned_docs/version-4.0.x/reference/functions/Get-ADTFreeDiskSpace.mdx) | -| [Get-HardwarePlatform](/versioned_docs/version-3.10.2/reference/functions/Get-HardwarePlatform.mdx) | Yes | Deprecated | -| [Get-IniValue](/versioned_docs/version-3.10.2/reference/functions/Get-IniValue.mdx) | Yes | [Get-ADTIniValue](/versioned_docs/version-4.0.x/reference/functions/Get-ADTIniValue.mdx) | -| [Get-InstalledApplication](/versioned_docs/version-3.10.2/reference/functions/Get-InstalledApplication.mdx) | Yes | [Get-ADTApplication](/versioned_docs/version-4.0.x/reference/functions/Get-ADTApplication.mdx) | -| [Get-LoggedOnUser](/versioned_docs/version-3.10.2/reference/functions/Get-LoggedOnUser.mdx) | Yes | [Get-ADTLoggedOnUser](/versioned_docs/version-4.0.x/reference/functions/Get-ADTLoggedOnUser.mdx) | -| [Get-MsiExitCodeMessage](/versioned_docs/version-3.10.2/reference/functions/Get-MsiExitCodeMessage.mdx) | Yes | [Get-ADTMsiExitCodeMessage](/versioned_docs/version-4.0.x/reference/functions/Get-ADTMsiExitCodeMessage.mdx) | -| [Get-MsiTableProperty](/versioned_docs/version-3.10.2/reference/functions/Get-MsiTableProperty.mdx) | Yes | [Get-ADTMsiTableProperty](/versioned_docs/version-4.0.x/reference/functions/Get-ADTMsiTableProperty.mdx) | -| [Get-ObjectProperty](/versioned_docs/version-3.10.2/reference/functions/Get-ObjectProperty.mdx) | Yes | [Get-ADTObjectProperty](/versioned_docs/version-4.0.x/reference/functions/Get-ADTObjectProperty.mdx) | -| [Get-PEFileArchitecture](/versioned_docs/version-3.10.2/reference/functions/Get-PEFileArchitecture.mdx) | Yes | [Get-ADTPEFileArchitecture](/versioned_docs/version-4.0.x/reference/functions/Get-ADTPEFileArchitecture.mdx) | -| [Get-PendingReboot](/versioned_docs/version-3.10.2/reference/functions/Get-PendingReboot.mdx) | Yes | [Get-ADTPendingReboot](/versioned_docs/version-4.0.x/reference/functions/Get-ADTPendingReboot.mdx) | -| [Get-RegistryKey](/versioned_docs/version-3.10.2/reference/functions/Get-RegistryKey.mdx) | Yes | [Get-ADTRegistryKey](/versioned_docs/version-4.0.x/reference/functions/Get-ADTRegistryKey.mdx) | -| [Get-RunningProcesses](/versioned_docs/version-3.10.2/reference/functions/Get-RunningProcesses.mdx) | **NO** | Get-ADTRunningProcesses | -| [Get-SchedulerTask](/versioned_docs/version-3.10.2/reference/functions/Get-SchedulerTask.mdx) | Yes | [Get-ADTSchedulerTask](/versioned_docs/version-4.0.x/reference/functions/Get-ADTSchedulerTask.mdx) | -| [Get-ServiceStartMode](/versioned_docs/version-3.10.2/reference/functions/Get-ServiceStartMode.mdx) | Yes | [Get-ADTServiceStartMode](/versioned_docs/version-4.0.x/reference/functions/Get-ADTServiceStartMode.mdx) | -| [Get-Shortcut](/versioned_docs/version-3.10.2/reference/functions/Get-Shortcut.mdx) | Yes | [Get-ADTShortcut](/versioned_docs/version-4.0.x/reference/functions/Get-ADTShortcut.mdx) | -| [Get-UniversalDate](/versioned_docs/version-3.10.2/reference/functions/Get-UniversalDate.mdx) | Yes | [Get-ADTUniversalDate](/versioned_docs/version-4.0.x/reference/functions/Get-ADTUniversalDate.mdx) | -| [Get-UserProfiles](/versioned_docs/version-3.10.2/reference/functions/Get-UserProfiles.mdx) | Yes | [Get-ADTUserProfiles](/versioned_docs/version-4.0.x/reference/functions/Get-ADTUserProfiles.mdx) | -| [Get-WindowTitle](/versioned_docs/version-3.10.2/reference/functions/Get-WindowTitle.mdx) | Yes | [Get-ADTWindowTitle](/versioned_docs/version-4.0.x/reference/functions/Get-ADTWindowTitle.mdx) | -| [Install-MSUpdates](/versioned_docs/version-3.10.2/reference/functions/Install-MSUpdates.mdx) | Yes | [Install-ADTMSUpdates](/versioned_docs/version-4.0.x/reference/functions/Install-ADTMSUpdates.mdx) | -| [Install-SCCMSoftwareUpdates](/versioned_docs/version-3.10.2/reference/functions/Install-SCCMSoftwareUpdates.mdx) | Yes | [Install-ADTSCCMSoftwareUpdates](/versioned_docs/version-4.0.x/reference/functions/Install-ADTSCCMSoftwareUpdates.mdx) | -| [Invoke-HKCURegistrySettingsForAllUsers](/versioned_docs/version-3.10.2/reference/functions/Invoke-HKCURegistrySettingsForAllUsers.mdx) | Yes | [Invoke-ADTAllUsersRegistryAction](/versioned_docs/version-4.0.x/reference/functions/Invoke-ADTAllUsersRegistryAction.mdx) | -| [Invoke-ObjectMethod](/versioned_docs/version-3.10.2/reference/functions/Invoke-ObjectMethod.mdx) | Yes | [Invoke-ADTObjectMethod](/versioned_docs/version-4.0.x/reference/functions/Invoke-ADTObjectMethod.mdx) | -| [Invoke-RegisterOrUnregisterDLL](/versioned_docs/version-3.10.2/reference/functions/Invoke-RegisterOrUnregisterDLL.mdx) | Yes | [Invoke-ADTRegSvr32](/versioned_docs/version-4.0.x/reference/functions/Invoke-ADTRegSvr32.mdx) / [Register-ADTDll](/versioned_docs/version-4.0.x/reference/functions/Register-ADTDll.mdx) / [Unregister-ADTDll](/versioned_docs/version-4.0.x/reference/functions/Unregister-ADTDll.mdx) | -| [Invoke-SCCMTask](/versioned_docs/version-3.10.2/reference/functions/Invoke-SCCMTask.mdx) | Yes | [Invoke-ADTSCCMTask](/versioned_docs/version-4.0.x/reference/functions/Invoke-ADTSCCMTask.mdx) | -| [New-Folder](/versioned_docs/version-3.10.2/reference/functions/New-Folder.mdx) | Yes | [New-ADTFolder](/versioned_docs/version-4.0.x/reference/functions/New-ADTFolder.mdx) | -| [New-MsiTransform](/versioned_docs/version-3.10.2/reference/functions/New-MsiTransform.mdx) | Yes | [New-ADTMsiTransform](/versioned_docs/version-4.0.x/reference/functions/New-ADTMsiTransform.mdx) | -| [New-Shortcut](/versioned_docs/version-3.10.2/reference/functions/New-Shortcut.mdx) | Yes | [New-ADTShortcut](/versioned_docs/version-4.0.x/reference/functions/New-ADTShortcut.mdx) | -| [New-ZipFile](/versioned_docs/version-3.10.2/reference/functions/New-ZipFile.mdx) | Yes | [New-ADTZipFile](/versioned_docs/version-4.0.x/reference/functions/New-ADTZipFile.mdx) | -| [Remove-ContentFromCache](/versioned_docs/version-3.10.2/reference/functions/Remove-ContentFromCache.mdx) | Yes | [Remove-ADTContentFromCache](/versioned_docs/version-4.0.x/reference/functions/Remove-ADTContentFromCache.mdx) | -| [Remove-File](/versioned_docs/version-3.10.2/reference/functions/Remove-File.mdx) | Yes | [Remove-ADTFile](/versioned_docs/version-4.0.x/reference/functions/Remove-ADTFile.mdx) | -| [Remove-FileFromUserProfiles](/versioned_docs/version-3.10.2/reference/functions/Remove-FileFromUserProfiles.mdx) | Yes | [Remove-ADTFileFromUserProfiles](/versioned_docs/version-4.0.x/reference/functions/Remove-ADTFileFromUserProfiles.mdx) | -| [Remove-Folder](/versioned_docs/version-3.10.2/reference/functions/Remove-Folder.mdx) | Yes | [Remove-ADTFolder](/versioned_docs/version-4.0.x/reference/functions/Remove-ADTFolder.mdx) | -| [Remove-InvalidFileNameChars](/versioned_docs/version-3.10.2/reference/functions/Remove-InvalidFileNameChars.mdx) | Yes | [Remove-ADTInvalidFileNameChars](/versioned_docs/version-4.0.x/reference/functions/Remove-ADTInvalidFileNameChars.mdx) | -| [Remove-MSIApplications](/versioned_docs/version-3.10.2/reference/functions/Remove-MSIApplications.mdx) | Yes | [Uninstall-ADTApplication](/versioned_docs/version-4.0.x/reference/functions/Uninstall-ADTApplication.mdx) | -| [Remove-RegistryKey](/versioned_docs/version-3.10.2/reference/functions/Remove-RegistryKey.mdx) | Yes | [Remove-ADTRegistryKey](/versioned_docs/version-4.0.x/reference/functions/Remove-ADTRegistryKey.mdx) | -| [Resolve-Error](/versioned_docs/version-3.10.2/reference/functions/Resolve-Error.mdx) | Yes | [Resolve-ADTErrorRecord](/versioned_docs/version-4.0.x/reference/functions/Resolve-ADTErrorRecord.mdx) | -| [Resolve-Parameters](/versioned_docs/version-3.10.2/reference/functions/Resolve-Parameters.mdx) | **NO** | Resolve-ADTBoundParameters | -| [Send-Keys](/versioned_docs/version-3.10.2/reference/functions/Send-Keys.mdx) | Yes | [Send-ADTKeys](/versioned_docs/version-4.0.x/reference/functions/Send-ADTKeys.mdx) | -| [Set-ActiveSetup](/versioned_docs/version-3.10.2/reference/functions/Set-ActiveSetup.mdx) | Yes | [Set-ADTActiveSetup](/versioned_docs/version-4.0.x/reference/functions/Set-ADTActiveSetup.mdx) | -| [Set-DeferHistory](/versioned_docs/version-3.10.2/reference/functions/Set-DeferHistory.mdx) | Yes | [Set-ADTDeferHistory](/versioned_docs/version-4.0.x/reference/functions/Set-ADTDeferHistory.mdx) | -| [Set-IniValue](/versioned_docs/version-3.10.2/reference/functions/Set-IniValue.mdx) | Yes | [Set-ADTIniValue](/versioned_docs/version-4.0.x/reference/functions/Set-ADTIniValue.mdx) | -| [Set-ItemPermission](/versioned_docs/version-3.10.2/reference/functions/Set-ItemPermission.mdx) | Yes | [Set-ADTItemPermission](/versioned_docs/version-4.0.x/reference/functions/Set-ADTItemPermission.mdx) | -| [Set-MsiProperty](/versioned_docs/version-3.10.2/reference/functions/Set-MsiProperty.mdx) | Yes | [Set-ADTMsiProperty](/versioned_docs/version-4.0.x/reference/functions/Set-ADTMsiProperty.mdx) | -| [Set-PinnedApplication](/versioned_docs/version-3.10.2/reference/functions/Set-PinnedApplication.mdx) | Yes | Deprecated | -| [Set-RegistryKey](/versioned_docs/version-3.10.2/reference/functions/Set-RegistryKey.mdx) | Yes | [Set-ADTRegistryKey](/versioned_docs/version-4.0.x/reference/functions/Set-ADTRegistryKey.mdx) | -| [Set-ServiceStartMode](/versioned_docs/version-3.10.2/reference/functions/Set-ServiceStartMode.mdx) | Yes | [Set-ADTServiceStartMode](/versioned_docs/version-4.0.x/reference/functions/Set-ADTServiceStartMode.mdx) | -| [Set-Shortcut](/versioned_docs/version-3.10.2/reference/functions/Set-Shortcut.mdx) | Yes | [Set-ADTShortcut](/versioned_docs/version-4.0.x/reference/functions/Set-ADTShortcut.mdx) | -| [Show-BalloonTip](/versioned_docs/version-3.10.2/reference/functions/Show-BalloonTip.mdx) | Yes | [Show-ADTBalloonTip](/versioned_docs/version-4.0.x/reference/functions/Show-ADTBalloonTip.mdx) | -| [Show-DialogBox](/versioned_docs/version-3.10.2/reference/functions/Show-DialogBox.mdx) | Yes | [Show-ADTDialogBox](/versioned_docs/version-4.0.x/reference/functions/Show-ADTDialogBox.mdx) | -| [Show-InstallationProgress](/versioned_docs/version-3.10.2/reference/functions/Show-InstallationProgress.mdx) | Yes | [Show-ADTInstallationProgress](/versioned_docs/version-4.0.x/reference/functions/Show-ADTInstallationProgress.mdx) | -| [Show-InstallationPrompt](/versioned_docs/version-3.10.2/reference/functions/Show-InstallationPrompt.mdx) | Yes | [Show-ADTInstallationPrompt](/versioned_docs/version-4.0.x/reference/functions/Show-ADTInstallationPrompt.mdx) | -| [Show-InstallationRestartPrompt](/versioned_docs/version-3.10.2/reference/functions/Show-InstallationRestartPrompt.mdx) | Yes | [Show-ADTInstallationRestartPrompt](/versioned_docs/version-4.0.x/reference/functions/Show-ADTInstallationRestartPrompt.mdx) | -| [Show-InstallationWelcome](/versioned_docs/version-3.10.2/reference/functions/Show-InstallationWelcome.mdx) | Yes | [Show-ADTInstallationWelcome](/versioned_docs/version-4.0.x/reference/functions/Show-ADTInstallationWelcome.mdx) | -| [Show-WelcomePrompt](/versioned_docs/version-3.10.2/reference/functions/Show-WelcomePrompt.mdx) | **NO** | [Show-ADTInstallationWelcome](/versioned_docs/version-4.0.x/reference/functions/Show-ADTInstallationWelcome.mdx) | -| [Start-ServiceAndDependencies](/versioned_docs/version-3.10.2/reference/functions/Start-ServiceAndDependencies.mdx) | Yes | [Start-ADTServiceAndDependencies](/versioned_docs/version-4.0.x/reference/functions/Start-ADTServiceAndDependencies.mdx) | -| [Stop-ServiceAndDependencies](/versioned_docs/version-3.10.2/reference/functions/Stop-ServiceAndDependencies.mdx) | Yes | [Stop-ADTServiceAndDependencies](/versioned_docs/version-4.0.x/reference/functions/Stop-ADTServiceAndDependencies.mdx) | -| [Test-Battery](/versioned_docs/version-3.10.2/reference/functions/Test-Battery.mdx) | Yes | [Test-ADTBattery](/versioned_docs/version-4.0.x/reference/functions/Test-ADTBattery.mdx) | -| [Test-IsMutexAvailable](/versioned_docs/version-3.10.2/reference/functions/Test-IsMutexAvailable.mdx) | Yes | [Test-ADTMutexAvailability](/versioned_docs/version-4.0.x/reference/functions/Test-ADTMutexAvailability.mdx) | -| [Test-MSUpdates](/versioned_docs/version-3.10.2/reference/functions/Test-MSUpdates.mdx) | Yes | [Test-ADTMSUpdates](/versioned_docs/version-4.0.x/reference/functions/Test-ADTMSUpdates.mdx) | -| [Test-NetworkConnection](/versioned_docs/version-3.10.2/reference/functions/Test-NetworkConnection.mdx) | Yes | [Test-ADTNetworkConnection](/versioned_docs/version-4.0.x/reference/functions/Test-ADTNetworkConnection.mdx) | -| [Test-PowerPoint](/versioned_docs/version-3.10.2/reference/functions/Test-PowerPoint.mdx) | Yes | [Test-ADTPowerPoint](/versioned_docs/version-4.0.x/reference/functions/Test-ADTPowerPoint.mdx) | -| [Test-RegistryValue](/versioned_docs/version-3.10.2/reference/functions/Test-RegistryValue.mdx) | Yes | [Test-ADTRegistryValue](/versioned_docs/version-4.0.x/reference/functions/Test-ADTRegistryValue.mdx) | -| [Test-ServiceExists](/versioned_docs/version-3.10.2/reference/functions/Test-ServiceExists.mdx) | Yes | [Test-ADTServiceExists](/versioned_docs/version-4.0.x/reference/functions/Test-ADTServiceExists.mdx) | -| [Unblock-AppExecution](/versioned_docs/version-3.10.2/reference/functions/Unblock-AppExecution.mdx) | Yes | [Unblock-ADTAppExecution](/versioned_docs/version-4.0.x/reference/functions/Unblock-ADTAppExecution.mdx) | -| [Update-Desktop](/versioned_docs/version-3.10.2/reference/functions/Update-Desktop.mdx) | Yes | [Update-ADTDesktop](/versioned_docs/version-4.0.x/reference/functions/Update-ADTDesktop.mdx) | -| [Update-GroupPolicy](/versioned_docs/version-3.10.2/reference/functions/Update-GroupPolicy.mdx) | Yes | [Update-ADTGroupPolicy](/versioned_docs/version-4.0.x/reference/functions/Update-ADTGroupPolicy.mdx) | -| [Update-SessionEnvironmentVariables](/versioned_docs/version-3.10.2/reference/functions/Update-SessionEnvironmentVariables.mdx) | Yes | [Update-ADTEnvironmentPsProvider](/versioned_docs/version-4.0.x/reference/functions/Update-ADTEnvironmentPsProvider.mdx) | -| [Write-FunctionHeaderOrFooter](/versioned_docs/version-3.10.2/reference/functions/Write-FunctionHeaderOrFooter.mdx) | **NO** | [Initialize-ADTFunction](/versioned_docs/version-4.0.x/reference/functions/Initialize-ADTFunction.mdx) / [Complete-ADTFunction](/versioned_docs/version-4.0.x/reference/functions/Complete-ADTFunction.mdx) | -| [Write-Log](/versioned_docs/version-3.10.2/reference/functions/Write-Log.mdx) | Yes | [Write-ADTLogEntry](/versioned_docs/version-4.0.x/reference/functions/Write-ADTLogEntry.mdx) | +| [Block-AppExecution](/docs/3.10.2/reference/functions/Block-AppExecution) | Yes | [Block-ADTAppExecution](./functions/Block-ADTAppExecution.mdx) | +| [Close-InstallationProgress](/docs/3.10.2/reference/functions/Close-InstallationProgress) | Yes | [Close-ADTInstallationProgress](./functions/Close-ADTInstallationProgress.mdx) | +| [Configure-EdgeExtension](/docs/3.10.2/reference/functions/Configure-EdgeExtension) | Yes | [Add-ADTEdgeExtension](./functions/Add-ADTEdgeExtension.mdx) / [Remove-ADTEdgeExtension](./functions/Remove-ADTEdgeExtension.mdx) | +| [Convert-RegistryPath](/docs/3.10.2/reference/functions/Convert-RegistryPath) | Yes | [Convert-ADTRegistryPath](./functions/Convert-ADTRegistryPath.mdx) | +| [ConvertTo-NTAccountOrSID](/docs/3.10.2/reference/functions/ConvertTo-NTAccountOrSID) | Yes | [ConvertTo-ADTNTAccountOrSID](./functions/ConvertTo-ADTNTAccountOrSID.mdx) | +| [Copy-ContentToCache](/docs/3.10.2/reference/functions/Copy-ContentToCache) | Yes | [Copy-ADTContentToCache](./functions/Copy-ADTContentToCache.mdx) | +| [Copy-File](/docs/3.10.2/reference/functions/Copy-File) | Yes | [Copy-ADTFile](./functions/Copy-ADTFile.mdx) | +| [Copy-FileToUserProfiles](/docs/3.10.2/reference/functions/Copy-FileToUserProfiles) | Yes | [Copy-ADTFileToUserProfiles](./functions/Copy-ADTFileToUserProfiles.mdx) | +| [Disable-TerminalServerInstallMode](/docs/3.10.2/reference/functions/Disable-TerminalServerInstallMode) | Yes | [Disable-ADTTerminalServerInstallMode](./functions/Disable-ADTTerminalServerInstallMode.mdx) | +| [Enable-TerminalServerInstallMode](/docs/3.10.2/reference/functions/Enable-TerminalServerInstallMode) | Yes | [Enable-ADTTerminalServerInstallMode](./functions/Enable-ADTTerminalServerInstallMode.mdx) | +| [Execute-MSI](/docs/3.10.2/reference/functions/Execute-MSI) | Yes | [Start-ADTMsiProcess](./functions/Start-ADTMsiProcess.mdx) | +| [Execute-MSP](/docs/3.10.2/reference/functions/Execute-MSP) | Yes | [Start-ADTMspProcess](./functions/Start-ADTMspProcess.mdx) | +| [Execute-Process](/docs/3.10.2/reference/functions/Execute-Process) | Yes | [Start-ADTProcess](./functions/Start-ADTProcess.mdx) | +| [Execute-ProcessAsUser](/docs/3.10.2/reference/functions/Execute-ProcessAsUser) | Yes | [Start-ADTProcessAsUser](./functions/Start-ADTProcessAsUser.mdx) | +| [Exit-Script](/docs/3.10.2/reference/functions/Exit-Script) | Yes | [Close-ADTSession](./functions/Close-ADTSession.mdx) | +| [Get-DeferHistory](/docs/3.10.2/reference/functions/Get-DeferHistory) | Yes | [Get-ADTDeferHistory](./functions/Get-ADTDeferHistory.mdx) | +| [Get-FileVersion](/docs/3.10.2/reference/functions/Get-FileVersion) | Yes | [Get-ADTFileVersion](./functions/Get-ADTFileVersion.mdx) | +| [Get-FreeDiskSpace](/docs/3.10.2/reference/functions/Get-FreeDiskSpace) | Yes | [Get-ADTFreeDiskSpace](./functions/Get-ADTFreeDiskSpace.mdx) | +| [Get-HardwarePlatform](/docs/3.10.2/reference/functions/Get-HardwarePlatform) | Yes | Deprecated | +| [Get-IniValue](/docs/3.10.2/reference/functions/Get-IniValue) | Yes | [Get-ADTIniValue](./functions/Get-ADTIniValue.mdx) | +| [Get-InstalledApplication](/docs/3.10.2/reference/functions/Get-InstalledApplication) | Yes | [Get-ADTApplication](./functions/Get-ADTApplication.mdx) | +| [Get-LoggedOnUser](/docs/3.10.2/reference/functions/Get-LoggedOnUser) | Yes | [Get-ADTLoggedOnUser](./functions/Get-ADTLoggedOnUser.mdx) | +| [Get-MsiExitCodeMessage](/docs/3.10.2/reference/functions/Get-MsiExitCodeMessage) | Yes | [Get-ADTMsiExitCodeMessage](./functions/Get-ADTMsiExitCodeMessage.mdx) | +| [Get-MsiTableProperty](/docs/3.10.2/reference/functions/Get-MsiTableProperty) | Yes | [Get-ADTMsiTableProperty](./functions/Get-ADTMsiTableProperty.mdx) | +| [Get-ObjectProperty](/docs/3.10.2/reference/functions/Get-ObjectProperty) | Yes | [Get-ADTObjectProperty](./functions/Get-ADTObjectProperty.mdx) | +| [Get-PEFileArchitecture](/docs/3.10.2/reference/functions/Get-PEFileArchitecture) | Yes | [Get-ADTPEFileArchitecture](./functions/Get-ADTPEFileArchitecture.mdx) | +| [Get-PendingReboot](/docs/3.10.2/reference/functions/Get-PendingReboot) | Yes | [Get-ADTPendingReboot](./functions/Get-ADTPendingReboot.mdx) | +| [Get-RegistryKey](/docs/3.10.2/reference/functions/Get-RegistryKey) | Yes | [Get-ADTRegistryKey](./functions/Get-ADTRegistryKey.mdx) | +| [Get-RunningProcesses](/docs/3.10.2/reference/functions/Get-RunningProcesses) | **NO** | Get-ADTRunningProcesses | +| [Get-SchedulerTask](/docs/3.10.2/reference/functions/Get-SchedulerTask) | Yes | `Get-ADTSchedulerTask` (removed in 4.2) | +| [Get-ServiceStartMode](/docs/3.10.2/reference/functions/Get-ServiceStartMode) | Yes | [Get-ADTServiceStartMode](./functions/Get-ADTServiceStartMode.mdx) | +| [Get-Shortcut](/docs/3.10.2/reference/functions/Get-Shortcut) | Yes | [Get-ADTShortcut](./functions/Get-ADTShortcut.mdx) | +| [Get-UniversalDate](/docs/3.10.2/reference/functions/Get-UniversalDate) | Yes | `Get-ADTUniversalDate` (removed in 4.2) | +| [Get-UserProfiles](/docs/3.10.2/reference/functions/Get-UserProfiles) | Yes | [Get-ADTUserProfiles](./functions/Get-ADTUserProfiles.mdx) | +| [Get-WindowTitle](/docs/3.10.2/reference/functions/Get-WindowTitle) | Yes | [Get-ADTWindowTitle](./functions/Get-ADTWindowTitle.mdx) | +| [Install-MSUpdates](/docs/3.10.2/reference/functions/Install-MSUpdates) | Yes | [Install-ADTMSUpdates](./functions/Install-ADTMSUpdates.mdx) | +| [Install-SCCMSoftwareUpdates](/docs/3.10.2/reference/functions/Install-SCCMSoftwareUpdates) | Yes | [Install-ADTSCCMSoftwareUpdates](./functions/Install-ADTSCCMSoftwareUpdates.mdx) | +| [Invoke-HKCURegistrySettingsForAllUsers](/docs/3.10.2/reference/functions/Invoke-HKCURegistrySettingsForAllUsers) | Yes | [Invoke-ADTAllUsersRegistryAction](./functions/Invoke-ADTAllUsersRegistryAction.mdx) | +| [Invoke-ObjectMethod](/docs/3.10.2/reference/functions/Invoke-ObjectMethod) | Yes | [Invoke-ADTObjectMethod](./functions/Invoke-ADTObjectMethod.mdx) | +| [Invoke-RegisterOrUnregisterDLL](/docs/3.10.2/reference/functions/Invoke-RegisterOrUnregisterDLL) | Yes | [Invoke-ADTRegSvr32](./functions/Invoke-ADTRegSvr32.mdx) / [Register-ADTDll](./functions/Register-ADTDll.mdx) / [Unregister-ADTDll](./functions/Unregister-ADTDll.mdx) | +| [Invoke-SCCMTask](/docs/3.10.2/reference/functions/Invoke-SCCMTask) | Yes | [Invoke-ADTSCCMTask](./functions/Invoke-ADTSCCMTask.mdx) | +| [New-Folder](/docs/3.10.2/reference/functions/New-Folder) | Yes | [New-ADTFolder](./functions/New-ADTFolder.mdx) | +| [New-MsiTransform](/docs/3.10.2/reference/functions/New-MsiTransform) | Yes | [New-ADTMsiTransform](./functions/New-ADTMsiTransform.mdx) | +| [New-Shortcut](/docs/3.10.2/reference/functions/New-Shortcut) | Yes | [New-ADTShortcut](./functions/New-ADTShortcut.mdx) | +| [New-ZipFile](/docs/3.10.2/reference/functions/New-ZipFile) | Yes | [New-ADTZipFile](./functions/New-ADTZipFile.mdx) | +| [Remove-ContentFromCache](/docs/3.10.2/reference/functions/Remove-ContentFromCache) | Yes | [Remove-ADTContentFromCache](./functions/Remove-ADTContentFromCache.mdx) | +| [Remove-File](/docs/3.10.2/reference/functions/Remove-File) | Yes | [Remove-ADTFile](./functions/Remove-ADTFile.mdx) | +| [Remove-FileFromUserProfiles](/docs/3.10.2/reference/functions/Remove-FileFromUserProfiles) | Yes | [Remove-ADTFileFromUserProfiles](./functions/Remove-ADTFileFromUserProfiles.mdx) | +| [Remove-Folder](/docs/3.10.2/reference/functions/Remove-Folder) | Yes | [Remove-ADTFolder](./functions/Remove-ADTFolder.mdx) | +| [Remove-InvalidFileNameChars](/docs/3.10.2/reference/functions/Remove-InvalidFileNameChars) | Yes | [Remove-ADTInvalidFileNameChars](./functions/Remove-ADTInvalidFileNameChars.mdx) | +| [Remove-MSIApplications](/docs/3.10.2/reference/functions/Remove-MSIApplications) | Yes | [Uninstall-ADTApplication](./functions/Uninstall-ADTApplication.mdx) | +| [Remove-RegistryKey](/docs/3.10.2/reference/functions/Remove-RegistryKey) | Yes | [Remove-ADTRegistryKey](./functions/Remove-ADTRegistryKey.mdx) | +| [Resolve-Error](/docs/3.10.2/reference/functions/Resolve-Error) | Yes | [Resolve-ADTErrorRecord](./functions/Resolve-ADTErrorRecord.mdx) | +| [Resolve-Parameters](/docs/3.10.2/reference/functions/Resolve-Parameters) | **NO** | Resolve-ADTBoundParameters | +| [Send-Keys](/docs/3.10.2/reference/functions/Send-Keys) | Yes | [Send-ADTKeys](./functions/Send-ADTKeys.mdx) | +| [Set-ActiveSetup](/docs/3.10.2/reference/functions/Set-ActiveSetup) | Yes | [Set-ADTActiveSetup](./functions/Set-ADTActiveSetup.mdx) | +| [Set-DeferHistory](/docs/3.10.2/reference/functions/Set-DeferHistory) | Yes | [Set-ADTDeferHistory](./functions/Set-ADTDeferHistory.mdx) | +| [Set-IniValue](/docs/3.10.2/reference/functions/Set-IniValue) | Yes | [Set-ADTIniValue](./functions/Set-ADTIniValue.mdx) | +| [Set-ItemPermission](/docs/3.10.2/reference/functions/Set-ItemPermission) | Yes | [Set-ADTItemPermission](./functions/Set-ADTItemPermission.mdx) | +| [Set-MsiProperty](/docs/3.10.2/reference/functions/Set-MsiProperty) | Yes | [Set-ADTMsiProperty](./functions/Set-ADTMsiProperty.mdx) | +| [Set-PinnedApplication](/docs/3.10.2/reference/functions/Set-PinnedApplication) | Yes | Deprecated | +| [Set-RegistryKey](/docs/3.10.2/reference/functions/Set-RegistryKey) | Yes | [Set-ADTRegistryKey](./functions/Set-ADTRegistryKey.mdx) | +| [Set-ServiceStartMode](/docs/3.10.2/reference/functions/Set-ServiceStartMode) | Yes | [Set-ADTServiceStartMode](./functions/Set-ADTServiceStartMode.mdx) | +| [Set-Shortcut](/docs/3.10.2/reference/functions/Set-Shortcut) | Yes | [Set-ADTShortcut](./functions/Set-ADTShortcut.mdx) | +| [Show-BalloonTip](/docs/3.10.2/reference/functions/Show-BalloonTip) | Yes | [Show-ADTBalloonTip](./functions/Show-ADTBalloonTip.mdx) | +| [Show-DialogBox](/docs/3.10.2/reference/functions/Show-DialogBox) | Yes | [Show-ADTDialogBox](./functions/Show-ADTDialogBox.mdx) | +| [Show-InstallationProgress](/docs/3.10.2/reference/functions/Show-InstallationProgress) | Yes | [Show-ADTInstallationProgress](./functions/Show-ADTInstallationProgress.mdx) | +| [Show-InstallationPrompt](/docs/3.10.2/reference/functions/Show-InstallationPrompt) | Yes | [Show-ADTInstallationPrompt](./functions/Show-ADTInstallationPrompt.mdx) | +| [Show-InstallationRestartPrompt](/docs/3.10.2/reference/functions/Show-InstallationRestartPrompt) | Yes | [Show-ADTInstallationRestartPrompt](./functions/Show-ADTInstallationRestartPrompt.mdx) | +| [Show-InstallationWelcome](/docs/3.10.2/reference/functions/Show-InstallationWelcome) | Yes | [Show-ADTInstallationWelcome](./functions/Show-ADTInstallationWelcome.mdx) | +| [Show-WelcomePrompt](/docs/3.10.2/reference/functions/Show-WelcomePrompt) | **NO** | [Show-ADTInstallationWelcome](./functions/Show-ADTInstallationWelcome.mdx) | +| [Start-ServiceAndDependencies](/docs/3.10.2/reference/functions/Start-ServiceAndDependencies) | Yes | [Start-ADTServiceAndDependencies](./functions/Start-ADTServiceAndDependencies.mdx) | +| [Stop-ServiceAndDependencies](/docs/3.10.2/reference/functions/Stop-ServiceAndDependencies) | Yes | [Stop-ADTServiceAndDependencies](./functions/Stop-ADTServiceAndDependencies.mdx) | +| [Test-Battery](/docs/3.10.2/reference/functions/Test-Battery) | Yes | [Test-ADTBattery](./functions/Test-ADTBattery.mdx) | +| [Test-IsMutexAvailable](/docs/3.10.2/reference/functions/Test-IsMutexAvailable) | Yes | [Test-ADTMutexAvailability](./functions/Test-ADTMutexAvailability.mdx) | +| [Test-MSUpdates](/docs/3.10.2/reference/functions/Test-MSUpdates) | Yes | [Test-ADTMSUpdates](./functions/Test-ADTMSUpdates.mdx) | +| [Test-NetworkConnection](/docs/3.10.2/reference/functions/Test-NetworkConnection) | Yes | [Test-ADTNetworkConnection](./functions/Test-ADTNetworkConnection.mdx) | +| [Test-PowerPoint](/docs/3.10.2/reference/functions/Test-PowerPoint) | Yes | [Test-ADTPowerPoint](./functions/Test-ADTPowerPoint.mdx) | +| [Test-RegistryValue](/docs/3.10.2/reference/functions/Test-RegistryValue) | Yes | [Test-ADTRegistryValue](./functions/Test-ADTRegistryValue.mdx) | +| [Test-ServiceExists](/docs/3.10.2/reference/functions/Test-ServiceExists) | Yes | [Test-ADTServiceExists](./functions/Test-ADTServiceExists.mdx) | +| [Unblock-AppExecution](/docs/3.10.2/reference/functions/Unblock-AppExecution) | Yes | [Unblock-ADTAppExecution](./functions/Unblock-ADTAppExecution.mdx) | +| [Update-Desktop](/docs/3.10.2/reference/functions/Update-Desktop) | Yes | [Update-ADTDesktop](./functions/Update-ADTDesktop.mdx) | +| [Update-GroupPolicy](/docs/3.10.2/reference/functions/Update-GroupPolicy) | Yes | [Update-ADTGroupPolicy](./functions/Update-ADTGroupPolicy.mdx) | +| [Update-SessionEnvironmentVariables](/docs/3.10.2/reference/functions/Update-SessionEnvironmentVariables) | Yes | [Update-ADTEnvironmentPsProvider](./functions/Update-ADTEnvironmentPsProvider.mdx) | +| [Write-FunctionHeaderOrFooter](/docs/3.10.2/reference/functions/Write-FunctionHeaderOrFooter) | **NO** | [Initialize-ADTFunction](./functions/Initialize-ADTFunction.mdx) / [Complete-ADTFunction](./functions/Complete-ADTFunction.mdx) | +| [Write-Log](/docs/3.10.2/reference/functions/Write-Log) | Yes | [Write-ADTLogEntry](./functions/Write-ADTLogEntry.mdx) | diff --git a/docs/tutorials/_category_.json b/docs/tutorials/_category_.json new file mode 100644 index 0000000..c57773e --- /dev/null +++ b/docs/tutorials/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Tutorials", + "position": 2 +} diff --git a/docs/tutorials/adding-a-user-experience.mdx b/docs/tutorials/adding-a-user-experience.mdx new file mode 100644 index 0000000..9226df6 --- /dev/null +++ b/docs/tutorials/adding-a-user-experience.mdx @@ -0,0 +1,255 @@ +--- +sidebar_position: 2 +title: 'Adding a user experience' +description: 'Write deployment logic and add dialogs that close applications, allow deferral and report progress.' +slug: /tutorials/adding-a-user-experience +hide_title: true +tags: + - Tutorial + - User Interface +--- + +import ThemedImage from '@theme/ThemedImage'; + +## Adding a user experience + +In the [first tutorial](./your-first-deployment.mdx) we let the toolkit do everything. In this one we +will write the deployment logic ourselves, and give the deployment a user experience: it will ask the +user to close Notepad, let them put it off, report progress while it works, and tell them when it is +done. + +We will use Notepad as the application to close because it is already on your machine, and a small +file copy as the "installation" so that nothing needs downloading. Everything you learn here applies +unchanged to a real installer. + +## Before you begin + +- Completed [Your first deployment](./your-first-deployment.mdx), or otherwise have the toolkit + installed. +- An elevated PowerShell prompt. + +## Step 1: Create a fresh package + +```powershell +New-ADTTemplate -Destination C:\Temp -Name 'ContosoDemo' +cd C:\Temp\ContosoDemo +``` + +Create the file our deployment will install: + +```powershell +'Installed by PSAppDeployToolkit.' | Out-File -FilePath .\SupportFiles\readme.txt -Encoding utf8 +``` + +## Step 2: Describe the deployment + +Open `Invoke-AppDeployToolkit.ps1` in an editor and find the `$adtSession` hashtable near the top. +Fill it in: + +```powershell +$adtSession = @{ + AppVendor = 'Contoso' + AppName = 'Demo App' + AppVersion = '1.0.0' + AppArch = 'x64' + AppLang = 'EN' + AppRevision = '01' + AppSuccessExitCodes = @(0) + AppRebootExitCodes = @(1641, 3010) + AppProcessesToClose = @(@{ Name = 'notepad'; Description = 'Notepad' }) + + AppScriptVersion = '1.0.0' + AppScriptDate = '2026-08-16' + AppScriptAuthor = 'Your Name' + + DeployAppScriptFriendlyName = $MyInvocation.MyCommand.Name + DeployAppScriptParameters = $PSBoundParameters + DeployAppScriptVersion = '4.2.0' +} +``` + +The line that matters most is `AppProcessesToClose`. We are declaring, once, that this deployment +cannot proceed while Notepad is open. Notice we gave it a `Description`, so the dialog will show +"Notepad" to the user rather than the process name. + +Setting `AppName` also takes us out of zero-config mode, so from here on the deployment does what our +script says and nothing else. + +## Step 3: Write the install logic + +Find the `Install` script block, which is empty, and fill it in: + +```powershell +## MARK: Install +New-Variable -Name Install -Force -Value { + Show-ADTInstallationProgress -StatusMessage 'Installing Contoso Demo App...' -StatusMessageDetail 'Creating the application folder.' -StatusBarPercentage 25 + New-ADTFolder -LiteralPath "$envProgramFiles\ContosoDemo" + + Show-ADTInstallationProgress -StatusMessage 'Installing Contoso Demo App...' -StatusMessageDetail 'Copying files.' -StatusBarPercentage 75 + Copy-ADTFile -Path "$($adtSession.DirSupportFiles)\readme.txt" -Destination "$envProgramFiles\ContosoDemo" +} +``` + +Three things to notice here: + +- `Show-ADTInstallationProgress` can be called repeatedly. Each call updates the dialog already on + screen rather than opening a new one, which is how you narrate a long install. +- `-StatusBarPercentage` drives the Fluent progress bar to a specific value. Leave it off and you get + an indeterminate progress bar instead, which is the right choice when you cannot tell how far along + you are. +- `$envProgramFiles` works here, inside a phase block, even though it would have been empty up in the + `$adtSession` hashtable. The module is imported and the session is open by the time this runs. + +## Step 4: Write the uninstall logic + +Fill in the `Uninstall` block so the package can undo itself: + +```powershell +## MARK: Uninstall +New-Variable -Name Uninstall -Force -Value { + Show-ADTInstallationProgress -StatusMessage 'Removing Contoso Demo App...' + Remove-ADTFolder -Path "$envProgramFiles\ContosoDemo" +} +``` + +Save the file. + +## Step 5: Run it with Notepad open + +Open Notepad, type something into it so it has unsaved work, and leave it open. Then, from your +elevated prompt in the package folder: + +```powershell +.\Invoke-AppDeployToolkit.exe /Debug -DeploymentType Install +``` + +This time we have not asked for `Interactive`, and we do not need to. Notepad is running, so the +toolkit works out for itself that there is something to talk to the user about. + +You should see the welcome dialog listing **Notepad**, with buttons to close it, and a **Defer** +button. + + + +The template already asked for deferral on your behalf: + +```powershell +$saiwParams = @{ + AllowDefer = $true + DeferTimes = 3 + CheckDiskSpace = $true + PersistPrompt = $true +} +``` + +## Step 6: Defer it + +Click **Defer**. The deployment stops, and no files are copied. + +Check what it returned: + +```powershell +$LASTEXITCODE +``` + +```text +1602 +``` + +That is the deferral exit code. To a management system, this is the deployment saying "not now, ask +me again later", which is why +[Intune and Configuration Manager need it mapped to a retry](../how-to/close-apps-and-allow-deferral.mdx). + +Run it twice more and defer each time. On the fourth run the **Defer** button is gone: `DeferTimes` +was set to 3, and the deployment has run out of patience. + + + +## Step 7: Let it install + +With Notepad still open, run it once more and click **Close Programs**. Notepad closes and the +progress dialog appears. Watch the detail line change from "Creating the application folder" to +"Copying files", and the progress bar move from 25% to 75%, as your two commands run. + + + +A completion prompt follows. + +Confirm the result: + +```powershell +Get-Content "$env:ProgramFiles\ContosoDemo\readme.txt" +``` + +```text +Installed by PSAppDeployToolkit. +``` + +## Step 8: Watch it stay silent + +Now run the same package again with Notepad closed: + +```powershell +.\Invoke-AppDeployToolkit.exe /Debug -DeploymentType Install +``` + +No dialogs. The deployment installs anyway, but decides there is no reason to interrupt a user when +nothing needs closing. Look for the reason in the console output: + +```text +[Initialization] [Info] :: The processes ['notepad'] were specified as requiring closure but none were running, changing deployment mode to [Silent]. +``` + +This is the single most useful line in the log when someone reports that "the dialogs don't show". + +## Step 9: Change the wording + +Open `Strings\strings.psd1` and search for the progress messages. Change one of them, save, and run +the deployment again with Notepad open. The dialog picks up your text with no code change and no +rebuild. + +This is why user-facing text lives in its own file: it can be translated, re-branded, or corrected +without anyone touching deployment logic. The full set of keys is in the +[Language Strings reference](../reference/language-strings.mdx). + +## Step 10: Clean up + +```powershell +.\Invoke-AppDeployToolkit.exe /Debug -DeploymentType Uninstall -DeployMode Interactive +``` + +## What you have built + +A deployment that installs and uninstalls, protects itself against an application being open, gives +the user a limited number of opportunities to postpone it, reports what it is doing while it works, +and falls silent when there is nobody to talk to. + +## Next steps + +- [How to install applications](../how-to/install-applications.mdx) replaces the file copy with a + real installer. +- [How to brand the user interface](../how-to/brand-the-user-interface.mdx) makes the dialogs yours. +- [Deployment Modes](../explanation/deployment-modes.mdx) covers the rest of the decisions behind + step 8. +- [Dialogs reference](../reference/dialogs.mdx) lists every dialog available to you. diff --git a/docs/tutorials/your-first-deployment.mdx b/docs/tutorials/your-first-deployment.mdx new file mode 100644 index 0000000..3a542ae --- /dev/null +++ b/docs/tutorials/your-first-deployment.mdx @@ -0,0 +1,228 @@ +--- +sidebar_position: 1 +title: 'Your first deployment' +description: 'Build and run a working PSAppDeployToolkit deployment from scratch.' +slug: /tutorials/your-first-deployment +hide_title: true +tags: + - Tutorial + - Getting Started +--- + +import ThemedImage from '@theme/ThemedImage'; + +## Your first deployment + +In this tutorial we will build a working deployment package, run it, watch it install an +application, and read the log it produces. By the end you will have a package you could hand to +Intune or Configuration Manager, and you will know where everything in it lives. + +We will not write any deployment logic yet. The toolkit can install an MSI with no script at all, +which makes it a good first result. Writing logic comes in the [next +tutorial](./adding-a-user-experience.mdx). + +## Before you begin + +You will need: + +- A Windows test machine you are happy to install software on. A virtual machine is ideal. +- An elevated PowerShell prompt. +- Any small MSI installer. If you do not have one to hand, download a vendor MSI such as the 7-Zip + `.msi`. The tutorial does not depend on which one you choose. + +Check the [Requirements](../reference/requirements.mdx) if your test machine is older than +Windows 10 1607. + +## Step 1: Install the toolkit + +In your elevated PowerShell prompt, run: + +```powershell +Install-Module -Name PSAppDeployToolkit -Scope CurrentUser +``` + +Note that this tutorial is tailored for v4.2.x, which is currently a pre-release; to install a pre-release version, run: + +```powershell +Install-Module -Name PSAppDeployToolkit -Scope CurrentUser -AllowPrerelease +``` + +Confirm it is there: + +```powershell +Get-Module -Name PSAppDeployToolkit -ListAvailable +``` + +The output should look something like: + +```text + Directory: C:\Users\you\Documents\PowerShell\Modules + +ModuleType Version Name ExportedCommands +---------- ------- ---- ---------------- +Manifest 4.1.8 PSAppDeployToolkit {Add-ADTEdgeExtension, Add-ADTFont, ...} +``` + +## Step 2: Create a deployment folder + +Now create a package from the toolkit's own 'ZeroConfig' template: + +```powershell +New-ADTTemplate -Destination C:\Temp -Name 'MyFirstDeployment' -ZeroConfig +``` + +Look at what you have: + +```powershell +Get-ChildItem -Path C:\Temp\MyFirstDeployment +``` + +```text + Directory: C:\Temp\MyFirstDeployment + +Mode Name +---- ---- +d---- Assets +d---- Config +d---- Files +d---- PSAppDeployToolkit +d---- PSAppDeployToolkit.Extensions +d---- Strings +d---- SupportFiles +-a--- Invoke-AppDeployToolkit.exe +-a--- Invoke-AppDeployToolkit.ps1 +``` + +Notice that this is a complete, self-contained package: the toolkit itself is in the +`PSAppDeployToolkit` folder, so this deployment will run on a machine that has never seen the module. +Only two of these folders are ours to fill in right now, `Files` and `SupportFiles`. The rest are +covered in the [Deployment Template reference](../reference/deployment-template.mdx). + +## Step 3: Add your installer + +Copy your MSI into the `Files` folder: + +```powershell +Copy-Item -Path C:\Downloads\YourApp.msi -Destination C:\Temp\MyFirstDeployment\Files +``` + +That is the entire configuration. Because we have left `AppName` empty in the deployment script, the +toolkit will find the MSI on its own and build the install from it. This is called +[zero-config deployment](../how-to/deploy-an-msi-with-zero-config.mdx). + +## Step 4: Run it + +From an elevated prompt, in the package folder: + +```powershell +cd C:\Temp\MyFirstDeployment +.\Invoke-AppDeployToolkit.exe /Debug -DeployMode Interactive +``` + +`/Debug` opens a console window and streams the log to the screen as the deployment runs. + +We ask for `Interactive` explicitly because, left to itself, the toolkit would decide there is +nothing worth interrupting anyone for and run silently, since our package declares no applications +that need closing. That decision-making is the subject of +[Deployment Modes](../explanation/deployment-modes.mdx); for now we want to see the dialogs. + +Watch the console output go past. You should see the module import, the session open, the MSI +detected, and the install run: + +```text +[Initialization] [Info] :: [YourApp_1.0.0_EN_01] install started. +[Initialization] [Info] :: [PSAppDeployToolkit] module version is [4.2.0]. +[Initialization] [Info] :: Discovered Zero-Config MSI installation file [C:\Temp\MyFirstDeployment\Files\YourApp.msi]. +[Initialization] [Info] :: Deployment is running in [Interactive] mode. +[Install] [Info] :: Executing MSI action [Install]... +``` + +(Each real line also carries a timestamp and the command that wrote it; they are trimmed here.) + +A progress dialog appears while the MSI runs, and a completion prompt when it finishes. When the +console returns you to a prompt, the deployment is done. + + + +When it finishes, the completion prompt is the last thing the user sees. + + + +Confirm the application is installed. It should now appear in **Apps & features**. + +## Step 5: Read the log + +The interesting part is what the deployment left behind: + +```powershell +Get-ChildItem -Path C:\Windows\Logs\Software +``` + +There are two files: the toolkit's own log, and Windows Installer's log for the MSI action. + +```text +YourApp_1.0.0_EN_01_PSAppDeployToolkit.log +YourApp_1.0.0_EN_01_Install.log +``` + +Open the first one: + +```powershell +Get-Content -Path C:\Windows\Logs\Software\*_PSAppDeployToolkit.log | Select-Object -Last 30 +``` + +Notice that every line carries the phase it belongs to: `Initialization`, `Pre-Install`, `Install`, +`Post-Install`. When a deployment fails somewhere in an estate of thousands of machines, this is what +you will be reading, and the phase tells you where to look first. + +## Step 6: Uninstall it again + +The same package uninstalls the application. Run: + +```powershell +.\Invoke-AppDeployToolkit.exe /Debug -DeploymentType Uninstall -DeployMode Interactive +``` + +The toolkit resolves the MSI's product code and uninstalls it, and writes a second pair of logs +ending in `_Uninstall.log`. One package covers all three deployment types, which is why the +management system only ever needs one piece of content per application. + +## Step 7: See it run silently + +Finally, run the install again the way a management system would, with no user interaction: + +```powershell +.\Invoke-AppDeployToolkit.exe -DeploymentType Install -DeployMode Silent +``` + +No dialogs appear this time, and the console returns immediately. Check the log and you will find the +same sequence of events. Whether a user is talked to is a separate question from what gets installed; +see [Deployment Modes](../explanation/deployment-modes.mdx). + +## What you have built + +You have a self-contained deployment package that installs and uninstalls an MSI, logs what it does, +and behaves differently depending on whether anyone is watching, without a line of script written. + +## Next steps + +- [Adding a user experience](./adding-a-user-experience.mdx) is the next tutorial, where we start + writing deployment logic. +- [How to install applications](../how-to/install-applications.mdx) covers installers that are not a + plain MSI. +- [The deployment script](../explanation/the-deployment-script.mdx) explains how the script you have + not yet edited actually works. diff --git a/docs/usage/_category_.json b/docs/usage/_category_.json deleted file mode 100644 index 497980e..0000000 --- a/docs/usage/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Usage", - "position": 4 -} diff --git a/docs/usage/adding-ui-elements.mdx b/docs/usage/adding-ui-elements.mdx deleted file mode 100644 index 774396f..0000000 --- a/docs/usage/adding-ui-elements.mdx +++ /dev/null @@ -1,96 +0,0 @@ ---- -sidebar_position: 2 -title: 'Adding UI Elements' -description: 'How to add UI elements to a deployment script.' -slug: /usage/adding-ui-elements -hide_title: true -tags: - - Usage - - User Interface ---- - -## Adding User Interface Elements - -The user interface consists of several components described below. It can be branded with a custom logo (Fluent UI) or a banner (Classic UI). - -All UI components include customizable message text in `strings.psd1`, which has been localized into 25 languages. - -The language is selected automatically based on the operating system settings. However, you can override it by specifying `LanguageOverride` in `config.psd1`. - -The user interface can be suppressed by specifying the deploy mode parameter as follows: - -```powershell -Invoke-AppDeployToolkit.ps1 -DeployMode Silent -``` - -### Installation Progress - -The installation progress message displays an indeterminate progress ring to indicate an installation is in progress and display status messages to the end user. This is invoked using the [Show-ADTInstallationProgress](../reference/functions/Show-ADTInstallationProgress.mdx) Function. - -Installation Progress (Light Mode) - -Installation Progress (Dark Mode) - -The progress message can be updated dynamically to show the installation stage or display custom messages, using the [Show-ADTInstallationProgress](../reference/functions/Show-ADTInstallationProgress.mdx) function. - -Dynamic Progress Updating (Light Mode) - -Dynamic Progress Updating (Dark Mode) - -### Installation Welcome Prompt - -The application welcome prompt can be used to display applications that need to be closed, an option to defer and a countdown to closing applications automatically. Use the [Show-ADTInstallationWelcome](../reference/functions/Show-ADTInstallationWelcome.mdx) function to display the prompts shown below. - -Welcome Prompt with the ability to defer a number of times: - -Installation Welcome With Defer (Light Mode) - -Installation Welcome With Defer (Dark Mode) - -Welcome Prompt with the ability to close open programs: - -Installation Welcome With Close (Light Mode) - -Installation Welcome With Close (Dark Mode) - -### Custom Installation Prompt - -A custom prompt with PSAppDeployToolkit branding can be displayed using [Show-ADTInstallationPrompt](../reference/functions/Show-ADTInstallationPrompt.mdx). The title and text can be customized, and up to 3 buttons can be included. - -3 Buttons being used in a custom message box (Light Mode) - -3 Buttons being used in a custom message box (Dark Mode) - -Additionally, the prompt can be used to ask the user questions, using an inputbox. - -Input box (Light Mode) - -Input box (Dark Mode) - -Or using a multiple choice selection box: - -Multiselect Listbox (Light Mode) - -Multiselect Listbox (Dark Mode) - -### Installation Restart Prompt - -A restart prompt can be displayed with a countdown to automatic restart using the [Show-ADTInstallationRestartPrompt](../reference/functions/Show-ADTInstallationRestartPrompt.mdx). Since the restart prompt is executed in a separate PowerShell session, the PSAppDeployToolkit will still return the appropriate exit code to the parent process. - -Installation Restart Prompt (Light Mode) - -Installation Restart Prompt (Dark Mode) - -### Custom Dialog box - -A generic dialog box to display custom messages to the user without the PSAppDeployToolkit branding using the function [Show-ADTDialogBox](../reference/functions/Show-ADTDialogBox.mdx). This can be customized with different system icons and buttons. - -Custom Dialog (Light Mode) - -Custom Dialog (Dark Mode) - -### Toolkit Help Console - -The PowerShell App Deployment Toolkit Help Console can be invoked by running the `Show-ADTHelpConsole` command. - -PowerShell App Deployment Toolkit Help Console diff --git a/docs/usage/admx-templates.mdx b/docs/usage/admx-templates.mdx deleted file mode 100644 index 9f12fc6..0000000 --- a/docs/usage/admx-templates.mdx +++ /dev/null @@ -1,80 +0,0 @@ ---- -sidebar_position: 1 -title: 'ADMX Templates' -description: 'How to customize deployments using admx templates' -slug: /usage/admx/admx-templates -hide_title: true -tags: - - Usage - - Customizing - - Group Policy - - ADMX Template ---- - -## Group Policy ADMX Templates - -Another way to customize your deployments is with the supplied ADMX templates. - -This is a great way to change, update, or enforce settings across an organization. - -### Config - -The Group Policy settings will take precedence over local configs and built-in defaults. - -See [Config Settings](../reference/config-settings.mdx) for additional information on what settings are configurable. - -### ADMX Template Files - -The ADMX Template files are located in the `ADMX` folder of either the Module, or the Deployment Template - -#### Module Folder - -The `ADMX` folder is located in the root of the module folder: - -![ADMX folder in the Module](../images/psadt-admx-files-module.png) - -#### Deployment Template Folder - -The `ADMX` folder is located in the `PSAppDeployToolkit` folder of a deployment template: - -![ADMX folder in a Deployment Template](../images/psadt-admx-files-deployment-template.png) - -#### Files - -The `ADMX` folder contains both the `.admx` and `.adml` files. Use these files to import into either your Central Store or Intune - -| Folder | File | Purpose | -| :--------- | :---------------------- | :-------------------------------------- | -| **ADMX/** | | | -| | PSAppDeployToolkit.admx | Language neutal policy settings file | -| **en-US/** | | | -| | PSAppDeployToolkit.adml | en-US language policy descriptions file | - -![ADMX Files](../images/psadt-admx-files.png) - -### Group Policy Management Editor - -After importing the files into your central store, you can view the settings under: - -```text -Computer Configuration -└───Policies - └───Administrative Templates: Policy definitions - └───PSAppDeployToolkit - ├───Assets - ├───MSI - ├───Toolkit - └───UI -``` - -![ADMX Files](../images/psadt-admx-gpme.png) - -### Registry - -When the Policies apply, the policies can be found in the Registry here: - -```text -HKEY_LOCAL_MACHINE\SOFTWARE\Policies\PSAppDeployToolkit -``` - -![Registry Policy Location](../images/psadt-admx-registry.png) diff --git a/docs/usage/customizing-deployments.mdx b/docs/usage/customizing-deployments.mdx deleted file mode 100644 index bc0af4d..0000000 --- a/docs/usage/customizing-deployments.mdx +++ /dev/null @@ -1,63 +0,0 @@ ---- -sidebar_position: 3 -title: 'Customizing Deployments' -description: 'How to customize the look and behavior of a deployment.' -slug: /usage/customizing-deployments -hide_title: true -tags: - - Usage - - Customizing ---- - -## Customizing Deployments - -Aside from customizing the `Invoke-AppDeployToolkit.ps1` script, no configuration is required by default. However, these components are configurable: - -### Config - -Use config.psd1 to configure items such as: - -- MSI parameters -- Log settings - -See [Config Settings](../reference/config-settings.mdx) for further information. - -It is recommended to edit file located in the Config folder of the deployment template, rather than the copy located inside of the module itself. - -#### Logging - -The PSAppDeployToolkit generates extensive logging for all toolkit and MSI operations. - -The default log folder for the PSAppDeployToolkit and MSI log files can be specified in config.psd1. The default folder is `C:\Windows\Logs\Software`. - -The PSAppDeployToolkit log file is named after the application with \_PSAppDeployToolkit appended to the end, e.g. - -- `Oracle_JavaRuntime_1.7.0.17_EN_01_PSAppDeployToolkit.log` - -All MSI actions are logged and the log file is named according to the MSI file used on the command line, with the action appended to the log file name. For uninstallation, the MSI product code is resolved to the MSI application name and version to keep the same log file format, e.g. - -- `Oracle_JavaRuntimeEnvironmentx86_1.7.0.17_EN_01_Install.log` -- `Oracle_JavaRuntimeEnvironmentx86_1.7.0.17_EN_01_Repair.log` -- `Oracle_JavaRuntimeEnvironmentx86_1.7.0.17_EN_01_Patch.log` -- `Oracle_JavaRuntimeEnvironmentx86_1.7.0.17_EN_01_Uninstall.log` - -Enable `CompressLogs` in `config.psd1` to collect log files in a temporary folder and zip them at the end of the installation or uninstallation. - -One of the options in config.psd1 is **CompressLogs**. Enabling this option will create a temporary logging folder where you can save all of the log files you want to include in the single ZIP file that will be created from this folder. When set to True, the following happens: - -- Both toolkit and MSI logs are temporally placed in a temp folder, the path of which is set in `$adtSession.LogTempFolder` and defaults to `$envTemp\$installName`. -- At the end of the install / uninstall, the logs are compressed into a new zip file which is placed in the LogFolder location in the config file, and the temp folder is deleted. -- The Zip file name indicates whether it is an Install / Uninstall and has the timestamp in the filename so previous logs do not get overwritten. -- If your package creates other log files, you can send them to the temporary logging folder at `$adtSession.LogTempFolder`. - -### Strings - -Configure the default UI messages. The Strings folder contains the English version of strings.psd1 in the root, with other languages in their respective subfolders. - -See [Language Strings](../reference/language-strings.mdx) for further information. - -### Assets - -To brand the Fluent UI dialogs with a custom logo, replace `AppIcon.png` with your own file, retaining the file name. For Classic UI dialogs, replace `Banner.Classic.png`. - -To brand the Classic UI dialogs with your own custom/corporate banner, replace the `Banner.Classic.png` file with your own .png file (retaining the file name). The file must be in PNG format and must be 450 x 50 in size. diff --git a/docs/usage/how-to-deploy.mdx b/docs/usage/how-to-deploy.mdx deleted file mode 100644 index b08656c..0000000 --- a/docs/usage/how-to-deploy.mdx +++ /dev/null @@ -1,107 +0,0 @@ ---- -sidebar_position: 1 -title: 'How to Deploy' -description: 'How to deploy the toolkit using the command line / ConfigMgr / Intune.' -slug: /usage/how-to-deploy -hide_title: true -tags: - - Usage - - How to Deploy ---- - -## How to Deploy - -There are two ways to launch the PSAppDeployToolkit for deployment of applications. - -- Run `Invoke-AppDeployToolkit.ps1` via PowerShell: -`%SystemRoot%\System32\WindowsPowerShell\v1.0\PowerShell.exe -ExecutionPolicy Bypass -NoProfile -File Invoke-AppDeployToolkit.ps1` -- Run `Invoke-AppDeployToolkit.exe` to launch `Invoke-AppDeployToolkit.ps1` in a hidden PowerShell window. - -:::info[Elevation] -If your script uses `RequireAdmin = $true`, you will need to run it as admin; the launcher will not prompt for elevation by itself. -::: - -:::info[ServiceUI] -Additionally, as of v4.1.0: - -- If deploying via **Intune**, there is no longer any reqirement to use `ServiceUI.exe` workarounds to display the UI. -- If deploying via **Configuration Manager**, the **'Allow users to view and interact with the program installation'** option is no longer required to display the UI. -- Invoke-ServiceUI.ps1 has been removed from the toolkit as it is no longer required. -::: - -:::warning -- If you want to deploy an installer interactively, you can include ServiceUI.exe in your package and use that to trigger your installer. -- However, this is a security risk since any file dialogs or hyperlinks can be abused by the user to gain access as local system. -::: - -### Available parameters - -The following parameters are accepted by `Invoke-AppDeployToolkit.ps1` and `Invoke-AppDeployToolkit.exe`: - -| Parameter | Values | Description | -| --------------------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | -| `-DeploymentType` | Install *(default)*
Uninstall
Repair | Specifies the deployment type. | -| `-DeployMode` | Interactive *(default)*
Silent
NonInteractive | Controls dialog display behavior. NonInteractive allows progress dialogs but suppresses any UI elements requiring interaction. | -| `-SuppressRebootPassThru` | | Suppresses return of 3010 'Reboot Required' exit codes and returns 0 instead. | -| `-TerminalServerMode` | | Changes to user install mode for RDS/Citrix servers. | -| `-DisableLogging` | | Disables logging to file. | - -In addition, `Invoke-AppDeployToolkit.exe` supports the following parameters: - -| Parameter | Values | Description | -| --------- | ------ | ------------------------------------------------------------------------------------------------------------ | -| `/Debug` | | Launches the script in a visible window displaying live logging output on-screen. | -| `/32` | | Launches the script using PowerShell x86. This is useful for compatibility with x86 libraries or components. | -| `/Core` | | Launches the script using PowerShell Core (pwsh.exe). | -| `-File` | *.ps1 | Specify a custom script file to run instead of the default `Invoke-AppDeployToolkit.ps1`. | -| `*.ps1` | | Specify a custom script file to run instead of the default `Invoke-AppDeployToolkit.ps1`. | - -### Examples - -Deploy an application for installation in interactive mode: - -```powershell -Invoke-AppDeployToolkit.exe -``` - -or: - -```powershell -Invoke-AppDeployToolkit.exe -DeploymentType Install -DeployMode Interactive -``` - -Deploy an application in silent mode with 3010 reboot codes suppressed: - -```powershell -Invoke-AppDeployToolkit.exe -DeploymentType Install -DeployMode Silent -SuppressRebootPassThru -``` - -Deploy an application for uninstallation in non-interactive mode: - -```powershell -Invoke-AppDeployToolkit.ps1 -DeploymentType Uninstall -DeployMode NonInteractive -``` - -Deploy an application for silent installation using PowerShell x86 in debug mode: - -```powershell -Invoke-AppDeployToolkit.exe /32 /Debug -DeploymentType Install -DeployMode Silent -``` - -Deploy an application for silent installation using PowerShell Core: - -```powershell -Invoke-AppDeployToolkit.exe /Core -DeploymentType Install -DeployMode Silent -``` - -Deploy an application with a custom script name: - -```powershell -Invoke-AppDeployToolkit.exe Custom-Script.ps1 -``` - -or: - -```powershell -Invoke-AppDeployToolkit.exe -File Custom-Script.ps1 -``` diff --git a/docs/usage/installing-applications.mdx b/docs/usage/installing-applications.mdx deleted file mode 100644 index 3e8304d..0000000 --- a/docs/usage/installing-applications.mdx +++ /dev/null @@ -1,102 +0,0 @@ ---- -sidebar_position: 4 -title: 'Installing Applications' -description: 'Guidance for installing applications with PSAppDeployToolkit.' -slug: /usage/installing-applications -hide_title: true -tags: - - Usage ---- - -## Installing Applications - -### Start-ADTProcess - -The `Start-ADTProcess` function can be used to execute a typical setup.exe installer. It provides a number of features over the standard `Start-Process` command, and like all PSAppDeployToolkit functions, provides standard logging. - -#### Parameters - -Full parameter descriptions can be found in the [Start-ADTProcess](../reference/functions/Start-ADTProcess.mdx) documentation, but here are some of the most commonly used parameters: - -| Parameter | Description | -| ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| -FilePath | Path to the file to be executed. If the file is located directly in the **Files** directory, only the filename needs to be specified. | -| -ArgumentList | Arguments to be passed to the executable. | -| -SecureArgumentList | Hide ArgumentList from the log file. | -| -WorkingDirectory | The working directory used for executing the process. Defaults to the directory of the file being executed. | -| -WindowStyle | Style of the window of the process executed. Options: Normal, Hidden, Maximized, Minimized. | -| -CreateNoWindow | Used with console apps, stop a new window being created and allows capture of the standard output streams. | -| -WaitForMsiExec | Wait until Windows Installer is free before starting the process. | -| -WaitForChildProcesses | Wait for all child processes to complete. Useful for installers or uninstallers that exit early and hand off to a child process. | -| -KillChildProcessesWithParent | Terminate all child processes once the main process closes - useful when an installer launches the application once complete and you want it closed. | -| -UseUnelevatedToken | Force the process to be started with the user's unelevated token. Useful when installing user-context apps that refuse to install when elevated, or to work around Windows 11 Administrator Protection issues. | -| -Verb | Use `-Verb RunAs` to force the process to run elevated. Note that this does not magically make standard users into admins. | -| -UseShellExecute | Useful for opening a file or URL and letting the Windows shell figure out which application to open it with. | -| -NoWait | Do not wait for the process to complete. This is useful for launching processes that run in the background or when you do not need to wait for the process to finish before continuing with the script. | -| -Timeout | Specifies the maximum time to wait for the process to complete. | -| -TimeoutAction | Specifies the action to take if the process does not complete within the specified timeout period. | -| -NoTerminateOnTimeout | Specifies that the process should be left running if the timeout is reached. | -| -SuccessExitCodes | List of exit codes to be considered successful. | -| -RebootExitCodes | List of exit codes to indicate a reboot is required. | -| -IgnoreExitCodes | List the exit codes to ignore or * to ignore all exit codes. | -| -PassThru | Returns an object with ExitCode, StdOut, and StdErr output from the process. | - -#### Example Usage - -```powershell -Start-ADTProcess -FilePath 'setup.exe' -ArgumentList '/S' -``` - -### Start-ADTProcessAsUser - -The `Start-ADTProcessAsUser` function is used to run a process in the context of the currently logged-in user. This should not typically be used to run installers, as it's best practice to create user-context deployments for those with user-context detection rules. However, there are some scenarios where this comes in handy: - -- Some 'Machine wide' installers actually set up a HKLM Run key in the registry to run a user-context installer for every user that logs in. You would normally then need the user to log off and on again to complete the installation. Using this function, you can immediately complete the installation for the logged-in user from the system account. -- When you want to replace a user-context installation with a machine-wide installation, you may want to run the uninstaller in user context to remove the previous version before installing. -- Some applications require a configuration or licensing tool to be run in user context before the application can be used. - -#### Parameters - -This function is actually a wrapper around `Start-ADTProcess`, which also accepts a `-Username` parameter on top of the options listed above, therefore the parameters available are almost identical. -Full parameter descriptions can be found in the [Start-ADTProcessAsUser](../reference/functions/Start-ADTProcessAsUser.mdx) documentation, but here are some of the most commonly used ones that are only available when starting processes as a user: - -| Parameter | Description | -| ---------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | -| -UseLinkedAdminToken | Run the process with the user's admin token if available. | -| -InheritEnvironmentVariables | Inherit environment variables from the current deployment process; user environment variables such as APPDATA are always layered on top so take precedence. | -| -ExpandEnvironmentVariables | Expand environment variables such as %APPDATA% in the file path, arguments, and working directory. | - -#### Example Usage - -```powershell -Start-ADTProcess -FilePath '%LOCALAPPDATA%\Programs\SomeApp\Uninstall.exe' -ArgumentList '/S' -ExpandEnvironmentVariables -``` - -### Start-ADTMsiProcess - -For installing / uninstalling / repairing MSI files, use the `Start-ADTMsiProcess` function. - -#### Parameters - -Again this wraps `Start-ADTProcess` and provides a lot of the same parameters, but also includes some additional parameters specific to MSI installations. -Full parameter descriptions can be found in the [Start-ADTMsiProcess](../reference/functions/Start-ADTMsiProcess.mdx) documentation, but here are some of the most commonly used parameters specific to this function: - -| Parameter | Description | -| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| -Action | The action to perform on the MSI file. Options: Install, Uninstall, Repair, Patch. Defaults to Install. | -| -FilePath | Path to the MSI file to be executed. If the file is located directly in the **Files** directory, only the filename needs to be specified. | -| -ProductCode | The product code of installed MSI file; only valid for Repair/Uninstall operations. | -| -InstalledApplication | Allows you to perform MSI operations by piping output from the [Get-InstalledApplication](../reference/functions/Get-ADTApplication.mdx) function. | -| -ArgumentList | Arguments to be passed to the MSI file. Note that this **replaces** the default MSI parameters defined in the config (e.g. `/qn REBOOT=ReallySuppress`) | -| -AdditionalArgumentList | Additional arguments to be appended to the default MSI parameters defined in the config. This is what you will typically use when setting MSI properties. | -| -Transforms | Names of the MST transform files to be applied to the MSI. MST files should be located in the same directory as the MSI file. | -| -Patches | Names of the MSP patch files to be applied to the MSI. MSP files should be located in the same directory as the MSI file. | -| -RepairMode | Specify `Reinstall` (default) to reinstall by adding `REINSTALL=ALL REINSTALLMODE=omus` to the standard InstallParams, or `Repair` to repair via `msiexec.exe /p` (which can trigger unsupressable reboots). | -| -RepairFromSource | Adds `REINSTALLMODE=vomus` to the command line to force the cached MSI to be replaced with the source MSI file. | -| -SkipMSIAlreadyInstalledCheck | Attempt to install if already installed, or uninstall if not detected. | - -#### Example Usage - -```powershell -Start-ADTMsiProcess -Action 'Install' -FilePath 'SomeApp.msi' -Transforms 'SomeApp.mst' -AdditionalArgumentList 'SERIAL=12345' -SecureArgumentList -``` diff --git a/package.json b/package.json index 5f5187a..625da35 100644 --- a/package.json +++ b/package.json @@ -26,10 +26,10 @@ "@docusaurus/preset-classic": "^3.10.2", "@docusaurus/theme-common": "^3.10.2", "@docusaurus/types": "^3.10.2", - "@easyops-cn/docusaurus-search-local": "^0.55.2", + "@easyops-cn/docusaurus-search-local": "^0.55.3", "@mdx-js/react": "^3.1.1", "clsx": "^2.1.1", - "framer-motion": "^12.42.2", + "framer-motion": "^13.1.0", "prism-react-renderer": "^2.4.1", "react": "^19.2.8", "react-dom": "^19.2.8", @@ -41,16 +41,16 @@ "@docusaurus/module-type-aliases": "^3.10.2", "@docusaurus/theme-classic": "^3.10.2", "@docusaurus/tsconfig": "^3.10.2", - "@types/node": "^26.1.0", - "@types/react": "^19.2.17", - "@typescript-eslint/eslint-plugin": "^8.63.0", - "@typescript-eslint/parser": "^8.63.0", - "eslint": "^9.39.0", + "@types/node": "^26.2.0", + "@types/react": "^19.2.18", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "eslint": "^10.8.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.1.1", - "prettier": "^3.9.4", - "typescript": "^6.0.3" + "prettier": "^3.9.6", + "typescript": "^7.0.2" }, "browserslist": { "production": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 86ae022..250d24d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,7 +25,7 @@ overrides: patchedDependencies: gray-matter@4.0.3: - hash: 82198c3ee34e2823c4e9793c5209cf97bd566d5610c3f6582dc3f044ca423d6f + hash: 98353f0a10ca229a2cd27622e762c611b1fc5851e0ce1b9b10299ae74b15446f path: patches/gray-matter@4.0.3.patch importers: @@ -34,34 +34,34 @@ importers: dependencies: '@docusaurus/core': specifier: ^3.10.2 - version: 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + version: 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/faster': specifier: ^3.10.2 version: 3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25) '@docusaurus/plugin-content-docs': specifier: ^3.10.2 - version: 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + version: 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/preset-classic': specifier: ^3.10.2 - version: 3.10.2(@algolia/client-search@5.52.0)(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.17)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)(typescript@6.0.3) + version: 3.10.2(@algolia/client-search@5.52.0)(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.18)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)(typescript@7.0.2) '@docusaurus/theme-common': specifier: ^3.10.2 - version: 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/types': specifier: ^3.10.2 version: 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@easyops-cn/docusaurus-search-local': - specifier: ^0.55.2 - version: 0.55.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/theme-common@3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + specifier: ^0.55.3 + version: 0.55.3(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/theme-common@3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@mdx-js/react': specifier: ^3.1.1 - version: 3.1.1(@types/react@19.2.17)(react@19.2.8) + version: 3.1.1(@types/react@19.2.18)(react@19.2.8) clsx: specifier: ^2.1.1 version: 2.1.1 framer-motion: - specifier: ^12.42.2 - version: 12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + specifier: ^13.1.0 + version: 13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) prism-react-renderer: specifier: ^2.4.1 version: 2.4.1(react@19.2.8) @@ -80,46 +80,46 @@ importers: devDependencies: '@docusaurus/eslint-plugin': specifier: ^3.10.2 - version: 3.10.2(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) + version: 3.10.2(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2) '@docusaurus/module-type-aliases': specifier: ^3.10.2 version: 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/theme-classic': specifier: ^3.10.2 - version: 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + version: 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/tsconfig': specifier: ^3.10.2 version: 3.10.2 '@types/node': - specifier: ^26.1.0 - version: 26.1.0 + specifier: ^26.2.0 + version: 26.2.0 '@types/react': - specifier: ^19.2.17 - version: 19.2.17 + specifier: ^19.2.18 + version: 19.2.18 '@typescript-eslint/eslint-plugin': - specifier: ^8.63.0 - version: 8.63.0(@typescript-eslint/parser@8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) + specifier: ^8.67.0 + version: 8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2))(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2) '@typescript-eslint/parser': - specifier: ^8.63.0 - version: 8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) + specifier: ^8.67.0 + version: 8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2) eslint: - specifier: ^9.39.0 - version: 9.39.4(jiti@1.21.7) + specifier: ^10.8.1 + version: 10.8.1(jiti@1.21.7) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.39.4(jiti@1.21.7)) + version: 10.1.8(eslint@10.8.1(jiti@1.21.7)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.4(jiti@1.21.7)) + version: 7.37.5(eslint@10.8.1(jiti@1.21.7)) eslint-plugin-react-hooks: specifier: ^7.1.1 - version: 7.1.1(eslint@9.39.4(jiti@1.21.7)) + version: 7.1.1(eslint@10.8.1(jiti@1.21.7)) prettier: - specifier: ^3.9.4 - version: 3.9.4 + specifier: ^3.9.6 + version: 3.9.6 typescript: - specifier: ^6.0.3 - version: 6.0.3 + specifier: ^7.0.2 + version: 7.0.2 packages: @@ -1413,8 +1413,8 @@ packages: '@easyops-cn/autocomplete.js@0.38.1': resolution: {integrity: sha512-drg76jS6syilOUmVNkyo1c7ZEBPcPuK+aJA7AksM5ZIIbV57DMHCywiCr+uHyv8BE5jUTU98j/H7gVrkHrWW3Q==} - '@easyops-cn/docusaurus-search-local@0.55.2': - resolution: {integrity: sha512-dI/riu+MbDxkAjAHAdc0uahjXRaWKvbIPe9IAmA6AGcUfnVb9xd8s2I/6wEPTOXsAd6eFqn4Yis3WBWh3KUd3g==} + '@easyops-cn/docusaurus-search-local@0.55.3': + resolution: {integrity: sha512-PlMKmxuonvZ1C+/zJS1hJaF1xaxD1TsUvOMzpP6DdQMtZqmTaYjcLGM12ePzl0m1rp3AgfTBeDbFNHQhwnH/dA==} engines: {node: '>=12'} peerDependencies: '@docusaurus/theme-common': ^2 || ^3 @@ -1440,43 +1440,29 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.2': resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.2': - resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/eslintrc@3.3.5': - resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/js@9.39.4': - resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.7.2': + resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@hapi/hoek@9.3.0': resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -1484,12 +1470,16 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -2214,6 +2204,9 @@ packages: '@types/debug@4.1.13': resolution: {integrity: sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -2280,8 +2273,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@26.1.0': - resolution: {integrity: sha512-O0A1G3xPGy4w7AgQdAQYUlQ+BKk2Oovw8eRpofyp5KdBZULnbe+WqaOVNrm705SHphCiG4XHsACrSmPu1f+Kgw==} + '@types/node@26.2.0': + resolution: {integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==} '@types/prismjs@1.26.6': resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==} @@ -2301,8 +2294,8 @@ packages: '@types/react-router@5.1.20': resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - '@types/react@19.2.17': - resolution: {integrity: sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==} + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} '@types/retry@0.12.2': resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} @@ -2343,23 +2336,23 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.63.0': - resolution: {integrity: sha512-rvwSgqT+DHpWdzfSzPatRLm02a0GlESt++9iy3hLCDY4BgkaLcl8LBi9Yh7XGFBpwcBE/K3024QuXWTpbz4FfQ==} + '@typescript-eslint/eslint-plugin@8.67.0': + resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.63.0 + '@typescript-eslint/parser': ^8.67.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.63.0': - resolution: {integrity: sha512-gwh4gvvlaVDKKxyfxMG+Gnu1u9X0OQBwyGLkbwB65dIzBKnxeRiJlNFqlI3zwVhNXJIs6qV7mlFCn/BIajlVig==} + '@typescript-eslint/parser@8.67.0': + resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.63.0': - resolution: {integrity: sha512-e5dh0/UI0ok53AlZ5wRkXCB32z/f2jUZqPR/ygAw5WYaSw8j9EoJWlS7wQjr/dmOaqWjnPIn2m+HhVPCMWGZVQ==} + '@typescript-eslint/project-service@8.67.0': + resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2368,18 +2361,18 @@ packages: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@8.63.0': - resolution: {integrity: sha512-uUyfMWCnDSN8bCpcrY8nGP2BLkQ9Xn0GsipcONcpIDWhwhO4ZSyHvyS14U3X75mzxWxL3I2UZIrenTzdzcJO8A==} + '@typescript-eslint/scope-manager@8.67.0': + resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.63.0': - resolution: {integrity: sha512-sUAbkulqBAsncKnbRP3+7CtQFRKicexnj7ZwNC6ddCR7EmrXvjvdCYMJbUIqMd6lwoEriZjwLo08aS5tSjVMHg==} + '@typescript-eslint/tsconfig-utils@8.67.0': + resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.63.0': - resolution: {integrity: sha512-Nzzh/OGxVCOjObjaj1CQF2RUasyYy2Jfuh+zZ3PjLzG2fYRriAiZLib9UKtO+CpQAS3YHiAS+ckZDclwqI1TPA==} + '@typescript-eslint/type-utils@8.67.0': + resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2389,8 +2382,8 @@ packages: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@8.63.0': - resolution: {integrity: sha512-xyLtl9DUBBFrcJS4x2pIqGLH68/tC2uOa4Z7pUteW09D3bXnnXUom4dyPikzWgB7llmIc1zoeI3aoUdC4rPK/Q==} + '@typescript-eslint/types@8.67.0': + resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@5.62.0': @@ -2402,8 +2395,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.63.0': - resolution: {integrity: sha512-ygBkU+B7ex5UI/gKhaqexWev79uISfIv7XQCRNYO/jmD8rGLPyWLAb3KMRT6nd8Gt9bmUBi9+iX6tBdYfOY81Q==} + '@typescript-eslint/typescript-estree@8.67.0': + resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' @@ -2414,8 +2407,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@8.63.0': - resolution: {integrity: sha512-fUKaeAvrTuQg/Tgt3nliAUSZHJM6DlCcfyEmxCvlX8kieWSStBX+5O5Fnidtc3i2JrH+9c/GL4RY2iasd/GPTA==} + '@typescript-eslint/utils@8.67.0': + resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2425,10 +2418,130 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@8.63.0': - resolution: {integrity: sha512-UexrHGnGTpbuQHct2ExOc2ZcFbGUS9FOesCxxqdBGcpI1BxYu/LZ6U8Aq6/72XtF/qRBk9nhuGHFJIXXMhPMdw==} + '@typescript-eslint/visitor-keys@8.67.0': + resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/typescript-aix-ppc64@7.0.2': + resolution: {integrity: sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [aix] + + '@typescript/typescript-darwin-arm64@7.0.2': + resolution: {integrity: sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [darwin] + + '@typescript/typescript-darwin-x64@7.0.2': + resolution: {integrity: sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [darwin] + + '@typescript/typescript-freebsd-arm64@7.0.2': + resolution: {integrity: sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [freebsd] + + '@typescript/typescript-freebsd-x64@7.0.2': + resolution: {integrity: sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [freebsd] + + '@typescript/typescript-linux-arm64@7.0.2': + resolution: {integrity: sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [linux] + + '@typescript/typescript-linux-arm@7.0.2': + resolution: {integrity: sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ==} + engines: {node: '>=16.20.0'} + cpu: [arm] + os: [linux] + + '@typescript/typescript-linux-loong64@7.0.2': + resolution: {integrity: sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ==} + engines: {node: '>=16.20.0'} + cpu: [loong64] + os: [linux] + + '@typescript/typescript-linux-mips64el@7.0.2': + resolution: {integrity: sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA==} + engines: {node: '>=16.20.0'} + cpu: [mips64el] + os: [linux] + + '@typescript/typescript-linux-ppc64@7.0.2': + resolution: {integrity: sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA==} + engines: {node: '>=16.20.0'} + cpu: [ppc64] + os: [linux] + + '@typescript/typescript-linux-riscv64@7.0.2': + resolution: {integrity: sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ==} + engines: {node: '>=16.20.0'} + cpu: [riscv64] + os: [linux] + + '@typescript/typescript-linux-s390x@7.0.2': + resolution: {integrity: sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw==} + engines: {node: '>=16.20.0'} + cpu: [s390x] + os: [linux] + + '@typescript/typescript-linux-x64@7.0.2': + resolution: {integrity: sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [linux] + + '@typescript/typescript-netbsd-arm64@7.0.2': + resolution: {integrity: sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [netbsd] + + '@typescript/typescript-netbsd-x64@7.0.2': + resolution: {integrity: sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [netbsd] + + '@typescript/typescript-openbsd-arm64@7.0.2': + resolution: {integrity: sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [openbsd] + + '@typescript/typescript-openbsd-x64@7.0.2': + resolution: {integrity: sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [openbsd] + + '@typescript/typescript-sunos-x64@7.0.2': + resolution: {integrity: sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [sunos] + + '@typescript/typescript-win32-arm64@7.0.2': + resolution: {integrity: sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ==} + engines: {node: '>=16.20.0'} + cpu: [arm64] + os: [win32] + + '@typescript/typescript-win32-x64@7.0.2': + resolution: {integrity: sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g==} + engines: {node: '>=16.20.0'} + cpu: [x64] + os: [win32] + '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher @@ -2500,11 +2613,6 @@ packages: resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.18.0: resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} @@ -2536,9 +2644,6 @@ packages: peerDependencies: ajv: ^8.8.2 - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} @@ -2724,6 +2829,10 @@ packages: resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} engines: {node: 20 || >=22} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -3411,25 +3520,21 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-visitor-keys@5.0.1: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.4: - resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@10.8.1: + resolution: {integrity: sha512-wqA7W2jbsC/BnV9Iv1UZpKVFkO1AdNoSmYW8NWG4HNOBbkAMvIqDZ27pI2f07dqn583NcIC44ckjAcOXDL1QbQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: jiti: '*' @@ -3437,9 +3542,9 @@ packages: jiti: optional: true - espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} esquery@1.7.0: resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} @@ -3596,8 +3701,8 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@3.4.2: - resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} follow-redirects@1.16.0: resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} @@ -3627,15 +3732,12 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.42.2: - resolution: {integrity: sha512-5XY9luDiu0oHfHBjpDthFMh0ES+122w6p/papSJBweMkO8Sn+PW2QaEgRblQBpWFnuvZS5qvarpt/hO2pjGmnw==} + framer-motion@13.1.0: + resolution: {integrity: sha512-QSZrF0Id3QGuHJ+OL+9PSY9pk86C8ERFalwAGSchzTm65+ZoGH/RM26lmEARLljcHj2lqhv0jZOOks+EI3COOw==} peerDependencies: - '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true react: optional: true react-dom: @@ -3716,10 +3818,6 @@ packages: resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} engines: {node: '>=10'} - globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -4406,9 +4504,6 @@ packages: lodash.memoize@4.1.2: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} @@ -4712,8 +4807,8 @@ packages: minimalistic-assert@1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} minimatch@3.1.5: @@ -4765,11 +4860,11 @@ packages: uglify-js: optional: true - motion-dom@12.42.2: - resolution: {integrity: sha512-5gIMWLp/PycBtJRJWRgjxke5n8dlvkSn2DrYW+tr3XcqAZY1xZh6BJyooJXCM8wdfM7wfMjkBJNLge1CKPUIRA==} + motion-dom@13.0.0: + resolution: {integrity: sha512-Xk+SJas70uMAUIApg+m3lZDShxI3LBFHq7mFGbBKoRXc2PVPDyAKmzN64Bbzt4CZdP/CItTiJxWtn4TA0v53Ng==} - motion-utils@12.39.0: - resolution: {integrity: sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==} + motion-utils@13.0.0: + resolution: {integrity: sha512-7DnN7TmbLcYXcG4RVadXIihWlyuM9afoUww8Y5Agg431kGKiuL2/OMyP4mJ5wLz+pvN3t5ySClLOaVXJ+wekRQ==} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} @@ -5436,8 +5531,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier@3.9.4: - resolution: {integrity: sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg==} + prettier@3.9.6: + resolution: {integrity: sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==} engines: {node: '>=14'} hasBin: true @@ -6203,9 +6298,9 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript@6.0.3: - resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} - engines: {node: '>=14.17'} + typescript@7.0.2: + resolution: {integrity: sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==} + engines: {node: '>=16.20.0'} hasBin: true unbox-primitive@1.1.0: @@ -7785,21 +7880,21 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@docsearch/core@4.6.3(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@docsearch/core@4.6.3(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) '@docsearch/css@4.6.3': {} - '@docsearch/react@4.6.3(@algolia/client-search@5.52.0)(@types/react@19.2.17)(algoliasearch@5.52.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)': + '@docsearch/react@4.6.3(@algolia/client-search@5.52.0)(@types/react@19.2.18)(algoliasearch@5.52.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)': dependencies: '@algolia/autocomplete-core': 1.19.2(@algolia/client-search@5.52.0)(algoliasearch@5.52.0)(search-insights@2.17.3) - '@docsearch/core': 4.6.3(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@docsearch/core': 4.6.3(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docsearch/css': 4.6.3 optionalDependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) search-insights: 2.17.3 @@ -7841,7 +7936,7 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/bundler@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/bundler@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: '@babel/core': 7.29.6 '@docusaurus/babel': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -7860,7 +7955,7 @@ snapshots: mini-css-extract-plugin: 2.10.2(webpack@5.109.2(@swc/core@1.15.46)(postcss@8.5.25)) null-loader: 4.0.1(webpack@5.109.2(@swc/core@1.15.46)(postcss@8.5.25)) postcss: 8.5.25 - postcss-loader: 7.3.4(postcss@8.5.25)(typescript@6.0.3)(webpack@5.109.2(@swc/core@1.15.46)(postcss@8.5.25)) + postcss-loader: 7.3.4(postcss@8.5.25)(typescript@7.0.2)(webpack@5.109.2(@swc/core@1.15.46)(postcss@8.5.25)) postcss-preset-env: 10.6.1(postcss@8.5.25) terser-webpack-plugin: 5.6.1(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(webpack@5.109.2(@swc/core@1.15.46)(postcss@8.5.25)) tslib: 2.8.1 @@ -7886,16 +7981,16 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/core@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/core@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: '@docusaurus/babel': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@docusaurus/bundler': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/bundler': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/logger': 3.10.2 '@docusaurus/mdx-loader': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-common': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-validation': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.8) + '@mdx-js/react': 3.1.1(@types/react@19.2.18)(react@19.2.8) boxen: 6.2.1 chalk: 4.1.2 chokidar: 3.6.0 @@ -7964,10 +8059,10 @@ snapshots: postcss-sort-media-queries: 5.2.0(postcss@8.5.25) tslib: 2.8.1 - '@docusaurus/eslint-plugin@3.10.2(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)': + '@docusaurus/eslint-plugin@3.10.2(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2)': dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) - eslint: 9.39.4(jiti@1.21.7) + '@typescript-eslint/utils': 5.62.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2) + eslint: 10.8.1(jiti@1.21.7) tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -8056,7 +8151,7 @@ snapshots: dependencies: '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@types/history': 4.7.11 - '@types/react': 19.2.17 + '@types/react': 19.2.18 '@types/react-router-config': 5.0.11 '@types/react-router-dom': 5.3.3 react: 19.2.8 @@ -8079,13 +8174,13 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/plugin-content-blog@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-content-blog@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/logger': 3.10.2 '@docusaurus/mdx-loader': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-common': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -8127,13 +8222,13 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/logger': 3.10.2 '@docusaurus/mdx-loader': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/module-type-aliases': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-common': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -8173,9 +8268,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-content-pages@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-content-pages@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/mdx-loader': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -8209,9 +8304,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-css-cascade-layers@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-css-cascade-layers@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-validation': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -8242,9 +8337,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-debug@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-debug@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) fs-extra: 11.4.0 @@ -8276,9 +8371,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-analytics@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-google-analytics@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-validation': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 @@ -8308,9 +8403,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-gtag@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-google-gtag@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-validation': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 @@ -8340,9 +8435,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-google-tag-manager@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-google-tag-manager@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-validation': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 @@ -8372,9 +8467,9 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-sitemap@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-sitemap@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/logger': 3.10.2 '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -8409,14 +8504,14 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/plugin-svgr@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/plugin-svgr@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-validation': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@svgr/core': 8.1.0(typescript@6.0.3) - '@svgr/webpack': 8.1.0(typescript@6.0.3) + '@svgr/core': 8.1.0(typescript@7.0.2) + '@svgr/webpack': 8.1.0(typescript@7.0.2) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) tslib: 2.8.1 @@ -8445,22 +8540,22 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/preset-classic@3.10.2(@algolia/client-search@5.52.0)(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.17)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)(typescript@6.0.3)': - dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-content-blog': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-content-pages': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-css-cascade-layers': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-debug': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-google-analytics': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-google-gtag': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-google-tag-manager': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-sitemap': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-svgr': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/theme-classic': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@docusaurus/theme-search-algolia': 3.10.2(@algolia/client-search@5.52.0)(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.17)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)(typescript@6.0.3) + '@docusaurus/preset-classic@3.10.2(@algolia/client-search@5.52.0)(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.18)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)(typescript@7.0.2)': + dependencies: + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-content-blog': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-content-pages': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-css-cascade-layers': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-debug': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-google-analytics': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-google-gtag': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-google-tag-manager': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-sitemap': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-svgr': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/theme-classic': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@docusaurus/theme-search-algolia': 3.10.2(@algolia/client-search@5.52.0)(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.18)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)(typescript@7.0.2) '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) react: 19.2.8 react-dom: 19.2.8(react@19.2.8) @@ -8493,25 +8588,25 @@ snapshots: '@docusaurus/react-loadable@6.0.0(react@19.2.8)': dependencies: - '@types/react': 19.2.17 + '@types/react': 19.2.18 react: 19.2.8 - '@docusaurus/theme-classic@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.17)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@docusaurus/theme-classic@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/logger': 3.10.2 '@docusaurus/mdx-loader': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/module-type-aliases': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@docusaurus/plugin-content-blog': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/plugin-content-pages': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@docusaurus/plugin-content-blog': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/plugin-content-pages': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/theme-translations': 3.10.2 '@docusaurus/types': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-common': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-validation': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@mdx-js/react': 3.1.1(@types/react@19.2.17)(react@19.2.8) + '@mdx-js/react': 3.1.1(@types/react@19.2.18)(react@19.2.8) clsx: 2.1.1 copy-text-to-clipboard: 3.2.2 infima: 0.2.0-alpha.45 @@ -8549,15 +8644,15 @@ snapshots: - utf-8-validate - webpack-cli - '@docusaurus/theme-common@3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@docusaurus/theme-common@3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@docusaurus/mdx-loader': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/module-type-aliases': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) - '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-common': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@types/history': 4.7.11 - '@types/react': 19.2.17 + '@types/react': 19.2.18 '@types/react-router-config': 5.0.11 clsx: 2.1.1 parse-numeric-range: 1.3.0 @@ -8582,14 +8677,14 @@ snapshots: - uglify-js - webpack-cli - '@docusaurus/theme-search-algolia@3.10.2(@algolia/client-search@5.52.0)(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.17)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)(typescript@6.0.3)': + '@docusaurus/theme-search-algolia@3.10.2(@algolia/client-search@5.52.0)(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(@types/react@19.2.18)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3)(typescript@7.0.2)': dependencies: '@algolia/autocomplete-core': 1.19.8(@algolia/client-search@5.52.0)(algoliasearch@5.52.0)(search-insights@2.17.3) - '@docsearch/react': 4.6.3(@algolia/client-search@5.52.0)(@types/react@19.2.17)(algoliasearch@5.52.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3) - '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) + '@docsearch/react': 4.6.3(@algolia/client-search@5.52.0)(@types/react@19.2.18)(algoliasearch@5.52.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(search-insights@2.17.3) + '@docusaurus/core': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) '@docusaurus/logger': 3.10.2 - '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/theme-translations': 3.10.2 '@docusaurus/utils': 3.10.2(@swc/core@1.15.46)(clean-css@5.3.3)(cssnano@6.1.2(postcss@8.5.25))(html-minifier-terser@7.2.0)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-validation': 3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -8647,7 +8742,7 @@ snapshots: '@mdx-js/mdx': 3.1.1 '@types/history': 4.7.11 '@types/mdast': 4.0.4 - '@types/react': 19.2.17 + '@types/react': 19.2.18 commander: 5.1.0 joi: 17.13.4 react: 19.2.8 @@ -8677,7 +8772,7 @@ snapshots: '@mdx-js/mdx': 3.1.1 '@types/history': 4.7.11 '@types/mdast': 4.0.4 - '@types/react': 19.2.17 + '@types/react': 19.2.18 commander: 5.1.0 joi: 17.13.4 react: 19.2.8 @@ -8813,7 +8908,7 @@ snapshots: fs-extra: 11.4.0 github-slugger: 1.5.0 globby: 11.1.0 - gray-matter: 4.0.3(patch_hash=82198c3ee34e2823c4e9793c5209cf97bd566d5610c3f6582dc3f044ca423d6f) + gray-matter: 4.0.3(patch_hash=98353f0a10ca229a2cd27622e762c611b1fc5851e0ce1b9b10299ae74b15446f) jiti: 1.21.7 js-yaml: 4.3.0 lodash: 4.18.1 @@ -8889,10 +8984,10 @@ snapshots: cssesc: 3.0.0 immediate: 3.3.0 - '@easyops-cn/docusaurus-search-local@0.55.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/theme-common@3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3)': + '@easyops-cn/docusaurus-search-local@0.55.3(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@docusaurus/theme-common@3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2)': dependencies: - '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3) - '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@6.0.3))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + '@docusaurus/plugin-content-docs': 3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(debug@4.4.3)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2) + '@docusaurus/theme-common': 3.10.2(@docusaurus/plugin-content-docs@3.10.2(@docusaurus/faster@3.10.2(@docusaurus/types@3.10.2(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(postcss@8.5.25))(@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8))(@rspack/core@1.7.11)(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(typescript@7.0.2))(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/theme-translations': 3.10.1 '@docusaurus/utils': 3.10.1(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@docusaurus/utils-common': 3.10.1(@swc/core@1.15.46)(postcss@8.5.25)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -8950,55 +9045,34 @@ snapshots: tslib: 2.8.1 optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@9.39.4(jiti@1.21.7))': - dependencies: - eslint: 9.39.4(jiti@1.21.7) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.8.1(jiti@1.21.7))': dependencies: - eslint: 9.39.4(jiti@1.21.7) + eslint: 10.8.1(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.2': + '@eslint/config-array@0.23.5': dependencies: - '@eslint/object-schema': 2.1.7 + '@eslint/object-schema': 3.0.5 debug: 4.4.3 - minimatch: 3.1.5 + minimatch: 10.2.6 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': + '@eslint/config-helpers@0.7.0': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 - '@eslint/core@0.17.0': + '@eslint/core@1.2.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.5': - dependencies: - ajv: 6.15.0 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.3.0 - minimatch: 3.1.5 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@9.39.4': {} + '@eslint/object-schema@3.0.5': {} - '@eslint/object-schema@2.1.7': {} - - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.7.2': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 1.2.1 levn: 0.4.1 '@hapi/hoek@9.3.0': {} @@ -9007,13 +9081,18 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} @@ -9027,7 +9106,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -9214,10 +9293,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@3.1.1(@types/react@19.2.17)(react@19.2.8)': + '@mdx-js/react@3.1.1(@types/react@19.2.18)(react@19.2.8)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.2.17 + '@types/react': 19.2.18 react: 19.2.8 '@module-federation/error-codes@0.22.0': {} @@ -9569,12 +9648,12 @@ snapshots: '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.29.6) '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.29.6) - '@svgr/core@8.1.0(typescript@6.0.3)': + '@svgr/core@8.1.0(typescript@7.0.2)': dependencies: '@babel/core': 7.29.6 '@svgr/babel-preset': 8.1.0(@babel/core@7.29.6) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@6.0.3) + cosmiconfig: 8.3.6(typescript@7.0.2) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -9585,35 +9664,35 @@ snapshots: '@babel/types': 7.29.7 entities: 4.5.0 - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@6.0.3))': + '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@7.0.2))': dependencies: '@babel/core': 7.29.6 '@svgr/babel-preset': 8.1.0(@babel/core@7.29.6) - '@svgr/core': 8.1.0(typescript@6.0.3) + '@svgr/core': 8.1.0(typescript@7.0.2) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: - supports-color - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@6.0.3))(typescript@6.0.3)': + '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@7.0.2))(typescript@7.0.2)': dependencies: - '@svgr/core': 8.1.0(typescript@6.0.3) - cosmiconfig: 8.3.6(typescript@6.0.3) + '@svgr/core': 8.1.0(typescript@7.0.2) + cosmiconfig: 8.3.6(typescript@7.0.2) deepmerge: 4.3.1 svgo: 3.3.4 transitivePeerDependencies: - typescript - '@svgr/webpack@8.1.0(typescript@6.0.3)': + '@svgr/webpack@8.1.0(typescript@7.0.2)': dependencies: '@babel/core': 7.29.6 '@babel/plugin-transform-react-constant-elements': 7.27.1(@babel/core@7.29.6) '@babel/preset-env': 7.29.7(@babel/core@7.29.6) '@babel/preset-react': 7.29.7(@babel/core@7.29.6) '@babel/preset-typescript': 7.29.7(@babel/core@7.29.6) - '@svgr/core': 8.1.0(typescript@6.0.3) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@6.0.3)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@6.0.3))(typescript@6.0.3) + '@svgr/core': 8.1.0(typescript@7.0.2) + '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@7.0.2)) + '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@7.0.2))(typescript@7.0.2) transitivePeerDependencies: - supports-color - typescript @@ -9743,25 +9822,27 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/bonjour@3.5.13': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.9 - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/connect@3.4.38': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/debug@4.1.13': dependencies: '@types/ms': 2.1.0 + '@types/esrecurse@4.3.1': {} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.8 @@ -9772,7 +9853,7 @@ snapshots: '@types/express-serve-static-core@4.19.9': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -9802,7 +9883,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/istanbul-lib-coverage@2.0.6': {} @@ -9830,7 +9911,7 @@ snapshots: '@types/node@17.0.45': {} - '@types/node@26.1.0': + '@types/node@26.2.0': dependencies: undici-types: 8.3.0 @@ -9843,21 +9924,21 @@ snapshots: '@types/react-router-config@5.0.11': dependencies: '@types/history': 4.7.11 - '@types/react': 19.2.17 + '@types/react': 19.2.18 '@types/react-router': 5.1.20 '@types/react-router-dom@5.3.3': dependencies: '@types/history': 4.7.11 - '@types/react': 19.2.17 + '@types/react': 19.2.18 '@types/react-router': 5.1.20 '@types/react-router@5.1.20': dependencies: '@types/history': 4.7.11 - '@types/react': 19.2.17 + '@types/react': 19.2.18 - '@types/react@19.2.17': + '@types/react@19.2.18': dependencies: csstype: 3.2.3 @@ -9865,18 +9946,18 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/semver@7.7.1': {} '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/send@1.2.1': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/serve-index@1.9.4': dependencies: @@ -9885,12 +9966,12 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/unist@2.0.11': {} @@ -9898,7 +9979,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 '@types/yargs-parser@21.0.3': {} @@ -9906,40 +9987,40 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.63.0(@typescript-eslint/parser@8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3))(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)': + '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2))(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/type-utils': 8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) - '@typescript-eslint/utils': 8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.63.0 - eslint: 9.39.4(jiti@1.21.7) + '@typescript-eslint/parser': 8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/type-utils': 8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2) + '@typescript-eslint/visitor-keys': 8.67.0 + eslint: 10.8.1(jiti@1.21.7) ignore: 7.0.6 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 + ts-api-utils: 2.5.0(typescript@7.0.2) + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)': + '@typescript-eslint/parser@8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2)': dependencies: - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@7.0.2) + '@typescript-eslint/visitor-keys': 8.67.0 debug: 4.4.3 - eslint: 9.39.4(jiti@1.21.7) - typescript: 6.0.3 + eslint: 10.8.1(jiti@1.21.7) + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.63.0(typescript@6.0.3)': + '@typescript-eslint/project-service@8.67.0(typescript@7.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@6.0.3) - '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@7.0.2) + '@typescript-eslint/types': 8.67.0 debug: 4.4.3 - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -9948,32 +10029,32 @@ snapshots: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@8.63.0': + '@typescript-eslint/scope-manager@8.67.0': dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 - '@typescript-eslint/tsconfig-utils@8.63.0(typescript@6.0.3)': + '@typescript-eslint/tsconfig-utils@8.67.0(typescript@7.0.2)': dependencies: - typescript: 6.0.3 + typescript: 7.0.2 - '@typescript-eslint/type-utils@8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)': + '@typescript-eslint/type-utils@8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2)': dependencies: - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@6.0.3) - '@typescript-eslint/utils': 8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@7.0.2) + '@typescript-eslint/utils': 8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2) debug: 4.4.3 - eslint: 9.39.4(jiti@1.21.7) - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 + eslint: 10.8.1(jiti@1.21.7) + ts-api-utils: 2.5.0(typescript@7.0.2) + typescript: 7.0.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@8.63.0': {} + '@typescript-eslint/types@8.67.0': {} - '@typescript-eslint/typescript-estree@5.62.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@7.0.2)': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 @@ -9981,50 +10062,50 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.8.5 - tsutils: 3.21.0(typescript@6.0.3) + tsutils: 3.21.0(typescript@7.0.2) optionalDependencies: - typescript: 6.0.3 + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.63.0(typescript@6.0.3)': + '@typescript-eslint/typescript-estree@8.67.0(typescript@7.0.2)': dependencies: - '@typescript-eslint/project-service': 8.63.0(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.63.0(typescript@6.0.3) - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/visitor-keys': 8.63.0 + '@typescript-eslint/project-service': 8.67.0(typescript@7.0.2) + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@7.0.2) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 debug: 4.4.3 - minimatch: 10.2.5 + minimatch: 10.2.6 semver: 7.8.5 tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 + ts-api-utils: 2.5.0(typescript@7.0.2) + typescript: 7.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)': + '@typescript-eslint/utils@5.62.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.4(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@1.21.7)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@6.0.3) - eslint: 9.39.4(jiti@1.21.7) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@7.0.2) + eslint: 10.8.1(jiti@1.21.7) eslint-scope: 5.1.1 semver: 7.8.5 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.63.0(eslint@9.39.4(jiti@1.21.7))(typescript@6.0.3)': + '@typescript-eslint/utils@8.67.0(eslint@10.8.1(jiti@1.21.7))(typescript@7.0.2)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@9.39.4(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.63.0 - '@typescript-eslint/types': 8.63.0 - '@typescript-eslint/typescript-estree': 8.63.0(typescript@6.0.3) - eslint: 9.39.4(jiti@1.21.7) - typescript: 6.0.3 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@7.0.2) + eslint: 10.8.1(jiti@1.21.7) + typescript: 7.0.2 transitivePeerDependencies: - supports-color @@ -10033,11 +10114,71 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.63.0': + '@typescript-eslint/visitor-keys@8.67.0': dependencies: - '@typescript-eslint/types': 8.63.0 + '@typescript-eslint/types': 8.67.0 eslint-visitor-keys: 5.0.1 + '@typescript/typescript-aix-ppc64@7.0.2': + optional: true + + '@typescript/typescript-darwin-arm64@7.0.2': + optional: true + + '@typescript/typescript-darwin-x64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-freebsd-x64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm64@7.0.2': + optional: true + + '@typescript/typescript-linux-arm@7.0.2': + optional: true + + '@typescript/typescript-linux-loong64@7.0.2': + optional: true + + '@typescript/typescript-linux-mips64el@7.0.2': + optional: true + + '@typescript/typescript-linux-ppc64@7.0.2': + optional: true + + '@typescript/typescript-linux-riscv64@7.0.2': + optional: true + + '@typescript/typescript-linux-s390x@7.0.2': + optional: true + + '@typescript/typescript-linux-x64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-netbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-arm64@7.0.2': + optional: true + + '@typescript/typescript-openbsd-x64@7.0.2': + optional: true + + '@typescript/typescript-sunos-x64@7.0.2': + optional: true + + '@typescript/typescript-win32-arm64@7.0.2': + optional: true + + '@typescript/typescript-win32-x64@7.0.2': + optional: true + '@ungap/structured-clone@1.3.0': {} '@ungap/structured-clone@1.3.3': {} @@ -10127,10 +10268,6 @@ snapshots: mime-types: 2.1.35 negotiator: 0.6.3 - acorn-jsx@5.3.2(acorn@8.16.0): - dependencies: - acorn: 8.16.0 - acorn-jsx@5.3.2(acorn@8.18.0): dependencies: acorn: 8.18.0 @@ -10139,8 +10276,6 @@ snapshots: dependencies: acorn: 8.18.0 - acorn@8.16.0: {} - acorn@8.18.0: {} address@2.0.3: {} @@ -10163,13 +10298,6 @@ snapshots: ajv: 8.20.0 fast-deep-equal: 3.1.3 - ajv@6.14.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 @@ -10422,6 +10550,10 @@ snapshots: dependencies: balanced-match: 4.0.4 + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -10682,14 +10814,14 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig@8.3.6(typescript@6.0.3): + cosmiconfig@8.3.6(typescript@7.0.2): dependencies: import-fresh: 3.3.1 js-yaml: 4.3.0 parse-json: 5.2.0 path-type: 4.0.0 optionalDependencies: - typescript: 6.0.3 + typescript: 7.0.2 cross-spawn@7.0.6: dependencies: @@ -11161,22 +11293,22 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-config-prettier@10.1.8(eslint@9.39.4(jiti@1.21.7)): + eslint-config-prettier@10.1.8(eslint@10.8.1(jiti@1.21.7)): dependencies: - eslint: 9.39.4(jiti@1.21.7) + eslint: 10.8.1(jiti@1.21.7) - eslint-plugin-react-hooks@7.1.1(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-react-hooks@7.1.1(eslint@10.8.1(jiti@1.21.7)): dependencies: '@babel/core': 7.29.6 '@babel/parser': 7.29.2 - eslint: 9.39.4(jiti@1.21.7) + eslint: 10.8.1(jiti@1.21.7) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@1.21.7)): + eslint-plugin-react@7.37.5(eslint@10.8.1(jiti@1.21.7)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -11184,7 +11316,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.3.2 - eslint: 9.39.4(jiti@1.21.7) + eslint: 10.8.1(jiti@1.21.7) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -11203,39 +11335,36 @@ snapshots: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@8.4.0: + eslint-scope@9.1.2: dependencies: + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 esrecurse: 4.3.0 estraverse: 5.3.0 eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.1: {} - eslint-visitor-keys@5.0.1: {} - eslint@9.39.4(jiti@1.21.7): + eslint@10.8.1(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.8.1(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.2 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.39.4 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.2 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - ajv: 6.14.0 - chalk: 4.1.2 + '@types/estree': 1.0.9 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -11246,8 +11375,7 @@ snapshots: imurmurhash: 0.1.4 is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.5 + minimatch: 10.2.6 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -11255,11 +11383,11 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.4.0: + espree@11.2.0: dependencies: - acorn: 8.16.0 - acorn-jsx: 5.3.2(acorn@8.16.0) - eslint-visitor-keys: 4.2.1 + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 5.0.1 esquery@1.7.0: dependencies: @@ -11318,7 +11446,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 require-like: 0.1.2 eventemitter3@4.0.7: {} @@ -11458,12 +11586,12 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.4.2 + flatted: 3.4.4 keyv: 4.5.4 flat@5.0.2: {} - flatted@3.4.2: {} + flatted@3.4.4: {} follow-redirects@1.16.0(debug@4.4.3): optionalDependencies: @@ -11481,10 +11609,10 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.42.2(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + framer-motion@13.1.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: - motion-dom: 12.42.2 - motion-utils: 12.39.0 + motion-dom: 13.0.0 + motion-utils: 13.0.0 tslib: 2.8.1 optionalDependencies: react: 19.2.8 @@ -11570,8 +11698,6 @@ snapshots: dependencies: ini: 2.0.0 - globals@14.0.0: {} - globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -11614,7 +11740,7 @@ snapshots: graceful-fs@4.2.11: {} - gray-matter@4.0.3(patch_hash=82198c3ee34e2823c4e9793c5209cf97bd566d5610c3f6582dc3f044ca423d6f): + gray-matter@4.0.3(patch_hash=98353f0a10ca229a2cd27622e762c611b1fc5851e0ce1b9b10299ae74b15446f): dependencies: js-yaml: 4.3.0 kind-of: 6.0.3 @@ -12139,7 +12265,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 26.1.0 + '@types/node': 26.2.0 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -12147,13 +12273,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 26.1.0 + '@types/node': 26.2.0 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -12302,8 +12428,6 @@ snapshots: lodash.memoize@4.1.2: {} - lodash.merge@4.6.2: {} - lodash.uniq@4.5.0: {} lodash@4.18.1: {} @@ -12889,9 +13013,9 @@ snapshots: minimalistic-assert@1.0.1: {} - minimatch@10.2.5: + minimatch@10.2.6: dependencies: - brace-expansion: 5.0.8 + brace-expansion: 5.0.9 minimatch@3.1.5: dependencies: @@ -12926,11 +13050,11 @@ snapshots: html-minifier-terser: 7.2.0 postcss: 8.5.25 - motion-dom@12.42.2: + motion-dom@13.0.0: dependencies: - motion-utils: 12.39.0 + motion-utils: 13.0.0 - motion-utils@12.39.0: {} + motion-utils@13.0.0: {} mrmime@2.0.1: {} @@ -13351,9 +13475,9 @@ snapshots: '@csstools/utilities': 2.0.0(postcss@8.5.25) postcss: 8.5.25 - postcss-loader@7.3.4(postcss@8.5.25)(typescript@6.0.3)(webpack@5.109.2(@swc/core@1.15.46)(postcss@8.5.25)): + postcss-loader@7.3.4(postcss@8.5.25)(typescript@7.0.2)(webpack@5.109.2(@swc/core@1.15.46)(postcss@8.5.25)): dependencies: - cosmiconfig: 8.3.6(typescript@6.0.3) + cosmiconfig: 8.3.6(typescript@7.0.2) jiti: 1.21.7 postcss: 8.5.25 semver: 7.8.5 @@ -13652,7 +13776,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier@3.9.4: {} + prettier@3.9.6: {} pretty-error@4.0.0: dependencies: @@ -14492,18 +14616,18 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.5.0(typescript@6.0.3): + ts-api-utils@2.5.0(typescript@7.0.2): dependencies: - typescript: 6.0.3 + typescript: 7.0.2 tslib@1.14.1: {} tslib@2.8.1: {} - tsutils@3.21.0(typescript@6.0.3): + tsutils@3.21.0(typescript@7.0.2): dependencies: tslib: 1.14.1 - typescript: 6.0.3 + typescript: 7.0.2 tsyringe@4.10.0: dependencies: @@ -14559,7 +14683,28 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript@6.0.3: {} + typescript@7.0.2: + optionalDependencies: + '@typescript/typescript-aix-ppc64': 7.0.2 + '@typescript/typescript-darwin-arm64': 7.0.2 + '@typescript/typescript-darwin-x64': 7.0.2 + '@typescript/typescript-freebsd-arm64': 7.0.2 + '@typescript/typescript-freebsd-x64': 7.0.2 + '@typescript/typescript-linux-arm': 7.0.2 + '@typescript/typescript-linux-arm64': 7.0.2 + '@typescript/typescript-linux-loong64': 7.0.2 + '@typescript/typescript-linux-mips64el': 7.0.2 + '@typescript/typescript-linux-ppc64': 7.0.2 + '@typescript/typescript-linux-riscv64': 7.0.2 + '@typescript/typescript-linux-s390x': 7.0.2 + '@typescript/typescript-linux-x64': 7.0.2 + '@typescript/typescript-netbsd-arm64': 7.0.2 + '@typescript/typescript-netbsd-x64': 7.0.2 + '@typescript/typescript-openbsd-arm64': 7.0.2 + '@typescript/typescript-openbsd-x64': 7.0.2 + '@typescript/typescript-sunos-x64': 7.0.2 + '@typescript/typescript-win32-arm64': 7.0.2 + '@typescript/typescript-win32-x64': 7.0.2 unbox-primitive@1.1.0: dependencies: diff --git a/sidebars.js b/sidebars.js index 159cd6c..7e94d5d 100644 --- a/sidebars.js +++ b/sidebars.js @@ -1,4 +1,4 @@ -/** +/** * Creating a sidebar enables you to: - create an ordered group of docs - render a sidebar for each doc of that group @@ -7,6 +7,10 @@ The sidebars can be generated from the filesystem, or explicitly defined here. Create as many sidebars as you want. + + The documentation sidebar follows the Diataxis framework (https://diataxis.fr): + tutorials teach, how-to guides solve a specific problem, explanation provides + understanding, and reference (the separate sidebar below) describes the machinery. */ // @ts-check @@ -18,73 +22,85 @@ const sidebars = { 'introduction', { type: 'category', - label: 'Getting Started', - link: { - type: 'generated-index', - }, - collapsed: false, - items: [ - 'getting-started/licensing', - 'getting-started/requirements', - 'getting-started/download', - 'getting-started/creating-a-new-deployment', - 'getting-started/release-notes', - 'getting-started/upgrade-guidance-4x-to-v41', - 'getting-started/upgrade-guidance-v3x-to-v41', - 'getting-started/faq', - ], - }, - { - type: 'category', - label: 'Deployment Concepts', + label: 'Tutorials', link: { type: 'generated-index', + description: + 'Lessons that take you through building a working deployment, start to finish. Follow them in order if you are new to PSAppDeployToolkit.', }, collapsed: false, items: [ - 'deployment-concepts/deployment-structure', - 'deployment-concepts/invoke-appdeploytoolkit', - 'deployment-concepts/zero-config-deployment', + 'tutorials/your-first-deployment', + 'tutorials/adding-a-user-experience', ], }, { type: 'category', - label: 'Usage', + label: 'How-to Guides', link: { type: 'generated-index', + description: + 'Recipes for specific goals, for when you already know what you want to achieve.', }, collapsed: false, items: [ - 'usage/how-to-deploy', - 'usage/adding-ui-elements', - 'usage/customizing-deployments', - 'usage/installing-applications', - 'usage/admx-templates', + 'how-to/install-the-toolkit', + 'how-to/create-a-deployment', + 'how-to/run-a-deployment', + 'how-to/deploy-an-msi-with-zero-config', + 'how-to/install-applications', + 'how-to/close-apps-and-allow-deferral', + 'how-to/brand-the-user-interface', + 'how-to/customize-a-deployment', + 'how-to/extend-the-toolkit-with-custom-functions', + 'how-to/deploy-with-intune', + 'how-to/deploy-with-configmgr', + 'how-to/deploy-google-chrome-with-configmgr', + 'how-to/configure-with-group-policy', + 'how-to/set-the-log-path-with-group-policy', + 'how-to/troubleshoot-a-deployment', + 'how-to/upgrade-from-v4-0', + 'how-to/upgrade-from-v3', ], }, { type: 'category', - label: 'Examples', + label: 'Explanation', link: { type: 'generated-index', + description: + 'Background and reasoning, for when you want to understand why the toolkit behaves the way it does.', }, collapsed: false, items: [ - 'examples/admxtemplate-LogPath' /*, - 'examples/googlechrome-configmgr'*/, + 'explanation/architecture', + 'explanation/the-deployment-script', + 'explanation/deployment-modes', + 'explanation/configuration', + 'explanation/logging', + 'explanation/user-interface', ], }, ], reference: [ 'reference', + 'reference/requirements', + 'reference/deployment-template', + 'reference/module-structure', 'reference/adtsession-object', + 'reference/command-line-parameters', 'reference/variables', - 'reference/module-structure', 'reference/config-settings', 'reference/language-strings', 'reference/text-formatting', + 'reference/dialogs', 'reference/exit-codes', + 'reference/troubleshooting', + 'reference/process-execution', 'reference/v4-function-mapping', + 'reference/faq', + 'reference/release-notes', + 'reference/licensing', { type: 'category', label: 'Functions', @@ -100,18 +116,6 @@ const sidebars = { ], }, ], - // But you can create a sidebar manually - /* - tutorialSidebar: [ - 'intro', - 'hello', - { - type: 'category', - label: 'Tutorial', - items: ['tutorial-basics/create-a-document'], - }, - ], - */ }; export default sidebars; diff --git a/src/components/DocsVersionSelector/index.tsx b/src/components/DocsVersionSelector/index.tsx index 23410ca..42bbfcd 100644 --- a/src/components/DocsVersionSelector/index.tsx +++ b/src/components/DocsVersionSelector/index.tsx @@ -8,21 +8,36 @@ import { } from '@docusaurus/plugin-content-docs/client'; import {useHistorySelector} from '@docusaurus/theme-common'; import styles from './DocsVersionSelector.module.css'; +import {resolveVersionTargetDoc} from './versionDocMappings'; function getVersionMainDoc(version) { return version.docs.find((doc) => doc.id === version.mainDocId); } +function getVersionReferenceDoc(version) { + return version.docs.find((doc) => doc.id === 'reference'); +} + function getVersionTargetDoc(version, activeDocContext) { + const activeDocId = activeDocContext.activeDoc?.id; + const alternateDoc = activeDocContext.alternateDocVersions[version.name]; + const referenceDoc = activeDocId?.startsWith('reference/') + ? getVersionReferenceDoc(version) + : undefined; + return ( - activeDocContext.alternateDocVersions[version.name] ?? + resolveVersionTargetDoc(version, activeDocId, {fallback: alternateDoc}) ?? + referenceDoc ?? getVersionMainDoc(version) ); } export default function DocsVersionSelector(): React.JSX.Element | null { const [open, setOpen] = useState(false); + const [activeIndex, setActiveIndex] = useState(0); const containerRef = useRef(null); + const triggerRef = useRef(null); + const optionRefs = useRef>([]); const history = useHistory(); const docsPluginId = undefined; // default plugin @@ -37,19 +52,21 @@ export default function DocsVersionSelector(): React.JSX.Element | null { const displayedVersion = candidates.find((c) => versions.includes(c)) ?? versions[0]; - // Close on click outside - const handleClickOutside = useCallback( - (e: MouseEvent) => { - if ( - containerRef.current && - !containerRef.current.contains(e.target as Node) - ) { - setOpen(false); - } - }, - [], + const activeVersionIndex = Math.max( + versions.findIndex((v) => v === activeDocContext.activeVersion), + 0, ); + // Close on click outside + const handleClickOutside = useCallback((e: MouseEvent) => { + if ( + containerRef.current && + !containerRef.current.contains(e.target as Node) + ) { + setOpen(false); + } + }, []); + useEffect(() => { if (open) { document.addEventListener('mousedown', handleClickOutside); @@ -57,18 +74,24 @@ export default function DocsVersionSelector(): React.JSX.Element | null { return () => document.removeEventListener('mousedown', handleClickOutside); }, [open, handleClickOutside]); - // Close on Escape + // Move DOM focus to the highlighted option (roving tabindex) useEffect(() => { - const handleKeyDown = (e: KeyboardEvent) => { - if (e.key === 'Escape') { - setOpen(false); - } - }; if (open) { - document.addEventListener('keydown', handleKeyDown); + optionRefs.current[activeIndex]?.focus(); + } + }, [open, activeIndex]); + + const openMenu = (initialIndex: number) => { + setActiveIndex(initialIndex); + setOpen(true); + }; + + const closeMenu = (returnFocus = true) => { + setOpen(false); + if (returnFocus) { + triggerRef.current?.focus(); } - return () => document.removeEventListener('keydown', handleKeyDown); - }, [open]); + }; // Single version: render static label if (versions.length <= 1) { @@ -87,12 +110,66 @@ export default function DocsVersionSelector(): React.JSX.Element | null { history.push(`${targetDoc.path}${search}${hash}`); }; + const handleTriggerKeyDown = (e: React.KeyboardEvent) => { + switch (e.key) { + case 'ArrowDown': + case 'Enter': + case ' ': + e.preventDefault(); + openMenu(activeVersionIndex); + break; + case 'ArrowUp': + e.preventDefault(); + openMenu(versions.length - 1); + break; + default: + break; + } + }; + + const handleListKeyDown = (e: React.KeyboardEvent) => { + switch (e.key) { + case 'ArrowDown': + e.preventDefault(); + setActiveIndex((i) => (i + 1) % versions.length); + break; + case 'ArrowUp': + e.preventDefault(); + setActiveIndex((i) => (i - 1 + versions.length) % versions.length); + break; + case 'Home': + e.preventDefault(); + setActiveIndex(0); + break; + case 'End': + e.preventDefault(); + setActiveIndex(versions.length - 1); + break; + case 'Enter': + case ' ': + e.preventDefault(); + handleVersionClick(versions[activeIndex]); + break; + case 'Escape': + e.preventDefault(); + closeMenu(); + break; + case 'Tab': + closeMenu(false); + break; + default: + break; + } + }; + return (
Docs Version: {open && ( -
    - {versions.map((version) => { +
      + {versions.map((version, index) => { const isActive = version === activeDocContext.activeVersion; return (
    • { + optionRefs.current[index] = el; + }} role="option" aria-selected={isActive} className={`${styles.item} ${isActive ? styles.itemActive : ''}`} onClick={() => handleVersionClick(version)} - onKeyDown={(e) => { - if (e.key === 'Enter' || e.key === ' ') { - e.preventDefault(); - handleVersionClick(version); - } - }} - tabIndex={0} + tabIndex={index === activeIndex ? 0 : -1} > {version.label}
    • diff --git a/src/components/DocsVersionSelector/versionDocMappings.js b/src/components/DocsVersionSelector/versionDocMappings.js new file mode 100644 index 0000000..0baa0a4 --- /dev/null +++ b/src/components/DocsVersionSelector/versionDocMappings.js @@ -0,0 +1,105 @@ +export const versionDocMappings = [ + { + current: 'how-to/brand-the-user-interface', + '4.1.x': 'usage/adding-ui-elements', + '4.0.x': 'usage/adding-ui-elements', + '3.10.2': 'usage/adding-ui-elements', + }, + { + current: 'how-to/configure-with-group-policy', + '4.1.x': 'usage/admx-templates', + }, + { + current: 'how-to/create-a-deployment', + '4.1.x': 'getting-started/creating-a-new-deployment', + '4.0.x': 'getting-started/creating-a-new-deployment', + }, + { + current: 'how-to/customize-a-deployment', + '4.1.x': 'usage/customizing-deployments', + '4.0.x': 'usage/customizing-deployments', + '3.10.2': 'usage/customizing-deployments', + }, + { + current: 'how-to/deploy-an-msi-with-zero-config', + '4.1.x': 'deployment-concepts/zero-config-deployment', + '4.0.x': 'deployment-concepts/zero-config-deployment', + '3.10.2': 'understanding-the-layout/zero-config-deployment', + }, + { + current: 'how-to/install-applications', + '4.1.x': 'usage/installing-applications', + }, + { + current: 'how-to/install-the-toolkit', + '4.1.x': 'getting-started/download', + '4.0.x': 'getting-started/download', + '3.10.2': 'getting-started/download', + }, + { + current: 'how-to/run-a-deployment', + '4.1.x': 'usage/how-to-deploy', + '4.0.x': 'usage/how-to-deploy', + '3.10.2': 'usage/how-to-deploy', + }, + { + current: 'how-to/upgrade-from-v3', + '4.1.x': 'getting-started/upgrade-guidance-v3x-to-v41', + '4.0.x': 'getting-started/migrating-from-v3', + }, + { + current: 'how-to/upgrade-from-v4-0', + '4.1.x': 'getting-started/upgrade-guidance-4x-to-v41', + }, + { + current: 'how-to/set-the-log-path-with-group-policy', + '4.1.x': 'examples/admxtemplate-LogPath', + }, + { + current: 'explanation/the-deployment-script', + '4.1.x': 'deployment-concepts/invoke-appdeploytoolkit', + '4.0.x': 'deployment-concepts/invoke-appdeploytoolkit', + '3.10.2': 'understanding-the-layout/deployment-script', + }, + { + current: 'reference/deployment-template', + '4.1.x': 'deployment-concepts/deployment-structure', + '4.0.x': 'deployment-concepts/deployment-structure', + '3.10.2': 'understanding-the-layout/extracted-archive', + }, + { + current: 'reference/faq', + '4.1.x': 'getting-started/faq', + '4.0.x': 'getting-started/faq', + }, + { + current: 'reference/requirements', + '4.1.x': 'getting-started/requirements', + '4.0.x': 'getting-started/requirements', + '3.10.2': 'getting-started/requirements', + }, + { + current: 'reference/licensing', + '4.1.x': 'getting-started/licensing', + '4.0.x': 'getting-started/licensing', + '3.10.2': 'getting-started/licensing', + }, + { + current: 'reference/release-notes', + '4.1.x': 'getting-started/release-notes', + '4.0.x': 'getting-started/changes-in-v4', + }, +]; + +export function findVersionDocMapping(docId) { + return versionDocMappings.find((entry) => Object.values(entry).includes(docId)); +} + +// Resolves the equivalent doc in the target version for the active doc, if mapped. +export function resolveVersionTargetDoc(version, activeDocId, {fallback} = {}) { + const mappedId = findVersionDocMapping(activeDocId)?.[version.name]; + const mappedDoc = mappedId + ? version.docs.find((doc) => doc.id === mappedId) + : undefined; + return mappedDoc ?? fallback ?? undefined; +} diff --git a/src/theme/DocVersionBanner/index.js b/src/theme/DocVersionBanner/index.js new file mode 100644 index 0000000..8e52417 --- /dev/null +++ b/src/theme/DocVersionBanner/index.js @@ -0,0 +1,139 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * Swizzled to link the banner to the mapped equivalent doc in the latest + * version (via versionDocMappings) instead of always the same doc id. + */ +import React from 'react'; +import clsx from 'clsx'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Link from '@docusaurus/Link'; +import Translate from '@docusaurus/Translate'; +import { + useActiveDocContext, + useActivePlugin, + useDocVersionSuggestions, +} from '@docusaurus/plugin-content-docs/client'; +import {ThemeClassNames} from '@docusaurus/theme-common'; +import { + useDocsPreferredVersion, + useDocsVersion, +} from '@docusaurus/plugin-content-docs/client'; +import {resolveVersionTargetDoc} from '@site/src/components/DocsVersionSelector/versionDocMappings'; +function UnreleasedVersionLabel({siteTitle, versionMetadata}) { + return ( + {versionMetadata.label}, + }}> + { + 'This is unreleased documentation for {siteTitle} {versionLabel} version.' + } + + ); +} +function UnmaintainedVersionLabel({siteTitle, versionMetadata}) { + return ( + {versionMetadata.label}, + }}> + { + 'This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.' + } + + ); +} +const BannerLabelComponents = { + unreleased: UnreleasedVersionLabel, + unmaintained: UnmaintainedVersionLabel, +}; +function BannerLabel(props) { + const BannerLabelComponent = + BannerLabelComponents[props.versionMetadata.banner]; + return ; +} +function LatestVersionSuggestionLabel({versionLabel, to, onClick}) { + return ( + + + + latest version + + + + ), + }}> + { + 'For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).' + } + + ); +} +function DocVersionBannerEnabled({className, versionMetadata}) { + const { + siteConfig: {title: siteTitle}, + } = useDocusaurusContext(); + const {pluginId} = useActivePlugin({failfast: true}); + const getVersionMainDoc = (version) => + version.docs.find((doc) => doc.id === version.mainDocId); + const {savePreferredVersionName} = useDocsPreferredVersion(pluginId); + const {latestDocSuggestion, latestVersionSuggestion} = + useDocVersionSuggestions(pluginId); + const {activeDoc} = useActiveDocContext(pluginId); + // Try to link to the mapped equivalent doc in the latest version, falling + // back to the same doc, then to the main doc of the latest version. + const latestVersionSuggestedDoc = + resolveVersionTargetDoc(latestVersionSuggestion, activeDoc?.id, { + fallback: latestDocSuggestion, + }) ?? getVersionMainDoc(latestVersionSuggestion); + return ( +
      +
      + +
      +
      + savePreferredVersionName(latestVersionSuggestion.name)} + /> +
      +
      + ); +} +export default function DocVersionBanner({className}) { + const versionMetadata = useDocsVersion(); + if (versionMetadata.banner) { + return ( + + ); + } + return null; +}