├── .gitignore ├── frontend └── angular9 │ ├── .nvmrc │ ├── src │ ├── assets │ │ └── .gitkeep │ ├── app │ │ ├── home │ │ │ ├── home.component.css │ │ │ ├── home.component.ts │ │ │ └── home.component.html │ │ ├── app.component.css │ │ ├── profile │ │ │ ├── profile.component.css │ │ │ ├── profile.component.html │ │ │ └── profile.component.ts │ │ ├── app.component.html │ │ ├── app-routing.module.ts │ │ ├── app.module.ts │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ └── app-config.ts │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── styles.css │ ├── main.ts │ ├── index.html │ ├── test.ts │ └── polyfills.ts │ ├── e2e │ ├── tsconfig.json │ ├── src │ │ ├── app.po.ts │ │ └── app.e2e-spec.ts │ └── protractor.conf.js │ ├── .editorconfig │ ├── tsconfig.app.json │ ├── tsconfig.spec.json │ ├── browserslist │ ├── CODE_OF_CONDUCT.md │ ├── CHANGELOG.md │ ├── tsconfig.json │ ├── CONTRIBUTING.md │ ├── NG_README.md │ ├── karma.conf.js │ ├── LICENSE │ ├── package.json │ ├── .gitignore │ ├── tslint.json │ ├── SECURITY.md │ ├── angular.json │ └── README.md ├── migration ├── src │ ├── main │ │ ├── resources │ │ │ └── application.properties │ │ └── java │ │ │ └── com │ │ │ └── vidolima │ │ │ └── userimport │ │ │ └── UserimportApplication.java │ └── test │ │ └── java │ │ └── com │ │ └── vidolima │ │ └── userimport │ │ └── UserimportApplicationTests.java ├── settings.gradle ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties ├── README.md ├── .gitignore ├── build.gradle ├── gradlew.bat └── gradlew ├── backend ├── nodejs-express │ ├── .gitignore │ ├── process.json │ ├── CHANGELOG.md │ ├── CODE_OF_CONDUCT.md │ ├── config.js │ ├── CONTRIBUTING.md │ ├── LICENSE │ ├── package.json │ ├── index.js │ ├── SECURITY.md │ ├── README.md │ └── yarn.lock └── java-spring-boot │ ├── README.md │ ├── settings.gradle │ ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties │ ├── src │ ├── main │ │ ├── resources │ │ │ └── application.properties │ │ └── java │ │ │ └── com │ │ │ └── marcosvidolin │ │ │ └── b2cdemo │ │ │ ├── B2cdemoApplication.java │ │ │ ├── config │ │ │ ├── CorsConfig.java │ │ │ └── WebSecurityConfig.java │ │ │ └── rest │ │ │ └── ProfileRestController.java │ └── test │ │ └── java │ │ └── com │ │ └── marcosvidolin │ │ └── b2cdemo │ │ └── B2cdemoApplicationTests.java │ ├── .gitignore │ ├── build.gradle │ ├── gradlew.bat │ └── gradlew ├── .github └── assets │ └── authentication-flow.png └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /frontend/angular9/.nvmrc: -------------------------------------------------------------------------------- 1 | v10.18.0 2 | -------------------------------------------------------------------------------- /frontend/angular9/src/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /migration/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /migration/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'userimport' 2 | -------------------------------------------------------------------------------- /backend/nodejs-express/.gitignore: -------------------------------------------------------------------------------- 1 | package-lock.json 2 | node_modules -------------------------------------------------------------------------------- /backend/java-spring-boot/README.md: -------------------------------------------------------------------------------- 1 | # Spring Boot Web API with Azure AD B2C -------------------------------------------------------------------------------- /backend/java-spring-boot/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'b2cdemo' 2 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/home/home.component.css: -------------------------------------------------------------------------------- 1 | .card-section { 2 | margin: 10%; 3 | padding: 5%; 4 | } -------------------------------------------------------------------------------- /frontend/angular9/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/app.component.css: -------------------------------------------------------------------------------- 1 | .toolbar-spacer { 2 | flex: 1 1 auto; 3 | } 4 | 5 | a.title { 6 | color: white; 7 | } -------------------------------------------------------------------------------- /frontend/angular9/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/My-Azure-Projects/AzureActiveDirectoryApplication/HEAD/frontend/angular9/src/favicon.ico -------------------------------------------------------------------------------- /.github/assets/authentication-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/My-Azure-Projects/AzureActiveDirectoryApplication/HEAD/.github/assets/authentication-flow.png -------------------------------------------------------------------------------- /migration/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/My-Azure-Projects/AzureActiveDirectoryApplication/HEAD/migration/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /frontend/angular9/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | @import '~@angular/material/prebuilt-themes/deeppurple-amber.css'; 3 | -------------------------------------------------------------------------------- /backend/java-spring-boot/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/My-Azure-Projects/AzureActiveDirectoryApplication/HEAD/backend/java-spring-boot/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /frontend/angular9/src/app/profile/profile.component.css: -------------------------------------------------------------------------------- 1 | .card-section { 2 | margin: 10%; 3 | padding: 5%; 4 | } 5 | 6 | #profile { 7 | font-size: large; 8 | background-color: rgb(161, 104, 252); 9 | } -------------------------------------------------------------------------------- /backend/java-spring-boot/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | server.port=9000 2 | spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://vidolin.b2clogin.com/vidolin.onmicrosoft.com/discovery/v2.0/keys?p=B2C_1_SignIn_v2 -------------------------------------------------------------------------------- /migration/README.md: -------------------------------------------------------------------------------- 1 | # User Migration 2 | 3 | This is a migration application to import users from a legacy IdP to the Azure AD B2C. 4 | 5 | ## References 6 | 7 | (Creating a new user in Azure AD)[https://docs.microsoft.com/en-us/powershell/azure/active-directory/new-user-sample?view=azureadps-2.0] 8 | -------------------------------------------------------------------------------- /migration/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 19 00:50:39 BRT 2020 2 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip 3 | distributionBase=GRADLE_USER_HOME 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /frontend/angular9/e2e/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/e2e", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "types": [ 8 | "jasmine", 9 | "jasminewd2", 10 | "node" 11 | ] 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /backend/java-spring-boot/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 05 16:45:12 BRT 2020 2 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip 3 | distributionBase=GRADLE_USER_HOME 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /frontend/angular9/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see https://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = off 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /frontend/angular9/e2e/src/app.po.ts: -------------------------------------------------------------------------------- 1 | import { browser, by, element } from 'protractor'; 2 | 3 | export class AppPage { 4 | navigateTo() { 5 | return browser.get(browser.baseUrl) as Promise; 6 | } 7 | 8 | getTitleText() { 9 | return element(by.css('.welcome')).getText() as Promise; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /migration/src/test/java/com/vidolima/userimport/UserimportApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.vidolima.userimport; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class UserimportApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /backend/java-spring-boot/src/test/java/com/marcosvidolin/b2cdemo/B2cdemoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.marcosvidolin.b2cdemo; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class B2cdemoApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app-home', 5 | templateUrl: './home.component.html', 6 | styleUrls: ['./home.component.css'] 7 | }) 8 | export class HomeComponent implements OnInit { 9 | 10 | constructor() { } 11 | 12 | ngOnInit() { 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/profile/profile.component.html: -------------------------------------------------------------------------------- 1 | 2 | Sign-in with Microsoft Azure AD B2C 3 | Getting an access token with Azure AD B2C and calling a Web API 4 | Welcome {{profile.name}}! 5 | 6 | -------------------------------------------------------------------------------- /frontend/angular9/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/app", 5 | "types": [] 6 | }, 7 | "files": [ 8 | "src/main.ts", 9 | "src/polyfills.ts" 10 | ], 11 | "include": [ 12 | "src/**/*.ts" 13 | ], 14 | "exclude": [ 15 | "src/test.ts", 16 | "src/**/*.spec.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /frontend/angular9/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./out-tsc/spec", 5 | "types": [ 6 | "jasmine", 7 | "node" 8 | ] 9 | }, 10 | "files": [ 11 | "src/test.ts", 12 | "src/polyfills.ts" 13 | ], 14 | "include": [ 15 | "src/**/*.spec.ts", 16 | "src/**/*.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /backend/nodejs-express/process.json: -------------------------------------------------------------------------------- 1 | { 2 | "name" : "worker", 3 | "script" : "./index.js", 4 | "instances" : 1, 5 | "merge_logs" : true, 6 | "log_date_format" : "YYYY-MM-DD HH:mm Z", 7 | "watch": true, 8 | "watch_options": { 9 | "followSymlinks": true, 10 | "usePolling" : true, 11 | "interval" : 5 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /frontend/angular9/src/main.ts: -------------------------------------------------------------------------------- 1 | import { enableProdMode } from '@angular/core'; 2 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 3 | 4 | import { AppModule } from './app/app.module'; 5 | import { environment } from './environments/environment'; 6 | 7 | if (environment.production) { 8 | enableProdMode(); 9 | } 10 | 11 | platformBrowserDynamic().bootstrapModule(AppModule) 12 | .catch(err => console.error(err)); 13 | -------------------------------------------------------------------------------- /backend/java-spring-boot/src/main/java/com/marcosvidolin/b2cdemo/B2cdemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.marcosvidolin.b2cdemo; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class B2cdemoApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(B2cdemoApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /backend/nodejs-express/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## 2020-03-21 4 | 5 | * Switch to using the tenant domain name for the tenant ID in [config.js](config.js). 6 | * Update README to reflect current state of sample and the articles referenced on [docs.microsoft.com](https://docs.microsoft.com/azure/active-directory-b2c). 7 | 8 | ## 2020-03-04 9 | 10 | * Dependencies updated. 11 | * Configuration parameters separated. 12 | * README improved. 13 | * ES6 conventions introduced. 14 | -------------------------------------------------------------------------------- /backend/nodejs-express/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns -------------------------------------------------------------------------------- /frontend/angular9/browserslist: -------------------------------------------------------------------------------- 1 | # This file is used by the build system to adjust CSS and JS output to support the specified browsers below. 2 | # For additional information regarding the format and rule options, please see: 3 | # https://github.com/browserslist/browserslist#queries 4 | 5 | # You can see what browsers were selected by your queries by running: 6 | # npx browserslist 7 | 8 | > 0.5% 9 | last 2 versions 10 | Firefox ESR 11 | not dead 12 | IE 9-11 # For IE 9-11 support, remove 'not'. 13 | -------------------------------------------------------------------------------- /frontend/angular9/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Microsoft Open Source Code of Conduct 2 | 3 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). 4 | 5 | Resources: 6 | 7 | - [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) 8 | - [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) 9 | - Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns 10 | -------------------------------------------------------------------------------- /migration/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | bin/ 3 | .gradle 4 | build/ 5 | !gradle/wrapper/gradle-wrapper.jar 6 | !**/src/main/** 7 | !**/src/test/** 8 | *.class 9 | ### STS ### 10 | .apt_generated 11 | .classpath 12 | .factorypath 13 | .project 14 | .settings 15 | .springBeans 16 | .sts4-cache 17 | 18 | ### IntelliJ IDEA ### 19 | .idea 20 | *.iws 21 | *.iml 22 | *.ipr 23 | out/ 24 | 25 | ### NetBeans ### 26 | /nbproject/private/ 27 | /nbbuild/ 28 | /dist/ 29 | /nbdist/ 30 | /.nb-gradle/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /backend/java-spring-boot/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | .gradle 3 | build/ 4 | bin/ 5 | !gradle/wrapper/gradle-wrapper.jar 6 | !**/src/main/** 7 | !**/src/test/** 8 | 9 | ### STS ### 10 | .apt_generated 11 | .classpath 12 | .factorypath 13 | .project 14 | .settings 15 | .springBeans 16 | .sts4-cache 17 | 18 | ### IntelliJ IDEA ### 19 | .idea 20 | *.iws 21 | *.iml 22 | *.ipr 23 | out/ 24 | 25 | ### NetBeans ### 26 | /nbproject/private/ 27 | /nbbuild/ 28 | /dist/ 29 | /nbdist/ 30 | /.nb-gradle/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /frontend/angular9/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # CHANGELOG 2 | 3 | ## 5/04/2020 4 | 5 | * Updated to msal-angular 1.0.0. 6 | * Updated to msal.js 1.3.0. 7 | * Added error handling for password reset flow. 8 | 9 | ## 3/31/2020 10 | 11 | * Updated Angular 8 to Angular 9. 12 | * Added a new route protected by MSALGuard. 13 | * Added Angular Factory for configuration objects. 14 | * Reorganized configuration file and added clarifications. 15 | * Minor changes on README.md. 16 | 17 | ## 2/20/2020 18 | 19 | * Initial version of sample application and related files. 20 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 | {{ title }} 3 | 4 |
5 | 6 | 7 | 8 |
9 | 10 |
11 | 12 | 13 |
-------------------------------------------------------------------------------- /frontend/angular9/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | AAD B2C | MSAL.JS Angular SPA 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/home/home.component.html: -------------------------------------------------------------------------------- 1 | 2 | Sign-in with Microsoft Azure AD B2C 3 | Getting an access token with Azure AD B2C and calling a Web API 4 | This simple sample demonstrates how to use the Microsoft Authentication Library for JavaScript (msal.js) to get an access token and call an API secured by Azure AD B2C. 5 | 6 | Call API 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /backend/java-spring-boot/src/main/java/com/marcosvidolin/b2cdemo/config/CorsConfig.java: -------------------------------------------------------------------------------- 1 | package com.marcosvidolin.b2cdemo.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.web.servlet.config.annotation.CorsRegistry; 5 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 6 | 7 | @Configuration 8 | public class CorsConfig implements WebMvcConfigurer { 9 | 10 | @Override 11 | public void addCorsMappings(CorsRegistry registry) { 12 | registry.addMapping("/**") 13 | .allowedMethods("*") 14 | .allowedOrigins("*"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /frontend/angular9/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "baseUrl": "./", 5 | "outDir": "./dist/out-tsc", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "downlevelIteration": true, 9 | "experimentalDecorators": true, 10 | "module": "esnext", 11 | "moduleResolution": "node", 12 | "importHelpers": true, 13 | "target": "es5", 14 | "typeRoots": [ 15 | "node_modules/@types" 16 | ], 17 | "lib": [ 18 | "es2018", 19 | "dom" 20 | ] 21 | }, 22 | "angularCompilerOptions": { 23 | "fullTemplateTypeCheck": true, 24 | "strictInjectionParameters": true 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes, RouterModule } from '@angular/router'; 3 | import { MsalGuard } from '@azure/msal-angular'; 4 | import { HomeComponent } from './home/home.component'; 5 | import { ProfileComponent } from './profile/profile.component'; 6 | 7 | const routes: Routes = [ 8 | { 9 | path: 'profile', 10 | component: ProfileComponent, 11 | canActivate: [ 12 | MsalGuard 13 | ] 14 | }, 15 | { 16 | path: '', 17 | component: HomeComponent 18 | } 19 | ]; 20 | 21 | @NgModule({ 22 | imports: [RouterModule.forRoot(routes, { useHash: false })], 23 | exports: [RouterModule] 24 | }) 25 | export class AppRoutingModule { } 26 | -------------------------------------------------------------------------------- /frontend/angular9/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/zone-testing'; 4 | import { getTestBed } from '@angular/core/testing'; 5 | import { 6 | BrowserDynamicTestingModule, 7 | platformBrowserDynamicTesting 8 | } from '@angular/platform-browser-dynamic/testing'; 9 | 10 | declare const require: any; 11 | 12 | // First, initialize the Angular testing environment. 13 | getTestBed().initTestEnvironment( 14 | BrowserDynamicTestingModule, 15 | platformBrowserDynamicTesting() 16 | ); 17 | // Then we find all the tests. 18 | const context = require.context('./', true, /\.spec\.ts$/); 19 | // And load the modules. 20 | context.keys().map(context); 21 | -------------------------------------------------------------------------------- /frontend/angular9/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // This file can be replaced during build by using the `fileReplacements` array. 2 | // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. 3 | // The list of file replacements can be found in `angular.json`. 4 | 5 | export const environment = { 6 | production: false, 7 | }; 8 | 9 | /* 10 | * For easier debugging in development mode, you can import the following file 11 | * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. 12 | * 13 | * This import should be commented out in production mode because it will have a negative impact 14 | * on performance if an error is thrown. 15 | */ 16 | // import 'zone.js/dist/zone-error'; // Included with Angular CLI. 17 | -------------------------------------------------------------------------------- /backend/java-spring-boot/src/main/java/com/marcosvidolin/b2cdemo/rest/ProfileRestController.java: -------------------------------------------------------------------------------- 1 | package com.marcosvidolin.b2cdemo.rest; 2 | 3 | import org.springframework.http.ResponseEntity; 4 | import org.springframework.security.core.annotation.AuthenticationPrincipal; 5 | import org.springframework.security.oauth2.jwt.Jwt; 6 | import org.springframework.web.bind.annotation.GetMapping; 7 | import org.springframework.web.bind.annotation.RestController; 8 | 9 | @RestController 10 | public class ProfileRestController { 11 | 12 | @GetMapping("/profile") 13 | public ResponseEntity index(@AuthenticationPrincipal Jwt jwt) { 14 | String name = jwt.getClaim("given_name"); 15 | return ResponseEntity.ok("{\"name\": \"" + name + "\"}"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /frontend/angular9/e2e/src/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import { AppPage } from './app.po'; 2 | import { browser, logging } from 'protractor'; 3 | 4 | describe('workspace-project App', () => { 5 | let page: AppPage; 6 | 7 | beforeEach(() => { 8 | page = new AppPage(); 9 | }); 10 | 11 | it('should display welcome message', () => { 12 | page.navigateTo(); 13 | expect(page.getTitleText()).toEqual('Sign-in with Microsoft Azure AD B2C'); 14 | }); 15 | 16 | afterEach(async () => { 17 | // Assert that there are no errors emitted from the browser 18 | const logs = await browser.manage().logs().get(logging.Type.BROWSER); 19 | expect(logs).not.toContain(jasmine.objectContaining({ 20 | level: logging.Level.SEVERE, 21 | } as logging.Entry)); 22 | }); 23 | }); 24 | -------------------------------------------------------------------------------- /backend/nodejs-express/config.js: -------------------------------------------------------------------------------- 1 | // Update these four variables with values from your B2C tenant in the Azure portal 2 | const clientID = "34e749f7-1627-4b65-afb6-05d05074b676"; // Application (client) ID of your API's application registration 3 | const b2cDomainHost = "vidolin.b2clogin.com"; 4 | const tenantId = "vidolin.onmicrosoft.com"; // Alternatively, you can use your Directory (tenant) ID (a GUID) 5 | const policyName = "B2C_1_SignIn_v2"; 6 | 7 | const config = { 8 | identityMetadata: "https://" + b2cDomainHost + "/" + tenantId + "/" + policyName + "/v2.0/.well-known/openid-configuration/", 9 | clientID: clientID, 10 | policyName: policyName, 11 | isB2C: true, 12 | validateIssuer: false, 13 | loggingLevel: 'info', 14 | loggingNoPII: false, 15 | passReqToCallback: false 16 | } 17 | 18 | module.exports = config; -------------------------------------------------------------------------------- /migration/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.3.1.RELEASE' 3 | id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.vidolima' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | repositories { 12 | mavenCentral() 13 | jcenter() 14 | jcenter{ 15 | url 'http://oss.jfrog.org/artifactory/oss-snapshot-local' 16 | } 17 | } 18 | 19 | dependencies { 20 | implementation 'org.springframework.boot:spring-boot-starter' 21 | 22 | compile('com.microsoft.graph:microsoft-graph:1.8.+') 23 | compile('com.microsoft.graph:microsoft-graph-auth:0.2.0-SNAPSHOT') 24 | 25 | testImplementation('org.springframework.boot:spring-boot-starter-test') { 26 | exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' 27 | } 28 | } 29 | 30 | test { 31 | useJUnitPlatform() 32 | } 33 | -------------------------------------------------------------------------------- /backend/java-spring-boot/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'org.springframework.boot' version '2.3.0.RELEASE' 3 | id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 | id 'java' 5 | } 6 | 7 | group = 'com.marcosvidolin' 8 | version = '0.0.1-SNAPSHOT' 9 | sourceCompatibility = '1.8' 10 | 11 | configurations { 12 | compileOnly { 13 | extendsFrom annotationProcessor 14 | } 15 | } 16 | 17 | repositories { 18 | mavenCentral() 19 | } 20 | 21 | dependencies { 22 | implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' 23 | implementation 'org.springframework.boot:spring-boot-starter-web' 24 | compileOnly 'org.projectlombok:lombok' 25 | annotationProcessor 'org.projectlombok:lombok' 26 | testImplementation('org.springframework.boot:spring-boot-starter-test') { 27 | exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' 28 | } 29 | } 30 | 31 | test { 32 | useJUnitPlatform() 33 | } 34 | -------------------------------------------------------------------------------- /frontend/angular9/e2e/protractor.conf.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | // Protractor configuration file, see link for more information 3 | // https://github.com/angular/protractor/blob/master/lib/config.ts 4 | 5 | const { SpecReporter } = require('jasmine-spec-reporter'); 6 | 7 | /** 8 | * @type { import("protractor").Config } 9 | */ 10 | exports.config = { 11 | allScriptsTimeout: 11000, 12 | specs: [ 13 | './src/**/*.e2e-spec.ts' 14 | ], 15 | capabilities: { 16 | browserName: 'chrome' 17 | }, 18 | directConnect: true, 19 | baseUrl: 'http://localhost:8080/', 20 | framework: 'jasmine', 21 | jasmineNodeOpts: { 22 | showColors: true, 23 | defaultTimeoutInterval: 30000, 24 | print: function() {} 25 | }, 26 | onPrepare() { 27 | require('ts-node').register({ 28 | project: require('path').join(__dirname, './tsconfig.json') 29 | }); 30 | jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # azure-ad-b2c-login 2 | 3 | 4 | This is a simple authentication demo that uses Azure Active Directory B2C to authenticate users into a single page application (SPA). 5 | 6 | ## Authentication Flow 7 | 8 | 9 | Authentication Flow 10 | 11 | ## Single Page Aplication 12 | 13 | Angular 9 SPA sample that authenticate users in Azure AD B2C and calls the Spring Boot (Java) and Nodejs APIs. 14 | 15 | Access the [documentation](./frontend/angular9/README.md) to know more about this sample. 16 | 17 | ## API 18 | 19 | We have two Web APIs writing in Java and Nodejs, each one of them has a similar endpoint to get the user name from the given token. 20 | 21 | > It's only possible to access the APIs passing the token. 22 | 23 | You can know more about each APIs accessing the documentation: 24 | 25 | - [Spring Boot API](./backend/java-spring-boot/README.md) 26 | 27 | - [Nodejs API](./backend/nodejs-express/README.md) 28 | -------------------------------------------------------------------------------- /backend/nodejs-express/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 4 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 5 | the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 6 | 7 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide 8 | a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions 9 | provided by the bot. You will only need to do this once across all repos using our CLA. 10 | 11 | ## Instructions 12 | 13 | Follow these instructions to download and run the sample locally. 14 | 15 | 1. Install [Node](https://nodejs.org/). 16 | 2. Clone and download this repository. 17 | 3. Navigate to the root of this repository, and install the dependencies: `npm install` 18 | 4. Start the application: `npm start` 19 | -------------------------------------------------------------------------------- /frontend/angular9/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | This project welcomes contributions and suggestions. Most contributions require you to agree to a 4 | Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us 5 | the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. 6 | 7 | When you submit a pull request, a CLA bot will automatically determine whether you need to provide 8 | a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions 9 | provided by the bot. You will only need to do this once across all repos using our CLA. 10 | 11 | ## Instructions 12 | 13 | Follow these instructions to download and run the sample locally. 14 | 15 | 1. Install [Node](https://nodejs.org/). 16 | 2. Clone and download this repository. 17 | 3. Navigate to the root of this repository, and install the dependencies: `npm install` 18 | 4. Start the application: `npm start` 19 | 5. Run tests: `npm test` 20 | 6. Run linting: `npm run lint` 21 | -------------------------------------------------------------------------------- /frontend/angular9/NG_README.md: -------------------------------------------------------------------------------- 1 | # ActiveDirectoryJavascriptSinglepageappAngular 2 | 3 | This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.3.24. 4 | 5 | ## Development server 6 | 7 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. 8 | 9 | ## Code scaffolding 10 | 11 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. 12 | 13 | ## Build 14 | 15 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. 16 | 17 | ## Running unit tests 18 | 19 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 20 | 21 | ## Running end-to-end tests 22 | 23 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). 24 | 25 | ## Further help 26 | 27 | To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). 28 | -------------------------------------------------------------------------------- /frontend/angular9/karma.conf.js: -------------------------------------------------------------------------------- 1 | // Karma configuration file, see link for more information 2 | // https://karma-runner.github.io/1.0/config/configuration-file.html 3 | 4 | module.exports = function (config) { 5 | config.set({ 6 | basePath: '', 7 | frameworks: ['jasmine', '@angular-devkit/build-angular'], 8 | plugins: [ 9 | require('karma-jasmine'), 10 | require('karma-chrome-launcher'), 11 | require('karma-jasmine-html-reporter'), 12 | require('karma-coverage-istanbul-reporter'), 13 | require('@angular-devkit/build-angular/plugins/karma') 14 | ], 15 | client: { 16 | clearContext: false // leave Jasmine Spec Runner output visible in browser 17 | }, 18 | coverageIstanbulReporter: { 19 | dir: require('path').join(__dirname, './coverage/active-directory-b2c-javascript-angular-spa'), 20 | reports: ['html', 'lcovonly', 'text-summary'], 21 | fixWebpackSourcePaths: true 22 | }, 23 | reporters: ['progress', 'kjhtml'], 24 | port: 9876, 25 | colors: true, 26 | logLevel: config.LOG_INFO, 27 | autoWatch: true, 28 | browsers: ['Chrome'], 29 | singleRun: false, 30 | restartOnFileChange: true 31 | }); 32 | }; 33 | -------------------------------------------------------------------------------- /frontend/angular9/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 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 all 13 | 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 THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /backend/nodejs-express/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. All rights reserved. 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 all 13 | 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 THE 21 | SOFTWARE 22 | -------------------------------------------------------------------------------- /backend/nodejs-express/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "active-directory-b2c-javascript-nodejs-webapi", 3 | "version": "1.0.0", 4 | "description": "---\r page_type: sample\r description: \"This sample demonstrates how to protect a Node.js web API with Azure AD B2C using the Passport.js library.\"\r languages:\r - javascript\r - nodejs\r products:\r - azure\r - azure-active-directory\r urlFragment: nodejs-web-api-azure-ad\r ---", 5 | "author": "", 6 | "license": "ISC", 7 | "engines": { 8 | "node": ">=6.9.1" 9 | }, 10 | "scripts": { 11 | "start": "node index.js", 12 | "dev": "nodemon index.js" 13 | }, 14 | "dependencies": { 15 | "express": "^4.14.0", 16 | "morgan": "^1.7.0", 17 | "passport": "^0.3.2", 18 | "passport-azure-ad": "^4.2.1" 19 | }, 20 | "main": "index.js", 21 | "repository": { 22 | "type": "git", 23 | "url": "git+https://github.com/Azure-Samples/active-directory-b2c-javascript-nodejs-webapi.git" 24 | }, 25 | "bugs": { 26 | "url": "https://github.com/Azure-Samples/active-directory-b2c-javascript-nodejs-webapi/issues" 27 | }, 28 | "homepage": "https://github.com/Azure-Samples/active-directory-b2c-javascript-nodejs-webapi#readme", 29 | "devDependencies": { 30 | "nodemon": "^2.0.2" 31 | }, 32 | "keywords": [ 33 | "azure", 34 | "ad", 35 | "node.js", 36 | "b2c", 37 | "api" 38 | ] 39 | } 40 | -------------------------------------------------------------------------------- /frontend/angular9/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "active-directory-b2c-javascript-angular-spa", 3 | "version": "0.0.0", 4 | "scripts": { 5 | "ng": "ng", 6 | "start": "ng serve", 7 | "build": "ng build", 8 | "test": "ng test", 9 | "lint": "ng lint", 10 | "e2e": "ng e2e" 11 | }, 12 | "private": true, 13 | "dependencies": { 14 | "@angular/animations": "^9.1.9", 15 | "@angular/cdk": "^9.2.4", 16 | "@angular/common": "^9.1.9", 17 | "@angular/compiler": "^9.1.9", 18 | "@angular/core": "^9.1.9", 19 | "@angular/forms": "^9.1.9", 20 | "@angular/material": "^9.2.4", 21 | "@angular/platform-browser": "^9.1.9", 22 | "@angular/platform-browser-dynamic": "^9.1.9", 23 | "@angular/router": "^9.1.9", 24 | "@azure/msal-angular": "^1.0.0", 25 | "core-js": "^3.6.4", 26 | "msal": "^1.3.1", 27 | "rxjs": "~6.5.4", 28 | "tslib": "^1.13.0", 29 | "zone.js": "~0.10.2" 30 | }, 31 | "devDependencies": { 32 | "@angular-devkit/build-angular": "^0.901.7", 33 | "@angular/cli": "^9.1.7", 34 | "@angular/compiler-cli": "^9.1.9", 35 | "@angular/language-service": "^9.1.9", 36 | "@types/jasmine": "~3.3.8", 37 | "@types/jasminewd2": "~2.0.3", 38 | "@types/node": "^12.12.43", 39 | "codelyzer": "^5.1.2", 40 | "jasmine-core": "~3.4.0", 41 | "jasmine-spec-reporter": "~4.2.1", 42 | "karma": "^5.0.9", 43 | "karma-chrome-launcher": "~2.2.0", 44 | "karma-coverage-istanbul-reporter": "~2.0.1", 45 | "karma-jasmine": "~2.0.1", 46 | "karma-jasmine-html-reporter": "^1.5.4", 47 | "protractor": "^5.4.4", 48 | "ts-node": "~7.0.0", 49 | "tslint": "~5.15.0", 50 | "typescript": "~3.8.3" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /backend/java-spring-boot/src/main/java/com/marcosvidolin/b2cdemo/config/WebSecurityConfig.java: -------------------------------------------------------------------------------- 1 | package com.marcosvidolin.b2cdemo.config; 2 | 3 | import org.springframework.http.HttpMethod; 4 | import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; 5 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 6 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 7 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 8 | import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; 9 | import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer; 10 | import org.springframework.security.config.http.SessionCreationPolicy; 11 | 12 | @EnableWebSecurity 13 | @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 14 | public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 15 | 16 | @Override 17 | protected void configure(HttpSecurity http) throws Exception { 18 | http 19 | .httpBasic().disable() 20 | .formLogin(AbstractHttpConfigurer::disable) 21 | .csrf(AbstractHttpConfigurer::disable) 22 | // .authorizeRequests(authorize -> authorize 23 | // .mvcMatchers(HttpMethod.POST, "/profile/**").hasAuthority("ROLE_b2cdemo_read") 24 | // .mvcMatchers(HttpMethod.POST, "/profile/**").hasAuthority("ROLE_b2cdemo_write") 25 | // .anyRequest().authenticated() 26 | // ) 27 | .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt) 28 | .sessionManagement(sessionManagement -> 29 | sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /backend/nodejs-express/index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const morgan = require("morgan"); 3 | const passport = require("passport"); 4 | const config = require('./config'); 5 | const BearerStrategy = require('passport-azure-ad').BearerStrategy; 6 | 7 | // A simple check for clientID placeholder (do not replace with you client id) 8 | if (config.clientID === 'YOUR_CLIENT_ID') { 9 | console.error("Please update 'options' with the client id (application id) of your application"); 10 | return; 11 | } 12 | 13 | const bearerStrategy = new BearerStrategy(config, 14 | function (token, done) { 15 | // Send user info using the second argument 16 | done(null, {}, token); 17 | } 18 | ); 19 | 20 | const app = express(); 21 | 22 | app.use(morgan('dev')); 23 | app.use(passport.initialize()); 24 | 25 | passport.use(bearerStrategy); 26 | 27 | //enable CORS 28 | app.use((req, res, next) => { 29 | res.header("Access-Control-Allow-Origin", "*"); 30 | res.header("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type, Accept"); 31 | next(); 32 | }); 33 | 34 | // API endpoint 35 | app.get("/profile", 36 | passport.authenticate('oauth-bearer', {session: false}), 37 | (req, res) => { 38 | console.log('User info: ', req.user); 39 | console.log('Validated claims: ', req.authInfo); 40 | console.log(req.authInfo['scp']); 41 | 42 | if ('scp' in req.authInfo && req.authInfo['scp'].split(" ").indexOf("b2cdemo.read") >= 0) { 43 | // Service relies on the name claim. 44 | res.status(200).json({'name': req.authInfo['given_name']}); 45 | } else { 46 | console.log("Invalid Scope, 403"); 47 | res.status(403).json({'error': 'insufficient_scope'}); 48 | } 49 | } 50 | ); 51 | 52 | const port = process.env.PORT || 9000; 53 | 54 | app.listen(port, () => { 55 | console.log("Listening on port " + port); 56 | }); 57 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/profile/profile.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { HttpClient } from '@angular/common/http'; 3 | import { MsalService, BroadcastService } from '@azure/msal-angular'; 4 | import { InteractionRequiredAuthError, AuthError } from 'msal'; 5 | import { apiConfig } from '../app-config'; 6 | 7 | 8 | @Component({ 9 | selector: 'app-profile', 10 | templateUrl: './profile.component.html', 11 | styleUrls: ['./profile.component.css'] 12 | }) 13 | export class ProfileComponent implements OnInit { 14 | 15 | profile: any = { name: 'not set'}; 16 | 17 | constructor(private broadcastService: BroadcastService, private authService: MsalService, private http: HttpClient) { } 18 | 19 | ngOnInit(): void { 20 | this.getProfile(apiConfig.webApi); 21 | 22 | this.broadcastService.subscribe('msal:acquireTokenSuccess', (payload) => { 23 | console.log('access token acquired at: ' + new Date().toString()); 24 | }); 25 | 26 | this.broadcastService.subscribe('msal:acquireTokenFailure', (payload) => { 27 | console.log('access token acquisition fails'); 28 | console.log(payload); 29 | }); 30 | } 31 | 32 | getProfile(url: string) { 33 | this.http.get(url).subscribe({ 34 | next: (profile) => { 35 | this.profile = profile; 36 | }, 37 | error: (err: AuthError) => { 38 | // If there is an interaction required error, 39 | // call one of the interactive methods and then make the request again. 40 | if (InteractionRequiredAuthError.isInteractionRequiredError(err.errorCode)) { 41 | this.authService.acquireTokenPopup({ 42 | scopes: this.authService.getScopesForEndpoint(url) 43 | }).then(() => { 44 | this.http.get(url).toPromise() 45 | .then(profile => { 46 | this.profile = profile; 47 | }); 48 | }); 49 | } 50 | } 51 | }); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 3 | import { NgModule } from '@angular/core'; 4 | import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http'; 5 | 6 | import { MatButtonModule } from '@angular/material/button'; 7 | import { MatCardModule } from '@angular/material/card'; 8 | import { MatListModule } from '@angular/material/list'; 9 | import { MatToolbarModule } from '@angular/material/toolbar'; 10 | 11 | import { Configuration } from 'msal'; 12 | import { 13 | MsalModule, 14 | MsalInterceptor, 15 | MSAL_CONFIG, 16 | MSAL_CONFIG_ANGULAR, 17 | MsalService, 18 | MsalAngularConfiguration 19 | } from '@azure/msal-angular'; 20 | 21 | import { msalConfig, msalAngularConfig } from './app-config'; 22 | import { AppRoutingModule } from './app-routing.module'; 23 | import { AppComponent } from './app.component'; 24 | import { HomeComponent } from './home/home.component'; 25 | import { ProfileComponent } from './profile/profile.component'; 26 | 27 | function MSALConfigFactory(): Configuration { 28 | return msalConfig; 29 | } 30 | 31 | function MSALAngularConfigFactory(): MsalAngularConfiguration { 32 | return msalAngularConfig; 33 | } 34 | 35 | @NgModule({ 36 | declarations: [ 37 | AppComponent, 38 | HomeComponent, 39 | ProfileComponent, 40 | ], 41 | imports: [ 42 | BrowserModule, 43 | AppRoutingModule, 44 | BrowserAnimationsModule, 45 | HttpClientModule, 46 | MatToolbarModule, 47 | MatButtonModule, 48 | MatListModule, 49 | AppRoutingModule, 50 | MatCardModule, 51 | MsalModule 52 | ], 53 | providers: [ 54 | { 55 | provide: HTTP_INTERCEPTORS, 56 | useClass: MsalInterceptor, 57 | multi: true 58 | }, 59 | { 60 | provide: MSAL_CONFIG, 61 | useFactory: MSALConfigFactory 62 | }, 63 | { 64 | provide: MSAL_CONFIG_ANGULAR, 65 | useFactory: MSALAngularConfigFactory 66 | }, 67 | MsalService 68 | ], 69 | bootstrap: [AppComponent] 70 | }) 71 | export class AppModule { } -------------------------------------------------------------------------------- /frontend/angular9/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | import { TestBed, async } from '@angular/core/testing'; 2 | import { RouterTestingModule } from '@angular/router/testing'; 3 | import { AppComponent } from './app.component'; 4 | import { MatButtonModule } from '@angular/material/button'; 5 | import { MatCardModule } from '@angular/material/card'; 6 | import { MatListModule } from '@angular/material/list'; 7 | import { MatToolbarModule } from '@angular/material/toolbar'; 8 | import { BroadcastService, MsalService, MsalAngularConfiguration } from '@azure/msal-angular'; 9 | import { MSAL_CONFIG, MSAL_CONFIG_ANGULAR } from '@azure/msal-angular'; 10 | import { Configuration } from 'msal'; 11 | import { msalConfig, msalAngularConfig } from './app-config'; 12 | 13 | describe('AppComponent', () => { 14 | beforeEach(async(() => { 15 | TestBed.configureTestingModule({ 16 | imports: [ 17 | RouterTestingModule, 18 | MatToolbarModule, 19 | MatButtonModule, 20 | MatListModule, 21 | MatCardModule 22 | ], 23 | declarations: [ 24 | AppComponent 25 | ], 26 | providers: [ 27 | MsalService, 28 | { 29 | provide: MSAL_CONFIG, 30 | useValue: msalConfig as Configuration 31 | }, 32 | { 33 | provide: MSAL_CONFIG_ANGULAR, 34 | useValue: msalAngularConfig as MsalAngularConfiguration 35 | }, 36 | BroadcastService 37 | ] 38 | }).compileComponents(); 39 | })); 40 | 41 | it('should create the app', () => { 42 | const fixture = TestBed.createComponent(AppComponent); 43 | const app = fixture.debugElement.componentInstance; 44 | expect(app).toBeTruthy(); 45 | }); 46 | 47 | it(`should have as title 'Azure AD B2C'`, () => { 48 | const fixture = TestBed.createComponent(AppComponent); 49 | const app = fixture.debugElement.componentInstance; 50 | expect(app.title).toEqual('Azure AD B2C'); 51 | }); 52 | 53 | it('should render title', () => { 54 | const fixture = TestBed.createComponent(AppComponent); 55 | fixture.detectChanges(); 56 | const compiled = fixture.debugElement.nativeElement; 57 | expect(compiled.querySelector('.title').textContent).toContain('Azure AD B2C'); 58 | }); 59 | }); 60 | -------------------------------------------------------------------------------- /frontend/angular9/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tslint:recommended", 3 | "rules": { 4 | "array-type": false, 5 | "arrow-parens": false, 6 | "deprecation": { 7 | "severity": "warning" 8 | }, 9 | "component-class-suffix": true, 10 | "contextual-lifecycle": true, 11 | "directive-class-suffix": true, 12 | "directive-selector": [ 13 | true, 14 | "attribute", 15 | "app", 16 | "camelCase" 17 | ], 18 | "component-selector": [ 19 | true, 20 | "element", 21 | "app", 22 | "kebab-case" 23 | ], 24 | "import-blacklist": [ 25 | true, 26 | "rxjs/Rx" 27 | ], 28 | "interface-name": false, 29 | "max-classes-per-file": false, 30 | "max-line-length": [ 31 | true, 32 | 140 33 | ], 34 | "member-access": false, 35 | "member-ordering": [ 36 | true, 37 | { 38 | "order": [ 39 | "static-field", 40 | "instance-field", 41 | "static-method", 42 | "instance-method" 43 | ] 44 | } 45 | ], 46 | "no-consecutive-blank-lines": false, 47 | "no-console": [ 48 | true, 49 | "debug", 50 | "info", 51 | "time", 52 | "timeEnd", 53 | "trace" 54 | ], 55 | "no-empty": false, 56 | "no-inferrable-types": [ 57 | true, 58 | "ignore-params" 59 | ], 60 | "no-non-null-assertion": true, 61 | "no-redundant-jsdoc": true, 62 | "no-switch-case-fall-through": true, 63 | "no-var-requires": false, 64 | "object-literal-key-quotes": [ 65 | true, 66 | "as-needed" 67 | ], 68 | "object-literal-sort-keys": false, 69 | "ordered-imports": false, 70 | "quotemark": [ 71 | true, 72 | "single" 73 | ], 74 | "trailing-comma": false, 75 | "no-conflicting-lifecycle": true, 76 | "no-host-metadata-property": true, 77 | "no-input-rename": true, 78 | "no-inputs-metadata-property": true, 79 | "no-output-native": true, 80 | "no-output-on-prefix": true, 81 | "no-output-rename": true, 82 | "no-outputs-metadata-property": true, 83 | "template-banana-in-box": true, 84 | "template-no-negated-async": true, 85 | "use-lifecycle-interface": true, 86 | "use-pipe-transform-interface": true 87 | }, 88 | "rulesDirectory": [ 89 | "codelyzer" 90 | ] 91 | } -------------------------------------------------------------------------------- /migration/src/main/java/com/vidolima/userimport/UserimportApplication.java: -------------------------------------------------------------------------------- 1 | package com.vidolima.userimport; 2 | 3 | import com.microsoft.graph.auth.confidentialClient.ClientCredentialProvider; 4 | import com.microsoft.graph.auth.enums.NationalCloud; 5 | import com.microsoft.graph.models.extensions.*; 6 | import com.microsoft.graph.requests.extensions.GraphServiceClient; 7 | import com.microsoft.graph.requests.extensions.IUserCollectionRequestBuilder; 8 | import org.springframework.boot.SpringApplication; 9 | import org.springframework.boot.autoconfigure.SpringBootApplication; 10 | 11 | import java.util.Arrays; 12 | import java.util.Collections; 13 | import java.util.List; 14 | 15 | @SpringBootApplication 16 | public class UserimportApplication { 17 | 18 | private final static String CLIENT_ID = ""; 19 | private final static List SCOPES = Arrays.asList( 20 | "https://graph.microsoft.com/.default" 21 | ); 22 | private final static String CLIENT_SECRET = ""; 23 | private final static String TENANT_GUID = ""; // got this id at Azure Portal > Azure Active Directory > Tenant properties 24 | private final static NationalCloud NATIONAL_CLOUD = null; 25 | 26 | public static void main(String[] args) { 27 | SpringApplication.run(UserimportApplication.class, args); 28 | run(); 29 | } 30 | 31 | public static void run() { 32 | ClientCredentialProvider authProvider = 33 | new ClientCredentialProvider(CLIENT_ID, SCOPES, CLIENT_SECRET, TENANT_GUID, NATIONAL_CLOUD); 34 | IGraphServiceClient graphClient = GraphServiceClient 35 | .builder() 36 | .authenticationProvider(authProvider) 37 | .buildClient(); 38 | 39 | IUserCollectionRequestBuilder usersRequest = graphClient.users(); 40 | usersRequest.buildRequest().post(getFakeUser()); 41 | } 42 | 43 | private static User getFakeUser() { 44 | User user = new User(); 45 | user.accountEnabled = true; 46 | user.displayName = "Marcos Vidolin"; 47 | user.givenName = "Marcos A. Vidolin de Lima"; 48 | user.userPrincipalName = "vidola@vidolin.onmicrosoft.com"; 49 | user.mail = "vidola@gmail.com"; 50 | user.mailNickname = "Vidolin"; 51 | user.surname = "vidola"; 52 | 53 | PasswordProfile pass = new PasswordProfile(); 54 | pass.forceChangePasswordNextSignIn = false; 55 | pass.forceChangePasswordNextSignInWithMfa = false; 56 | pass.password = "1234"; 57 | user.passwordProfile = pass; 58 | user.passwordPolicies = "DisablePasswordExpiration, DisableStrongPassword"; 59 | 60 | ObjectIdentity identity = new ObjectIdentity(); 61 | identity.issuer = "vidolin.onmicrosoft.com"; 62 | identity.signInType = "emailAddress"; // emailAddress, userName or federated 63 | identity.issuerAssignedId = "vidola@gmail.com"; 64 | 65 | user.identities = Collections.singletonList(identity); 66 | 67 | return user; 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /backend/nodejs-express/SECURITY.md: -------------------------------------------------------------------------------- 1 | ## Security 2 | 3 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 4 | 5 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) of a security vulnerability, please report it to us as described below. 6 | 7 | ## Reporting Security Issues 8 | 9 | **Please do not report security vulnerabilities through public GitHub issues.** 10 | 11 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). 12 | 13 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). 14 | 15 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 16 | 17 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 18 | 19 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 20 | * Full paths of source file(s) related to the manifestation of the issue 21 | * The location of the affected source code (tag/branch/commit or direct URL) 22 | * Any special configuration required to reproduce the issue 23 | * Step-by-step instructions to reproduce the issue 24 | * Proof-of-concept or exploit code (if possible) 25 | * Impact of the issue, including how an attacker might exploit the issue 26 | 27 | This information will help us triage your report more quickly. 28 | 29 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. 30 | 31 | ## Preferred Languages 32 | 33 | We prefer all communications to be in English. 34 | 35 | ## Policy 36 | 37 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). -------------------------------------------------------------------------------- /frontend/angular9/SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability](https://docs.microsoft.com/en-us/previous-versions/tn-archive/cc751383(v=technet.10)) of a security vulnerability, please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | * Full paths of source file(s) related to the manifestation of the issue 23 | * The location of the affected source code (tag/branch/commit or direct URL) 24 | * Any special configuration required to reproduce the issue 25 | * Step-by-step instructions to reproduce the issue 26 | * Proof-of-concept or exploit code (if possible) 27 | * Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). 40 | 41 | 42 | -------------------------------------------------------------------------------- /frontend/angular9/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/guide/browser-support 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 22 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 23 | 24 | /** 25 | * Web Animations `@angular/platform-browser/animations` 26 | * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. 27 | * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). 28 | */ 29 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 30 | 31 | /** 32 | * By default, zone.js will patch all possible macroTask and DomEvents 33 | * user can disable parts of macroTask/DomEvents patch by setting following flags 34 | * because those flags need to be set before `zone.js` being loaded, and webpack 35 | * will put import in the top of bundle, so user need to create a separate file 36 | * in this directory (for example: zone-flags.ts), and put the following flags 37 | * into that file, and then add the following code before importing zone.js. 38 | * import './zone-flags.ts'; 39 | * 40 | * The flags allowed in zone-flags.ts are listed here. 41 | * 42 | * The following flags will work for all browsers. 43 | * 44 | * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame 45 | * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick 46 | * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames 47 | * 48 | * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js 49 | * with the following flag, it will bypass `zone.js` patch for IE/Edge 50 | * 51 | * (window as any).__Zone_enable_cross_context_check = true; 52 | * 53 | */ 54 | 55 | /*************************************************************************************************** 56 | * Zone JS is required by default for Angular itself. 57 | */ 58 | import 'core-js'; 59 | import 'zone.js/dist/zone'; // Included with Angular CLI. 60 | 61 | /*************************************************************************************************** 62 | * APPLICATION IMPORTS 63 | */ 64 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { BroadcastService, MsalService} from '@azure/msal-angular'; 3 | import { Logger, CryptoUtils } from 'msal'; 4 | import { isIE, b2cPolicies } from './app-config'; 5 | 6 | @Component({ 7 | selector: 'app-root', 8 | templateUrl: './app.component.html', 9 | styleUrls: ['./app.component.css'] 10 | }) 11 | 12 | export class AppComponent implements OnInit { 13 | title = 'Azure AD B2C'; 14 | isIframe = false; 15 | loggedIn = false; 16 | 17 | constructor(private broadcastService: BroadcastService, private authService: MsalService) { } 18 | 19 | ngOnInit() { 20 | 21 | this.isIframe = window !== window.parent && !window.opener; 22 | this.checkAccount(); 23 | 24 | // event listeners for authentication status 25 | this.broadcastService.subscribe('msal:loginSuccess', (success) => { 26 | 27 | // We need to reject id tokens that were not issued with the default sign-in policy. 28 | // "acr" claim in the token tells us what policy is used (NOTE: for new policies (v2.0), use "tfp" instead of "acr") 29 | // To learn more about b2c tokens, visit https://docs.microsoft.com/en-us/azure/active-directory-b2c/tokens-overview 30 | // if (success.idToken.claims['acr'] !== b2cPolicies.names.signUpSignIn) { 31 | // window.alert("Password has been reset successfully. \nPlease sign-in with your new password"); 32 | // return this.authService.logout() 33 | // } 34 | 35 | console.log('login succeeded. id token acquired at: ' + new Date().toString()); 36 | console.log(success); 37 | 38 | this.checkAccount(); 39 | }); 40 | 41 | this.broadcastService.subscribe('msal:loginFailure', (error) => { 42 | console.log('login failed'); 43 | console.log(error); 44 | 45 | // Check for forgot password error 46 | // Learn more about AAD error codes at https://docs.microsoft.com/en-us/azure/active-directory/develop/reference-aadsts-error-codes 47 | if (error.errorMessage.indexOf('AADB2C90118') > -1) { 48 | if (isIE) { 49 | this.authService.loginRedirect(b2cPolicies.authorities.resetPassword); 50 | } else { 51 | this.authService.loginPopup(b2cPolicies.authorities.resetPassword); 52 | } 53 | } 54 | }); 55 | 56 | // redirect callback for redirect flow (IE) 57 | this.authService.handleRedirectCallback((authError, response) => { 58 | if (authError) { 59 | console.error('Redirect Error: ', authError.errorMessage); 60 | return; 61 | } 62 | 63 | console.log('Redirect Success: ', response); 64 | }); 65 | 66 | this.authService.setLogger(new Logger((logLevel, message, piiEnabled) => { 67 | console.log('MSAL Logging: ', message); 68 | }, { 69 | correlationId: CryptoUtils.createNewGuid(), 70 | piiLoggingEnabled: false 71 | })); 72 | } 73 | 74 | // other methods 75 | checkAccount() { 76 | this.loggedIn = !!this.authService.getAccount(); 77 | } 78 | 79 | login() { 80 | if (isIE) { 81 | this.authService.loginRedirect(); 82 | } else { 83 | this.authService.loginPopup(); 84 | } 85 | } 86 | 87 | logout() { 88 | this.authService.logout(); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /migration/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto init 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto init 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :init 68 | @rem Get command-line arguments, handling Windows variants 69 | 70 | if not "%OS%" == "Windows_NT" goto win9xME_args 71 | 72 | :win9xME_args 73 | @rem Slurp the command line arguments. 74 | set CMD_LINE_ARGS= 75 | set _SKIP=2 76 | 77 | :win9xME_args_slurp 78 | if "x%~1" == "x" goto execute 79 | 80 | set CMD_LINE_ARGS=%* 81 | 82 | :execute 83 | @rem Setup the command line 84 | 85 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 86 | 87 | 88 | @rem Execute Gradle 89 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 90 | 91 | :end 92 | @rem End local scope for the variables with windows NT shell 93 | if "%ERRORLEVEL%"=="0" goto mainEnd 94 | 95 | :fail 96 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 97 | rem the _cmd.exe /c_ return code! 98 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 99 | exit /b 1 100 | 101 | :mainEnd 102 | if "%OS%"=="Windows_NT" endlocal 103 | 104 | :omega 105 | -------------------------------------------------------------------------------- /backend/java-spring-boot/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto init 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto init 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :init 68 | @rem Get command-line arguments, handling Windows variants 69 | 70 | if not "%OS%" == "Windows_NT" goto win9xME_args 71 | 72 | :win9xME_args 73 | @rem Slurp the command line arguments. 74 | set CMD_LINE_ARGS= 75 | set _SKIP=2 76 | 77 | :win9xME_args_slurp 78 | if "x%~1" == "x" goto execute 79 | 80 | set CMD_LINE_ARGS=%* 81 | 82 | :execute 83 | @rem Setup the command line 84 | 85 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 86 | 87 | 88 | @rem Execute Gradle 89 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 90 | 91 | :end 92 | @rem End local scope for the variables with windows NT shell 93 | if "%ERRORLEVEL%"=="0" goto mainEnd 94 | 95 | :fail 96 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 97 | rem the _cmd.exe /c_ return code! 98 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 99 | exit /b 1 100 | 101 | :mainEnd 102 | if "%OS%"=="Windows_NT" endlocal 103 | 104 | :omega 105 | -------------------------------------------------------------------------------- /frontend/angular9/angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "active-directory-b2c-javascript-angular-spa": { 7 | "projectType": "application", 8 | "schematics": {}, 9 | "root": "", 10 | "sourceRoot": "src", 11 | "prefix": "app", 12 | "architect": { 13 | "build": { 14 | "builder": "@angular-devkit/build-angular:browser", 15 | "options": { 16 | "outputPath": "dist/active-directory-b2c-javascript-angular-spa", 17 | "index": "src/index.html", 18 | "main": "src/main.ts", 19 | "polyfills": "src/polyfills.ts", 20 | "tsConfig": "tsconfig.app.json", 21 | "aot": true, 22 | "assets": [ 23 | "src/favicon.ico", 24 | "src/assets" 25 | ], 26 | "styles": [ 27 | "src/styles.css" 28 | ], 29 | "scripts": [] 30 | }, 31 | "configurations": { 32 | "production": { 33 | "fileReplacements": [ 34 | { 35 | "replace": "src/environments/environment.ts", 36 | "with": "src/environments/environment.prod.ts" 37 | } 38 | ], 39 | "optimization": true, 40 | "outputHashing": "all", 41 | "sourceMap": false, 42 | "extractCss": true, 43 | "namedChunks": false, 44 | "extractLicenses": true, 45 | "vendorChunk": false, 46 | "buildOptimizer": true, 47 | "budgets": [ 48 | { 49 | "type": "initial", 50 | "maximumWarning": "2mb", 51 | "maximumError": "5mb" 52 | }, 53 | { 54 | "type": "anyComponentStyle", 55 | "maximumWarning": "6kb", 56 | "maximumError": "10kb" 57 | } 58 | ] 59 | } 60 | } 61 | }, 62 | "serve": { 63 | "builder": "@angular-devkit/build-angular:dev-server", 64 | "options": { 65 | "port": 8080, 66 | "browserTarget": "active-directory-b2c-javascript-angular-spa:build" 67 | }, 68 | "configurations": { 69 | "production": { 70 | "browserTarget": "active-directory-b2c-javascript-angular-spa:build:production" 71 | } 72 | } 73 | }, 74 | "extract-i18n": { 75 | "builder": "@angular-devkit/build-angular:extract-i18n", 76 | "options": { 77 | "browserTarget": "active-directory-b2c-javascript-angular-spa:build" 78 | } 79 | }, 80 | "test": { 81 | "builder": "@angular-devkit/build-angular:karma", 82 | "options": { 83 | "main": "src/test.ts", 84 | "polyfills": "src/polyfills.ts", 85 | "tsConfig": "tsconfig.spec.json", 86 | "karmaConfig": "karma.conf.js", 87 | "assets": [ 88 | "src/favicon.ico", 89 | "src/assets" 90 | ], 91 | "styles": [ 92 | "src/styles.css" 93 | ], 94 | "scripts": [] 95 | } 96 | }, 97 | "lint": { 98 | "builder": "@angular-devkit/build-angular:tslint", 99 | "options": { 100 | "tsConfig": [ 101 | "tsconfig.app.json", 102 | "tsconfig.spec.json", 103 | "e2e/tsconfig.json" 104 | ], 105 | "exclude": [ 106 | "**/node_modules/**" 107 | ] 108 | } 109 | }, 110 | "e2e": { 111 | "builder": "@angular-devkit/build-angular:protractor", 112 | "options": { 113 | "protractorConfig": "e2e/protractor.conf.js", 114 | "devServerTarget": "active-directory-b2c-javascript-angular-spa:serve" 115 | }, 116 | "configurations": { 117 | "production": { 118 | "devServerTarget": "active-directory-b2c-javascript-angular-spa:serve:production" 119 | } 120 | } 121 | } 122 | } 123 | }}, 124 | "defaultProject": "active-directory-b2c-javascript-angular-spa" 125 | } 126 | -------------------------------------------------------------------------------- /frontend/angular9/src/app/app-config.ts: -------------------------------------------------------------------------------- 1 | import { Configuration } from 'msal'; 2 | import { MsalAngularConfiguration } from '@azure/msal-angular'; 3 | 4 | // this checks if the app is running on IE 5 | export const isIE = window.navigator.userAgent.indexOf('MSIE ') > -1 || window.navigator.userAgent.indexOf('Trident/') > -1; 6 | 7 | /** =================== REGIONS ==================== 8 | * 1) B2C policies and user flows 9 | * 2) Web API configuration parameters 10 | * 3) Authentication configuration parameters 11 | * 4) MSAL-Angular specific configuration parameters 12 | * ================================================= 13 | */ 14 | 15 | // #region 1) B2C policies and user flows 16 | /** 17 | * Enter here the user flows and custom policies for your B2C application, 18 | * To learn more about user flows, visit https://docs.microsoft.com/en-us/azure/active-directory-b2c/user-flow-overview 19 | * To learn more about custom policies, visit https://docs.microsoft.com/en-us/azure/active-directory-b2c/custom-policy-overview 20 | */ 21 | export const b2cPolicies = { 22 | names: { 23 | signUpSignIn: "B2C_1_SignIn_v2", 24 | resetPassword: "B2C_1_PasswordReset_v2", 25 | }, 26 | authorities: { 27 | signUpSignIn: { 28 | authority: "https://vidolin.b2clogin.com/vidolin.onmicrosoft.com/B2C_1_SignIn_v2" 29 | }, 30 | resetPassword: { 31 | authority: "https://vidolin.b2clogin.com/vidolin.onmicrosoft.com/B2C_1_PasswordReset_v2" 32 | } 33 | } 34 | } 35 | // #endregion 36 | 37 | 38 | // #region 2) Web API Configuration 39 | /** 40 | * Enter here the coordinates of your Web API and scopes for access token request 41 | * The current application coordinates were pre-registered in a B2C tenant. 42 | */ 43 | export const apiConfig: {b2cScopes: string[], webApi: string} = { 44 | b2cScopes: [ 45 | 'https://vidolin.onmicrosoft.com/api/b2cdemo.read', 46 | 'https://vidolin.onmicrosoft.com/api/b2cdemo.read' 47 | ], 48 | webApi: 'http://localhost:9000/profile' //'https://vidolin.onmicrosoft.com/api' 49 | }; 50 | // #endregion 51 | 52 | 53 | 54 | // #region 3) Authentication Configuration 55 | /** 56 | * Config object to be passed to Msal on creation. For a full list of msal.js configuration parameters, 57 | * visit https://azuread.github.io/microsoft-authentication-library-for-js/docs/msal/modules/_configuration_.html 58 | */ 59 | export const msalConfig: Configuration = { 60 | auth: { 61 | clientId: "b9edd9fe-ce2f-4969-aebf-b525c4eb7cb5", 62 | authority: b2cPolicies.authorities.signUpSignIn.authority, 63 | redirectUri: "http://localhost:8080/", 64 | postLogoutRedirectUri: "http://localhost:8080/", 65 | navigateToLoginRequestUrl: true, 66 | validateAuthority: false, 67 | }, 68 | cache: { 69 | cacheLocation: "localStorage", 70 | storeAuthStateInCookie: isIE, // Set this to "true" to save cache in cookies to address trusted zones limitations in IE 71 | }, 72 | } 73 | 74 | /** 75 | * Scopes you enter here will be consented once you authenticate. For a full list of available authentication parameters, 76 | * visit https://azuread.github.io/microsoft-authentication-library-for-js/docs/msal/modules/_authenticationparameters_.html 77 | */ 78 | export const loginRequest: {scopes: string[]} = { 79 | scopes: ['openid', 'profile'], 80 | }; 81 | 82 | // Scopes you enter will be used for the access token request for your web API 83 | export const tokenRequest: {scopes: string[]} = { 84 | scopes: apiConfig.b2cScopes // i.e. [https://fabrikamb2c.onmicrosoft.com/helloapi/demo.read] 85 | }; 86 | // #endregion 87 | 88 | 89 | 90 | // #region 4) MSAL-Angular Configuration 91 | // here you can define the coordinates and required permissions for your protected resources 92 | export const protectedResourceMap: [string, string[]][] = [ 93 | [apiConfig.webApi, apiConfig.b2cScopes] 94 | ]; 95 | 96 | /** 97 | * MSAL-Angular specific authentication parameters. For a full list of available options, 98 | * visit https://github.com/AzureAD/microsoft-authentication-library-for-js/tree/dev/lib/msal-angular#config-options-for-msal-initialization 99 | */ 100 | export const msalAngularConfig: MsalAngularConfiguration = { 101 | popUp: !isIE, 102 | consentScopes: [ 103 | ...loginRequest.scopes, 104 | ...tokenRequest.scopes, 105 | ], 106 | unprotectedResources: [], // API calls to these coordinates will NOT activate MSALGuard 107 | protectedResourceMap, // API calls to these coordinates will activate MSALGuard 108 | extraQueryParameters: {} 109 | } 110 | // #endregion 111 | -------------------------------------------------------------------------------- /backend/nodejs-express/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | 3 | page_type: sample 4 | languages: 5 | - javascript 6 | - node.js 7 | products: 8 | - microsoft-identity-platform 9 | - azure-active-directory-b2c 10 | description: "A sample demonstrating how to protect a Node.js web API with Azure AD B2C using the Passport.js library." 11 | urlFragment: "active-directory-b2c-javascript-nodejs-webapi" 12 | --- 13 | 14 | # Node.js Web API with Azure AD B2C 15 | 16 | This sample demonstrates how to protect a Node.js web API with Azure AD B2C using the Passport.js library. The code here is pre-configured with a registered client ID. If you register your own app, replace the client ID. 17 | 18 | To see how to call this web API from a client application, refer to this [B2C Single Page Application sample](https://github.com/Azure-Samples/active-directory-b2c-javascript-msal-singlepageapp). 19 | 20 | ## Contents 21 | 22 | | File/folder | Description | 23 | |:---------------------|:----------------------------------------------------------| 24 | | `.gitignore` | Defines what to ignore at commit time. | 25 | | `CHANGELOG.md` | List of changes to the sample. | 26 | | `CODE_OF_CONDUCT.md` | Code of Conduct information. | 27 | | `config.js` | Contains configuration parameters for the sample. | 28 | | `CONTRIBUTING.md` | Guidelines for contributing to the sample. | 29 | | `index.js` | Main application logic resides here. | 30 | | `LICENSE` | The license for the sample. | 31 | | `package.json` | Package manifest for npm. | 32 | | `process.json` | Contains configuration parameters for logging via Morgan. | 33 | | `README.md` | This README file. | 34 | | `SECURITY.md` | Security disclosures. | 35 | 36 | ## Steps to run 37 | 38 | 1. Clone this repository. 39 | 40 | ```console 41 | git clone https://github.com/Azure-Samples/active-directory-b2c-javascript-nodejs-webapi.git 42 | ``` 43 | 44 | 2. Install [Node.js](https://nodejs.org/en/download/) if you don't already have it. 45 | 46 | 3. Install the Node dependencies: 47 | 48 | ```console 49 | npm install && npm update 50 | ``` 51 | 52 | 4. Run the Web API. By default, it runs on `http://localhost:5000` 53 | 54 | ```console 55 | npm start 56 | ``` 57 | 58 | ## Using your own Azure AD B2C tenant 59 | 60 | To have a proper understanding of Azure AD B2C as a developer, follow the tutorials in the official [Azure AD B2C documentation](https://docs.microsoft.com/azure/active-directory-b2c/). In the rest of this guide, we summarize the steps you need to go through. 61 | 62 | ### Step 1: Get your own Azure AD B2C tenant 63 | 64 | You first need an Azure AD B2C tenant. If you don't already have one you can use for testing purposes, create your own by following the steps in [Tutorial: Create an Azure Active Directory B2C tenant](https://docs.microsoft.com/azure/active-directory-b2c/tutorial-create-tenant). 65 | 66 | ### Step 2: Create your own policies 67 | 68 | This sample uses a unified sign-up/sign-in policy. You can create [your own unified sign-up/sign-in policy](https://docs.microsoft.com/azure/active-directory-b2c/tutorial-create-user-flows). You may choose to include as many or as few identity providers as you wish. 69 | 70 | If you already have existing policies in your Azure AD B2C tenant, feel free to reuse those policies in this sample. 71 | 72 | #### Step 3: Register your own web API with Azure AD B2C 73 | 74 | Follow the steps in [Protect and grant access to a Node.js web API](https://docs.microsoft.com/azure/active-directory-b2c/tutorial-single-page-app-webapi) to register the web API application in your tenant, define scopes, and grant a web application access to the API. By following the steps in the tutorial, you define the scopes that your single-page application will request access tokens for. 75 | 76 | #### Step 4: Configure your application source code 77 | 78 | You can now fill in the variables in the *config.js* file of the Node.js web API sample with the parameters you've obtained from the Azure portal by following the steps above. 79 | 80 | Configure the following variables: 81 | 82 | ```javascript 83 | const clientID = "" 84 | const b2cDomainHost = ""; 85 | const tenantId = ""; 86 | const policyName = ""; 87 | ``` 88 | 89 | > **NOTE** 90 | > 91 | > Developers using the [Azure China](https://docs.microsoft.com/azure/active-directory/develop/authentication-national-cloud) environment MUST use `.b2clogin.cn` authority instead of `login.chinacloudapi.cn`. 92 | > 93 | > To use `.b2clogin.*`, you need set `validateIssuer: false`. Learn more about using [b2clogin.com](https://docs.microsoft.com/azure/active-directory-b2c/b2clogin). 94 | 95 | ### Step 5: Run the application 96 | 97 | Lastly, to run your Node.js Web API, execute the following commands in your shell or terminal: 98 | 99 | ```bash 100 | npm install && npm update 101 | npm start 102 | ``` 103 | 104 | Your Node.js web API is now running on port 5000. 105 | 106 | ## Questions & issues 107 | 108 | Please file any questions or problems with the sample as a GitHub issue. You can also post on Stack Overflow with the tag `azure-ad-b2c`. 109 | 110 | ## Contributing 111 | 112 | If you'd like to contribute to this sample, see [CONTRIBUTING.md](./CONTRIBUTING.md). 113 | 114 | ## Code of conduct 115 | 116 | For details, see [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md). 117 | -------------------------------------------------------------------------------- /migration/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /backend/java-spring-boot/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | 86 | # Determine the Java command to use to start the JVM. 87 | if [ -n "$JAVA_HOME" ] ; then 88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 89 | # IBM's JDK on AIX uses strange locations for the executables 90 | JAVACMD="$JAVA_HOME/jre/sh/java" 91 | else 92 | JAVACMD="$JAVA_HOME/bin/java" 93 | fi 94 | if [ ! -x "$JAVACMD" ] ; then 95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 96 | 97 | Please set the JAVA_HOME variable in your environment to match the 98 | location of your Java installation." 99 | fi 100 | else 101 | JAVACMD="java" 102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 103 | 104 | Please set the JAVA_HOME variable in your environment to match the 105 | location of your Java installation." 106 | fi 107 | 108 | # Increase the maximum file descriptors if we can. 109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 110 | MAX_FD_LIMIT=`ulimit -H -n` 111 | if [ $? -eq 0 ] ; then 112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 113 | MAX_FD="$MAX_FD_LIMIT" 114 | fi 115 | ulimit -n $MAX_FD 116 | if [ $? -ne 0 ] ; then 117 | warn "Could not set maximum file descriptor limit: $MAX_FD" 118 | fi 119 | else 120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 121 | fi 122 | fi 123 | 124 | # For Darwin, add options to specify how the application appears in the dock 125 | if $darwin; then 126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 127 | fi 128 | 129 | # For Cygwin or MSYS, switch paths to Windows format before running java 130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 133 | 134 | JAVACMD=`cygpath --unix "$JAVACMD"` 135 | 136 | # We build the pattern for arguments to be converted via cygpath 137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 138 | SEP="" 139 | for dir in $ROOTDIRSRAW ; do 140 | ROOTDIRS="$ROOTDIRS$SEP$dir" 141 | SEP="|" 142 | done 143 | OURCYGPATTERN="(^($ROOTDIRS))" 144 | # Add a user-defined pattern to the cygpath arguments 145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 147 | fi 148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 149 | i=0 150 | for arg in "$@" ; do 151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 153 | 154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 156 | else 157 | eval `echo args$i`="\"$arg\"" 158 | fi 159 | i=`expr $i + 1` 160 | done 161 | case $i in 162 | 0) set -- ;; 163 | 1) set -- "$args0" ;; 164 | 2) set -- "$args0" "$args1" ;; 165 | 3) set -- "$args0" "$args1" "$args2" ;; 166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 172 | esac 173 | fi 174 | 175 | # Escape application args 176 | save () { 177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 178 | echo " " 179 | } 180 | APP_ARGS=`save "$@"` 181 | 182 | # Collect all arguments for the java command, following the shell quoting and substitution rules 183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 184 | 185 | exec "$JAVACMD" "$@" 186 | -------------------------------------------------------------------------------- /frontend/angular9/README.md: -------------------------------------------------------------------------------- 1 | --- 2 | page_type: sample 3 | languages: 4 | - javascript 5 | - typescript 6 | - angular 7 | products: 8 | - azure-active-directory-b2c 9 | description: "An Azure AD B2C single-page application calling a web api using MSAL-Angular for authentication." 10 | urlFragment: "active-directory-b2c-javascript-angular-spa" 11 | --- 12 | 13 | 14 | # Single-Page Application built on MSAL.js with Azure AD B2C 15 | 16 | > **Warning**: Silent renewing of access tokens is not supported by all social identity providers. 17 | 18 | This sample demonstrates how to use the [Microsoft Authentication Library for JavaScript (msal.js)](https://github.com/AzureAD/microsoft-authentication-library-for-js) to get an access token and call an API secured by Azure AD B2C. 19 | 20 | ## Contents 21 | 22 | | File/folder | Description | 23 | |-------------------|--------------------------------------------| 24 | | `e2e` | End-to-end test files. | 25 | | `src` | Sample source code. | 26 | | `src/app/app-config.ts` | Contains authentication and authorization configuration parameters. | 27 | | `.editorconfig` | Defines editor config settings. | 28 | | `.gitignore` | Define what to ignore at commit time. | 29 | | `angular.json` | Angular configuration file. | 30 | | `browserslist` | BrowsersList configuration file. | 31 | | `CHANGELOG.md` | List of changes to the sample. | 32 | | `CODE_OF_CONDUCT.md` | Code of Conduct information. | 33 | | `CONTRIBUTING.md` | Guidelines for contributing to the sample. | 34 | | `karma.conf.js` | Configuration for the karma test runner. | 35 | | `LICENSE` | The license for the sample. | 36 | | `NG_README.md` | README auto-generated by the Angular CLI. | 37 | | `package-lock.json` | Lockfile for npm. | 38 | | `package.json` | Package manifest for npm. | 39 | | `README.md` | This README file. | 40 | | `SECURITY.md` | Security disclosures. | 41 | | `tsconfig.*.json` | TypeScript configuration files. | 42 | | `tslint.json` | TS Lint configuration files. | 43 | 44 | ## How to run this sample 45 | 46 | There are two ways to run this sample: 47 | 48 | 1. **Using the demo environment** - The sample is already configured to use a demo environment and can be run simply by downloading this repository and running the app on your machine. See steps below for Running with demo environment. 49 | 2. **Using your own Azure AD B2C tenant** - If you would like to use your own Azure AD B2C configuration, follow the steps listed below for *using your own Azure AD B2C tenant*. 50 | 51 | ## Using the demo environment 52 | 53 | This sample demonstrates how to sign in or sign up for an account at "Fabrikam B2C" - the demo environment for this sample. Once signed-in, clicking on the **Call Web API** button shows the display name you used when you created your account. 54 | 55 | ### Step 1: Clone or download this repository 56 | 57 | From your shell or command line: 58 | 59 | ```bash 60 | git clone https://github.com/Azure-Samples/active-directory-b2c-javascript-angular-spa.git 61 | ``` 62 | 63 | ### Step 2: Run the application 64 | 65 | Make sure you've [installed Node](https://nodejs.org/en/download/). 66 | 67 | From your shell or command line: 68 | 69 | ```bash 70 | cd active-directory-b2c-javascript-angular-spa 71 | npm install && npm update 72 | npm start 73 | ``` 74 | 75 | The console window shows the port number for the web application 76 | 77 | ```bash 78 | Listening on port 8080... 79 | ``` 80 | 81 | You can visit `http://localhost:8080` and perform the following actions: 82 | 83 | 1. Click the **Login** button to start the Azure AD B2C sign in or sign up workflow. 84 | 2. Once signed in, you can click the **Call Web API** button to have your display name returned from the Web API call as a JSON object. 85 | 3. Click **Logout** to logout from the application. 86 | 87 | ## Using your own Azure AD B2C Tenant 88 | 89 | In the previous section, you learned how to run the sample application using the demo environment. In this section, you'll learn how to configure this single page application sample and the related [Node.js Web API with Azure AD B2C sample](https://github.com/Azure-Samples/active-directory-b2c-javascript-nodejs-webapi) to work with your own Azure AD B2C Tenant. This will be covered in two parts. 90 | 91 | ### PART I: Configure the API 92 | 93 | #### How to setup and register the Node.js Web API sample 94 | 95 | Follow the instructions on the [Node.js Web API with Azure AD B2C sample](https://github.com/Azure-Samples/active-directory-b2c-javascript-nodejs-webapi). Once you are done, you should have a Node.js web API running on the port 5000. While it runs, continue with **Part II** below. 96 | 97 | ### PART II: Configure the Client 98 | 99 | #### Step 1: Register your own Web Application with Azure AD B2C 100 | 101 | Next, you need to [register your single page application in your B2C tenant](https://docs.microsoft.com/azure/active-directory-b2c/active-directory-b2c-app-registration#register-a-web-application). 102 | 103 | Provide the following values for the Single Page Application registration: 104 | 105 | - Provide a descriptive Name for the single page application, for example, `My Test SPA`. You will identify this application by its Name whenever working in the Azure portal. 106 | - Mark **Yes** for the **Web App/Web API** setting for your application. 107 | - Set the **Reply URL** for your app, for example `http://localhost:8080`. The sample provided in this repository is configured to run on port 8080. 108 | - Create the application. 109 | - Once the application is created, open your `My Test SPA` and open the **API Access** window (in the left nav menu). Click **Add** and select the name of the Node.js Web API you registered previously, `My Test Node.js Web API`. Select the scope(s) you defined previously, for example, `demo.read` and hit **Save**. 110 | 111 | #### Step 2: Configure the sample code to use your Azure AD B2C tenant 112 | 113 | Now in the sample code, you can replace the single page application's demo environment configuration with your own tenant. 114 | 115 | 1. Open the `src/app/app-config.ts` file. 116 | 2. Find the assignment for `clientId` and replace the value with the Application ID for the single page application you registered earlier, for example the Application ID found in `My Test SPA` application in the Azure portal. 117 | 3. Find the assignment for `authority` and replacing `b2c_1_susi` with the name of the policy you created in Step 2, and `fabrikamb2c.onmicrosoft.com` by the name of your Azure AD B2C tenant, for example `https://.b2clogin.com/.onmicrosoft.com/` 118 | 4. Find the assignment for `redirectUri` replacing the URL with redirect uri you that you assigned on Azure Portal>Authentication. 119 | 5. Find the assignment for the scopes `b2cScopes` replacing the URL with the scope URL you created for the Web API, e.g. `b2cScopes: ["https://.onmicrosoft.com/helloapi/demo.read"]` 120 | 6. Find the assignment for API URL `webApi` replacing the current URL with the URL where you deployed your Web API, e.g. `webApi: "http://localhost:5000/hello"` 121 | 122 | Your resulting code should look as follows: 123 | 124 | ```TypeScript 125 | const apiConfig = { 126 | b2cScopes: ["https://fabrikamb2c.onmicrosoft.com/helloapi/demo.read"], 127 | webApi: "http://localhost:5000/hello" 128 | }; 129 | 130 | ``` 131 | 132 | ```TypeScript 133 | const msalConfig = { 134 | auth: { 135 | clientId: "e760cab2-b9a1-4c0d-86fb-ff7084abd902", 136 | authority: "https://fabrikamb2c.b2clogin.com/fabrikamb2c.onmicrosoft.com/b2c_1_susi", 137 | validateAuthority: false, 138 | redirectUri: "http://localhost:8080/", 139 | }, 140 | cache: { 141 | cacheLocation: "localStorage", 142 | storeAuthStateInCookie: true 143 | } 144 | }; 145 | 146 | const loginRequest = { 147 | scopes: ["openid", "profile"], 148 | }; 149 | 150 | const tokenRequest = { 151 | scopes: ["https://fabrikamb2c.onmicrosoft.com/helloapi/demo.read"] 152 | }; 153 | ``` 154 | 155 | #### Step 3: Run the sample 156 | 157 | 1. Install the node dependencies if this is your first time running the app (e.g. if you skipped running in the demo environment): 158 | 159 | ```bash 160 | cd active-directory-b2c-javascript-angular-spa 161 | npm install && npm update 162 | ``` 163 | 164 | 2. Run the Web application: 165 | 166 | ```bash 167 | npm start 168 | ``` 169 | 170 | 3. Go to `http://localhost:8080`. 171 | 4. Click the **login** button at the top of the application screen. The sample works exactly in the same way regardless of the account type you choose, apart from some visual differences in the authentication and consent experience. Upon successful sign in, the application screen will show buttons that allow you to call an API and sign out. 172 | 5. Click on the **Call Web API** and see the textual representation of the JSON object that is returned. Make sure your Node.js Web API sample is still running on port 5000. 173 | 6. Sign out by clicking the **Logout** button. 174 | 175 | ## Optional 176 | 177 | - [Configure application to use b2clogin.com](https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-b2c-overview#configure-application-to-use-b2clogincom) 178 | - The MSAL.js library allows you to pass [login_hint parameter](https://docs.microsoft.com/en-us/azure/active-directory-b2c/direct-signin) in the [AuthenticationParameters object](https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL.js-1.0.0-api-release#signing-in-and-getting-tokens-with-msaljs), using `loginHint` attribute. 179 | 180 | ```TypeScript 181 | const loginRequest = { 182 | scopes: ["openid", "profile"], 183 | loginHint: "someone@contoso.com" 184 | }; 185 | ``` 186 | 187 | - You can pass any custom query string parameter in the [AuthenticationParameters object](https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki/MSAL.js-1.0.0-api-release#signing-in-and-getting-tokens-with-msaljs), using `extraQueryParameters` attribute. Following sample sets the campaignId that can be used in the [Azure AD B2C UI](https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-ui-customization-custom-dynamic), and the [ui_locales](https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-reference-language-customization) set to es (Spanish). 188 | 189 | ```TypeScript 190 | const loginRequest = { 191 | scopes: ["openid", "profile"], 192 | extraQueryParameters: { campaignId: 'hawaii', ui_locales: 'es' } 193 | }; 194 | ``` 195 | 196 | ## More information 197 | 198 | For more information on Azure B2C, see: 199 | 200 | - [Azure AD B2C documentation homepage](http://aka.ms/aadb2c) 201 | - [Microsoft authentication library for js Wiki](https://github.com/AzureAD/microsoft-authentication-library-for-js/wiki) 202 | - [Integrate Microsoft Authentication Library (MSAL) with Azure Active Directory B2C](https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-b2c-overview) 203 | 204 | ## Community Help and Support 205 | 206 | We use Stack Overflow with the [msal](https://stackoverflow.com/questions/tagged/msal) and [azure-ad-b2c](https://stackoverflow.com/questions/tagged/azure-ad-b2c) tags to provide support. We highly recommend you ask your questions on Stack Overflow first and browse existing issues to see if someone has asked your question before. Make sure that your questions or comments are tagged with [msal.js]. 207 | 208 | If you find and bug or have a feature request, please raise the issue on [GitHub Issues](../../issues). 209 | 210 | To provide a recommendation, visit our [Feedback Forum](http://aka.ms/aadb2cuv). 211 | 212 | ## Contributing 213 | 214 | If you'd like to contribute to this sample, see [CONTRIBUTING.MD](/CONTRIBUTING.md). 215 | 216 | This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. 217 | -------------------------------------------------------------------------------- /backend/nodejs-express/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sindresorhus/is@^0.14.0": 6 | version "0.14.0" 7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" 8 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== 9 | 10 | "@szmarczak/http-timer@^1.1.2": 11 | version "1.1.2" 12 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" 13 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== 14 | dependencies: 15 | defer-to-connect "^1.0.1" 16 | 17 | "@types/color-name@^1.1.1": 18 | version "1.1.1" 19 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 20 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 21 | 22 | abbrev@1: 23 | version "1.1.1" 24 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 25 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 26 | 27 | accepts@~1.3.7: 28 | version "1.3.7" 29 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 30 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 31 | dependencies: 32 | mime-types "~2.1.24" 33 | negotiator "0.6.2" 34 | 35 | ajv@^6.5.5: 36 | version "6.12.2" 37 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" 38 | integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== 39 | dependencies: 40 | fast-deep-equal "^3.1.1" 41 | fast-json-stable-stringify "^2.0.0" 42 | json-schema-traverse "^0.4.1" 43 | uri-js "^4.2.2" 44 | 45 | ansi-align@^3.0.0: 46 | version "3.0.0" 47 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" 48 | integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== 49 | dependencies: 50 | string-width "^3.0.0" 51 | 52 | ansi-regex@^4.1.0: 53 | version "4.1.0" 54 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 55 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 56 | 57 | ansi-regex@^5.0.0: 58 | version "5.0.0" 59 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 60 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 61 | 62 | ansi-styles@^4.1.0: 63 | version "4.2.1" 64 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 65 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 66 | dependencies: 67 | "@types/color-name" "^1.1.1" 68 | color-convert "^2.0.1" 69 | 70 | anymatch@~3.1.1: 71 | version "3.1.1" 72 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 73 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== 74 | dependencies: 75 | normalize-path "^3.0.0" 76 | picomatch "^2.0.4" 77 | 78 | array-flatten@1.1.1: 79 | version "1.1.1" 80 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 81 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 82 | 83 | asn1.js@^4.5.2: 84 | version "4.10.1" 85 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" 86 | integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== 87 | dependencies: 88 | bn.js "^4.0.0" 89 | inherits "^2.0.1" 90 | minimalistic-assert "^1.0.0" 91 | 92 | asn1@~0.2.3: 93 | version "0.2.4" 94 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 95 | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== 96 | dependencies: 97 | safer-buffer "~2.1.0" 98 | 99 | assert-plus@1.0.0, assert-plus@^1.0.0: 100 | version "1.0.0" 101 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 102 | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= 103 | 104 | async@1.5.2, async@^1.5.2: 105 | version "1.5.2" 106 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 107 | integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= 108 | 109 | asynckit@^0.4.0: 110 | version "0.4.0" 111 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 112 | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= 113 | 114 | aws-sign2@~0.7.0: 115 | version "0.7.0" 116 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 117 | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= 118 | 119 | aws4@^1.8.0: 120 | version "1.10.0" 121 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2" 122 | integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA== 123 | 124 | balanced-match@^1.0.0: 125 | version "1.0.0" 126 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 127 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 128 | 129 | base64url@^3.0.0: 130 | version "3.0.1" 131 | resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" 132 | integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== 133 | 134 | basic-auth@~2.0.1: 135 | version "2.0.1" 136 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 137 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 138 | dependencies: 139 | safe-buffer "5.1.2" 140 | 141 | bcrypt-pbkdf@^1.0.0: 142 | version "1.0.2" 143 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" 144 | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= 145 | dependencies: 146 | tweetnacl "^0.14.3" 147 | 148 | binary-extensions@^2.0.0: 149 | version "2.0.0" 150 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 151 | integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== 152 | 153 | bn.js@^4.0.0, bn.js@^4.4.0: 154 | version "4.11.9" 155 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" 156 | integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== 157 | 158 | body-parser@1.19.0: 159 | version "1.19.0" 160 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" 161 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== 162 | dependencies: 163 | bytes "3.1.0" 164 | content-type "~1.0.4" 165 | debug "2.6.9" 166 | depd "~1.1.2" 167 | http-errors "1.7.2" 168 | iconv-lite "0.4.24" 169 | on-finished "~2.3.0" 170 | qs "6.7.0" 171 | raw-body "2.4.0" 172 | type-is "~1.6.17" 173 | 174 | boxen@^4.2.0: 175 | version "4.2.0" 176 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" 177 | integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== 178 | dependencies: 179 | ansi-align "^3.0.0" 180 | camelcase "^5.3.1" 181 | chalk "^3.0.0" 182 | cli-boxes "^2.2.0" 183 | string-width "^4.1.0" 184 | term-size "^2.1.0" 185 | type-fest "^0.8.1" 186 | widest-line "^3.1.0" 187 | 188 | brace-expansion@^1.1.7: 189 | version "1.1.11" 190 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 191 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 192 | dependencies: 193 | balanced-match "^1.0.0" 194 | concat-map "0.0.1" 195 | 196 | braces@~3.0.2: 197 | version "3.0.2" 198 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 199 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 200 | dependencies: 201 | fill-range "^7.0.1" 202 | 203 | brorand@^1.0.1: 204 | version "1.1.0" 205 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 206 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 207 | 208 | buffer-equal-constant-time@1.0.1: 209 | version "1.0.1" 210 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 211 | integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= 212 | 213 | bunyan@^1.8.0: 214 | version "1.8.12" 215 | resolved "https://registry.yarnpkg.com/bunyan/-/bunyan-1.8.12.tgz#f150f0f6748abdd72aeae84f04403be2ef113797" 216 | integrity sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c= 217 | optionalDependencies: 218 | dtrace-provider "~0.8" 219 | moment "^2.10.6" 220 | mv "~2" 221 | safe-json-stringify "~1" 222 | 223 | bytes@3.1.0: 224 | version "3.1.0" 225 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" 226 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== 227 | 228 | cache-manager@^2.0.0: 229 | version "2.11.1" 230 | resolved "https://registry.yarnpkg.com/cache-manager/-/cache-manager-2.11.1.tgz#212e8c3db15288af653b029a1d9fe12f1fd9df61" 231 | integrity sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow== 232 | dependencies: 233 | async "1.5.2" 234 | lodash.clonedeep "4.5.0" 235 | lru-cache "4.0.0" 236 | 237 | cacheable-request@^6.0.0: 238 | version "6.1.0" 239 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" 240 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== 241 | dependencies: 242 | clone-response "^1.0.2" 243 | get-stream "^5.1.0" 244 | http-cache-semantics "^4.0.0" 245 | keyv "^3.0.0" 246 | lowercase-keys "^2.0.0" 247 | normalize-url "^4.1.0" 248 | responselike "^1.0.2" 249 | 250 | camelcase@^5.3.1: 251 | version "5.3.1" 252 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 253 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 254 | 255 | caseless@~0.12.0: 256 | version "0.12.0" 257 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 258 | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 259 | 260 | chalk@^3.0.0: 261 | version "3.0.0" 262 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" 263 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== 264 | dependencies: 265 | ansi-styles "^4.1.0" 266 | supports-color "^7.1.0" 267 | 268 | chokidar@^3.2.2: 269 | version "3.4.0" 270 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" 271 | integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== 272 | dependencies: 273 | anymatch "~3.1.1" 274 | braces "~3.0.2" 275 | glob-parent "~5.1.0" 276 | is-binary-path "~2.1.0" 277 | is-glob "~4.0.1" 278 | normalize-path "~3.0.0" 279 | readdirp "~3.4.0" 280 | optionalDependencies: 281 | fsevents "~2.1.2" 282 | 283 | ci-info@^2.0.0: 284 | version "2.0.0" 285 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" 286 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== 287 | 288 | cli-boxes@^2.2.0: 289 | version "2.2.0" 290 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" 291 | integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w== 292 | 293 | clone-response@^1.0.2: 294 | version "1.0.2" 295 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 296 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= 297 | dependencies: 298 | mimic-response "^1.0.0" 299 | 300 | color-convert@^2.0.1: 301 | version "2.0.1" 302 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 303 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 304 | dependencies: 305 | color-name "~1.1.4" 306 | 307 | color-name@~1.1.4: 308 | version "1.1.4" 309 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 310 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 311 | 312 | combined-stream@^1.0.6, combined-stream@~1.0.6: 313 | version "1.0.8" 314 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 315 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 316 | dependencies: 317 | delayed-stream "~1.0.0" 318 | 319 | concat-map@0.0.1: 320 | version "0.0.1" 321 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 322 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 323 | 324 | configstore@^5.0.1: 325 | version "5.0.1" 326 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" 327 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== 328 | dependencies: 329 | dot-prop "^5.2.0" 330 | graceful-fs "^4.1.2" 331 | make-dir "^3.0.0" 332 | unique-string "^2.0.0" 333 | write-file-atomic "^3.0.0" 334 | xdg-basedir "^4.0.0" 335 | 336 | content-disposition@0.5.3: 337 | version "0.5.3" 338 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" 339 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== 340 | dependencies: 341 | safe-buffer "5.1.2" 342 | 343 | content-type@~1.0.4: 344 | version "1.0.4" 345 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 346 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 347 | 348 | cookie-signature@1.0.6: 349 | version "1.0.6" 350 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 351 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 352 | 353 | cookie@0.4.0: 354 | version "0.4.0" 355 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" 356 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== 357 | 358 | core-util-is@1.0.2: 359 | version "1.0.2" 360 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 361 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 362 | 363 | crypto-random-string@^2.0.0: 364 | version "2.0.0" 365 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" 366 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== 367 | 368 | dashdash@^1.12.0: 369 | version "1.14.1" 370 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 371 | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= 372 | dependencies: 373 | assert-plus "^1.0.0" 374 | 375 | debug@2.6.9, debug@^2.2.0: 376 | version "2.6.9" 377 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 378 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 379 | dependencies: 380 | ms "2.0.0" 381 | 382 | debug@^3.2.6: 383 | version "3.2.6" 384 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 385 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== 386 | dependencies: 387 | ms "^2.1.1" 388 | 389 | decompress-response@^3.3.0: 390 | version "3.3.0" 391 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" 392 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= 393 | dependencies: 394 | mimic-response "^1.0.0" 395 | 396 | deep-extend@^0.6.0: 397 | version "0.6.0" 398 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 399 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 400 | 401 | defer-to-connect@^1.0.1: 402 | version "1.1.3" 403 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 404 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== 405 | 406 | delayed-stream@~1.0.0: 407 | version "1.0.0" 408 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 409 | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= 410 | 411 | depd@~1.1.2: 412 | version "1.1.2" 413 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 414 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 415 | 416 | depd@~2.0.0: 417 | version "2.0.0" 418 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 419 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 420 | 421 | destroy@~1.0.4: 422 | version "1.0.4" 423 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 424 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 425 | 426 | dot-prop@^5.2.0: 427 | version "5.2.0" 428 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb" 429 | integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A== 430 | dependencies: 431 | is-obj "^2.0.0" 432 | 433 | dtrace-provider@~0.8: 434 | version "0.8.8" 435 | resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.8.tgz#2996d5490c37e1347be263b423ed7b297fb0d97e" 436 | integrity sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg== 437 | dependencies: 438 | nan "^2.14.0" 439 | 440 | duplexer3@^0.1.4: 441 | version "0.1.4" 442 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 443 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= 444 | 445 | ecc-jsbn@~0.1.1: 446 | version "0.1.2" 447 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" 448 | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= 449 | dependencies: 450 | jsbn "~0.1.0" 451 | safer-buffer "^2.1.0" 452 | 453 | ecdsa-sig-formatter@1.0.11: 454 | version "1.0.11" 455 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 456 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 457 | dependencies: 458 | safe-buffer "^5.0.1" 459 | 460 | ee-first@1.1.1: 461 | version "1.1.1" 462 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 463 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 464 | 465 | elliptic@^6.2.3: 466 | version "6.5.3" 467 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" 468 | integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== 469 | dependencies: 470 | bn.js "^4.4.0" 471 | brorand "^1.0.1" 472 | hash.js "^1.0.0" 473 | hmac-drbg "^1.0.0" 474 | inherits "^2.0.1" 475 | minimalistic-assert "^1.0.0" 476 | minimalistic-crypto-utils "^1.0.0" 477 | 478 | emoji-regex@^7.0.1: 479 | version "7.0.3" 480 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 481 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 482 | 483 | emoji-regex@^8.0.0: 484 | version "8.0.0" 485 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 486 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 487 | 488 | encodeurl@~1.0.2: 489 | version "1.0.2" 490 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 491 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 492 | 493 | end-of-stream@^1.1.0: 494 | version "1.4.4" 495 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 496 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 497 | dependencies: 498 | once "^1.4.0" 499 | 500 | escape-goat@^2.0.0: 501 | version "2.1.1" 502 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" 503 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== 504 | 505 | escape-html@~1.0.3: 506 | version "1.0.3" 507 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 508 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 509 | 510 | etag@~1.8.1: 511 | version "1.8.1" 512 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 513 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 514 | 515 | express@^4.14.0: 516 | version "4.17.1" 517 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" 518 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== 519 | dependencies: 520 | accepts "~1.3.7" 521 | array-flatten "1.1.1" 522 | body-parser "1.19.0" 523 | content-disposition "0.5.3" 524 | content-type "~1.0.4" 525 | cookie "0.4.0" 526 | cookie-signature "1.0.6" 527 | debug "2.6.9" 528 | depd "~1.1.2" 529 | encodeurl "~1.0.2" 530 | escape-html "~1.0.3" 531 | etag "~1.8.1" 532 | finalhandler "~1.1.2" 533 | fresh "0.5.2" 534 | merge-descriptors "1.0.1" 535 | methods "~1.1.2" 536 | on-finished "~2.3.0" 537 | parseurl "~1.3.3" 538 | path-to-regexp "0.1.7" 539 | proxy-addr "~2.0.5" 540 | qs "6.7.0" 541 | range-parser "~1.2.1" 542 | safe-buffer "5.1.2" 543 | send "0.17.1" 544 | serve-static "1.14.1" 545 | setprototypeof "1.1.1" 546 | statuses "~1.5.0" 547 | type-is "~1.6.18" 548 | utils-merge "1.0.1" 549 | vary "~1.1.2" 550 | 551 | extend@~3.0.2: 552 | version "3.0.2" 553 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" 554 | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== 555 | 556 | extsprintf@1.3.0: 557 | version "1.3.0" 558 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 559 | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= 560 | 561 | extsprintf@^1.2.0: 562 | version "1.4.0" 563 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 564 | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= 565 | 566 | fast-deep-equal@^3.1.1: 567 | version "3.1.3" 568 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 569 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 570 | 571 | fast-json-stable-stringify@^2.0.0: 572 | version "2.1.0" 573 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 574 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 575 | 576 | fill-range@^7.0.1: 577 | version "7.0.1" 578 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 579 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 580 | dependencies: 581 | to-regex-range "^5.0.1" 582 | 583 | finalhandler@~1.1.2: 584 | version "1.1.2" 585 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" 586 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== 587 | dependencies: 588 | debug "2.6.9" 589 | encodeurl "~1.0.2" 590 | escape-html "~1.0.3" 591 | on-finished "~2.3.0" 592 | parseurl "~1.3.3" 593 | statuses "~1.5.0" 594 | unpipe "~1.0.0" 595 | 596 | forever-agent@~0.6.1: 597 | version "0.6.1" 598 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 599 | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= 600 | 601 | form-data@~2.3.2: 602 | version "2.3.3" 603 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" 604 | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== 605 | dependencies: 606 | asynckit "^0.4.0" 607 | combined-stream "^1.0.6" 608 | mime-types "^2.1.12" 609 | 610 | forwarded@~0.1.2: 611 | version "0.1.2" 612 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 613 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 614 | 615 | fresh@0.5.2: 616 | version "0.5.2" 617 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 618 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 619 | 620 | fsevents@~2.1.2: 621 | version "2.1.3" 622 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 623 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== 624 | 625 | get-stream@^4.1.0: 626 | version "4.1.0" 627 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" 628 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== 629 | dependencies: 630 | pump "^3.0.0" 631 | 632 | get-stream@^5.1.0: 633 | version "5.1.0" 634 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" 635 | integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw== 636 | dependencies: 637 | pump "^3.0.0" 638 | 639 | getpass@^0.1.1: 640 | version "0.1.7" 641 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 642 | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= 643 | dependencies: 644 | assert-plus "^1.0.0" 645 | 646 | glob-parent@~5.1.0: 647 | version "5.1.1" 648 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 649 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 650 | dependencies: 651 | is-glob "^4.0.1" 652 | 653 | glob@^6.0.1: 654 | version "6.0.4" 655 | resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" 656 | integrity sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI= 657 | dependencies: 658 | inflight "^1.0.4" 659 | inherits "2" 660 | minimatch "2 || 3" 661 | once "^1.3.0" 662 | path-is-absolute "^1.0.0" 663 | 664 | global-dirs@^2.0.1: 665 | version "2.0.1" 666 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" 667 | integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== 668 | dependencies: 669 | ini "^1.3.5" 670 | 671 | got@^9.6.0: 672 | version "9.6.0" 673 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" 674 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== 675 | dependencies: 676 | "@sindresorhus/is" "^0.14.0" 677 | "@szmarczak/http-timer" "^1.1.2" 678 | cacheable-request "^6.0.0" 679 | decompress-response "^3.3.0" 680 | duplexer3 "^0.1.4" 681 | get-stream "^4.1.0" 682 | lowercase-keys "^1.0.1" 683 | mimic-response "^1.0.1" 684 | p-cancelable "^1.0.0" 685 | to-readable-stream "^1.0.0" 686 | url-parse-lax "^3.0.0" 687 | 688 | graceful-fs@^4.1.2: 689 | version "4.2.4" 690 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" 691 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== 692 | 693 | har-schema@^2.0.0: 694 | version "2.0.0" 695 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 696 | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= 697 | 698 | har-validator@~5.1.3: 699 | version "5.1.3" 700 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" 701 | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== 702 | dependencies: 703 | ajv "^6.5.5" 704 | har-schema "^2.0.0" 705 | 706 | has-flag@^3.0.0: 707 | version "3.0.0" 708 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 709 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 710 | 711 | has-flag@^4.0.0: 712 | version "4.0.0" 713 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 714 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 715 | 716 | has-yarn@^2.1.0: 717 | version "2.1.0" 718 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" 719 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== 720 | 721 | hash.js@^1.0.0, hash.js@^1.0.3: 722 | version "1.1.7" 723 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 724 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 725 | dependencies: 726 | inherits "^2.0.3" 727 | minimalistic-assert "^1.0.1" 728 | 729 | hmac-drbg@^1.0.0: 730 | version "1.0.1" 731 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 732 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 733 | dependencies: 734 | hash.js "^1.0.3" 735 | minimalistic-assert "^1.0.0" 736 | minimalistic-crypto-utils "^1.0.1" 737 | 738 | http-cache-semantics@^4.0.0: 739 | version "4.1.0" 740 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 741 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== 742 | 743 | http-errors@1.7.2: 744 | version "1.7.2" 745 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 746 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== 747 | dependencies: 748 | depd "~1.1.2" 749 | inherits "2.0.3" 750 | setprototypeof "1.1.1" 751 | statuses ">= 1.5.0 < 2" 752 | toidentifier "1.0.0" 753 | 754 | http-errors@~1.7.2: 755 | version "1.7.3" 756 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" 757 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== 758 | dependencies: 759 | depd "~1.1.2" 760 | inherits "2.0.4" 761 | setprototypeof "1.1.1" 762 | statuses ">= 1.5.0 < 2" 763 | toidentifier "1.0.0" 764 | 765 | http-signature@~1.2.0: 766 | version "1.2.0" 767 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 768 | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= 769 | dependencies: 770 | assert-plus "^1.0.0" 771 | jsprim "^1.2.2" 772 | sshpk "^1.7.0" 773 | 774 | iconv-lite@0.4.24: 775 | version "0.4.24" 776 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 777 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 778 | dependencies: 779 | safer-buffer ">= 2.1.2 < 3" 780 | 781 | ignore-by-default@^1.0.1: 782 | version "1.0.1" 783 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 784 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= 785 | 786 | import-lazy@^2.1.0: 787 | version "2.1.0" 788 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 789 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= 790 | 791 | imurmurhash@^0.1.4: 792 | version "0.1.4" 793 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 794 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 795 | 796 | inflight@^1.0.4: 797 | version "1.0.6" 798 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 799 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 800 | dependencies: 801 | once "^1.3.0" 802 | wrappy "1" 803 | 804 | inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3: 805 | version "2.0.4" 806 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 807 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 808 | 809 | inherits@2.0.3: 810 | version "2.0.3" 811 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 812 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 813 | 814 | ini@^1.3.5, ini@~1.3.0: 815 | version "1.3.5" 816 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 817 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 818 | 819 | ipaddr.js@1.9.1: 820 | version "1.9.1" 821 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 822 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 823 | 824 | is-binary-path@~2.1.0: 825 | version "2.1.0" 826 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 827 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 828 | dependencies: 829 | binary-extensions "^2.0.0" 830 | 831 | is-ci@^2.0.0: 832 | version "2.0.0" 833 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" 834 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== 835 | dependencies: 836 | ci-info "^2.0.0" 837 | 838 | is-extglob@^2.1.1: 839 | version "2.1.1" 840 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 841 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 842 | 843 | is-fullwidth-code-point@^2.0.0: 844 | version "2.0.0" 845 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 846 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 847 | 848 | is-fullwidth-code-point@^3.0.0: 849 | version "3.0.0" 850 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 851 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 852 | 853 | is-glob@^4.0.1, is-glob@~4.0.1: 854 | version "4.0.1" 855 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 856 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 857 | dependencies: 858 | is-extglob "^2.1.1" 859 | 860 | is-installed-globally@^0.3.1: 861 | version "0.3.2" 862 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" 863 | integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== 864 | dependencies: 865 | global-dirs "^2.0.1" 866 | is-path-inside "^3.0.1" 867 | 868 | is-npm@^4.0.0: 869 | version "4.0.0" 870 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" 871 | integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== 872 | 873 | is-number@^7.0.0: 874 | version "7.0.0" 875 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 876 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 877 | 878 | is-obj@^2.0.0: 879 | version "2.0.0" 880 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" 881 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== 882 | 883 | is-path-inside@^3.0.1: 884 | version "3.0.2" 885 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" 886 | integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== 887 | 888 | is-typedarray@^1.0.0, is-typedarray@~1.0.0: 889 | version "1.0.0" 890 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 891 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= 892 | 893 | is-yarn-global@^0.3.0: 894 | version "0.3.0" 895 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" 896 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== 897 | 898 | isstream@~0.1.2: 899 | version "0.1.2" 900 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 901 | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 902 | 903 | jsbn@~0.1.0: 904 | version "0.1.1" 905 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 906 | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= 907 | 908 | json-buffer@3.0.0: 909 | version "3.0.0" 910 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" 911 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= 912 | 913 | json-schema-traverse@^0.4.1: 914 | version "0.4.1" 915 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 916 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 917 | 918 | json-schema@0.2.3: 919 | version "0.2.3" 920 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 921 | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= 922 | 923 | json-stringify-safe@~5.0.1: 924 | version "5.0.1" 925 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 926 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 927 | 928 | jsprim@^1.2.2: 929 | version "1.4.1" 930 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 931 | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= 932 | dependencies: 933 | assert-plus "1.0.0" 934 | extsprintf "1.3.0" 935 | json-schema "0.2.3" 936 | verror "1.10.0" 937 | 938 | jwa@^1.4.1: 939 | version "1.4.1" 940 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" 941 | integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== 942 | dependencies: 943 | buffer-equal-constant-time "1.0.1" 944 | ecdsa-sig-formatter "1.0.11" 945 | safe-buffer "^5.0.1" 946 | 947 | jwk-to-pem@^1.2.6: 948 | version "1.2.6" 949 | resolved "https://registry.yarnpkg.com/jwk-to-pem/-/jwk-to-pem-1.2.6.tgz#d507cece40089c5248e09ec68266a2030a9c6325" 950 | integrity sha1-1QfOzkAInFJI4J7GgmaiAwqcYyU= 951 | dependencies: 952 | asn1.js "^4.5.2" 953 | elliptic "^6.2.3" 954 | safe-buffer "^5.0.1" 955 | 956 | jws@^3.1.3: 957 | version "3.2.2" 958 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 959 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 960 | dependencies: 961 | jwa "^1.4.1" 962 | safe-buffer "^5.0.1" 963 | 964 | keyv@^3.0.0: 965 | version "3.1.0" 966 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" 967 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== 968 | dependencies: 969 | json-buffer "3.0.0" 970 | 971 | latest-version@^5.0.0: 972 | version "5.1.0" 973 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" 974 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== 975 | dependencies: 976 | package-json "^6.3.0" 977 | 978 | lodash.clonedeep@4.5.0: 979 | version "4.5.0" 980 | resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" 981 | integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= 982 | 983 | lodash@^4.11.2: 984 | version "4.17.20" 985 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" 986 | integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== 987 | 988 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: 989 | version "1.0.1" 990 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 991 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== 992 | 993 | lowercase-keys@^2.0.0: 994 | version "2.0.0" 995 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 996 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== 997 | 998 | lru-cache@4.0.0: 999 | version "4.0.0" 1000 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.0.tgz#b5cbf01556c16966febe54ceec0fb4dc90df6c28" 1001 | integrity sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg= 1002 | dependencies: 1003 | pseudomap "^1.0.1" 1004 | yallist "^2.0.0" 1005 | 1006 | make-dir@^3.0.0: 1007 | version "3.1.0" 1008 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" 1009 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 1010 | dependencies: 1011 | semver "^6.0.0" 1012 | 1013 | media-typer@0.3.0: 1014 | version "0.3.0" 1015 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1016 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 1017 | 1018 | merge-descriptors@1.0.1: 1019 | version "1.0.1" 1020 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1021 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 1022 | 1023 | methods@~1.1.2: 1024 | version "1.1.2" 1025 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1026 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 1027 | 1028 | mime-db@1.44.0: 1029 | version "1.44.0" 1030 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" 1031 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== 1032 | 1033 | mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: 1034 | version "2.1.27" 1035 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" 1036 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== 1037 | dependencies: 1038 | mime-db "1.44.0" 1039 | 1040 | mime@1.6.0: 1041 | version "1.6.0" 1042 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1043 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1044 | 1045 | mimic-response@^1.0.0, mimic-response@^1.0.1: 1046 | version "1.0.1" 1047 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 1048 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== 1049 | 1050 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 1051 | version "1.0.1" 1052 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 1053 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 1054 | 1055 | minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: 1056 | version "1.0.1" 1057 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1058 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 1059 | 1060 | "minimatch@2 || 3", minimatch@^3.0.4: 1061 | version "3.0.4" 1062 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1063 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1064 | dependencies: 1065 | brace-expansion "^1.1.7" 1066 | 1067 | minimist@^1.2.0, minimist@^1.2.5: 1068 | version "1.2.5" 1069 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1070 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1071 | 1072 | mkdirp@~0.5.1: 1073 | version "0.5.5" 1074 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 1075 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 1076 | dependencies: 1077 | minimist "^1.2.5" 1078 | 1079 | moment@^2.10.6: 1080 | version "2.27.0" 1081 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.27.0.tgz#8bff4e3e26a236220dfe3e36de756b6ebaa0105d" 1082 | integrity sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ== 1083 | 1084 | morgan@^1.7.0: 1085 | version "1.10.0" 1086 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" 1087 | integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== 1088 | dependencies: 1089 | basic-auth "~2.0.1" 1090 | debug "2.6.9" 1091 | depd "~2.0.0" 1092 | on-finished "~2.3.0" 1093 | on-headers "~1.0.2" 1094 | 1095 | ms@2.0.0: 1096 | version "2.0.0" 1097 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1098 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1099 | 1100 | ms@2.1.1: 1101 | version "2.1.1" 1102 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 1103 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 1104 | 1105 | ms@^2.1.1: 1106 | version "2.1.2" 1107 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1108 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1109 | 1110 | mv@~2: 1111 | version "2.1.1" 1112 | resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2" 1113 | integrity sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI= 1114 | dependencies: 1115 | mkdirp "~0.5.1" 1116 | ncp "~2.0.0" 1117 | rimraf "~2.4.0" 1118 | 1119 | nan@^2.14.0: 1120 | version "2.14.1" 1121 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" 1122 | integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== 1123 | 1124 | ncp@~2.0.0: 1125 | version "2.0.0" 1126 | resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" 1127 | integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= 1128 | 1129 | negotiator@0.6.2: 1130 | version "0.6.2" 1131 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1132 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1133 | 1134 | nodemon@^2.0.2: 1135 | version "2.0.4" 1136 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416" 1137 | integrity sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ== 1138 | dependencies: 1139 | chokidar "^3.2.2" 1140 | debug "^3.2.6" 1141 | ignore-by-default "^1.0.1" 1142 | minimatch "^3.0.4" 1143 | pstree.remy "^1.1.7" 1144 | semver "^5.7.1" 1145 | supports-color "^5.5.0" 1146 | touch "^3.1.0" 1147 | undefsafe "^2.0.2" 1148 | update-notifier "^4.0.0" 1149 | 1150 | nopt@~1.0.10: 1151 | version "1.0.10" 1152 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1153 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= 1154 | dependencies: 1155 | abbrev "1" 1156 | 1157 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1158 | version "3.0.0" 1159 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1160 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1161 | 1162 | normalize-url@^4.1.0: 1163 | version "4.5.0" 1164 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" 1165 | integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== 1166 | 1167 | oauth-sign@~0.9.0: 1168 | version "0.9.0" 1169 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" 1170 | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== 1171 | 1172 | oauth@0.9.14: 1173 | version "0.9.14" 1174 | resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.14.tgz#c5748883a40b53de30ade9cabf2100414b8a0971" 1175 | integrity sha1-xXSIg6QLU94wrenKvyEAQUuKCXE= 1176 | 1177 | on-finished@~2.3.0: 1178 | version "2.3.0" 1179 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1180 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 1181 | dependencies: 1182 | ee-first "1.1.1" 1183 | 1184 | on-headers@~1.0.2: 1185 | version "1.0.2" 1186 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 1187 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 1188 | 1189 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 1190 | version "1.4.0" 1191 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1192 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1193 | dependencies: 1194 | wrappy "1" 1195 | 1196 | p-cancelable@^1.0.0: 1197 | version "1.1.0" 1198 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" 1199 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== 1200 | 1201 | package-json@^6.3.0: 1202 | version "6.5.0" 1203 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" 1204 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== 1205 | dependencies: 1206 | got "^9.6.0" 1207 | registry-auth-token "^4.0.0" 1208 | registry-url "^5.0.0" 1209 | semver "^6.2.0" 1210 | 1211 | parseurl@~1.3.3: 1212 | version "1.3.3" 1213 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1214 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1215 | 1216 | passport-azure-ad@^4.2.1: 1217 | version "4.2.1" 1218 | resolved "https://registry.yarnpkg.com/passport-azure-ad/-/passport-azure-ad-4.2.1.tgz#68b2422d60286ce0d52c4352ceaa994dbde21881" 1219 | integrity sha512-pyaGhuvxHTUu/jrCCBOtR3GoSC12+u7B/iEQVK7z+JdDQZE/I+3oMgN1Ls4umnb5TfPuVyM76kvjqwB9kAjBgw== 1220 | dependencies: 1221 | async "^1.5.2" 1222 | base64url "^3.0.0" 1223 | bunyan "^1.8.0" 1224 | cache-manager "^2.0.0" 1225 | jwk-to-pem "^1.2.6" 1226 | jws "^3.1.3" 1227 | lodash "^4.11.2" 1228 | oauth "0.9.14" 1229 | passport "^0.3.2" 1230 | request "^2.72.0" 1231 | valid-url "^1.0.6" 1232 | 1233 | passport-strategy@1.x.x: 1234 | version "1.0.0" 1235 | resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4" 1236 | integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= 1237 | 1238 | passport@^0.3.2: 1239 | version "0.3.2" 1240 | resolved "https://registry.yarnpkg.com/passport/-/passport-0.3.2.tgz#9dd009f915e8fe095b0124a01b8f82da07510102" 1241 | integrity sha1-ndAJ+RXo/glbASSgG4+C2gdRAQI= 1242 | dependencies: 1243 | passport-strategy "1.x.x" 1244 | pause "0.0.1" 1245 | 1246 | path-is-absolute@^1.0.0: 1247 | version "1.0.1" 1248 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1249 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1250 | 1251 | path-to-regexp@0.1.7: 1252 | version "0.1.7" 1253 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1254 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 1255 | 1256 | pause@0.0.1: 1257 | version "0.0.1" 1258 | resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" 1259 | integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= 1260 | 1261 | performance-now@^2.1.0: 1262 | version "2.1.0" 1263 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 1264 | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= 1265 | 1266 | picomatch@^2.0.4, picomatch@^2.2.1: 1267 | version "2.2.2" 1268 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1269 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 1270 | 1271 | prepend-http@^2.0.0: 1272 | version "2.0.0" 1273 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" 1274 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= 1275 | 1276 | proxy-addr@~2.0.5: 1277 | version "2.0.6" 1278 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" 1279 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== 1280 | dependencies: 1281 | forwarded "~0.1.2" 1282 | ipaddr.js "1.9.1" 1283 | 1284 | pseudomap@^1.0.1: 1285 | version "1.0.2" 1286 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1287 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 1288 | 1289 | psl@^1.1.28: 1290 | version "1.8.0" 1291 | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" 1292 | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== 1293 | 1294 | pstree.remy@^1.1.7: 1295 | version "1.1.8" 1296 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" 1297 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== 1298 | 1299 | pump@^3.0.0: 1300 | version "3.0.0" 1301 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 1302 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1303 | dependencies: 1304 | end-of-stream "^1.1.0" 1305 | once "^1.3.1" 1306 | 1307 | punycode@^2.1.0, punycode@^2.1.1: 1308 | version "2.1.1" 1309 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1310 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1311 | 1312 | pupa@^2.0.1: 1313 | version "2.0.1" 1314 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" 1315 | integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== 1316 | dependencies: 1317 | escape-goat "^2.0.0" 1318 | 1319 | qs@6.7.0: 1320 | version "6.7.0" 1321 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" 1322 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== 1323 | 1324 | qs@~6.5.2: 1325 | version "6.5.2" 1326 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 1327 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 1328 | 1329 | range-parser@~1.2.1: 1330 | version "1.2.1" 1331 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1332 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1333 | 1334 | raw-body@2.4.0: 1335 | version "2.4.0" 1336 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" 1337 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== 1338 | dependencies: 1339 | bytes "3.1.0" 1340 | http-errors "1.7.2" 1341 | iconv-lite "0.4.24" 1342 | unpipe "1.0.0" 1343 | 1344 | rc@^1.2.8: 1345 | version "1.2.8" 1346 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1347 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1348 | dependencies: 1349 | deep-extend "^0.6.0" 1350 | ini "~1.3.0" 1351 | minimist "^1.2.0" 1352 | strip-json-comments "~2.0.1" 1353 | 1354 | readdirp@~3.4.0: 1355 | version "3.4.0" 1356 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" 1357 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== 1358 | dependencies: 1359 | picomatch "^2.2.1" 1360 | 1361 | registry-auth-token@^4.0.0: 1362 | version "4.1.1" 1363 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479" 1364 | integrity sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA== 1365 | dependencies: 1366 | rc "^1.2.8" 1367 | 1368 | registry-url@^5.0.0: 1369 | version "5.1.0" 1370 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" 1371 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== 1372 | dependencies: 1373 | rc "^1.2.8" 1374 | 1375 | request@^2.72.0: 1376 | version "2.88.2" 1377 | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 1378 | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== 1379 | dependencies: 1380 | aws-sign2 "~0.7.0" 1381 | aws4 "^1.8.0" 1382 | caseless "~0.12.0" 1383 | combined-stream "~1.0.6" 1384 | extend "~3.0.2" 1385 | forever-agent "~0.6.1" 1386 | form-data "~2.3.2" 1387 | har-validator "~5.1.3" 1388 | http-signature "~1.2.0" 1389 | is-typedarray "~1.0.0" 1390 | isstream "~0.1.2" 1391 | json-stringify-safe "~5.0.1" 1392 | mime-types "~2.1.19" 1393 | oauth-sign "~0.9.0" 1394 | performance-now "^2.1.0" 1395 | qs "~6.5.2" 1396 | safe-buffer "^5.1.2" 1397 | tough-cookie "~2.5.0" 1398 | tunnel-agent "^0.6.0" 1399 | uuid "^3.3.2" 1400 | 1401 | responselike@^1.0.2: 1402 | version "1.0.2" 1403 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" 1404 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= 1405 | dependencies: 1406 | lowercase-keys "^1.0.0" 1407 | 1408 | rimraf@~2.4.0: 1409 | version "2.4.5" 1410 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da" 1411 | integrity sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto= 1412 | dependencies: 1413 | glob "^6.0.1" 1414 | 1415 | safe-buffer@5.1.2: 1416 | version "5.1.2" 1417 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1418 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1419 | 1420 | safe-buffer@^5.0.1, safe-buffer@^5.1.2: 1421 | version "5.2.1" 1422 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1423 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1424 | 1425 | safe-json-stringify@~1: 1426 | version "1.2.0" 1427 | resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd" 1428 | integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg== 1429 | 1430 | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 1431 | version "2.1.2" 1432 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1433 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1434 | 1435 | semver-diff@^3.1.1: 1436 | version "3.1.1" 1437 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" 1438 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== 1439 | dependencies: 1440 | semver "^6.3.0" 1441 | 1442 | semver@^5.7.1: 1443 | version "5.7.1" 1444 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1445 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1446 | 1447 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: 1448 | version "6.3.0" 1449 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1450 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== 1451 | 1452 | send@0.17.1: 1453 | version "0.17.1" 1454 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" 1455 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== 1456 | dependencies: 1457 | debug "2.6.9" 1458 | depd "~1.1.2" 1459 | destroy "~1.0.4" 1460 | encodeurl "~1.0.2" 1461 | escape-html "~1.0.3" 1462 | etag "~1.8.1" 1463 | fresh "0.5.2" 1464 | http-errors "~1.7.2" 1465 | mime "1.6.0" 1466 | ms "2.1.1" 1467 | on-finished "~2.3.0" 1468 | range-parser "~1.2.1" 1469 | statuses "~1.5.0" 1470 | 1471 | serve-static@1.14.1: 1472 | version "1.14.1" 1473 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" 1474 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== 1475 | dependencies: 1476 | encodeurl "~1.0.2" 1477 | escape-html "~1.0.3" 1478 | parseurl "~1.3.3" 1479 | send "0.17.1" 1480 | 1481 | setprototypeof@1.1.1: 1482 | version "1.1.1" 1483 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 1484 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== 1485 | 1486 | signal-exit@^3.0.2: 1487 | version "3.0.3" 1488 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1489 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1490 | 1491 | sshpk@^1.7.0: 1492 | version "1.16.1" 1493 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" 1494 | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== 1495 | dependencies: 1496 | asn1 "~0.2.3" 1497 | assert-plus "^1.0.0" 1498 | bcrypt-pbkdf "^1.0.0" 1499 | dashdash "^1.12.0" 1500 | ecc-jsbn "~0.1.1" 1501 | getpass "^0.1.1" 1502 | jsbn "~0.1.0" 1503 | safer-buffer "^2.0.2" 1504 | tweetnacl "~0.14.0" 1505 | 1506 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: 1507 | version "1.5.0" 1508 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1509 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 1510 | 1511 | string-width@^3.0.0: 1512 | version "3.1.0" 1513 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1514 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1515 | dependencies: 1516 | emoji-regex "^7.0.1" 1517 | is-fullwidth-code-point "^2.0.0" 1518 | strip-ansi "^5.1.0" 1519 | 1520 | string-width@^4.0.0, string-width@^4.1.0: 1521 | version "4.2.0" 1522 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1523 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 1524 | dependencies: 1525 | emoji-regex "^8.0.0" 1526 | is-fullwidth-code-point "^3.0.0" 1527 | strip-ansi "^6.0.0" 1528 | 1529 | strip-ansi@^5.1.0: 1530 | version "5.2.0" 1531 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1532 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1533 | dependencies: 1534 | ansi-regex "^4.1.0" 1535 | 1536 | strip-ansi@^6.0.0: 1537 | version "6.0.0" 1538 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1539 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1540 | dependencies: 1541 | ansi-regex "^5.0.0" 1542 | 1543 | strip-json-comments@~2.0.1: 1544 | version "2.0.1" 1545 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1546 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1547 | 1548 | supports-color@^5.5.0: 1549 | version "5.5.0" 1550 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1551 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1552 | dependencies: 1553 | has-flag "^3.0.0" 1554 | 1555 | supports-color@^7.1.0: 1556 | version "7.1.0" 1557 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1558 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1559 | dependencies: 1560 | has-flag "^4.0.0" 1561 | 1562 | term-size@^2.1.0: 1563 | version "2.2.0" 1564 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" 1565 | integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== 1566 | 1567 | to-readable-stream@^1.0.0: 1568 | version "1.0.0" 1569 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" 1570 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== 1571 | 1572 | to-regex-range@^5.0.1: 1573 | version "5.0.1" 1574 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1575 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1576 | dependencies: 1577 | is-number "^7.0.0" 1578 | 1579 | toidentifier@1.0.0: 1580 | version "1.0.0" 1581 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 1582 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 1583 | 1584 | touch@^3.1.0: 1585 | version "3.1.0" 1586 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 1587 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== 1588 | dependencies: 1589 | nopt "~1.0.10" 1590 | 1591 | tough-cookie@~2.5.0: 1592 | version "2.5.0" 1593 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" 1594 | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== 1595 | dependencies: 1596 | psl "^1.1.28" 1597 | punycode "^2.1.1" 1598 | 1599 | tunnel-agent@^0.6.0: 1600 | version "0.6.0" 1601 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1602 | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= 1603 | dependencies: 1604 | safe-buffer "^5.0.1" 1605 | 1606 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1607 | version "0.14.5" 1608 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1609 | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= 1610 | 1611 | type-fest@^0.8.1: 1612 | version "0.8.1" 1613 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1614 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== 1615 | 1616 | type-is@~1.6.17, type-is@~1.6.18: 1617 | version "1.6.18" 1618 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1619 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1620 | dependencies: 1621 | media-typer "0.3.0" 1622 | mime-types "~2.1.24" 1623 | 1624 | typedarray-to-buffer@^3.1.5: 1625 | version "3.1.5" 1626 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1627 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== 1628 | dependencies: 1629 | is-typedarray "^1.0.0" 1630 | 1631 | undefsafe@^2.0.2: 1632 | version "2.0.3" 1633 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" 1634 | integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A== 1635 | dependencies: 1636 | debug "^2.2.0" 1637 | 1638 | unique-string@^2.0.0: 1639 | version "2.0.0" 1640 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" 1641 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== 1642 | dependencies: 1643 | crypto-random-string "^2.0.0" 1644 | 1645 | unpipe@1.0.0, unpipe@~1.0.0: 1646 | version "1.0.0" 1647 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1648 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 1649 | 1650 | update-notifier@^4.0.0: 1651 | version "4.1.0" 1652 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" 1653 | integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== 1654 | dependencies: 1655 | boxen "^4.2.0" 1656 | chalk "^3.0.0" 1657 | configstore "^5.0.1" 1658 | has-yarn "^2.1.0" 1659 | import-lazy "^2.1.0" 1660 | is-ci "^2.0.0" 1661 | is-installed-globally "^0.3.1" 1662 | is-npm "^4.0.0" 1663 | is-yarn-global "^0.3.0" 1664 | latest-version "^5.0.0" 1665 | pupa "^2.0.1" 1666 | semver-diff "^3.1.1" 1667 | xdg-basedir "^4.0.0" 1668 | 1669 | uri-js@^4.2.2: 1670 | version "4.2.2" 1671 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 1672 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 1673 | dependencies: 1674 | punycode "^2.1.0" 1675 | 1676 | url-parse-lax@^3.0.0: 1677 | version "3.0.0" 1678 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" 1679 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= 1680 | dependencies: 1681 | prepend-http "^2.0.0" 1682 | 1683 | utils-merge@1.0.1: 1684 | version "1.0.1" 1685 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1686 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 1687 | 1688 | uuid@^3.3.2: 1689 | version "3.4.0" 1690 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 1691 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 1692 | 1693 | valid-url@^1.0.6: 1694 | version "1.0.9" 1695 | resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" 1696 | integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= 1697 | 1698 | vary@~1.1.2: 1699 | version "1.1.2" 1700 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1701 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1702 | 1703 | verror@1.10.0: 1704 | version "1.10.0" 1705 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 1706 | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= 1707 | dependencies: 1708 | assert-plus "^1.0.0" 1709 | core-util-is "1.0.2" 1710 | extsprintf "^1.2.0" 1711 | 1712 | widest-line@^3.1.0: 1713 | version "3.1.0" 1714 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" 1715 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== 1716 | dependencies: 1717 | string-width "^4.0.0" 1718 | 1719 | wrappy@1: 1720 | version "1.0.2" 1721 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1722 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1723 | 1724 | write-file-atomic@^3.0.0: 1725 | version "3.0.3" 1726 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1727 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== 1728 | dependencies: 1729 | imurmurhash "^0.1.4" 1730 | is-typedarray "^1.0.0" 1731 | signal-exit "^3.0.2" 1732 | typedarray-to-buffer "^3.1.5" 1733 | 1734 | xdg-basedir@^4.0.0: 1735 | version "4.0.0" 1736 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" 1737 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== 1738 | 1739 | yallist@^2.0.0: 1740 | version "2.1.2" 1741 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1742 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 1743 | --------------------------------------------------------------------------------