├── .gitignore ├── .npmignore ├── .travis.yml ├── CONTRIBUTING.md ├── LICENSE ├── manifest-to-test ├── invalid_200.xml ├── invalid_400.xml ├── invalid_resid_length.xml ├── valid_excel.xml ├── valid_onenote.xml ├── valid_outlook.xml ├── valid_powerpoint.xml ├── valid_project.xml └── valid_word.xml ├── package-lock.json ├── package.json ├── readme.md ├── src ├── docs │ └── valid.gif ├── index.ts ├── test │ └── test.ts └── util.ts ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. 2 | # See LICENSE in the project root for license information. 3 | 4 | # Created by https://www.gitignore.io/api/osx,windows 5 | 6 | ### OSX ### 7 | .DS_Store 8 | .AppleDouble 9 | .LSOverride 10 | 11 | # Icon must end with two \r 12 | Icon 13 | 14 | 15 | # Thumbnails 16 | ._* 17 | 18 | # Files that might appear in the root of a volume 19 | .DocumentRevisions-V100 20 | .fseventsd 21 | .Spotlight-V100 22 | .TemporaryItems 23 | .Trashes 24 | .VolumeIcon.icns 25 | 26 | # Directories potentially created on remote AFP share 27 | .AppleDB 28 | .AppleDesktop 29 | Network Trash Folder 30 | Temporary Items 31 | .apdisk 32 | 33 | 34 | ### Windows ### 35 | # Windows image file caches 36 | Thumbs.db 37 | ehthumbs.db 38 | 39 | # Folder config file 40 | Desktop.ini 41 | 42 | # Recycle Bin used on file shares 43 | $RECYCLE.BIN/ 44 | 45 | # Windows Installer files 46 | *.cab 47 | *.msi 48 | *.msm 49 | *.msp 50 | 51 | # Windows shortcuts 52 | *.lnk 53 | 54 | # Ignore the following folders 55 | .vs 56 | .idea 57 | *.log 58 | obj 59 | bin 60 | *.user 61 | 62 | node_modules/** 63 | app/** 64 | packages/** 65 | .vscode/** 66 | # manifest-to-test/** -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. 2 | # See LICENSE in the project root for license information. 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. 2 | # See LICENSE in the project root for license information. 3 | 4 | sudo: false 5 | language: node_js 6 | cache: 7 | directories: 8 | - node_modules 9 | node_js: 10 | - 'stable' 11 | - '6.9.1' 12 | before_script: "npm run build" 13 | script: "npm run test" 14 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribute to Microsoft Office Add-in Manifest Validator 2 | 3 | Thank you for your interest in this library! Your contributions and improvements will help the developer community. 4 | * [Ways to contribute](https://github.com/OfficeDev/office-addin-validator/blob/master/CONTRIBUTING.md#ways-to-contribute) 5 | * [Before we can accept your pull request](https://github.com/OfficeDev/office-addin-validator/blob/master/CONTRIBUTING.md#before-we-can-accept-your-pull-request) 6 | * [Use GitHub, Git, and this repository](https://github.com/OfficeDev/office-addin-validator/blob/master/CONTRIBUTING.md#use-github-git-and-this-repository) 7 | * [More resources](https://github.com/OfficeDev/office-addin-validator/blob/master/CONTRIBUTING.md#more-resources) 8 | 9 | ## Ways to contribute 10 | You can contribute to Office Project Generator in these ways: 11 | * Provide feedback 12 | * Report bugs and suggest enhancements via [GitHub Issues](https://github.com/OfficeDev/office-addin-validator/issues) 13 | * Do it yourself 14 | * You can go and fix the [Issues](https://github.com/OfficeDev/office-addin-validator/issues) yourself and submit the changes as a [Pull Request](https://github.com/OfficeDev/office-addin-validator/pulls) for review. 15 | * You can submit [code comment contributions](https://github.com/OfficeDev/office-addin-validator/blob/master/CONTRIBUTING.md#provide-better-code-comments) where you want a better explanation of the code. 16 | 17 | ## Before we can accept your pull request 18 | If you submit new or significant changes to documentation and code examples, you need to send us a signed Contribution License Agreement (CLA) before we can accept your pull request if you are in one of these groups: 19 | * Members of the Microsoft Open Technologies group 20 | * Contributors who don't work for Microsoft 21 | 22 | As a community member, you must sign the Contribution License Agreement (CLA) before you can contribute large submissions to this project, but you need to complete and submit the documentation only once. The Office 365 organization on GitHub will send a link to the CLA that we want you to sign via email. By signing the CLA, you acknowledge the rights of the GitHub community to use any code that you submit. The intellectual property represented by the code contribution is licensed for use by Microsoft open source projects. Please carefully review the document; you may also need to have your employer sign the document. 23 | 24 | Signing the Contribution License Agreement (CLA) does not grant you rights to commit to the main repository, but it does mean that the Office Developer and Office Developer Content Publishing teams will be able to review and consider your contributions and you will get credit if we do. 25 | 26 | Once we receive and process your CLA, we'll do our best to review your pull requests within 10 business days. 27 | 28 | ## Use GitHub, Git, and this repository 29 | **Note**: Most of the information in this section can be found in [GitHub Help](https://help.github.com/) articles. If you're familiar with Git and GitHub, skip to the Contribute code section for the specifics of the code contributions for this repository. 30 | 31 | ### To set up your fork of the repository 32 | 1. Set up a GitHub account so you can contribute to this project. If you haven't done this, go to [GitHub](https://github.com/join) and do it now. 33 | 1. Install Git on your computer. Follow the steps in the Setting up Git Tutorial. 34 | 1. Create your own fork of this repository. To do this, at the top of the page, choose the Fork button. 35 | 1. Copy your fork to your computer. To do this, open Git Bash. At the command prompt enter: 36 | 37 | ``` 38 | git clone https://github.com//.git 39 | ``` 40 | Next, create a reference to the root repository by entering these commands: 41 | ``` 42 | cd 43 | git remote add upstream https://github.com/OfficeDev/.git 44 | git fetch upstream 45 | ``` 46 | Congratulations! You've now set up your repository. You won't need to repeat these steps again. 47 | 48 | ### Provide better code comments 49 | Code comments make code samples even better by helping developers learn to use the code correctly in their own applications. If you spot a class, method, or section of code that you think could use better descriptions, then create a pull request with your code comments. 50 | In general we want our code comments to follow these guidelines: 51 | 52 | * Any code that has associated documentation displayed in an IDE (such as IntelliSense, or JavaDocs) has code comments. 53 | * Classes, methods, parameters, and return values have clear descriptions. 54 | * Exceptions and errors are documented. 55 | * Remarks exist for anything special or notable about the code. 56 | * Sections of code that have complex algorithms have appropriate comments describing what they do. 57 | * Code added from Stack Overflow, or any other source, is clearly attributed. 58 | 59 | ### Contribute code 60 | To make the contribution process as seamless as possible for you, follow this procedure. 61 | 62 | 1. Create a new branch. 63 | 1. Add new content or edit existing content. 64 | 1. Submit a pull request to the main repository. 65 | 1. Delete the branch. 66 | 67 | Limit each branch to a single module to streamline the workflow and reduce the chance of merge conflicts. The following types of contribution are appropriate for a new branch: 68 | 69 | * A correction to the slide deck 70 | * Instruction step fixes or additional clarification in hands on labs 71 | * Code fixes in sample starter or completed projects 72 | * Spelling and grammar edits on a hands on lab 73 | 74 | #### Create a new branch 75 | 1. Open GitBash. 76 | 1. Type `git pull upstream master:` at the prompt. This creates a new branch locally that's copied from the latest OfficeDev master branch. **Note**: For internal contributors, replace `master` in the command with the branch for the publishing date you're targeting. 77 | 1. Type `git push origin ` at the prompt. This will alert GitHub to the new branch. You should now see the new branch in your fork of the repository on GitHub. 78 | 1. Type `git checkout ` to switch to your new branch. 79 | 80 | #### Add new content or edit existing content 81 | Navigate to the repository on your computer. On a Windows PC, the repository files are in `C:\Users\\`. 82 | Use the IDE of your choice to modify and build the library. Once you have completed your change, commented your code, and test, check the code into the remote branch on GitHub. 83 | 84 | Be sure to satisfy all of the requirements in the following list before submitting a pull request: 85 | * Follow the code style found in the cloned repository code. 86 | * Code must be tested. 87 | * Test the library UI thoroughly to be sure nothing has been broken by your change. 88 | Keep the size of your code change reasonable. If the repository owner cannot review your code change in 4 hours or less, your pull request may not be reviewed and approved quickly. 89 | * Avoid unnecessary changes to cloned or forked code. The reviewer will use a tool to find the differences between your code and the original code. Whitespace changes are called out along with your code. Be sure your changes will help improve the content. 90 | 91 | #### Push your code to the remote GitHub branch 92 | The files in `C:\Users\\` are a working copy of the new branch that you created in your local repository. Changing anything in this folder doesn't affect the local repository until you commit a change. To commit a change to the local repository, type the following commands in GitBash: 93 | ``` 94 | git add . 95 | git commit -v -a -m "" 96 | ``` 97 | The `add` command adds your changes to a staging area in preparation for committing them to the repository. The period after the `add` command specifies that you want to stage all of the files that you added or modified, checking subfolders recursively. (If you don't want to commit all of the changes, you can add specific files. You can also undo a commit. For help, type `git add -help` or `git status`.) 98 | 99 | The `commit` command applies the staged changes to the repository. The switch `-m` means you are providing the commit comment in the command line. The `-v` and `-a` switches can be omitted. The `-v` switch is for verbose output from the command, and `-a` does what you already did with the add command. 100 | 101 | You can commit multiple times while you are doing your work, or you can commit once when you're done. 102 | 103 | #### Submit a pull request to the main repository 104 | 105 | When you're finished with your work and are ready to have it merged into the central repository, follow these steps. 106 | 107 | 1. In GitBash, type `git push origin ` at the command prompt. In your local repository, origin refers to your GitHub repository that you cloned the local repository from. This command pushes the current state of your new branch, including all commits made in the previous steps, to your GitHub fork. 108 | 1. On the GitHub site, navigate in your fork to the new branch. 109 | 1. Click the **Pull Request** button at the top of the page. 110 | 1. Ensure that the Base branch is `OfficeDev/@master` and the Head branch is `/@`. 111 | 1. Click the **Update Commit Range** button. 112 | 1. Give your pull request a Title, and describe all the changes you're making. If your bug fixes a UserVoice item or GitHub issue, be sure to reference that issue in the description. 113 | 1. Submit the pull request. 114 | 115 | One of the site administrators will now process your pull request. Your pull request will surface on the `OfficeDev/` site under Issues. When the pull request is accepted, the issue will be resolved. 116 | 117 | #### Create a new branch after merging 118 | After a branch is successfully merged (i.e., your pull request is accepted), don't continue working in the local branch that was successfully merged upstream. This can lead to merge conflicts if you submit another pull request. Instead, if you want to do another update, create a new local branch from the successfully merged upstream branch. 119 | 120 | For example, suppose your local branch X was successfully merged into the OfficeDev/office-addin-validator master branch and you want to make additional updates to the content that was merged. Create a new local branch, X2, from the OfficeDev/office-addin-validator master branch. To do this, open GitBash and execute the following commands: 121 | ``` 122 | cd 123 | git pull upstream master:X2 124 | git push origin X2 125 | ``` 126 | You now have local copies (in a new local branch) of the work that you submitted in branch X. The X2 branch also contains all the work other developers have merged, so if your work depends on others' work (for example, a base class), it is available in the new branch. You can verify that your previous work (and others' work) is in the branch by checking out the new branch... 127 | ``` 128 | git checkout X2 129 | ``` 130 | ...and verifying the code. (The `checkout` command updates the files in `C:\Users\\office-addin-validator` to the current state of the X2 branch.) Once you check out the new branch, you can make updates to the code and commit them as usual. However, to avoid working in the merged branch (X) by mistake, it's best to delete it (see the following **Delete a branch** section). 131 | 132 | #### Delete a branch 133 | Once your changes are successfully merged into the central repository, you can delete the branch you used because you no longer need it. Any additional work requires a new branch. 134 | 135 | To delete your branch follow these steps: 136 | 137 | 1. In GitBash type `git checkout master` at the command prompt. This ensures that you aren't in the branch to be deleted (which isn't allowed). 138 | 1. Next, type `git branch -d ` at the command prompt. This deletes the branch on your local machine only if it has been successfully merged to the upstream repository. (You can override this behavior with the `–D` flag, but first be sure you want to do this.) 139 | 1. Finally, type `git push origin :` at the command prompt (a space before the colon and no space after it). This will delete the branch on your github fork. 140 | 141 | Congratulations, you have successfully contributed to the project. 142 | 143 | ## More resources 144 | * To learn more about Markdown, see [Daring Fireball](http://daringfireball.net/). 145 | * To learn more about using Git and GitHub, check out the [GitHub Help section](http://help.github.com/). 146 | 147 | Copyright (c) 2017 Microsoft Corporation. All rights reserved. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License 2 | 3 | Copyright (c) 2017 Microsoft Corporation. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /manifest-to-test/invalid_200.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 49ef0d46-e27b-4e17-8f97-1b5391ca3089 13 | 14 | 15 | 1.0.0.0 16 | [Provider name] 17 | en-US 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | AppDomain1 32 | AppDomain2 33 | AppDomain3 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | ReadWriteDocument 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | <!-- Description of the Getting Started callout. resid points to a LongString resource --> 65 | <Description resid="Contoso.GetStarted.Description"/> 66 | 67 | <!-- Point to a url resource which details how the add-in should be used. --> 68 | <LearnMoreUrl resid="Contoso.GetStarted.LearnMoreUrl"/> 69 | </GetStarted> 70 | <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. 71 | Think of the FunctionFile as the code behind ExecuteFunction. --> 72 | <FunctionFile resid="Contoso.DesktopFunctionFile.Url" /> 73 | 74 | <!-- PrimaryCommandSurface is the main Office Ribbon. --> 75 | <ExtensionPoint xsi:type="PrimaryCommandSurface"> 76 | <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> 77 | <OfficeTab id="TabHome"> 78 | <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> 79 | <Group id="Contoso.Group1"> 80 | <!-- Label for your group. resid must point to a ShortString resource. --> 81 | <Label resid="Contoso.Group1Label" /> 82 | <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> 83 | <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> 84 | <Icon> 85 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 86 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 87 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 88 | </Icon> 89 | 90 | <!-- Control. It can be of type "Button" or "Menu". --> 91 | <Control xsi:type="Button" id="Contoso.TaskpaneButton"> 92 | <Label resid="Contoso.TaskpaneButton.Label" /> 93 | <Supertip> 94 | <!-- ToolTip title. resid must point to a ShortString resource. --> 95 | <Title resid="Contoso.TaskpaneButton.Label" /> 96 | <!-- ToolTip description. resid must point to a LongString resource. --> 97 | <Description resid="Contoso.TaskpaneButton.Tooltip" /> 98 | </Supertip> 99 | <Icon> 100 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 101 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 102 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 103 | </Icon> 104 | 105 | <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> 106 | <Action xsi:type="ShowTaskpane"> 107 | <TaskpaneId>ButtonId1</TaskpaneId> 108 | <!-- Provide a url resource id for the location that will be displayed on the task pane. --> 109 | <SourceLocation resid="Contoso.Taskpane.Url" /> 110 | </Action> 111 | </Control> 112 | </Group> 113 | </OfficeTab> 114 | </ExtensionPoint> 115 | </DesktopFormFactor> 116 | </Host> 117 | </Hosts> 118 | 119 | <!-- You can use resources across hosts and form factors. --> 120 | <Resources> 121 | <bt:Images> 122 | <bt:Image id="Contoso.tpicon_16x16" DefaultValue="https://localhost:3000/assets/icon-16.png" /> 123 | <bt:Image id="Contoso.tpicon_32x32" DefaultValue="https://localhost:3000/assets/icon-32.png" /> 124 | <bt:Image id="Contoso.tpicon_80x80" DefaultValue="https://localhost:3000/assets/icon-80.png" /> 125 | </bt:Images> 126 | <bt:Urls> 127 | <bt:Url id="Contoso.Taskpane.Url" DefaultValue="https://localhost:3000/index.html" /> 128 | <bt:Url id="Contoso.GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> 129 | <bt:Url id="Contoso.DesktopFunctionFile.Url" DefaultValue="https://localhost:3000/function-file/function-file.html" /> 130 | </bt:Urls> 131 | <!-- ShortStrings max characters==125. --> 132 | <bt:ShortStrings> 133 | <bt:String id="Contoso.TaskpaneButton.Label" DefaultValue="Show Taskpane" /> 134 | <bt:String id="Contoso.Group1Label" DefaultValue="Commands Group" /> 135 | <bt:String id="Contoso.GetStarted.Title" DefaultValue="Get started with your sample add-in!" /> 136 | </bt:ShortStrings> 137 | <!-- LongStrings max characters==250. --> 138 | <bt:LongStrings> 139 | <bt:String id="Contoso.TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> 140 | <bt:String id="Contoso.GetStarted.Description" DefaultValue="Your sample add-in loaded succesfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> 141 | </bt:LongStrings> 142 | </Resources> 143 | </VersionOverrides> 144 | <!-- End Add-in Commands Mode integration. --> 145 | 146 | </OfficeApp> 147 | -------------------------------------------------------------------------------- /manifest-to-test/invalid_400.xml: -------------------------------------------------------------------------------- 1 | Making this an invalid xml 2 | <?xml version="1.0" encoding="UTF-8"?> 3 | <OfficeApp 4 | xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 5 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 | xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 7 | xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides" 8 | xsi:type="TaskPaneApp"> 9 | 10 | <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. --> 11 | 12 | <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. --> 13 | <Id>49ef0d46-e27b-4e17-8f97-1b5391ca3089</Id> 14 | 15 | <!--Version. Updates from the store only get triggered if there is a version change. --> 16 | <Version>1.0.0.0</Version> 17 | <ProviderName>[Provider name]</ProviderName> 18 | <DefaultLocale>en-US</DefaultLocale> 19 | <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. --> 20 | <DisplayName DefaultValue="My Office Add-in" /> 21 | <Description DefaultValue="[Notebook Add-in description]"/> 22 | 23 | <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. --> 24 | <!--<IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png" />--> 25 | <!--<HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/hi-res-icon.png"/>--> 26 | 27 | <!--If you plan to submit this add-in to the Office Store, uncomment the SupportUrl element below--> 28 | <!--<SupportUrl DefaultValue="[Insert the URL of a page that provides support information for the app]" />--> 29 | 30 | <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. --> 31 | <AppDomains> 32 | <AppDomain>AppDomain1</AppDomain> 33 | <AppDomain>AppDomain2</AppDomain> 34 | <AppDomain>AppDomain3</AppDomain> 35 | </AppDomains> 36 | <!--End Basic Settings. --> 37 | 38 | <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. --> 39 | <Hosts> 40 | <Host Name="Notebook" /> 41 | </Hosts> 42 | <DefaultSettings> 43 | <SourceLocation DefaultValue="https://localhost:3000/index.html" /> 44 | </DefaultSettings> 45 | <!-- End TaskPane Mode integration. --> 46 | 47 | <Permissions>ReadWriteDocument</Permissions> 48 | 49 | <!-- Begin Add-in Commands Mode integration. --> 50 | <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0"> 51 | 52 | <!-- The Hosts node is required. --> 53 | <Hosts> 54 | <!-- Each host can have a different set of commands. --> 55 | <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. --> 56 | <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. --> 57 | <Host xsi:type="Notebook"> 58 | <!-- Form factor. Currently only DesktopFormFactor is supported. --> 59 | <DesktopFormFactor> 60 | <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."--> 61 | <GetStarted> 62 | <!-- Title of the Getting Started callout. resid points to a ShortString resource --> 63 | <Title resid="Contoso.GetStarted.Title"/> 64 | 65 | <!-- Description of the Getting Started callout. resid points to a LongString resource --> 66 | <Description resid="Contoso.GetStarted.Description"/> 67 | 68 | <!-- Point to a url resource which details how the add-in should be used. --> 69 | <LearnMoreUrl resid="Contoso.GetStarted.LearnMoreUrl"/> 70 | </GetStarted> 71 | <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. 72 | Think of the FunctionFile as the code behind ExecuteFunction. --> 73 | <FunctionFile resid="Contoso.DesktopFunctionFile.Url" /> 74 | 75 | <!-- PrimaryCommandSurface is the main Office Ribbon. --> 76 | <ExtensionPoint xsi:type="PrimaryCommandSurface"> 77 | <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> 78 | <OfficeTab id="TabHome"> 79 | <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> 80 | <Group id="Contoso.Group1"> 81 | <!-- Label for your group. resid must point to a ShortString resource. --> 82 | <Label resid="Contoso.Group1Label" /> 83 | <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> 84 | <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> 85 | <Icon> 86 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 87 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 88 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 89 | </Icon> 90 | 91 | <!-- Control. It can be of type "Button" or "Menu". --> 92 | <Control xsi:type="Button" id="Contoso.TaskpaneButton"> 93 | <Label resid="Contoso.TaskpaneButton.Label" /> 94 | <Supertip> 95 | <!-- ToolTip title. resid must point to a ShortString resource. --> 96 | <Title resid="Contoso.TaskpaneButton.Label" /> 97 | <!-- ToolTip description. resid must point to a LongString resource. --> 98 | <Description resid="Contoso.TaskpaneButton.Tooltip" /> 99 | </Supertip> 100 | <Icon> 101 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 102 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 103 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 104 | </Icon> 105 | 106 | <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> 107 | <Action xsi:type="ShowTaskpane"> 108 | <TaskpaneId>ButtonId1</TaskpaneId> 109 | <!-- Provide a url resource id for the location that will be displayed on the task pane. --> 110 | <SourceLocation resid="Contoso.Taskpane.Url" /> 111 | </Action> 112 | </Control> 113 | </Group> 114 | </OfficeTab> 115 | </ExtensionPoint> 116 | </DesktopFormFactor> 117 | </Host> 118 | </Hosts> 119 | 120 | <!-- You can use resources across hosts and form factors. --> 121 | <Resources> 122 | <bt:Images> 123 | <bt:Image id="Contoso.tpicon_16x16" DefaultValue="https://localhost:3000/assets/icon-16.png" /> 124 | <bt:Image id="Contoso.tpicon_32x32" DefaultValue="https://localhost:3000/assets/icon-32.png" /> 125 | <bt:Image id="Contoso.tpicon_80x80" DefaultValue="https://localhost:3000/assets/icon-80.png" /> 126 | </bt:Images> 127 | <bt:Urls> 128 | <bt:Url id="Contoso.Taskpane.Url" DefaultValue="https://localhost:3000/index.html" /> 129 | <bt:Url id="Contoso.GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> 130 | <bt:Url id="Contoso.DesktopFunctionFile.Url" DefaultValue="https://localhost:3000/function-file/function-file.html" /> 131 | </bt:Urls> 132 | <!-- ShortStrings max characters==125. --> 133 | <bt:ShortStrings> 134 | <bt:String id="Contoso.TaskpaneButton.Label" DefaultValue="Show Taskpane" /> 135 | <bt:String id="Contoso.Group1Label" DefaultValue="Commands Group" /> 136 | <bt:String id="Contoso.GetStarted.Title" DefaultValue="Get started with your sample add-in!" /> 137 | </bt:ShortStrings> 138 | <!-- LongStrings max characters==250. --> 139 | <bt:LongStrings> 140 | <bt:String id="Contoso.TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> 141 | <bt:String id="Contoso.GetStarted.Description" DefaultValue="Your sample add-in loaded succesfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> 142 | </bt:LongStrings> 143 | </Resources> 144 | </VersionOverrides> 145 | <!-- End Add-in Commands Mode integration. --> 146 | 147 | </OfficeApp> 148 | -------------------------------------------------------------------------------- /manifest-to-test/invalid_resid_length.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <OfficeApp 3 | xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 4 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 | xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 6 | xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="TaskPaneApp"> 7 | <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. --> 8 | <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. --> 9 | <Id>49ef0d46-e27b-4e17-8f97-1b5391ca3089</Id> 10 | <!--Version. Updates from the store only get triggered if there is a version change. --> 11 | <Version>1.0.0.0</Version> 12 | <ProviderName>[Provider name]</ProviderName> 13 | <DefaultLocale>en-US</DefaultLocale> 14 | <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. --> 15 | <DisplayName DefaultValue="My Office Add-in" /> 16 | <Description DefaultValue="[Notebook Add-in description]"/> 17 | <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. --> 18 | <!--<IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png" />--> 19 | <!--<HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/hi-res-icon.png" />--> 20 | <!--If you plan to submit this add-in to the Office Store, uncomment the SupportUrl element below--> 21 | <!--<SupportUrl DefaultValue="[Insert the URL of a page that provides support information for the app]" />--> 22 | <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. --> 23 | <AppDomains> 24 | <AppDomain>AppDomain1</AppDomain> 25 | <AppDomain>AppDomain2</AppDomain> 26 | <AppDomain>AppDomain3</AppDomain> 27 | </AppDomains> 28 | <!--End Basic Settings. --> 29 | <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. --> 30 | <Hosts> 31 | <Host Name="Notebook" /> 32 | </Hosts> 33 | <DefaultSettings> 34 | <SourceLocation DefaultValue="https://localhost:3000/index.html" /> 35 | </DefaultSettings> 36 | <!-- End TaskPane Mode integration. --> 37 | <Permissions>ReadWriteDocument</Permissions> 38 | <!-- Begin Add-in Commands Mode integration. --> 39 | <VersionOverrides 40 | xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0"> 41 | <!-- The Hosts node is required. --> 42 | <Hosts> 43 | <!-- Each host can have a different set of commands. --> 44 | <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. --> 45 | <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. --> 46 | <Host xsi:type="Notebook"> 47 | <!-- Form factor. Currently only DesktopFormFactor is supported. --> 48 | <DesktopFormFactor> 49 | <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."--> 50 | <GetStarted> 51 | <!-- Title of the Getting Started callout. resid points to a ShortString resource --> 52 | <Title resid="Contoso.GetStarted.Title"/> 53 | <!-- Description of the Getting Started callout. resid points to a LongString resource --> 54 | <Description resid="Contoso.GetStarted.Description"/> 55 | <!-- Point to a url resource which details how the add-in should be used. --> 56 | <LearnMoreUrl resid="Contoso.GetStarted.LearnMoreUrl"/> 57 | </GetStarted> 58 | <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. 59 | Think of the FunctionFile as the code behind ExecuteFunction. --> 60 | <FunctionFile resid="Contoso.DesktopFunctionFile.Url" /> 61 | <!-- PrimaryCommandSurface is the main Office Ribbon. --> 62 | <ExtensionPoint xsi:type="PrimaryCommandSurface"> 63 | <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> 64 | <OfficeTab id="TabHome"> 65 | <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> 66 | <Group id="Contoso.Group1"> 67 | <!-- Label for your group. resid must point to a ShortString resource. --> 68 | <Label resid="Contoso.Group1Label" /> 69 | <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> 70 | <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> 71 | <Icon> 72 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 73 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 74 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 75 | </Icon> 76 | <!-- Control. It can be of type "Button" or "Menu". --> 77 | <Control xsi:type="Button!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" id="Contoso.TaskpaneButton"> 78 | <Label resid="Contoso.TaskpaneButton.Label" /> 79 | <Supertip> 80 | <!-- ToolTip title. resid must point to a ShortString resource. --> 81 | <Title resid="Contoso.TaskpaneButton.Label" /> 82 | <!-- ToolTip description. resid must point to a LongString resource. --> 83 | <Description resid="Contoso.TaskpaneButton.Tooltip" /> 84 | </Supertip> 85 | <Icon> 86 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 87 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 88 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 89 | </Icon> 90 | <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> 91 | <Action xsi:type="ShowTaskpane"> 92 | <TaskpaneId>ButtonId1</TaskpaneId> 93 | <!-- Provide a url resource id for the location that will be displayed on the task pane. --> 94 | <SourceLocation resid="Contoso.Taskpane.Url" /> 95 | </Action> 96 | </Control> 97 | </Group> 98 | </OfficeTab> 99 | </ExtensionPoint> 100 | </DesktopFormFactor> 101 | </Host> 102 | </Hosts> 103 | <!-- You can use resources across hosts and form factors. --> 104 | <Resources> 105 | <bt:Images> 106 | <bt:Image id="Contoso.tpicon_16x16" DefaultValue="https://localhost:3000/assets/icon-16.png" /> 107 | <bt:Image id="Contoso.tpicon_32x32" DefaultValue="https://localhost:3000/assets/icon-32.png" /> 108 | <bt:Image id="Contoso.tpicon_80x80" DefaultValue="https://localhost:3000/assets/icon-80.png" /> 109 | </bt:Images> 110 | <bt:Urls> 111 | <bt:Url id="Contoso.Taskpane.Url" DefaultValue="https://localhost:3000/index.html" /> 112 | <bt:Url id="Contoso.GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> 113 | <bt:Url id="Contoso.DesktopFunctionFile.Url" DefaultValue="https://localhost:3000/function-file/function-file.html" /> 114 | </bt:Urls> 115 | <!-- ShortStrings max characters==125. --> 116 | <bt:ShortStrings> 117 | <bt:String id="Contoso.TaskpaneButton.Label0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" DefaultValue="Show Taskpane" /> 118 | <bt:String id="Contoso.Group1Label" DefaultValue="Commands Group" /> 119 | <bt:String id="Contoso.GetStarted.Title" DefaultValue="Get started with your sample add-in!" /> 120 | </bt:ShortStrings> 121 | <!-- LongStrings max characters==250. --> 122 | <bt:LongStrings> 123 | <bt:String id="Contoso.TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> 124 | <bt:String id="Contoso.GetStarted.Description" DefaultValue="Your sample add-in loaded succesfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> 125 | </bt:LongStrings> 126 | </Resources> 127 | </VersionOverrides> 128 | <!-- End Add-in Commands Mode integration. --> 129 | </OfficeApp> 130 | -------------------------------------------------------------------------------- /manifest-to-test/valid_excel.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <OfficeApp 3 | xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 4 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 | xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 6 | xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides" 7 | xsi:type="TaskPaneApp"> 8 | 9 | <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. --> 10 | 11 | <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. --> 12 | <Id>b9ec0d5b-db38-43bf-be0b-179cf715cc20</Id> 13 | 14 | <!--Version. Updates from the store only get triggered if there is a version change. --> 15 | <Version>1.0.0.0</Version> 16 | <ProviderName>[Provider name]</ProviderName> 17 | <DefaultLocale>en-US</DefaultLocale> 18 | <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. --> 19 | <DisplayName DefaultValue="Excel Add-in" /> 20 | <Description DefaultValue="[Workbook Add-in description]"/> 21 | 22 | <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. --> 23 | <IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png" /> 24 | <HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/hi-res-icon.png"/> 25 | 26 | <!--If you plan to submit this add-in to the Office Store, uncomment the SupportUrl element below--> 27 | <SupportUrl DefaultValue="[Insert the URL of a page that provides support information for the app]" /> 28 | 29 | <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. --> 30 | <AppDomains> 31 | <AppDomain>AppDomain1</AppDomain> 32 | <AppDomain>AppDomain2</AppDomain> 33 | <AppDomain>AppDomain3</AppDomain> 34 | </AppDomains> 35 | <!--End Basic Settings. --> 36 | 37 | <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. --> 38 | <Hosts> 39 | <Host Name="Workbook" /> 40 | </Hosts> 41 | <DefaultSettings> 42 | <SourceLocation DefaultValue="https://localhost:3000/index.html" /> 43 | </DefaultSettings> 44 | <!-- End TaskPane Mode integration. --> 45 | 46 | <Permissions>ReadWriteDocument</Permissions> 47 | 48 | <!-- Begin Add-in Commands Mode integration. --> 49 | <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0"> 50 | 51 | <!-- The Hosts node is required. --> 52 | <Hosts> 53 | <!-- Each host can have a different set of commands. --> 54 | <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. --> 55 | <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. --> 56 | <Host xsi:type="Workbook"> 57 | <!-- Form factor. Currently only DesktopFormFactor is supported. --> 58 | <DesktopFormFactor> 59 | <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."--> 60 | <GetStarted> 61 | <!-- Title of the Getting Started callout. resid points to a ShortString resource --> 62 | <Title resid="Contoso.GetStarted.Title"/> 63 | 64 | <!-- Description of the Getting Started callout. resid points to a LongString resource --> 65 | <Description resid="Contoso.GetStarted.Description"/> 66 | 67 | <!-- Point to a url resource which details how the add-in should be used. --> 68 | <LearnMoreUrl resid="Contoso.GetStarted.LearnMoreUrl"/> 69 | </GetStarted> 70 | <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. 71 | Think of the FunctionFile as the code behind ExecuteFunction. --> 72 | <FunctionFile resid="Contoso.DesktopFunctionFile.Url" /> 73 | 74 | <!-- PrimaryCommandSurface is the main Office Ribbon. --> 75 | <ExtensionPoint xsi:type="PrimaryCommandSurface"> 76 | <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> 77 | <OfficeTab id="TabHome"> 78 | <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> 79 | <Group id="Contoso.Group1"> 80 | <!-- Label for your group. resid must point to a ShortString resource. --> 81 | <Label resid="Contoso.Group1Label" /> 82 | <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> 83 | <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> 84 | <Icon> 85 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 86 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 87 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 88 | </Icon> 89 | 90 | <!-- Control. It can be of type "Button" or "Menu". --> 91 | <Control xsi:type="Button" id="Contoso.TaskpaneButton"> 92 | <Label resid="Contoso.TaskpaneButton.Label" /> 93 | <Supertip> 94 | <!-- ToolTip title. resid must point to a ShortString resource. --> 95 | <Title resid="Contoso.TaskpaneButton.Label" /> 96 | <!-- ToolTip description. resid must point to a LongString resource. --> 97 | <Description resid="Contoso.TaskpaneButton.Tooltip" /> 98 | </Supertip> 99 | <Icon> 100 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 101 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 102 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 103 | </Icon> 104 | 105 | <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> 106 | <Action xsi:type="ShowTaskpane"> 107 | <TaskpaneId>ButtonId1</TaskpaneId> 108 | <!-- Provide a url resource id for the location that will be displayed on the task pane. --> 109 | <SourceLocation resid="Contoso.Taskpane.Url" /> 110 | </Action> 111 | </Control> 112 | </Group> 113 | </OfficeTab> 114 | </ExtensionPoint> 115 | </DesktopFormFactor> 116 | </Host> 117 | </Hosts> 118 | 119 | <!-- You can use resources across hosts and form factors. --> 120 | <Resources> 121 | <bt:Images> 122 | <bt:Image id="Contoso.tpicon_16x16" DefaultValue="https://localhost:3000/assets/icon-16.png" /> 123 | <bt:Image id="Contoso.tpicon_32x32" DefaultValue="https://localhost:3000/assets/icon-32.png" /> 124 | <bt:Image id="Contoso.tpicon_80x80" DefaultValue="https://localhost:3000/assets/icon-80.png" /> 125 | </bt:Images> 126 | <bt:Urls> 127 | <bt:Url id="Contoso.Taskpane.Url" DefaultValue="https://localhost:3000/index.html" /> 128 | <bt:Url id="Contoso.GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> 129 | <bt:Url id="Contoso.DesktopFunctionFile.Url" DefaultValue="https://localhost:3000/function-file/function-file.html" /> 130 | </bt:Urls> 131 | <!-- ShortStrings max characters==125. --> 132 | <bt:ShortStrings> 133 | <bt:String id="Contoso.TaskpaneButton.Label" DefaultValue="Show Taskpane" /> 134 | <bt:String id="Contoso.Group1Label" DefaultValue="Commands Group" /> 135 | <bt:String id="Contoso.GetStarted.Title" DefaultValue="Get started with your sample add-in!" /> 136 | </bt:ShortStrings> 137 | <!-- LongStrings max characters==250. --> 138 | <bt:LongStrings> 139 | <bt:String id="Contoso.TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> 140 | <bt:String id="Contoso.GetStarted.Description" DefaultValue="Your sample add-in loaded succesfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> 141 | </bt:LongStrings> 142 | </Resources> 143 | </VersionOverrides> 144 | <!-- End Add-in Commands Mode integration. --> 145 | 146 | </OfficeApp> 147 | -------------------------------------------------------------------------------- /manifest-to-test/valid_onenote.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <OfficeApp 3 | xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 4 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 | xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 6 | xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides" 7 | xsi:type="TaskPaneApp"> 8 | 9 | <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. --> 10 | 11 | <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. --> 12 | <Id>271abc3e-5f05-4738-868a-fa8486751bfd</Id> 13 | 14 | <!--Version. Updates from the store only get triggered if there is a version change. --> 15 | <Version>1.0.0.0</Version> 16 | <ProviderName>[Provider name]</ProviderName> 17 | <DefaultLocale>en-US</DefaultLocale> 18 | <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. --> 19 | <DisplayName DefaultValue="OneNote Add-in" /> 20 | <Description DefaultValue="[Notebook Add-in description]"/> 21 | 22 | <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. --> 23 | <IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png" /> 24 | <HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/hi-res-icon.png"/> 25 | 26 | <!--If you plan to submit this add-in to the Office Store, uncomment the SupportUrl element below--> 27 | <SupportUrl DefaultValue="[Insert the URL of a page that provides support information for the app]" /> 28 | 29 | <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. --> 30 | <AppDomains> 31 | <AppDomain>AppDomain1</AppDomain> 32 | <AppDomain>AppDomain2</AppDomain> 33 | <AppDomain>AppDomain3</AppDomain> 34 | </AppDomains> 35 | <!--End Basic Settings. --> 36 | 37 | <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. --> 38 | <Hosts> 39 | <Host Name="Notebook" /> 40 | </Hosts> 41 | <DefaultSettings> 42 | <SourceLocation DefaultValue="https://localhost:3000/index.html" /> 43 | </DefaultSettings> 44 | <!-- End TaskPane Mode integration. --> 45 | 46 | <Permissions>ReadWriteDocument</Permissions> 47 | 48 | <!-- Begin Add-in Commands Mode integration. --> 49 | <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0"> 50 | 51 | <!-- The Hosts node is required. --> 52 | <Hosts> 53 | <!-- Each host can have a different set of commands. --> 54 | <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. --> 55 | <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. --> 56 | <Host xsi:type="Notebook"> 57 | <!-- Form factor. Currently only DesktopFormFactor is supported. --> 58 | <DesktopFormFactor> 59 | <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."--> 60 | <GetStarted> 61 | <!-- Title of the Getting Started callout. resid points to a ShortString resource --> 62 | <Title resid="Contoso.GetStarted.Title"/> 63 | 64 | <!-- Description of the Getting Started callout. resid points to a LongString resource --> 65 | <Description resid="Contoso.GetStarted.Description"/> 66 | 67 | <!-- Point to a url resource which details how the add-in should be used. --> 68 | <LearnMoreUrl resid="Contoso.GetStarted.LearnMoreUrl"/> 69 | </GetStarted> 70 | <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. 71 | Think of the FunctionFile as the code behind ExecuteFunction. --> 72 | <FunctionFile resid="Contoso.DesktopFunctionFile.Url" /> 73 | 74 | <!-- PrimaryCommandSurface is the main Office Ribbon. --> 75 | <ExtensionPoint xsi:type="PrimaryCommandSurface"> 76 | <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> 77 | <OfficeTab id="TabHome"> 78 | <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> 79 | <Group id="Contoso.Group1"> 80 | <!-- Label for your group. resid must point to a ShortString resource. --> 81 | <Label resid="Contoso.Group1Label" /> 82 | <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> 83 | <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> 84 | <Icon> 85 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 86 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 87 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 88 | </Icon> 89 | 90 | <!-- Control. It can be of type "Button" or "Menu". --> 91 | <Control xsi:type="Button" id="Contoso.TaskpaneButton"> 92 | <Label resid="Contoso.TaskpaneButton.Label" /> 93 | <Supertip> 94 | <!-- ToolTip title. resid must point to a ShortString resource. --> 95 | <Title resid="Contoso.TaskpaneButton.Label" /> 96 | <!-- ToolTip description. resid must point to a LongString resource. --> 97 | <Description resid="Contoso.TaskpaneButton.Tooltip" /> 98 | </Supertip> 99 | <Icon> 100 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 101 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 102 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 103 | </Icon> 104 | 105 | <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> 106 | <Action xsi:type="ShowTaskpane"> 107 | <TaskpaneId>ButtonId1</TaskpaneId> 108 | <!-- Provide a url resource id for the location that will be displayed on the task pane. --> 109 | <SourceLocation resid="Contoso.Taskpane.Url" /> 110 | </Action> 111 | </Control> 112 | </Group> 113 | </OfficeTab> 114 | </ExtensionPoint> 115 | </DesktopFormFactor> 116 | </Host> 117 | </Hosts> 118 | 119 | <!-- You can use resources across hosts and form factors. --> 120 | <Resources> 121 | <bt:Images> 122 | <bt:Image id="Contoso.tpicon_16x16" DefaultValue="https://localhost:3000/assets/icon-16.png" /> 123 | <bt:Image id="Contoso.tpicon_32x32" DefaultValue="https://localhost:3000/assets/icon-32.png" /> 124 | <bt:Image id="Contoso.tpicon_80x80" DefaultValue="https://localhost:3000/assets/icon-80.png" /> 125 | </bt:Images> 126 | <bt:Urls> 127 | <bt:Url id="Contoso.Taskpane.Url" DefaultValue="https://localhost:3000/index.html" /> 128 | <bt:Url id="Contoso.GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> 129 | <bt:Url id="Contoso.DesktopFunctionFile.Url" DefaultValue="https://localhost:3000/function-file/function-file.html" /> 130 | </bt:Urls> 131 | <!-- ShortStrings max characters==125. --> 132 | <bt:ShortStrings> 133 | <bt:String id="Contoso.TaskpaneButton.Label" DefaultValue="Show Taskpane" /> 134 | <bt:String id="Contoso.Group1Label" DefaultValue="Commands Group" /> 135 | <bt:String id="Contoso.GetStarted.Title" DefaultValue="Get started with your sample add-in!" /> 136 | </bt:ShortStrings> 137 | <!-- LongStrings max characters==250. --> 138 | <bt:LongStrings> 139 | <bt:String id="Contoso.TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> 140 | <bt:String id="Contoso.GetStarted.Description" DefaultValue="Your sample add-in loaded succesfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> 141 | </bt:LongStrings> 142 | </Resources> 143 | </VersionOverrides> 144 | <!-- End Add-in Commands Mode integration. --> 145 | 146 | </OfficeApp> 147 | -------------------------------------------------------------------------------- /manifest-to-test/valid_outlook.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <OfficeApp 3 | xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 4 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 | xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 6 | xmlns:mailappor="http://schemas.microsoft.com/office/mailappversionoverrides/1.0" 7 | xsi:type="MailApp"> 8 | 9 | <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. --> 10 | 11 | <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. --> 12 | <Id>e38f0727-bd71-4894-a6f0-12cab1aba7b5</Id> 13 | 14 | <!--Version. Updates from the store only get triggered if there is a version change. --> 15 | <Version>1.0.0.0</Version> 16 | <ProviderName>[Provider name]</ProviderName> 17 | <DefaultLocale>en-US</DefaultLocale> 18 | <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. --> 19 | <DisplayName DefaultValue="outlook" /> 20 | <Description DefaultValue="[Outlook Add-in description]"/> 21 | 22 | <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. --> 23 | <IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png" /> 24 | <HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/hi-res-icon.png"/> 25 | 26 | <!--If you plan to submit this add-in to the Office Store, uncomment the SupportUrl element below--> 27 | <SupportUrl DefaultValue="[Insert the URL of a page that provides support information for the app]" /> 28 | 29 | <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. --> 30 | <AppDomains> 31 | <AppDomain>AppDomain1</AppDomain> 32 | <AppDomain>AppDomain2</AppDomain> 33 | <AppDomain>AppDomain3</AppDomain> 34 | </AppDomains> 35 | <!--End Basic Settings. --> 36 | 37 | <Hosts> 38 | <Host Name="Mailbox" /> 39 | </Hosts> 40 | <Requirements> 41 | <Sets> 42 | <Set Name="Mailbox" MinVersion="1.1" /> 43 | </Sets> 44 | </Requirements> 45 | <FormSettings> 46 | <Form xsi:type="ItemRead"> 47 | <DesktopSettings> 48 | <SourceLocation DefaultValue="https://localhost:3000/index.html"/> 49 | <RequestedHeight>250</RequestedHeight> 50 | </DesktopSettings> 51 | </Form> 52 | </FormSettings> 53 | 54 | <Permissions>ReadWriteItem</Permissions> 55 | <Rule xsi:type="RuleCollection" Mode="Or"> 56 | <Rule xsi:type="ItemIs" ItemType="Message" FormType="Read" /> 57 | </Rule> 58 | <DisableEntityHighlighting>false</DisableEntityHighlighting> 59 | 60 | <VersionOverrides xmlns="http://schemas.microsoft.com/office/mailappversionoverrides" xsi:type="VersionOverridesV1_0"> 61 | <Requirements> 62 | <bt:Sets DefaultMinVersion="1.3"> 63 | <bt:Set Name="Mailbox" /> 64 | </bt:Sets> 65 | </Requirements> 66 | <Hosts> 67 | <Host xsi:type="MailHost"> 68 | 69 | <DesktopFormFactor> 70 | <!-- Location of the Functions that UI-less buttons can trigger (ExecuteFunction Actions). --> 71 | <FunctionFile resid="functionFile" /> 72 | 73 | <!-- Message Read --> 74 | <ExtensionPoint xsi:type="MessageReadCommandSurface"> 75 | <!-- Use the default tab of the ExtensionPoint or create your own with <CustomTab id="myTab"> --> 76 | <OfficeTab id="TabDefault"> 77 | <!-- Up to 6 Groups added per Tab --> 78 | <Group id="msgReadGroup"> 79 | <Label resid="groupLabel" /> 80 | <!-- Launch the add-in : task pane button --> 81 | <Control xsi:type="Button" id="msgReadOpenPaneButton"> 82 | <Label resid="paneReadButtonLabel" /> 83 | <Supertip> 84 | <Title resid="paneReadSuperTipTitle" /> 85 | <Description resid="paneReadSuperTipDescription" /> 86 | </Supertip> 87 | <Icon> 88 | <bt:Image size="16" resid="icon16" /> 89 | <bt:Image size="32" resid="icon32" /> 90 | <bt:Image size="80" resid="icon80" /> 91 | </Icon> 92 | <Action xsi:type="ShowTaskpane"> 93 | <SourceLocation resid="messageReadTaskPaneUrl" /> 94 | </Action> 95 | </Control> 96 | <!-- Go to http://aka.ms/ButtonCommands to learn how to add more Controls: ExecuteFunction and Menu --> 97 | </Group> 98 | </OfficeTab> 99 | </ExtensionPoint> 100 | <!-- Go to http://aka.ms/ExtensionPointsCommands to learn how to add more Extension Points: MessageRead, AppointmentOrganizer, AppointmentAttendee --> 101 | </DesktopFormFactor> 102 | </Host> 103 | </Hosts> 104 | 105 | <Resources> 106 | <bt:Images> 107 | <bt:Image id="icon16" DefaultValue="https://localhost:3000/assets/icon-16.png"/> 108 | <bt:Image id="icon32" DefaultValue="https://localhost:3000/assets/icon-32.png"/> 109 | <bt:Image id="icon80" DefaultValue="https://localhost:3000/assets/icon-80.png"/> 110 | </bt:Images> 111 | <bt:Urls> 112 | <bt:Url id="functionFile" DefaultValue="https://localhost:3000/function-file/function-file.html"/> 113 | <bt:Url id="messageReadTaskPaneUrl" DefaultValue="https://localhost:3000/index.html"/> 114 | </bt:Urls> 115 | <bt:ShortStrings> 116 | <bt:String id="groupLabel" DefaultValue="My Add-in Group"/> 117 | <bt:String id="customTabLabel" DefaultValue="My Add-in Tab"/> 118 | <bt:String id="paneReadButtonLabel" DefaultValue="Display all properties"/> 119 | <bt:String id="paneReadSuperTipTitle" DefaultValue="Get all properties"/> 120 | </bt:ShortStrings> 121 | <bt:LongStrings> 122 | <bt:String id="paneReadSuperTipDescription" DefaultValue="Opens a pane displaying all available properties. This is an example of a button that opens a task pane."/> 123 | </bt:LongStrings> 124 | </Resources> 125 | </VersionOverrides> 126 | </OfficeApp> 127 | -------------------------------------------------------------------------------- /manifest-to-test/valid_powerpoint.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <OfficeApp 3 | xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 4 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 | xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 6 | xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides" 7 | xsi:type="TaskPaneApp"> 8 | 9 | <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. --> 10 | 11 | <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. --> 12 | <Id>551f6d69-5ee7-4039-9d8a-73c607d5e95d</Id> 13 | 14 | <!--Version. Updates from the store only get triggered if there is a version change. --> 15 | <Version>1.0.0.0</Version> 16 | <ProviderName>[Provider name]</ProviderName> 17 | <DefaultLocale>en-US</DefaultLocale> 18 | <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. --> 19 | <DisplayName DefaultValue="PowerPoint Add-in" /> 20 | <Description DefaultValue="[Presentation Add-in description]"/> 21 | 22 | <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. --> 23 | <IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png" /> 24 | <HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/hi-res-icon.png"/> 25 | 26 | <!--If you plan to submit this add-in to the Office Store, uncomment the SupportUrl element below--> 27 | <SupportUrl DefaultValue="[Insert the URL of a page that provides support information for the app]" /> 28 | 29 | <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. --> 30 | <AppDomains> 31 | <AppDomain>AppDomain1</AppDomain> 32 | <AppDomain>AppDomain2</AppDomain> 33 | <AppDomain>AppDomain3</AppDomain> 34 | </AppDomains> 35 | <!--End Basic Settings. --> 36 | 37 | <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. --> 38 | <Hosts> 39 | <Host Name="Presentation" /> 40 | </Hosts> 41 | <DefaultSettings> 42 | <SourceLocation DefaultValue="https://localhost:3000/index.html" /> 43 | </DefaultSettings> 44 | <!-- End TaskPane Mode integration. --> 45 | 46 | <Permissions>ReadWriteDocument</Permissions> 47 | 48 | <!-- Begin Add-in Commands Mode integration. --> 49 | <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0"> 50 | 51 | <!-- The Hosts node is required. --> 52 | <Hosts> 53 | <!-- Each host can have a different set of commands. --> 54 | <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. --> 55 | <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. --> 56 | <Host xsi:type="Presentation"> 57 | <!-- Form factor. Currently only DesktopFormFactor is supported. --> 58 | <DesktopFormFactor> 59 | <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."--> 60 | <GetStarted> 61 | <!-- Title of the Getting Started callout. resid points to a ShortString resource --> 62 | <Title resid="Contoso.GetStarted.Title"/> 63 | 64 | <!-- Description of the Getting Started callout. resid points to a LongString resource --> 65 | <Description resid="Contoso.GetStarted.Description"/> 66 | 67 | <!-- Point to a url resource which details how the add-in should be used. --> 68 | <LearnMoreUrl resid="Contoso.GetStarted.LearnMoreUrl"/> 69 | </GetStarted> 70 | <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. 71 | Think of the FunctionFile as the code behind ExecuteFunction. --> 72 | <FunctionFile resid="Contoso.DesktopFunctionFile.Url" /> 73 | 74 | <!-- PrimaryCommandSurface is the main Office Ribbon. --> 75 | <ExtensionPoint xsi:type="PrimaryCommandSurface"> 76 | <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> 77 | <OfficeTab id="TabHome"> 78 | <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> 79 | <Group id="Contoso.Group1"> 80 | <!-- Label for your group. resid must point to a ShortString resource. --> 81 | <Label resid="Contoso.Group1Label" /> 82 | <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> 83 | <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> 84 | <Icon> 85 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 86 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 87 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 88 | </Icon> 89 | 90 | <!-- Control. It can be of type "Button" or "Menu". --> 91 | <Control xsi:type="Button" id="Contoso.TaskpaneButton"> 92 | <Label resid="Contoso.TaskpaneButton.Label" /> 93 | <Supertip> 94 | <!-- ToolTip title. resid must point to a ShortString resource. --> 95 | <Title resid="Contoso.TaskpaneButton.Label" /> 96 | <!-- ToolTip description. resid must point to a LongString resource. --> 97 | <Description resid="Contoso.TaskpaneButton.Tooltip" /> 98 | </Supertip> 99 | <Icon> 100 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 101 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 102 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 103 | </Icon> 104 | 105 | <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> 106 | <Action xsi:type="ShowTaskpane"> 107 | <TaskpaneId>ButtonId1</TaskpaneId> 108 | <!-- Provide a url resource id for the location that will be displayed on the task pane. --> 109 | <SourceLocation resid="Contoso.Taskpane.Url" /> 110 | </Action> 111 | </Control> 112 | </Group> 113 | </OfficeTab> 114 | </ExtensionPoint> 115 | </DesktopFormFactor> 116 | </Host> 117 | </Hosts> 118 | 119 | <!-- You can use resources across hosts and form factors. --> 120 | <Resources> 121 | <bt:Images> 122 | <bt:Image id="Contoso.tpicon_16x16" DefaultValue="https://localhost:3000/assets/icon-16.png" /> 123 | <bt:Image id="Contoso.tpicon_32x32" DefaultValue="https://localhost:3000/assets/icon-32.png" /> 124 | <bt:Image id="Contoso.tpicon_80x80" DefaultValue="https://localhost:3000/assets/icon-80.png" /> 125 | </bt:Images> 126 | <bt:Urls> 127 | <bt:Url id="Contoso.Taskpane.Url" DefaultValue="https://localhost:3000/index.html" /> 128 | <bt:Url id="Contoso.GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> 129 | <bt:Url id="Contoso.DesktopFunctionFile.Url" DefaultValue="https://localhost:3000/function-file/function-file.html" /> 130 | </bt:Urls> 131 | <!-- ShortStrings max characters==125. --> 132 | <bt:ShortStrings> 133 | <bt:String id="Contoso.TaskpaneButton.Label" DefaultValue="Show Taskpane" /> 134 | <bt:String id="Contoso.Group1Label" DefaultValue="Commands Group" /> 135 | <bt:String id="Contoso.GetStarted.Title" DefaultValue="Get started with your sample add-in!" /> 136 | </bt:ShortStrings> 137 | <!-- LongStrings max characters==250. --> 138 | <bt:LongStrings> 139 | <bt:String id="Contoso.TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> 140 | <bt:String id="Contoso.GetStarted.Description" DefaultValue="Your sample add-in loaded succesfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> 141 | </bt:LongStrings> 142 | </Resources> 143 | </VersionOverrides> 144 | <!-- End Add-in Commands Mode integration. --> 145 | 146 | </OfficeApp> 147 | -------------------------------------------------------------------------------- /manifest-to-test/valid_project.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <OfficeApp 3 | xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 4 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 | xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 6 | xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides" 7 | xsi:type="TaskPaneApp"> 8 | 9 | <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. --> 10 | 11 | <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. --> 12 | <Id>2c59f3cd-bd3a-4e2e-b88f-29adca7e4c41</Id> 13 | 14 | <!--Version. Updates from the store only get triggered if there is a version change. --> 15 | <Version>1.0.0.0</Version> 16 | <ProviderName>[Provider name]</ProviderName> 17 | <DefaultLocale>en-US</DefaultLocale> 18 | <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. --> 19 | <DisplayName DefaultValue="Project Add-in" /> 20 | <Description DefaultValue="[Project Add-in description]"/> 21 | 22 | <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. --> 23 | <IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png" /> 24 | <HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/hi-res-icon.png"/> 25 | 26 | <!--If you plan to submit this add-in to the Office Store, uncomment the SupportUrl element below--> 27 | <SupportUrl DefaultValue="[Insert the URL of a page that provides support information for the app]" /> 28 | 29 | <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. --> 30 | <AppDomains> 31 | <AppDomain>AppDomain1</AppDomain> 32 | <AppDomain>AppDomain2</AppDomain> 33 | <AppDomain>AppDomain3</AppDomain> 34 | </AppDomains> 35 | <!--End Basic Settings. --> 36 | 37 | <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. --> 38 | <Hosts> 39 | <Host Name="Project" /> 40 | </Hosts> 41 | <DefaultSettings> 42 | <SourceLocation DefaultValue="https://localhost:3000/index.html" /> 43 | </DefaultSettings> 44 | <!-- End TaskPane Mode integration. --> 45 | 46 | <Permissions>ReadWriteDocument</Permissions> 47 | 48 | <!-- Begin Add-in Commands Mode integration. --> 49 | <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0"> 50 | 51 | <!-- The Hosts node is required. --> 52 | <Hosts> 53 | <!-- Each host can have a different set of commands. --> 54 | <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. --> 55 | <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. --> 56 | <Host xsi:type="Project"> 57 | <!-- Form factor. Currently only DesktopFormFactor is supported. --> 58 | <DesktopFormFactor> 59 | <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."--> 60 | <GetStarted> 61 | <!-- Title of the Getting Started callout. resid points to a ShortString resource --> 62 | <Title resid="Contoso.GetStarted.Title"/> 63 | 64 | <!-- Description of the Getting Started callout. resid points to a LongString resource --> 65 | <Description resid="Contoso.GetStarted.Description"/> 66 | 67 | <!-- Point to a url resource which details how the add-in should be used. --> 68 | <LearnMoreUrl resid="Contoso.GetStarted.LearnMoreUrl"/> 69 | </GetStarted> 70 | <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. 71 | Think of the FunctionFile as the code behind ExecuteFunction. --> 72 | <FunctionFile resid="Contoso.DesktopFunctionFile.Url" /> 73 | 74 | <!-- PrimaryCommandSurface is the main Office Ribbon. --> 75 | <ExtensionPoint xsi:type="PrimaryCommandSurface"> 76 | <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> 77 | <OfficeTab id="TabHome"> 78 | <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> 79 | <Group id="Contoso.Group1"> 80 | <!-- Label for your group. resid must point to a ShortString resource. --> 81 | <Label resid="Contoso.Group1Label" /> 82 | <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> 83 | <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> 84 | <Icon> 85 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 86 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 87 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 88 | </Icon> 89 | 90 | <!-- Control. It can be of type "Button" or "Menu". --> 91 | <Control xsi:type="Button" id="Contoso.TaskpaneButton"> 92 | <Label resid="Contoso.TaskpaneButton.Label" /> 93 | <Supertip> 94 | <!-- ToolTip title. resid must point to a ShortString resource. --> 95 | <Title resid="Contoso.TaskpaneButton.Label" /> 96 | <!-- ToolTip description. resid must point to a LongString resource. --> 97 | <Description resid="Contoso.TaskpaneButton.Tooltip" /> 98 | </Supertip> 99 | <Icon> 100 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 101 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 102 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 103 | </Icon> 104 | 105 | <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> 106 | <Action xsi:type="ShowTaskpane"> 107 | <TaskpaneId>ButtonId1</TaskpaneId> 108 | <!-- Provide a url resource id for the location that will be displayed on the task pane. --> 109 | <SourceLocation resid="Contoso.Taskpane.Url" /> 110 | </Action> 111 | </Control> 112 | </Group> 113 | </OfficeTab> 114 | </ExtensionPoint> 115 | </DesktopFormFactor> 116 | </Host> 117 | </Hosts> 118 | 119 | <!-- You can use resources across hosts and form factors. --> 120 | <Resources> 121 | <bt:Images> 122 | <bt:Image id="Contoso.tpicon_16x16" DefaultValue="https://localhost:3000/assets/icon-16.png" /> 123 | <bt:Image id="Contoso.tpicon_32x32" DefaultValue="https://localhost:3000/assets/icon-32.png" /> 124 | <bt:Image id="Contoso.tpicon_80x80" DefaultValue="https://localhost:3000/assets/icon-80.png" /> 125 | </bt:Images> 126 | <bt:Urls> 127 | <bt:Url id="Contoso.Taskpane.Url" DefaultValue="https://localhost:3000/index.html" /> 128 | <bt:Url id="Contoso.GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> 129 | <bt:Url id="Contoso.DesktopFunctionFile.Url" DefaultValue="https://localhost:3000/function-file/function-file.html" /> 130 | </bt:Urls> 131 | <!-- ShortStrings max characters==125. --> 132 | <bt:ShortStrings> 133 | <bt:String id="Contoso.TaskpaneButton.Label" DefaultValue="Show Taskpane" /> 134 | <bt:String id="Contoso.Group1Label" DefaultValue="Commands Group" /> 135 | <bt:String id="Contoso.GetStarted.Title" DefaultValue="Get started with your sample add-in!" /> 136 | </bt:ShortStrings> 137 | <!-- LongStrings max characters==250. --> 138 | <bt:LongStrings> 139 | <bt:String id="Contoso.TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> 140 | <bt:String id="Contoso.GetStarted.Description" DefaultValue="Your sample add-in loaded succesfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> 141 | </bt:LongStrings> 142 | </Resources> 143 | </VersionOverrides> 144 | <!-- End Add-in Commands Mode integration. --> 145 | 146 | </OfficeApp> 147 | -------------------------------------------------------------------------------- /manifest-to-test/valid_word.xml: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <OfficeApp 3 | xmlns="http://schemas.microsoft.com/office/appforoffice/1.1" 4 | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 | xmlns:bt="http://schemas.microsoft.com/office/officeappbasictypes/1.0" 6 | xmlns:ov="http://schemas.microsoft.com/office/taskpaneappversionoverrides" 7 | xsi:type="TaskPaneApp"> 8 | 9 | <!-- Begin Basic Settings: Add-in metadata, used for all versions of Office unless override provided. --> 10 | 11 | <!-- IMPORTANT! Id must be unique for your add-in, if you reuse this manifest ensure that you change this id to a new GUID. --> 12 | <Id>5963e389-da67-4038-95c7-bfb0c254e89d</Id> 13 | 14 | <!--Version. Updates from the store only get triggered if there is a version change. --> 15 | <Version>1.0.0.0</Version> 16 | <ProviderName>[Provider name]</ProviderName> 17 | <DefaultLocale>en-US</DefaultLocale> 18 | <!-- The display name of your add-in. Used on the store and various places of the Office UI such as the add-ins dialog. --> 19 | <DisplayName DefaultValue="Word Add-in" /> 20 | <Description DefaultValue="[Document Add-in description]"/> 21 | 22 | <!-- Icon for your add-in. Used on installation screens and the add-ins dialog. --> 23 | <IconUrl DefaultValue="https://localhost:3000/assets/icon-32.png" /> 24 | <HighResolutionIconUrl DefaultValue="https://localhost:3000/assets/icon-80.png"/> 25 | 26 | <!--If you plan to submit this add-in to the Office Store, uncomment the SupportUrl element below--> 27 | <SupportUrl DefaultValue="[Insert the URL of a page that provides support information for the app]" /> 28 | 29 | <!-- Domains that will be allowed when navigating. For example, if you use ShowTaskpane and then have an href link, navigation will only be allowed if the domain is on this list. --> 30 | <AppDomains> 31 | <AppDomain>AppDomain1</AppDomain> 32 | <AppDomain>AppDomain2</AppDomain> 33 | <AppDomain>AppDomain3</AppDomain> 34 | </AppDomains> 35 | <!--End Basic Settings. --> 36 | 37 | <!--Begin TaskPane Mode integration. This section is used if there are no VersionOverrides or if the Office client version does not support add-in commands. --> 38 | <Hosts> 39 | <Host Name="Document" /> 40 | </Hosts> 41 | <DefaultSettings> 42 | <SourceLocation DefaultValue="https://localhost:3000/index.html" /> 43 | </DefaultSettings> 44 | <!-- End TaskPane Mode integration. --> 45 | 46 | <Permissions>ReadWriteDocument</Permissions> 47 | 48 | <!-- Begin Add-in Commands Mode integration. --> 49 | <VersionOverrides xmlns="http://schemas.microsoft.com/office/taskpaneappversionoverrides" xsi:type="VersionOverridesV1_0"> 50 | 51 | <!-- The Hosts node is required. --> 52 | <Hosts> 53 | <!-- Each host can have a different set of commands. --> 54 | <!-- Excel host is Workbook, Word host is Document, and PowerPoint host is Presentation. --> 55 | <!-- Make sure the hosts you override match the hosts declared in the top section of the manifest. --> 56 | <Host xsi:type="Document"> 57 | <!-- Form factor. Currently only DesktopFormFactor is supported. --> 58 | <DesktopFormFactor> 59 | <!--"This code enables a customizable message to be displayed when the add-in is loaded successfully upon individual install."--> 60 | <GetStarted> 61 | <!-- Title of the Getting Started callout. resid points to a ShortString resource --> 62 | <Title resid="Contoso.GetStarted.Title"/> 63 | 64 | <!-- Description of the Getting Started callout. resid points to a LongString resource --> 65 | <Description resid="Contoso.GetStarted.Description"/> 66 | 67 | <!-- Point to a url resource which details how the add-in should be used. --> 68 | <LearnMoreUrl resid="Contoso.GetStarted.LearnMoreUrl"/> 69 | </GetStarted> 70 | <!-- Function file is a HTML page that includes the JavaScript where functions for ExecuteAction will be called. 71 | Think of the FunctionFile as the code behind ExecuteFunction. --> 72 | <FunctionFile resid="Contoso.DesktopFunctionFile.Url" /> 73 | 74 | <!-- PrimaryCommandSurface is the main Office Ribbon. --> 75 | <ExtensionPoint xsi:type="PrimaryCommandSurface"> 76 | <!-- Use OfficeTab to extend an existing Tab. Use CustomTab to create a new tab. --> 77 | <OfficeTab id="TabHome"> 78 | <!-- Ensure you provide a unique id for the group. Recommendation for any IDs is to namespace using your company name. --> 79 | <Group id="Contoso.Group1"> 80 | <!-- Label for your group. resid must point to a ShortString resource. --> 81 | <Label resid="Contoso.Group1Label" /> 82 | <!-- Icons. Required sizes 16,32,80, optional 20, 24, 40, 48, 64. Strongly recommended to provide all sizes for great UX. --> 83 | <!-- Use PNG icons. All URLs on the resources section must use HTTPS. --> 84 | <Icon> 85 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 86 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 87 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 88 | </Icon> 89 | 90 | <!-- Control. It can be of type "Button" or "Menu". --> 91 | <Control xsi:type="Button" id="Contoso.TaskpaneButton"> 92 | <Label resid="Contoso.TaskpaneButton.Label" /> 93 | <Supertip> 94 | <!-- ToolTip title. resid must point to a ShortString resource. --> 95 | <Title resid="Contoso.TaskpaneButton.Label" /> 96 | <!-- ToolTip description. resid must point to a LongString resource. --> 97 | <Description resid="Contoso.TaskpaneButton.Tooltip" /> 98 | </Supertip> 99 | <Icon> 100 | <bt:Image size="16" resid="Contoso.tpicon_16x16" /> 101 | <bt:Image size="32" resid="Contoso.tpicon_32x32" /> 102 | <bt:Image size="80" resid="Contoso.tpicon_80x80" /> 103 | </Icon> 104 | 105 | <!-- This is what happens when the command is triggered (E.g. click on the Ribbon). Supported actions are ExecuteFunction or ShowTaskpane. --> 106 | <Action xsi:type="ShowTaskpane"> 107 | <TaskpaneId>ButtonId1</TaskpaneId> 108 | <!-- Provide a url resource id for the location that will be displayed on the task pane. --> 109 | <SourceLocation resid="Contoso.Taskpane.Url" /> 110 | </Action> 111 | </Control> 112 | </Group> 113 | </OfficeTab> 114 | </ExtensionPoint> 115 | </DesktopFormFactor> 116 | </Host> 117 | </Hosts> 118 | 119 | <!-- You can use resources across hosts and form factors. --> 120 | <Resources> 121 | <bt:Images> 122 | <bt:Image id="Contoso.tpicon_16x16" DefaultValue="https://localhost:3000/assets/icon-16.png" /> 123 | <bt:Image id="Contoso.tpicon_32x32" DefaultValue="https://localhost:3000/assets/icon-32.png" /> 124 | <bt:Image id="Contoso.tpicon_80x80" DefaultValue="https://localhost:3000/assets/icon-80.png" /> 125 | </bt:Images> 126 | <bt:Urls> 127 | <bt:Url id="Contoso.Taskpane.Url" DefaultValue="https://localhost:3000/index.html" /> 128 | <bt:Url id="Contoso.GetStarted.LearnMoreUrl" DefaultValue="https://go.microsoft.com/fwlink/?LinkId=276812" /> 129 | <bt:Url id="Contoso.DesktopFunctionFile.Url" DefaultValue="https://localhost:3000/function-file/function-file.html" /> 130 | </bt:Urls> 131 | <!-- ShortStrings max characters==125. --> 132 | <bt:ShortStrings> 133 | <bt:String id="Contoso.TaskpaneButton.Label" DefaultValue="Show Taskpane" /> 134 | <bt:String id="Contoso.Group1Label" DefaultValue="Commands Group" /> 135 | <bt:String id="Contoso.GetStarted.Title" DefaultValue="Get started with your sample add-in!" /> 136 | </bt:ShortStrings> 137 | <!-- LongStrings max characters==250. --> 138 | <bt:LongStrings> 139 | <bt:String id="Contoso.TaskpaneButton.Tooltip" DefaultValue="Click to Show a Taskpane" /> 140 | <bt:String id="Contoso.GetStarted.Description" DefaultValue="Your sample add-in loaded succesfully. Go to the HOME tab and click the 'Show Taskpane' button to get started." /> 141 | </bt:LongStrings> 142 | </Resources> 143 | </VersionOverrides> 144 | <!-- End Add-in Commands Mode integration. --> 145 | 146 | </OfficeApp> 147 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "office-addin-validator", 3 | "version": "1.0.4", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@types/applicationinsights": { 7 | "version": "0.15.33", 8 | "resolved": "https://registry.npmjs.org/@types/applicationinsights/-/applicationinsights-0.15.33.tgz", 9 | "integrity": "sha1-yohXeRuaxSzlKplCXksJrRfrlwg=", 10 | "dev": true 11 | }, 12 | "@types/bluebird": { 13 | "version": "3.5.8", 14 | "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.8.tgz", 15 | "integrity": "sha512-rBfrD56OxaqVjghtVqp2EEX0ieHkRk6IefDVrQXIVGvlhDOEBTvZff4Q02uo84ukVkH4k5eB1cPKGDM2NlFL8A==", 16 | "dev": true 17 | }, 18 | "@types/chai": { 19 | "version": "3.5.2", 20 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-3.5.2.tgz", 21 | "integrity": "sha1-wRzSgX06QBt7oPWkIPNcVhObHB4=", 22 | "dev": true 23 | }, 24 | "@types/chai-as-promised": { 25 | "version": "0.0.30", 26 | "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-0.0.30.tgz", 27 | "integrity": "sha1-I0EyHMeWxsNUSpSaBj52CaIi8wM=", 28 | "dev": true 29 | }, 30 | "@types/chalk": { 31 | "version": "0.4.31", 32 | "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-0.4.31.tgz", 33 | "integrity": "sha1-ox10JBprHtu5c8822XooloNKUfk=", 34 | "dev": true 35 | }, 36 | "@types/commander": { 37 | "version": "2.9.1", 38 | "resolved": "https://registry.npmjs.org/@types/commander/-/commander-2.9.1.tgz", 39 | "integrity": "sha512-P4s1aEJYjHB1pmS5th4WXQ/NEYykK1FmCFJL+NIrDCptWs2DIS/SsVjmaubvcWZ17VzlG+CwiAv52ghkfkepWA==", 40 | "dev": true 41 | }, 42 | "@types/form-data": { 43 | "version": "0.0.33", 44 | "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", 45 | "integrity": "sha1-yayFsqX9GENbjIXZ7LUObWyJP/g=", 46 | "dev": true 47 | }, 48 | "@types/mocha": { 49 | "version": "2.2.41", 50 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.41.tgz", 51 | "integrity": "sha1-4nzwgXFT658nE7LT9saPHhw8pgg=", 52 | "dev": true 53 | }, 54 | "@types/node": { 55 | "version": "8.0.7", 56 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.7.tgz", 57 | "integrity": "sha512-fuCPLPe4yY0nv6Z1rTLFCEC452jl0k7i3gF/c8hdEKpYtEpt6Sk67hTGbxx8C0wmifFGPvKYd/O8CvS6dpgxMQ==", 58 | "dev": true 59 | }, 60 | "@types/request": { 61 | "version": "0.0.45", 62 | "resolved": "https://registry.npmjs.org/@types/request/-/request-0.0.45.tgz", 63 | "integrity": "sha512-OIIREjT58pnpfJjEY5PeBEuRtRR2ED4DF1Ez3Dj9474kCqEKfE+iNAYyM/P3RxxDjNxBhipo+peNBW0S/7Wrzg==", 64 | "dev": true 65 | }, 66 | "@types/request-promise": { 67 | "version": "4.1.35", 68 | "resolved": "https://registry.npmjs.org/@types/request-promise/-/request-promise-4.1.35.tgz", 69 | "integrity": "sha512-z7JsNO5PplZM5BrFzXkgHKzctLjbGZUeSsPQdk4S8PtAEVGpenkjans/YSBY/RSoGFIQa+btqYVEAfhOW2/VRw==", 70 | "dev": true 71 | }, 72 | "ajv": { 73 | "version": "4.11.8", 74 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 75 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=" 76 | }, 77 | "ansi-regex": { 78 | "version": "2.1.1", 79 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 80 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 81 | }, 82 | "ansi-styles": { 83 | "version": "2.2.1", 84 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 85 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 86 | }, 87 | "arrify": { 88 | "version": "1.0.1", 89 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 90 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", 91 | "dev": true 92 | }, 93 | "asn1": { 94 | "version": "0.2.3", 95 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 96 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 97 | }, 98 | "assert-plus": { 99 | "version": "0.2.0", 100 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 101 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" 102 | }, 103 | "assertion-error": { 104 | "version": "1.0.2", 105 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", 106 | "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", 107 | "dev": true 108 | }, 109 | "asynckit": { 110 | "version": "0.4.0", 111 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 112 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 113 | }, 114 | "aws-sign2": { 115 | "version": "0.6.0", 116 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 117 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" 118 | }, 119 | "aws4": { 120 | "version": "1.6.0", 121 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 122 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 123 | }, 124 | "balanced-match": { 125 | "version": "1.0.0", 126 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 127 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 128 | "dev": true 129 | }, 130 | "bcrypt-pbkdf": { 131 | "version": "1.0.1", 132 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 133 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 134 | "optional": true 135 | }, 136 | "bluebird": { 137 | "version": "3.5.0", 138 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", 139 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" 140 | }, 141 | "boom": { 142 | "version": "2.10.1", 143 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 144 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" 145 | }, 146 | "brace-expansion": { 147 | "version": "1.1.8", 148 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 149 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 150 | "dev": true 151 | }, 152 | "browser-stdout": { 153 | "version": "1.3.0", 154 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", 155 | "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", 156 | "dev": true 157 | }, 158 | "caseless": { 159 | "version": "0.12.0", 160 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 161 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 162 | }, 163 | "chai": { 164 | "version": "3.5.0", 165 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 166 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 167 | "dev": true 168 | }, 169 | "chai-as-promised": { 170 | "version": "6.0.0", 171 | "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz", 172 | "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=", 173 | "dev": true 174 | }, 175 | "chalk": { 176 | "version": "1.1.3", 177 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 178 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" 179 | }, 180 | "check-error": { 181 | "version": "1.0.2", 182 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 183 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 184 | "dev": true 185 | }, 186 | "co": { 187 | "version": "4.6.0", 188 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 189 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 190 | }, 191 | "combined-stream": { 192 | "version": "1.0.5", 193 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 194 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" 195 | }, 196 | "commander": { 197 | "version": "2.11.0", 198 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", 199 | "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" 200 | }, 201 | "concat-map": { 202 | "version": "0.0.1", 203 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 204 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 205 | "dev": true 206 | }, 207 | "concurrently": { 208 | "version": "3.5.0", 209 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-3.5.0.tgz", 210 | "integrity": "sha1-jPG3cHppFqeKT/W3e7BN7FSzebI=", 211 | "dev": true, 212 | "dependencies": { 213 | "ansi-regex": { 214 | "version": "0.2.1", 215 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", 216 | "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", 217 | "dev": true 218 | }, 219 | "ansi-styles": { 220 | "version": "1.1.0", 221 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", 222 | "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", 223 | "dev": true 224 | }, 225 | "chalk": { 226 | "version": "0.5.1", 227 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", 228 | "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", 229 | "dev": true, 230 | "dependencies": { 231 | "supports-color": { 232 | "version": "0.2.0", 233 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", 234 | "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", 235 | "dev": true 236 | } 237 | } 238 | }, 239 | "commander": { 240 | "version": "2.6.0", 241 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", 242 | "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", 243 | "dev": true 244 | }, 245 | "has-ansi": { 246 | "version": "0.1.0", 247 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", 248 | "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", 249 | "dev": true 250 | }, 251 | "strip-ansi": { 252 | "version": "0.3.0", 253 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", 254 | "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", 255 | "dev": true 256 | }, 257 | "supports-color": { 258 | "version": "3.2.3", 259 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", 260 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", 261 | "dev": true 262 | } 263 | } 264 | }, 265 | "cryptiles": { 266 | "version": "2.0.5", 267 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 268 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" 269 | }, 270 | "dashdash": { 271 | "version": "1.14.1", 272 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 273 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 274 | "dependencies": { 275 | "assert-plus": { 276 | "version": "1.0.0", 277 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 278 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 279 | } 280 | } 281 | }, 282 | "date-fns": { 283 | "version": "1.28.5", 284 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.28.5.tgz", 285 | "integrity": "sha1-JXz8RdMi30XvVlhmWWfuhBzXP68=", 286 | "dev": true 287 | }, 288 | "debug": { 289 | "version": "2.6.0", 290 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", 291 | "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", 292 | "dev": true 293 | }, 294 | "deep-eql": { 295 | "version": "0.1.3", 296 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 297 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 298 | "dev": true, 299 | "dependencies": { 300 | "type-detect": { 301 | "version": "0.1.1", 302 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 303 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 304 | "dev": true 305 | } 306 | } 307 | }, 308 | "delayed-stream": { 309 | "version": "1.0.0", 310 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 311 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 312 | }, 313 | "diff": { 314 | "version": "3.2.0", 315 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", 316 | "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", 317 | "dev": true 318 | }, 319 | "ecc-jsbn": { 320 | "version": "0.1.1", 321 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 322 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 323 | "optional": true 324 | }, 325 | "escape-string-regexp": { 326 | "version": "1.0.5", 327 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 328 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 329 | }, 330 | "extend": { 331 | "version": "3.0.1", 332 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 333 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 334 | }, 335 | "extsprintf": { 336 | "version": "1.0.2", 337 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", 338 | "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" 339 | }, 340 | "forever-agent": { 341 | "version": "0.6.1", 342 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 343 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 344 | }, 345 | "form-data": { 346 | "version": "2.1.4", 347 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 348 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" 349 | }, 350 | "fs.realpath": { 351 | "version": "1.0.0", 352 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 353 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 354 | "dev": true 355 | }, 356 | "getpass": { 357 | "version": "0.1.7", 358 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 359 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 360 | "dependencies": { 361 | "assert-plus": { 362 | "version": "1.0.0", 363 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 364 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 365 | } 366 | } 367 | }, 368 | "glob": { 369 | "version": "7.1.1", 370 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", 371 | "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", 372 | "dev": true 373 | }, 374 | "graceful-readlink": { 375 | "version": "1.0.1", 376 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", 377 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", 378 | "dev": true 379 | }, 380 | "growl": { 381 | "version": "1.9.2", 382 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", 383 | "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", 384 | "dev": true 385 | }, 386 | "har-schema": { 387 | "version": "1.0.5", 388 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", 389 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" 390 | }, 391 | "har-validator": { 392 | "version": "4.2.1", 393 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", 394 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=" 395 | }, 396 | "has-ansi": { 397 | "version": "2.0.0", 398 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 399 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" 400 | }, 401 | "has-flag": { 402 | "version": "1.0.0", 403 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", 404 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", 405 | "dev": true 406 | }, 407 | "hawk": { 408 | "version": "3.1.3", 409 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 410 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" 411 | }, 412 | "hoek": { 413 | "version": "2.16.3", 414 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 415 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 416 | }, 417 | "http-signature": { 418 | "version": "1.1.1", 419 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 420 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" 421 | }, 422 | "inflight": { 423 | "version": "1.0.6", 424 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 425 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 426 | "dev": true 427 | }, 428 | "inherits": { 429 | "version": "2.0.3", 430 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 431 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 432 | "dev": true 433 | }, 434 | "is-typedarray": { 435 | "version": "1.0.0", 436 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 437 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 438 | }, 439 | "isstream": { 440 | "version": "0.1.2", 441 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 442 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 443 | }, 444 | "jsbn": { 445 | "version": "0.1.1", 446 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 447 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 448 | "optional": true 449 | }, 450 | "json-schema": { 451 | "version": "0.2.3", 452 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 453 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 454 | }, 455 | "json-stable-stringify": { 456 | "version": "1.0.1", 457 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 458 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=" 459 | }, 460 | "json-stringify-safe": { 461 | "version": "5.0.1", 462 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 463 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 464 | }, 465 | "json3": { 466 | "version": "3.3.2", 467 | "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", 468 | "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", 469 | "dev": true 470 | }, 471 | "jsonify": { 472 | "version": "0.0.0", 473 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 474 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 475 | }, 476 | "jsprim": { 477 | "version": "1.4.0", 478 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", 479 | "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", 480 | "dependencies": { 481 | "assert-plus": { 482 | "version": "1.0.0", 483 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 484 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 485 | } 486 | } 487 | }, 488 | "lodash": { 489 | "version": "4.17.4", 490 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 491 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 492 | }, 493 | "lodash._baseassign": { 494 | "version": "3.2.0", 495 | "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", 496 | "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", 497 | "dev": true 498 | }, 499 | "lodash._basecopy": { 500 | "version": "3.0.1", 501 | "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", 502 | "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", 503 | "dev": true 504 | }, 505 | "lodash._basecreate": { 506 | "version": "3.0.3", 507 | "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", 508 | "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", 509 | "dev": true 510 | }, 511 | "lodash._getnative": { 512 | "version": "3.9.1", 513 | "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", 514 | "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", 515 | "dev": true 516 | }, 517 | "lodash._isiterateecall": { 518 | "version": "3.0.9", 519 | "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", 520 | "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", 521 | "dev": true 522 | }, 523 | "lodash.create": { 524 | "version": "3.1.1", 525 | "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", 526 | "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", 527 | "dev": true 528 | }, 529 | "lodash.isarguments": { 530 | "version": "3.1.0", 531 | "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", 532 | "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", 533 | "dev": true 534 | }, 535 | "lodash.isarray": { 536 | "version": "3.0.4", 537 | "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", 538 | "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", 539 | "dev": true 540 | }, 541 | "lodash.keys": { 542 | "version": "3.1.2", 543 | "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", 544 | "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", 545 | "dev": true 546 | }, 547 | "make-error": { 548 | "version": "1.3.0", 549 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", 550 | "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", 551 | "dev": true 552 | }, 553 | "mime-db": { 554 | "version": "1.27.0", 555 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", 556 | "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" 557 | }, 558 | "mime-types": { 559 | "version": "2.1.15", 560 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", 561 | "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" 562 | }, 563 | "minimatch": { 564 | "version": "3.0.4", 565 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 566 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 567 | "dev": true 568 | }, 569 | "minimist": { 570 | "version": "0.0.8", 571 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 572 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 573 | "dev": true 574 | }, 575 | "mkdirp": { 576 | "version": "0.5.1", 577 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 578 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 579 | "dev": true 580 | }, 581 | "mocha": { 582 | "version": "3.4.2", 583 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", 584 | "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", 585 | "dev": true, 586 | "dependencies": { 587 | "commander": { 588 | "version": "2.9.0", 589 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", 590 | "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", 591 | "dev": true 592 | }, 593 | "supports-color": { 594 | "version": "3.1.2", 595 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", 596 | "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", 597 | "dev": true 598 | } 599 | } 600 | }, 601 | "ms": { 602 | "version": "0.7.2", 603 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", 604 | "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", 605 | "dev": true 606 | }, 607 | "oauth-sign": { 608 | "version": "0.8.2", 609 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 610 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 611 | }, 612 | "once": { 613 | "version": "1.4.0", 614 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 615 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 616 | "dev": true 617 | }, 618 | "path-is-absolute": { 619 | "version": "1.0.1", 620 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 621 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 622 | "dev": true 623 | }, 624 | "performance-now": { 625 | "version": "0.2.0", 626 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", 627 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" 628 | }, 629 | "punycode": { 630 | "version": "1.4.1", 631 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 632 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 633 | }, 634 | "qs": { 635 | "version": "6.4.0", 636 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 637 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 638 | }, 639 | "request": { 640 | "version": "2.81.0", 641 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", 642 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=" 643 | }, 644 | "request-promise": { 645 | "version": "4.2.1", 646 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.1.tgz", 647 | "integrity": "sha1-fuxWyJMXqCLL/qmbA5zlQ8LhX2c=" 648 | }, 649 | "request-promise-core": { 650 | "version": "1.1.1", 651 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", 652 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=" 653 | }, 654 | "rimraf": { 655 | "version": "2.6.1", 656 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", 657 | "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", 658 | "dev": true 659 | }, 660 | "rx": { 661 | "version": "2.3.24", 662 | "resolved": "https://registry.npmjs.org/rx/-/rx-2.3.24.tgz", 663 | "integrity": "sha1-FPlQpCF9fjXapxu8vljv9o6ksrc=", 664 | "dev": true 665 | }, 666 | "safe-buffer": { 667 | "version": "5.1.1", 668 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 669 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 670 | }, 671 | "sntp": { 672 | "version": "1.0.9", 673 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 674 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" 675 | }, 676 | "source-map": { 677 | "version": "0.5.6", 678 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", 679 | "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", 680 | "dev": true 681 | }, 682 | "source-map-support": { 683 | "version": "0.4.15", 684 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", 685 | "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", 686 | "dev": true 687 | }, 688 | "spawn-command": { 689 | "version": "0.0.2-1", 690 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", 691 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=", 692 | "dev": true 693 | }, 694 | "sshpk": { 695 | "version": "1.13.1", 696 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 697 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 698 | "dependencies": { 699 | "assert-plus": { 700 | "version": "1.0.0", 701 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 702 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 703 | } 704 | } 705 | }, 706 | "stealthy-require": { 707 | "version": "1.1.1", 708 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 709 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 710 | }, 711 | "stringstream": { 712 | "version": "0.0.5", 713 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 714 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 715 | }, 716 | "strip-ansi": { 717 | "version": "3.0.1", 718 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 719 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" 720 | }, 721 | "strip-bom": { 722 | "version": "3.0.0", 723 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 724 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 725 | "dev": true 726 | }, 727 | "strip-json-comments": { 728 | "version": "2.0.1", 729 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 730 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 731 | "dev": true 732 | }, 733 | "supports-color": { 734 | "version": "2.0.0", 735 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 736 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 737 | }, 738 | "tough-cookie": { 739 | "version": "2.3.2", 740 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", 741 | "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=" 742 | }, 743 | "tree-kill": { 744 | "version": "1.1.0", 745 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.1.0.tgz", 746 | "integrity": "sha1-yWPc8DciiS7FnLpWnpQLcZVNFyk=", 747 | "dev": true 748 | }, 749 | "ts-node": { 750 | "version": "3.1.0", 751 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.1.0.tgz", 752 | "integrity": "sha1-p17FrrSPMFixuUXbp2XxFQuoj4w=", 753 | "dev": true, 754 | "dependencies": { 755 | "minimist": { 756 | "version": "1.2.0", 757 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 758 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 759 | "dev": true 760 | } 761 | } 762 | }, 763 | "tsconfig": { 764 | "version": "6.0.0", 765 | "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", 766 | "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", 767 | "dev": true 768 | }, 769 | "tunnel-agent": { 770 | "version": "0.6.0", 771 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 772 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" 773 | }, 774 | "tweetnacl": { 775 | "version": "0.14.5", 776 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 777 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 778 | "optional": true 779 | }, 780 | "type-detect": { 781 | "version": "1.0.0", 782 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 783 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 784 | "dev": true 785 | }, 786 | "typescript": { 787 | "version": "2.4.1", 788 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.1.tgz", 789 | "integrity": "sha1-w8yxbdqgsjFN4DHn5v7onlujRrw=", 790 | "dev": true 791 | }, 792 | "user-home": { 793 | "version": "1.1.1", 794 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", 795 | "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", 796 | "dev": true 797 | }, 798 | "uuid": { 799 | "version": "3.1.0", 800 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 801 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 802 | }, 803 | "v8flags": { 804 | "version": "2.1.1", 805 | "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", 806 | "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", 807 | "dev": true 808 | }, 809 | "verror": { 810 | "version": "1.3.6", 811 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", 812 | "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=" 813 | }, 814 | "wrappy": { 815 | "version": "1.0.2", 816 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 817 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 818 | "dev": true 819 | }, 820 | "yn": { 821 | "version": "2.0.0", 822 | "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", 823 | "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", 824 | "dev": true 825 | } 826 | } 827 | } 828 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "office-addin-validator", 3 | "version": "1.0.5", 4 | "description": "Tool to help validate Microsoft Office Add-in manifest files.", 5 | "repository": { 6 | "type": "git", 7 | "url": "https://github.com/OfficeDev/office-addin-validator" 8 | }, 9 | "scripts": { 10 | "tsc": "tsc -p tsconfig.json", 11 | "tsc-watch": "tsc -p tsconfig.json -w", 12 | "test": "mocha -r ts-node/register app/test/**.js --timeout 10000 -R spec", 13 | "build": "rimraf app && concurrently \"npm run tsc\"", 14 | "start": "rimraf app && concurrently \"npm run tsc-watch\"" 15 | }, 16 | "engines": { 17 | "node": ">6.9.0" 18 | }, 19 | "homepage": "https://github.com/officedev/office-addin-validator", 20 | "license": "MIT", 21 | "bin": { 22 | "validate-office-addin": "./app/index.js" 23 | }, 24 | "author": "OfficeDev", 25 | "main": "./app/util.js", 26 | "keywords": [ 27 | "office", 28 | "validation", 29 | "manifest-validation", 30 | "manifest", 31 | "office-add-in", 32 | "add-in", 33 | "outlook", 34 | "excel", 35 | "word", 36 | "powerpoint", 37 | "onenote", 38 | "project" 39 | ], 40 | "dependencies": { 41 | "chalk": "^1.1.3", 42 | "commander": "^2.9.0", 43 | "request": "^2.81.0", 44 | "request-promise": "^4.2.0" 45 | }, 46 | "devDependencies": { 47 | "@types/applicationinsights": "^0.15.33", 48 | "@types/chai": "^3.4.35", 49 | "@types/chai-as-promised": "^0.0.30", 50 | "@types/chalk": "^0.4.31", 51 | "@types/commander": "^2.3.31", 52 | "@types/mocha": "^2.2.40", 53 | "@types/request-promise": "^4.1.33", 54 | "chai": "^3.5.0", 55 | "chai-as-promised": "^6.0.0", 56 | "concurrently": "^3.4.0", 57 | "mocha": "^3.2.0", 58 | "rimraf": "^2.6.1", 59 | "ts-node": "^3.0.2", 60 | "typescript": "^2.2.2" 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # [ARCHIVED] Microsoft Office Add-in Manifest Validator 2 | 3 | **Note:** This repo is archived and no longer actively maintained. Security vulnerabilities may exist in the project, or its dependencies. If you plan to reuse or run any code from this repo, be sure to perform appropriate security checks on the code or dependencies first. Do not use this project as the starting point of a production Office Add-in. Always start your production code by using the Office/SharePoint development workload in Visual Studio, or the [Yeoman generator for Office Add-ins](https://github.com/OfficeDev/generator-office), and follow security best practices as you develop the add-in. 4 | 5 | 6 | [![npm version](https://badge.fury.io/js/office-addin-validator.svg)](http://badge.fury.io/js/office-addin-validator) 7 | [![Downloads](http://img.shields.io/npm/dm/office-addin-validator.svg)](https://npmjs.org/package/office-addin-validator) 8 | [![TravisCI Build Status](https://travis-ci.org/OfficeDev/office-addin-validator.svg)](https://travis-ci.org/OfficeDev/office-addin-validator) 9 | 10 | > Functionality has moved to a new package - [office-addin-manifest](https://github.com/OfficeDev/Office-Addin-Scripts/tree/master/packages/office-addin-manifest). 11 | 12 | -------------------------------------------------------------------------------- /src/docs/valid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OfficeDev/office-addin-validator/c9c06ff62a3148648877fe5be1d26cef0ab18902/src/docs/valid.gif -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /* 4 | * Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. 5 | * See LICENSE in the project root for license information. 6 | */ 7 | 8 | import * as commander from 'commander'; 9 | import * as fs from 'fs'; 10 | import * as util from './util'; 11 | 12 | commander 13 | .arguments('<manifest>') 14 | .action(async (manifest) => { 15 | 16 | if (fs.existsSync(manifest)) { 17 | process.exitCode = await util.validateManifest(manifest) === 'Error' ? 1 : 0; 18 | process.exit(); 19 | } else { 20 | console.log('-------------------------------------'); 21 | console.log('Error: Please provide a valid local manifest file path.'); 22 | console.log('-------------------------------------'); 23 | // update node process exit code when file does not exit 24 | process.exitCode = 1; 25 | process.exit(); 26 | } 27 | }).parse(process.argv); 28 | -------------------------------------------------------------------------------- /src/test/test.ts: -------------------------------------------------------------------------------- 1 | /* Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. 2 | * See LICENSE in the project root for license information. 3 | */ 4 | 5 | import * as chai from 'chai'; 6 | import * as chaiAsPromised from 'chai-as-promised'; 7 | import * as fs from 'fs'; 8 | import * as request from 'request'; 9 | import * as rp from 'request-promise'; 10 | 11 | chai.use(chaiAsPromised); 12 | chai.should(); 13 | let expect = chai.expect; 14 | 15 | async function getStatusCode(file, options) { 16 | let fileStream = fs.createReadStream(file); 17 | let response = await fileStream.pipe(rp(options)); 18 | return response.statusCode; 19 | } 20 | 21 | async function getServiceResponse(file, options) { 22 | let fileStream = fs.createReadStream(file); 23 | let response = await fileStream.pipe(rp(options)); 24 | return response; 25 | } 26 | 27 | describe('Test service scenarios', () => { 28 | let baseUri = 'https://verificationservice.osi.office.net/ova/addincheckingagent.svc/api/addincheck?lang='; 29 | let options = { 30 | uri: baseUri, 31 | method: 'POST', 32 | headers: { 33 | 'Content-Type': 'application/xml' 34 | }, 35 | resolveWithFullResponse: true 36 | }; 37 | let errors = []; 38 | let warnings = []; 39 | let infos = []; 40 | let supportedProducts = []; 41 | 42 | describe('Valid - 200', () => { 43 | it('should return validation passed with code 200', () => { 44 | let manifest = './manifest-to-test/valid_excel.xml'; 45 | return getStatusCode(manifest, options).should.eventually.equal(200); 46 | }); 47 | }); 48 | describe('Valid - 200, Response contains property \'supportedProducts\'', () => { 49 | before(async () => { 50 | let manifest = './manifest-to-test/valid_onenote.xml'; 51 | try { 52 | let response = await getServiceResponse(manifest, options); 53 | let formattedBody = JSON.parse(response.body.trim()); 54 | supportedProducts = formattedBody.checkReport.details.supportedProducts; 55 | } 56 | catch (err) { } 57 | }); 58 | it('should have \'supportedProducts\' and \'supportedProducts\' is an array', () => { 59 | expect(supportedProducts).to.exist.and.is.an('array'); 60 | }); 61 | it('should have \'title\' in \'supportedProducts\'', () => { 62 | expect(supportedProducts).to.have.deep.property('[0].title'); 63 | }); 64 | it('should have \'version\' in \'supportedProducts\'', () => { 65 | expect(supportedProducts).to.have.deep.property('[0].version'); 66 | }); 67 | }); 68 | // Make sure service return consistent format. 69 | // TODO: This test doesn't appear to be correct. This file only contains 2 errors. 70 | describe('Invalid - 200, Response contains property \'Errors\' \'Warnings\' \'Infos\'', () => { 71 | before(async () => { 72 | let manifest = './manifest-to-test/invalid_200.xml'; 73 | try { 74 | let response = await getServiceResponse(manifest, options); 75 | let formattedBody = JSON.parse(response.body.trim()); 76 | let validationReport = formattedBody.checkReport.validationReport; 77 | errors = validationReport.errors; 78 | warnings = validationReport.warnings; 79 | infos = validationReport.infos; 80 | } 81 | catch (err) { } 82 | }); 83 | it('should have \'Errors\' and \'Errors\' is an array', () => { 84 | expect(errors).to.exist.and.is.an('array'); 85 | }); 86 | it('should have \'Warnings\' and \'Warnings\' is an array', () => { 87 | expect(warnings).to.exist.and.is.an('array'); 88 | }); 89 | it('should have \'Infos\' and \'Infos\' is an array', () => { 90 | expect(infos).to.exist.and.is.an('array'); 91 | }); 92 | it('should have \'title\' in \'Errors\'', () => { 93 | expect(errors).to.have.deep.property('[0].title'); 94 | }); 95 | it('should have \'detail\' in \'Errors\'', () => { 96 | expect(errors).to.have.deep.property('[0].detail'); 97 | }); 98 | it('should have \'link\' in \'Errors\'', () => { 99 | expect(errors).to.have.deep.property('[0].link'); 100 | }); 101 | }); 102 | describe('Invalid - 400, request body is not valid xml', () => { 103 | it('should return validation failed with code 400', () => { 104 | let manifest = './manifest-to-test/invalid_400.xml'; 105 | return getStatusCode(manifest, options).should.eventually.throw; 106 | }); 107 | }); 108 | describe('Invalid, can not find file', () => { 109 | it('should return validation failed', () => { 110 | let manifest = ''; 111 | return getStatusCode(manifest, options).should.eventually.throw; 112 | }); 113 | }); 114 | }); 115 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. 3 | * See LICENSE in the project root for license information. 4 | */ 5 | 6 | import * as fs from 'fs'; 7 | import * as request from 'request'; 8 | import * as rp from 'request-promise'; 9 | import * as chalk from 'chalk'; 10 | 11 | let baseUri = 'https://verificationservice.osi.office.net/ova/addincheckingagent.svc/api/addincheck'; 12 | let options = { 13 | uri: baseUri, 14 | method: 'POST', 15 | headers: { 16 | 'Content-Type': 'application/xml' 17 | }, 18 | resolveWithFullResponse: true 19 | }; 20 | 21 | export async function validateManifest(manifest: string) : Promise<string> { 22 | try { 23 | console.log('Calling validation service. This might take a moment...'); 24 | let response = await callOmexService(manifest, options); 25 | if (response.statusCode === 200) { 26 | let formattedBody = JSON.parse(response.body.trim()); 27 | let validationReport = formattedBody.checkReport.validationReport; 28 | let validationResult = validationReport.result; 29 | 30 | console.log('-------------------------------------'); 31 | switch (validationResult) { 32 | case 'Passed': 33 | // supported products only exist when manifest is valid 34 | let supportedProducts = formattedBody.checkReport.details.supportedProducts; 35 | console.log(`${chalk.bold('Validation: ')}${chalk.bold.green('Passed')}`); 36 | logValidationReport(validationReport.warnings, 'warning'); 37 | logValidationReport(validationReport.infos, 'info'); 38 | logSupportedProduct(supportedProducts); 39 | break; 40 | case 'Failed': 41 | console.log(`${chalk.bold('Validation: ')}${chalk.bold.red('Failed')}`); 42 | logValidationReport(validationReport.errors, 'error'); 43 | logValidationReport(validationReport.warnings, 'warning'); 44 | logValidationReport(validationReport.infos, 'info'); 45 | break; 46 | } 47 | console.log('-------------------------------------'); 48 | return validationResult; 49 | } 50 | else { 51 | logError(response.statusCode); 52 | return 'Error'; 53 | } 54 | } catch (err) { 55 | if (err.name === 'RequestError') { 56 | console.log('-------------------------------------'); 57 | console.log('Error: Cannot reach service.'); 58 | console.log('-------------------------------------'); 59 | } else if (err.name === 'StatusCodeError') { 60 | let statusCode = err.statusCode; 61 | logError(statusCode); 62 | } else { 63 | console.log('-------------------------------------'); 64 | console.log('Error: Unexpected error.'); 65 | console.log('-------------------------------------'); 66 | } 67 | return 'Error'; 68 | } 69 | } 70 | 71 | async function callOmexService(file, options) { 72 | let fileStream = fs.createReadStream(file); 73 | let response = await fileStream.pipe(rp(options)); 74 | return response; 75 | } 76 | 77 | function logError(statusCode) { 78 | console.log('-------------------------------------'); 79 | console.log(`${chalk.bold('Validation: ')}${chalk.bold.red('Failed')}`); 80 | console.log(' Error Code: ' + statusCode); 81 | console.log(` ${chalk.bold.red('Error(s): ')}`); 82 | switch (statusCode) { 83 | case 400: 84 | console.log(' Request body does not contain a valid XML document, and/or is too large (capped at 256kb).'); 85 | break; 86 | case 415: 87 | console.log(' Content-Type is not set to application/xml.'); 88 | break; 89 | case 500: 90 | console.log(' Unexpected error.'); 91 | break; 92 | case 503: 93 | console.log(' Service unavailable; API processing has been disabled via BRS.'); 94 | break; 95 | } 96 | console.log('-------------------------------------'); 97 | } 98 | 99 | function logValidationReport(obj, name) { 100 | if (obj.length > 0) { 101 | switch (name) { 102 | case 'error': 103 | logErrors(obj); 104 | break; 105 | case 'warning': 106 | logWarnings(obj); 107 | break; 108 | case 'info': 109 | logInfos(obj); 110 | break; 111 | } 112 | } 113 | } 114 | 115 | // Provide detailed error information provided in the validationReport.errors object. 116 | function logErrors(errors) { 117 | let n = 1; 118 | for (let e of errors) { 119 | console.log(`${chalk.bold.red('\nError #' + n + ': ')}`); 120 | logDetails(e); 121 | ++n; 122 | } 123 | } 124 | 125 | // Provide detailed warning information provided in the validationReport.warnings object. 126 | function logWarnings(warnings) { 127 | let n = 1; 128 | for (let w of warnings) { 129 | console.log(` ${chalk.bold.yellow('Warning #' + n + ': ')}`); 130 | logDetails(w); 131 | ++n; 132 | } 133 | } 134 | 135 | // Provide detailed additional information provided in the validationReport.infos object. 136 | function logInfos(infos) { 137 | for (let i of infos) { 138 | console.log(` ${chalk.bold.blue(' Additional information: ')}`); 139 | logDetails(i); 140 | } 141 | } 142 | 143 | // Logs out the Code, Column, and/or Line value returned from the validation service. 144 | // param: obj - either an validationReport.errors[x], validationReport.warnings[x], or validationReport.infos[x] object. 145 | function logDetails(obj) { 146 | console.log('' + obj.title + ': ' + obj.detail + ' (link: ' + obj.link + ')'); 147 | if (obj.code) { 148 | console.log(' - Details: ' + obj.code); 149 | } 150 | if (obj.line) { 151 | console.log(' - Line: ' + obj.line); 152 | } 153 | if (obj.column) { 154 | console.log(' - Column: ' + obj.column); 155 | } 156 | } 157 | 158 | function logSupportedProduct(obj) { 159 | if (obj.length > 0) { 160 | let product = []; 161 | getProduct(obj, product); 162 | let unique = [...new Set(product)]; 163 | console.log(`Based on the requirements specified in your manifest, your add-in can run on the following platforms; your add-in will be tested on these platforms when you submit it to the Office Store:`); 164 | for (let i of unique) { 165 | console.log(' - ' + i); 166 | } 167 | console.log(`Important: This analysis is based on the requirements specified in your manifest and does not account for any runtime JavaScript calls within your add-in. For information about which API sets and features are supported on each platform, see Office Add-in host and platform availability. (https://dev.office.com/add-in-availability).\n`); 168 | console.log(`*This does not include mobile apps. You can opt-in to support mobile apps when you submit your add-in.`); 169 | } 170 | } 171 | 172 | function getProduct(array, result) { 173 | for (let i of array) { 174 | let itemTitle = i.title; 175 | result.push(itemTitle); 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "sourceMap": true, 7 | "emitDecoratorMetadata": true, 8 | "experimentalDecorators": true, 9 | "removeComments": false, 10 | "noImplicitAny": false, 11 | "noEmitOnError": true, 12 | "rootDir": "src", 13 | "outDir": "app", 14 | "lib": [ 15 | "dom", 16 | "es2015" 17 | ] 18 | }, 19 | "exclude": [ 20 | "node_modules" 21 | ] 22 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-reference": true, 4 | "only-arrow-functions": [ 5 | true, 6 | "allow-declarations" 7 | ], 8 | "no-namespace": [ 9 | true, 10 | "allow-declarations" 11 | ], 12 | "class-name": true, 13 | "curly": true, 14 | "eofline": true, 15 | "forin": true, 16 | "indent": [ 17 | true, 18 | "spaces" 19 | ], 20 | "label-position": true, 21 | "label-undefined": true, 22 | "no-arg": true, 23 | "no-var-keyword": true, 24 | "no-console": [ 25 | true, 26 | "debug", 27 | "info", 28 | "time", 29 | "timeEnd", 30 | "trace" 31 | ], 32 | "no-construct": true, 33 | "no-debugger": true, 34 | "no-duplicate-key": true, 35 | "no-duplicate-variable": true, 36 | "no-empty": false, 37 | "no-eval": true, 38 | "no-trailing-whitespace": true, 39 | "no-unused-expression": true, 40 | "no-unused-variable": false, 41 | "no-unreachable": true, 42 | "no-use-before-declare": true, 43 | "one-line": [ 44 | true, 45 | "check-open-brace", 46 | "check-whitespace" 47 | ], 48 | "quotemark": [ 49 | true, 50 | "single" 51 | ], 52 | "radix": true, 53 | "semicolon": [ 54 | true, 55 | "always", 56 | "ignore-interfaces" 57 | ], 58 | "triple-equals": [ 59 | true, 60 | "allow-null-check" 61 | ], 62 | "variable-name": false, 63 | "whitespace": [ 64 | true, 65 | "check-branch", 66 | "check-decl", 67 | "check-operator", 68 | "check-separator", 69 | "check-type" 70 | ] 71 | } 72 | } --------------------------------------------------------------------------------