Merge remote-tracking branch 'upstream/adopapup-front'
62 files copied
90 files added
1 files modified
67 files renamed
New file |
| | |
| | | { |
| | | "env": { |
| | | "browser": true, |
| | | "es6": true |
| | | }, |
| | | "extends": [ |
| | | "eslint:recommended", |
| | | "plugin:react/recommended", |
| | | "plugin:@typescript-eslint/eslint-recommended" |
| | | ], |
| | | "globals": { |
| | | "Atomics": "readonly", |
| | | "SharedArrayBuffer": "readonly" |
| | | }, |
| | | "parser": "@typescript-eslint/parser", |
| | | "parserOptions": { |
| | | "ecmaFeatures": { |
| | | "jsx": true |
| | | }, |
| | | "ecmaVersion": 2018, |
| | | "sourceType": "module" |
| | | }, |
| | | "plugins": [ |
| | | "react", |
| | | "@typescript-eslint" |
| | | ], |
| | | "rules": { |
| | | "max-len": [ |
| | | "error", |
| | | 100 |
| | | ], |
| | | "indent": [ |
| | | "error", |
| | | 4 |
| | | ], |
| | | "linebreak-style": [ |
| | | "error", |
| | | "unix" |
| | | ], |
| | | "quotes": [ |
| | | "error", |
| | | "double" |
| | | ], |
| | | "semi": [ |
| | | "error", |
| | | "always" |
| | | ] |
| | | }, |
| | | "settings": { |
| | | "react": { |
| | | "version": "detect" |
| | | } |
| | | }, |
| | | "overrides": [ |
| | | { |
| | | "files": [ |
| | | "*.ts", |
| | | "*.tsx" |
| | | ], |
| | | "rules": { |
| | | "@typescript-eslint/no-unused-vars": [ |
| | | 2, |
| | | { |
| | | "args": "none" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ] |
| | | } |
copy from mczernek-exchange-application/frontend/.gitignore
copy to adopt-a-pup/web-app/.gitignore
New file |
| | |
| | | # Adopt-A-Pup React WebApp |
| | | |
| | | **IN PROGRESS** |
| | | |
| | | This is the frontend application that displays data from our ADOPT-A-PUP application. |
| | | |
| | | The entry point is at `src/index.tsx`. |
| | | |
| | | # Documentation |
| | | |
| | | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). |
| | | |
| | | ## Available Scripts |
| | | |
| | | In the project directory, you can run: |
| | | |
| | | ### `npm start` |
| | | |
| | | Runs the app in the development mode.<br /> |
| | | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. |
| | | |
| | | The page will reload if you make edits.<br /> |
| | | You will also see any lint errors in the console. |
| | | |
| | | ### `npm test` |
| | | |
| | | Launches the test runner in the interactive watch mode.<br /> |
| | | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. |
| | | |
| | | ### `npm build` |
| | | |
| | | Builds the app for production to the `build` folder.<br /> |
| | | It correctly bundles React in production mode and optimizes the build for the best performance. |
| | | |
| | | The build is minified and the filenames include the hashes.<br /> |
| | | Your app is ready to be deployed! |
| | | |
| | | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. |
| | | |
| | | ### `npm eject` |
| | | |
| | | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** |
| | | |
| | | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. |
| | | |
| | | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. |
| | | |
| | | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. |
| | | |
| | | ## Learn More |
| | | |
| | | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). |
| | | |
| | | To learn React, check out the [React documentation](https://reactjs.org/). |
| | | |
| | | ### Code Splitting |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting |
| | | |
| | | ### Analyzing the Bundle Size |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size |
| | | |
| | | ### Making a Progressive Web App |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app |
| | | |
| | | ### Advanced Configuration |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration |
| | | |
| | | ### Deployment |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment |
| | | |
| | | ### `npm build` fails to minify |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify |
New file |
| | |
| | | { |
| | | "name": "adopt", |
| | | "version": "0.1.0", |
| | | "private": true, |
| | | "dependencies": { |
| | | "@patternfly/react-core": "^3.158.1", |
| | | "@patternfly/react-table": "^2.28.47", |
| | | "@testing-library/jest-dom": "^4.2.4", |
| | | "@testing-library/react": "^9.3.2", |
| | | "@testing-library/user-event": "^7.1.2", |
| | | "@types/jest": "^24.0.0", |
| | | "@types/node": "^12.0.0", |
| | | "@types/react": "^16.9.0", |
| | | "@types/react-dom": "^16.9.0", |
| | | "axios": "^0.19.2", |
| | | "react": "^16.13.1", |
| | | "react-dom": "^16.13.1", |
| | | "react-router-dom": "^5.1.2", |
| | | "react-scripts": "3.4.1", |
| | | "typescript": "~3.7.2" |
| | | }, |
| | | "scripts": { |
| | | "start": "react-scripts start", |
| | | "build": "react-scripts build", |
| | | "test": "react-scripts test", |
| | | "eject": "react-scripts eject", |
| | | "lint": "eslint --ext ts,tsx src --fix" |
| | | }, |
| | | "eslintConfig": { |
| | | "extends": "react-app" |
| | | }, |
| | | "browserslist": { |
| | | "production": [ |
| | | ">0.2%", |
| | | "not dead", |
| | | "not op_mini all" |
| | | ], |
| | | "development": [ |
| | | "last 1 chrome version", |
| | | "last 1 firefox version", |
| | | "last 1 safari version" |
| | | ] |
| | | }, |
| | | "devDependencies": { |
| | | "@types/react-router-dom": "^5.1.5", |
| | | "install": "^0.13.0" |
| | | } |
| | | } |
copy from mczernek-exchange-application/frontend/public/robots.txt
copy to adopt-a-pup/web-app/public/robots.txt
New file |
| | |
| | | body { |
| | | margin: 0; |
| | | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', |
| | | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', |
| | | sans-serif; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | } |
| | | |
| | | code { |
| | | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', |
| | | monospace; |
| | | } |
| | | |
| | | |
| | | /* |
| | | .centered { |
| | | text-align: center; |
| | | } |
| | | |
| | | .margin-separator { |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | .text-container { |
| | | text-align: center; |
| | | font-size: 3em; |
| | | max-width: 300px; |
| | | border-bottom-style: solid; |
| | | border-color: #2b9af3; |
| | | word-wrap: break-word; |
| | | } |
| | | |
| | | .currency-text { |
| | | font-size: 0.6em; |
| | | vertical-align: top; |
| | | } |
| | | |
| | | @keyframes popupFadeIn { |
| | | from { |
| | | transform: translateY(-50%); |
| | | opacity: 0; |
| | | } |
| | | to { |
| | | transform: translateY(0); |
| | | opacity: 1; |
| | | } |
| | | } |
| | | |
| | | .popup { |
| | | animation-name: popupFadeIn; |
| | | animation-duration: .3s; |
| | | } |
| | | */ |
New file |
| | |
| | | import React from "react"; |
| | | import { render } from "@testing-library/react"; |
| | | import App from "./App"; |
| | | |
| | | test("renders learn react link", () => { |
| | | const { getByText } = render(<App />); |
| | | const linkElement = getByText(/learn react/i); |
| | | expect(linkElement).toBeInTheDocument(); |
| | | }); |
New file |
| | |
| | | import React, { Component } from "react"; |
| | | import Structure from "./Layout"; |
| | | |
| | | import { |
| | | BrowserRouter as Router, |
| | | Switch, |
| | | Route, |
| | | } from "react-router-dom"; |
| | | // import ShelterRESTService from "./Services/ShelterRESTService"; |
| | | import AnimalList from "./Components/AnimalList"; |
| | | import SheltersView from "./Views/SheltersView"; |
| | | import ShelterFakeService from "./Services/ShelterFakeService"; |
| | | // import ShelterRESTService from "./Services/ShelterRESTService"; |
| | | |
| | | // Services to connect to backends |
| | | const shelterService = new ShelterFakeService(); |
| | | // Uncomment to use a real backend |
| | | // const shelterService = new ShelterRESTService(SERVICE_BASE_URL); |
| | | |
| | | |
| | | // The main React component that runs the whole webapp |
| | | export default class App extends Component { |
| | | render() { |
| | | return ( |
| | | <Router basename="/frontend"> |
| | | <Switch> |
| | | <Structure> |
| | | <Route path="/" exact > |
| | | Main |
| | | </Route> |
| | | <Route path="/shelters" exact> |
| | | <SheltersView shelterService={shelterService} /> |
| | | </Route> |
| | | <Route path="/your-animals" exact> |
| | | <AnimalList /> |
| | | </Route> |
| | | </Structure> |
| | | </Switch> |
| | | </Router> |
| | | ); |
| | | } |
| | | } |
New file |
| | |
| | | import React from "react"; |
| | | import { List, ListItem } from "@patternfly/react-core"; |
| | | |
| | | |
| | | export default class AnimalList extends React.Component { |
| | | |
| | | public render() { |
| | | return ( |
| | | <List> |
| | | <ListItem>Animal 1 <button>Adopt</button></ListItem> |
| | | <ListItem>Animal 2 <button>Adopt</button></ListItem> |
| | | <ListItem>Animal 3 <button>Adopt</button></ListItem> |
| | | </List> |
| | | ); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | import React from "react"; |
| | | import { |
| | | Nav, |
| | | NavItem, |
| | | NavList, |
| | | } from "@patternfly/react-core"; |
| | | |
| | | import { Link} from "react-router-dom"; |
| | | |
| | | |
| | | |
| | | export default class NavDefaultList extends React.Component { |
| | | |
| | | public render() { |
| | | const { pathname } = window.location; |
| | | return ( |
| | | <Nav theme="dark"> |
| | | <NavList> |
| | | <NavItem id="home" isActive={pathname.endsWith("/")}> |
| | | <Link to="/">Home</Link> |
| | | </NavItem> |
| | | <NavItem id="shelters" isActive={pathname.endsWith("/shelters")}> |
| | | <Link to="/shelters" >Shelters</Link> |
| | | </NavItem> |
| | | <NavItem id="your-animals" isActive={pathname.endsWith("/your-animals")}> |
| | | <Link to="/your-animals" >Your Animals</Link> |
| | | </NavItem> |
| | | </NavList> |
| | | </Nav> |
| | | ); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | import React, { FormEvent } from "react"; |
| | | import { |
| | | Form, |
| | | FormGroup, |
| | | TextInput, |
| | | ActionGroup, |
| | | Button, |
| | | ButtonType |
| | | } from "@patternfly/react-core"; |
| | | import { ShelterService } from "../Services/ShelterService"; |
| | | |
| | | |
| | | type ShelterFormProps = { |
| | | shelterService: ShelterService |
| | | }; |
| | | |
| | | type ShelterFormState = { |
| | | name: string, |
| | | state: string, |
| | | country: string, |
| | | address: string, |
| | | email: string, |
| | | phoneNumber: string |
| | | }; |
| | | |
| | | export default class ShelterForm extends React.Component<ShelterFormProps, ShelterFormState> { |
| | | |
| | | constructor(props: ShelterFormProps) { |
| | | super(props); |
| | | this.state = { |
| | | name: "", |
| | | state: "", |
| | | country: "", |
| | | address: "", |
| | | email: "", |
| | | phoneNumber: "" |
| | | }; |
| | | } |
| | | |
| | | private handleNameChange(name: string) { |
| | | this.setState({ name }); |
| | | } |
| | | |
| | | private handleStateChange(state: string) { |
| | | this.setState({ state }); |
| | | } |
| | | |
| | | private handleCountryChange(country: string) { |
| | | this.setState({ country }); |
| | | } |
| | | |
| | | private handleAddressChange(address: string) { |
| | | this.setState({ address }); |
| | | } |
| | | |
| | | private handleEmailChange(email: string) { |
| | | this.setState({ email }); |
| | | } |
| | | |
| | | private handlePhoneNumberChange(phoneNumber: string) { |
| | | this.setState({ phoneNumber }); |
| | | } |
| | | |
| | | private async handleFormSubmit(event: FormEvent) { |
| | | const { name } = this.state; |
| | | this.props.shelterService.create({ |
| | | name |
| | | }); |
| | | event.preventDefault(); |
| | | } |
| | | |
| | | public render() { |
| | | const { name, country, state, address, email, phoneNumber } = this.state; |
| | | |
| | | return ( |
| | | <Form onSubmit={this.handleFormSubmit.bind(this)}> |
| | | <FormGroup |
| | | label="Name" |
| | | isRequired |
| | | fieldId="simple-form-name" |
| | | helperText="Please provide your full name" |
| | | > |
| | | <TextInput |
| | | isRequired |
| | | type="text" |
| | | id="simple-form-name" |
| | | name="simple-form-name" |
| | | aria-describedby="simple-form-name-helper" |
| | | value={name} |
| | | onChange={this.handleNameChange} |
| | | /> |
| | | </FormGroup> |
| | | <FormGroup |
| | | label="State" |
| | | isRequired |
| | | fieldId="simple-form-state" |
| | | helperText="Please provide the state" |
| | | > |
| | | <TextInput |
| | | isRequired |
| | | type="text" |
| | | id="simple-form-state" |
| | | name="simple-form-state" |
| | | aria-describedby="simple-form-name-helper" |
| | | value={state} |
| | | onChange={this.handleStateChange.bind(this)} |
| | | /> |
| | | </FormGroup> |
| | | <FormGroup |
| | | label="Country" |
| | | isRequired |
| | | fieldId="simple-form-country" |
| | | helperText="Please provide the country" |
| | | > |
| | | <TextInput |
| | | isRequired |
| | | type="text" |
| | | id="simple-form-country" |
| | | name="simple-form-country" |
| | | aria-describedby="simple-form-name-helper" |
| | | value={country} |
| | | onChange={this.handleCountryChange.bind(this)} |
| | | /> |
| | | </FormGroup> |
| | | <FormGroup |
| | | label="Address" |
| | | isRequired |
| | | fieldId="simple-form-address" |
| | | helperText="Please provide the address" |
| | | > |
| | | <TextInput |
| | | isRequired |
| | | type="text" |
| | | id="simple-form-address" |
| | | name="simple-form-address" |
| | | aria-describedby="simple-form-name-helper" |
| | | value={address} |
| | | onChange={this.handleAddressChange.bind(this)} |
| | | /> |
| | | </FormGroup> |
| | | <FormGroup label="Email" isRequired fieldId="simple-form-email"> |
| | | <TextInput |
| | | isRequired |
| | | type="email" |
| | | id="simple-form-email" |
| | | name="simple-form-email" |
| | | value={email} |
| | | onChange={this.handleEmailChange} |
| | | /> |
| | | </FormGroup> |
| | | <FormGroup label="Phone number" isRequired fieldId="simple-form-number"> |
| | | <TextInput |
| | | isRequired |
| | | type="tel" |
| | | id="simple-form-number" |
| | | placeholder="555-555-5555" |
| | | name="simple-form-number" |
| | | value={phoneNumber} |
| | | onChange={this.handlePhoneNumberChange} |
| | | /> |
| | | </FormGroup> |
| | | <ActionGroup> |
| | | <Button variant="primary" type={ButtonType.submit}>Create Shelter</Button> |
| | | </ActionGroup> |
| | | </Form> |
| | | ); |
| | | } |
| | | |
| | | } |
| | | |
| | | |
New file |
| | |
| | | import React from "react"; |
| | | import { List, ListItem } from "@patternfly/react-core"; |
| | | import { ShelterService } from "../Services/ShelterService"; |
| | | |
| | | |
| | | type ShelterListProps = { |
| | | shelterService: ShelterService; |
| | | } |
| | | |
| | | type ShelterListState = { |
| | | shelters: Array<any> |
| | | } |
| | | |
| | | export default class ShelterList extends React.Component<ShelterListProps, ShelterListState> { |
| | | |
| | | constructor(props: ShelterListProps) { |
| | | super(props); |
| | | this.state = { |
| | | shelters: [] |
| | | }; |
| | | } |
| | | |
| | | public async componentDidMount() { |
| | | const shelters = await this.props.shelterService.getAll(); |
| | | this.setState({ |
| | | shelters |
| | | }); |
| | | } |
| | | |
| | | public render() { |
| | | const { shelters } = this.state; |
| | | |
| | | return ( |
| | | <List> |
| | | {shelters.map(shelter => <ListItem key={shelter.id}>{shelter.name}</ListItem>)} |
| | | </List> |
| | | ); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | import React from "react"; |
| | | import { Brand, Page, PageHeader, PageSidebar, PageSection } from "@patternfly/react-core"; |
| | | import imgBrand from "./training_white.png"; |
| | | import NavList from "./Components/NavList"; |
| | | |
| | | |
| | | type LayoutProps = { |
| | | children: any |
| | | } |
| | | |
| | | type LayoutState = { |
| | | isNavOpen: boolean |
| | | } |
| | | |
| | | export default class Layout extends React.Component<LayoutProps, LayoutState> { |
| | | |
| | | constructor(props: LayoutProps) { |
| | | super(props); |
| | | |
| | | this.state = { |
| | | isNavOpen: true, |
| | | }; |
| | | } |
| | | |
| | | |
| | | public render() { |
| | | const { isNavOpen } = this.state; |
| | | |
| | | const logoProps = { |
| | | href: "/frontend/" |
| | | }; |
| | | |
| | | const Header = ( |
| | | <PageHeader |
| | | logo={<Brand src={imgBrand} alt="Patternfly Logo" />} |
| | | logoProps={logoProps} |
| | | showNavToggle |
| | | isNavOpen={isNavOpen} |
| | | onNavToggle={this.onNavToggle.bind(this)} |
| | | style={{ borderTop: "2px solid #c00" }} |
| | | /> |
| | | ); |
| | | |
| | | const Sidebar = <PageSidebar nav={<NavList/>} isNavOpen={isNavOpen} theme="dark" />; |
| | | |
| | | return ( |
| | | <Page header={Header} sidebar={Sidebar} style={{minHeight: 800}}> |
| | | <PageSection > |
| | | {this.props.children} |
| | | </PageSection> |
| | | </Page> |
| | | ); |
| | | } |
| | | |
| | | private onNavToggle() { |
| | | this.setState({ |
| | | isNavOpen: !this.state.isNavOpen |
| | | }); |
| | | } |
| | | } |
New file |
| | |
| | | import Axios, { AxiosInstance } from "axios"; |
| | | |
| | | |
| | | |
| | | export abstract class RESTService { |
| | | |
| | | private readonly axiosInstance: AxiosInstance; |
| | | private readonly remoteServiceName: string; |
| | | |
| | | constructor(baseUrl: string, remoteServiceName: string) { |
| | | this.remoteServiceName = remoteServiceName; |
| | | this.axiosInstance = Axios.create({ baseURL: baseUrl }); |
| | | } |
| | | |
| | | protected async get<T>(url: string): Promise<T> { |
| | | try { |
| | | const r = await this.axiosInstance.get<T>(url); |
| | | return r.data; |
| | | } catch (e) { |
| | | throw new RESTConnectionError(e, this.remoteServiceName); |
| | | } |
| | | } |
| | | |
| | | protected async post<T>(url: string, body: any): Promise<T> { |
| | | try { |
| | | const r = await this.axiosInstance.post<T>(url, body); |
| | | return r.data; |
| | | } catch (e) { |
| | | throw new RESTConnectionError(e, this.remoteServiceName, e.response.status); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | export class RESTConnectionError extends Error { |
| | | |
| | | public readonly statusCode: number = 500; |
| | | public readonly description: string; |
| | | public readonly remoteStatusCode: number; |
| | | |
| | | constructor(error: Error, serviceName: string, remoteStatusCode?: number) { |
| | | super(); |
| | | this.message = `An error ocurred when calling the remote service <${serviceName}>`; |
| | | this.description = (error && error.message) ? error.message : "No additional information"; |
| | | this.remoteStatusCode = remoteStatusCode || 500; |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | import { ShelterService } from "./ShelterService"; |
| | | |
| | | |
| | | export default class ShelterFakeService implements ShelterService { |
| | | |
| | | public async create(): Promise<void> { |
| | | alert("ShelterFakeService: create() was called!"); |
| | | return Promise.resolve(); |
| | | } |
| | | |
| | | public async getAll(): Promise<any[]> { |
| | | return [ |
| | | { id: "s1", name: "Shelter 1" }, |
| | | { id: "s2", name: "Shelter 2" } |
| | | ]; |
| | | } |
| | | } |
New file |
| | |
| | | import { ShelterService, ShelterParams } from "./ShelterService"; |
| | | import { RESTService } from "./RESTService"; |
| | | |
| | | |
| | | export default class ShelterRESTService extends RESTService implements ShelterService { |
| | | |
| | | constructor(baseUrl: string) { |
| | | super(baseUrl, "shelter-service"); |
| | | } |
| | | |
| | | public async create(params: ShelterParams): Promise<void> { |
| | | return this.post("/create", params); |
| | | } |
| | | |
| | | public getAll(): Promise<Array<any>> { |
| | | return this.get<Array<any>>("/getAll"); |
| | | } |
| | | } |
New file |
| | |
| | | export type ShelterParams = { |
| | | name: string |
| | | } |
| | | |
| | | |
| | | export interface ShelterService { |
| | | create(params: ShelterParams): Promise<void>; |
| | | getAll(): Promise<any[]>; |
| | | } |
| | | |
New file |
| | |
| | | import React from "react"; |
| | | import ShelterForm from "../Components/ShelterForm"; |
| | | import ShelterList from "../Components/SheltersList"; |
| | | import { ShelterService } from "../Services/ShelterService"; |
| | | import { PageSection, PageSectionVariants, Text, TextContent } from "@patternfly/react-core"; |
| | | |
| | | |
| | | type ShelterListProps = { |
| | | shelterService: ShelterService; |
| | | } |
| | | |
| | | |
| | | export default class SheltersView extends React.Component<ShelterListProps> { |
| | | |
| | | public render() { |
| | | return ( |
| | | <React.Fragment> |
| | | |
| | | <PageSection variant={PageSectionVariants.light}> |
| | | <TextContent> |
| | | <Text component="h1">Shelters</Text> |
| | | </TextContent> |
| | | <TextContent> |
| | | <Text component="h2">Shelters list</Text> |
| | | </TextContent> |
| | | <ShelterList shelterService={this.props.shelterService}></ShelterList> |
| | | </PageSection> |
| | | <PageSection variant={PageSectionVariants.light}> |
| | | <Text component="h2">Create a Shelter</Text> |
| | | <ShelterForm shelterService={this.props.shelterService}></ShelterForm> |
| | | </PageSection> |
| | | </React.Fragment> |
| | | ); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | import React from "react"; |
| | | import ReactDOM from "react-dom"; |
| | | import "@patternfly/react-core/dist/styles/base.css"; |
| | | import "./App.css"; |
| | | import App from "./App"; |
| | | import * as serviceWorker from "./serviceWorker"; |
| | | |
| | | ReactDOM.render( |
| | | <React.StrictMode> |
| | | <App /> |
| | | </React.StrictMode>, |
| | | document.getElementById("root") |
| | | ); |
| | | |
| | | // If you want your app to work offline and load faster, you can change |
| | | // unregister() to register() below. Note this comes with some pitfalls. |
| | | // Learn more about service workers: https://bit.ly/CRA-PWA |
| | | serviceWorker.unregister(); |
| | | |
New file |
| | |
| | | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 841.9 595.3"> |
| | | <g fill="#61DAFB"> |
| | | <path d="M666.3 296.5c0-32.5-40.7-63.3-103.1-82.4 14.4-63.6 8-114.2-20.2-130.4-6.5-3.8-14.1-5.6-22.4-5.6v22.3c4.6 0 8.3.9 11.4 2.6 13.6 7.8 19.5 37.5 14.9 75.7-1.1 9.4-2.9 19.3-5.1 29.4-19.6-4.8-41-8.5-63.5-10.9-13.5-18.5-27.5-35.3-41.6-50 32.6-30.3 63.2-46.9 84-46.9V78c-27.5 0-63.5 19.6-99.9 53.6-36.4-33.8-72.4-53.2-99.9-53.2v22.3c20.7 0 51.4 16.5 84 46.6-14 14.7-28 31.4-41.3 49.9-22.6 2.4-44 6.1-63.6 11-2.3-10-4-19.7-5.2-29-4.7-38.2 1.1-67.9 14.6-75.8 3-1.8 6.9-2.6 11.5-2.6V78.5c-8.4 0-16 1.8-22.6 5.6-28.1 16.2-34.4 66.7-19.9 130.1-62.2 19.2-102.7 49.9-102.7 82.3 0 32.5 40.7 63.3 103.1 82.4-14.4 63.6-8 114.2 20.2 130.4 6.5 3.8 14.1 5.6 22.5 5.6 27.5 0 63.5-19.6 99.9-53.6 36.4 33.8 72.4 53.2 99.9 53.2 8.4 0 16-1.8 22.6-5.6 28.1-16.2 34.4-66.7 19.9-130.1 62-19.1 102.5-49.9 102.5-82.3zm-130.2-66.7c-3.7 12.9-8.3 26.2-13.5 39.5-4.1-8-8.4-16-13.1-24-4.6-8-9.5-15.8-14.4-23.4 14.2 2.1 27.9 4.7 41 7.9zm-45.8 106.5c-7.8 13.5-15.8 26.3-24.1 38.2-14.9 1.3-30 2-45.2 2-15.1 0-30.2-.7-45-1.9-8.3-11.9-16.4-24.6-24.2-38-7.6-13.1-14.5-26.4-20.8-39.8 6.2-13.4 13.2-26.8 20.7-39.9 7.8-13.5 15.8-26.3 24.1-38.2 14.9-1.3 30-2 45.2-2 15.1 0 30.2.7 45 1.9 8.3 11.9 16.4 24.6 24.2 38 7.6 13.1 14.5 26.4 20.8 39.8-6.3 13.4-13.2 26.8-20.7 39.9zm32.3-13c5.4 13.4 10 26.8 13.8 39.8-13.1 3.2-26.9 5.9-41.2 8 4.9-7.7 9.8-15.6 14.4-23.7 4.6-8 8.9-16.1 13-24.1zM421.2 430c-9.3-9.6-18.6-20.3-27.8-32 9 .4 18.2.7 27.5.7 9.4 0 18.7-.2 27.8-.7-9 11.7-18.3 22.4-27.5 32zm-74.4-58.9c-14.2-2.1-27.9-4.7-41-7.9 3.7-12.9 8.3-26.2 13.5-39.5 4.1 8 8.4 16 13.1 24 4.7 8 9.5 15.8 14.4 23.4zM420.7 163c9.3 9.6 18.6 20.3 27.8 32-9-.4-18.2-.7-27.5-.7-9.4 0-18.7.2-27.8.7 9-11.7 18.3-22.4 27.5-32zm-74 58.9c-4.9 7.7-9.8 15.6-14.4 23.7-4.6 8-8.9 16-13 24-5.4-13.4-10-26.8-13.8-39.8 13.1-3.1 26.9-5.8 41.2-7.9zm-90.5 125.2c-35.4-15.1-58.3-34.9-58.3-50.6 0-15.7 22.9-35.6 58.3-50.6 8.6-3.7 18-7 27.7-10.1 5.7 19.6 13.2 40 22.5 60.9-9.2 20.8-16.6 41.1-22.2 60.6-9.9-3.1-19.3-6.5-28-10.2zM310 490c-13.6-7.8-19.5-37.5-14.9-75.7 1.1-9.4 2.9-19.3 5.1-29.4 19.6 4.8 41 8.5 63.5 10.9 13.5 18.5 27.5 35.3 41.6 50-32.6 30.3-63.2 46.9-84 46.9-4.5-.1-8.3-1-11.3-2.7zm237.2-76.2c4.7 38.2-1.1 67.9-14.6 75.8-3 1.8-6.9 2.6-11.5 2.6-20.7 0-51.4-16.5-84-46.6 14-14.7 28-31.4 41.3-49.9 22.6-2.4 44-6.1 63.6-11 2.3 10.1 4.1 19.8 5.2 29.1zm38.5-66.7c-8.6 3.7-18 7-27.7 10.1-5.7-19.6-13.2-40-22.5-60.9 9.2-20.8 16.6-41.1 22.2-60.6 9.9 3.1 19.3 6.5 28.1 10.2 35.4 15.1 58.3 34.9 58.3 50.6-.1 15.7-23 35.6-58.4 50.6zM320.8 78.4z"/> |
| | | <circle cx="420.9" cy="296.5" r="45.7"/> |
| | | <path d="M520.5 78.1z"/> |
| | | </g> |
| | | </svg> |
New file |
| | |
| | | /// <reference types="react-scripts" /> |
New file |
| | |
| | | // This optional code is used to register a service worker. |
| | | // register() is not called by default. |
| | | |
| | | // This lets the app load faster on subsequent visits in production, and gives |
| | | // it offline capabilities. However, it also means that developers (and users) |
| | | // will only see deployed updates on subsequent visits to a page, after all the |
| | | // existing tabs open on the page have been closed, since previously cached |
| | | // resources are updated in the background. |
| | | |
| | | // To learn more about the benefits of this model and instructions on how to |
| | | // opt-in, read https://bit.ly/CRA-PWA |
| | | |
| | | const isLocalhost = Boolean( |
| | | window.location.hostname === "localhost" || |
| | | // [::1] is the IPv6 localhost address. |
| | | window.location.hostname === "[::1]" || |
| | | // 127.0.0.0/8 are considered localhost for IPv4. |
| | | window.location.hostname.match( |
| | | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ |
| | | ) |
| | | ); |
| | | |
| | | type Config = { |
| | | onSuccess?: (registration: ServiceWorkerRegistration) => void; |
| | | onUpdate?: (registration: ServiceWorkerRegistration) => void; |
| | | }; |
| | | |
| | | export function register(config?: Config) { |
| | | if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { |
| | | // The URL constructor is available in all browsers that support SW. |
| | | const publicUrl = new URL( |
| | | process.env.PUBLIC_URL, |
| | | window.location.href |
| | | ); |
| | | if (publicUrl.origin !== window.location.origin) { |
| | | // Our service worker won't work if PUBLIC_URL is on a different origin |
| | | // from what our page is served on. This might happen if a CDN is used to |
| | | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 |
| | | return; |
| | | } |
| | | |
| | | window.addEventListener("load", () => { |
| | | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; |
| | | |
| | | if (isLocalhost) { |
| | | // This is running on localhost. Let's check if a service worker still |
| | | // exists or not. |
| | | checkValidServiceWorker(swUrl, config); |
| | | |
| | | // Add some additional logging to localhost, pointing developers to the |
| | | // service worker/PWA documentation. |
| | | navigator.serviceWorker.ready.then(() => { |
| | | console.log( |
| | | "This web app is being served cache-first by a service " + |
| | | "worker. To learn more, visit https://bit.ly/CRA-PWA" |
| | | ); |
| | | }); |
| | | } else { |
| | | // Is not localhost. Just register service worker |
| | | registerValidSW(swUrl, config); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function registerValidSW(swUrl: string, config?: Config) { |
| | | navigator.serviceWorker |
| | | .register(swUrl) |
| | | .then(registration => { |
| | | registration.onupdatefound = () => { |
| | | const installingWorker = registration.installing; |
| | | if (installingWorker == null) { |
| | | return; |
| | | } |
| | | installingWorker.onstatechange = () => { |
| | | if (installingWorker.state === "installed") { |
| | | if (navigator.serviceWorker.controller) { |
| | | // At this point, the updated precached content has been fetched, |
| | | // but the previous service worker will still serve the older |
| | | // content until all client tabs are closed. |
| | | console.log( |
| | | "New content is available and will be used when all " + |
| | | "tabs for this page are closed. See https://bit.ly/CRA-PWA." |
| | | ); |
| | | |
| | | // Execute callback |
| | | if (config && config.onUpdate) { |
| | | config.onUpdate(registration); |
| | | } |
| | | } else { |
| | | // At this point, everything has been precached. |
| | | // It's the perfect time to display a |
| | | // "Content is cached for offline use." message. |
| | | console.log("Content is cached for offline use."); |
| | | |
| | | // Execute callback |
| | | if (config && config.onSuccess) { |
| | | config.onSuccess(registration); |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | }; |
| | | }) |
| | | .catch(error => { |
| | | console.error("Error during service worker registration:", error); |
| | | }); |
| | | } |
| | | |
| | | function checkValidServiceWorker(swUrl: string, config?: Config) { |
| | | // Check if the service worker can be found. If it can't reload the page. |
| | | fetch(swUrl, { |
| | | headers: { "Service-Worker": "script" } |
| | | }) |
| | | .then(response => { |
| | | // Ensure service worker exists, and that we really are getting a JS file. |
| | | const contentType = response.headers.get("content-type"); |
| | | if ( |
| | | response.status === 404 || |
| | | (contentType != null && contentType.indexOf("javascript") === -1) |
| | | ) { |
| | | // No service worker found. Probably a different app. Reload the page. |
| | | navigator.serviceWorker.ready.then(registration => { |
| | | registration.unregister().then(() => { |
| | | window.location.reload(); |
| | | }); |
| | | }); |
| | | } else { |
| | | // Service worker found. Proceed as normal. |
| | | registerValidSW(swUrl, config); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | console.log( |
| | | "No internet connection found. App is running in offline mode." |
| | | ); |
| | | }); |
| | | } |
| | | |
| | | export function unregister() { |
| | | if ("serviceWorker" in navigator) { |
| | | navigator.serviceWorker.ready |
| | | .then(registration => { |
| | | registration.unregister(); |
| | | }) |
| | | .catch(error => { |
| | | console.error(error.message); |
| | | }); |
| | | } |
| | | } |
New file |
| | |
| | | // jest-dom adds custom jest matchers for asserting on DOM nodes. |
| | | // allows you to do things like: |
| | | // expect(element).toHaveTextContent(/react/i) |
| | | // learn more: https://github.com/testing-library/jest-dom |
| | | import "@testing-library/jest-dom/extend-expect"; |
New file |
| | |
| | | { |
| | | "compilerOptions": { |
| | | "target": "es5", |
| | | "lib": [ |
| | | "dom", |
| | | "dom.iterable", |
| | | "esnext" |
| | | ], |
| | | "allowJs": true, |
| | | "skipLibCheck": true, |
| | | "esModuleInterop": true, |
| | | "allowSyntheticDefaultImports": true, |
| | | "strict": true, |
| | | "forceConsistentCasingInFileNames": true, |
| | | "module": "esnext", |
| | | "moduleResolution": "node", |
| | | "resolveJsonModule": true, |
| | | "isolatedModules": true, |
| | | "strictNullChecks": true, |
| | | "strictFunctionTypes": true, |
| | | "noEmit": true, |
| | | "jsx": "react" |
| | | }, |
| | | "include": [ |
| | | "src" |
| | | ] |
| | | } |
New file |
| | |
| | | # Dashboard |
| | | |
| | | This application serves as a quick visual check of connectivity of |
| | | services. The backend executes a request to the following services: |
| | | |
| | | - History |
| | | - Currency |
| | | - Exchange |
| | | - Frontend (currency exchange frontend) |
| | | |
| | | ![Image of the dashboard application](imgs/frontend.png) |
| | | |
| | | Requests are executed using full service FQDN, e.g. `http://${HISTORY_SERVICE}.${TARGET_PROJECT}.svc.cluster.local:${HISTORY_SERVICE_PORT}`. |
| | | You can change the parameters using the template parameters. |
| | | |
| | | The dashboard frontend service communicates with the dashboard backend service (via ingress, such as the `istio-ingressgateway` pod). |
| | | Availability of the services is propagated into the frontend. |
| | | |
| | | ## Deployment |
| | | |
| | | Note that if the exchange application is managed by Istio service mesh, this dashboard |
| | | application also has to be within the Service Mesh if you use any security features such as |
| | | mTLS, or authorization policies. |
| | | |
| | | To deploy this application, execute: |
| | | |
| | | ```sh |
| | | oc process -o yaml -f kubefiles/template.yml \ |
| | | -p INGRESS_GW=ingress-gateway.istio-system-app.apps.example.com \ |
| | | -p TARGET_PROJECT=secure-mesh \ |
| | | | oc create -f |
| | | ``` |
New file |
| | |
| | | { |
| | | "env": { |
| | | "node": true, |
| | | "commonjs": true, |
| | | "es6": true |
| | | }, |
| | | "extends": "eslint:recommended", |
| | | "globals": { |
| | | "Atomics": "readonly", |
| | | "SharedArrayBuffer": "readonly" |
| | | }, |
| | | "parserOptions": { |
| | | "ecmaVersion": 2018 |
| | | }, |
| | | "rules": { |
| | | "indent": [ |
| | | "error", |
| | | 4 |
| | | ], |
| | | "linebreak-style": [ |
| | | "error", |
| | | "unix" |
| | | ], |
| | | "quotes": [ |
| | | "error", |
| | | "double" |
| | | ], |
| | | "semi": [ |
| | | "error", |
| | | "always" |
| | | ] |
| | | } |
| | | } |
copy from mczernek-exchange-application/frontend/.gitignore
copy to dashboard/backend/.gitignore
New file |
| | |
| | | FROM ubi8/nodejs-12 |
| | | |
| | | COPY package.json . |
| | | COPY package-lock.json . |
| | | |
| | | RUN npm ci --production |
| | | |
| | | COPY lib ./lib |
| | | COPY index.js . |
| | | |
| | | CMD node index.js |
New file |
| | |
| | | "use strict"; |
| | | |
| | | const express = require("express"); |
| | | const bodyParser = require("body-parser"); |
| | | const _const = require("./lib/constants"); |
| | | const _helper = require("./lib/helpers"); |
| | | const request = require("request"); |
| | | |
| | | const app = express(); |
| | | |
| | | app.use(bodyParser.json()); |
| | | |
| | | app.use(function(_, res, next) { |
| | | res.header("Access-Control-Allow-Origin", "*"); |
| | | res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); |
| | | next(); |
| | | }); |
| | | |
| | | const checkHistory = (req, resp) => { |
| | | request.post(_const.HISTORY_FQDN, {json: _const.HISTORY_DATA, timeout: 1500}, (error, res) => { |
| | | _helper.handleResponse(resp, error, res); |
| | | }); |
| | | }; |
| | | |
| | | const checkCurrency = (req, resp) => { |
| | | request.get(_const.CURRENCY_FQDN, {timeout: 1500}, (error, res) => { |
| | | _helper.handleResponse(resp, error, res); |
| | | }); |
| | | }; |
| | | |
| | | const checkExchangeGateway = (req, resp) => { |
| | | request.get(_const.EXCHANGE_FQDN, {timeout: 1500}, (error, res) => { |
| | | _helper.handleResponse(resp, error, res); |
| | | }); |
| | | }; |
| | | |
| | | const checkFrontEnd = (req, resp) => { |
| | | request.get(_const.FRONTEND_FQDN, {timeout: 1500}, (error, res) => { |
| | | _helper.handleResponse(resp, error, res); |
| | | }); |
| | | }; |
| | | |
| | | app.get("/history", checkHistory); |
| | | app.get("/currencies", checkCurrency); |
| | | app.get("/exchangeGW", checkExchangeGateway); |
| | | app.get("/frontend", checkFrontEnd); |
| | | |
| | | app.listen(_const.PORT, () => { |
| | | console.log( |
| | | " App is running at http://localhost:%d", |
| | | _const.PORT, |
| | | ); |
| | | console.log(" Press CTRL-C to stop\n"); |
| | | }); |
New file |
| | |
| | | "use strict"; |
| | | |
| | | const PORT = process.env.PORT || 8080; |
| | | const TARGET_PROJECT = process.env.TARGET_PROJECT || "secure-mesh"; |
| | | // History service |
| | | const HISTORY_SERVICE = process.env.HISTORY_SERVICE || "history"; |
| | | const HISTORY_SERVICE_PORT = process.env.HISTORY_SERVICE_PORT || "8080"; |
| | | // Main endpoint |
| | | const HISTORY_FQDN = `http://${HISTORY_SERVICE}.${TARGET_PROJECT}.svc.cluster.local:${HISTORY_SERVICE_PORT}`; |
| | | |
| | | // Currency service |
| | | const CURRENCY_SERVICE = process.env.CURRENCY_SERVICE || "currency"; |
| | | const CURRENCY_SERVICE_PORT = process.env.CURRENCY_SERVICE_PORT || "5000"; |
| | | // Main endpoint |
| | | const CURRENCY_FQDN = `http://${CURRENCY_SERVICE}.${TARGET_PROJECT}.svc.cluster.local:${CURRENCY_SERVICE_PORT}`; |
| | | |
| | | // Gateway service |
| | | const EXCHANGE_SERVICE = process.env.EXCHANGE_SERVICE || "exchange"; |
| | | const EXCHANGE_SERVICE_PORT = process.env.EXCHANGE_SERVICE_PORT || "8080"; |
| | | // Ping endpoint |
| | | const EXCHANGE_FQDN = `http://${EXCHANGE_SERVICE}.${TARGET_PROJECT}.svc.cluster.local:${EXCHANGE_SERVICE_PORT}`; |
| | | |
| | | // Frontend service |
| | | const FRONTEND_SERVICE = process.env.FRONTEND_SERVICE || "frontend"; |
| | | const FRONTEND_SERVICE_PORT = process.env.FRONTEND_SERVICE_PORT || "3000"; |
| | | // Main endpoint |
| | | const FRONTEND_FQDN = `http://${FRONTEND_SERVICE}.${TARGET_PROJECT}.svc.cluster.local:${FRONTEND_SERVICE_PORT}/frontend`; |
| | | |
| | | |
| | | const HISTORY_DATA = { |
| | | source: "USD", |
| | | target: "EUR" |
| | | }; |
| | | |
| | | module.exports = { |
| | | PORT, |
| | | HISTORY_DATA, |
| | | HISTORY_FQDN, |
| | | CURRENCY_FQDN, |
| | | EXCHANGE_FQDN, |
| | | FRONTEND_FQDN |
| | | }; |
New file |
| | |
| | | "use strict"; |
| | | |
| | | function handleResponse(clientResp, requestError, requestResp) { |
| | | if(requestError) { |
| | | console.log("Got error:", requestError); |
| | | clientResp.json({state: "ERR", isAvailable: false}).status(400); |
| | | } else { |
| | | const respCode = requestResp.statusCode; |
| | | let stateString = "Down"; |
| | | let isAvailable = false; |
| | | |
| | | console.log("No error; got response:", respCode); |
| | | if(respCode >= 200 && respCode < 300) { |
| | | stateString = "OK"; |
| | | isAvailable = true; |
| | | } |
| | | clientResp.json({state: stateString, isAvailable: isAvailable}).status(respCode); |
| | | |
| | | } |
| | | } |
| | | |
| | | module.exports = { |
| | | handleResponse |
| | | }; |
New file |
| | |
| | | { |
| | | "name": "backend", |
| | | "version": "1.0.0", |
| | | "lockfileVersion": 1, |
| | | "requires": true, |
| | | "dependencies": { |
| | | "@babel/code-frame": { |
| | | "version": "7.8.3", |
| | | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", |
| | | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", |
| | | "dev": true, |
| | | "requires": { |
| | | "@babel/highlight": "^7.8.3" |
| | | } |
| | | }, |
| | | "@babel/helper-validator-identifier": { |
| | | "version": "7.9.5", |
| | | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", |
| | | "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", |
| | | "dev": true |
| | | }, |
| | | "@babel/highlight": { |
| | | "version": "7.9.0", |
| | | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", |
| | | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "@babel/helper-validator-identifier": "^7.9.0", |
| | | "chalk": "^2.0.0", |
| | | "js-tokens": "^4.0.0" |
| | | } |
| | | }, |
| | | "@types/color-name": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", |
| | | "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", |
| | | "dev": true |
| | | }, |
| | | "accepts": { |
| | | "version": "1.3.7", |
| | | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", |
| | | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", |
| | | "requires": { |
| | | "mime-types": "~2.1.24", |
| | | "negotiator": "0.6.2" |
| | | } |
| | | }, |
| | | "acorn": { |
| | | "version": "7.2.0", |
| | | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", |
| | | "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", |
| | | "dev": true |
| | | }, |
| | | "acorn-jsx": { |
| | | "version": "5.2.0", |
| | | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", |
| | | "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", |
| | | "dev": true |
| | | }, |
| | | "ajv": { |
| | | "version": "6.12.2", |
| | | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", |
| | | "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", |
| | | "requires": { |
| | | "fast-deep-equal": "^3.1.1", |
| | | "fast-json-stable-stringify": "^2.0.0", |
| | | "json-schema-traverse": "^0.4.1", |
| | | "uri-js": "^4.2.2" |
| | | } |
| | | }, |
| | | "ansi-escapes": { |
| | | "version": "4.3.1", |
| | | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", |
| | | "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "type-fest": "^0.11.0" |
| | | }, |
| | | "dependencies": { |
| | | "type-fest": { |
| | | "version": "0.11.0", |
| | | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", |
| | | "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", |
| | | "dev": true |
| | | } |
| | | } |
| | | }, |
| | | "ansi-regex": { |
| | | "version": "5.0.0", |
| | | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", |
| | | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", |
| | | "dev": true |
| | | }, |
| | | "ansi-styles": { |
| | | "version": "3.2.1", |
| | | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", |
| | | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "color-convert": "^1.9.0" |
| | | } |
| | | }, |
| | | "argparse": { |
| | | "version": "1.0.10", |
| | | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", |
| | | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", |
| | | "dev": true, |
| | | "requires": { |
| | | "sprintf-js": "~1.0.2" |
| | | } |
| | | }, |
| | | "array-flatten": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", |
| | | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" |
| | | }, |
| | | "asn1": { |
| | | "version": "0.2.4", |
| | | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", |
| | | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", |
| | | "requires": { |
| | | "safer-buffer": "~2.1.0" |
| | | } |
| | | }, |
| | | "assert-plus": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", |
| | | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" |
| | | }, |
| | | "astral-regex": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", |
| | | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", |
| | | "dev": true |
| | | }, |
| | | "asynckit": { |
| | | "version": "0.4.0", |
| | | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", |
| | | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" |
| | | }, |
| | | "aws-sign2": { |
| | | "version": "0.7.0", |
| | | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", |
| | | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" |
| | | }, |
| | | "aws4": { |
| | | "version": "1.9.1", |
| | | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", |
| | | "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" |
| | | }, |
| | | "balanced-match": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", |
| | | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", |
| | | "dev": true |
| | | }, |
| | | "bcrypt-pbkdf": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", |
| | | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", |
| | | "requires": { |
| | | "tweetnacl": "^0.14.3" |
| | | } |
| | | }, |
| | | "body-parser": { |
| | | "version": "1.19.0", |
| | | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", |
| | | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", |
| | | "requires": { |
| | | "bytes": "3.1.0", |
| | | "content-type": "~1.0.4", |
| | | "debug": "2.6.9", |
| | | "depd": "~1.1.2", |
| | | "http-errors": "1.7.2", |
| | | "iconv-lite": "0.4.24", |
| | | "on-finished": "~2.3.0", |
| | | "qs": "6.7.0", |
| | | "raw-body": "2.4.0", |
| | | "type-is": "~1.6.17" |
| | | } |
| | | }, |
| | | "brace-expansion": { |
| | | "version": "1.1.11", |
| | | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |
| | | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "balanced-match": "^1.0.0", |
| | | "concat-map": "0.0.1" |
| | | } |
| | | }, |
| | | "bytes": { |
| | | "version": "3.1.0", |
| | | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", |
| | | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" |
| | | }, |
| | | "callsites": { |
| | | "version": "3.1.0", |
| | | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", |
| | | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", |
| | | "dev": true |
| | | }, |
| | | "caseless": { |
| | | "version": "0.12.0", |
| | | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", |
| | | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" |
| | | }, |
| | | "chalk": { |
| | | "version": "2.4.2", |
| | | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", |
| | | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ansi-styles": "^3.2.1", |
| | | "escape-string-regexp": "^1.0.5", |
| | | "supports-color": "^5.3.0" |
| | | } |
| | | }, |
| | | "chardet": { |
| | | "version": "0.7.0", |
| | | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", |
| | | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", |
| | | "dev": true |
| | | }, |
| | | "cli-cursor": { |
| | | "version": "3.1.0", |
| | | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", |
| | | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", |
| | | "dev": true, |
| | | "requires": { |
| | | "restore-cursor": "^3.1.0" |
| | | } |
| | | }, |
| | | "cli-width": { |
| | | "version": "2.2.1", |
| | | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", |
| | | "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", |
| | | "dev": true |
| | | }, |
| | | "color-convert": { |
| | | "version": "1.9.3", |
| | | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", |
| | | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", |
| | | "dev": true, |
| | | "requires": { |
| | | "color-name": "1.1.3" |
| | | } |
| | | }, |
| | | "color-name": { |
| | | "version": "1.1.3", |
| | | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", |
| | | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", |
| | | "dev": true |
| | | }, |
| | | "combined-stream": { |
| | | "version": "1.0.8", |
| | | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", |
| | | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", |
| | | "requires": { |
| | | "delayed-stream": "~1.0.0" |
| | | } |
| | | }, |
| | | "concat-map": { |
| | | "version": "0.0.1", |
| | | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", |
| | | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", |
| | | "dev": true |
| | | }, |
| | | "content-disposition": { |
| | | "version": "0.5.3", |
| | | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", |
| | | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", |
| | | "requires": { |
| | | "safe-buffer": "5.1.2" |
| | | } |
| | | }, |
| | | "content-type": { |
| | | "version": "1.0.4", |
| | | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", |
| | | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" |
| | | }, |
| | | "cookie": { |
| | | "version": "0.4.0", |
| | | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", |
| | | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" |
| | | }, |
| | | "cookie-signature": { |
| | | "version": "1.0.6", |
| | | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", |
| | | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" |
| | | }, |
| | | "core-util-is": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", |
| | | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" |
| | | }, |
| | | "cross-spawn": { |
| | | "version": "6.0.5", |
| | | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", |
| | | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "nice-try": "^1.0.4", |
| | | "path-key": "^2.0.1", |
| | | "semver": "^5.5.0", |
| | | "shebang-command": "^1.2.0", |
| | | "which": "^1.2.9" |
| | | }, |
| | | "dependencies": { |
| | | "semver": { |
| | | "version": "5.7.1", |
| | | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", |
| | | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", |
| | | "dev": true |
| | | } |
| | | } |
| | | }, |
| | | "dashdash": { |
| | | "version": "1.14.1", |
| | | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", |
| | | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", |
| | | "requires": { |
| | | "assert-plus": "^1.0.0" |
| | | } |
| | | }, |
| | | "debug": { |
| | | "version": "2.6.9", |
| | | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", |
| | | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", |
| | | "requires": { |
| | | "ms": "2.0.0" |
| | | } |
| | | }, |
| | | "deep-is": { |
| | | "version": "0.1.3", |
| | | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", |
| | | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", |
| | | "dev": true |
| | | }, |
| | | "delayed-stream": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", |
| | | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" |
| | | }, |
| | | "depd": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", |
| | | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" |
| | | }, |
| | | "destroy": { |
| | | "version": "1.0.4", |
| | | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", |
| | | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" |
| | | }, |
| | | "doctrine": { |
| | | "version": "3.0.0", |
| | | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", |
| | | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", |
| | | "dev": true, |
| | | "requires": { |
| | | "esutils": "^2.0.2" |
| | | } |
| | | }, |
| | | "ecc-jsbn": { |
| | | "version": "0.1.2", |
| | | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", |
| | | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", |
| | | "requires": { |
| | | "jsbn": "~0.1.0", |
| | | "safer-buffer": "^2.1.0" |
| | | } |
| | | }, |
| | | "ee-first": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", |
| | | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" |
| | | }, |
| | | "emoji-regex": { |
| | | "version": "8.0.0", |
| | | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", |
| | | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", |
| | | "dev": true |
| | | }, |
| | | "encodeurl": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", |
| | | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" |
| | | }, |
| | | "escape-html": { |
| | | "version": "1.0.3", |
| | | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", |
| | | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" |
| | | }, |
| | | "escape-string-regexp": { |
| | | "version": "1.0.5", |
| | | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", |
| | | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", |
| | | "dev": true |
| | | }, |
| | | "eslint": { |
| | | "version": "6.8.0", |
| | | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", |
| | | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", |
| | | "dev": true, |
| | | "requires": { |
| | | "@babel/code-frame": "^7.0.0", |
| | | "ajv": "^6.10.0", |
| | | "chalk": "^2.1.0", |
| | | "cross-spawn": "^6.0.5", |
| | | "debug": "^4.0.1", |
| | | "doctrine": "^3.0.0", |
| | | "eslint-scope": "^5.0.0", |
| | | "eslint-utils": "^1.4.3", |
| | | "eslint-visitor-keys": "^1.1.0", |
| | | "espree": "^6.1.2", |
| | | "esquery": "^1.0.1", |
| | | "esutils": "^2.0.2", |
| | | "file-entry-cache": "^5.0.1", |
| | | "functional-red-black-tree": "^1.0.1", |
| | | "glob-parent": "^5.0.0", |
| | | "globals": "^12.1.0", |
| | | "ignore": "^4.0.6", |
| | | "import-fresh": "^3.0.0", |
| | | "imurmurhash": "^0.1.4", |
| | | "inquirer": "^7.0.0", |
| | | "is-glob": "^4.0.0", |
| | | "js-yaml": "^3.13.1", |
| | | "json-stable-stringify-without-jsonify": "^1.0.1", |
| | | "levn": "^0.3.0", |
| | | "lodash": "^4.17.14", |
| | | "minimatch": "^3.0.4", |
| | | "mkdirp": "^0.5.1", |
| | | "natural-compare": "^1.4.0", |
| | | "optionator": "^0.8.3", |
| | | "progress": "^2.0.0", |
| | | "regexpp": "^2.0.1", |
| | | "semver": "^6.1.2", |
| | | "strip-ansi": "^5.2.0", |
| | | "strip-json-comments": "^3.0.1", |
| | | "table": "^5.2.3", |
| | | "text-table": "^0.2.0", |
| | | "v8-compile-cache": "^2.0.3" |
| | | }, |
| | | "dependencies": { |
| | | "debug": { |
| | | "version": "4.1.1", |
| | | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", |
| | | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ms": "^2.1.1" |
| | | } |
| | | }, |
| | | "ms": { |
| | | "version": "2.1.2", |
| | | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", |
| | | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", |
| | | "dev": true |
| | | } |
| | | } |
| | | }, |
| | | "eslint-scope": { |
| | | "version": "5.0.0", |
| | | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", |
| | | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", |
| | | "dev": true, |
| | | "requires": { |
| | | "esrecurse": "^4.1.0", |
| | | "estraverse": "^4.1.1" |
| | | } |
| | | }, |
| | | "eslint-utils": { |
| | | "version": "1.4.3", |
| | | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", |
| | | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", |
| | | "dev": true, |
| | | "requires": { |
| | | "eslint-visitor-keys": "^1.1.0" |
| | | } |
| | | }, |
| | | "eslint-visitor-keys": { |
| | | "version": "1.1.0", |
| | | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", |
| | | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", |
| | | "dev": true |
| | | }, |
| | | "espree": { |
| | | "version": "6.2.1", |
| | | "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", |
| | | "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", |
| | | "dev": true, |
| | | "requires": { |
| | | "acorn": "^7.1.1", |
| | | "acorn-jsx": "^5.2.0", |
| | | "eslint-visitor-keys": "^1.1.0" |
| | | } |
| | | }, |
| | | "esprima": { |
| | | "version": "4.0.1", |
| | | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", |
| | | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", |
| | | "dev": true |
| | | }, |
| | | "esquery": { |
| | | "version": "1.3.1", |
| | | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", |
| | | "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "estraverse": "^5.1.0" |
| | | }, |
| | | "dependencies": { |
| | | "estraverse": { |
| | | "version": "5.1.0", |
| | | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", |
| | | "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", |
| | | "dev": true |
| | | } |
| | | } |
| | | }, |
| | | "esrecurse": { |
| | | "version": "4.2.1", |
| | | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", |
| | | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "estraverse": "^4.1.0" |
| | | } |
| | | }, |
| | | "estraverse": { |
| | | "version": "4.3.0", |
| | | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", |
| | | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", |
| | | "dev": true |
| | | }, |
| | | "esutils": { |
| | | "version": "2.0.3", |
| | | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", |
| | | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", |
| | | "dev": true |
| | | }, |
| | | "etag": { |
| | | "version": "1.8.1", |
| | | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", |
| | | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" |
| | | }, |
| | | "express": { |
| | | "version": "4.17.1", |
| | | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", |
| | | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", |
| | | "requires": { |
| | | "accepts": "~1.3.7", |
| | | "array-flatten": "1.1.1", |
| | | "body-parser": "1.19.0", |
| | | "content-disposition": "0.5.3", |
| | | "content-type": "~1.0.4", |
| | | "cookie": "0.4.0", |
| | | "cookie-signature": "1.0.6", |
| | | "debug": "2.6.9", |
| | | "depd": "~1.1.2", |
| | | "encodeurl": "~1.0.2", |
| | | "escape-html": "~1.0.3", |
| | | "etag": "~1.8.1", |
| | | "finalhandler": "~1.1.2", |
| | | "fresh": "0.5.2", |
| | | "merge-descriptors": "1.0.1", |
| | | "methods": "~1.1.2", |
| | | "on-finished": "~2.3.0", |
| | | "parseurl": "~1.3.3", |
| | | "path-to-regexp": "0.1.7", |
| | | "proxy-addr": "~2.0.5", |
| | | "qs": "6.7.0", |
| | | "range-parser": "~1.2.1", |
| | | "safe-buffer": "5.1.2", |
| | | "send": "0.17.1", |
| | | "serve-static": "1.14.1", |
| | | "setprototypeof": "1.1.1", |
| | | "statuses": "~1.5.0", |
| | | "type-is": "~1.6.18", |
| | | "utils-merge": "1.0.1", |
| | | "vary": "~1.1.2" |
| | | } |
| | | }, |
| | | "extend": { |
| | | "version": "3.0.2", |
| | | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", |
| | | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" |
| | | }, |
| | | "external-editor": { |
| | | "version": "3.1.0", |
| | | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", |
| | | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", |
| | | "dev": true, |
| | | "requires": { |
| | | "chardet": "^0.7.0", |
| | | "iconv-lite": "^0.4.24", |
| | | "tmp": "^0.0.33" |
| | | } |
| | | }, |
| | | "extsprintf": { |
| | | "version": "1.3.0", |
| | | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", |
| | | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" |
| | | }, |
| | | "fast-deep-equal": { |
| | | "version": "3.1.1", |
| | | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", |
| | | "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" |
| | | }, |
| | | "fast-json-stable-stringify": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", |
| | | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" |
| | | }, |
| | | "fast-levenshtein": { |
| | | "version": "2.0.6", |
| | | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", |
| | | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", |
| | | "dev": true |
| | | }, |
| | | "figures": { |
| | | "version": "3.2.0", |
| | | "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", |
| | | "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", |
| | | "dev": true, |
| | | "requires": { |
| | | "escape-string-regexp": "^1.0.5" |
| | | } |
| | | }, |
| | | "file-entry-cache": { |
| | | "version": "5.0.1", |
| | | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", |
| | | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", |
| | | "dev": true, |
| | | "requires": { |
| | | "flat-cache": "^2.0.1" |
| | | } |
| | | }, |
| | | "finalhandler": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", |
| | | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", |
| | | "requires": { |
| | | "debug": "2.6.9", |
| | | "encodeurl": "~1.0.2", |
| | | "escape-html": "~1.0.3", |
| | | "on-finished": "~2.3.0", |
| | | "parseurl": "~1.3.3", |
| | | "statuses": "~1.5.0", |
| | | "unpipe": "~1.0.0" |
| | | } |
| | | }, |
| | | "flat-cache": { |
| | | "version": "2.0.1", |
| | | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", |
| | | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "flatted": "^2.0.0", |
| | | "rimraf": "2.6.3", |
| | | "write": "1.0.3" |
| | | } |
| | | }, |
| | | "flatted": { |
| | | "version": "2.0.2", |
| | | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", |
| | | "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", |
| | | "dev": true |
| | | }, |
| | | "forever-agent": { |
| | | "version": "0.6.1", |
| | | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", |
| | | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" |
| | | }, |
| | | "form-data": { |
| | | "version": "2.3.3", |
| | | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", |
| | | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", |
| | | "requires": { |
| | | "asynckit": "^0.4.0", |
| | | "combined-stream": "^1.0.6", |
| | | "mime-types": "^2.1.12" |
| | | } |
| | | }, |
| | | "forwarded": { |
| | | "version": "0.1.2", |
| | | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", |
| | | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" |
| | | }, |
| | | "fresh": { |
| | | "version": "0.5.2", |
| | | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", |
| | | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" |
| | | }, |
| | | "fs.realpath": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", |
| | | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", |
| | | "dev": true |
| | | }, |
| | | "functional-red-black-tree": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", |
| | | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", |
| | | "dev": true |
| | | }, |
| | | "getpass": { |
| | | "version": "0.1.7", |
| | | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", |
| | | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", |
| | | "requires": { |
| | | "assert-plus": "^1.0.0" |
| | | } |
| | | }, |
| | | "glob": { |
| | | "version": "7.1.6", |
| | | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", |
| | | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "fs.realpath": "^1.0.0", |
| | | "inflight": "^1.0.4", |
| | | "inherits": "2", |
| | | "minimatch": "^3.0.4", |
| | | "once": "^1.3.0", |
| | | "path-is-absolute": "^1.0.0" |
| | | } |
| | | }, |
| | | "glob-parent": { |
| | | "version": "5.1.1", |
| | | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", |
| | | "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "is-glob": "^4.0.1" |
| | | } |
| | | }, |
| | | "globals": { |
| | | "version": "12.4.0", |
| | | "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", |
| | | "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", |
| | | "dev": true, |
| | | "requires": { |
| | | "type-fest": "^0.8.1" |
| | | } |
| | | }, |
| | | "har-schema": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", |
| | | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" |
| | | }, |
| | | "har-validator": { |
| | | "version": "5.1.3", |
| | | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", |
| | | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", |
| | | "requires": { |
| | | "ajv": "^6.5.5", |
| | | "har-schema": "^2.0.0" |
| | | } |
| | | }, |
| | | "has-flag": { |
| | | "version": "3.0.0", |
| | | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", |
| | | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", |
| | | "dev": true |
| | | }, |
| | | "http-errors": { |
| | | "version": "1.7.2", |
| | | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", |
| | | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", |
| | | "requires": { |
| | | "depd": "~1.1.2", |
| | | "inherits": "2.0.3", |
| | | "setprototypeof": "1.1.1", |
| | | "statuses": ">= 1.5.0 < 2", |
| | | "toidentifier": "1.0.0" |
| | | } |
| | | }, |
| | | "http-signature": { |
| | | "version": "1.2.0", |
| | | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", |
| | | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", |
| | | "requires": { |
| | | "assert-plus": "^1.0.0", |
| | | "jsprim": "^1.2.2", |
| | | "sshpk": "^1.7.0" |
| | | } |
| | | }, |
| | | "iconv-lite": { |
| | | "version": "0.4.24", |
| | | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", |
| | | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", |
| | | "requires": { |
| | | "safer-buffer": ">= 2.1.2 < 3" |
| | | } |
| | | }, |
| | | "ignore": { |
| | | "version": "4.0.6", |
| | | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", |
| | | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", |
| | | "dev": true |
| | | }, |
| | | "import-fresh": { |
| | | "version": "3.2.1", |
| | | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", |
| | | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "parent-module": "^1.0.0", |
| | | "resolve-from": "^4.0.0" |
| | | } |
| | | }, |
| | | "imurmurhash": { |
| | | "version": "0.1.4", |
| | | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", |
| | | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", |
| | | "dev": true |
| | | }, |
| | | "inflight": { |
| | | "version": "1.0.6", |
| | | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", |
| | | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", |
| | | "dev": true, |
| | | "requires": { |
| | | "once": "^1.3.0", |
| | | "wrappy": "1" |
| | | } |
| | | }, |
| | | "inherits": { |
| | | "version": "2.0.3", |
| | | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", |
| | | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" |
| | | }, |
| | | "inquirer": { |
| | | "version": "7.1.0", |
| | | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", |
| | | "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ansi-escapes": "^4.2.1", |
| | | "chalk": "^3.0.0", |
| | | "cli-cursor": "^3.1.0", |
| | | "cli-width": "^2.0.0", |
| | | "external-editor": "^3.0.3", |
| | | "figures": "^3.0.0", |
| | | "lodash": "^4.17.15", |
| | | "mute-stream": "0.0.8", |
| | | "run-async": "^2.4.0", |
| | | "rxjs": "^6.5.3", |
| | | "string-width": "^4.1.0", |
| | | "strip-ansi": "^6.0.0", |
| | | "through": "^2.3.6" |
| | | }, |
| | | "dependencies": { |
| | | "ansi-styles": { |
| | | "version": "4.2.1", |
| | | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", |
| | | "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "@types/color-name": "^1.1.1", |
| | | "color-convert": "^2.0.1" |
| | | } |
| | | }, |
| | | "chalk": { |
| | | "version": "3.0.0", |
| | | "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", |
| | | "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ansi-styles": "^4.1.0", |
| | | "supports-color": "^7.1.0" |
| | | } |
| | | }, |
| | | "color-convert": { |
| | | "version": "2.0.1", |
| | | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", |
| | | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "color-name": "~1.1.4" |
| | | } |
| | | }, |
| | | "color-name": { |
| | | "version": "1.1.4", |
| | | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", |
| | | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", |
| | | "dev": true |
| | | }, |
| | | "has-flag": { |
| | | "version": "4.0.0", |
| | | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", |
| | | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", |
| | | "dev": true |
| | | }, |
| | | "strip-ansi": { |
| | | "version": "6.0.0", |
| | | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", |
| | | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ansi-regex": "^5.0.0" |
| | | } |
| | | }, |
| | | "supports-color": { |
| | | "version": "7.1.0", |
| | | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", |
| | | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", |
| | | "dev": true, |
| | | "requires": { |
| | | "has-flag": "^4.0.0" |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | "ipaddr.js": { |
| | | "version": "1.9.1", |
| | | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", |
| | | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" |
| | | }, |
| | | "is-extglob": { |
| | | "version": "2.1.1", |
| | | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", |
| | | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", |
| | | "dev": true |
| | | }, |
| | | "is-fullwidth-code-point": { |
| | | "version": "3.0.0", |
| | | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", |
| | | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", |
| | | "dev": true |
| | | }, |
| | | "is-glob": { |
| | | "version": "4.0.1", |
| | | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", |
| | | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", |
| | | "dev": true, |
| | | "requires": { |
| | | "is-extglob": "^2.1.1" |
| | | } |
| | | }, |
| | | "is-typedarray": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", |
| | | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" |
| | | }, |
| | | "isexe": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", |
| | | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", |
| | | "dev": true |
| | | }, |
| | | "isstream": { |
| | | "version": "0.1.2", |
| | | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", |
| | | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" |
| | | }, |
| | | "js-tokens": { |
| | | "version": "4.0.0", |
| | | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", |
| | | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", |
| | | "dev": true |
| | | }, |
| | | "js-yaml": { |
| | | "version": "3.13.1", |
| | | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", |
| | | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", |
| | | "dev": true, |
| | | "requires": { |
| | | "argparse": "^1.0.7", |
| | | "esprima": "^4.0.0" |
| | | } |
| | | }, |
| | | "jsbn": { |
| | | "version": "0.1.1", |
| | | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", |
| | | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" |
| | | }, |
| | | "json-schema": { |
| | | "version": "0.2.3", |
| | | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", |
| | | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" |
| | | }, |
| | | "json-schema-traverse": { |
| | | "version": "0.4.1", |
| | | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", |
| | | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" |
| | | }, |
| | | "json-stable-stringify-without-jsonify": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", |
| | | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", |
| | | "dev": true |
| | | }, |
| | | "json-stringify-safe": { |
| | | "version": "5.0.1", |
| | | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", |
| | | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" |
| | | }, |
| | | "jsprim": { |
| | | "version": "1.4.1", |
| | | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", |
| | | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", |
| | | "requires": { |
| | | "assert-plus": "1.0.0", |
| | | "extsprintf": "1.3.0", |
| | | "json-schema": "0.2.3", |
| | | "verror": "1.10.0" |
| | | } |
| | | }, |
| | | "levn": { |
| | | "version": "0.3.0", |
| | | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", |
| | | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", |
| | | "dev": true, |
| | | "requires": { |
| | | "prelude-ls": "~1.1.2", |
| | | "type-check": "~0.3.2" |
| | | } |
| | | }, |
| | | "lodash": { |
| | | "version": "4.17.15", |
| | | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", |
| | | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", |
| | | "dev": true |
| | | }, |
| | | "media-typer": { |
| | | "version": "0.3.0", |
| | | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", |
| | | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" |
| | | }, |
| | | "merge-descriptors": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", |
| | | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" |
| | | }, |
| | | "methods": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", |
| | | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" |
| | | }, |
| | | "mime": { |
| | | "version": "1.6.0", |
| | | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", |
| | | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" |
| | | }, |
| | | "mime-db": { |
| | | "version": "1.44.0", |
| | | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", |
| | | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" |
| | | }, |
| | | "mime-types": { |
| | | "version": "2.1.27", |
| | | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", |
| | | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", |
| | | "requires": { |
| | | "mime-db": "1.44.0" |
| | | } |
| | | }, |
| | | "mimic-fn": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", |
| | | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", |
| | | "dev": true |
| | | }, |
| | | "minimatch": { |
| | | "version": "3.0.4", |
| | | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", |
| | | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "brace-expansion": "^1.1.7" |
| | | } |
| | | }, |
| | | "minimist": { |
| | | "version": "1.2.5", |
| | | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", |
| | | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", |
| | | "dev": true |
| | | }, |
| | | "mkdirp": { |
| | | "version": "0.5.5", |
| | | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", |
| | | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "minimist": "^1.2.5" |
| | | } |
| | | }, |
| | | "ms": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |
| | | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" |
| | | }, |
| | | "mute-stream": { |
| | | "version": "0.0.8", |
| | | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", |
| | | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", |
| | | "dev": true |
| | | }, |
| | | "natural-compare": { |
| | | "version": "1.4.0", |
| | | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", |
| | | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", |
| | | "dev": true |
| | | }, |
| | | "negotiator": { |
| | | "version": "0.6.2", |
| | | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", |
| | | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" |
| | | }, |
| | | "nice-try": { |
| | | "version": "1.0.5", |
| | | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", |
| | | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", |
| | | "dev": true |
| | | }, |
| | | "oauth-sign": { |
| | | "version": "0.9.0", |
| | | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", |
| | | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" |
| | | }, |
| | | "on-finished": { |
| | | "version": "2.3.0", |
| | | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", |
| | | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", |
| | | "requires": { |
| | | "ee-first": "1.1.1" |
| | | } |
| | | }, |
| | | "once": { |
| | | "version": "1.4.0", |
| | | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", |
| | | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", |
| | | "dev": true, |
| | | "requires": { |
| | | "wrappy": "1" |
| | | } |
| | | }, |
| | | "onetime": { |
| | | "version": "5.1.0", |
| | | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", |
| | | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", |
| | | "dev": true, |
| | | "requires": { |
| | | "mimic-fn": "^2.1.0" |
| | | } |
| | | }, |
| | | "optionator": { |
| | | "version": "0.8.3", |
| | | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", |
| | | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "deep-is": "~0.1.3", |
| | | "fast-levenshtein": "~2.0.6", |
| | | "levn": "~0.3.0", |
| | | "prelude-ls": "~1.1.2", |
| | | "type-check": "~0.3.2", |
| | | "word-wrap": "~1.2.3" |
| | | } |
| | | }, |
| | | "os-tmpdir": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", |
| | | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", |
| | | "dev": true |
| | | }, |
| | | "parent-module": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", |
| | | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", |
| | | "dev": true, |
| | | "requires": { |
| | | "callsites": "^3.0.0" |
| | | } |
| | | }, |
| | | "parseurl": { |
| | | "version": "1.3.3", |
| | | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", |
| | | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" |
| | | }, |
| | | "path-is-absolute": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", |
| | | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", |
| | | "dev": true |
| | | }, |
| | | "path-key": { |
| | | "version": "2.0.1", |
| | | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", |
| | | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", |
| | | "dev": true |
| | | }, |
| | | "path-to-regexp": { |
| | | "version": "0.1.7", |
| | | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", |
| | | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" |
| | | }, |
| | | "performance-now": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", |
| | | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" |
| | | }, |
| | | "prelude-ls": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", |
| | | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", |
| | | "dev": true |
| | | }, |
| | | "progress": { |
| | | "version": "2.0.3", |
| | | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", |
| | | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", |
| | | "dev": true |
| | | }, |
| | | "proxy-addr": { |
| | | "version": "2.0.6", |
| | | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", |
| | | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", |
| | | "requires": { |
| | | "forwarded": "~0.1.2", |
| | | "ipaddr.js": "1.9.1" |
| | | } |
| | | }, |
| | | "psl": { |
| | | "version": "1.8.0", |
| | | "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", |
| | | "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" |
| | | }, |
| | | "punycode": { |
| | | "version": "2.1.1", |
| | | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", |
| | | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" |
| | | }, |
| | | "qs": { |
| | | "version": "6.7.0", |
| | | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", |
| | | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" |
| | | }, |
| | | "range-parser": { |
| | | "version": "1.2.1", |
| | | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", |
| | | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" |
| | | }, |
| | | "raw-body": { |
| | | "version": "2.4.0", |
| | | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", |
| | | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", |
| | | "requires": { |
| | | "bytes": "3.1.0", |
| | | "http-errors": "1.7.2", |
| | | "iconv-lite": "0.4.24", |
| | | "unpipe": "1.0.0" |
| | | } |
| | | }, |
| | | "regexpp": { |
| | | "version": "2.0.1", |
| | | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", |
| | | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", |
| | | "dev": true |
| | | }, |
| | | "request": { |
| | | "version": "2.88.2", |
| | | "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", |
| | | "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", |
| | | "requires": { |
| | | "aws-sign2": "~0.7.0", |
| | | "aws4": "^1.8.0", |
| | | "caseless": "~0.12.0", |
| | | "combined-stream": "~1.0.6", |
| | | "extend": "~3.0.2", |
| | | "forever-agent": "~0.6.1", |
| | | "form-data": "~2.3.2", |
| | | "har-validator": "~5.1.3", |
| | | "http-signature": "~1.2.0", |
| | | "is-typedarray": "~1.0.0", |
| | | "isstream": "~0.1.2", |
| | | "json-stringify-safe": "~5.0.1", |
| | | "mime-types": "~2.1.19", |
| | | "oauth-sign": "~0.9.0", |
| | | "performance-now": "^2.1.0", |
| | | "qs": "~6.5.2", |
| | | "safe-buffer": "^5.1.2", |
| | | "tough-cookie": "~2.5.0", |
| | | "tunnel-agent": "^0.6.0", |
| | | "uuid": "^3.3.2" |
| | | }, |
| | | "dependencies": { |
| | | "qs": { |
| | | "version": "6.5.2", |
| | | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", |
| | | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" |
| | | } |
| | | } |
| | | }, |
| | | "resolve-from": { |
| | | "version": "4.0.0", |
| | | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", |
| | | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", |
| | | "dev": true |
| | | }, |
| | | "restore-cursor": { |
| | | "version": "3.1.0", |
| | | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", |
| | | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "onetime": "^5.1.0", |
| | | "signal-exit": "^3.0.2" |
| | | } |
| | | }, |
| | | "rimraf": { |
| | | "version": "2.6.3", |
| | | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", |
| | | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "glob": "^7.1.3" |
| | | } |
| | | }, |
| | | "run-async": { |
| | | "version": "2.4.1", |
| | | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", |
| | | "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", |
| | | "dev": true |
| | | }, |
| | | "rxjs": { |
| | | "version": "6.5.5", |
| | | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", |
| | | "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "tslib": "^1.9.0" |
| | | } |
| | | }, |
| | | "safe-buffer": { |
| | | "version": "5.1.2", |
| | | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |
| | | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |
| | | }, |
| | | "safer-buffer": { |
| | | "version": "2.1.2", |
| | | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
| | | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" |
| | | }, |
| | | "semver": { |
| | | "version": "6.3.0", |
| | | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", |
| | | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", |
| | | "dev": true |
| | | }, |
| | | "send": { |
| | | "version": "0.17.1", |
| | | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", |
| | | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", |
| | | "requires": { |
| | | "debug": "2.6.9", |
| | | "depd": "~1.1.2", |
| | | "destroy": "~1.0.4", |
| | | "encodeurl": "~1.0.2", |
| | | "escape-html": "~1.0.3", |
| | | "etag": "~1.8.1", |
| | | "fresh": "0.5.2", |
| | | "http-errors": "~1.7.2", |
| | | "mime": "1.6.0", |
| | | "ms": "2.1.1", |
| | | "on-finished": "~2.3.0", |
| | | "range-parser": "~1.2.1", |
| | | "statuses": "~1.5.0" |
| | | }, |
| | | "dependencies": { |
| | | "ms": { |
| | | "version": "2.1.1", |
| | | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", |
| | | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" |
| | | } |
| | | } |
| | | }, |
| | | "serve-static": { |
| | | "version": "1.14.1", |
| | | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", |
| | | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", |
| | | "requires": { |
| | | "encodeurl": "~1.0.2", |
| | | "escape-html": "~1.0.3", |
| | | "parseurl": "~1.3.3", |
| | | "send": "0.17.1" |
| | | } |
| | | }, |
| | | "setprototypeof": { |
| | | "version": "1.1.1", |
| | | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", |
| | | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" |
| | | }, |
| | | "shebang-command": { |
| | | "version": "1.2.0", |
| | | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", |
| | | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", |
| | | "dev": true, |
| | | "requires": { |
| | | "shebang-regex": "^1.0.0" |
| | | } |
| | | }, |
| | | "shebang-regex": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", |
| | | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", |
| | | "dev": true |
| | | }, |
| | | "signal-exit": { |
| | | "version": "3.0.3", |
| | | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", |
| | | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", |
| | | "dev": true |
| | | }, |
| | | "slice-ansi": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", |
| | | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ansi-styles": "^3.2.0", |
| | | "astral-regex": "^1.0.0", |
| | | "is-fullwidth-code-point": "^2.0.0" |
| | | }, |
| | | "dependencies": { |
| | | "is-fullwidth-code-point": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", |
| | | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", |
| | | "dev": true |
| | | } |
| | | } |
| | | }, |
| | | "sprintf-js": { |
| | | "version": "1.0.3", |
| | | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", |
| | | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", |
| | | "dev": true |
| | | }, |
| | | "sshpk": { |
| | | "version": "1.16.1", |
| | | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", |
| | | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", |
| | | "requires": { |
| | | "asn1": "~0.2.3", |
| | | "assert-plus": "^1.0.0", |
| | | "bcrypt-pbkdf": "^1.0.0", |
| | | "dashdash": "^1.12.0", |
| | | "ecc-jsbn": "~0.1.1", |
| | | "getpass": "^0.1.1", |
| | | "jsbn": "~0.1.0", |
| | | "safer-buffer": "^2.0.2", |
| | | "tweetnacl": "~0.14.0" |
| | | } |
| | | }, |
| | | "statuses": { |
| | | "version": "1.5.0", |
| | | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", |
| | | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" |
| | | }, |
| | | "string-width": { |
| | | "version": "4.2.0", |
| | | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", |
| | | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", |
| | | "dev": true, |
| | | "requires": { |
| | | "emoji-regex": "^8.0.0", |
| | | "is-fullwidth-code-point": "^3.0.0", |
| | | "strip-ansi": "^6.0.0" |
| | | }, |
| | | "dependencies": { |
| | | "strip-ansi": { |
| | | "version": "6.0.0", |
| | | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", |
| | | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ansi-regex": "^5.0.0" |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | "strip-ansi": { |
| | | "version": "5.2.0", |
| | | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", |
| | | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ansi-regex": "^4.1.0" |
| | | }, |
| | | "dependencies": { |
| | | "ansi-regex": { |
| | | "version": "4.1.0", |
| | | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", |
| | | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", |
| | | "dev": true |
| | | } |
| | | } |
| | | }, |
| | | "strip-json-comments": { |
| | | "version": "3.1.0", |
| | | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", |
| | | "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", |
| | | "dev": true |
| | | }, |
| | | "supports-color": { |
| | | "version": "5.5.0", |
| | | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", |
| | | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", |
| | | "dev": true, |
| | | "requires": { |
| | | "has-flag": "^3.0.0" |
| | | } |
| | | }, |
| | | "table": { |
| | | "version": "5.4.6", |
| | | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", |
| | | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", |
| | | "dev": true, |
| | | "requires": { |
| | | "ajv": "^6.10.2", |
| | | "lodash": "^4.17.14", |
| | | "slice-ansi": "^2.1.0", |
| | | "string-width": "^3.0.0" |
| | | }, |
| | | "dependencies": { |
| | | "emoji-regex": { |
| | | "version": "7.0.3", |
| | | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", |
| | | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", |
| | | "dev": true |
| | | }, |
| | | "is-fullwidth-code-point": { |
| | | "version": "2.0.0", |
| | | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", |
| | | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", |
| | | "dev": true |
| | | }, |
| | | "string-width": { |
| | | "version": "3.1.0", |
| | | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", |
| | | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", |
| | | "dev": true, |
| | | "requires": { |
| | | "emoji-regex": "^7.0.1", |
| | | "is-fullwidth-code-point": "^2.0.0", |
| | | "strip-ansi": "^5.1.0" |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | "text-table": { |
| | | "version": "0.2.0", |
| | | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", |
| | | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", |
| | | "dev": true |
| | | }, |
| | | "through": { |
| | | "version": "2.3.8", |
| | | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", |
| | | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", |
| | | "dev": true |
| | | }, |
| | | "tmp": { |
| | | "version": "0.0.33", |
| | | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", |
| | | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", |
| | | "dev": true, |
| | | "requires": { |
| | | "os-tmpdir": "~1.0.2" |
| | | } |
| | | }, |
| | | "toidentifier": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", |
| | | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" |
| | | }, |
| | | "tough-cookie": { |
| | | "version": "2.5.0", |
| | | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", |
| | | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", |
| | | "requires": { |
| | | "psl": "^1.1.28", |
| | | "punycode": "^2.1.1" |
| | | } |
| | | }, |
| | | "tslib": { |
| | | "version": "1.11.2", |
| | | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.2.tgz", |
| | | "integrity": "sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==", |
| | | "dev": true |
| | | }, |
| | | "tunnel-agent": { |
| | | "version": "0.6.0", |
| | | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", |
| | | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", |
| | | "requires": { |
| | | "safe-buffer": "^5.0.1" |
| | | } |
| | | }, |
| | | "tweetnacl": { |
| | | "version": "0.14.5", |
| | | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", |
| | | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" |
| | | }, |
| | | "type-check": { |
| | | "version": "0.3.2", |
| | | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", |
| | | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", |
| | | "dev": true, |
| | | "requires": { |
| | | "prelude-ls": "~1.1.2" |
| | | } |
| | | }, |
| | | "type-fest": { |
| | | "version": "0.8.1", |
| | | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", |
| | | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", |
| | | "dev": true |
| | | }, |
| | | "type-is": { |
| | | "version": "1.6.18", |
| | | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", |
| | | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", |
| | | "requires": { |
| | | "media-typer": "0.3.0", |
| | | "mime-types": "~2.1.24" |
| | | } |
| | | }, |
| | | "unpipe": { |
| | | "version": "1.0.0", |
| | | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", |
| | | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" |
| | | }, |
| | | "uri-js": { |
| | | "version": "4.2.2", |
| | | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", |
| | | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", |
| | | "requires": { |
| | | "punycode": "^2.1.0" |
| | | } |
| | | }, |
| | | "utils-merge": { |
| | | "version": "1.0.1", |
| | | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", |
| | | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" |
| | | }, |
| | | "uuid": { |
| | | "version": "3.4.0", |
| | | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", |
| | | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" |
| | | }, |
| | | "v8-compile-cache": { |
| | | "version": "2.1.0", |
| | | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", |
| | | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", |
| | | "dev": true |
| | | }, |
| | | "vary": { |
| | | "version": "1.1.2", |
| | | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", |
| | | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" |
| | | }, |
| | | "verror": { |
| | | "version": "1.10.0", |
| | | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", |
| | | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", |
| | | "requires": { |
| | | "assert-plus": "^1.0.0", |
| | | "core-util-is": "1.0.2", |
| | | "extsprintf": "^1.2.0" |
| | | } |
| | | }, |
| | | "which": { |
| | | "version": "1.3.1", |
| | | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", |
| | | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "isexe": "^2.0.0" |
| | | } |
| | | }, |
| | | "word-wrap": { |
| | | "version": "1.2.3", |
| | | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", |
| | | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", |
| | | "dev": true |
| | | }, |
| | | "wrappy": { |
| | | "version": "1.0.2", |
| | | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", |
| | | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", |
| | | "dev": true |
| | | }, |
| | | "write": { |
| | | "version": "1.0.3", |
| | | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", |
| | | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", |
| | | "dev": true, |
| | | "requires": { |
| | | "mkdirp": "^0.5.1" |
| | | } |
| | | } |
| | | } |
| | | } |
New file |
| | |
| | | { |
| | | "name": "backend", |
| | | "version": "1.0.0", |
| | | "description": "Backend for the Connectivity Checker frontend", |
| | | "main": "index.js", |
| | | "author": "Marek Czernek", |
| | | "license": "MIT", |
| | | "scripts": { |
| | | "start": "node index.js", |
| | | "lint": "eslint .", |
| | | "lint:fix": "eslint . --fix" |
| | | }, |
| | | "dependencies": { |
| | | "express": "^4.17.1", |
| | | "request": "^2.88.2" |
| | | }, |
| | | "devDependencies": { |
| | | "eslint": "^6.8.0" |
| | | } |
| | | } |
New file |
| | |
| | | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. |
| | | # yarn lockfile v1 |
| | | |
| | | |
| | | "@babel/code-frame@^7.0.0": |
| | | version "7.8.3" |
| | | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" |
| | | integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== |
| | | dependencies: |
| | | "@babel/highlight" "^7.8.3" |
| | | |
| | | "@babel/helper-validator-identifier@^7.9.0": |
| | | version "7.9.5" |
| | | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" |
| | | integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== |
| | | |
| | | "@babel/highlight@^7.8.3": |
| | | version "7.9.0" |
| | | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" |
| | | integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== |
| | | dependencies: |
| | | "@babel/helper-validator-identifier" "^7.9.0" |
| | | chalk "^2.0.0" |
| | | js-tokens "^4.0.0" |
| | | |
| | | "@types/color-name@^1.1.1": |
| | | version "1.1.1" |
| | | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" |
| | | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== |
| | | |
| | | accepts@~1.3.7: |
| | | version "1.3.7" |
| | | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" |
| | | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== |
| | | dependencies: |
| | | mime-types "~2.1.24" |
| | | negotiator "0.6.2" |
| | | |
| | | acorn-jsx@^5.2.0: |
| | | version "5.2.0" |
| | | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" |
| | | integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== |
| | | |
| | | acorn@^7.1.1: |
| | | version "7.1.1" |
| | | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" |
| | | integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== |
| | | |
| | | ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: |
| | | version "6.12.2" |
| | | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" |
| | | integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== |
| | | dependencies: |
| | | fast-deep-equal "^3.1.1" |
| | | fast-json-stable-stringify "^2.0.0" |
| | | json-schema-traverse "^0.4.1" |
| | | uri-js "^4.2.2" |
| | | |
| | | ansi-escapes@^4.2.1: |
| | | version "4.3.1" |
| | | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" |
| | | integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== |
| | | dependencies: |
| | | type-fest "^0.11.0" |
| | | |
| | | ansi-regex@^4.1.0: |
| | | version "4.1.0" |
| | | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" |
| | | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== |
| | | |
| | | ansi-regex@^5.0.0: |
| | | version "5.0.0" |
| | | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" |
| | | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== |
| | | |
| | | ansi-styles@^3.2.0, ansi-styles@^3.2.1: |
| | | version "3.2.1" |
| | | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" |
| | | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== |
| | | dependencies: |
| | | color-convert "^1.9.0" |
| | | |
| | | ansi-styles@^4.1.0: |
| | | version "4.2.1" |
| | | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" |
| | | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== |
| | | dependencies: |
| | | "@types/color-name" "^1.1.1" |
| | | color-convert "^2.0.1" |
| | | |
| | | argparse@^1.0.7: |
| | | version "1.0.10" |
| | | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" |
| | | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== |
| | | dependencies: |
| | | sprintf-js "~1.0.2" |
| | | |
| | | array-flatten@1.1.1: |
| | | version "1.1.1" |
| | | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" |
| | | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= |
| | | |
| | | asn1@~0.2.3: |
| | | version "0.2.4" |
| | | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" |
| | | integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== |
| | | dependencies: |
| | | safer-buffer "~2.1.0" |
| | | |
| | | assert-plus@1.0.0, assert-plus@^1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" |
| | | integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= |
| | | |
| | | astral-regex@^1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" |
| | | integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== |
| | | |
| | | asynckit@^0.4.0: |
| | | version "0.4.0" |
| | | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" |
| | | integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= |
| | | |
| | | aws-sign2@~0.7.0: |
| | | version "0.7.0" |
| | | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" |
| | | integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= |
| | | |
| | | aws4@^1.8.0: |
| | | version "1.9.1" |
| | | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" |
| | | integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== |
| | | |
| | | balanced-match@^1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" |
| | | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= |
| | | |
| | | bcrypt-pbkdf@^1.0.0: |
| | | version "1.0.2" |
| | | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" |
| | | integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= |
| | | dependencies: |
| | | tweetnacl "^0.14.3" |
| | | |
| | | body-parser@1.19.0: |
| | | version "1.19.0" |
| | | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" |
| | | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== |
| | | dependencies: |
| | | bytes "3.1.0" |
| | | content-type "~1.0.4" |
| | | debug "2.6.9" |
| | | depd "~1.1.2" |
| | | http-errors "1.7.2" |
| | | iconv-lite "0.4.24" |
| | | on-finished "~2.3.0" |
| | | qs "6.7.0" |
| | | raw-body "2.4.0" |
| | | type-is "~1.6.17" |
| | | |
| | | brace-expansion@^1.1.7: |
| | | version "1.1.11" |
| | | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" |
| | | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== |
| | | dependencies: |
| | | balanced-match "^1.0.0" |
| | | concat-map "0.0.1" |
| | | |
| | | bytes@3.1.0: |
| | | version "3.1.0" |
| | | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" |
| | | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== |
| | | |
| | | callsites@^3.0.0: |
| | | version "3.1.0" |
| | | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" |
| | | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== |
| | | |
| | | caseless@~0.12.0: |
| | | version "0.12.0" |
| | | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" |
| | | integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= |
| | | |
| | | chalk@^2.0.0, chalk@^2.1.0: |
| | | version "2.4.2" |
| | | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" |
| | | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== |
| | | dependencies: |
| | | ansi-styles "^3.2.1" |
| | | escape-string-regexp "^1.0.5" |
| | | supports-color "^5.3.0" |
| | | |
| | | chalk@^3.0.0: |
| | | version "3.0.0" |
| | | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" |
| | | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== |
| | | dependencies: |
| | | ansi-styles "^4.1.0" |
| | | supports-color "^7.1.0" |
| | | |
| | | chardet@^0.7.0: |
| | | version "0.7.0" |
| | | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" |
| | | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== |
| | | |
| | | cli-cursor@^3.1.0: |
| | | version "3.1.0" |
| | | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" |
| | | integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== |
| | | dependencies: |
| | | restore-cursor "^3.1.0" |
| | | |
| | | cli-width@^2.0.0: |
| | | version "2.2.1" |
| | | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" |
| | | integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== |
| | | |
| | | color-convert@^1.9.0: |
| | | version "1.9.3" |
| | | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" |
| | | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== |
| | | dependencies: |
| | | color-name "1.1.3" |
| | | |
| | | color-convert@^2.0.1: |
| | | version "2.0.1" |
| | | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" |
| | | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== |
| | | dependencies: |
| | | color-name "~1.1.4" |
| | | |
| | | color-name@1.1.3: |
| | | version "1.1.3" |
| | | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" |
| | | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= |
| | | |
| | | color-name@~1.1.4: |
| | | version "1.1.4" |
| | | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" |
| | | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== |
| | | |
| | | combined-stream@^1.0.6, combined-stream@~1.0.6: |
| | | version "1.0.8" |
| | | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" |
| | | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== |
| | | dependencies: |
| | | delayed-stream "~1.0.0" |
| | | |
| | | concat-map@0.0.1: |
| | | version "0.0.1" |
| | | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" |
| | | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= |
| | | |
| | | content-disposition@0.5.3: |
| | | version "0.5.3" |
| | | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" |
| | | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== |
| | | dependencies: |
| | | safe-buffer "5.1.2" |
| | | |
| | | content-type@~1.0.4: |
| | | version "1.0.4" |
| | | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" |
| | | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== |
| | | |
| | | cookie-signature@1.0.6: |
| | | version "1.0.6" |
| | | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" |
| | | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= |
| | | |
| | | cookie@0.4.0: |
| | | version "0.4.0" |
| | | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" |
| | | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== |
| | | |
| | | core-util-is@1.0.2: |
| | | version "1.0.2" |
| | | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" |
| | | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= |
| | | |
| | | cross-spawn@^6.0.5: |
| | | version "6.0.5" |
| | | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" |
| | | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== |
| | | dependencies: |
| | | nice-try "^1.0.4" |
| | | path-key "^2.0.1" |
| | | semver "^5.5.0" |
| | | shebang-command "^1.2.0" |
| | | which "^1.2.9" |
| | | |
| | | dashdash@^1.12.0: |
| | | version "1.14.1" |
| | | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" |
| | | integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= |
| | | dependencies: |
| | | assert-plus "^1.0.0" |
| | | |
| | | debug@2.6.9: |
| | | version "2.6.9" |
| | | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" |
| | | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== |
| | | dependencies: |
| | | ms "2.0.0" |
| | | |
| | | debug@^4.0.1: |
| | | version "4.1.1" |
| | | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" |
| | | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== |
| | | dependencies: |
| | | ms "^2.1.1" |
| | | |
| | | deep-is@~0.1.3: |
| | | version "0.1.3" |
| | | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" |
| | | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= |
| | | |
| | | delayed-stream@~1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" |
| | | integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= |
| | | |
| | | depd@~1.1.2: |
| | | version "1.1.2" |
| | | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" |
| | | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= |
| | | |
| | | destroy@~1.0.4: |
| | | version "1.0.4" |
| | | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" |
| | | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= |
| | | |
| | | doctrine@^3.0.0: |
| | | version "3.0.0" |
| | | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" |
| | | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== |
| | | dependencies: |
| | | esutils "^2.0.2" |
| | | |
| | | ecc-jsbn@~0.1.1: |
| | | version "0.1.2" |
| | | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" |
| | | integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= |
| | | dependencies: |
| | | jsbn "~0.1.0" |
| | | safer-buffer "^2.1.0" |
| | | |
| | | ee-first@1.1.1: |
| | | version "1.1.1" |
| | | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" |
| | | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= |
| | | |
| | | emoji-regex@^7.0.1: |
| | | version "7.0.3" |
| | | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" |
| | | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== |
| | | |
| | | emoji-regex@^8.0.0: |
| | | version "8.0.0" |
| | | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" |
| | | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== |
| | | |
| | | encodeurl@~1.0.2: |
| | | version "1.0.2" |
| | | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" |
| | | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= |
| | | |
| | | escape-html@~1.0.3: |
| | | version "1.0.3" |
| | | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" |
| | | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= |
| | | |
| | | escape-string-regexp@^1.0.5: |
| | | version "1.0.5" |
| | | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" |
| | | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= |
| | | |
| | | eslint-scope@^5.0.0: |
| | | version "5.0.0" |
| | | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" |
| | | integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== |
| | | dependencies: |
| | | esrecurse "^4.1.0" |
| | | estraverse "^4.1.1" |
| | | |
| | | eslint-utils@^1.4.3: |
| | | version "1.4.3" |
| | | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" |
| | | integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== |
| | | dependencies: |
| | | eslint-visitor-keys "^1.1.0" |
| | | |
| | | eslint-visitor-keys@^1.1.0: |
| | | version "1.1.0" |
| | | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" |
| | | integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== |
| | | |
| | | eslint@^6.8.0: |
| | | version "6.8.0" |
| | | resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" |
| | | integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== |
| | | dependencies: |
| | | "@babel/code-frame" "^7.0.0" |
| | | ajv "^6.10.0" |
| | | chalk "^2.1.0" |
| | | cross-spawn "^6.0.5" |
| | | debug "^4.0.1" |
| | | doctrine "^3.0.0" |
| | | eslint-scope "^5.0.0" |
| | | eslint-utils "^1.4.3" |
| | | eslint-visitor-keys "^1.1.0" |
| | | espree "^6.1.2" |
| | | esquery "^1.0.1" |
| | | esutils "^2.0.2" |
| | | file-entry-cache "^5.0.1" |
| | | functional-red-black-tree "^1.0.1" |
| | | glob-parent "^5.0.0" |
| | | globals "^12.1.0" |
| | | ignore "^4.0.6" |
| | | import-fresh "^3.0.0" |
| | | imurmurhash "^0.1.4" |
| | | inquirer "^7.0.0" |
| | | is-glob "^4.0.0" |
| | | js-yaml "^3.13.1" |
| | | json-stable-stringify-without-jsonify "^1.0.1" |
| | | levn "^0.3.0" |
| | | lodash "^4.17.14" |
| | | minimatch "^3.0.4" |
| | | mkdirp "^0.5.1" |
| | | natural-compare "^1.4.0" |
| | | optionator "^0.8.3" |
| | | progress "^2.0.0" |
| | | regexpp "^2.0.1" |
| | | semver "^6.1.2" |
| | | strip-ansi "^5.2.0" |
| | | strip-json-comments "^3.0.1" |
| | | table "^5.2.3" |
| | | text-table "^0.2.0" |
| | | v8-compile-cache "^2.0.3" |
| | | |
| | | espree@^6.1.2: |
| | | version "6.2.1" |
| | | resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" |
| | | integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== |
| | | dependencies: |
| | | acorn "^7.1.1" |
| | | acorn-jsx "^5.2.0" |
| | | eslint-visitor-keys "^1.1.0" |
| | | |
| | | esprima@^4.0.0: |
| | | version "4.0.1" |
| | | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" |
| | | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== |
| | | |
| | | esquery@^1.0.1: |
| | | version "1.3.1" |
| | | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" |
| | | integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== |
| | | dependencies: |
| | | estraverse "^5.1.0" |
| | | |
| | | esrecurse@^4.1.0: |
| | | version "4.2.1" |
| | | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" |
| | | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== |
| | | dependencies: |
| | | estraverse "^4.1.0" |
| | | |
| | | estraverse@^4.1.0, estraverse@^4.1.1: |
| | | version "4.3.0" |
| | | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" |
| | | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== |
| | | |
| | | estraverse@^5.1.0: |
| | | version "5.1.0" |
| | | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" |
| | | integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== |
| | | |
| | | esutils@^2.0.2: |
| | | version "2.0.3" |
| | | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" |
| | | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== |
| | | |
| | | etag@~1.8.1: |
| | | version "1.8.1" |
| | | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" |
| | | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= |
| | | |
| | | express@^4.17.1: |
| | | version "4.17.1" |
| | | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" |
| | | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== |
| | | dependencies: |
| | | accepts "~1.3.7" |
| | | array-flatten "1.1.1" |
| | | body-parser "1.19.0" |
| | | content-disposition "0.5.3" |
| | | content-type "~1.0.4" |
| | | cookie "0.4.0" |
| | | cookie-signature "1.0.6" |
| | | debug "2.6.9" |
| | | depd "~1.1.2" |
| | | encodeurl "~1.0.2" |
| | | escape-html "~1.0.3" |
| | | etag "~1.8.1" |
| | | finalhandler "~1.1.2" |
| | | fresh "0.5.2" |
| | | merge-descriptors "1.0.1" |
| | | methods "~1.1.2" |
| | | on-finished "~2.3.0" |
| | | parseurl "~1.3.3" |
| | | path-to-regexp "0.1.7" |
| | | proxy-addr "~2.0.5" |
| | | qs "6.7.0" |
| | | range-parser "~1.2.1" |
| | | safe-buffer "5.1.2" |
| | | send "0.17.1" |
| | | serve-static "1.14.1" |
| | | setprototypeof "1.1.1" |
| | | statuses "~1.5.0" |
| | | type-is "~1.6.18" |
| | | utils-merge "1.0.1" |
| | | vary "~1.1.2" |
| | | |
| | | extend@~3.0.2: |
| | | version "3.0.2" |
| | | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" |
| | | integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== |
| | | |
| | | external-editor@^3.0.3: |
| | | version "3.1.0" |
| | | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" |
| | | integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== |
| | | dependencies: |
| | | chardet "^0.7.0" |
| | | iconv-lite "^0.4.24" |
| | | tmp "^0.0.33" |
| | | |
| | | extsprintf@1.3.0: |
| | | version "1.3.0" |
| | | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" |
| | | integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= |
| | | |
| | | extsprintf@^1.2.0: |
| | | version "1.4.0" |
| | | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" |
| | | integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= |
| | | |
| | | fast-deep-equal@^3.1.1: |
| | | version "3.1.1" |
| | | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" |
| | | integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== |
| | | |
| | | fast-json-stable-stringify@^2.0.0: |
| | | version "2.1.0" |
| | | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" |
| | | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== |
| | | |
| | | fast-levenshtein@~2.0.6: |
| | | version "2.0.6" |
| | | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" |
| | | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= |
| | | |
| | | figures@^3.0.0: |
| | | version "3.2.0" |
| | | resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" |
| | | integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== |
| | | dependencies: |
| | | escape-string-regexp "^1.0.5" |
| | | |
| | | file-entry-cache@^5.0.1: |
| | | version "5.0.1" |
| | | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" |
| | | integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== |
| | | dependencies: |
| | | flat-cache "^2.0.1" |
| | | |
| | | finalhandler@~1.1.2: |
| | | version "1.1.2" |
| | | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" |
| | | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== |
| | | dependencies: |
| | | debug "2.6.9" |
| | | encodeurl "~1.0.2" |
| | | escape-html "~1.0.3" |
| | | on-finished "~2.3.0" |
| | | parseurl "~1.3.3" |
| | | statuses "~1.5.0" |
| | | unpipe "~1.0.0" |
| | | |
| | | flat-cache@^2.0.1: |
| | | version "2.0.1" |
| | | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" |
| | | integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== |
| | | dependencies: |
| | | flatted "^2.0.0" |
| | | rimraf "2.6.3" |
| | | write "1.0.3" |
| | | |
| | | flatted@^2.0.0: |
| | | version "2.0.2" |
| | | resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" |
| | | integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== |
| | | |
| | | forever-agent@~0.6.1: |
| | | version "0.6.1" |
| | | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" |
| | | integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= |
| | | |
| | | form-data@~2.3.2: |
| | | version "2.3.3" |
| | | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" |
| | | integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== |
| | | dependencies: |
| | | asynckit "^0.4.0" |
| | | combined-stream "^1.0.6" |
| | | mime-types "^2.1.12" |
| | | |
| | | forwarded@~0.1.2: |
| | | version "0.1.2" |
| | | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" |
| | | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= |
| | | |
| | | fresh@0.5.2: |
| | | version "0.5.2" |
| | | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" |
| | | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= |
| | | |
| | | fs.realpath@^1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" |
| | | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= |
| | | |
| | | functional-red-black-tree@^1.0.1: |
| | | version "1.0.1" |
| | | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" |
| | | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= |
| | | |
| | | getpass@^0.1.1: |
| | | version "0.1.7" |
| | | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" |
| | | integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= |
| | | dependencies: |
| | | assert-plus "^1.0.0" |
| | | |
| | | glob-parent@^5.0.0: |
| | | version "5.1.1" |
| | | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" |
| | | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== |
| | | dependencies: |
| | | is-glob "^4.0.1" |
| | | |
| | | glob@^7.1.3: |
| | | version "7.1.6" |
| | | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" |
| | | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== |
| | | dependencies: |
| | | fs.realpath "^1.0.0" |
| | | inflight "^1.0.4" |
| | | inherits "2" |
| | | minimatch "^3.0.4" |
| | | once "^1.3.0" |
| | | path-is-absolute "^1.0.0" |
| | | |
| | | globals@^12.1.0: |
| | | version "12.4.0" |
| | | resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" |
| | | integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== |
| | | dependencies: |
| | | type-fest "^0.8.1" |
| | | |
| | | har-schema@^2.0.0: |
| | | version "2.0.0" |
| | | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" |
| | | integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= |
| | | |
| | | har-validator@~5.1.3: |
| | | version "5.1.3" |
| | | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" |
| | | integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== |
| | | dependencies: |
| | | ajv "^6.5.5" |
| | | har-schema "^2.0.0" |
| | | |
| | | has-flag@^3.0.0: |
| | | version "3.0.0" |
| | | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" |
| | | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= |
| | | |
| | | has-flag@^4.0.0: |
| | | version "4.0.0" |
| | | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" |
| | | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== |
| | | |
| | | http-errors@1.7.2: |
| | | version "1.7.2" |
| | | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" |
| | | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== |
| | | dependencies: |
| | | depd "~1.1.2" |
| | | inherits "2.0.3" |
| | | setprototypeof "1.1.1" |
| | | statuses ">= 1.5.0 < 2" |
| | | toidentifier "1.0.0" |
| | | |
| | | http-errors@~1.7.2: |
| | | version "1.7.3" |
| | | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" |
| | | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== |
| | | dependencies: |
| | | depd "~1.1.2" |
| | | inherits "2.0.4" |
| | | setprototypeof "1.1.1" |
| | | statuses ">= 1.5.0 < 2" |
| | | toidentifier "1.0.0" |
| | | |
| | | http-signature@~1.2.0: |
| | | version "1.2.0" |
| | | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" |
| | | integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= |
| | | dependencies: |
| | | assert-plus "^1.0.0" |
| | | jsprim "^1.2.2" |
| | | sshpk "^1.7.0" |
| | | |
| | | iconv-lite@0.4.24, iconv-lite@^0.4.24: |
| | | version "0.4.24" |
| | | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" |
| | | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== |
| | | dependencies: |
| | | safer-buffer ">= 2.1.2 < 3" |
| | | |
| | | ignore@^4.0.6: |
| | | version "4.0.6" |
| | | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" |
| | | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== |
| | | |
| | | import-fresh@^3.0.0: |
| | | version "3.2.1" |
| | | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" |
| | | integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== |
| | | dependencies: |
| | | parent-module "^1.0.0" |
| | | resolve-from "^4.0.0" |
| | | |
| | | imurmurhash@^0.1.4: |
| | | version "0.1.4" |
| | | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" |
| | | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= |
| | | |
| | | inflight@^1.0.4: |
| | | version "1.0.6" |
| | | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" |
| | | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= |
| | | dependencies: |
| | | once "^1.3.0" |
| | | wrappy "1" |
| | | |
| | | inherits@2, inherits@2.0.4: |
| | | version "2.0.4" |
| | | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" |
| | | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== |
| | | |
| | | inherits@2.0.3: |
| | | version "2.0.3" |
| | | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" |
| | | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= |
| | | |
| | | inquirer@^7.0.0: |
| | | version "7.1.0" |
| | | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" |
| | | integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== |
| | | dependencies: |
| | | ansi-escapes "^4.2.1" |
| | | chalk "^3.0.0" |
| | | cli-cursor "^3.1.0" |
| | | cli-width "^2.0.0" |
| | | external-editor "^3.0.3" |
| | | figures "^3.0.0" |
| | | lodash "^4.17.15" |
| | | mute-stream "0.0.8" |
| | | run-async "^2.4.0" |
| | | rxjs "^6.5.3" |
| | | string-width "^4.1.0" |
| | | strip-ansi "^6.0.0" |
| | | through "^2.3.6" |
| | | |
| | | ipaddr.js@1.9.1: |
| | | version "1.9.1" |
| | | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" |
| | | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== |
| | | |
| | | is-extglob@^2.1.1: |
| | | version "2.1.1" |
| | | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" |
| | | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= |
| | | |
| | | is-fullwidth-code-point@^2.0.0: |
| | | version "2.0.0" |
| | | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" |
| | | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= |
| | | |
| | | is-fullwidth-code-point@^3.0.0: |
| | | version "3.0.0" |
| | | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" |
| | | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== |
| | | |
| | | is-glob@^4.0.0, is-glob@^4.0.1: |
| | | version "4.0.1" |
| | | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" |
| | | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== |
| | | dependencies: |
| | | is-extglob "^2.1.1" |
| | | |
| | | is-typedarray@~1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" |
| | | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= |
| | | |
| | | isexe@^2.0.0: |
| | | version "2.0.0" |
| | | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" |
| | | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= |
| | | |
| | | isstream@~0.1.2: |
| | | version "0.1.2" |
| | | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" |
| | | integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= |
| | | |
| | | js-tokens@^4.0.0: |
| | | version "4.0.0" |
| | | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" |
| | | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== |
| | | |
| | | js-yaml@^3.13.1: |
| | | version "3.13.1" |
| | | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" |
| | | integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== |
| | | dependencies: |
| | | argparse "^1.0.7" |
| | | esprima "^4.0.0" |
| | | |
| | | jsbn@~0.1.0: |
| | | version "0.1.1" |
| | | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" |
| | | integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= |
| | | |
| | | json-schema-traverse@^0.4.1: |
| | | version "0.4.1" |
| | | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" |
| | | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== |
| | | |
| | | json-schema@0.2.3: |
| | | version "0.2.3" |
| | | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" |
| | | integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= |
| | | |
| | | json-stable-stringify-without-jsonify@^1.0.1: |
| | | version "1.0.1" |
| | | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" |
| | | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= |
| | | |
| | | json-stringify-safe@~5.0.1: |
| | | version "5.0.1" |
| | | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" |
| | | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= |
| | | |
| | | jsprim@^1.2.2: |
| | | version "1.4.1" |
| | | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" |
| | | integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= |
| | | dependencies: |
| | | assert-plus "1.0.0" |
| | | extsprintf "1.3.0" |
| | | json-schema "0.2.3" |
| | | verror "1.10.0" |
| | | |
| | | levn@^0.3.0, levn@~0.3.0: |
| | | version "0.3.0" |
| | | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" |
| | | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= |
| | | dependencies: |
| | | prelude-ls "~1.1.2" |
| | | type-check "~0.3.2" |
| | | |
| | | lodash@^4.17.14, lodash@^4.17.15: |
| | | version "4.17.15" |
| | | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" |
| | | integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== |
| | | |
| | | media-typer@0.3.0: |
| | | version "0.3.0" |
| | | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" |
| | | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= |
| | | |
| | | merge-descriptors@1.0.1: |
| | | version "1.0.1" |
| | | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" |
| | | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= |
| | | |
| | | methods@~1.1.2: |
| | | version "1.1.2" |
| | | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" |
| | | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= |
| | | |
| | | mime-db@1.44.0: |
| | | version "1.44.0" |
| | | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" |
| | | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== |
| | | |
| | | mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24: |
| | | version "2.1.27" |
| | | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" |
| | | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== |
| | | dependencies: |
| | | mime-db "1.44.0" |
| | | |
| | | mime@1.6.0: |
| | | version "1.6.0" |
| | | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" |
| | | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== |
| | | |
| | | mimic-fn@^2.1.0: |
| | | version "2.1.0" |
| | | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" |
| | | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== |
| | | |
| | | minimatch@^3.0.4: |
| | | version "3.0.4" |
| | | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" |
| | | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== |
| | | dependencies: |
| | | brace-expansion "^1.1.7" |
| | | |
| | | minimist@^1.2.5: |
| | | version "1.2.5" |
| | | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" |
| | | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== |
| | | |
| | | mkdirp@^0.5.1: |
| | | version "0.5.5" |
| | | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" |
| | | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== |
| | | dependencies: |
| | | minimist "^1.2.5" |
| | | |
| | | ms@2.0.0: |
| | | version "2.0.0" |
| | | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" |
| | | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= |
| | | |
| | | ms@2.1.1: |
| | | version "2.1.1" |
| | | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" |
| | | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== |
| | | |
| | | ms@^2.1.1: |
| | | version "2.1.2" |
| | | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" |
| | | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== |
| | | |
| | | mute-stream@0.0.8: |
| | | version "0.0.8" |
| | | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" |
| | | integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== |
| | | |
| | | natural-compare@^1.4.0: |
| | | version "1.4.0" |
| | | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" |
| | | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= |
| | | |
| | | negotiator@0.6.2: |
| | | version "0.6.2" |
| | | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" |
| | | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== |
| | | |
| | | nice-try@^1.0.4: |
| | | version "1.0.5" |
| | | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" |
| | | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== |
| | | |
| | | oauth-sign@~0.9.0: |
| | | version "0.9.0" |
| | | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" |
| | | integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== |
| | | |
| | | on-finished@~2.3.0: |
| | | version "2.3.0" |
| | | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" |
| | | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= |
| | | dependencies: |
| | | ee-first "1.1.1" |
| | | |
| | | once@^1.3.0: |
| | | version "1.4.0" |
| | | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" |
| | | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= |
| | | dependencies: |
| | | wrappy "1" |
| | | |
| | | onetime@^5.1.0: |
| | | version "5.1.0" |
| | | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" |
| | | integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== |
| | | dependencies: |
| | | mimic-fn "^2.1.0" |
| | | |
| | | optionator@^0.8.3: |
| | | version "0.8.3" |
| | | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" |
| | | integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== |
| | | dependencies: |
| | | deep-is "~0.1.3" |
| | | fast-levenshtein "~2.0.6" |
| | | levn "~0.3.0" |
| | | prelude-ls "~1.1.2" |
| | | type-check "~0.3.2" |
| | | word-wrap "~1.2.3" |
| | | |
| | | os-tmpdir@~1.0.2: |
| | | version "1.0.2" |
| | | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" |
| | | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= |
| | | |
| | | parent-module@^1.0.0: |
| | | version "1.0.1" |
| | | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" |
| | | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== |
| | | dependencies: |
| | | callsites "^3.0.0" |
| | | |
| | | parseurl@~1.3.3: |
| | | version "1.3.3" |
| | | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" |
| | | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== |
| | | |
| | | path-is-absolute@^1.0.0: |
| | | version "1.0.1" |
| | | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" |
| | | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= |
| | | |
| | | path-key@^2.0.1: |
| | | version "2.0.1" |
| | | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" |
| | | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= |
| | | |
| | | path-to-regexp@0.1.7: |
| | | version "0.1.7" |
| | | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" |
| | | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= |
| | | |
| | | performance-now@^2.1.0: |
| | | version "2.1.0" |
| | | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" |
| | | integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= |
| | | |
| | | prelude-ls@~1.1.2: |
| | | version "1.1.2" |
| | | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" |
| | | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= |
| | | |
| | | progress@^2.0.0: |
| | | version "2.0.3" |
| | | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" |
| | | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== |
| | | |
| | | proxy-addr@~2.0.5: |
| | | version "2.0.6" |
| | | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" |
| | | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw== |
| | | dependencies: |
| | | forwarded "~0.1.2" |
| | | ipaddr.js "1.9.1" |
| | | |
| | | psl@^1.1.28: |
| | | version "1.8.0" |
| | | resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" |
| | | integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== |
| | | |
| | | punycode@^2.1.0, punycode@^2.1.1: |
| | | version "2.1.1" |
| | | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" |
| | | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== |
| | | |
| | | qs@6.7.0: |
| | | version "6.7.0" |
| | | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" |
| | | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== |
| | | |
| | | qs@~6.5.2: |
| | | version "6.5.2" |
| | | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" |
| | | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== |
| | | |
| | | range-parser@~1.2.1: |
| | | version "1.2.1" |
| | | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" |
| | | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== |
| | | |
| | | raw-body@2.4.0: |
| | | version "2.4.0" |
| | | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" |
| | | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== |
| | | dependencies: |
| | | bytes "3.1.0" |
| | | http-errors "1.7.2" |
| | | iconv-lite "0.4.24" |
| | | unpipe "1.0.0" |
| | | |
| | | regexpp@^2.0.1: |
| | | version "2.0.1" |
| | | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" |
| | | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== |
| | | |
| | | request@^2.88.2: |
| | | version "2.88.2" |
| | | resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" |
| | | integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== |
| | | dependencies: |
| | | aws-sign2 "~0.7.0" |
| | | aws4 "^1.8.0" |
| | | caseless "~0.12.0" |
| | | combined-stream "~1.0.6" |
| | | extend "~3.0.2" |
| | | forever-agent "~0.6.1" |
| | | form-data "~2.3.2" |
| | | har-validator "~5.1.3" |
| | | http-signature "~1.2.0" |
| | | is-typedarray "~1.0.0" |
| | | isstream "~0.1.2" |
| | | json-stringify-safe "~5.0.1" |
| | | mime-types "~2.1.19" |
| | | oauth-sign "~0.9.0" |
| | | performance-now "^2.1.0" |
| | | qs "~6.5.2" |
| | | safe-buffer "^5.1.2" |
| | | tough-cookie "~2.5.0" |
| | | tunnel-agent "^0.6.0" |
| | | uuid "^3.3.2" |
| | | |
| | | resolve-from@^4.0.0: |
| | | version "4.0.0" |
| | | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" |
| | | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== |
| | | |
| | | restore-cursor@^3.1.0: |
| | | version "3.1.0" |
| | | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" |
| | | integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== |
| | | dependencies: |
| | | onetime "^5.1.0" |
| | | signal-exit "^3.0.2" |
| | | |
| | | rimraf@2.6.3: |
| | | version "2.6.3" |
| | | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" |
| | | integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== |
| | | dependencies: |
| | | glob "^7.1.3" |
| | | |
| | | run-async@^2.4.0: |
| | | version "2.4.1" |
| | | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" |
| | | integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== |
| | | |
| | | rxjs@^6.5.3: |
| | | version "6.5.5" |
| | | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" |
| | | integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== |
| | | dependencies: |
| | | tslib "^1.9.0" |
| | | |
| | | safe-buffer@5.1.2: |
| | | version "5.1.2" |
| | | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" |
| | | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== |
| | | |
| | | safe-buffer@^5.0.1, safe-buffer@^5.1.2: |
| | | version "5.2.0" |
| | | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" |
| | | integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== |
| | | |
| | | "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: |
| | | version "2.1.2" |
| | | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" |
| | | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== |
| | | |
| | | semver@^5.5.0: |
| | | version "5.7.1" |
| | | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" |
| | | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== |
| | | |
| | | semver@^6.1.2: |
| | | version "6.3.0" |
| | | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" |
| | | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== |
| | | |
| | | send@0.17.1: |
| | | version "0.17.1" |
| | | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" |
| | | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== |
| | | dependencies: |
| | | debug "2.6.9" |
| | | depd "~1.1.2" |
| | | destroy "~1.0.4" |
| | | encodeurl "~1.0.2" |
| | | escape-html "~1.0.3" |
| | | etag "~1.8.1" |
| | | fresh "0.5.2" |
| | | http-errors "~1.7.2" |
| | | mime "1.6.0" |
| | | ms "2.1.1" |
| | | on-finished "~2.3.0" |
| | | range-parser "~1.2.1" |
| | | statuses "~1.5.0" |
| | | |
| | | serve-static@1.14.1: |
| | | version "1.14.1" |
| | | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" |
| | | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== |
| | | dependencies: |
| | | encodeurl "~1.0.2" |
| | | escape-html "~1.0.3" |
| | | parseurl "~1.3.3" |
| | | send "0.17.1" |
| | | |
| | | setprototypeof@1.1.1: |
| | | version "1.1.1" |
| | | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" |
| | | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== |
| | | |
| | | shebang-command@^1.2.0: |
| | | version "1.2.0" |
| | | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" |
| | | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= |
| | | dependencies: |
| | | shebang-regex "^1.0.0" |
| | | |
| | | shebang-regex@^1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" |
| | | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= |
| | | |
| | | signal-exit@^3.0.2: |
| | | version "3.0.3" |
| | | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" |
| | | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== |
| | | |
| | | slice-ansi@^2.1.0: |
| | | version "2.1.0" |
| | | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" |
| | | integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== |
| | | dependencies: |
| | | ansi-styles "^3.2.0" |
| | | astral-regex "^1.0.0" |
| | | is-fullwidth-code-point "^2.0.0" |
| | | |
| | | sprintf-js@~1.0.2: |
| | | version "1.0.3" |
| | | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" |
| | | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= |
| | | |
| | | sshpk@^1.7.0: |
| | | version "1.16.1" |
| | | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" |
| | | integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== |
| | | dependencies: |
| | | asn1 "~0.2.3" |
| | | assert-plus "^1.0.0" |
| | | bcrypt-pbkdf "^1.0.0" |
| | | dashdash "^1.12.0" |
| | | ecc-jsbn "~0.1.1" |
| | | getpass "^0.1.1" |
| | | jsbn "~0.1.0" |
| | | safer-buffer "^2.0.2" |
| | | tweetnacl "~0.14.0" |
| | | |
| | | "statuses@>= 1.5.0 < 2", statuses@~1.5.0: |
| | | version "1.5.0" |
| | | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" |
| | | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= |
| | | |
| | | string-width@^3.0.0: |
| | | version "3.1.0" |
| | | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" |
| | | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== |
| | | dependencies: |
| | | emoji-regex "^7.0.1" |
| | | is-fullwidth-code-point "^2.0.0" |
| | | strip-ansi "^5.1.0" |
| | | |
| | | string-width@^4.1.0: |
| | | version "4.2.0" |
| | | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" |
| | | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== |
| | | dependencies: |
| | | emoji-regex "^8.0.0" |
| | | is-fullwidth-code-point "^3.0.0" |
| | | strip-ansi "^6.0.0" |
| | | |
| | | strip-ansi@^5.1.0, strip-ansi@^5.2.0: |
| | | version "5.2.0" |
| | | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" |
| | | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== |
| | | dependencies: |
| | | ansi-regex "^4.1.0" |
| | | |
| | | strip-ansi@^6.0.0: |
| | | version "6.0.0" |
| | | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" |
| | | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== |
| | | dependencies: |
| | | ansi-regex "^5.0.0" |
| | | |
| | | strip-json-comments@^3.0.1: |
| | | version "3.1.0" |
| | | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180" |
| | | integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w== |
| | | |
| | | supports-color@^5.3.0: |
| | | version "5.5.0" |
| | | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" |
| | | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== |
| | | dependencies: |
| | | has-flag "^3.0.0" |
| | | |
| | | supports-color@^7.1.0: |
| | | version "7.1.0" |
| | | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" |
| | | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== |
| | | dependencies: |
| | | has-flag "^4.0.0" |
| | | |
| | | table@^5.2.3: |
| | | version "5.4.6" |
| | | resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" |
| | | integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== |
| | | dependencies: |
| | | ajv "^6.10.2" |
| | | lodash "^4.17.14" |
| | | slice-ansi "^2.1.0" |
| | | string-width "^3.0.0" |
| | | |
| | | text-table@^0.2.0: |
| | | version "0.2.0" |
| | | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" |
| | | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= |
| | | |
| | | through@^2.3.6: |
| | | version "2.3.8" |
| | | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" |
| | | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= |
| | | |
| | | tmp@^0.0.33: |
| | | version "0.0.33" |
| | | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" |
| | | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== |
| | | dependencies: |
| | | os-tmpdir "~1.0.2" |
| | | |
| | | toidentifier@1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" |
| | | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== |
| | | |
| | | tough-cookie@~2.5.0: |
| | | version "2.5.0" |
| | | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" |
| | | integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== |
| | | dependencies: |
| | | psl "^1.1.28" |
| | | punycode "^2.1.1" |
| | | |
| | | tslib@^1.9.0: |
| | | version "1.11.2" |
| | | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.2.tgz#9c79d83272c9a7aaf166f73915c9667ecdde3cc9" |
| | | integrity sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg== |
| | | |
| | | tunnel-agent@^0.6.0: |
| | | version "0.6.0" |
| | | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" |
| | | integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= |
| | | dependencies: |
| | | safe-buffer "^5.0.1" |
| | | |
| | | tweetnacl@^0.14.3, tweetnacl@~0.14.0: |
| | | version "0.14.5" |
| | | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" |
| | | integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= |
| | | |
| | | type-check@~0.3.2: |
| | | version "0.3.2" |
| | | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" |
| | | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= |
| | | dependencies: |
| | | prelude-ls "~1.1.2" |
| | | |
| | | type-fest@^0.11.0: |
| | | version "0.11.0" |
| | | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" |
| | | integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== |
| | | |
| | | type-fest@^0.8.1: |
| | | version "0.8.1" |
| | | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" |
| | | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== |
| | | |
| | | type-is@~1.6.17, type-is@~1.6.18: |
| | | version "1.6.18" |
| | | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" |
| | | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== |
| | | dependencies: |
| | | media-typer "0.3.0" |
| | | mime-types "~2.1.24" |
| | | |
| | | unpipe@1.0.0, unpipe@~1.0.0: |
| | | version "1.0.0" |
| | | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" |
| | | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= |
| | | |
| | | uri-js@^4.2.2: |
| | | version "4.2.2" |
| | | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" |
| | | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== |
| | | dependencies: |
| | | punycode "^2.1.0" |
| | | |
| | | utils-merge@1.0.1: |
| | | version "1.0.1" |
| | | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" |
| | | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= |
| | | |
| | | uuid@^3.3.2: |
| | | version "3.4.0" |
| | | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" |
| | | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== |
| | | |
| | | v8-compile-cache@^2.0.3: |
| | | version "2.1.0" |
| | | resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" |
| | | integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== |
| | | |
| | | vary@~1.1.2: |
| | | version "1.1.2" |
| | | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" |
| | | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= |
| | | |
| | | verror@1.10.0: |
| | | version "1.10.0" |
| | | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" |
| | | integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= |
| | | dependencies: |
| | | assert-plus "^1.0.0" |
| | | core-util-is "1.0.2" |
| | | extsprintf "^1.2.0" |
| | | |
| | | which@^1.2.9: |
| | | version "1.3.1" |
| | | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" |
| | | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== |
| | | dependencies: |
| | | isexe "^2.0.0" |
| | | |
| | | word-wrap@~1.2.3: |
| | | version "1.2.3" |
| | | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" |
| | | integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== |
| | | |
| | | wrappy@1: |
| | | version "1.0.2" |
| | | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" |
| | | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= |
| | | |
| | | write@1.0.3: |
| | | version "1.0.3" |
| | | resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" |
| | | integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== |
| | | dependencies: |
| | | mkdirp "^0.5.1" |
New file |
| | |
| | | { |
| | | "env": { |
| | | "browser": true, |
| | | "es6": true, |
| | | "node": true |
| | | }, |
| | | "extends": [ |
| | | "eslint:recommended", |
| | | "plugin:react/recommended" |
| | | ], |
| | | "globals": { |
| | | "Atomics": "readonly", |
| | | "SharedArrayBuffer": "readonly" |
| | | }, |
| | | "parser": "babel-eslint", |
| | | "parserOptions": { |
| | | "ecmaFeatures": { |
| | | "jsx": true |
| | | }, |
| | | "ecmaVersion": 2018, |
| | | "sourceType": "module" |
| | | }, |
| | | "plugins": [ |
| | | "react" |
| | | ], |
| | | "rules": { |
| | | "indent": [ |
| | | "error", |
| | | 2 |
| | | ], |
| | | "linebreak-style": [ |
| | | "error", |
| | | "unix" |
| | | ], |
| | | "quotes": [ |
| | | "error", |
| | | "double" |
| | | ], |
| | | "semi": [ |
| | | "error", |
| | | "always" |
| | | ], |
| | | "react/prop-types": "off" |
| | | } |
| | | } |
copy from mczernek-exchange-application/frontend/.gitignore
copy to dashboard/frontend/.gitignore
New file |
| | |
| | | FROM ubi8/nodejs-12 |
| | | |
| | | # URL of the exchange app (typically the route for istio-ingressgateway) |
| | | # All env vars exposed to the React app must start with REACT_APP |
| | | ENV REACT_APP_GW_ENDPOINT=PLACEHOLDER |
| | | # Workaround for https://github.com/facebook/create-react-app/issues/8688 |
| | | ENV CI=true |
| | | |
| | | # Cache dependencies |
| | | COPY package.json . |
| | | COPY package-lock.json . |
| | | RUN npm ci --production |
| | | |
| | | # Cache public files |
| | | COPY public ./public |
| | | |
| | | COPY src ./src |
| | | |
| | | EXPOSE 3000 |
| | | |
| | | CMD [ "npm", "start" ] |
New file |
| | |
| | | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). |
| | | |
| | | ## Available Scripts |
| | | |
| | | In the project directory, you can run: |
| | | |
| | | ### `yarn start` |
| | | |
| | | Runs the app in the development mode.<br /> |
| | | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. |
| | | |
| | | The page will reload if you make edits.<br /> |
| | | You will also see any lint errors in the console. |
| | | |
| | | ### `yarn test` |
| | | |
| | | Launches the test runner in the interactive watch mode.<br /> |
| | | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. |
| | | |
| | | ### `yarn build` |
| | | |
| | | Builds the app for production to the `build` folder.<br /> |
| | | It correctly bundles React in production mode and optimizes the build for the best performance. |
| | | |
| | | The build is minified and the filenames include the hashes.<br /> |
| | | Your app is ready to be deployed! |
| | | |
| | | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. |
| | | |
| | | ### `yarn eject` |
| | | |
| | | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** |
| | | |
| | | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. |
| | | |
| | | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. |
| | | |
| | | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. |
| | | |
| | | ## Learn More |
| | | |
| | | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). |
| | | |
| | | To learn React, check out the [React documentation](https://reactjs.org/). |
| | | |
| | | ### Code Splitting |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting |
| | | |
| | | ### Analyzing the Bundle Size |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size |
| | | |
| | | ### Making a Progressive Web App |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app |
| | | |
| | | ### Advanced Configuration |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration |
| | | |
| | | ### Deployment |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment |
| | | |
| | | ### `yarn build` fails to minify |
| | | |
| | | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify |
New file |
| | |
| | | { |
| | | "name": "dashboard", |
| | | "version": "0.1.0", |
| | | "private": true, |
| | | "homepage": "/dashboard", |
| | | "dependencies": { |
| | | "@patternfly/react-core": "^3.153.13", |
| | | "@patternfly/react-icons": "^3.15.16", |
| | | "@testing-library/jest-dom": "^4.2.4", |
| | | "@testing-library/react": "^9.3.2", |
| | | "@testing-library/user-event": "^7.1.2", |
| | | "react": "^16.13.1", |
| | | "react-dom": "^16.13.1", |
| | | "react-scripts": "3.4.1" |
| | | }, |
| | | "scripts": { |
| | | "start": "react-scripts start", |
| | | "build": "react-scripts build", |
| | | "test": "react-scripts test", |
| | | "eject": "react-scripts eject", |
| | | "lint": "eslint .", |
| | | "lint:fix": "eslint . --fix" |
| | | }, |
| | | "eslintConfig": { |
| | | "extends": "react-app" |
| | | }, |
| | | "browserslist": { |
| | | "production": [ |
| | | ">0.2%", |
| | | "not dead", |
| | | "not op_mini all" |
| | | ], |
| | | "development": [ |
| | | "last 1 chrome version", |
| | | "last 1 firefox version", |
| | | "last 1 safari version" |
| | | ] |
| | | }, |
| | | "devDependencies": { |
| | | "babel-eslint": "^10.1.0", |
| | | "eslint": "^6.8.0" |
| | | } |
| | | } |
New file |
| | |
| | | <!DOCTYPE html> |
| | | <html lang="en"> |
| | | <head> |
| | | <meta charset="utf-8" /> |
| | | <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> |
| | | <meta name="viewport" content="width=device-width, initial-scale=1" /> |
| | | <meta name="theme-color" content="#000000" /> |
| | | <meta |
| | | name="description" |
| | | content="Web site created using create-react-app" |
| | | /> |
| | | <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" /> |
| | | <!-- |
| | | manifest.json provides metadata used when your web app is installed on a |
| | | user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/ |
| | | --> |
| | | <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> |
| | | <!-- |
| | | Notice the use of %PUBLIC_URL% in the tags above. |
| | | It will be replaced with the URL of the `public` folder during the build. |
| | | Only files inside the `public` folder can be referenced from the HTML. |
| | | |
| | | Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will |
| | | work correctly both with client-side routing and a non-root public URL. |
| | | Learn how to configure a non-root public URL by running `npm run build`. |
| | | --> |
| | | <title>Exchange Application Dashboard</title> |
| | | </head> |
| | | <body> |
| | | <noscript>You need to enable JavaScript to run this app.</noscript> |
| | | <div id="root"></div> |
| | | <!-- |
| | | This HTML file is a template. |
| | | If you open it directly in the browser, you will see an empty page. |
| | | |
| | | You can add webfonts, meta tags, or analytics to this file. |
| | | The build step will place the bundled scripts into the <body> tag. |
| | | |
| | | To begin the development, run `npm start` or `yarn start`. |
| | | To create a production bundle, use `npm run build` or `yarn build`. |
| | | --> |
| | | </body> |
| | | </html> |
New file |
| | |
| | | { |
| | | "short_name": "Dashboard", |
| | | "name": "Exchange Application Dashboard", |
| | | "icons": [ |
| | | { |
| | | "src": "favicon.ico", |
| | | "sizes": "64x64 32x32 24x24 16x16", |
| | | "type": "image/x-icon" |
| | | }, |
| | | { |
| | | "src": "logo192.png", |
| | | "type": "image/png", |
| | | "sizes": "192x192" |
| | | }, |
| | | { |
| | | "src": "logo512.png", |
| | | "type": "image/png", |
| | | "sizes": "512x512" |
| | | } |
| | | ], |
| | | "start_url": ".", |
| | | "display": "standalone", |
| | | "theme_color": "#000000", |
| | | "background_color": "#ffffff" |
| | | } |
New file |
| | |
| | | import React, {Component} from "react"; |
| | | import { Page, PageSection, PageSectionVariants, Text, TextContent, Bullseye } from "@patternfly/react-core"; |
| | | import ComponentCard from "./ComponentCard"; |
| | | |
| | | class Dashboard extends Component { |
| | | render() { |
| | | return ( |
| | | <Page> |
| | | <PageSection className="border-top-blue center" variant={PageSectionVariants.dark}> |
| | | <TextContent> |
| | | <Text component="h1">Exchange Application Dashboard</Text> |
| | | </TextContent> |
| | | </PageSection> |
| | | <PageSection> |
| | | <Bullseye> |
| | | <ComponentCard endpoint="history" name="History Service"/> |
| | | <ComponentCard endpoint="currencies" name="Currency Service"/> |
| | | <ComponentCard endpoint="exchangeGW" name="Gateway Service"/> |
| | | <ComponentCard endpoint="frontend" name="Frontend Service"/> |
| | | </Bullseye> |
| | | </PageSection> |
| | | </Page> |
| | | ); |
| | | } |
| | | } |
| | | |
| | | export default Dashboard; |
New file |
| | |
| | | import React, {Component} from "react"; |
| | | import { Button, Card, CardHeader, CardBody, TextContent,Text } from "@patternfly/react-core"; |
| | | import { RebootingIcon ,ErrorCircleOIcon, OkIcon } from "@patternfly/react-icons"; |
| | | |
| | | class ComponentCard extends Component { |
| | | static defaultProps = { |
| | | name: "default name", |
| | | endpoint: "" |
| | | } |
| | | |
| | | constructor(props) { |
| | | super(props); |
| | | this.state = { |
| | | serviceState: {"state": "Unknown", "isAvailable": false} |
| | | }; |
| | | } |
| | | |
| | | componentDidMount() { |
| | | this.refreshServiceState(); |
| | | } |
| | | |
| | | refreshServiceState = () => { |
| | | const { endpoint } = this.props; |
| | | const backendEndpoint = process.env.REACT_APP_BACKEND_ENDPOINT || "backend"; |
| | | const fullURL = `http://${process.env.REACT_APP_GW_ENDPOINT}/${backendEndpoint}/${endpoint}`; |
| | | console.log(`Checking ${fullURL}`); |
| | | |
| | | fetch(fullURL) |
| | | .then(serviceState => serviceState.json()) |
| | | .then(serviceState => this.setState({ |
| | | serviceState |
| | | })) |
| | | .catch(err => { |
| | | console.log(err); |
| | | this.setState({serviceState: {"state": "Down", "isAvailable": false}}); |
| | | }); |
| | | } |
| | | |
| | | render() { |
| | | const { serviceState } = this.state; |
| | | const { name } = this.props; |
| | | return ( |
| | | <Card className={serviceState.isAvailable ? "border-top-blue": "border-top-red"} style={{margin: "20px"}} > |
| | | |
| | | <CardHeader> |
| | | {name} |
| | | <Button onClick={this.refreshServiceState} variant="plain" aria-label="Action"> |
| | | <RebootingIcon /> |
| | | </Button> |
| | | </CardHeader> |
| | | |
| | | <CardBody> |
| | | <TextContent> |
| | | <Text component="p"> |
| | | Service state: {serviceState.state} |
| | | </Text> |
| | | <Text component="p"> |
| | | Service availability: {serviceState.isAvailable ? <OkIcon/> : <ErrorCircleOIcon/>} |
| | | </Text> |
| | | </TextContent> |
| | | </CardBody> |
| | | </Card> |
| | | ); |
| | | } |
| | | } |
| | | |
| | | export default ComponentCard; |
New file |
| | |
| | | |
| | | body { |
| | | margin: 0; |
| | | font-family: "RedHatText", "Overpass", overpass, helvetica, arial, sans-serif; |
| | | -webkit-font-smoothing: antialiased; |
| | | -moz-osx-font-smoothing: grayscale; |
| | | background-color: var(--pf-global--palette--black-200); |
| | | } |
| | | |
| | | code { |
| | | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', |
| | | monospace; |
| | | } |
| | | |
| | | .border-top-blue { |
| | | border-top: 2px solid var(--pf-global--palette--blue-300); |
| | | } |
| | | |
| | | .border-top-red { |
| | | border-top: 2px solid var(--pf-global--palette--red-100); |
| | | } |
| | | |
| | | .center { |
| | | text-align: center; |
| | | } |
New file |
| | |
| | | import React from "react"; |
| | | import ReactDOM from "react-dom"; |
| | | import "@patternfly/react-core/dist/styles/base.css"; |
| | | import "./index.css"; |
| | | import App from "./App"; |
| | | import * as serviceWorker from "./serviceWorker"; |
| | | |
| | | ReactDOM.render( |
| | | <React.StrictMode> |
| | | <App /> |
| | | </React.StrictMode>, |
| | | document.getElementById("root") |
| | | ); |
| | | |
| | | // If you want your app to work offline and load faster, you can change |
| | | // unregister() to register() below. Note this comes with some pitfalls. |
| | | // Learn more about service workers: https://bit.ly/CRA-PWA |
| | | serviceWorker.unregister(); |
New file |
| | |
| | | // This optional code is used to register a service worker. |
| | | // register() is not called by default. |
| | | |
| | | // This lets the app load faster on subsequent visits in production, and gives |
| | | // it offline capabilities. However, it also means that developers (and users) |
| | | // will only see deployed updates on subsequent visits to a page, after all the |
| | | // existing tabs open on the page have been closed, since previously cached |
| | | // resources are updated in the background. |
| | | |
| | | // To learn more about the benefits of this model and instructions on how to |
| | | // opt-in, read https://bit.ly/CRA-PWA |
| | | |
| | | const isLocalhost = Boolean( |
| | | window.location.hostname === "localhost" || |
| | | // [::1] is the IPv6 localhost address. |
| | | window.location.hostname === "[::1]" || |
| | | // 127.0.0.0/8 are considered localhost for IPv4. |
| | | window.location.hostname.match( |
| | | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/ |
| | | ) |
| | | ); |
| | | |
| | | export function register(config) { |
| | | if (process.env.NODE_ENV === "production" && "serviceWorker" in navigator) { |
| | | // The URL constructor is available in all browsers that support SW. |
| | | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href); |
| | | if (publicUrl.origin !== window.location.origin) { |
| | | // Our service worker won't work if PUBLIC_URL is on a different origin |
| | | // from what our page is served on. This might happen if a CDN is used to |
| | | // serve assets; see https://github.com/facebook/create-react-app/issues/2374 |
| | | return; |
| | | } |
| | | |
| | | window.addEventListener("load", () => { |
| | | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`; |
| | | |
| | | if (isLocalhost) { |
| | | // This is running on localhost. Let's check if a service worker still exists or not. |
| | | checkValidServiceWorker(swUrl, config); |
| | | |
| | | // Add some additional logging to localhost, pointing developers to the |
| | | // service worker/PWA documentation. |
| | | navigator.serviceWorker.ready.then(() => { |
| | | console.log( |
| | | "This web app is being served cache-first by a service " + |
| | | "worker. To learn more, visit https://bit.ly/CRA-PWA" |
| | | ); |
| | | }); |
| | | } else { |
| | | // Is not localhost. Just register service worker |
| | | registerValidSW(swUrl, config); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | function registerValidSW(swUrl, config) { |
| | | navigator.serviceWorker |
| | | .register(swUrl) |
| | | .then(registration => { |
| | | registration.onupdatefound = () => { |
| | | const installingWorker = registration.installing; |
| | | if (installingWorker == null) { |
| | | return; |
| | | } |
| | | installingWorker.onstatechange = () => { |
| | | if (installingWorker.state === "installed") { |
| | | if (navigator.serviceWorker.controller) { |
| | | // At this point, the updated precached content has been fetched, |
| | | // but the previous service worker will still serve the older |
| | | // content until all client tabs are closed. |
| | | console.log( |
| | | "New content is available and will be used when all " + |
| | | "tabs for this page are closed. See https://bit.ly/CRA-PWA." |
| | | ); |
| | | |
| | | // Execute callback |
| | | if (config && config.onUpdate) { |
| | | config.onUpdate(registration); |
| | | } |
| | | } else { |
| | | // At this point, everything has been precached. |
| | | // It's the perfect time to display a |
| | | // "Content is cached for offline use." message. |
| | | console.log("Content is cached for offline use."); |
| | | |
| | | // Execute callback |
| | | if (config && config.onSuccess) { |
| | | config.onSuccess(registration); |
| | | } |
| | | } |
| | | } |
| | | }; |
| | | }; |
| | | }) |
| | | .catch(error => { |
| | | console.error("Error during service worker registration:", error); |
| | | }); |
| | | } |
| | | |
| | | function checkValidServiceWorker(swUrl, config) { |
| | | // Check if the service worker can be found. If it can't reload the page. |
| | | fetch(swUrl, { |
| | | headers: { "Service-Worker": "script" }, |
| | | }) |
| | | .then(response => { |
| | | // Ensure service worker exists, and that we really are getting a JS file. |
| | | const contentType = response.headers.get("content-type"); |
| | | if ( |
| | | response.status === 404 || |
| | | (contentType != null && contentType.indexOf("javascript") === -1) |
| | | ) { |
| | | // No service worker found. Probably a different app. Reload the page. |
| | | navigator.serviceWorker.ready.then(registration => { |
| | | registration.unregister().then(() => { |
| | | window.location.reload(); |
| | | }); |
| | | }); |
| | | } else { |
| | | // Service worker found. Proceed as normal. |
| | | registerValidSW(swUrl, config); |
| | | } |
| | | }) |
| | | .catch(() => { |
| | | console.log( |
| | | "No internet connection found. App is running in offline mode." |
| | | ); |
| | | }); |
| | | } |
| | | |
| | | export function unregister() { |
| | | if ("serviceWorker" in navigator) { |
| | | navigator.serviceWorker.ready |
| | | .then(registration => { |
| | | registration.unregister(); |
| | | }) |
| | | .catch(error => { |
| | | console.error(error.message); |
| | | }); |
| | | } |
| | | } |
New file |
| | |
| | | apiVersion: v1 |
| | | kind: Template |
| | | metadata: |
| | | name: dashboard |
| | | annotations: |
| | | description: "A dashboard to keep track of connectivity for the exchange application" |
| | | objects: |
| | | - apiVersion: networking.istio.io/v1alpha3 |
| | | kind: Gateway |
| | | metadata: |
| | | name: dashboard-gw |
| | | spec: |
| | | selector: |
| | | istio: ingressgateway # use istio default controller |
| | | servers: |
| | | - port: |
| | | number: 80 |
| | | name: http |
| | | protocol: HTTP |
| | | hosts: |
| | | - "*" |
| | | - apiVersion: networking.istio.io/v1alpha3 |
| | | kind: VirtualService |
| | | metadata: |
| | | name: dashboard-frontend-vservice |
| | | spec: |
| | | hosts: |
| | | - "*" |
| | | gateways: |
| | | - dashboard-gw |
| | | http: |
| | | - match: |
| | | - uri: |
| | | prefix: /dashboard |
| | | route: |
| | | - destination: |
| | | host: frontend |
| | | port: |
| | | number: 3000 |
| | | - apiVersion: v1 |
| | | kind: ConfigMap |
| | | metadata: |
| | | name: frontend-cm |
| | | data: |
| | | GW_ADDR: ${INGRESS_GW} |
| | | - apiVersion: apps/v1 |
| | | kind: Deployment |
| | | metadata: |
| | | name: frontend |
| | | spec: |
| | | selector: |
| | | matchLabels: |
| | | app: frontend |
| | | replicas: 1 |
| | | template: |
| | | metadata: |
| | | labels: |
| | | app: frontend |
| | | annotations: |
| | | sidecar.istio.io/inject: "true" |
| | | spec: |
| | | containers: |
| | | - name: frontend |
| | | image: quay.io/redhattraining/ossm-dashboard-frontend:${FRONTEND_TAG} |
| | | imagePullPolicy: Always |
| | | ports: |
| | | - containerPort: 3000 |
| | | env: |
| | | - name: REACT_APP_GW_ENDPOINT |
| | | valueFrom: |
| | | configMapKeyRef: |
| | | name: frontend-cm |
| | | key: GW_ADDR |
| | | - name: TARGET_PROJECT |
| | | value: ${TARGET_PROJECT} |
| | | - name: HISTORY_SERVICE |
| | | value: ${HISTORY_SERVICE} |
| | | - name: HISTORY_SERVICE_PORT |
| | | value: ${HISTORY_SERVICE_PORT} |
| | | - name: CURRENCY_SERVICE |
| | | value: ${CURRENCY_SERVICE} |
| | | - name: CURRENCY_SERVICE_PORT |
| | | value: ${CURRENCY_SERVICE_PORT} |
| | | - name: EXCHANGE_SERVICE |
| | | values: ${EXCHANGE_SERVICE} |
| | | - name: EXCHANGE_SERVICE_PORT |
| | | values: ${EXCHANGE_SERVICE_PORT} |
| | | - name: FRONTEND_SERVICE |
| | | values: ${FRONTEND_SERVICE} |
| | | - name: FRONTEND_SERVICE_PORT |
| | | values: ${FRONTEND_SERVICE_PORT} |
| | | - kind: Service |
| | | apiVersion: v1 |
| | | metadata: |
| | | labels: |
| | | app: frontend |
| | | name: frontend |
| | | spec: |
| | | ports: |
| | | - port: 3000 |
| | | protocol: TCP |
| | | targetPort: 3000 |
| | | selector: |
| | | app: frontend |
| | | - kind: Deployment |
| | | apiVersion: apps/v1 |
| | | metadata: |
| | | name: backend |
| | | spec: |
| | | selector: |
| | | matchLabels: |
| | | app: backend |
| | | replicas: 1 |
| | | template: |
| | | metadata: |
| | | labels: |
| | | app: backend |
| | | annotations: |
| | | sidecar.istio.io/inject: "true" |
| | | spec: |
| | | containers: |
| | | - name: history |
| | | image: quay.io/redhattraining/ossm-dashboard-backend:${BACKEND_TAG} |
| | | imagePullPolicy: Always |
| | | ports: |
| | | - containerPort: 8080 |
| | | - kind: Service |
| | | apiVersion: v1 |
| | | metadata: |
| | | labels: |
| | | app: backend |
| | | name: backend |
| | | spec: |
| | | ports: |
| | | - port: 8080 |
| | | protocol: TCP |
| | | targetPort: 8080 |
| | | selector: |
| | | app: backend |
| | | - apiVersion: networking.istio.io/v1alpha3 |
| | | kind: VirtualService |
| | | metadata: |
| | | name: dashboard-backend-vservice |
| | | spec: |
| | | hosts: |
| | | - "*" |
| | | gateways: |
| | | - dashboard-gw |
| | | http: |
| | | - match: |
| | | - uri: |
| | | prefix: /backend/ |
| | | rewrite: |
| | | uri: / |
| | | route: |
| | | - destination: |
| | | host: backend |
| | | port: |
| | | number: 8080 |
| | | parameters: |
| | | - name: INGRESS_GW |
| | | description: "The address of the Istio Ingress Gateway" |
| | | required: true |
| | | - name: FRONTEND_TAG |
| | | description: "The tag of the image used to deploy the Frontend service" |
| | | required: false |
| | | value: "1.0" |
| | | - name: BACKEND_TAG |
| | | description: "The tag of the image used to deploy the Backend service" |
| | | required: false |
| | | value: "1.0" |
| | | - name: TARGET_PROJECT |
| | | description: "Project of the Exchange Application services" |
| | | required: true |
| | | - name: HISTORY_SERVICE |
| | | description: "Name of the kubernetes service that leads to the History deployment" |
| | | required: false |
| | | value: "history" |
| | | - name: HISTORY_SERVICE_PORT |
| | | description: "Port for the history deployment" |
| | | required: false |
| | | value: "8080" |
| | | - name: CURRENCY_SERVICE |
| | | description: "Name of the kubernetes service that leads to the Currency deployment" |
| | | required: false |
| | | value: "currency" |
| | | - name: CURRENCY_SERVICE_PORT |
| | | description: "Port for the Currency deployment" |
| | | required: false |
| | | value: "5000" |
| | | - name: EXCHANGE_SERVICE |
| | | description: "Name of the kubernetes service that leads to the Exchange Gateway deployment" |
| | | required: false |
| | | value: "exchange" |
| | | - name: EXCHANGE_SERVICE_PORT |
| | | description: "Port for the Exchange Gateway deployment" |
| | | required: false |
| | | value: "8080" |
| | | - name: FRONTEND_SERVICE |
| | | description: "Name of the kubernetes service that leads to the Frontend deployment" |
| | | required: false |
| | | value: "frontend" |
| | | - name: FRONTEND_SERVICE_PORT |
| | | description: "Port for the Frontend deployment" |
| | | required: false |
| | | value: "3000" |
New file |
| | |
| | | # Currency Exchange application |
| | | |
| | | This application serves as an example of multi-service application. It consists of the following services: |
| | | |
| | | - History |
| | | - Currency |
| | | - Exchange (Gateway) |
| | | - Frontend |
| | | |
| | | ![Image of the application](imgs/app.png) |
| | | |
| | | |
| | | ## Deployment |
| | | |
| | | Note that this application template is written for OpenShift Service Mesh. |
| | | The project where you deploy this application should be managed by OSSM |
| | | (i.e. be in the ServiceMeshMemberRoll resource). |
| | | |
| | | If you want to use the news endpoint, provide the `NEWS_ENABLED` |
| | | variable in the template. |
| | | |
| | | Also note there is no `http://` in the `INGRESS_GW` parameter. Protocol |
| | | is added by the frontend application. |
| | | |
| | | To deploy this application, execute: |
| | | |
| | | ```sh |
| | | oc process -o yaml -f kubefiles/app-template.yml \ |
| | | -p INGRESS_GW=ingress-gateway.istio-system-app.apps.example.com \ |
| | | -p NEWS_ENDPOINT=url \ |
| | | | oc create -f - |
| | | ``` |
copy from mczernek-exchange-application/currencies/Dockerfile
copy to exchange-application/currencies/v2/Dockerfile
copy from mczernek-exchange-application/currencies/requirements.txt
copy to exchange-application/currencies/v2/requirements.txt
New file |
| | |
| | | import os |
| | | from flask import abort, Flask, jsonify |
| | | from flask_cors import CORS |
| | | |
| | | app = Flask(__name__) |
| | | CORS(app) |
| | | |
| | | ERROR_DIVISOR = int(os.environ.get('ERROR_DIVISOR', 0)) |
| | | ERROR_RESPONSE = int(os.environ.get('ERROR_RESPONSE', 500)) |
| | | |
| | | requestsCounter = 0 |
| | | |
| | | def failCheck(): |
| | | global requestsCounter |
| | | if ERROR_DIVISOR and requestsCounter % ERROR_DIVISOR != 0 : |
| | | abort(ERROR_RESPONSE) |
| | | |
| | | def trackRequest(): |
| | | global requestsCounter |
| | | requestsCounter += 1 |
| | | |
| | | @app.route('/') |
| | | def currenciesList(): |
| | | trackRequest() |
| | | failCheck() |
| | | |
| | | return jsonify('EUR', 'USD') |
File was renamed from mczernek-exchange-application/frontend/Dockerfile |
| | |
| | | |
| | | # URL of the exchange app |
| | | # All env vars exposed to the React app must start with REACT_APP |
| | | ENV REACT_APP_GW_ENDPOINT=exchange-exchange-app.apps.ocp-d43.dev.nextcle.com |
| | | ENV REACT_APP_GW_ENDPOINT=PLACEHOLDER |
| | | |
| | | # Cache dependencies |
| | | COPY package.json . |
| | | RUN npm install |
| | | COPY package-lock.json . |
| | | RUN npm ci --production |
| | | |
| | | # Cache public files |
| | | COPY public ./public |
copy from mczernek-exchange-application/frontend/public/index.html
copy to exchange-application/frontend/v1/public/index.html
copy from mczernek-exchange-application/frontend/public/manifest.json
copy to exchange-application/frontend/v1/public/manifest.json
copy from mczernek-exchange-application/frontend/public/robots.txt
copy to exchange-application/frontend/v1/public/robots.txt
New file |
| | |
| | | import React, { Component } from 'react'; |
| | | import Structure from './MainStructure' |
| | | import HistoricalDataForm from './HistoricalDataForm' |
| | | import WelcomePage from './Welcome' |
| | | import SingleCurrencyExchange from './SingleCurrencyExchange' |
| | | |
| | | import { |
| | | BrowserRouter as Router, |
| | | Switch, |
| | | Route, |
| | | } from "react-router-dom"; |
| | | |
| | | |
| | | class App extends Component { |
| | | render() { |
| | | return ( |
| | | <Router basename="/frontend"> |
| | | <Switch> |
| | | <Structure> |
| | | <Route path="/" exact > |
| | | <WelcomePage /> |
| | | </Route> |
| | | <Route path="/exchange" exact> |
| | | <SingleCurrencyExchange /> |
| | | </Route> |
| | | <Route path="/history" exact> |
| | | <HistoricalDataForm /> |
| | | </Route> |
| | | </Structure> |
| | | </Switch> |
| | | </Router> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | export default App; |
File was renamed from mczernek-exchange-application/frontend/src/MainStructure.js |
| | |
| | | const { isNavOpen } = this.state; |
| | | |
| | | const logoProps = { |
| | | href: '/' |
| | | href: '/frontend/' |
| | | }; |
| | | const Header = ( |
| | | <PageHeader |
New file |
| | |
| | | import React from 'react'; |
| | | import { |
| | | Nav, |
| | | NavItem, |
| | | NavList, |
| | | } from '@patternfly/react-core'; |
| | | |
| | | import { Link} from "react-router-dom"; |
| | | |
| | | |
| | | |
| | | class NavDefaultList extends React.Component { |
| | | render() { |
| | | return ( |
| | | <Nav onSelect={this.onSelect} theme="dark"> |
| | | <NavList> |
| | | <NavItem id="home" isActive={window.location.pathname.endsWith("/")}> |
| | | <Link to="/">Home</Link> |
| | | </NavItem> |
| | | <NavItem id="historical_Data" isActive={window.location.pathname.endsWith("/history")}> |
| | | <Link to="/history" >Historical Data</Link> |
| | | </NavItem> |
| | | <NavItem id="exchange" isActive={window.location.pathname.endsWith("/exchange")}> |
| | | <Link to="/exchange" >Exchange</Link> |
| | | </NavItem> |
| | | </NavList> |
| | | </Nav> |
| | | ); |
| | | } |
| | | } |
| | | |
| | | export default NavDefaultList; |
File was renamed from mczernek-exchange-application/frontend/src/Welcome.js |
| | |
| | | </Text> repository. |
| | | </Text> |
| | | <Text component="p"> |
| | | You can ask questions or file issues at <Text component="a" src="https://github.com/RedHatTraining/DO328-apps/issues"> here</Text>. |
| | | You can ask questions or file issues <Text component="a" href="https://github.com/RedHatTraining/DO328-apps/issues">here</Text>. |
| | | </Text> |
| | | </TextContent> |
| | | |
copy from mczernek-exchange-application/frontend/Dockerfile
copy to exchange-application/frontend/v2/Dockerfile
File was copied from mczernek-exchange-application/frontend/Dockerfile |
| | |
| | | |
| | | # URL of the exchange app |
| | | # All env vars exposed to the React app must start with REACT_APP |
| | | ENV REACT_APP_GW_ENDPOINT=exchange-exchange-app.apps.ocp-d43.dev.nextcle.com |
| | | ENV REACT_APP_GW_ENDPOINT=PLACEHOLDER |
| | | |
| | | # Cache dependencies |
| | | COPY package.json . |
| | | RUN npm install |
| | | COPY package-lock.json . |
| | | RUN npm ci --production |
| | | |
| | | # Cache public files |
| | | COPY public ./public |
copy from mczernek-exchange-application/frontend/README.md
copy to exchange-application/frontend/v2/README.md
copy from mczernek-exchange-application/frontend/package.json
copy to exchange-application/frontend/v2/package.json
copy from mczernek-exchange-application/frontend/public/index.html
copy to exchange-application/frontend/v2/public/index.html
copy from mczernek-exchange-application/frontend/public/manifest.json
copy to exchange-application/frontend/v2/public/manifest.json
copy from mczernek-exchange-application/frontend/public/robots.txt
copy to exchange-application/frontend/v2/public/robots.txt
copy from mczernek-exchange-application/frontend/src/App.css
copy to exchange-application/frontend/v2/src/App.css
copy from mczernek-exchange-application/frontend/src/Graph.js
copy to exchange-application/frontend/v2/src/Graph.js
copy from mczernek-exchange-application/frontend/src/HistoricalDataForm.js
copy to exchange-application/frontend/v2/src/HistoricalDataForm.js
copy from mczernek-exchange-application/frontend/src/Loading.js
copy to exchange-application/frontend/v2/src/Loading.js
copy from mczernek-exchange-application/frontend/src/MainStructure.js
copy to exchange-application/frontend/v2/src/MainStructure.js
File was copied from mczernek-exchange-application/frontend/src/MainStructure.js |
| | |
| | | const { isNavOpen } = this.state; |
| | | |
| | | const logoProps = { |
| | | href: '/' |
| | | href: '/frontend/' |
| | | }; |
| | | const Header = ( |
| | | <PageHeader |
copy from mczernek-exchange-application/frontend/src/NewsBoard.js
copy to exchange-application/frontend/v2/src/NewsBoard.js
copy from mczernek-exchange-application/frontend/src/SingleCurrencyExchange.js
copy to exchange-application/frontend/v2/src/SingleCurrencyExchange.js
copy from mczernek-exchange-application/frontend/src/Welcome.js
copy to exchange-application/frontend/v2/src/Welcome.js
File was copied from mczernek-exchange-application/frontend/src/Welcome.js |
| | |
| | | </Text> repository. |
| | | </Text> |
| | | <Text component="p"> |
| | | You can ask questions or file issues at <Text component="a" src="https://github.com/RedHatTraining/DO328-apps/issues"> here</Text>. |
| | | You can ask questions or file issues <Text component="a" href="https://github.com/RedHatTraining/DO328-apps/issues">here</Text>. |
| | | </Text> |
| | | </TextContent> |
| | | |
copy from mczernek-exchange-application/frontend/src/index.js
copy to exchange-application/frontend/v2/src/index.js
copy from mczernek-exchange-application/frontend/src/serviceWorker.js
copy to exchange-application/frontend/v2/src/serviceWorker.js
copy from mczernek-exchange-application/frontend/src/setupTests.js
copy to exchange-application/frontend/v2/src/setupTests.js
copy from mczernek-exchange-application/frontend/yarn.lock
copy to exchange-application/frontend/v2/yarn.lock
copy from mczernek-exchange-application/frontend/Dockerfile
copy to exchange-application/frontend/v3/Dockerfile
File was copied from mczernek-exchange-application/frontend/Dockerfile |
| | |
| | | |
| | | # URL of the exchange app |
| | | # All env vars exposed to the React app must start with REACT_APP |
| | | ENV REACT_APP_GW_ENDPOINT=exchange-exchange-app.apps.ocp-d43.dev.nextcle.com |
| | | ENV REACT_APP_GW_ENDPOINT=PLACEHOLDER |
| | | |
| | | # Cache dependencies |
| | | COPY package.json . |
| | | RUN npm install |
| | | COPY package-lock.json . |
| | | RUN npm ci --production |
| | | |
| | | # Cache public files |
| | | COPY public ./public |
copy from mczernek-exchange-application/frontend/README.md
copy to exchange-application/frontend/v3/README.md
copy from mczernek-exchange-application/frontend/package.json
copy to exchange-application/frontend/v3/package.json
copy from mczernek-exchange-application/frontend/public/index.html
copy to exchange-application/frontend/v3/public/index.html
copy from mczernek-exchange-application/frontend/public/manifest.json
copy to exchange-application/frontend/v3/public/manifest.json
copy from mczernek-exchange-application/frontend/public/robots.txt
copy to exchange-application/frontend/v3/public/robots.txt
New file |
| | |
| | | .centered { |
| | | text-align: center; |
| | | } |
| | | |
| | | .margin-separator { |
| | | margin-top: 20px; |
| | | } |
| | | |
| | | .text-container { |
| | | text-align: center; |
| | | font-size: 3em; |
| | | max-width: 300px; |
| | | border-bottom-style: solid; |
| | | border-color: #2b9af3; |
| | | word-wrap: break-word; |
| | | } |
| | | |
| | | .currency-text { |
| | | font-size: 0.6em; |
| | | vertical-align: top; |
| | | } |
| | | |
| | | @keyframes popupFadeIn { |
| | | from { |
| | | transform: translateY(-50%); |
| | | opacity: 0; |
| | | } |
| | | to { |
| | | transform: translateY(0); |
| | | opacity: 1; |
| | | } |
| | | } |
| | | |
| | | .popup { |
| | | animation-name: popupFadeIn; |
| | | animation-duration: .3s; |
| | | } |
New file |
| | |
| | | import React, { Component } from 'react'; |
| | | import Structure from './MainStructure' |
| | | import HistoricalDataForm from './HistoricalDataForm' |
| | | import WelcomePage from './Welcome' |
| | | import SingleCurrencyExchange from './SingleCurrencyExchange' |
| | | import NewsBoard from './NewsBoard' |
| | | |
| | | import { |
| | | BrowserRouter as Router, |
| | | Switch, |
| | | Route, |
| | | } from "react-router-dom"; |
| | | |
| | | |
| | | class App extends Component { |
| | | render() { |
| | | var enableNews = process.env.REACT_APP_NEWS_ENABLED |
| | | return ( |
| | | <Router basename="/frontend"> |
| | | <Switch> |
| | | <Structure> |
| | | <Route path="/" exact > |
| | | <WelcomePage /> |
| | | </Route> |
| | | <Route path="/exchange" exact> |
| | | <SingleCurrencyExchange /> |
| | | </Route> |
| | | <Route path="/history" exact> |
| | | <HistoricalDataForm /> |
| | | </Route> |
| | | {enableNews && |
| | | <Route path="/news" exact> |
| | | <NewsBoard /> |
| | | </Route> |
| | | } |
| | | </Structure> |
| | | </Switch> |
| | | </Router> |
| | | ) |
| | | } |
| | | } |
| | | |
| | | export default App; |
New file |
| | |
| | | async function fetchWithRetry (url, options=null, retries=3, msTimeout=3000) { |
| | | const timerPromise = createTimerPromise(msTimeout) |
| | | try { |
| | | return await Promise.race([fetch(url, options), timerPromise]) |
| | | } catch(err) { |
| | | if (retries === 1) throw err; |
| | | console.log(`Retrying due to: ${err}`) |
| | | return await fetchWithRetry(url, options, retries - 1); |
| | | } |
| | | }; |
| | | |
| | | function createTimerPromise(timeout) { |
| | | return new Promise((_, reject) => { |
| | | setTimeout(()=> { |
| | | reject(new Error('Request Timeout')) |
| | | }, timeout) |
| | | }) |
| | | } |
| | | |
| | | module.exports = { |
| | | fetchWithRetry |
| | | }; |
copy from mczernek-exchange-application/frontend/src/Graph.js
copy to exchange-application/frontend/v3/src/Graph.js
New file |
| | |
| | | import React, { Component } from 'react'; |
| | | import { |
| | | Alert, |
| | | AlertActionCloseButton, |
| | | Form, |
| | | FormGroup, |
| | | FormSelect, |
| | | FormSelectOption, |
| | | Button, |
| | | TextContent, |
| | | Text, |
| | | Flex, |
| | | FlexItem, |
| | | } from '@patternfly/react-core'; |
| | | |
| | | import Spinner from './Loading'; |
| | | import RenderedChart from './Graph' |
| | | import FetchUtils from './FetchUtils' |
| | | |
| | | |
| | | class CurrencyPicker extends Component { |
| | | constructor(props) { |
| | | super(props); |
| | | this.state = { |
| | | loading: false, |
| | | currencies: [], |
| | | src: 'Loading currencies', |
| | | target: 'Loading currencies', |
| | | exchangeData: '', |
| | | requestExchangeData: false, |
| | | inputValue: 1, |
| | | inputValid: true, |
| | | error: { |
| | | isActive: false, |
| | | } |
| | | }; |
| | | } |
| | | |
| | | componentDidMount() { |
| | | this.setState({ |
| | | loading: true |
| | | }) |
| | | |
| | | this.getCurrencies() |
| | | } |
| | | |
| | | getCurrencies = () => { |
| | | FetchUtils.fetchWithRetry(`http://${process.env.REACT_APP_GW_ENDPOINT}/currencies`) |
| | | .then(currencies => currencies.json()) |
| | | .then(currencies => this.setState({ |
| | | currencies, src: currencies[0], target: currencies[1], loading: false |
| | | })) |
| | | .catch(err => { |
| | | console.log(err); |
| | | this.setState({ |
| | | error: { |
| | | isActive: true, |
| | | header: "Fetching currencies failed", |
| | | message: `Got the following error trying to fetch currencies: ${err}`, |
| | | } |
| | | }) |
| | | }); |
| | | } |
| | | |
| | | onChangeSrc = (src) => { |
| | | this.setState({ src }); |
| | | }; |
| | | |
| | | onChangeTarget = (target) => { |
| | | this.setState({ target }); |
| | | }; |
| | | |
| | | onChangeInput = (inputValue) => { |
| | | const inputValid = this.inputValidation(inputValue); |
| | | this.setState({ inputValue, inputValid }); |
| | | } |
| | | |
| | | inputValidation = (input) => { |
| | | return input > 0 |
| | | } |
| | | |
| | | submit = (e) => { |
| | | e.preventDefault(); |
| | | this.setState({ requestExchangeData: true }) |
| | | |
| | | const payload = { |
| | | source: this.state.src, |
| | | target: this.state.target |
| | | } |
| | | FetchUtils.fetchWithRetry(`http://${process.env.REACT_APP_GW_ENDPOINT}/exchangeRate/historicalData`, { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Accept': 'application/json', |
| | | 'Content-Type': 'application/json' |
| | | }, |
| | | body: JSON.stringify(payload) |
| | | }) |
| | | .then(exchangeData => exchangeData.json().then(exchangeData => this.setState({exchangeData}))) |
| | | .catch(err => { |
| | | console.log(err) |
| | | this.setState({ |
| | | error: { |
| | | isActive: true, |
| | | header: "Fetching exchange rate failed", |
| | | message: `Got the following error trying to fetch currencies: ${err}`, |
| | | }, |
| | | requestExchangeData: false |
| | | }) |
| | | }) |
| | | }; |
| | | |
| | | closeAlert = () => { |
| | | this.setState({ |
| | | error: { |
| | | isActive: false, |
| | | } |
| | | }) |
| | | } |
| | | |
| | | render() { |
| | | const { exchangeData, requestExchangeData, error } = this.state; |
| | | |
| | | return ( |
| | | <React.Fragment> |
| | | {error.isActive && |
| | | <Alert |
| | | className="popup" |
| | | variant="danger" |
| | | title={error.header} |
| | | action={<AlertActionCloseButton onClose={this.closeAlert} />}> |
| | | {error.message} |
| | | </Alert>} |
| | | <TextContent> |
| | | <Text component="h1" className="centered"> |
| | | <b>Historical Currency Data</b> |
| | | </Text> |
| | | </TextContent> |
| | | <Form onSubmit={this.submit} > |
| | | <Flex> |
| | | <FlexItem> |
| | | <FormGroup |
| | | isInline={true} |
| | | label="Source currency" |
| | | fieldId="source_group" |
| | | > |
| | | <FormSelect |
| | | value={this.state.src} |
| | | onChange={this.onChangeSrc} |
| | | id="src" |
| | | aria-label="FormSelect Input" |
| | | > |
| | | |
| | | {this.state.loading |
| | | ? <FormSelectOption isDisabled={true} label="Loading currencies" /> |
| | | : this.state.currencies.map((curr, index) => ( |
| | | <FormSelectOption key={index} value={curr} label={curr} /> |
| | | )) |
| | | } |
| | | </FormSelect> |
| | | </FormGroup> |
| | | </FlexItem> |
| | | <FlexItem> |
| | | <FormGroup |
| | | label="Target currency" |
| | | isInline={true} |
| | | fieldId="target_group" |
| | | > |
| | | <FormSelect |
| | | value={this.state.target} |
| | | onChange={this.onChangeTarget} |
| | | id="target" |
| | | aria-label="FormSelect Input" |
| | | > |
| | | {this.state.loading |
| | | ? <FormSelectOption isDisabled={true} label="Loading currencies" /> |
| | | : this.state.currencies.map((curr, index) => ( |
| | | <FormSelectOption key={index} value={curr} label={curr} /> |
| | | )) |
| | | } |
| | | </FormSelect> |
| | | </FormGroup> |
| | | </FlexItem> |
| | | </Flex> |
| | | <span> |
| | | <Button isDisabled={this.state.loading || this.state.src === this.state.target} type="submit" variant="primary">Submit</Button> |
| | | </span> |
| | | </Form> |
| | | {requestExchangeData && exchangeData && <RenderedChart data={exchangeData} target={this.state.target} amount={this.state.amount} />} |
| | | {requestExchangeData && !exchangeData && <Spinner />} |
| | | </React.Fragment> |
| | | ) |
| | | } |
| | | }; |
| | | |
| | | export default CurrencyPicker; |
copy from mczernek-exchange-application/frontend/src/Loading.js
copy to exchange-application/frontend/v3/src/Loading.js
copy from mczernek-exchange-application/frontend/src/MainStructure.js
copy to exchange-application/frontend/v3/src/MainStructure.js
File was copied from mczernek-exchange-application/frontend/src/MainStructure.js |
| | |
| | | const { isNavOpen } = this.state; |
| | | |
| | | const logoProps = { |
| | | href: '/' |
| | | href: '/frontend/' |
| | | }; |
| | | const Header = ( |
| | | <PageHeader |
New file |
| | |
| | | import React from 'react'; |
| | | import { |
| | | Nav, |
| | | NavItem, |
| | | NavList, |
| | | } from '@patternfly/react-core'; |
| | | |
| | | import { Link} from "react-router-dom"; |
| | | |
| | | |
| | | |
| | | class NavDefaultList extends React.Component { |
| | | render() { |
| | | var enableNews = process.env.REACT_APP_NEWS_ENABLED |
| | | return ( |
| | | <Nav onSelect={this.onSelect} theme="dark"> |
| | | <NavList> |
| | | <NavItem id="home" isActive={window.location.pathname.endsWith("/")}> |
| | | <Link to="/">Home</Link> |
| | | </NavItem> |
| | | <NavItem id="historical_Data" isActive={window.location.pathname.endsWith("/history")}> |
| | | <Link to="/history" >Historical Data</Link> |
| | | </NavItem> |
| | | <NavItem id="exchange" isActive={window.location.pathname.endsWith("/exchange")}> |
| | | <Link to="/exchange" >Exchange</Link> |
| | | </NavItem> |
| | | {enableNews && |
| | | <NavItem id="news" isActive={window.location.pathname.endsWith("/news")}> |
| | | <Link to="/news" >News</Link> |
| | | </NavItem>} |
| | | </NavList> |
| | | </Nav> |
| | | ); |
| | | } |
| | | } |
| | | |
| | | export default NavDefaultList; |
copy from mczernek-exchange-application/frontend/src/NewsBoard.js
copy to exchange-application/frontend/v3/src/NewsBoard.js
New file |
| | |
| | | import React, { Component } from 'react'; |
| | | import { |
| | | Alert, |
| | | AlertActionCloseButton, |
| | | Form, |
| | | FormGroup, |
| | | FormSelect, |
| | | FormSelectOption, |
| | | Button, |
| | | TextContent, |
| | | Text, |
| | | TextInput, |
| | | TextVariants, |
| | | Flex, |
| | | FlexItem, |
| | | } from '@patternfly/react-core'; |
| | | import Spinner from './Loading'; |
| | | import FetchUtils from './FetchUtils' |
| | | |
| | | class CurrencyPicker extends Component { |
| | | |
| | | constructor(props) { |
| | | super(props); |
| | | this.state = { |
| | | loading: false, |
| | | currencies: [], |
| | | src: 'Loading currencies', |
| | | target: 'Loading currencies', |
| | | exchangeData: '', |
| | | requestExchangeData: false, |
| | | inputValue: 1, |
| | | inputValid: true, |
| | | error: { |
| | | isActive: false, |
| | | } |
| | | }; |
| | | } |
| | | |
| | | componentDidMount() { |
| | | this.setState({ |
| | | loading: true |
| | | }) |
| | | this.getCurrencies() |
| | | } |
| | | |
| | | getCurrencies = () => { |
| | | FetchUtils.fetchWithRetry(`http://${process.env.REACT_APP_GW_ENDPOINT}/currencies`) |
| | | .then(currencies => currencies.json()) |
| | | .then(currencies => this.setState({ |
| | | currencies, src: currencies[0], target: currencies[1], loading: false |
| | | })) |
| | | .catch(err => { |
| | | console.log(err); |
| | | this.setState({ |
| | | error: { |
| | | isActive: true, |
| | | header: "Fetching currencies failed", |
| | | message: `Got the following error trying to fetch currencies: ${err}`, |
| | | } |
| | | }) |
| | | }); |
| | | } |
| | | |
| | | onChangeSrc = (src) => { |
| | | this.setState({ src, requestExchangeData: false }); |
| | | }; |
| | | |
| | | onChangeTarget = (target) => { |
| | | this.setState({ target, requestExchangeData: false }); |
| | | }; |
| | | |
| | | onChangeInput = (inputValue) => { |
| | | const inputValid = this.inputValidation(inputValue); |
| | | this.setState({ inputValue, inputValid }); |
| | | } |
| | | |
| | | inputValidation = (input) => { |
| | | return input > 0 |
| | | } |
| | | |
| | | submit = (e) => { |
| | | e.preventDefault(); |
| | | this.setState({ requestExchangeData: true }) |
| | | |
| | | const payload = { |
| | | source: this.state.src, |
| | | target: this.state.target |
| | | } |
| | | FetchUtils.fetchWithRetry(`http://${process.env.REACT_APP_GW_ENDPOINT}/exchangeRate/singleCurrency`, { |
| | | method: 'POST', |
| | | headers: { |
| | | 'Accept': 'application/json', |
| | | 'Content-Type': 'application/json' |
| | | }, |
| | | body: JSON.stringify(payload) |
| | | }) |
| | | .then(exchangeData => exchangeData.json().then(exchangeData => this.setState({exchangeData}))) |
| | | .catch(err => { |
| | | console.log(err) |
| | | this.setState({ |
| | | error: { |
| | | isActive: true, |
| | | header: "Fetching exchange rate failed", |
| | | message: `Got the following error trying to fetch currencies: ${err}`, |
| | | }, |
| | | requestExchangeData: false |
| | | }) |
| | | }) |
| | | |
| | | }; |
| | | |
| | | closeAlert = () => { |
| | | this.setState({ |
| | | error: { |
| | | isActive: false, |
| | | } |
| | | }) |
| | | } |
| | | |
| | | render() { |
| | | const { exchangeData, requestExchangeData, error } = this.state; |
| | | |
| | | return ( |
| | | <React.Fragment> |
| | | {error.isActive && |
| | | <Alert |
| | | className="popup" |
| | | variant="danger" |
| | | title={error.header} |
| | | action={<AlertActionCloseButton onClose={this.closeAlert} />}> |
| | | {error.message} |
| | | </Alert>} |
| | | <TextContent> |
| | | <Text component="h1" className="centered"> |
| | | <b>Single Currency Exchange</b> |
| | | </Text> |
| | | </TextContent> |
| | | <Form onSubmit={this.submit} > |
| | | <Flex> |
| | | <FlexItem> |
| | | <FormGroup |
| | | isInline={true} |
| | | label="Amount" |
| | | fieldId="amount_group" |
| | | > |
| | | <TextInput |
| | | value={this.state.inputValue} |
| | | name="amount" |
| | | type="number" |
| | | onChange={this.onChangeInput} |
| | | isValid={this.state.inputValid} |
| | | aria-label="amount from input" /> |
| | | </FormGroup> |
| | | </FlexItem> |
| | | <FlexItem> |
| | | <FormGroup |
| | | isInline={true} |
| | | label="Source currency" |
| | | fieldId="source_group" |
| | | > |
| | | <FormSelect |
| | | value={this.state.src} |
| | | onChange={this.onChangeSrc} |
| | | id="src" |
| | | aria-label="FormSelect Input" |
| | | > |
| | | |
| | | {this.state.loading |
| | | ? <FormSelectOption isDisabled={true} label="Loading currencies" /> |
| | | : this.state.currencies.map((curr, index) => ( |
| | | <FormSelectOption key={index} value={curr} label={curr} /> |
| | | )) |
| | | } |
| | | </FormSelect> |
| | | </FormGroup> |
| | | </FlexItem> |
| | | <FlexItem> |
| | | <FormGroup |
| | | label="Target currency" |
| | | isInline={true} |
| | | fieldId="target_group" |
| | | > |
| | | |
| | | <FormSelect |
| | | value={this.state.target} |
| | | onChange={this.onChangeTarget} |
| | | id="target" |
| | | aria-label="FormSelect Input" |
| | | > |
| | | {this.state.loading |
| | | ? <FormSelectOption isDisabled={true} label="Loading currencies" /> |
| | | : this.state.currencies.map((curr, index) => ( |
| | | <FormSelectOption key={index} value={curr} label={curr} /> |
| | | )) |
| | | } |
| | | </FormSelect> |
| | | </FormGroup> |
| | | </FlexItem> |
| | | </Flex> |
| | | <span> |
| | | <Button isDisabled={this.isLoadingOrCurrenciesEqual()} type="submit" variant="primary">Submit</Button> |
| | | </span> |
| | | </Form> |
| | | {this.displayConversion() && |
| | | <div> |
| | | <TextContent className="margin-separator"> |
| | | <Text component={TextVariants.p} className="text-container"> |
| | | <span className="currency-text"> |
| | | {exchangeData.sign} |
| | | </span> |
| | | {exchangeData.value * this.state.inputValue} |
| | | </Text> |
| | | </TextContent> |
| | | </div> |
| | | } |
| | | {requestExchangeData && !exchangeData && <Spinner />} |
| | | </React.Fragment> |
| | | ) |
| | | } |
| | | |
| | | displayConversion() { |
| | | const {requestExchangeData, exchangeData, src, target, inputValue} = this.state; |
| | | return requestExchangeData && exchangeData && |
| | | (src !== target) && |
| | | this.inputValidation(inputValue); |
| | | } |
| | | |
| | | isLoadingOrCurrenciesEqual() { |
| | | const {loading, src, target, inputValue} = this.state; |
| | | return loading || (src === target) || (!this.inputValidation(inputValue)); |
| | | } |
| | | }; |
| | | |
| | | export default CurrencyPicker; |
copy from mczernek-exchange-application/frontend/src/Welcome.js
copy to exchange-application/frontend/v3/src/Welcome.js
File was copied from mczernek-exchange-application/frontend/src/Welcome.js |
| | |
| | | </Text> repository. |
| | | </Text> |
| | | <Text component="p"> |
| | | You can ask questions or file issues at <Text component="a" src="https://github.com/RedHatTraining/DO328-apps/issues"> here</Text>. |
| | | You can ask questions or file issues <Text component="a" href="https://github.com/RedHatTraining/DO328-apps/issues">here</Text>. |
| | | </Text> |
| | | </TextContent> |
| | | |
copy from mczernek-exchange-application/frontend/src/index.js
copy to exchange-application/frontend/v3/src/index.js
copy from mczernek-exchange-application/frontend/src/serviceWorker.js
copy to exchange-application/frontend/v3/src/serviceWorker.js
copy from mczernek-exchange-application/frontend/src/setupTests.js
copy to exchange-application/frontend/v3/src/setupTests.js
copy from mczernek-exchange-application/frontend/yarn.lock
copy to exchange-application/frontend/v3/yarn.lock
New file |
| | |
| | | apiVersion: v1 |
| | | kind: Template |
| | | metadata: |
| | | name: financial-app |
| | | annotations: |
| | | description: "Financial sample application for Red Hat Training" |
| | | objects: |
| | | - apiVersion: networking.istio.io/v1alpha3 |
| | | kind: VirtualService |
| | | metadata: |
| | | name: frontend-vservice |
| | | spec: |
| | | hosts: |
| | | - "*" |
| | | gateways: |
| | | - exchange-gw |
| | | http: |
| | | - match: |
| | | - uri: |
| | | prefix: /frontend |
| | | route: |
| | | - destination: |
| | | host: frontend |
| | | port: |
| | | number: 3000 |
| | | - apiVersion: v1 |
| | | kind: ConfigMap |
| | | metadata: |
| | | name: frontend-cm |
| | | data: |
| | | GW_ADDR: ${INGRESS_GW}/exchange |
| | | - apiVersion: apps/v1 |
| | | kind: Deployment |
| | | metadata: |
| | | name: frontend |
| | | spec: |
| | | selector: |
| | | matchLabels: |
| | | app: frontend |
| | | replicas: 1 |
| | | template: |
| | | metadata: |
| | | labels: |
| | | app: frontend |
| | | annotations: |
| | | sidecar.istio.io/inject: "true" |
| | | spec: |
| | | containers: |
| | | - name: frontend |
| | | image: quay.io/redhattraining/ossm-frontend:${FRONTEND_TAG} |
| | | imagePullPolicy: Always |
| | | ports: |
| | | - containerPort: 3000 |
| | | env: |
| | | - name: REACT_APP_GW_ENDPOINT |
| | | valueFrom: |
| | | configMapKeyRef: |
| | | name: frontend-cm |
| | | key: GW_ADDR |
| | | - name: REACT_APP_NEWS_ENABLED |
| | | value: ${NEWS_ENABLED} |
| | | - kind: Service |
| | | apiVersion: v1 |
| | | metadata: |
| | | labels: |
| | | app: frontend |
| | | name: frontend |
| | | spec: |
| | | ports: |
| | | - port: 3000 |
| | | protocol: TCP |
| | | targetPort: 3000 |
| | | selector: |
| | | app: frontend |
| | | - kind: Deployment |
| | | apiVersion: apps/v1 |
| | | metadata: |
| | | name: history |
| | | spec: |
| | | selector: |
| | | matchLabels: |
| | | app: history |
| | | replicas: 1 |
| | | template: |
| | | metadata: |
| | | labels: |
| | | app: history |
| | | annotations: |
| | | sidecar.istio.io/inject: "true" |
| | | spec: |
| | | containers: |
| | | - name: history |
| | | image: quay.io/redhattraining/ossm-history:${HISTORY_TAG} |
| | | imagePullPolicy: Always |
| | | ports: |
| | | - containerPort: 8080 |
| | | - kind: Service |
| | | apiVersion: v1 |
| | | metadata: |
| | | labels: |
| | | app: history |
| | | name: history |
| | | spec: |
| | | ports: |
| | | - port: 8080 |
| | | protocol: TCP |
| | | targetPort: 8080 |
| | | selector: |
| | | app: history |
| | | - kind: Deployment |
| | | apiVersion: apps/v1 |
| | | metadata: |
| | | name: currency |
| | | spec: |
| | | selector: |
| | | matchLabels: |
| | | app: currency |
| | | replicas: 1 |
| | | template: |
| | | metadata: |
| | | labels: |
| | | app: currency |
| | | annotations: |
| | | sidecar.istio.io/inject: "true" |
| | | spec: |
| | | containers: |
| | | - name: currency |
| | | image: quay.io/redhattraining/ossm-currencies:${CURRENCIES_TAG} |
| | | imagePullPolicy: Always |
| | | ports: |
| | | - containerPort: 5000 |
| | | - kind: Service |
| | | apiVersion: v1 |
| | | metadata: |
| | | labels: |
| | | app: currency |
| | | name: currency |
| | | spec: |
| | | ports: |
| | | - port: 5000 |
| | | protocol: TCP |
| | | targetPort: 5000 |
| | | selector: |
| | | app: currency |
| | | - kind: Gateway |
| | | apiVersion: networking.istio.io/v1alpha3 |
| | | metadata: |
| | | name: exchange-gw |
| | | spec: |
| | | selector: |
| | | istio: ingressgateway # use istio default controller |
| | | servers: |
| | | - port: |
| | | number: 80 |
| | | name: http |
| | | protocol: HTTP |
| | | hosts: |
| | | - "*" |
| | | - kind: VirtualService |
| | | apiVersion: networking.istio.io/v1alpha3 |
| | | metadata: |
| | | name: exchange-vservice |
| | | spec: |
| | | hosts: |
| | | - "*" |
| | | gateways: |
| | | - exchange-gw |
| | | http: |
| | | - match: |
| | | - uri: |
| | | prefix: /exchange |
| | | rewrite: |
| | | uri: / |
| | | route: |
| | | - destination: |
| | | host: exchange |
| | | port: |
| | | number: 8080 |
| | | - kind: Deployment |
| | | apiVersion: apps/v1 |
| | | metadata: |
| | | name: exchange |
| | | spec: |
| | | selector: |
| | | matchLabels: |
| | | app: exchange |
| | | replicas: 1 |
| | | template: |
| | | metadata: |
| | | labels: |
| | | app: exchange |
| | | annotations: |
| | | sidecar.istio.io/inject: "true" |
| | | spec: |
| | | containers: |
| | | - name: exchange |
| | | image: quay.io/redhattraining/ossm-exchange:${EXCHANGE_TAG} |
| | | imagePullPolicy: Always |
| | | ports: |
| | | - containerPort: 8080 |
| | | env: |
| | | - name: NEWS_ENDPOINT |
| | | value: ${NEWS_ENDPOINT} |
| | | - kind: Service |
| | | apiVersion: v1 |
| | | metadata: |
| | | labels: |
| | | app: exchange |
| | | name: exchange |
| | | spec: |
| | | ports: |
| | | - port: 8080 |
| | | protocol: TCP |
| | | targetPort: 8080 |
| | | selector: |
| | | app: exchange |
| | | |
| | | parameters: |
| | | - name: INGRESS_GW |
| | | description: "The address of the Istio Ingress Gateway, to be used for the external exchange service" |
| | | required: true |
| | | - name: FRONTEND_TAG |
| | | description: "The tag of the image used to deploy the Frontend service" |
| | | required: false |
| | | value: "1.0" |
| | | - name: HISTORY_TAG |
| | | description: "The tag of the image used to deploy the History service" |
| | | required: false |
| | | value: "1.0" |
| | | - name: CURRENCIES_TAG |
| | | description: "The tag of the image used to deploy the Currencies service" |
| | | required: false |
| | | value: "1.0" |
| | | - name: EXCHANGE_TAG |
| | | description: "The tag of the image used to deploy the EXCHANGE service" |
| | | required: false |
| | | value: "1.0" |
| | | - name: NEWS_ENDPOINT |
| | | description: "URL of the news application backend" |
| | | required: false |
| | | value: "" |
| | | - name: NEWS_ENABLED |
| | | description: "Flag whether to show the news part of the application or not. Empty variable means false." |
| | | required: false |
| | | value: "" |
New file |
| | |
| | | FROM registry.access.redhat.com/ubi8/ubi-minimal |
| | | WORKDIR /work/ |
| | | COPY target/*-runner /work/application |
| | | RUN chmod 775 /work |
| | | EXPOSE 8080 |
| | | CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] |
New file |
| | |
| | | MIT License |
| | | |
| | | Copyright (c) 2020 RedHat Training |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy |
| | | of this software and associated documentation files (the "Software"), to deal |
| | | in the Software without restriction, including without limitation the rights |
| | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| | | copies of the Software, and to permit persons to whom the Software is |
| | | furnished to do so, subject to the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be included in all |
| | | copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| | | SOFTWARE. |
New file |
| | |
| | | # gateway microservice v1 |
| | | |
| | | This is a simple microservice that simulates a payment gateway service. |
| | | It accepts payment amounts and returns a randomly generated transaction id. |
| | | |
| | | This project uses `Quarkus`, the Supersonic Subatomic Java Framework. |
| | | |
| | | If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ . |
| | | |
| | | ## Running the application in dev mode |
| | | |
| | | You can run your application in dev mode that enables live coding using: |
| | | ``` |
| | | mvn clean quarkus:dev |
| | | ``` |
| | | |
| | | ## Packaging and running the application |
| | | |
| | | The application is packageable using `mvn clean package`. |
| | | It produces the executable `gateway-1.0.0-runner.jar` file in `/target` directory. |
| | | |
| | | The application is now runnable using `java -jar target/gateway-1.0.0-runner.jar`. |
| | | |
| | | ## Creating a native executable |
| | | |
| | | You can create a native executable using: `mvn clean package -Pnative`. |
| | | |
| | | Or you can use Docker to build the native executable using: `mvn clean package -Pnative -Dquarkus.native.container-build=true`. |
| | | |
| | | You can then execute your binary: `./target/gateway-1.0.0-runner` |
| | | |
| | | If you want to learn more about building native executables, please consult https://quarkus.io/guides/building-native-image-guide . |
New file |
| | |
| | | <?xml version="1.0"?> |
| | | <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <groupId>com.redhat.training</groupId> |
| | | <artifactId>gateway</artifactId> |
| | | <version>1.0.0</version> |
| | | <properties> |
| | | <compiler-plugin.version>3.8.1</compiler-plugin.version> |
| | | <maven.compiler.parameters>true</maven.compiler.parameters> |
| | | <maven.compiler.source>1.8</maven.compiler.source> |
| | | <maven.compiler.target>1.8</maven.compiler.target> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | | <quarkus-plugin.version>1.3.2.Final</quarkus-plugin.version> |
| | | <quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id> |
| | | <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id> |
| | | <quarkus.platform.version>1.3.2.Final</quarkus.platform.version> |
| | | <surefire-plugin.version>2.22.1</surefire-plugin.version> |
| | | </properties> |
| | | <dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>${quarkus.platform.group-id}</groupId> |
| | | <artifactId>${quarkus.platform.artifact-id}</artifactId> |
| | | <version>${quarkus.platform.version}</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | </dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-resteasy</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-resteasy-jsonb</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-rest-client</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-smallrye-health</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-maven-plugin</artifactId> |
| | | <version>${quarkus-plugin.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>build</goal> |
| | | </goals> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-compiler-plugin</artifactId> |
| | | <version>${compiler-plugin.version}</version> |
| | | <configuration> |
| | | <source>1.8</source> |
| | | <target>1.8</target> |
| | | <!-- the parameters=true option is critical so that RESTEasy works fine --> |
| | | <parameters>true</parameters> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-surefire-plugin</artifactId> |
| | | <version>${surefire-plugin.version}</version> |
| | | <configuration> |
| | | <systemProperties> |
| | | <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> |
| | | </systemProperties> |
| | | </configuration> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | <profiles> |
| | | <profile> |
| | | <id>native</id> |
| | | <activation> |
| | | <property> |
| | | <name>native</name> |
| | | </property> |
| | | </activation> |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <artifactId>maven-failsafe-plugin</artifactId> |
| | | <version>${surefire-plugin.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>integration-test</goal> |
| | | <goal>verify</goal> |
| | | </goals> |
| | | <configuration> |
| | | <systemProperties> |
| | | <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> |
| | | </systemProperties> |
| | | </configuration> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | <properties> |
| | | <quarkus.package.type>native</quarkus.package.type> |
| | | </properties> |
| | | </profile> |
| | | </profiles> |
| | | </project> |
New file |
| | |
| | | package com.redhat.training.gateway; |
| | | |
| | | import javax.enterprise.context.ApplicationScoped; |
| | | import javax.ws.rs.GET; |
| | | import javax.ws.rs.Path; |
| | | import javax.ws.rs.PathParam; |
| | | import javax.ws.rs.Produces; |
| | | import javax.ws.rs.core.MediaType; |
| | | import javax.inject.Inject; |
| | | |
| | | import org.jboss.logging.Logger; |
| | | import java.util.Random; |
| | | |
| | | @Path("/processPayment") |
| | | @ApplicationScoped |
| | | public class PaymentGatewayResource { |
| | | |
| | | private static final Logger log = Logger.getLogger(PaymentGatewayResource.class.getName()); |
| | | |
| | | @GET |
| | | @Produces(MediaType.TEXT_PLAIN) |
| | | @Path("{amount}") |
| | | public String processPayment(@PathParam("amount") String amount) { |
| | | |
| | | log.info("Processing payment for $" + amount + " through gateway-v1..."); |
| | | |
| | | Integer transactionId = getRandom(1000, 10000); |
| | | |
| | | return transactionId.toString(); |
| | | } |
| | | |
| | | private Integer getRandom(int min, int max) { |
| | | Random random = new Random(); |
| | | Integer number = random.nextInt((max - min) + 1) + min; |
| | | |
| | | return number; |
| | | } |
| | | } |
New file |
| | |
| | | quarkus.http.port=8080 |
| | | quarkus.package.uber-jar=true |
| | | quarkus.http.cors=true |
| | | quarkus.http.cors.methods=GET,PUT,POST,DELETE |
| | | quarkus.http.cors.headers=X-Custom |
| | | quarkus.http.cors.exposed-headers=Content-Disposition |
| | | |
New file |
| | |
| | | FROM registry.access.redhat.com/ubi8/ubi-minimal |
| | | WORKDIR /work/ |
| | | COPY target/*-runner /work/application |
| | | RUN chmod 775 /work |
| | | EXPOSE 8080 |
| | | CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] |
New file |
| | |
| | | MIT License |
| | | |
| | | Copyright (c) 2020 RedHat Training |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy |
| | | of this software and associated documentation files (the "Software"), to deal |
| | | in the Software without restriction, including without limitation the rights |
| | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| | | copies of the Software, and to permit persons to whom the Software is |
| | | furnished to do so, subject to the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be included in all |
| | | copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| | | SOFTWARE. |
New file |
| | |
| | | # gateway microservice v2 |
| | | |
| | | This is a simple microservice that simulates a bitcoin payment gateway service. |
| | | It accepts payment amounts and returns a randomly generated transaction id. |
| | | |
| | | This project uses `Quarkus`, the Supersonic Subatomic Java Framework. |
| | | |
| | | If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ . |
| | | |
| | | ## Running the application in dev mode |
| | | |
| | | You can run your application in dev mode that enables live coding using: |
| | | ``` |
| | | mvn clean quarkus:dev |
| | | ``` |
| | | |
| | | ## Packaging and running the application |
| | | |
| | | The application is packageable using `mvn clean package`. |
| | | It produces the executable `gateway-2.0.0-runner.jar` file in `/target` directory. |
| | | |
| | | The application is now runnable using `java -jar target/gateway-2.0.0-runner.jar`. |
| | | |
| | | ## Creating a native executable |
| | | |
| | | You can create a native executable using: `mvn clean package -Pnative`. |
| | | |
| | | Or you can use Docker to build the native executable using: `mvn clean package -Pnative -Dquarkus.native.container-build=true`. |
| | | |
| | | You can then execute your binary: `./target/gateway-2.0.0-runner` |
| | | |
| | | If you want to learn more about building native executables, please consult https://quarkus.io/guides/building-native-image-guide . |
New file |
| | |
| | | <?xml version="1.0"?> |
| | | <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <groupId>com.redhat.training</groupId> |
| | | <artifactId>gateway</artifactId> |
| | | <version>2.0.0</version> |
| | | <properties> |
| | | <compiler-plugin.version>3.8.1</compiler-plugin.version> |
| | | <maven.compiler.parameters>true</maven.compiler.parameters> |
| | | <maven.compiler.source>1.8</maven.compiler.source> |
| | | <maven.compiler.target>1.8</maven.compiler.target> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | | <quarkus-plugin.version>1.3.2.Final</quarkus-plugin.version> |
| | | <quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id> |
| | | <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id> |
| | | <quarkus.platform.version>1.3.2.Final</quarkus.platform.version> |
| | | <surefire-plugin.version>2.22.1</surefire-plugin.version> |
| | | </properties> |
| | | <dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>${quarkus.platform.group-id}</groupId> |
| | | <artifactId>${quarkus.platform.artifact-id}</artifactId> |
| | | <version>${quarkus.platform.version}</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | </dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-resteasy</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-resteasy-jsonb</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-rest-client</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-smallrye-health</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-maven-plugin</artifactId> |
| | | <version>${quarkus-plugin.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>build</goal> |
| | | </goals> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-compiler-plugin</artifactId> |
| | | <version>${compiler-plugin.version}</version> |
| | | <configuration> |
| | | <source>1.8</source> |
| | | <target>1.8</target> |
| | | <!-- the parameters=true option is critical so that RESTEasy works fine --> |
| | | <parameters>true</parameters> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-surefire-plugin</artifactId> |
| | | <version>${surefire-plugin.version}</version> |
| | | <configuration> |
| | | <systemProperties> |
| | | <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> |
| | | </systemProperties> |
| | | </configuration> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | <profiles> |
| | | <profile> |
| | | <id>native</id> |
| | | <activation> |
| | | <property> |
| | | <name>native</name> |
| | | </property> |
| | | </activation> |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <artifactId>maven-failsafe-plugin</artifactId> |
| | | <version>${surefire-plugin.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>integration-test</goal> |
| | | <goal>verify</goal> |
| | | </goals> |
| | | <configuration> |
| | | <systemProperties> |
| | | <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> |
| | | </systemProperties> |
| | | </configuration> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | <properties> |
| | | <quarkus.package.type>native</quarkus.package.type> |
| | | </properties> |
| | | </profile> |
| | | </profiles> |
| | | </project> |
New file |
| | |
| | | package com.redhat.training.gateway; |
| | | |
| | | import javax.enterprise.context.ApplicationScoped; |
| | | import javax.ws.rs.GET; |
| | | import javax.ws.rs.Path; |
| | | import javax.ws.rs.PathParam; |
| | | import javax.ws.rs.Produces; |
| | | import javax.ws.rs.core.MediaType; |
| | | |
| | | import org.jboss.logging.Logger; |
| | | import java.util.Random; |
| | | |
| | | @Path("/processPayment") |
| | | @ApplicationScoped |
| | | public class PaymentGatewayResource { |
| | | |
| | | private static final Logger log = Logger.getLogger(PaymentGatewayResource.class.getName()); |
| | | |
| | | @GET |
| | | @Produces(MediaType.TEXT_PLAIN) |
| | | @Path("{amount}") |
| | | public String processPayment(@PathParam("amount") String amount) { |
| | | |
| | | log.info("Processing payment for $" + amount + " through gateway-v2..."); |
| | | |
| | | Integer transactionId = getRandom(1000, 10000); |
| | | |
| | | return transactionId.toString(); |
| | | } |
| | | |
| | | private Integer getRandom(int min, int max) { |
| | | Random random = new Random(); |
| | | Integer number = random.nextInt((max - min) + 1) + min; |
| | | |
| | | return number; |
| | | } |
| | | } |
New file |
| | |
| | | quarkus.http.port=8080 |
| | | quarkus.package.uber-jar=true |
| | | quarkus.http.cors=true |
| | | quarkus.http.cors.methods=GET,PUT,POST,DELETE |
| | | quarkus.http.cors.headers=X-Custom |
| | | quarkus.http.cors.exposed-headers=Content-Disposition |
| | | |
New file |
| | |
| | | FROM registry.access.redhat.com/ubi8/ubi-minimal |
| | | WORKDIR /work/ |
| | | COPY target/*-runner /work/application |
| | | RUN chmod 775 /work |
| | | EXPOSE 8080 |
| | | CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] |
New file |
| | |
| | | MIT License |
| | | |
| | | Copyright (c) 2020 RedHat Training |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy |
| | | of this software and associated documentation files (the "Software"), to deal |
| | | in the Software without restriction, including without limitation the rights |
| | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| | | copies of the Software, and to permit persons to whom the Software is |
| | | furnished to do so, subject to the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be included in all |
| | | copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| | | SOFTWARE. |
New file |
| | |
| | | # payment microservice v1 |
| | | |
| | | This is a simple microservice that simulates a payment service. |
| | | It accepts payment requests and calls the `bank-gw` service to process payments. |
| | | |
| | | This project uses `Quarkus`, the Supersonic Subatomic Java Framework. |
| | | |
| | | If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ . |
| | | |
| | | ## Running the application in dev mode |
| | | |
| | | You can run your application in dev mode that enables live coding using: |
| | | ``` |
| | | mvn clean quarkus:dev |
| | | ``` |
| | | |
| | | ## Packaging and running the application |
| | | |
| | | The application is packageable using `mvn clean package`. |
| | | It produces the executable `payment-1.0.0-runner.jar` file in `/target` directory. |
| | | |
| | | The application is now runnable using `java -jar target/payment-1.0.0-runner.jar`. |
| | | |
| | | ## Creating a native executable |
| | | |
| | | You can create a native executable using: `mvn clean package -Pnative`. |
| | | |
| | | Or you can use Docker to build the native executable using: `mvn clean package -Pnative -Dquarkus.native.container-build=true`. |
| | | |
| | | You can then execute your binary: `./target/payment-1.0.0-runner` |
| | | |
| | | If you want to learn more about building native executables, please consult https://quarkus.io/guides/building-native-image-guide . |
New file |
| | |
| | | <?xml version="1.0"?> |
| | | <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <groupId>com.redhat.training</groupId> |
| | | <artifactId>payment</artifactId> |
| | | <version>1.0.0</version> |
| | | <properties> |
| | | <compiler-plugin.version>3.8.1</compiler-plugin.version> |
| | | <maven.compiler.parameters>true</maven.compiler.parameters> |
| | | <maven.compiler.source>1.8</maven.compiler.source> |
| | | <maven.compiler.target>1.8</maven.compiler.target> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | | <quarkus-plugin.version>1.3.2.Final</quarkus-plugin.version> |
| | | <quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id> |
| | | <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id> |
| | | <quarkus.platform.version>1.3.2.Final</quarkus.platform.version> |
| | | <surefire-plugin.version>2.22.1</surefire-plugin.version> |
| | | </properties> |
| | | <dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>${quarkus.platform.group-id}</groupId> |
| | | <artifactId>${quarkus.platform.artifact-id}</artifactId> |
| | | <version>${quarkus.platform.version}</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | </dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-resteasy</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-resteasy-jsonb</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-rest-client</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-smallrye-health</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-maven-plugin</artifactId> |
| | | <version>${quarkus-plugin.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>build</goal> |
| | | </goals> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-compiler-plugin</artifactId> |
| | | <version>${compiler-plugin.version}</version> |
| | | <configuration> |
| | | <source>1.8</source> |
| | | <target>1.8</target> |
| | | <!-- the parameters=true option is critical so that RESTEasy works fine --> |
| | | <parameters>true</parameters> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-surefire-plugin</artifactId> |
| | | <version>${surefire-plugin.version}</version> |
| | | <configuration> |
| | | <systemProperties> |
| | | <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> |
| | | </systemProperties> |
| | | </configuration> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | <profiles> |
| | | <profile> |
| | | <id>native</id> |
| | | <activation> |
| | | <property> |
| | | <name>native</name> |
| | | </property> |
| | | </activation> |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <artifactId>maven-failsafe-plugin</artifactId> |
| | | <version>${surefire-plugin.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>integration-test</goal> |
| | | <goal>verify</goal> |
| | | </goals> |
| | | <configuration> |
| | | <systemProperties> |
| | | <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> |
| | | </systemProperties> |
| | | </configuration> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | <properties> |
| | | <quarkus.package.type>native</quarkus.package.type> |
| | | </properties> |
| | | </profile> |
| | | </profiles> |
| | | </project> |
New file |
| | |
| | | package com.redhat.training.payment; |
| | | |
| | | import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; |
| | | |
| | | import javax.ws.rs.GET; |
| | | import javax.ws.rs.Path; |
| | | import javax.ws.rs.PathParam; |
| | | import javax.ws.rs.Produces; |
| | | import javax.ws.rs.core.MediaType; |
| | | |
| | | @RegisterRestClient |
| | | public interface PaymentGatewayService { |
| | | |
| | | @Path("/processPayment/{amount}") |
| | | @GET |
| | | @Produces(MediaType.TEXT_PLAIN) |
| | | public String processPayment(@PathParam("amount") String amount); |
| | | |
| | | } |
New file |
| | |
| | | package com.redhat.training.payment; |
| | | |
| | | import javax.enterprise.context.ApplicationScoped; |
| | | import javax.ws.rs.GET; |
| | | import javax.ws.rs.Path; |
| | | import javax.ws.rs.PathParam; |
| | | import javax.ws.rs.Produces; |
| | | import javax.ws.rs.core.MediaType; |
| | | import javax.ws.rs.core.Response; |
| | | import javax.inject.Inject; |
| | | import org.jboss.logging.Logger; |
| | | |
| | | import org.eclipse.microprofile.rest.client.inject.RestClient; |
| | | |
| | | @Path("/pay") |
| | | @ApplicationScoped |
| | | public class PaymentResource { |
| | | |
| | | private static final Logger log = Logger.getLogger(PaymentResource.class.getName()); |
| | | |
| | | @Inject |
| | | @RestClient |
| | | PaymentGatewayService gatewayService; |
| | | |
| | | String message; |
| | | String transactionId; |
| | | Response.Status status; |
| | | |
| | | @GET |
| | | @Produces(MediaType.TEXT_PLAIN) |
| | | @Path("{amount}") |
| | | public Response acceptPayment(@PathParam("amount") String amount) { |
| | | |
| | | try { |
| | | transactionId = gatewayService.processPayment(amount); |
| | | log.info(transactionId); |
| | | message = String.format("[payment-v1] OK. Transaction id is %s\n", transactionId); |
| | | status = Response.Status.OK; |
| | | } |
| | | catch (Exception e) { |
| | | log.error(e); |
| | | message = "[payment-v1] FAIL!\n"; |
| | | status = Response.Status.INTERNAL_SERVER_ERROR; |
| | | } |
| | | |
| | | return Response |
| | | .status(status) |
| | | .entity(message) |
| | | .build(); |
| | | } |
| | | } |
New file |
| | |
| | | quarkus.http.port=8080 |
| | | quarkus.package.uber-jar=true |
| | | quarkus.http.cors=true |
| | | quarkus.http.cors.methods=GET,PUT,POST,DELETE |
| | | quarkus.http.cors.headers=X-Custom |
| | | quarkus.http.cors.exposed-headers=Content-Disposition |
| | | |
| | | com.redhat.training.payment.PaymentGatewayService/mp-rest/url=http://gateway:8080 |
New file |
| | |
| | | FROM registry.access.redhat.com/ubi8/ubi-minimal |
| | | WORKDIR /work/ |
| | | COPY target/*-runner /work/application |
| | | RUN chmod 775 /work |
| | | EXPOSE 8080 |
| | | CMD ["./application", "-Dquarkus.http.host=0.0.0.0"] |
New file |
| | |
| | | MIT License |
| | | |
| | | Copyright (c) 2020 RedHat Training |
| | | |
| | | Permission is hereby granted, free of charge, to any person obtaining a copy |
| | | of this software and associated documentation files (the "Software"), to deal |
| | | in the Software without restriction, including without limitation the rights |
| | | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| | | copies of the Software, and to permit persons to whom the Software is |
| | | furnished to do so, subject to the following conditions: |
| | | |
| | | The above copyright notice and this permission notice shall be included in all |
| | | copies or substantial portions of the Software. |
| | | |
| | | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| | | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| | | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| | | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| | | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| | | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| | | SOFTWARE. |
New file |
| | |
| | | # payment microservice v2 |
| | | |
| | | This is a simple microservice that simulates a payment service. |
| | | It accepts payment requests and calls the `bank-gw` service to process payments. |
| | | |
| | | This project uses `Quarkus`, the Supersonic Subatomic Java Framework. |
| | | |
| | | If you want to learn more about Quarkus, please visit its website: https://quarkus.io/ . |
| | | |
| | | ## Running the application in dev mode |
| | | |
| | | You can run your application in dev mode that enables live coding using: |
| | | ``` |
| | | mvn clean quarkus:dev |
| | | ``` |
| | | |
| | | ## Packaging and running the application |
| | | |
| | | The application is packageable using `mvn clean package`. |
| | | It produces the executable `payment-1.0.0-runner.jar` file in `/target` directory. |
| | | |
| | | The application is now runnable using `java -jar target/payment-1.0.0-runner.jar`. |
| | | |
| | | ## Creating a native executable |
| | | |
| | | You can create a native executable using: `mvn clean package -Pnative`. |
| | | |
| | | Or you can use Docker to build the native executable using: `mvn clean package -Pnative -Dquarkus.native.container-build=true`. |
| | | |
| | | You can then execute your binary: `./target/payment-1.0.0-runner` |
| | | |
| | | If you want to learn more about building native executables, please consult https://quarkus.io/guides/building-native-image-guide . |
New file |
| | |
| | | <?xml version="1.0"?> |
| | | <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" |
| | | xmlns="http://maven.apache.org/POM/4.0.0" |
| | | xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> |
| | | <modelVersion>4.0.0</modelVersion> |
| | | <groupId>com.redhat.training</groupId> |
| | | <artifactId>payment</artifactId> |
| | | <version>2.0.0</version> |
| | | <properties> |
| | | <compiler-plugin.version>3.8.1</compiler-plugin.version> |
| | | <maven.compiler.parameters>true</maven.compiler.parameters> |
| | | <maven.compiler.source>1.8</maven.compiler.source> |
| | | <maven.compiler.target>1.8</maven.compiler.target> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | | <quarkus-plugin.version>1.3.2.Final</quarkus-plugin.version> |
| | | <quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id> |
| | | <quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id> |
| | | <quarkus.platform.version>1.3.2.Final</quarkus.platform.version> |
| | | <surefire-plugin.version>2.22.1</surefire-plugin.version> |
| | | </properties> |
| | | <dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>${quarkus.platform.group-id}</groupId> |
| | | <artifactId>${quarkus.platform.artifact-id}</artifactId> |
| | | <version>${quarkus.platform.version}</version> |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency> |
| | | </dependencies> |
| | | </dependencyManagement> |
| | | <dependencies> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-resteasy</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-resteasy-jsonb</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-rest-client</artifactId> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-smallrye-health</artifactId> |
| | | </dependency> |
| | | </dependencies> |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <groupId>io.quarkus</groupId> |
| | | <artifactId>quarkus-maven-plugin</artifactId> |
| | | <version>${quarkus-plugin.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>build</goal> |
| | | </goals> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-compiler-plugin</artifactId> |
| | | <version>${compiler-plugin.version}</version> |
| | | <configuration> |
| | | <source>1.8</source> |
| | | <target>1.8</target> |
| | | <!-- the parameters=true option is critical so that RESTEasy works fine --> |
| | | <parameters>true</parameters> |
| | | </configuration> |
| | | </plugin> |
| | | <plugin> |
| | | <artifactId>maven-surefire-plugin</artifactId> |
| | | <version>${surefire-plugin.version}</version> |
| | | <configuration> |
| | | <systemProperties> |
| | | <java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager> |
| | | </systemProperties> |
| | | </configuration> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | <profiles> |
| | | <profile> |
| | | <id>native</id> |
| | | <activation> |
| | | <property> |
| | | <name>native</name> |
| | | </property> |
| | | </activation> |
| | | <build> |
| | | <plugins> |
| | | <plugin> |
| | | <artifactId>maven-failsafe-plugin</artifactId> |
| | | <version>${surefire-plugin.version}</version> |
| | | <executions> |
| | | <execution> |
| | | <goals> |
| | | <goal>integration-test</goal> |
| | | <goal>verify</goal> |
| | | </goals> |
| | | <configuration> |
| | | <systemProperties> |
| | | <native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path> |
| | | </systemProperties> |
| | | </configuration> |
| | | </execution> |
| | | </executions> |
| | | </plugin> |
| | | </plugins> |
| | | </build> |
| | | <properties> |
| | | <quarkus.package.type>native</quarkus.package.type> |
| | | </properties> |
| | | </profile> |
| | | </profiles> |
| | | </project> |
New file |
| | |
| | | package com.redhat.training.payment; |
| | | |
| | | import org.eclipse.microprofile.rest.client.inject.RegisterRestClient; |
| | | |
| | | import javax.ws.rs.GET; |
| | | import javax.ws.rs.Path; |
| | | import javax.ws.rs.PathParam; |
| | | import javax.ws.rs.Produces; |
| | | import javax.ws.rs.core.MediaType; |
| | | |
| | | @RegisterRestClient |
| | | public interface PaymentGatewayService { |
| | | |
| | | @Path("/processPayment/{amount}") |
| | | @GET |
| | | @Produces(MediaType.TEXT_PLAIN) |
| | | public String processPayment(@PathParam("amount") String amount); |
| | | |
| | | } |
New file |
| | |
| | | package com.redhat.training.payment; |
| | | |
| | | import javax.enterprise.context.ApplicationScoped; |
| | | import javax.ws.rs.GET; |
| | | import javax.ws.rs.Path; |
| | | import javax.ws.rs.PathParam; |
| | | import javax.ws.rs.Produces; |
| | | import javax.ws.rs.core.MediaType; |
| | | import javax.ws.rs.core.Response; |
| | | import javax.inject.Inject; |
| | | import org.jboss.logging.Logger; |
| | | |
| | | import org.eclipse.microprofile.rest.client.inject.RestClient; |
| | | |
| | | @Path("/pay") |
| | | @ApplicationScoped |
| | | public class PaymentResource { |
| | | |
| | | private static final Logger log = Logger.getLogger(PaymentResource.class.getName()); |
| | | |
| | | @Inject |
| | | @RestClient |
| | | PaymentGatewayService gatewayService; |
| | | |
| | | String message; |
| | | String transactionId; |
| | | Response.Status status; |
| | | |
| | | @GET |
| | | @Produces(MediaType.TEXT_PLAIN) |
| | | @Path("{amount}") |
| | | public Response acceptPayment(@PathParam("amount") String amount) { |
| | | |
| | | try { |
| | | transactionId = gatewayService.processPayment(amount); |
| | | message = String.format("[payment-v2] OK. Transaction id is %s\n", transactionId); |
| | | status = Response.Status.OK; |
| | | } |
| | | catch (Exception e) { |
| | | log.error(e); |
| | | message = "[payment-v2] FAIL!\n"; |
| | | status = Response.Status.INTERNAL_SERVER_ERROR; |
| | | } |
| | | |
| | | return Response |
| | | .status(status) |
| | | .entity(message) |
| | | .build(); |
| | | } |
| | | } |
New file |
| | |
| | | quarkus.http.port=8080 |
| | | quarkus.package.uber-jar=true |
| | | quarkus.http.cors=true |
| | | quarkus.http.cors.methods=GET,PUT,POST,DELETE |
| | | quarkus.http.cors.headers=X-Custom |
| | | quarkus.http.cors.exposed-headers=Content-Disposition |
| | | |
| | | com.redhat.training.payment.PaymentGatewayService/mp-rest/url=http://gateway:8080 |
copy from python-flask-gossip/Dockerfile
copy to python-flask-gossip/v2/Dockerfile
copy from python-flask-gossip/README.md
copy to python-flask-gossip/v2/README.md
New file |
| | |
| | | apiVersion: apps/v1 |
| | | kind: Deployment |
| | | metadata: |
| | | name: news |
| | | spec: |
| | | selector: |
| | | matchLabels: |
| | | app: news |
| | | replicas: 1 |
| | | template: |
| | | metadata: |
| | | labels: |
| | | app: news |
| | | spec: |
| | | containers: |
| | | - name: news |
| | | image: quay.io/redhattraining/ossm-python-flask-gossip:2.0 |
| | | ports: |
| | | - containerPort: 5000 |
| | | --- |
| | | apiVersion: v1 |
| | | kind: Service |
| | | metadata: |
| | | labels: |
| | | app: news |
| | | name: news |
| | | spec: |
| | | ports: |
| | | - port: 5000 |
| | | protocol: TCP |
| | | targetPort: 5000 |
| | | selector: |
| | | app: news |
| | | --- |
| | | kind: Route |
| | | apiVersion: route.openshift.io/v1 |
| | | metadata: |
| | | name: news |
| | | labels: |
| | | app: news |
| | | spec: |
| | | to: |
| | | kind: Service |
| | | name: news |
| | | port: |
| | | targetPort: 5000 |
copy from python-flask-gossip/requirements.txt
copy to python-flask-gossip/v2/requirements.txt
copy from python-flask-gossip/src/data/finance.json
copy to python-flask-gossip/v2/src/data/finance.json
New file |
| | |
| | | import json |
| | | import os |
| | | import random |
| | | from flask import abort, Flask, jsonify |
| | | from flask_cors import CORS |
| | | from markupsafe import escape |
| | | |
| | | app = Flask(__name__) |
| | | CORS(app) |
| | | |
| | | NUM_OF_NEWS = 3 |
| | | DATA_FOLDER = escape(os.environ.get('DATA_FOLDER', 'data')) |
| | | ERROR_RESPONSE = int(os.environ.get('ERROR_RESPONSE', 404)) |
| | | |
| | | def sortByTimestamp(element): |
| | | return element['timestamp'] |
| | | |
| | | @app.errorhandler(404) |
| | | def topicNotFound(error): |
| | | return "Unable to find the specific topic", 404 |
| | | |
| | | @app.route('/news/<string:topic>') |
| | | def getNewsForTopic(topic): |
| | | try: |
| | | # Loading the file which has the topic news |
| | | with open('./%s/%s.json' % (DATA_FOLDER, escape(topic))) as topicFile: |
| | | news = json.load(topicFile) |
| | | |
| | | # Picking only a few elements from the list of news |
| | | randomSelection = random.sample(news['data'], NUM_OF_NEWS) |
| | | |
| | | # Sorting the resulting list by the timestamp |
| | | randomSelection.sort(key=sortByTimestamp) |
| | | |
| | | return jsonify(randomSelection) |
| | | |
| | | # If we can not find a file for the topic, we throw an error |
| | | except IOError: |
| | | abort(ERROR_RESPONSE) |
| | |
| | | package io.vertx.greet; |
| | | |
| | | import java.net.InetAddress; |
| | | import java.net.UnknownHostException; |
| | | import java.time.Instant; |
| | | import java.util.logging.Logger; |
| | | |
| | |
| | | private Instant lastRequestInstant; |
| | | private Vertx vertx; |
| | | private final static Logger LOGGER = Logger.getLogger(GreetServer.class.getName()); |
| | | |
| | | private static String HOSTNAME; |
| | | static { |
| | | try { |
| | | HOSTNAME = InetAddress.getLocalHost().getHostName(); |
| | | } catch (UnknownHostException e) { |
| | | HOSTNAME = "unknown"; |
| | | } |
| | | } |
| | | |
| | | GreetServer(String greeting, float maxRequestsPerSecond) { |
| | | this.greeting = greeting; |
| | | this.maxRequestsPerSecond = maxRequestsPerSecond; |
| | |
| | | |
| | | router.get("/").handler(req -> { |
| | | Instant now = Instant.now(); |
| | | LOGGER.info("Attending greeting request #"+counter); |
| | | LOGGER.info("Attending greeting request #"+counter+" from "+HOSTNAME); |
| | | |
| | | if (isRequestWithinRateLimits(now)) { |
| | | req.response().end(greeting + "\n"); |