diff --git a/.github/workflows/dhis2-verify.yml b/.github/workflows/dhis2-verify.yml new file mode 100644 index 000000000..b1496fe5c --- /dev/null +++ b/.github/workflows/dhis2-verify.yml @@ -0,0 +1,87 @@ +name: 'DHIS2: Verify' + +on: push + +env: + CI: true + +jobs: + lint: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip ci]')" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - uses: actions/cache@v2 + id: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install + run: yarn install --frozen-lockfile + + - name: Run linters + run: | + yarn d2-style js check + yarn d2-style text check + + build: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip ci]')" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - uses: actions/cache@v2 + id: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install + run: yarn install --frozen-lockfile + + - name: Build + run: yarn build + + test: + runs-on: ubuntu-latest + if: "!contains(github.event.head_commit.message, '[skip ci]')" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: 12.x + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - uses: actions/cache@v2 + id: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: Install + run: yarn install --frozen-lockfile + + - name: Test + run: yarn test diff --git a/.github/workflows/node-lint.yml b/.github/workflows/node-lint.yml deleted file mode 100644 index 706ea4aa5..000000000 --- a/.github/workflows/node-lint.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: 'dhis2: lint (node)' - -on: push - -jobs: - check: - runs-on: ubuntu-latest - if: "!contains(github.event.head_commit.message, '[skip ci]')" - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: 12.x - - - name: Install - run: yarn install --frozen-lockfile - - - name: Run linters - run: | - yarn d2-style js check - yarn d2-style text check - env: - CI: true diff --git a/.github/workflows/node-publish.yml b/.github/workflows/npm-publish.yml similarity index 95% rename from .github/workflows/node-publish.yml rename to .github/workflows/npm-publish.yml index 56d0e0e19..0608821fd 100644 --- a/.github/workflows/node-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -40,6 +40,9 @@ jobs: - name: Build run: yarn build + - name: Test + run: yarn test + - name: Lint run: yarn lint diff --git a/CHANGELOG.md b/CHANGELOG.md index 7395074c7..6fc47fc12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,17 @@ +# [5.4.0](https://github.com/dhis2/app-platform/compare/v5.3.0...v5.4.0) (2020-10-19) + + +### Features + +* generate d2.config.json from d2.config.js ([#471](https://github.com/dhis2/app-platform/issues/471)) ([2046074](https://github.com/dhis2/app-platform/commit/20460744dd6427097bad2350342a6fcba7d68377)) + +# [5.3.0](https://github.com/dhis2/app-platform/compare/v5.2.2...v5.3.0) (2020-10-12) + + +### Features + +* detect server version, use latest available api version ([#470](https://github.com/dhis2/app-platform/issues/470)) ([ef92456](https://github.com/dhis2/app-platform/commit/ef924565d30b242a818cc54b203d2a2d11e842bc)) + ## [5.2.2](https://github.com/dhis2/app-platform/compare/v5.2.1...v5.2.2) (2020-10-07) diff --git a/adapter/config/setupEnzyme.js b/adapter/config/setupEnzyme.js new file mode 100644 index 000000000..3d6cd1d53 --- /dev/null +++ b/adapter/config/setupEnzyme.js @@ -0,0 +1,4 @@ +import { configure } from 'enzyme' +import Adapter from 'enzyme-adapter-react-16' + +configure({ adapter: new Adapter() }) diff --git a/adapter/i18n/en.pot b/adapter/i18n/en.pot index e96ec3510..094141f54 100644 --- a/adapter/i18n/en.pot +++ b/adapter/i18n/en.pot @@ -5,38 +5,38 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2019-09-26T16:40:43.483Z\n" -"PO-Revision-Date: 2019-09-26T16:40:43.483Z\n" +"POT-Creation-Date: 2020-10-08T15:51:57.880Z\n" +"PO-Revision-Date: 2020-10-08T15:51:57.880Z\n" -msgid "Please sign in" +msgid "An error occurred in the DHIS2 application." msgstr "" -msgid "Server" +msgid "Something went wrong" msgstr "" -msgid "Username" +msgid "Refresh to try again" msgstr "" -msgid "Password" +msgid "Hide technical details" msgstr "" -msgid "Sign in" +msgid "Show technical details" msgstr "" -msgid "An error occurred in the DHIS2 application." +msgid "The following information may be requested by technical support." msgstr "" -msgid "Something went wrong" +msgid "Please sign in" msgstr "" -msgid "Refresh to try again" +msgid "Server" msgstr "" -msgid "Hide technical details" +msgid "Username" msgstr "" -msgid "Show technical details" +msgid "Password" msgstr "" -msgid "The following information may be requested by technical support." +msgid "Sign in" msgstr "" diff --git a/adapter/package.json b/adapter/package.json index 4ec6c2384..e4132a33c 100644 --- a/adapter/package.json +++ b/adapter/package.json @@ -1,6 +1,6 @@ { "name": "@dhis2/app-adapter", - "version": "5.2.2", + "version": "5.4.0", "repository": { "type": "git", "url": "https://github.com/amcgee/dhis2-app-platform", @@ -20,10 +20,13 @@ "moment": "^2.24.0" }, "devDependencies": { - "@dhis2/cli-app-scripts": "5.2.2" + "@dhis2/cli-app-scripts": "5.4.0", + "enzyme": "^3.11.0", + "enzyme-adapter-react-16": "^1.15.5" }, "scripts": { - "build": "d2-app-scripts build" + "build": "d2-app-scripts build", + "test": "d2-app-scripts test" }, "peerDependencies": { "@dhis2/app-runtime": "^2", @@ -35,5 +38,10 @@ "react": "^16.8", "react-dom": "^16.8", "styled-jsx": "^3" + }, + "jest": { + "setupFilesAfterEnv": [ + "/config/setupEnzyme.js" + ] } } diff --git a/adapter/src/AuthBoundary/index.js b/adapter/src/components/AuthBoundary.js similarity index 60% rename from adapter/src/AuthBoundary/index.js rename to adapter/src/components/AuthBoundary.js index 61924bbf8..7d4a5e82c 100644 --- a/adapter/src/AuthBoundary/index.js +++ b/adapter/src/components/AuthBoundary.js @@ -1,9 +1,10 @@ import React from 'react' +import PropTypes from 'prop-types' import { useDataQuery } from '@dhis2/app-runtime' -import { Layer, layers, CenteredContent, CircularLoader } from '@dhis2/ui' import { LoginModal } from './LoginModal' -import { useLocale } from './useLocale' +import { useLocale } from '../utils/useLocale' +import { LoadingMask } from './LoadingMask' const settingsQuery = { userSettings: { @@ -16,13 +17,7 @@ export const AuthBoundary = ({ url, children }) => { useLocale(data && data.userSettings.keyUiLocale) if (loading) { - return ( - - - - - - ) + return } if (error) { @@ -31,3 +26,8 @@ export const AuthBoundary = ({ url, children }) => { return children } + +AuthBoundary.propTypes = { + children: PropTypes.element, + url: PropTypes.string, +} diff --git a/adapter/src/FatalErrorBoundary/index.js b/adapter/src/components/FatalErrorBoundary.js similarity index 100% rename from adapter/src/FatalErrorBoundary/index.js rename to adapter/src/components/FatalErrorBoundary.js diff --git a/adapter/src/components/LoadingMask.js b/adapter/src/components/LoadingMask.js new file mode 100644 index 000000000..f84c7b8d7 --- /dev/null +++ b/adapter/src/components/LoadingMask.js @@ -0,0 +1,10 @@ +import React from 'react' +import { Layer, CenteredContent, CircularLoader, layers } from '@dhis2/ui' + +export const LoadingMask = () => ( + + + + + +) diff --git a/adapter/src/AuthBoundary/LoginModal.js b/adapter/src/components/LoginModal.js similarity index 84% rename from adapter/src/AuthBoundary/LoginModal.js rename to adapter/src/components/LoginModal.js index 34a65b14e..72145348a 100644 --- a/adapter/src/AuthBoundary/LoginModal.js +++ b/adapter/src/components/LoginModal.js @@ -8,6 +8,7 @@ import { Button, InputField, } from '@dhis2/ui' +import { post } from '../utils/api' const staticUrl = process.env.REACT_APP_DHIS2_BASE_URL @@ -27,20 +28,11 @@ export const LoginModal = () => { if (isValid(server) && isValid(username) && isValid(password)) { window.localStorage.DHIS2_BASE_URL = server try { - await fetch( + await post( `${server}/dhis-web-commons-security/login.action`, - { - method: 'POST', - credentials: 'include', - body: `j_username=${encodeURIComponent( - username - )}&j_password=${encodeURIComponent(password)}`, - headers: { - 'X-Requested-With': 'XMLHttpRequest', - Accept: 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded', - }, - } + `j_username=${encodeURIComponent( + username + )}&j_password=${encodeURIComponent(password)}` ) } catch (e) { console.log( diff --git a/adapter/src/components/ServerVersionProvider.js b/adapter/src/components/ServerVersionProvider.js new file mode 100644 index 000000000..cd3101c6d --- /dev/null +++ b/adapter/src/components/ServerVersionProvider.js @@ -0,0 +1,58 @@ +import React, { useEffect, useState } from 'react' +import PropTypes from 'prop-types' +import { Provider } from '@dhis2/app-runtime' +import { parseServerVersion } from '../utils/parseServerVersion' +import { LoadingMask } from './LoadingMask' +import { get } from '../utils/api' + +export const ServerVersionProvider = ({ url, apiVersion, children }) => { + const [{ loading, error, systemInfo }, setState] = useState({ + loading: true, + }) + + useEffect(() => { + setState(state => (state.loading ? state : { loading: true })) + const request = get(`${url}/api/system/info`) + request + .then(systemInfo => { + setState({ loading: false, systemInfo }) + }) + .catch(e => { + setState({ loading: false, error: e }) + }) + + return () => { + request.abort() + } + }, [url]) + + if (loading) { + return + } + + if (error) { + return children + } + + const serverVersion = parseServerVersion(systemInfo.version) + const realApiVersion = serverVersion.minor + + return ( + + {children} + + ) +} + +ServerVersionProvider.propTypes = { + url: PropTypes.string.isRequired, + apiVersion: PropTypes.number, + children: PropTypes.element, +} diff --git a/adapter/src/FatalErrorBoundary/__tests__/FatalErrorBoundary.test.js b/adapter/src/components/__tests__/FatalErrorBoundary.test.js similarity index 96% rename from adapter/src/FatalErrorBoundary/__tests__/FatalErrorBoundary.test.js rename to adapter/src/components/__tests__/FatalErrorBoundary.test.js index 5f344e01f..1d6c11728 100644 --- a/adapter/src/FatalErrorBoundary/__tests__/FatalErrorBoundary.test.js +++ b/adapter/src/components/__tests__/FatalErrorBoundary.test.js @@ -1,5 +1,5 @@ import React from 'react' -import { FatalErrorBoundary } from '../' +import { FatalErrorBoundary } from '../FatalErrorBoundary' import { shallow } from 'enzyme' const Something = () => { diff --git a/adapter/src/FatalErrorBoundary/__tests__/__snapshots__/FatalErrorBoundary.test.js.snap b/adapter/src/components/__tests__/__snapshots__/FatalErrorBoundary.test.js.snap similarity index 100% rename from adapter/src/FatalErrorBoundary/__tests__/__snapshots__/FatalErrorBoundary.test.js.snap rename to adapter/src/components/__tests__/__snapshots__/FatalErrorBoundary.test.js.snap diff --git a/adapter/src/FatalErrorBoundary/styles/FatalErrorBoundary.style.js b/adapter/src/components/styles/FatalErrorBoundary.style.js similarity index 100% rename from adapter/src/FatalErrorBoundary/styles/FatalErrorBoundary.style.js rename to adapter/src/components/styles/FatalErrorBoundary.style.js diff --git a/adapter/src/index.js b/adapter/src/index.js index 14b83f112..a896be703 100644 --- a/adapter/src/index.js +++ b/adapter/src/index.js @@ -1,15 +1,15 @@ import React from 'react' +import PropTypes from 'prop-types' import { HeaderBar } from '@dhis2/ui' -import { Provider } from '@dhis2/app-runtime' -import { FatalErrorBoundary } from './FatalErrorBoundary' -import { AuthBoundary } from './AuthBoundary' +import { FatalErrorBoundary } from './components/FatalErrorBoundary' +import { ServerVersionProvider } from './components/ServerVersionProvider' +import { AuthBoundary } from './components/AuthBoundary' import { styles } from './styles.js' -// eslint-disable-next-line react/prop-types const App = ({ url, apiVersion, appName, children }) => ( - +
@@ -17,8 +17,15 @@ const App = ({ url, apiVersion, appName, children }) => (
{children}
-
+
) +App.propTypes = { + appName: PropTypes.string.isRequired, + url: PropTypes.string.isRequired, + apiVersion: PropTypes.number, + children: PropTypes.element, +} + export default App diff --git a/adapter/src/utils/api.js b/adapter/src/utils/api.js new file mode 100644 index 000000000..c244a3330 --- /dev/null +++ b/adapter/src/utils/api.js @@ -0,0 +1,44 @@ +const request = (url, options) => { + const abortController = new AbortController() + + const promise = new Promise((resolve, reject) => { + fetch(url, { + ...options, + credentials: 'include', + headers: { + 'X-Requested-With': 'XMLHttpRequest', + Accept: 'application/json', + ...options.headers, + }, + signal: abortController.signal, + }) + .then(response => { + if (response.status !== 200) { + reject('Request failed', response.statusText) + return + } + try { + resolve(response.json()) + } catch (e) { + resolve(response.text()) + } + }) + .catch(e => { + console.error('Network error: ', e) + reject('Network error') + }) + }) + + promise.abort = () => abortController.abort() + return promise +} + +export const get = url => request(url, { method: 'GET' }) +export const post = (url, body) => + request(url, { + method: 'POST', + body, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + }) diff --git a/adapter/src/utils/parseServerVersion.js b/adapter/src/utils/parseServerVersion.js new file mode 100644 index 000000000..18cb18f32 --- /dev/null +++ b/adapter/src/utils/parseServerVersion.js @@ -0,0 +1,24 @@ +export const parseServerVersion = versionString => { + const [mainVersion, tag] = versionString?.split('-') || [] + const [major, minor, patch] = mainVersion?.split('.') || [] + + const parsedVersion = { + major: parseInt(major) || undefined, // 2 + minor: parseInt(minor) || undefined, // 34 + patch: parseInt(patch) || undefined, // 1 + tag, // SNAPSHOT || undefined + } + + if ( + !parsedVersion.major || + !parsedVersion.minor || + parsedVersion.major !== 2 + ) { + console.warn( + 'Improperly formatted DHIS2 systemInfo server version', + versionString + ) + } + + return parsedVersion +} diff --git a/adapter/src/utils/parseServerVersion.test.js b/adapter/src/utils/parseServerVersion.test.js new file mode 100644 index 000000000..2addbcc76 --- /dev/null +++ b/adapter/src/utils/parseServerVersion.test.js @@ -0,0 +1,72 @@ +const { parseServerVersion } = require('./parseServerVersion') + +describe('parseServerVersion', () => { + let originalConsoleWarn + beforeAll(() => { + originalConsoleWarn = console.warn + }) + beforeEach(() => { + // Capture console warnings + console.warn = jest.fn() + }) + afterAll(() => { + console.warn = originalConsoleWarn + }) + + it('Should correctly parse a simple released version', () => { + expect(parseServerVersion('2.34.3')).toMatchObject({ + major: 2, + minor: 34, + patch: 3, + tag: undefined, + }) + expect(console.warn).toHaveBeenCalledTimes(0) + }) + + it('Should correctly parse a snapshot version', () => { + expect(parseServerVersion('2.34-SNAPSHOT')).toMatchObject({ + major: 2, + minor: 34, + patch: undefined, + tag: 'SNAPSHOT', + }) + expect(console.warn).toHaveBeenCalledTimes(0) + }) + + it('Should not break on null or undefined', () => { + expect(parseServerVersion(null)).toMatchObject({ + major: undefined, + minor: undefined, + patch: undefined, + tag: undefined, + }) + + expect(parseServerVersion(undefined)).toMatchObject({ + major: undefined, + minor: undefined, + patch: undefined, + tag: undefined, + }) + expect(console.warn).toHaveBeenCalledTimes(2) + }) + + it('Should correctly parse a future major version', () => { + expect(parseServerVersion('6.4.2')).toMatchObject({ + major: 6, + minor: 4, + patch: 2, + tag: undefined, + }) + expect(console.warn).toHaveBeenCalledTimes(1) + }) + + it('Should not break on non-numeric version string', () => { + expect(parseServerVersion('this.is.a.version-test')).toMatchObject({ + major: undefined, + minor: undefined, + patch: undefined, + tag: 'test', + }) + expect(console.warn).toHaveBeenCalledTimes(1) + }) +}) diff --git a/adapter/src/AuthBoundary/useLocale.js b/adapter/src/utils/useLocale.js similarity index 100% rename from adapter/src/AuthBoundary/useLocale.js rename to adapter/src/utils/useLocale.js diff --git a/cli/package.json b/cli/package.json index ac9f200e1..e400a28e4 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,6 +1,6 @@ { "name": "@dhis2/cli-app-scripts", - "version": "5.2.2", + "version": "5.4.0", "engines": { "node": ">=10" }, @@ -32,7 +32,7 @@ "@babel/preset-env": "^7.9.0", "@babel/preset-react": "^7.0.0", "@babel/preset-typescript": "^7.6.0", - "@dhis2/app-shell": "5.2.2", + "@dhis2/app-shell": "5.4.0", "@dhis2/cli-helpers-engine": "^1.5.0", "archiver": "^3.1.1", "axios": "^0.20.0", diff --git a/cli/src/lib/generateManifest.js b/cli/src/lib/generateManifest.js index 014ff2a89..999768f86 100644 --- a/cli/src/lib/generateManifest.js +++ b/cli/src/lib/generateManifest.js @@ -32,5 +32,12 @@ module.exports = (paths, config, publicUrl) => { reporter.debug('Generated manifest', manifest) + // For backwards compatibility, WILL BE DEPRECATED fs.writeJsonSync(paths.buildAppManifest, manifest, { spaces: 2 }) + + // Write config json + const appConfig = { ...config } + delete appConfig['entryPoints'] + + fs.writeJsonSync(paths.buildAppConfigJson, appConfig, { spaces: 2 }) } diff --git a/cli/src/lib/paths.js b/cli/src/lib/paths.js index e87ac9230..7d267b199 100644 --- a/cli/src/lib/paths.js +++ b/cli/src/lib/paths.js @@ -48,6 +48,7 @@ module.exports = (cwd = process.cwd()) => { buildOutput: path.join(base, './build'), buildAppOutput: path.join(base, './build/app'), buildAppManifest: path.join(base, './build/app/manifest.webapp'), + buildAppConfigJson: path.join(base, './build/app/d2.config.json'), buildAppBundle: path.join( base, './build/bundle/dhis2-{{name}}-{{version}}.zip' diff --git a/cli/src/lib/shell/env.js b/cli/src/lib/shell/env.js index 75e96ad73..d732db712 100644 --- a/cli/src/lib/shell/env.js +++ b/cli/src/lib/shell/env.js @@ -39,6 +39,15 @@ module.exports = ({ port, ...vars }) => { PUBLIC_URL: process.env.PUBLIC_URL, } + if (env.REACT_APP_DHIS2_API_VERSION) { + reporter.warn( + 'Passing an explicit API version to the DHIS2 App Platform is not recommended.\n' + + 'By default, the app platform will now use the latest API version available in the DHIS2 instance.\n' + + 'Some API functionality may be unreliable when using an explicit API version.\n' + + 'Support for the DHIS2_API_VERSION environment variable may be removed in a future release of the DHIS2 App Platform.' + ) + } + reporter.debug('Env passed to app-shell:', env) return env } diff --git a/docs/config/environment.md b/docs/config/environment.md index c1c2e3406..b8017592a 100644 --- a/docs/config/environment.md +++ b/docs/config/environment.md @@ -4,9 +4,9 @@ The following environment variables are supported for `start` and/or `build` commands. They can be specified in the shell environment on in a local `.env` file. -| Variable | Type | Commands | Description | -| --------------------- | -------- | ---------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **PORT** | _Number_ | `start` | Specify the Port to use when running the development server. Can also be specified with the `--port` flag on the command-line | -| **PUBLIC_URL** | _String_ | `start`, `build` | **ADVANCED USERS ONLY** Specify the contextualized path at which the application will be deployed. By default this will be `.`, but it can be overridden manually in rare cases. | -| **DHIS2_BASE_URL** | _String_ | `start`, `build` | **ADVANCED USERS ONLY** Specify the base URL of the DHIS2 server to bake into the production artifact. In almost all cases the defaults are preferred, as they are pre-configured to work as installed DHIS2 applications. | -| **DHIS2_API_VERSION** | _Number_ | `start`, `build` | **ADVANCED USERS ONLY** Specify the version of DHIS2 API to use. The default (32) should be sufficient for modern applications, and _this configuration option may be deprecated soon_ | +| Variable | Type | Commands | Description | +| --------------------- | -------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **PORT** | _Number_ | `start` | Specify the Port to use when running the development server. Can also be specified with the `--port` flag on the command-line | +| **PUBLIC_URL** | _String_ | `start`, `build` | **ADVANCED USERS ONLY** Specify the contextualized path at which the application will be deployed. By default this will be `.`, but it can be overridden manually in rare cases. | +| **DHIS2_BASE_URL** | _String_ | `start`, `build` | **ADVANCED USERS ONLY** Specify the base URL of the DHIS2 server to bake into the production artifact. In almost all cases the defaults are preferred, as they are pre-configured to work as installed DHIS2 applications. | +| **DHIS2_API_VERSION** | _Number_ | `start`, `build` | **DEPRECATED** Specify the version of DHIS2 API to use. As of App Platform v5.3, the shell will automatically detect the version of the DHIS2 server instance and set the API version to the latest version available. _This configuration option SHOULD NOT BE USED and will be deprecated soon_ | diff --git a/examples/simple-app/yarn.lock b/examples/simple-app/yarn.lock index cc503daf8..69d885378 100644 --- a/examples/simple-app/yarn.lock +++ b/examples/simple-app/yarn.lock @@ -1926,8 +1926,8 @@ resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-10.1.0.tgz#f0950bba18819512d42f7197e56c518aa491cf18" integrity sha512-ij4wRiunFfaJxjB0BdrYHIH8FxBJpOwNPhhAcunlmPdXudL1WQV1qoP9un6JsEBAgQH+7UXyyjh0g7jTxXK6tg== -"@dhis2/app-adapter@5.0.0", "@dhis2/app-adapter@file:../../adapter": - version "5.0.0" +"@dhis2/app-adapter@5.2.2", "@dhis2/app-adapter@file:../../adapter": + version "5.2.2" dependencies: moment "^2.24.0" @@ -1949,10 +1949,10 @@ resolved "https://registry.yarnpkg.com/@dhis2/app-service-data/-/app-service-data-2.2.2.tgz#093d45b8bb71b5b1e81876281379cda52b6632a7" integrity sha512-QJrYTFj+vINcqvr27yLIKunbNJTVmDPGr9fUliUdmTkCikTwlnK8fu6TPz3rhkOUYX0VrwzFJXp3ofKQajZ9mQ== -"@dhis2/app-shell@5.0.0", "@dhis2/app-shell@file:../../shell": - version "5.0.0" +"@dhis2/app-shell@5.2.2", "@dhis2/app-shell@file:../../shell": + version "5.2.2" dependencies: - "@dhis2/app-adapter" "5.0.0" + "@dhis2/app-adapter" "5.2.2" "@dhis2/app-runtime" "^2.2.2" "@dhis2/d2-i18n" "^1.0.5" "@dhis2/ui" "^5.4.2" @@ -1968,7 +1968,7 @@ typescript "^3.6.3" "@dhis2/cli-app-scripts@file:../../cli": - version "5.0.0" + version "5.2.2" dependencies: "@babel/core" "^7.6.2" "@babel/plugin-proposal-class-properties" "^7.8.3" @@ -1981,7 +1981,7 @@ "@babel/preset-env" "^7.9.0" "@babel/preset-react" "^7.0.0" "@babel/preset-typescript" "^7.6.0" - "@dhis2/app-shell" "5.0.0" + "@dhis2/app-shell" "5.2.2" "@dhis2/cli-helpers-engine" "^1.5.0" archiver "^3.1.1" axios "^0.20.0" @@ -1997,6 +1997,7 @@ handlebars "^4.3.3" i18next-conv "^9" i18next-scanner "^2.10.3" + inquirer "^7.3.3" jest-cli "^24.9.0" lodash "^4.17.11" parse-author "^2.0.0" @@ -3933,6 +3934,14 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + 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" @@ -4048,6 +4057,11 @@ cli-width@^2.0.0: resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -6939,6 +6953,25 @@ inquirer@^7.0.0: strip-ansi "^5.1.0" through "^2.3.6" +inquirer@^7.3.3: + version "7.3.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" + integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.19" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.6.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -11304,6 +11337,11 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +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== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -11318,6 +11356,13 @@ rxjs@^6.4.0, rxjs@^6.5.3: dependencies: tslib "^1.9.0" +rxjs@^6.6.0: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" diff --git a/package.json b/package.json index 5c5c261da..a07ee53fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "root", - "version": "5.2.2", + "version": "5.4.0", "private": true, "repository": { "type": "git", @@ -27,7 +27,9 @@ "start:example": "cd examples/simple-app && yarn start --force", "start": "yarn build && yarn start:example", "docs:serve": "d2-utils-docsite serve ./docs -o ./dist", - "docs:build": "d2-utils-docsite build ./docs -o ./dist" + "docs:build": "d2-utils-docsite build ./docs -o ./dist", + "test:adapter": "cd adapter && yarn test", + "test": "yarn test:adapter" }, "d2": { "docsite": { diff --git a/shell/package.json b/shell/package.json index 8335e47bd..a4de5ee71 100644 --- a/shell/package.json +++ b/shell/package.json @@ -1,6 +1,6 @@ { "name": "@dhis2/app-shell", - "version": "5.2.2", + "version": "5.4.0", "repository": { "type": "git", "url": "https://github.com/amcgee/dhis2-app-platform", @@ -12,7 +12,7 @@ "access": "public" }, "dependencies": { - "@dhis2/app-adapter": "5.2.2", + "@dhis2/app-adapter": "5.4.0", "@dhis2/app-runtime": "^2.2.2", "@dhis2/d2-i18n": "^1.0.5", "@dhis2/ui": "^5.4.2", diff --git a/shell/src/App.js b/shell/src/App.js index 4bbcfa9cd..ddad9eb72 100644 --- a/shell/src/App.js +++ b/shell/src/App.js @@ -11,7 +11,7 @@ const appConfig = { process.env.REACT_APP_DHIS2_BASE_URL || window.localStorage.DHIS2_BASE_URL, appName: process.env.REACT_APP_DHIS2_APP_NAME || '', - apiVersion: parseInt(process.env.REACT_APP_DHIS2_API_VERSION) || 32, + apiVersion: parseInt(process.env.REACT_APP_DHIS2_API_VERSION), } const App = () => ( diff --git a/yarn.lock b/yarn.lock index 1f16d9454..b327bd8bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2881,6 +2881,21 @@ airbnb-prop-types@^2.15.0: prop-types-exact "^1.2.0" react-is "^16.9.0" +airbnb-prop-types@^2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2" + integrity sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg== + dependencies: + array.prototype.find "^2.1.1" + function.prototype.name "^1.1.2" + is-regex "^1.1.0" + object-is "^1.1.2" + object.assign "^4.1.0" + object.entries "^1.1.2" + prop-types "^15.7.2" + prop-types-exact "^1.2.0" + react-is "^16.13.1" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -3166,7 +3181,7 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.find@^2.1.0: +array.prototype.find@^2.1.0, array.prototype.find@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c" integrity sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA== @@ -5603,6 +5618,21 @@ enzyme-adapter-react-16@^1.14.0: react-test-renderer "^16.0.0-0" semver "^5.7.0" +enzyme-adapter-react-16@^1.15.5: + version "1.15.5" + resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.5.tgz#7a6f0093d3edd2f7025b36e7fbf290695473ee04" + integrity sha512-33yUJGT1nHFQlbVI5qdo5Pfqvu/h4qPwi1o0a6ZZsjpiqq92a3HjynDhwd1IeED+Su60HDWV8mxJqkTnLYdGkw== + dependencies: + enzyme-adapter-utils "^1.13.1" + enzyme-shallow-equal "^1.0.4" + has "^1.0.3" + object.assign "^4.1.0" + object.values "^1.1.1" + prop-types "^15.7.2" + react-is "^16.13.1" + react-test-renderer "^16.0.0-0" + semver "^5.7.0" + enzyme-adapter-utils@^1.13.0: version "1.13.0" resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.0.tgz#01c885dde2114b4690bf741f8dc94cee3060eb78" @@ -5615,6 +5645,18 @@ enzyme-adapter-utils@^1.13.0: prop-types "^15.7.2" semver "^5.7.1" +enzyme-adapter-utils@^1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.13.1.tgz#59c1b734b0927543e3d8dc477299ec957feb312d" + integrity sha512-5A9MXXgmh/Tkvee3bL/9RCAAgleHqFnsurTYCbymecO4ohvtNO5zqIhHxV370t7nJAwaCfkgtffarKpC0GPt0g== + dependencies: + airbnb-prop-types "^2.16.0" + function.prototype.name "^1.1.2" + object.assign "^4.1.0" + object.fromentries "^2.0.2" + prop-types "^15.7.2" + semver "^5.7.1" + enzyme-shallow-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.1.tgz#7afe03db3801c9b76de8440694096412a8d9d49e" @@ -5623,7 +5665,15 @@ enzyme-shallow-equal@^1.0.1: has "^1.0.3" object-is "^1.0.2" -enzyme@^3.10.0: +enzyme-shallow-equal@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.4.tgz#b9256cb25a5f430f9bfe073a84808c1d74fced2e" + integrity sha512-MttIwB8kKxypwHvRynuC3ahyNc+cFbR8mjVIltnmzQ0uKGqmsfO4bfBuLxb0beLNPhjblUEYvEbsg+VSygvF1Q== + dependencies: + has "^1.0.3" + object-is "^1.1.2" + +enzyme@^3.10.0, enzyme@^3.11.0: version "3.11.0" resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28" integrity sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw== @@ -5692,6 +5742,24 @@ es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstrac string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" +es-abstract@^1.18.0-next.0, es-abstract@^1.18.0-next.1: + version "1.18.0-next.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" + integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.2" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.1" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -7667,6 +7735,11 @@ is-callable@^1.1.4, is-callable@^1.1.5: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -7804,6 +7877,11 @@ is-negated-glob@^1.0.0: resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-npm@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-3.0.0.tgz#ec9147bfb629c43f494cf67936a961edec7e8053" @@ -7888,6 +7966,13 @@ is-regex@^1.0.4, is-regex@^1.0.5: dependencies: has "^1.0.3" +is-regex@^1.1.0, is-regex@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" + integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== + dependencies: + has-symbols "^1.0.1" + is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" @@ -9841,6 +9926,11 @@ object-inspect@^1.7.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" + integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== + object-is@^1.0.1, object-is@^1.0.2: version "1.1.2" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" @@ -9849,6 +9939,14 @@ object-is@^1.0.1, object-is@^1.0.2: define-properties "^1.1.3" es-abstract "^1.17.5" +object-is@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.3.tgz#2e3b9e65560137455ee3bd62aec4d90a2ea1cc81" + integrity sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -9881,6 +9979,16 @@ object.assign@^4.0.4, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" +object.assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.1.tgz#303867a666cdd41936ecdedfb1f8f3e32a478cdd" + integrity sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.0" + has-symbols "^1.0.1" + object-keys "^1.1.1" + object.entries@^1.1.0, object.entries@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.1.tgz#ee1cf04153de02bb093fec33683900f57ce5399b" @@ -9891,6 +9999,15 @@ object.entries@^1.1.0, object.entries@^1.1.1: function-bind "^1.1.1" has "^1.0.3" +object.entries@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add" + integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + has "^1.0.3" + object.fromentries@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9" @@ -11601,7 +11718,7 @@ react-final-form@^6.5.0: "@scarf/scarf" "^1.0.5" ts-essentials "^6.0.5" -react-is@^16.12.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -13097,7 +13214,7 @@ string.prototype.trim@^1.2.1: es-abstract "^1.17.0-next.1" function-bind "^1.1.1" -string.prototype.trimend@^1.0.0: +string.prototype.trimend@^1.0.0, string.prototype.trimend@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== @@ -13123,7 +13240,7 @@ string.prototype.trimright@^2.1.1: es-abstract "^1.17.5" string.prototype.trimend "^1.0.0" -string.prototype.trimstart@^1.0.0: +string.prototype.trimstart@^1.0.0, string.prototype.trimstart@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==