enclose-io/compiler

View on GitHub
lts/tools/msvs/msi/product.wxs

Summary

Maintainability
Test Coverage
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <?define ProductName = "Node.js" ?>
  <?define ProductDescription = "Node.js" ?>
  <?define ProductAuthor = "Node.js Foundation" ?>

  <?define RegistryKeyPath = "SOFTWARE\Node.js" ?>

  <?define RepoDir="$(var.ProjectDir)..\..\..\" ?>
  <?define SourceDir="$(var.RepoDir)\$(var.Configuration)\" ?>

  <Product Id="*"
           Name="$(var.ProductName)"
           Language="!(loc.LocaleId)"
           Version="$(var.ProductVersion)"
           Manufacturer="$(var.ProductAuthor)"
           UpgradeCode="47c07a3a-42ef-4213-a85d-8f5a59077c28">

    <Package Languages="!(loc.LocaleId)"
             InstallerVersion="200"
             Compressed="yes"
             InstallScope="perMachine"/>

    <Condition Message="This application is only supported on Windows 7, Windows Server 2008 R2, or higher.">
      <![CDATA[Installed OR (VersionNT >= 601)]]>
    </Condition>

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes"/>

    <MajorUpgrade AllowSameVersionUpgrades="yes"
                  DowngradeErrorMessage="!(loc.MajorUpgrade_DowngradeErrorMessage)"/>

    <Upgrade Id="1d60944c-b9ce-4a71-a7c0-0384eb884baa">
      <UpgradeVersion Maximum="1.0.0"
                      IncludeMaximum="no"
                      Property="NODE_0X_DETECTED" />
      <UpgradeVersion Minimum="1.0.0"
                      IncludeMinimum="yes"
                      Property="EARLY_IO_DETECTED" />
    </Upgrade>

    <Icon Id="NodeIcon" SourceFile="$(var.RepoDir)\src\res\node.ico"/>
    <Property Id="ARPPRODUCTICON" Value="NodeIcon"/>
    <Property Id="ApplicationFolderName" Value="nodejs"/>
    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"/>

    <Property Id="INSTALLDIR" Secure="yes">
      <RegistrySearch Id="InstallPathRegistry"
                      Type="raw"
                      Root="HKLM"
                      Key="$(var.RegistryKeyPath)"
                      Name="InstallPath"/>
      <!-- Also need to search under HKCU to support upgrading from old
           versions. If we wanted to disable backward compatibility, this
           second search could be deleted. -->
      <RegistrySearch Id="InstallPathRegistryCU"
                      Type="raw"
                      Root="HKCU"
                      Key="$(var.RegistryKeyPath)"
                      Name="InstallPath"/>
    </Property>

    <Feature Id="NodeRuntime"
             Level="1"
             Title="!(loc.NodeRuntime_Title)"
             Description="!(loc.NodeRuntime_Description)"
             Absent="disallow">
      <ComponentRef Id="NodeExecutable"/>
      <ComponentRef Id="NodeRegistryEntries"/>
      <ComponentRef Id="NodeVarsScript"/>
      <ComponentRef Id="NodeStartMenu"/>
      <ComponentRef Id="AppData" />
      <ComponentRef Id="InstallToolsBat" />
      <ComponentGroupRef Id="Product.Generated"/>

      <Feature Id="NodeEtwSupport"
               Level="1"
               Title="!(loc.NodeEtwSupport_Title)"
               Description="!(loc.NodeEtwSupport_Description)">
        <ComponentRef Id="NodeEtwSupport"/>
      </Feature>
    </Feature>

    <Feature Id="npm"
             Level="1"
             Title="!(loc.npm_Title)"
             Description="!(loc.npm_Description)">
      <ComponentRef Id="NpmCmdScript"/>
      <ComponentRef Id="NpmBashScript"/>
      <ComponentRef Id="NpxCmdScript"/>
      <ComponentRef Id="NpxBashScript"/>
      <ComponentRef Id="NpmConfigurationFile"/>
      <ComponentRef Id="AppData" />
      <ComponentGroupRef Id="NpmSourceFiles"/>
    </Feature>

    <Feature Level="1"
             Id="DocumentationShortcuts"
             Title="!(loc.DocumentationShortcuts_Title)"
             Description="!(loc.DocumentationShortcuts_Description)">
      <ComponentRef Id="DocumentationShortcuts"/>
    </Feature>

    <Feature Id="EnvironmentPath"
             Level="1"
             Title="!(loc.EnvironmentPath_Title)"
             Description="!(loc.EnvironmentPath_Description)">
      <Feature Id="EnvironmentPathNode"
               Level="1"
               Title="!(loc.EnvironmentPathNode_Title)"
               Description="!(loc.EnvironmentPathNode_Description)">
        <ComponentRef Id="EnvironmentPathNode"/>
      </Feature>

      <Feature Id="EnvironmentPathNpmModules"
               Level="1"
               Title="!(loc.EnvironmentPathNpmModules_Title)"
               Description="!(loc.EnvironmentPathNpmModules_Description)">
        <ComponentRef Id="EnvironmentPathNpmModules"/>
      </Feature>
    </Feature>

    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="Node.js"/>
      </Directory>

      <Directory Id="$(var.ProgramFilesFolderId)">
        <Directory Id="INSTALLDIR" Name="nodejs">
        </Directory>
      </Directory>
    </Directory>

    <DirectoryRef Id="INSTALLDIR">
      <Component Id="NodeExecutable">
        <File Id="node.exe" KeyPath="yes" Source="$(var.SourceDir)\node.exe"/>
      </Component>

      <Component Id="NodeRegistryEntries">
        <RegistryValue Root="HKLM"
                       Key="$(var.RegistryKeyPath)"
                       Name="InstallPath"
                       Type="string"
                       Value="[INSTALLDIR]"
                       KeyPath="yes"/>
        <RegistryValue Root="HKLM"
                       Key="$(var.RegistryKeyPath)"
                       Name="Version"
                       Type="string"
                       Value="$(var.ProductVersion)"/>
      </Component>

      <Component Id="NodeVarsScript">
        <File Id="nodevars.bat" KeyPath="yes" Source="$(var.RepoDir)\tools\msvs\nodevars.bat"/>
      </Component>

      <Component Id="InstallToolsBat">
        <File Id="InstallToolsBat" KeyPath="yes" Source="$(var.RepoDir)\tools\msvs\install_tools\install_tools.bat"/>
      </Component>

      <?if $(var.NoETW) != 1 ?>
      <Component Id="NodeEtwSupport">
        <File Id="node_etw_provider.man" Source="$(var.RepoDir)\src\res\node_etw_provider.man">
          <util:EventManifest MessageFile="[INSTALLDIR]node.exe" ResourceFile="[INSTALLDIR]node.exe"/>
        </File>
      </Component>
      <?endif?>
    </DirectoryRef>

    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="NodeStartMenu">
        <!-- RegistryValue needed because every Component must have a KeyPath.
             Because of ICE43, the Root must be HKCU. -->
        <RegistryValue Root="HKCU"
                       Key="$(var.RegistryKeyPath)\Components"
                       Name="NodeStartMenuShortcuts"
                       Type="integer"
                       Value="1"
                       KeyPath="yes"/>
        <Shortcut Id="NodeVarsScriptShortcut"
                  Name="Node.js command prompt"
                  Target="[%ComSpec]"
                  Arguments='/k "[INSTALLDIR]nodevars.bat"'
                  Show="normal"
                  WorkingDirectory="INSTALLDIR"/>
        <Shortcut Id="InstallToolsShortcut"
                  Name="Install Additional Tools for Node.js"
                  Target="[%ComSpec]"
                  Arguments='/d /c "[INSTALLDIR]install_tools.bat"'
                  Show="normal"
                  WorkingDirectory="INSTALLDIR"/>
        <Shortcut Id="NodeExecutableShortcut"
                  Name="Node.js"
                  Target="[INSTALLDIR]node.exe"
                  WorkingDirectory="INSTALLDIR"/>
        <Shortcut Id="UninstallProduct"
                  Name="Uninstall Node.js"
                  Target="[SystemFolder]msiexec.exe"
                  Arguments="/x [ProductCode]"/>
        <RemoveFolder Id="RemoveApplicationProgramsFolder"
                      On="uninstall"/>
      </Component>
    </DirectoryRef>

    <DirectoryRef Id="INSTALLDIR">
      <Component Id="NpmCmdScript">
        <File Id="npm.cmd" KeyPath="yes" Source="$(var.NpmSourceDir)\bin\npm.cmd"/>
      </Component>

      <Component Id="NpmBashScript">
        <File Id="npm.sh" KeyPath="yes" Source="$(var.NpmSourceDir)\bin\npm"/>
      </Component>

      <Component Id="NpxCmdScript">
        <File Id="npx.cmd" KeyPath="yes" Source="$(var.NpmSourceDir)\bin\npx.cmd"/>
      </Component>

      <Component Id="NpxBashScript">
        <File Id="npx.sh" KeyPath="yes" Source="$(var.NpmSourceDir)\bin\npx"/>
      </Component>

      <Directory Id="NodeModulesFolder" Name="node_modules">
        <Directory Id="NpmFolder" Name="npm">
          <Component Id="NpmConfigurationFile">
            <File Id="npm.rc" KeyPath="yes" Source="$(var.RepoDir)\tools\msvs\npm\npmrc"/>
          </Component>
        </Directory>
      </Directory>

      <Directory Id="AppDataFolder">
        <Directory Id="AppDataDir" Name="npm">
          <Component Id="AppData" Guid="D3B35D0E-D0F9-4D11-A773-D4608E90E1D1">
            <CreateFolder />
            <RemoveFolder Id="AppDataDir" On="uninstall" />
            <RegistryValue Root="HKCU" Key="$(var.RegistryKeyPath)\Components" Type="string" Value="" />
          </Component>
        </Directory>
      </Directory>
    </DirectoryRef>

    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="DocumentationShortcuts">
        <RegistryValue Root="HKCU"
                       Key="$(var.RegistryKeyPath)\Components"
                       Name="DocumentationShortcuts"
                       Type="integer"
                       Value="1"
                       KeyPath="yes"/>
        <util:InternetShortcut Id="WebsiteShortcut"
                               Name="Node.js website"
                               Target="https://nodejs.org/"
                               Type="url"/>
        <util:InternetShortcut Id="DocsShortcut"
                               Name="Node.js documentation"
                               Target="https://nodejs.org/download/$(var.DistTypeDir)/v$(var.FullVersion)/docs/api/"
                               Type="url"/>
      </Component>
    </DirectoryRef>

    <DirectoryRef Id="INSTALLDIR">
      <Component Id="EnvironmentPathNode">
        <RegistryValue Root="HKLM"
                       Key="$(var.RegistryKeyPath)\Components"
                       Name="EnvironmentPathNode"
                       Type="integer"
                       Value="1"
                       KeyPath="yes"/>
        <Environment Id="EnvironmentPathNode"
                     Action="set"
                     Name="PATH"
                     Part="last"
                     System="yes"
                     Value="[INSTALLDIR]"/>
      </Component>

      <Component Id="EnvironmentPathNpmModules">
        <RegistryValue Root="HKCU"
                       Key="$(var.RegistryKeyPath)\Components"
                       Name="EnvironmentPathNpmModules"
                       Type="integer"
                       Value="1"
                       KeyPath="yes"/>
        <Environment Id="EnvironmentPathNpmModules"
                     Action="set"
                     Name="PATH"
                     Part="last"
                     System="no"
                     Value="[AppDataFolder]npm"/>
      </Component>
    </DirectoryRef>

    <Binary Id='CustomActionsDLL'
            SourceFile='$(var.custom_actions.TargetDir)$(var.custom_actions.TargetName).dll' />

    <CustomAction Id="SetInstallScope"
                  BinaryKey="CustomActionsDLL"
                  DllEntry="SetInstallScope"
                  Execute="immediate"
                  Return="check" />

    <CustomAction Id="BroadcastEnvironmentUpdate"
                  BinaryKey="CustomActionsDLL"
                  DllEntry="BroadcastEnvironmentUpdate"
                  Execute="immediate"
                  Return="check" />

    <Property Id="WixShellExecTarget" Value="[#InstallToolsBat]" />
    <CustomAction Id="LaunchApplication" BinaryKey="WixCA" DllEntry="WixShellExec" />

    <InstallUISequence>
      <Custom Action='SetInstallScope' Before='FindRelatedProducts'/>
    </InstallUISequence>

    <InstallExecuteSequence>
      <Custom Action='SetInstallScope' Before='FindRelatedProducts'/>
      <Custom Action='BroadcastEnvironmentUpdate' After='InstallFinalize'/>
    </InstallExecuteSequence>

    <UI Id="NodeInstallUI">
      <TextStyle Id="WixUI_Font_Normal" FaceName="Tahoma" Size="8"/>
      <TextStyle Id="WixUI_Font_Bigger" FaceName="Tahoma" Size="12"/>
      <TextStyle Id="WixUI_Font_Title" FaceName="Tahoma" Size="9" Bold="yes"/>

      <Property Id="DefaultUIFont" Value="WixUI_Font_Normal"/>
      <Property Id="WixUI_Mode" Value="FeatureTree"/>

      <DialogRef Id="ErrorDlg"/>
      <DialogRef Id="FatalError"/>
      <DialogRef Id="FilesInUse"/>
      <DialogRef Id="MsiRMFilesInUse"/>
      <DialogRef Id="PrepareDlg"/>
      <DialogRef Id="ProgressDlg"/>
      <DialogRef Id="ResumeDlg"/>
      <DialogRef Id="UserExit"/>
      <DialogRef Id="WelcomeDlg"/>
      <DialogRef Id="LicenseAgreementDlg"/>
      <DialogRef Id="InstallDirDlg"/>
      <DialogRef Id="BrowseDlg"/>
      <DialogRef Id="InvalidDirDlg"/>
      <Dialog Id="NativeToolsDlg" Width="370" Height="270" Title="!(loc.NativeToolsDlg_Title)">
        <Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.NativeToolsDlgBannerBitmap)" />
        <Control Id="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.NativeToolsDlgTitle)" />
        <Control Id="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.NativeToolsDlgDescription)" />
        <Control Id="BannerLine" Type="Line" X="0" Y="44" Width="370" Height="0" />

        <Control Id="Intro" Type="Text" X="20" Y="65" Width="330" Height="30" NoPrefix="yes" Text="!(loc.NativeToolsDlgIntro)" />
        <Control Id="InstallCheckbox" Type="CheckBox" X="20" Y="105" Width="330" Height="30" Property="NATIVETOOLSCHECKBOX" CheckBoxValue="1" Text="!(loc.NativeToolsDlgInstallCheckbox)" />
        <Control Id="ManualDetails" Type="Hyperlink" X="20" Y="140" Width="330" Height="30" Text="!(loc.NativeToolsDlgManualDetails)" />

        <Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
        <Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" />
        <Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
        <Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
          <Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
        </Control>
      </Dialog>

      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="LicenseAgreementDlg">NOT Installed</Publish>
      <Publish Dialog="WelcomeDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">Installed AND PATCH</Publish>
      <Publish Dialog="LicenseAgreementDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg">1</Publish>
      <Publish Dialog="LicenseAgreementDlg" Control="Next" Event="NewDialog" Value="InstallDirDlg">LicenseAccepted = "1"</Publish>
      <Publish Dialog="InstallDirDlg" Control="Back" Event="NewDialog" Value="LicenseAgreementDlg">1</Publish>
      <Publish Dialog="InstallDirDlg" Control="Next" Event="NewDialog" Value="CustomizeDlg" Order="20">1</Publish>
      <Publish Dialog="InstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="10">1</Publish>
      <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="10">1</Publish>
      <Publish Dialog="InstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="BrowseDlg" Order="20">1</Publish>
      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg" Order="1">NOT Installed OR WixUI_InstallMode = "Change"</Publish>
      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
      <Publish Dialog="VerifyReadyDlg" Control="Back" Event="NewDialog" Value="WelcomeDlg" Order="3">Installed AND PATCH</Publish>
      <Publish Dialog="MaintenanceTypeDlg" Control="ChangeButton" Event="NewDialog" Value="CustomizeDlg">1</Publish>
      <Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="MaintenanceTypeDlg">1</Publish>
      <Publish Dialog="MaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
      <Publish Dialog="MaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
      <Publish Dialog="MaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
      <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="MaintenanceTypeDlg" Order="1">Installed</Publish>
      <Publish Dialog="CustomizeDlg" Control="Back" Event="NewDialog" Value="InstallDirDlg" Order="2">NOT Installed</Publish>
      <Publish Dialog="CustomizeDlg" Control="Next" Event="NewDialog" Value="NativeToolsDlg">1</Publish>
      <Publish Dialog="NativeToolsDlg" Control="Back" Event="NewDialog" Value="CustomizeDlg">1</Publish>
      <Publish Dialog="NativeToolsDlg" Control="Next" Event="NewDialog" Value="VerifyReadyDlg">1</Publish>
      <Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="LaunchApplication">NATIVETOOLSCHECKBOX = 1</Publish>
      <Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>

      <Property Id="WIXUI_EXITDIALOGOPTIONALTEXT" Value="!(loc.WIXUI_EXITDIALOGOPTIONALTEXT)"/>
    </UI>

    <UIRef Id="WixUI_Common"/>
    <UIRef Id="WixUI_ErrorProgressText"/>
    <WixVariable Id="WixUIBannerBmp" Value="$(var.RepoDir)\doc\thin-white-stripe.jpg"/>
    <WixVariable Id="WixUIDialogBmp" Value="$(var.RepoDir)\doc\full-white-stripe.jpg"/>
    <WixVariable Id="WixUILicenseRtf" Value="$(var.SourceDir)\LICENSE.rtf"/>
  </Product>

</Wix>