diff --git a/.editorconfig b/.editorconfig index 7053c49a0..cfc009c2f 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,5 +1,7 @@ [*.{js,jsx,ts,tsx,vue}] -indent_style = space -indent_size = 2 +indent_style = tab +indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true +quote_type = single +max_line_length = 140 diff --git a/.eslintrc b/.eslintrc index 433d82995..1f65c5caf 100644 --- a/.eslintrc +++ b/.eslintrc @@ -18,3 +18,6 @@ rules: - tab - ignoredNodes: - TemplateLiteral + no-mixed-spaces-and-tabs: + - error + diff --git a/Dockerfile b/Dockerfile index a5ef6b7fb..74fe97322 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,6 @@ FROM node:lts-alpine AS builder +RUN apk add --no-cache python3 make g++ +ENV NODE_OPTIONS="--dns-result-order=ipv4first --openssl-legacy-provider" WORKDIR /app COPY . . RUN npm install && npm run build diff --git a/__tests__/TestHelper.js b/__tests__/TestHelper.js index 3899f2230..58ba7d1b7 100644 --- a/__tests__/TestHelper.js +++ b/__tests__/TestHelper.js @@ -364,6 +364,53 @@ const TestHelper = { cosignatures, innerTransactions }; + }, + generateNodePeerStatus: isAvailable => { + return { + isAvailable, + lastStatusCheck: 1676809816662 + }; + }, + generateNodeApiStatus: isAvailable => { + return { + isAvailable, + nodePublicKey: '4DA6FB57FA168EEBBCB68DA4DDC8DA7BCF41EC93FB22A33DF510DB0F2670F623', + chainHeight: 2027193, + finalization: { + height: 2031992, + epoch: 1413, + point: 7, + hash: '6B687D9B689611C90A1094A7430E78914F22A2570C80D3E42D520EB08091A973' + }, + nodeStatus: { + apiNode: 'up', + db: 'up' + }, + restVersion: '2.4.2', + restGatewayUrl: 'localhost.com', + isHttpsEnabled: true + }; + }, + nodeCommonField: { + version: 16777989, + publicKey: '016DC1622EE42EF9E4D215FA1112E89040DD7AED83007283725CE9BA550272F5', + networkGenerationHashSeed: '57F7DA205008026C776CB6AED843393F04CD458E0AA2D9F1D5F31A402072B2D6', + port: 7900, + networkIdentifier: 104, + host: 'node.com', + friendlyName: 'node', + lastAvailable: '2023-02-19T12:36:04.524Z', + hostDetail: {}, + location: '', + ip: '127.0.0.1', + organization: '', + as: '', + continent: '', + country: '', + region: '', + city: '', + district: '', + zip: '' } }; diff --git a/__tests__/components/widgets/NodeStatsWidget.spec.js b/__tests__/components/widgets/NodeStatsWidget.spec.js new file mode 100644 index 000000000..74c3941c7 --- /dev/null +++ b/__tests__/components/widgets/NodeStatsWidget.spec.js @@ -0,0 +1,121 @@ +import NodeStatsWidget from '../../../src/components/widgets/NodeStatsWidget.vue'; +import { i18n } from '../../../src/config'; +import { createLocalVue, mount } from '@vue/test-utils'; +import Vuex from 'vuex'; + +const setupStoreMount = stats => { + const nodeModule = { + namespaced: true, + getters: { + nodeStats:() => stats + } + }; + + const uiModule = { + namespaced: true, + getters: { + getNameByKey: state => key => i18n.getName(key) + } + }; + + const store = new Vuex.Store({ + modules: { + node: nodeModule, + ui:uiModule + } + }); + + const propsData = { + dataGetter: 'node/nodeStats' + }; + + return mount(NodeStatsWidget, { + store, + localVue, + propsData, + stubs: { + 'b-card': true, + 'b-container': true, + 'b-row': true, + 'b-col': true, + 'b-button': true, + 'router-link': true + } + }); +}; + +const localVue = createLocalVue(); +localVue.use(Vuex); + +describe('NodeStatsWidget', () => { + describe('nodeRoles', () => { + const assertNodeStatCounts = (stats, expected) => { + // Arrange + Act: + const wrapper = setupStoreMount(stats); + + // Assert: + expect(wrapper.vm.nodeRoles).toEqual(expected); + }; + + const generateNodeStats = stats => { + return [ + { + name: 'Total count', + count: stats.reduce((acc, val) => acc + val, 0) + }, + { + name: 'Peer node', + count: stats[0] + }, + { + name: 'Api node', + count: stats[1] + }, + { + name: 'Peer Api node', + count: stats[2] + }, + { + name: 'Voting node', + count: stats[3] + }, + { + name: 'Peer Voting node', + count: stats[4] + }, + { + name: 'Api Voting node', + count: stats[5] + }, + { + name: 'Peer Api Voting node', + count: stats[6] + } + ]; + }; + + it('returns node types stats when data is present', () => { + assertNodeStatCounts( + { + 1: 3, + 2: 7, + 3: 4, + 4: 6, + 5: 8, + 6: 12, + 7: 5 + }, + generateNodeStats([3, 7, 4, 6, 8, 12, 5]) + ); + }); + + it('returns node types stats with 0 count when no data is present', () => { + assertNodeStatCounts( + {}, + generateNodeStats([0, 0, 0, 0, 0, 0, 0]) + ); + }); + + it('returns empty when data is undefined', () => assertNodeStatCounts(undefined, [])); + }); +}); diff --git a/__tests__/infrastructure/NodeService.spec.js b/__tests__/infrastructure/NodeService.spec.js new file mode 100644 index 000000000..d818eeca5 --- /dev/null +++ b/__tests__/infrastructure/NodeService.spec.js @@ -0,0 +1,243 @@ +import { NodeService } from '../../src/infrastructure'; +import http from '../../src/infrastructure/http'; +import TestHelper from '../TestHelper'; + +describe('Node Service', () => { + // Arrange: + const { + generateNodePeerStatus, + generateNodeApiStatus, + nodeCommonField + } = TestHelper; + + const statisticServiceNodeResponse = [ + { + roles: 1, + peerStatus: generateNodePeerStatus(true), + ...nodeCommonField + }, + { + roles: 2, + apiStatus: generateNodeApiStatus(false), + ...nodeCommonField + }, + { + roles: 3, + peerStatus: generateNodePeerStatus(true), + apiStatus: generateNodeApiStatus(false), + ...nodeCommonField + }, + { + roles: 3, + peerStatus: generateNodePeerStatus(true), + apiStatus: generateNodeApiStatus(true), + ...nodeCommonField + }, + { + roles: 3, + peerStatus: generateNodePeerStatus(false), + apiStatus: generateNodeApiStatus(false), + ...nodeCommonField + }, + { + roles: 5, + peerStatus: generateNodePeerStatus(true), + ...nodeCommonField + }, + { + roles: 5, + peerStatus: generateNodePeerStatus(false), + ...nodeCommonField + }, + { + roles: 7, + peerStatus: generateNodePeerStatus(true), + apiStatus: generateNodeApiStatus(true), + ...nodeCommonField + } + ]; + + const runStatisticServiceFailResponseTests = (statisticServiceMethod, NodeServiceMethod) => { + it('throws error when statistic services fail response', async () => { + // Arrange: + const error = new Error(`Statistics service ${statisticServiceMethod} error`); + + http.statisticServiceRestClient = jest.fn().mockImplementation(() => { + return { + [statisticServiceMethod]: jest.fn().mockRejectedValue(error) + }; + }); + + // Act + Assert: + await expect(NodeService[NodeServiceMethod]()).rejects.toThrow(error); + }); + }; + + describe('getAvailableNodes', () => { + it('returns available node from statistic services', async () => { + // Arrange: + http.statisticServiceRestClient = jest.fn().mockImplementation(() => { + return { + getNodes: jest.fn().mockResolvedValue(statisticServiceNodeResponse) + }; + }); + + const expectNodeFormattedCommonField = { + network: 'MAINNET', + address: 'NDY2CXBR6SK3G7UWVXZT6YQTVJKHKFMPU74ZOYY', + nodePublicKey: + '016DC1622EE42EF9E4D215FA1112E89040DD7AED83007283725CE9BA550272F5', + version: '1.0.3.5' + }; + + // Act: + const result = await NodeService.getAvailableNodes(); + + // Assert: + expect(result).toEqual([ + { + ...nodeCommonField, + ...expectNodeFormattedCommonField, + apiEndpoint: 'N/A', + roles: 'Peer node', + rolesRaw: 1, + peerStatus: generateNodePeerStatus(true) + }, + { + ...nodeCommonField, + ...expectNodeFormattedCommonField, + apiEndpoint: 'localhost.com', + roles: 'Peer Api node', + rolesRaw: 3, + peerStatus: generateNodePeerStatus(true), + apiStatus: generateNodeApiStatus(false) + }, + { + ...nodeCommonField, + ...expectNodeFormattedCommonField, + apiEndpoint: 'localhost.com', + roles: 'Peer Api node', + rolesRaw: 3, + peerStatus: generateNodePeerStatus(true), + apiStatus: generateNodeApiStatus(true) + }, + { + ...nodeCommonField, + ...expectNodeFormattedCommonField, + apiEndpoint: 'N/A', + roles: 'Peer Voting node', + rolesRaw: 5, + peerStatus: generateNodePeerStatus(true) + }, + { + ...nodeCommonField, + ...expectNodeFormattedCommonField, + apiEndpoint: 'localhost.com', + roles: 'Peer Api Voting node', + rolesRaw: 7, + peerStatus: generateNodePeerStatus(true), + apiStatus: generateNodeApiStatus(true) + } + ]); + }); + + runStatisticServiceFailResponseTests('getNodes', 'getAvailableNodes'); + }); + + describe('getNodeStats', () => { + it('return nodes count with 7 types of roles', async () => { + // Arrange: + http.statisticServiceRestClient = jest.fn().mockImplementation(() => { + return { + getNodes: jest.fn().mockResolvedValue(statisticServiceNodeResponse) + }; + }); + + // Act: + const nodeStats = await NodeService.getNodeStats(); + + // Assert: + expect(nodeStats).toEqual({ + 1: 1, + 2: 0, + 3: 2, + 4: 0, + 5: 1, + 6: 0, + 7: 1 + }); + }); + }); + + describe('getNodeInfo', () => { + // Arrange: + Date.now = jest.fn(() => new Date('2023-02-21')); + + const expectedPeerStatus = { + connectionStatus: true, + lastStatusCheck: '2023-02-19 12:30:16' + }; + + const expectedAPIStatus = { + apiNodeStatus: true, + connectionStatus: false, + databaseStatus: true, + isHttpsEnabled: true, + lastStatusCheck: '2023-02-21 00:00:00', + restVersion: '2.4.2' + }; + + const expectedChainInfoStatus = { + height: 2027193, + finalizedHeight: 2031992, + finalizationEpoch: 1413, + finalizationPoint: 7, + finalizedHash: '6B687D9B689611C90A1094A7430E78914F22A2570C80D3E42D520EB08091A973', + lastStatusCheck: '2023-02-21 00:00:00' + }; + + const assertNodeStatus = async (node, expectedResult) => { + // Arrange: + http.statisticServiceRestClient = jest.fn().mockImplementation(() => { + return { + getNode: jest.fn().mockResolvedValue(node) + }; + }); + + // Act: + const { apiStatus, chainInfo, peerStatus } = + await NodeService.getNodeInfo(node.publicKey); + + // Assert: + expect(apiStatus).toEqual(expectedResult.apiStatus); + expect(chainInfo).toEqual(expectedResult.chainInfo); + expect(peerStatus).toEqual(expectedResult.peerStatus); + }; + + it('returns peer node status when peer status is present', async () => { + await assertNodeStatus(statisticServiceNodeResponse[0], { + peerStatus: expectedPeerStatus, + apiStatus: {}, + chainInfo: {} + }); + }); + + it('returns api node status and chain info when api status is present', async () => { + await assertNodeStatus(statisticServiceNodeResponse[1], { + peerStatus: {}, + apiStatus: expectedAPIStatus, + chainInfo: expectedChainInfoStatus + }); + }); + + it('returns chain info, api and peer node status when both status is present', async () => { + await assertNodeStatus(statisticServiceNodeResponse[2], { + peerStatus: expectedPeerStatus, + apiStatus: expectedAPIStatus, + chainInfo: expectedChainInfoStatus + }); + }); + + runStatisticServiceFailResponseTests('getNode', 'getNodeInfo'); + }); +}); diff --git a/__tests__/store/ui.spec.js b/__tests__/store/ui.spec.js index 5569e5444..685712616 100644 --- a/__tests__/store/ui.spec.js +++ b/__tests__/store/ui.spec.js @@ -1,10 +1,9 @@ -import Helper from '../../src/helper'; import { AccountService, MosaicService, NamespaceService } from '../../src/infrastructure'; import ui from '../../src/store/ui'; import { stub, restore } from 'sinon'; describe('store/ui', () => { - describe('action search should', () => { + describe('action search', () => { let dispatch; let rootGetters; @@ -15,7 +14,22 @@ describe('store/ui', () => { afterEach(restore); - it('return block page with height', async () => { + const assertSearchNamespace = async namespaceName => { + // Arrange: + stub(NamespaceService, 'getNamespaceInfo').returns(Promise.resolve({})); + + // Act: + await ui.actions.search({ dispatch, rootGetters }, namespaceName); + + // Assert: + expect(dispatch).toHaveBeenCalledTimes(1); + expect(dispatch).toHaveBeenNthCalledWith(1, 'openPage', { + pageName: 'namespace', + param: namespaceName + }); + }; + + it('returns block page with height', async () => { // Arrange: const height = '10'; @@ -30,12 +44,11 @@ describe('store/ui', () => { }); }); - it('return account page with public key', async () => { + it('returns account page with public key', async () => { // Arrange: const publicKey = 'DC20B243B63246C9E75E4FB5ED236513A005454393E93C8A4CE6EDEE323C2DDB'; - const getAccountInfoStub = stub(AccountService, 'getAccountInfo'); - getAccountInfoStub.returns(Promise.resolve({})); + stub(AccountService, 'getAccountInfo').returns(Promise.resolve({})); // Act: await ui.actions.search({ dispatch, rootGetters }, publicKey); @@ -48,7 +61,7 @@ describe('store/ui', () => { }); }); - it('return account page with address', async () => { + it('returns account page with address', async () => { // Arrange: const address = 'TAR5OQBKR4KSVRVZ3ZBVHNLMBZ4N4Q27WFVMJDI'; @@ -63,7 +76,7 @@ describe('store/ui', () => { }); }); - it('return transaction page with hash', async () => { + it('returns transaction page with hash', async () => { // Arrange: const hash = '706BBC8F95AF60B22CB38911A645D3BA24DC480FDBE18C197ACCFE0FDE0DC24D'; @@ -78,12 +91,11 @@ describe('store/ui', () => { }); }); - it('return mosaic page with mosaic Id', async () => { + it('returns mosaic page with mosaic Id', async () => { // Arrange: const mosaicId = '3A8416DB2D53B6C8'; - const getMosaicInfoStub = stub(MosaicService, 'getMosaicInfo'); - getMosaicInfoStub.returns(Promise.resolve({})); + stub(MosaicService, 'getMosaicInfo').returns(Promise.resolve({})); // Act: await ui.actions.search({ dispatch, rootGetters }, mosaicId); @@ -96,23 +108,9 @@ describe('store/ui', () => { }); }); - it('return namespace page with namespace name', async () => { - // Arrange: - const namespaceName = 'symbol.xym'; + it('returns namespace page with namespace name', async () => await assertSearchNamespace('symbol.xym')); - const getNamespaceInfoStub = stub(NamespaceService, 'getNamespaceInfo'); - getNamespaceInfoStub.returns(Promise.resolve({})); - - // Act: - await ui.actions.search({ dispatch, rootGetters }, namespaceName); - - // Assert: - expect(dispatch).toHaveBeenCalledTimes(1); - expect(dispatch).toHaveBeenNthCalledWith(1, 'openPage', { - pageName: 'namespace', - param: namespaceName - }); - }); + it('returns namespace page with namespace name contain dash', async () => await assertSearchNamespace('symbol-')); it('throw error given Nem address', async () => { // Arrange: @@ -131,6 +129,58 @@ describe('store/ui', () => { return expect(ui.actions.search({ dispatch, rootGetters }, randomText)) .rejects.toThrow('errorNothingFound'); }); - }); + describe('input value contain whitespace', () => { + const runBasicWhitespaceTests = (pageName, inputValue, expectedResult) => { + it(`returns ${pageName} page`, async () => { + // Arrange: + if ('mosaic' === pageName) + stub(MosaicService, 'getMosaicInfo').returns(Promise.resolve({})); + else if('account' === pageName) + stub(AccountService, 'getAccountInfo').returns(Promise.resolve({})); + else if ('namespace' === pageName) + stub(NamespaceService, 'getNamespaceInfo').returns(Promise.resolve({})); + + // Act: + await ui.actions.search({ dispatch, rootGetters }, inputValue); + + // Assert: + expect(dispatch).toHaveBeenNthCalledWith(1, 'openPage', expectedResult); + }); + }; + + // Arrange: + const inputValues = [ + { + pageName: 'block', + input: ' 10 ' + }, + { + pageName: 'account', + input: ' DC20B243B63246C9E75E4FB5ED236513A005454393E93C8A4CE6EDEE323C2DDB ' + }, + { + pageName: 'account', + input: ' TAR5OQBKR4KSVRVZ3ZBVHNLMBZ4N4Q27WFVMJDI ' + }, + { + pageName: 'transaction', + input: ' 706BBC8F95AF60B22CB38911A645D3BA24DC480FDBE18C197ACCFE0FDE0DC24D' + }, + { + pageName: 'mosaic', + input: '3A8416DB2D53B6C8 ' + }, + { + pageName: 'namespace', + input: 'symbol . xym ' + } + ]; + + inputValues.forEach(({input, pageName}) => runBasicWhitespaceTests(pageName, input, { + pageName, + param: input.replace(/\s/g, '') + })); + }); + }); }); diff --git a/package-lock.json b/package-lock.json index 989786eeb..c85eac3f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "jest": "^28.1.1", "prettier": "^2.5.1", "sass": "1.52.3", - "sass-loader": "^8.0.2", + "sass-loader": "^13.2.2", "sinon": "^14.0.0", "stylelint": "^13.13.1", "stylelint-config-standard": "^19.0.0", @@ -2066,20 +2066,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "node_modules/@intervolga/optimize-cssnano-plugin": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", - "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", - "dev": true, - "dependencies": { - "cssnano": "^4.0.0", - "cssnano-preset-default": "^4.0.0", - "postcss": "^7.0.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2741,9 +2727,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { "node": ">=6.0.0" } @@ -2760,19 +2746,17 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", - "dev": true, + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" }, @@ -2781,17 +2765,17 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@js-joda/core": { @@ -2956,9 +2940,9 @@ } }, "node_modules/@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "dev": true }, "node_modules/@sideway/pinpoint": { @@ -3203,7 +3187,6 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", - "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3213,7 +3196,6 @@ "version": "3.7.3", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -3222,8 +3204,7 @@ "node_modules/@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "node_modules/@types/express": { "version": "4.17.13", @@ -3798,389 +3779,6 @@ "@vue/cli-service": "^3.0.0 || ^4.0.0 || ^5.0.0-0" } }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/@vue/cli-plugin-babel/node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/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, - "engines": { - "node": ">=8" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/@vue/cli-plugin-babel/node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/@vue/cli-plugin-e2e-cypress": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@vue/cli-plugin-e2e-cypress/-/cli-plugin-e2e-cypress-5.0.4.tgz", @@ -6132,6 +5730,20 @@ } } }, + "node_modules/@vue/cli-service/node_modules/@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "dependencies": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, "node_modules/@vue/cli-service/node_modules/@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", @@ -6161,6 +5773,150 @@ "strip-ansi": "^6.0.0" } }, + "node_modules/@vue/cli-service/node_modules/@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "html-webpack-plugin": ">=2.26.0", + "webpack": ">=4.0.0" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@vue/cli-service/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, "node_modules/@vue/cli-service/node_modules/ansi-regex": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", @@ -6203,6 +5959,26 @@ "node": ">=0.10.0" } }, + "node_modules/@vue/cli-service/node_modules/cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dev": true, + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, "node_modules/@vue/cli-service/node_modules/cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -6226,6 +6002,12 @@ "wrap-ansi": "^6.2.0" } }, + "node_modules/@vue/cli-service/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/@vue/cli-service/node_modules/dir-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", @@ -6238,6 +6020,46 @@ "node": ">=4" } }, + "node_modules/@vue/cli-service/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@vue/cli-service/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/@vue/cli-service/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/@vue/cli-service/node_modules/fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -6255,6 +6077,22 @@ "node": ">=4.0.0" } }, + "node_modules/@vue/cli-service/node_modules/file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "dev": true, + "dependencies": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, "node_modules/@vue/cli-service/node_modules/fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -6270,6 +6108,18 @@ "node": ">=0.10.0" } }, + "node_modules/@vue/cli-service/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@vue/cli-service/node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -6303,6 +6153,67 @@ "node": ">=6" } }, + "node_modules/@vue/cli-service/node_modules/html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", + "deprecated": "3.x is no longer supported", + "dev": true, + "dependencies": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" + } + }, + "node_modules/@vue/cli-service/node_modules/html-webpack-plugin/node_modules/big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/@vue/cli-service/node_modules/html-webpack-plugin/node_modules/emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@vue/cli-service/node_modules/html-webpack-plugin/node_modules/json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@vue/cli-service/node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "dependencies": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + }, "node_modules/@vue/cli-service/node_modules/is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -6392,6 +6303,19 @@ "node": ">=4.0.0" } }, + "node_modules/@vue/cli-service/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@vue/cli-service/node_modules/log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -6413,6 +6337,28 @@ "yallist": "^3.0.2" } }, + "node_modules/@vue/cli-service/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-service/node_modules/make-dir/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/@vue/cli-service/node_modules/micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -6450,6 +6396,38 @@ "node": ">=0.10.0" } }, + "node_modules/@vue/cli-service/node_modules/mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/@vue/cli-service/node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/@vue/cli-service/node_modules/onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -6503,6 +6481,27 @@ "node": ">=6" } }, + "node_modules/@vue/cli-service/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-service/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@vue/cli-service/node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -6533,6 +6532,18 @@ "node": ">=6" } }, + "node_modules/@vue/cli-service/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@vue/cli-service/node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -6555,6 +6566,74 @@ "node": ">=6" } }, + "node_modules/@vue/cli-service/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@vue/cli-service/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/@vue/cli-service/node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@vue/cli-service/node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/@vue/cli-service/node_modules/thread-loader": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", @@ -6594,69 +6673,181 @@ "node": ">= 4.0.0" } }, - "node_modules/@vue/cli-service/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/@vue/cli-shared-utils": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.4.tgz", - "integrity": "sha512-nfAsj8Nopu5sVHMBIaut/YL7NaJFVmTBSTJD7LM17jc5uytrM9JwiRtzCiv3JWRBG78Xdb/s2Xb/1YR4fkdmkQ==", - "dev": true, - "dependencies": { - "@achrinza/node-ipc": "9.2.2", - "chalk": "^4.1.2", - "execa": "^1.0.0", - "joi": "^17.4.0", - "launch-editor": "^2.2.1", - "lru-cache": "^6.0.0", - "node-fetch": "^2.6.7", - "open": "^8.0.2", - "ora": "^5.3.0", - "read-pkg": "^5.1.1", - "semver": "^7.3.4", - "strip-ansi": "^6.0.0" - } - }, - "node_modules/@vue/cli-shared-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@vue/cli-service/node_modules/url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" }, "engines": { - "node": ">=8" + "node": ">= 8.9.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } } }, - "node_modules/@vue/cli-shared-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@vue/cli-service/node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" } }, - "node_modules/@vue/cli-shared-utils/node_modules/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, - "dependencies": { + "node_modules/@vue/cli-service/node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/@vue/cli-service/node_modules/webpack/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@vue/cli-service/node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@vue/cli-service/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@vue/cli-shared-utils": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.4.tgz", + "integrity": "sha512-nfAsj8Nopu5sVHMBIaut/YL7NaJFVmTBSTJD7LM17jc5uytrM9JwiRtzCiv3JWRBG78Xdb/s2Xb/1YR4fkdmkQ==", + "dev": true, + "dependencies": { + "@achrinza/node-ipc": "9.2.2", + "chalk": "^4.1.2", + "execa": "^1.0.0", + "joi": "^17.4.0", + "launch-editor": "^2.2.1", + "lru-cache": "^6.0.0", + "node-fetch": "^2.6.7", + "open": "^8.0.2", + "ora": "^5.3.0", + "read-pkg": "^5.1.1", + "semver": "^7.3.4", + "strip-ansi": "^6.0.0" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@vue/cli-shared-utils/node_modules/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, + "dependencies": { "color-name": "~1.1.4" }, "engines": { @@ -6753,19 +6944,6 @@ "eslint-plugin-standard": "^4.0.0" } }, - "node_modules/@vue/preload-webpack-plugin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", - "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", - "dev": true, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "html-webpack-plugin": ">=2.26.0", - "webpack": ">=4.0.0" - } - }, "node_modules/@vue/test-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.3.0.tgz", @@ -6788,30 +6966,28 @@ "dev": true }, "node_modules/@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "dependencies": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", @@ -6821,6 +6997,31 @@ "@webassemblyjs/wast-printer": "1.9.0" } }, + "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-code-frame/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, "node_modules/@webassemblyjs/helper-fsm": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", @@ -6834,109 +7035,117 @@ "@webassemblyjs/ast": "1.9.0" } }, + "node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-module-context/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", "@xtuc/long": "4.2.2" } }, - "node_modules/@webassemblyjs/helper-numbers/node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "node_modules/@webassemblyjs/wast-parser": { @@ -6952,18 +7161,37 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" }, - "node_modules/@webassemblyjs/wast-printer": { + "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-api-error": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/wast-parser/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, @@ -7415,7 +7643,7 @@ "node_modules/assert/node_modules/util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", "dependencies": { "inherits": "2.0.1" } @@ -8144,7 +8372,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "devOptional": true, + "dev": true, "dependencies": { "file-uri-to-path": "1.0.0" } @@ -8418,9 +8646,9 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8660,52 +8888,6 @@ "node": ">=0.10.0" } }, - "node_modules/cache-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", - "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", - "dev": true, - "dependencies": { - "buffer-json": "^2.0.0", - "find-cache-dir": "^3.0.0", - "loader-utils": "^1.2.3", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "schema-utils": "^2.0.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/cache-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/cache-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/cachedir": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", @@ -9364,29 +9546,6 @@ "node": ">=0.8" } }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/clone-deep/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clone-regexp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", @@ -10934,9 +11093,9 @@ } }, "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "engines": { "node": ">=0.10" } @@ -11674,28 +11833,23 @@ } }, "node_modules/enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "dependencies": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.13.0" } }, - "node_modules/enhanced-resolve/node_modules/memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - }, + "node_modules/enhanced-resolve/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "engines": { - "node": ">=4.3.0 <5.0.0 || >=5.10" + "node": ">=6" } }, "node_modules/enquirer": { @@ -11800,8 +11954,7 @@ "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "node_modules/es-shim-unscopables": { "version": "1.0.0", @@ -12294,7 +12447,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -13304,53 +13456,11 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "dev": true, - "dependencies": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/file-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/file-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "devOptional": true + "dev": true }, "node_modules/filesize": { "version": "3.6.1", @@ -13837,8 +13947,7 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global-dirs": { "version": "3.0.0", @@ -14366,67 +14475,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", - "deprecated": "3.x is no longer supported", - "dev": true, - "dependencies": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "engines": { - "node": ">=6.9" - }, - "peerDependencies": { - "webpack": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/html-webpack-plugin/node_modules/big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/html-webpack-plugin/node_modules/emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/html-webpack-plugin/node_modules/json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/html-webpack-plugin/node_modules/loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", - "dev": true, - "dependencies": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - }, "node_modules/htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -20516,8 +20564,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema": { "version": "0.4.0", @@ -20646,6 +20693,15 @@ "node": ">=6" } }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/known-css-properties": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", @@ -21422,8 +21478,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -21552,64 +21607,6 @@ "node": ">=4" } }, - "node_modules/mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "dependencies": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.4.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -21805,6 +21802,7 @@ "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true, "optional": true }, "node_modules/nanomatch": { @@ -25292,19 +25290,16 @@ } }, "node_modules/sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.2.tgz", + "integrity": "sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==", "dev": true, "dependencies": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" + "klona": "^2.0.6", + "neo-async": "^2.6.2" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", @@ -25312,9 +25307,10 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "sass": "^1.3.0", - "webpack": "^4.36.0 || ^5.0.0" + "sass-embedded": "*", + "webpack": "^5.0.0" }, "peerDependenciesMeta": { "fibers": { @@ -25325,35 +25321,12 @@ }, "sass": { "optional": true + }, + "sass-embedded": { + "optional": true } } }, - "node_modules/sass-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/sass-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -25638,27 +25611,6 @@ "sha.js": "bin.js" } }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallow-clone/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -27148,156 +27100,124 @@ } }, "node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", + "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" } }, "node_modules/terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "dependencies": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "engines": { - "node": ">= 6.9.0" + "node": ">= 10.13.0" }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" + "peerDependencies": { + "webpack": "^5.1.0" }, - "engines": { - "node": ">=6" + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } } }, - "node_modules/terser-webpack-plugin/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "node_modules/terser-webpack-plugin/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/terser-webpack-plugin/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" }, "engines": { - "node": ">=6" + "node": ">= 10.13.0" } }, - "node_modules/terser-webpack-plugin/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" + "node": ">= 10.13.0" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser-webpack-plugin/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/terser-webpack-plugin/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "engines": { - "node": ">=6" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/terser-webpack-plugin/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" + "randombytes": "^2.1.0" } }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/terser-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/terser/node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { - "semver": "bin/semver" + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/terser/node_modules/commander": { @@ -27305,6 +27225,15 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -27488,7 +27417,7 @@ "node_modules/to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" }, "node_modules/to-fast-properties": { "version": "2.0.0", @@ -27570,7 +27499,7 @@ "node_modules/toposort": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", "dev": true }, "node_modules/tough-cookie": { @@ -27714,7 +27643,7 @@ "node_modules/tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" }, "node_modules/tunnel-agent": { "version": "0.6.0", @@ -28087,7 +28016,7 @@ "node_modules/upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", "dev": true }, "node_modules/uri-js": { @@ -28113,55 +28042,6 @@ "querystring": "0.2.0" } }, - "node_modules/url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", - "dev": true, - "dependencies": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "peerDependencies": { - "file-loader": "*", - "webpack": "^4.0.0" - }, - "peerDependenciesMeta": { - "file-loader": { - "optional": true - } - } - }, - "node_modules/url-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/url-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -28220,7 +28100,7 @@ "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, "node_modules/utils-merge": { @@ -28687,231 +28567,154 @@ "worker-loader": "^2.0.0" } }, - "node_modules/vue-pdf/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/vue-pdf/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/vue-pdf/node_modules/worker-loader": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", - "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", - "dependencies": { - "loader-utils": "^1.0.0", - "schema-utils": "^0.4.0" - }, - "engines": { - "node": ">= 6.9.0 || >= 8.9.0" - }, - "peerDependencies": { - "webpack": "^3.0.0 || ^4.0.0-alpha.0 || ^4.0.0" - } - }, - "node_modules/vue-pdf/node_modules/worker-loader/node_modules/schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "node_modules/vue-pdf/node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "peer": true, "dependencies": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" } }, - "node_modules/vue-resize-sensor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz", - "integrity": "sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ==" - }, - "node_modules/vue-router": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.4.tgz", - "integrity": "sha512-x+/DLAJZv2mcQ7glH2oV9ze8uPwcI+H+GgTgTmb5I55bCgY3+vXWIsqbYUzbBSZnwFHEJku4eoaH/x98veyymQ==" - }, - "node_modules/vue-slim-tabs": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/vue-slim-tabs/-/vue-slim-tabs-0.4.0.tgz", - "integrity": "sha512-19bwuKs2HICja0E039QmE7N7PMQcjdZXcpigmXlJTtTYGZy40C112tZF6q7bS18XNZGFcd/sP3jOJRGC80gVVw==" + "node_modules/vue-pdf/node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "peer": true }, - "node_modules/vue-style-loader": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", - "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", - "dev": true, - "dependencies": { - "hash-sum": "^1.0.2", - "loader-utils": "^1.0.2" - } + "node_modules/vue-pdf/node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "peer": true }, - "node_modules/vue-style-loader/node_modules/hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true + "node_modules/vue-pdf/node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "peer": true }, - "node_modules/vue-style-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, + "node_modules/vue-pdf/node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "peer": true, "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" } }, - "node_modules/vue-style-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, + "node_modules/vue-pdf/node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "peer": true, "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, - "engines": { - "node": ">=4.0.0" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/vue-template-compiler": { - "version": "2.6.14", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz", - "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==", - "dev": true, + "node_modules/vue-pdf/node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "peer": true, "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.1.0" - } - }, - "node_modules/vue-template-es2015-compiler": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", - "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", - "dev": true - }, - "node_modules/vuex": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", - "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", - "peerDependencies": { - "vue": "^2.0.0" + "@xtuc/long": "4.2.2" } }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "dev": true, - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } + "node_modules/vue-pdf/node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "peer": true }, - "node_modules/w3c-xmlserializer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", - "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", - "dev": true, + "node_modules/vue-pdf/node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "peer": true, "dependencies": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" } }, - "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", - "dev": true - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, + "node_modules/vue-pdf/node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "peer": true, "dependencies": { - "makeerror": "1.0.12" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "node_modules/watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "node_modules/vue-pdf/node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "peer": true, "dependencies": { - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - }, - "optionalDependencies": { - "chokidar": "^3.4.1", - "watchpack-chokidar2": "^2.0.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" } }, - "node_modules/watchpack-chokidar2": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", - "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", - "optional": true, + "node_modules/vue-pdf/node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "peer": true, "dependencies": { - "chokidar": "^2.1.8" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" } }, - "node_modules/watchpack-chokidar2/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "optional": true, + "node_modules/vue-pdf/node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "peer": true, "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" } }, - "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" + "node_modules/vue-pdf/node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "peer": true, + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "optional": true, - "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/watchpack-chokidar2/node_modules/braces": { + "node_modules/vue-pdf/node_modules/braces": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "optional": true, + "peer": true, "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -28928,16 +28731,641 @@ "node": ">=0.10.0" } }, - "node_modules/watchpack-chokidar2/node_modules/chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", + "node_modules/vue-pdf/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + }, + "node_modules/vue-pdf/node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/vue-pdf/node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "peer": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/vue-pdf/node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "peer": true, + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/vue-pdf/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "peer": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-pdf/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "peer": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-pdf/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "peer": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-pdf/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "peer": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-pdf/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "peer": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-pdf/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "peer": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-pdf/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-pdf/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/vue-pdf/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-pdf/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/vue-pdf/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "peer": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-pdf/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "peer": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-pdf/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "peer": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-pdf/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "peer": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-pdf/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-pdf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/vue-pdf/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-pdf/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "peer": true, + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/vue-pdf/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "peer": true, + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/vue-pdf/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/vue-pdf/node_modules/terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "peer": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/vue-pdf/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "peer": true, + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/vue-pdf/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "peer": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-pdf/node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/vue-pdf/node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/vue-pdf/node_modules/worker-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-2.0.0.tgz", + "integrity": "sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==", + "dependencies": { + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.0" + }, + "engines": { + "node": ">= 6.9.0 || >= 8.9.0" + }, + "peerDependencies": { + "webpack": "^3.0.0 || ^4.0.0-alpha.0 || ^4.0.0" + } + }, + "node_modules/vue-pdf/node_modules/worker-loader/node_modules/schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/vue-resize-sensor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vue-resize-sensor/-/vue-resize-sensor-2.0.0.tgz", + "integrity": "sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ==" + }, + "node_modules/vue-router": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.5.4.tgz", + "integrity": "sha512-x+/DLAJZv2mcQ7glH2oV9ze8uPwcI+H+GgTgTmb5I55bCgY3+vXWIsqbYUzbBSZnwFHEJku4eoaH/x98veyymQ==" + }, + "node_modules/vue-slim-tabs": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/vue-slim-tabs/-/vue-slim-tabs-0.4.0.tgz", + "integrity": "sha512-19bwuKs2HICja0E039QmE7N7PMQcjdZXcpigmXlJTtTYGZy40C112tZF6q7bS18XNZGFcd/sP3jOJRGC80gVVw==" + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/vue-style-loader/node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + }, + "node_modules/vue-style-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/vue-style-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.6.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz", + "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.1.0" + } + }, + "node_modules/vue-template-es2015-compiler": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz", + "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", + "dev": true + }, + "node_modules/vuex": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", + "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", + "peerDependencies": { + "vue": "^2.0.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "dependencies": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", @@ -28971,6 +29399,7 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -29083,7 +29512,7 @@ "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "optional": true, "dependencies": { "is-number": "^3.0.0", @@ -29140,39 +29569,40 @@ "dev": true }, "node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "5.77.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz", + "integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==", "dependencies": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" }, "engines": { - "node": ">=6.11.5" + "node": ">=10.13.0" }, "funding": { "type": "opencollective", @@ -29181,9 +29611,6 @@ "peerDependenciesMeta": { "webpack-cli": { "optional": true - }, - "webpack-command": { - "optional": true } } }, @@ -29922,9 +30349,9 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { "acorn": "bin/acorn" }, @@ -29932,175 +30359,53 @@ "node": ">=0.4.0" } }, - "node_modules/webpack/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dependencies": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/webpack/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/webpack/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "peerDependencies": { + "acorn": "^8" } }, - "node_modules/webpack/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - }, + "node_modules/webpack/node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "engines": { - "node": ">=4.0.0" + "node": ">=6.11.5" } }, - "node_modules/webpack/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "node": ">= 10.13.0" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "engines": { - "node": ">= 4" + "node": ">=6" } }, - "node_modules/webpack/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, "node_modules/websocket-driver": { @@ -31821,17 +32126,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "@intervolga/optimize-cssnano-plugin": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", - "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", - "dev": true, - "requires": { - "cssnano": "^4.0.0", - "cssnano-preset-default": "^4.0.0", - "postcss": "^7.0.0" - } - }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -32324,9 +32618,9 @@ } }, "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.1", @@ -32337,19 +32631,17 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", - "dev": true, + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "requires": { - "@jridgewell/set-array": "^1.0.0", + "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.9" } @@ -32357,17 +32649,17 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==" + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@js-joda/core": { @@ -32493,9 +32785,9 @@ } }, "@sideway/formula": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", - "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", "dev": true }, "@sideway/pinpoint": { @@ -32709,7 +33001,6 @@ "version": "8.4.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", - "dev": true, "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -32719,7 +33010,6 @@ "version": "3.7.3", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, "requires": { "@types/eslint": "*", "@types/estree": "*" @@ -32728,8 +33018,7 @@ "@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "@types/express": { "version": "4.17.13", @@ -33251,309 +33540,6 @@ "babel-loader": "^8.2.2", "thread-loader": "^3.0.0", "webpack": "^5.54.0" - }, - "dependencies": { - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "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 - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", - "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.7", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.7.2" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webpack": { - "version": "5.73.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", - "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - } } }, "@vue/cli-plugin-e2e-cypress": { @@ -35128,6 +35114,17 @@ "webpack-merge": "^4.2.2" }, "dependencies": { + "@intervolga/optimize-cssnano-plugin": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz", + "integrity": "sha512-zN69TnSr0viRSU6cEDIcuPcP67QcpQ6uHACg58FiN9PDrU6SLyGW3MR4tiISbYxy1kDWAVPwD+XwQTWE5cigAA==", + "dev": true, + "requires": { + "cssnano": "^4.0.0", + "cssnano-preset-default": "^4.0.0", + "postcss": "^7.0.0" + } + }, "@nodelib/fs.stat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", @@ -35154,6 +35151,144 @@ "strip-ansi": "^6.0.0" } }, + "@vue/preload-webpack-plugin": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", + "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", + "dev": true, + "requires": {} + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, "ansi-regex": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", @@ -35187,6 +35322,20 @@ "to-regex": "^3.0.1" } }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dev": true, + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + } + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -35207,6 +35356,12 @@ "wrap-ansi": "^6.2.0" } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "dir-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", @@ -35216,6 +35371,39 @@ "path-type": "^3.0.0" } }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -35230,6 +35418,16 @@ "micromatch": "^3.1.10" } }, + "file-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" + } + }, "fill-range": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", @@ -35242,6 +35440,15 @@ "to-regex-range": "^2.1.0" } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -35269,6 +35476,53 @@ "slash": "^2.0.0" } }, + "html-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", + "dev": true, + "requires": { + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", + "util.promisify": "1.0.0" + }, + "dependencies": { + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", + "dev": true, + "requires": { + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" + } + } + } + }, "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", @@ -35339,6 +35593,16 @@ "json5": "^1.0.1" } }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", @@ -35357,6 +35621,24 @@ "yallist": "^3.0.2" } }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -35390,6 +35672,31 @@ } } }, + "mini-css-extract-plugin": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", + "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", @@ -35433,6 +35740,21 @@ } } }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -35456,6 +35778,15 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -35472,6 +35803,58 @@ "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, "thread-loader": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-2.1.3.tgz", @@ -35499,6 +35882,79 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, + "url-loader": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", + "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "mime": "^2.4.4", + "schema-utils": "^2.5.0" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -35635,13 +36091,6 @@ "eslint-plugin-standard": "^4.0.0" } }, - "@vue/preload-webpack-plugin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", - "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", - "dev": true, - "requires": {} - }, "@vue/test-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.3.0.tgz", @@ -35660,30 +36109,28 @@ "dev": true }, "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" } }, "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, "@webassemblyjs/helper-code-frame": { "version": "1.9.0", @@ -35691,6 +36138,33 @@ "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", "requires": { "@webassemblyjs/wast-printer": "1.9.0" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + } } }, "@webassemblyjs/helper-fsm": { @@ -35704,113 +36178,121 @@ "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", "requires": { "@webassemblyjs/ast": "1.9.0" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + } } }, "@webassemblyjs/helper-numbers": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", "@xtuc/long": "4.2.2" - }, - "dependencies": { - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - } } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" } }, "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" } }, "@webassemblyjs/wast-parser": { @@ -35826,20 +36308,39 @@ "@xtuc/long": "4.2.2" }, "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, "@webassemblyjs/floating-point-hex-parser": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" } } }, "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", + "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" } }, @@ -36171,7 +36672,7 @@ "util": { "version": "0.10.3", "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", "requires": { "inherits": "2.0.1" } @@ -36766,7 +37267,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "devOptional": true, + "dev": true, "requires": { "file-uri-to-path": "1.0.0" } @@ -37026,9 +37527,9 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -37213,42 +37714,6 @@ "unset-value": "^1.0.0" } }, - "cache-loader": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", - "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", - "dev": true, - "requires": { - "buffer-json": "^2.0.0", - "find-cache-dir": "^3.0.0", - "loader-utils": "^1.2.3", - "mkdirp": "^0.5.1", - "neo-async": "^2.6.1", - "schema-utils": "^2.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, "cachedir": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", @@ -37738,25 +38203,6 @@ "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, "clone-regexp": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", @@ -38971,9 +39417,9 @@ } }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" }, "dedent": { "version": "0.7.0", @@ -39569,23 +40015,18 @@ } }, "enhanced-resolve": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", - "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" } } }, @@ -39678,8 +40119,7 @@ "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "es-shim-unscopables": { "version": "1.0.0", @@ -40245,7 +40685,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -40821,43 +41260,11 @@ "flat-cache": "^3.0.4" } }, - "file-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", - "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "devOptional": true + "dev": true }, "filesize": { "version": "3.6.1", @@ -41223,8 +41630,7 @@ "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "global-dirs": { "version": "3.0.0", @@ -41632,53 +42038,6 @@ "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true }, - "html-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-Br4ifmjQojUP4EmHnRBoUIYcZ9J7M4bTMcm7u6xoIAIuq2Nte4TzXX0533owvkQKQD1WeMTTTyD4Ni4QKxS0Bg==", - "dev": true, - "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", - "util.promisify": "1.0.0" - }, - "dependencies": { - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==", - "dev": true - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha512-tiv66G0SmiOx+pLWMtGEkfSEejxvb6N6uRrQjfWJIT79W9GMpgKeCAmm9aVBKtd4WEgntciI8CsGqjpDoCWJug==", - "dev": true, - "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" - } - } - } - }, "htmlparser2": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", @@ -46390,8 +46749,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema": { "version": "0.4.0", @@ -46498,6 +46856,12 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, + "klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "dev": true + }, "known-css-properties": { "version": "0.21.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", @@ -47093,8 +47457,7 @@ "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", @@ -47180,51 +47543,6 @@ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, - "mini-css-extract-plugin": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz", - "integrity": "sha512-lp3GeY7ygcgAmVIcRPBVhIkf8Us7FZjA+ILpal44qLdSu11wmjKQ3d9k15lfD7pO4esu9eUIAW7qiYIBppv40A==", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "normalize-url": "1.9.1", - "schema-utils": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -47388,6 +47706,7 @@ "version": "2.16.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz", "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", + "dev": true, "optional": true }, "nanomatch": { @@ -50186,38 +50505,13 @@ } }, "sass-loader": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-8.0.2.tgz", - "integrity": "sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.2.tgz", + "integrity": "sha512-nrIdVAAte3B9icfBiGWvmMhT/D+eCDwnk+yA7VE/76dp/WkHX+i44Q/pfo71NYbwj0Ap+PGsn0ekOuU1WFJ2AA==", "dev": true, "requires": { - "clone-deep": "^4.0.1", - "loader-utils": "^1.2.3", - "neo-async": "^2.6.1", - "schema-utils": "^2.6.1", - "semver": "^6.3.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } + "klona": "^2.0.6", + "neo-async": "^2.6.2" } }, "sax": { @@ -50465,23 +50759,6 @@ "safe-buffer": "^5.0.1" } }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -51695,119 +51972,89 @@ } }, "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "version": "5.16.8", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.8.tgz", + "integrity": "sha512-QI5g1E/ef7d+PsDifb+a6nnVgC4F22Bg6T0xrBrz6iloVB4PUkkunp6V8nzoOOZJIzjWVdAGqCdlKlhLq/TbIA==", "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map-support": "~0.5.20" }, "dependencies": { + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } } } }, "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", + "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.5" }, "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==" - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { - "p-limit": "^2.0.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "requires": { - "find-up": "^3.0.0" + "randombytes": "^2.1.0" } }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "has-flag": "^4.0.0" } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -51960,7 +52207,7 @@ "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" }, "to-fast-properties": { "version": "2.0.0", @@ -52023,7 +52270,7 @@ "toposort": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz", - "integrity": "sha1-LmhELZ9k7HILjMieZEOsbKqVACk=", + "integrity": "sha512-FclLrw8b9bMWf4QlCJuHBEVhSRsqDj6u3nIjAzPeJvgl//1hBlffdlk0MALceL14+koWEdU4ofRAXofbODxQzg==", "dev": true }, "tough-cookie": { @@ -52138,7 +52385,7 @@ "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==" }, "tunnel-agent": { "version": "0.6.0", @@ -52416,7 +52663,7 @@ "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", "dev": true }, "uri-js": { @@ -52448,39 +52695,6 @@ } } }, - "url-loader": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-2.3.0.tgz", - "integrity": "sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "mime": "^2.4.4", - "schema-utils": "^2.5.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - } - } - }, "url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", @@ -52533,7 +52747,7 @@ "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", "dev": true }, "utils-merge": { @@ -52703,198 +52917,646 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "vue-functional-data-merge": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", + "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==" + }, + "vue-hot-reload-api": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", + "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", + "dev": true + }, + "vue-infinite-loading": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/vue-infinite-loading/-/vue-infinite-loading-2.4.5.tgz", + "integrity": "sha512-xhq95Mxun060bRnsOoLE2Be6BR7jYwuC89kDe18+GmCLVrRA/dU0jrGb12Xu6NjmKs+iTW0AA6saSEmEW4cR7g==", + "requires": {} + }, + "vue-jest": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-3.0.7.tgz", + "integrity": "sha512-PIOxFM+wsBMry26ZpfBvUQ/DGH2hvp5khDQ1n51g3bN0TwFwTy4J85XVfxTRMukqHji/GnAoGUnlZ5Ao73K62w==", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", + "chalk": "^2.1.0", + "deasync": "^0.1.15", + "extract-from-css": "^0.4.4", + "find-babel-config": "^1.1.0", + "js-beautify": "^1.6.14", + "node-cache": "^4.1.1", + "object-assign": "^4.1.1", + "source-map": "^0.5.6", + "tsconfig": "^7.0.0", + "vue-template-es2015-compiler": "^1.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "vue-loader": { + "version": "15.9.8", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", + "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", + "dev": true, + "requires": { + "@vue/component-compiler-utils": "^3.1.0", + "hash-sum": "^1.0.2", + "loader-utils": "^1.1.0", + "vue-hot-reload-api": "^2.3.0", + "vue-style-loader": "^4.1.0" + }, + "dependencies": { + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "vue-loader-v16": { + "version": "npm:vue-loader@16.8.3", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", + "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", + "dev": true, + "optional": true, + "requires": { + "chalk": "^4.1.0", + "hash-sum": "^2.0.0", + "loader-utils": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "optional": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "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, + "optional": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "optional": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "vue-material-design-icons": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vue-material-design-icons/-/vue-material-design-icons-5.0.0.tgz", + "integrity": "sha512-lYSJFW/TyQqmg7MvUbEB8ua1mwWy/v8qve7QJuA/UWUAXC4/yVUdAm4pg/sM9+k5n7VLckBv6ucOROuGBsGPDQ==" + }, + "vue-pdf": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vue-pdf/-/vue-pdf-4.3.0.tgz", + "integrity": "sha512-zd3lJj6CbtrawgaaDDciTDjkJMUKiLWtbEmBg5CvFn9Noe9oAO/GNy/fc5c59qGuFCJ14ibIV1baw4S07e5bSQ==", + "requires": { + "babel-plugin-syntax-dynamic-import": "^6.18.0", + "loader-utils": "^1.4.0", + "pdfjs-dist": "2.6.347", + "raw-loader": "^4.0.2", + "vue-resize-sensor": "^2.0.0", + "worker-loader": "^2.0.0" + }, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "peer": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "peer": true + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "peer": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "peer": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "peer": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + } + } + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "peer": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "peer": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "peer": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "peer": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "peer": true, + "requires": { + "is-plain-object": "^2.0.4" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "peer": true, "requires": { - "lru-cache": "^6.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "peer": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } - } - } - }, - "vue-functional-data-merge": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", - "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==" - }, - "vue-hot-reload-api": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz", - "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==", - "dev": true - }, - "vue-infinite-loading": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/vue-infinite-loading/-/vue-infinite-loading-2.4.5.tgz", - "integrity": "sha512-xhq95Mxun060bRnsOoLE2Be6BR7jYwuC89kDe18+GmCLVrRA/dU0jrGb12Xu6NjmKs+iTW0AA6saSEmEW4cR7g==", - "requires": {} - }, - "vue-jest": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vue-jest/-/vue-jest-3.0.7.tgz", - "integrity": "sha512-PIOxFM+wsBMry26ZpfBvUQ/DGH2hvp5khDQ1n51g3bN0TwFwTy4J85XVfxTRMukqHji/GnAoGUnlZ5Ao73K62w==", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", - "chalk": "^2.1.0", - "deasync": "^0.1.15", - "extract-from-css": "^0.4.4", - "find-babel-config": "^1.1.0", - "js-beautify": "^1.6.14", - "node-cache": "^4.1.1", - "object-assign": "^4.1.1", - "source-map": "^0.5.6", - "tsconfig": "^7.0.0", - "vue-template-es2015-compiler": "^1.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "vue-loader": { - "version": "15.9.8", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz", - "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==", - "dev": true, - "requires": { - "@vue/component-compiler-utils": "^3.1.0", - "hash-sum": "^1.0.2", - "loader-utils": "^1.1.0", - "vue-hot-reload-api": "^2.3.0", - "vue-style-loader": "^4.1.0" - }, - "dependencies": { - "hash-sum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", - "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==", - "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "peer": true }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, "requires": { "minimist": "^1.2.0" } }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "peer": true + }, "loader-utils": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } - } - } - }, - "vue-loader-v16": { - "version": "npm:vue-loader@16.8.3", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz", - "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==", - "dev": true, - "optional": true, - "requires": { - "chalk": "^4.1.0", - "hash-sum": "^2.0.0", - "loader-utils": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "peer": true, "requires": { - "color-convert": "^2.0.1" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "peer": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "pify": "^4.0.1", + "semver": "^5.6.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, - "optional": true, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "peer": true, "requires": { - "color-name": "~1.1.4" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "peer": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + } } }, - "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, - "optional": true + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "peer": true, + "requires": { + "p-limit": "^2.0.0" + } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "optional": true, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "peer": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "peer": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "peer": true, "requires": { - "has-flag": "^4.0.0" + "find-up": "^3.0.0" } - } - } - }, - "vue-material-design-icons": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vue-material-design-icons/-/vue-material-design-icons-5.0.0.tgz", - "integrity": "sha512-lYSJFW/TyQqmg7MvUbEB8ua1mwWy/v8qve7QJuA/UWUAXC4/yVUdAm4pg/sM9+k5n7VLckBv6ucOROuGBsGPDQ==" - }, - "vue-pdf": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vue-pdf/-/vue-pdf-4.3.0.tgz", - "integrity": "sha512-zd3lJj6CbtrawgaaDDciTDjkJMUKiLWtbEmBg5CvFn9Noe9oAO/GNy/fc5c59qGuFCJ14ibIV1baw4S07e5bSQ==", - "requires": { - "babel-plugin-syntax-dynamic-import": "^6.18.0", - "loader-utils": "^1.4.0", - "pdfjs-dist": "2.6.347", - "raw-loader": "^4.0.2", - "vue-resize-sensor": "^2.0.0", - "worker-loader": "^2.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "peer": true, "requires": { - "minimist": "^1.2.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true + }, + "terser": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", + "peer": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "peer": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "peer": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "peer": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" } }, "worker-loader": { @@ -53032,14 +53694,12 @@ } }, "watchpack": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", - "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.1" + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" } }, "watchpack-chokidar2": { @@ -53132,6 +53792,7 @@ "version": "1.2.13", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, "optional": true, "requires": { "bindings": "^1.5.0", @@ -53218,7 +53879,7 @@ "to-regex-range": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "optional": true, "requires": { "is-number": "^3.0.0", @@ -53273,175 +53934,71 @@ "dev": true }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "5.77.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.77.0.tgz", + "integrity": "sha512-sbGNjBr5Ya5ss91yzjeJTLKyfiwo5C628AFjEa6WSXcZa4E+F57om3Cc8xLb1Jh0b243AWuSYRf3dn7HVeFQ9Q==", "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.5.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, "dependencies": { "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "requires": { - "minimist": "^1.2.0" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "requires": {} }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - } - } + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" } }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" } } }, diff --git a/package.json b/package.json index cd2af366d..758e2dfe9 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "jest": "^28.1.1", "prettier": "^2.5.1", "sass": "1.52.3", - "sass-loader": "^8.0.2", + "sass-loader": "^13.2.2", "sinon": "^14.0.0", "stylelint": "^13.13.1", "stylelint-config-standard": "^19.0.0", diff --git a/src/components/widgets/NodeStatsWidget.vue b/src/components/widgets/NodeStatsWidget.vue index 8216fcf6d..f4d28a100 100644 --- a/src/components/widgets/NodeStatsWidget.vue +++ b/src/components/widgets/NodeStatsWidget.vue @@ -38,10 +38,6 @@ import Card from '@/components/containers/Card.vue'; import ButtonMore from '@/components/controls/ButtonMore.vue'; import Constants from '../../config/constants'; -import IconOrange from '../../styles/img/connector_orange.png'; -import IconBlue from '../../styles/img/connector_blue.png'; -import IconGreen from '../../styles/img/connector_green.png'; -import IconPink from '../../styles/img/connector_pink.png'; export default { components: { @@ -70,7 +66,7 @@ export default { }, nodeRoles () { - const data = this.data?.nodeTypes; + const data = this.data; if (!data) return []; @@ -78,50 +74,35 @@ export default { return [ { name: this.getNameByKey('allNodes'), - count: Array.from(Array(8).keys()).reduce((acc, val) => acc + (data[val] || 0)), - icon: IconBlue + count: Array.from(Array(8).keys()).reduce((acc, val) => acc + (data[val] || 0)) }, { name: Constants.RoleType[1], - count: data[1] || 0, - icon: IconBlue, - color: 'blue' + count: data[1] || 0 }, { name: Constants.RoleType[2], - count: data[2] || 0, - icon: IconPink, - color: 'pink' + count: data[2] || 0 }, { name: Constants.RoleType[3], - count: data[3] || 0, - icon: IconPink, - color: 'pink' + count: data[3] || 0 }, { name: Constants.RoleType[4], - count: data[4] || 0, - icon: IconGreen, - color: 'green' + count: data[4] || 0 }, { name: Constants.RoleType[5], - count: data[5] || 0, - icon: IconGreen, - color: 'green' + count: data[5] || 0 }, { name: Constants.RoleType[6], - count: data[6] || 0, - icon: IconOrange, - color: 'orange' + count: data[6] || 0 }, { name: Constants.RoleType[7], - count: data[7] || 0, - icon: IconOrange, - color: 'orange' + count: data[7] || 0 } ]; }, diff --git a/src/config/pages/node-detail.json b/src/config/pages/node-detail.json index 63c7ffea6..376f975be 100644 --- a/src/config/pages/node-detail.json +++ b/src/config/pages/node-detail.json @@ -83,6 +83,20 @@ "lastStatusCheck" ] }, + { + "layoutOptions": "adaptive", + "type": "CardTable", + "title": "nodePeerStatusTitle", + "managerGetter": "node/info", + "dataGetter": "node/peerStatus", + "errorMessage": "nodeDetailError", + "pagination": "none", + "hideEmptyData": true, + "fields": [ + "connectionStatus", + "lastStatusCheck" + ] + }, { "layoutOptions": "full-width", "type": "CardTable", diff --git a/src/helper.js b/src/helper.js index 12973498a..5046a84d1 100644 --- a/src/helper.js +++ b/src/helper.js @@ -17,7 +17,11 @@ */ import { Constants } from './config'; -import { NamespaceService, MosaicService, ReceiptService } from './infrastructure'; +import { + NamespaceService, + MosaicService, + ReceiptService +} from './infrastructure'; import http from './infrastructure/http'; import moment from 'moment'; import { @@ -41,7 +45,7 @@ const getNetworkTypeAddressFormat = { }; class helper { - static timeSince (interval) { + static timeSince(interval) { if (1 < interval.years) return interval.years + ' years'; else if (1 === interval.years) @@ -55,13 +59,13 @@ class helper { else if (1 === interval.hours) return interval.hours + ' hour'; else if (1 < interval.minutes) - return interval.minutes + ' min';// ' minutes' + return interval.minutes + ' min'; // ' minutes' else if (1 === interval.minutes) - return interval.minutes + ' min';// ' minute' + return interval.minutes + ' min'; // ' minute' else if (1 !== interval.seconds) - return interval.seconds + ' sec';// ' seconds' + return interval.seconds + ' sec'; // ' seconds' else - return interval.seconds + ' sec';// ' second' + return interval.seconds + ' sec'; // ' second' } static formatSeconds = _second => { @@ -100,37 +104,35 @@ class helper { result = `${d} d ${result}`; return result; - } + }; static isMosaicOrNamespaceId = str => 16 === str.length && /^[0-9a-fA-F]+$/.test(str); static isAccountPublicKey = str => - 64 === str.length && - str.match('^[A-z0-9]+$') + 64 === str.length && str.match('^[A-z0-9]+$'); static isAccountAddress = str => 39 === str.length && str.match(`[${getNetworkTypeAddressFormat[http.networkType]}]` + - '{1,1}[a-zA-Z0-9]{5,5}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{3,3}') + '{1,1}[a-zA-Z0-9]{5,5}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{6,6}[a-zA-Z0-9]{3,3}'); - static isBlockHeight = str => - str.match(/^-{0,1}\d+$/) + static isBlockHeight = str => str.match(/^-{0,1}\d+$/); - static validURL (url) { + static validURL(url) { // All we expect is there is a valid origin for the url, IE, // the origin is not 'null'. return 'null' !== url.origin; } - static parseUrl (str) { + static parseUrl(str) { let url = new Url(str); if (this.validURL(url)) return url; } - static httpToWssUrl (str) { + static httpToWssUrl(str) { let url = new Url(str); if (this.validURL(url)) { @@ -139,7 +141,7 @@ class helper { } } - static async logError (dispatch, action, ...args) { + static async logError(dispatch, action, ...args) { try { await dispatch(action, ...args); } catch (e) { @@ -147,28 +149,35 @@ class helper { } } - static convertToSecond = durationInBlocks => durationInBlocks * http.networkConfig.TargetBlockTime + static convertToSecond = durationInBlocks => + durationInBlocks * http.networkConfig.TargetBlockTime; static calculateNamespaceExpiration = (currentHeight, endHeight) => { - const expired = currentHeight > endHeight - http.networkConfig.NamespaceGraceDuration; - const expiredInBlock = endHeight - http.networkConfig.NamespaceGraceDuration - currentHeight; + const expired = + currentHeight > endHeight - http.networkConfig.NamespaceGraceDuration; + const expiredInBlock = + endHeight - http.networkConfig.NamespaceGraceDuration - currentHeight; return { isExpired: expired, expiredInBlock: expiredInBlock, expiredInSecond: this.convertToSecond(expiredInBlock) }; - } + }; static fetchData = async (fetchFunction, commit, before, error, success) => { - if ('function' === typeof before) { await before(); } else { + if ('function' === typeof before) { + await before(); + } else { commit('setLoading', true); commit('setError', false); } try { await fetchFunction(); } catch (e) { - if ('function' === typeof error) { await error(e); } else { + if ('function' === typeof error) { + await error(e); + } else { console.error(e); commit('setError', true); } @@ -177,7 +186,7 @@ class helper { await success(); else commit('setLoading', false); - } + }; /** * Convert hex value or namespace name to mosaicId or namespaceId. @@ -190,20 +199,20 @@ class helper { const isHexadecimal = this.isMosaicOrNamespaceId(hexOrNamespace); - if (isHexadecimal){ - Id = 'mosaic' === toId - ? new MosaicId(hexOrNamespace) - : NamespaceId.createFromEncoded(hexOrNamespace); - } - else - { - Id = 'mosaic' === toId - ? await NamespaceService.getLinkedMosaicId(new NamespaceId(hexOrNamespace)) - : new NamespaceId(hexOrNamespace); + if (isHexadecimal) { + Id = + 'mosaic' === toId + ? new MosaicId(hexOrNamespace) + : NamespaceId.createFromEncoded(hexOrNamespace); + } else { + Id = + 'mosaic' === toId + ? await NamespaceService.getLinkedMosaicId(new NamespaceId(hexOrNamespace)) + : new NamespaceId(hexOrNamespace); } return Id; - } + }; /** * Decode Account Public key or Namespace name to plan Address. @@ -225,7 +234,7 @@ class helper { } return address; - } + }; /** * Convert Mosaic amount to relative Amount with divisibility. @@ -239,8 +248,10 @@ class helper { let relativeAmount = amount / Math.pow(10, divisibility); - return relativeAmount.toLocaleString('en-US', { minimumFractionDigits: divisibility }); - } + return relativeAmount.toLocaleString('en-US', { + minimumFractionDigits: divisibility + }); + }; /** * Get network currency balance. @@ -248,14 +259,20 @@ class helper { * @returns {string} network currency balance. */ static getNetworkCurrencyBalance = mosaics => { - const networkCurrencyMosaic = mosaics.filter(mosaic => mosaic.id.toHex() === http.networkCurrency.mosaicId || - (mosaic.id instanceof NamespaceId && - mosaic.id.toHex() === http.networkCurrency.namespaceId)); + const networkCurrencyMosaic = mosaics.filter(mosaic => + mosaic.id.toHex() === http.networkCurrency.mosaicId || + (mosaic.id instanceof NamespaceId && + mosaic.id.toHex() === http.networkCurrency.namespaceId)); - const totalNetworkCurrencyAmount = networkCurrencyMosaic.reduce((acc, cur) => acc + Number(cur.amount.toString()), 0); + const totalNetworkCurrencyAmount = networkCurrencyMosaic.reduce( + (acc, cur) => acc + Number(cur.amount.toString()), + 0 + ); - return 0 < networkCurrencyMosaic.length ? this.toNetworkCurrency(totalNetworkCurrencyAmount) : Constants.Message.UNAVAILABLE; - } + return 0 < networkCurrencyMosaic.length + ? this.toNetworkCurrency(totalNetworkCurrencyAmount) + : Constants.Message.UNAVAILABLE; + }; /** * Convert networkTimestamp to date. @@ -278,14 +295,15 @@ class helper { } return date.format('YYYY-MM-DD HH:mm:ss'); - } + }; /** * convert difficulty raw score to readable * @param {UInt64} difficulty - raw difficulty score * @returns {string} difficulty - readable difficulty score */ - static convertBlockDifficultyToReadable = difficulty => (difficulty.compact() / 1000000000000).toFixed(2).toString() + static convertBlockDifficultyToReadable = difficulty => + (difficulty.compact() / 1000000000000).toFixed(2).toString(); /** * Format Importance score to percentage. @@ -302,7 +320,7 @@ class helper { percent = rawScore / totalChainImportance; return (percent * 100).toFixed(divisibility).toString() + ' %'; - } + }; /** * Format number to Network currency divisibility. @@ -311,22 +329,26 @@ class helper { * @returns {string} amount - (string) with formatted divisibility */ static toNetworkCurrency = amount => - (amount / Math.pow(10, http.networkCurrency.divisibility)) - .toLocaleString('en-US', { minimumFractionDigits: http.networkCurrency.divisibility }) + (amount / Math.pow(10, http.networkCurrency.divisibility)).toLocaleString( + 'en-US', + { minimumFractionDigits: http.networkCurrency.divisibility } + ); /** * Convert public key to Address. * @param {string} publicKey - raw public key * @returns {string} address - address in plain format */ - static publicKeyToAddress = publicKey => Address.createFromPublicKey(publicKey, http.networkType).plain() + static publicKeyToAddress = publicKey => + Address.createFromPublicKey(publicKey, http.networkType).plain(); /** * convert network timestamp to world time * @param {number} timestamp - raw timestamp * @returns {number} timestamp - world timestamp */ - static networkTimestamp = timestamp => Math.round(timestamp / 1000) + http.networkConfig.NemsisTimestamp + static networkTimestamp = timestamp => + Math.round(timestamp / 1000) + http.networkConfig.NemsisTimestamp; /** * Sort Native mosaic to top of list. @@ -342,23 +364,23 @@ class helper { : sortedMosaics.push(mosaic)); return sortedMosaics; - } + }; /** * Convert second to time from now in second. * @param {number} second number of second. * @returns {string} time from now in second. */ - static convertTimeFromNowInSec = second => moment.utc().add(second, 's') - .fromNow() + static convertTimeFromNowInSec = second => + moment.utc().add(second, 's').fromNow(); /** * convert second to Date. * @param {number} second number of second. * @returns {string} YYYY.MM.DD HH:mm UTC. */ - static convertSecondToDate = second => moment.utc().add(second, 's') - .format('YYYY.MM.DD @ HH:mm UTC') + static convertSecondToDate = second => + moment.utc().add(second, 's').format('YYYY.MM.DD @ HH:mm UTC'); /** * Converts an HSL color value to RGB. Conversion formula @@ -371,11 +393,13 @@ class helper { * @param {number} l The lightness * @returns {object} {R: Number, G: Number, B: Number} */ - static hslToRgb (h, s, l) { + static hslToRgb(h, s, l) { let r, g, b; - if (0 === s) { r = g = b = l; } // achromatic - else { + if (0 === s) { + r = g = b = l; + } // achromatic + else { /* eslint-disable no-param-reassign */ const hue2rgb = (_p, _q, _t) => { if (0 > _t) @@ -440,23 +464,56 @@ class helper { totalValue += parseInt(hex, 16); } else { const charset = [ - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z' ]; for (const char of hash) totalValue += charset.indexOf(char.toLowerCase()); - }; + } const k = Math.trunc(totalValue / spread); const offsetValue = totalValue - (spread * k); const hue = offsetValue / 100; return this.hslToRgb(hue, saturation, lightness); - } + }; - static truncString (str, strLen = 4) { + static truncString(str, strLen = 4) { if ('string' === typeof str) { if (str.length > (strLen * 2) + 1) return `${str.substring(0, strLen)}...${str.substring(str.length - strLen, str.length)}`; @@ -490,16 +547,17 @@ class helper { const namespaceHex = unResolvedAddress.id.toHex(); - const addressResolutionStatements = await ReceiptService.searchAddressResolutionStatements(searchCriteria); + const addressResolutionStatements = + await ReceiptService.searchAddressResolutionStatements(searchCriteria); - const address = addressResolutionStatements.data.find(item => item.unresolved === namespaceHex - && 'Address' === item.resolutionType)?.addressResolutionEntries[0]; + const address = addressResolutionStatements.data.find(item => + item.unresolved === namespaceHex && 'Address' === item.resolutionType)?.addressResolutionEntries[0]; if (!address) throw new Error('Failed to resolved address'); return address; - } + }; /** * To resolved unresolvedMosaicId. @@ -514,7 +572,7 @@ class helper { return new MosaicId(http.networkCurrency.mosaicId); return await NamespaceService.getLinkedMosaicId(unresolvedMosaicId); - } + }; /** * Build mosaic field object use in MosaicField components. @@ -523,16 +581,25 @@ class helper { * @param {array} mosaicNames - mosaics namespace name. * @returns {object} { mosaicId, amount, mosaicAliasName } */ - static mosaicsFieldObjectBuilder = (resolvedMosaics, mosaicInfos, mosaicNames) => { + static mosaicsFieldObjectBuilder = ( + resolvedMosaics, + mosaicInfos, + mosaicNames + ) => { if (0 === resolvedMosaics.length) return []; - const uniqueMosaicIds = [...new Set(resolvedMosaics.map(mosaic => mosaic.id.toHex()))]; + const uniqueMosaicIds = [ + ...new Set(resolvedMosaics.map(mosaic => mosaic.id.toHex())) + ]; return uniqueMosaicIds.map(idHex => { const mosaics = resolvedMosaics.filter(mosaic => mosaic.id.toHex() === idHex); - const sumAmount = mosaics.reduce((acc, cur) => acc + BigInt(cur.amount.toString()), BigInt(0)); + const sumAmount = mosaics.reduce( + (acc, cur) => acc + BigInt(cur.amount.toString()), + BigInt(0) + ); const mosaicField = { rawAmount: UInt64.fromNumericString(sumAmount.toString()), @@ -542,7 +609,10 @@ class helper { if (idHex === http.networkCurrency.mosaicId) { return { ...mosaicField, - amount: this.formatMosaicAmountWithDivisibility(Number(sumAmount), http.networkCurrency.divisibility), + amount: this.formatMosaicAmountWithDivisibility( + Number(sumAmount), + http.networkCurrency.divisibility + ), mosaicAliasName: http.networkCurrency.namespaceName }; } else { @@ -550,12 +620,18 @@ class helper { return { ...mosaicField, - amount: this.formatMosaicAmountWithDivisibility(Number(sumAmount), divisibility), - mosaicAliasName: MosaicService.extractMosaicNamespace({ mosaicId: mosaics[0].id.toHex() }, mosaicNames)[0] + amount: this.formatMosaicAmountWithDivisibility( + Number(sumAmount), + divisibility + ), + mosaicAliasName: MosaicService.extractMosaicNamespace( + { mosaicId: mosaics[0].id.toHex() }, + mosaicNames + )[0] }; } }); - } + }; /** * Check native namespace. @@ -569,7 +645,7 @@ class helper { const values = http.nativeNamespaces.map(namespace => namespace.namespaceName); return -1 !== values.indexOf(namespaceName); - } + }; /** * Gets single mosaic alias name. @@ -578,10 +654,13 @@ class helper { */ static getMosaicAliasNames = async mosaicId => { const getMosaicNames = await NamespaceService.getMosaicsNames([mosaicId]); - const mosaicAliasNames = MosaicService.extractMosaicNamespace({ mosaicId: mosaicId.toHex() }, getMosaicNames); + const mosaicAliasNames = MosaicService.extractMosaicNamespace( + { mosaicId: mosaicId.toHex() }, + getMosaicNames + ); return mosaicAliasNames; - } + }; static fallbackCopyTextToClipboard = text => { let textArea = document.createElement('textarea'); @@ -607,7 +686,7 @@ class helper { document.body.removeChild(textArea); return success; - } + }; static copyTextToClipboard = text => { return new Promise((resolve, reject) => { @@ -617,14 +696,17 @@ class helper { else reject(Error('Could not copy text. document.execCommand() failed')); } - navigator.clipboard.writeText(text).then(function () { - resolve(); - }, function (err) { - console.error('Async: Could not copy text: ', err); - reject(Error('Async: Could not copy text: ', err)); - }); + navigator.clipboard.writeText(text).then( + function () { + resolve(); + }, + function (err) { + console.error('Async: Could not copy text: ', err); + reject(Error('Async: Could not copy text: ', err)); + } + ); }); - } + }; static formatNodeVersion = rawNodeVersion => { try { @@ -632,19 +714,19 @@ class helper { } catch (e) { return Constants.Message.UNAVAILABLE; } - } + }; - static getMosaicName (mosaic) { + static getMosaicName(mosaic) { let mosaicAliasName; if (Array.isArray(mosaic.mosaicAliasName)) - mosaicAliasName = mosaic.mosaicAliasName.length ? mosaic.mosaicAliasName[0] : 'N/A'; + {mosaicAliasName = mosaic.mosaicAliasName.length + ? mosaic.mosaicAliasName[0] + : 'N/A';} else - mosaicAliasName = mosaic.mosaicAliasName ? mosaic.mosaicAliasName : 'N/A'; + {mosaicAliasName = mosaic.mosaicAliasName ? mosaic.mosaicAliasName : 'N/A';} - return 'N/A' !== mosaicAliasName - ? mosaicAliasName - : mosaic.mosaicId; + return 'N/A' !== mosaicAliasName ? mosaicAliasName : mosaic.mosaicId; } /** @@ -652,7 +734,7 @@ class helper { * @param {array} dataset - list of data. * @returns {string} csv data in string format. */ - static convertArrayToCSV (dataset) { + static convertArrayToCSV(dataset) { if (!Array.isArray(dataset)) throw Error('Convert dataset to CSV fail.'); @@ -687,7 +769,7 @@ class helper { */ static getStartListIndex = (pageNumber, pageSize) => { return 1 === pageNumber ? 0 : (pageNumber - 1) * pageSize; - } + }; static getTransactionMosaicInfoAndNamespace = async transactions => { const unresolvedMosaics = []; @@ -707,7 +789,7 @@ class helper { }); return await helper.getMosaicInfoAndNamespace(unresolvedMosaics); - } + }; static getMosaicInfoAndNamespace = async unresolvedMosaics => { const unresolvedMosaicsMap = {}; @@ -727,7 +809,9 @@ class helper { .filter(mosaicId => mosaicId.toHex() !== http.networkCurrency.mosaicId); // filter duplicated mosaic id - const uniqueMosaicIds = [...new Set(resolvedMosaicIds.map(mosaic => mosaic.toHex()))]; + const uniqueMosaicIds = [ + ...new Set(resolvedMosaicIds.map(mosaic => mosaic.toHex())) + ]; let mosaicInfos = []; let mosaicNames = []; @@ -745,7 +829,7 @@ class helper { mosaicNames, unresolvedMosaicsMap }; - } + }; } export default helper; diff --git a/src/infrastructure/AccountService.js b/src/infrastructure/AccountService.js index 4fa845ea3..860a64041 100644 --- a/src/infrastructure/AccountService.js +++ b/src/infrastructure/AccountService.js @@ -48,14 +48,15 @@ class AccountService { * @returns {object} Formatted AccountInfo */ static getAccount = async address => { - const account = await http.createRepositoryFactory.createAccountRepository() + const account = await http.createRepositoryFactory + .createAccountRepository() .getAccountInfo(Address.createFromRawAddress(address)) .toPromise(); const formattedAccount = this.formatAccountInfo(account); return formattedAccount; - } + }; /** * Gets an AccountInfo for an account. @@ -63,12 +64,13 @@ class AccountService { * @returns {array} Formatted AccountInfos. */ static getAccounts = async addresses => { - const accounts = await http.createRepositoryFactory.createAccountRepository() + const accounts = await http.createRepositoryFactory + .createAccountRepository() .getAccountsInfo(addresses.map(a => Address.createFromRawAddress(a))) .toPromise(); return accounts.map(a => this.formatAccountInfo(a)); - } + }; /** * Gets a accounts list from searchCriteria. @@ -76,7 +78,8 @@ class AccountService { * @returns {object} formatted account data with pagination info. */ static searchAccounts = async accountSearchCriteria => { - const searchAccounts = await http.createRepositoryFactory.createAccountRepository() + const searchAccounts = await http.createRepositoryFactory + .createAccountRepository() .search(accountSearchCriteria) .toPromise(); @@ -84,7 +87,7 @@ class AccountService { ...searchAccounts, data: searchAccounts.data.map(account => this.formatAccountInfo(account)) }; - } + }; /** * Get custom Account list dataset into Vue Component @@ -110,7 +113,8 @@ class AccountService { const accountInfos = await this.searchAccounts(searchCriteria); - const addresses = accountInfos.data.map(accountInfo => Address.createFromRawAddress(accountInfo.address)); + const addresses = accountInfos.data.map(accountInfo => + Address.createFromRawAddress(accountInfo.address)); const accountNames = await NamespaceService.getAccountsNames(addresses); @@ -121,14 +125,16 @@ class AccountService { totalRecords: numAccounts, data: accountInfos.data.map(account => ({ ...account, - balance: helper.getNetworkCurrencyBalance(account.mosaics) !== Constants.Message.UNAVAILABLE - ? helper.getNetworkCurrencyBalance(account.mosaics) - : helper.toNetworkCurrency(0), + balance: + helper.getNetworkCurrencyBalance(account.mosaics) !== + Constants.Message.UNAVAILABLE + ? helper.getNetworkCurrencyBalance(account.mosaics) + : helper.toNetworkCurrency(0), accountAliasNames: this.extractAccountNamespace(account, accountNames), accountLabel: http.accountLabels[account.address] })) }; - } + }; /** * Get custom Account info dataset into Vue Component. @@ -136,21 +142,28 @@ class AccountService { * @returns {object} Custom AccountInfo. */ static getAccountInfo = async address => { - const [ { supplementalPublicKeys, ...accountInfo }, accountNames, { latestFinalizedBlock } ] = await Promise.all([ + const [ + { supplementalPublicKeys, ...accountInfo }, + accountNames, + { latestFinalizedBlock } + ] = await Promise.all([ this.getAccount(address), - NamespaceService.getAccountsNames([Address.createFromRawAddress(address)]), + NamespaceService.getAccountsNames([ + Address.createFromRawAddress(address) + ]), ChainService.getChainInfo() ]); const getVotingEpochStatus = (startEpoch, endEpoch) => { let votingStatus = ''; - if (latestFinalizedBlock.finalizationEpoch >= startEpoch && latestFinalizedBlock.finalizationEpoch <= endEpoch) + if ( + latestFinalizedBlock.finalizationEpoch >= startEpoch && + latestFinalizedBlock.finalizationEpoch <= endEpoch + ) votingStatus = Constants.EpochStatus.CURRENT; - else if (latestFinalizedBlock.finalizationEpoch < startEpoch) votingStatus = Constants.EpochStatus.FUTURE; - else if (latestFinalizedBlock.finalizationEpoch > endEpoch) votingStatus = Constants.EpochStatus.EXPIRED; @@ -167,39 +180,54 @@ class AccountService { })), supplementalPublicKeys: { ...supplementalPublicKeys, - linkedAddress: supplementalPublicKeys.linked === Constants.Message.UNAVAILABLE - ? supplementalPublicKeys.linked - : helper.publicKeyToAddress(supplementalPublicKeys.linked), - nodeAddress: supplementalPublicKeys.node === Constants.Message.UNAVAILABLE - ? supplementalPublicKeys.node - : helper.publicKeyToAddress(supplementalPublicKeys.node), - vrfAddress: supplementalPublicKeys.vrf === Constants.Message.UNAVAILABLE - ? supplementalPublicKeys.vrf - : helper.publicKeyToAddress(supplementalPublicKeys.vrf) + linkedAddress: + supplementalPublicKeys.linked === Constants.Message.UNAVAILABLE + ? supplementalPublicKeys.linked + : helper.publicKeyToAddress(supplementalPublicKeys.linked), + nodeAddress: + supplementalPublicKeys.node === Constants.Message.UNAVAILABLE + ? supplementalPublicKeys.node + : helper.publicKeyToAddress(supplementalPublicKeys.node), + vrfAddress: + supplementalPublicKeys.vrf === Constants.Message.UNAVAILABLE + ? supplementalPublicKeys.vrf + : helper.publicKeyToAddress(supplementalPublicKeys.vrf) }, votingList: - 0 < supplementalPublicKeys.voting.length ? supplementalPublicKeys.voting.map(voting => ({ - ...voting, - epochInfo: { - epochStart: voting.startEpoch, - epochEnd: voting.endEpoch, - epochStatus: getVotingEpochStatus(voting.startEpoch, voting.endEpoch) - }, - publicKey: voting.publicKey - - })).sort((a, b) => { - const orderStatus = { - [Constants.EpochStatus.CURRENT]: 1, - [Constants.EpochStatus.FUTURE]: 2, - [Constants.EpochStatus.EXPIRED]: 3 - }; - - return orderStatus[a.epochInfo.epochStatus] - orderStatus[b.epochInfo.epochStatus]; - }) : [], - accountAliasNames: this.extractAccountNamespace(accountInfo, accountNames), + 0 < supplementalPublicKeys.voting.length + ? supplementalPublicKeys.voting + .map(voting => ({ + ...voting, + epochInfo: { + epochStart: voting.startEpoch, + epochEnd: voting.endEpoch, + epochStatus: getVotingEpochStatus( + voting.startEpoch, + voting.endEpoch + ) + }, + publicKey: voting.publicKey + })) + .sort((a, b) => { + const orderStatus = { + [Constants.EpochStatus.CURRENT]: 1, + [Constants.EpochStatus.FUTURE]: 2, + [Constants.EpochStatus.EXPIRED]: 3 + }; + + return ( + orderStatus[a.epochInfo.epochStatus] - + orderStatus[b.epochInfo.epochStatus] + ); + }) + : [], + accountAliasNames: this.extractAccountNamespace( + accountInfo, + accountNames + ), accountLabel: http.accountLabels[accountInfo.address] }; - } + }; /** * Gets custom array of confirmed transactions dataset into Vue Component. @@ -224,31 +252,39 @@ class AccountService { const accountTransactions = { ...searchTransactions, - data: searchTransactions.data.map(transaction => TransactionService.formatTransaction(transaction)) + data: searchTransactions.data.map(transaction => + TransactionService.formatTransaction(transaction)) }; await Promise.all(accountTransactions.data.map(async transaction => { if (transaction?.recipientAddress) { - const { recipientAddress, transactionBody, transactionInfo } = transaction; + const { recipientAddress, transactionBody, transactionInfo } = + transaction; - return (transactionBody.recipient = await helper.resolvedAddress(recipientAddress, transactionInfo.height)); + return (transactionBody.recipient = await helper.resolvedAddress( + recipientAddress, + transactionInfo.height + )); } })); - if (searchCriteria.group === TransactionGroup.Partial || searchCriteria.group === TransactionGroup.Unconfirmed) { + if ( + searchCriteria.group === TransactionGroup.Partial || + searchCriteria.group === TransactionGroup.Unconfirmed + ) { return { - ...accountTransactions, + ...accountTransactions, data: accountTransactions.data.map(accountTransaction => ({ ...accountTransaction, transactionHash: accountTransaction.transactionInfo.hash, transactionType: accountTransaction.type, recipient: accountTransaction.transactionBody?.recipient, - extendGraphicValue: TransactionService.extendGraphicValue(accountTransaction) + extendGraphicValue: + TransactionService.extendGraphicValue(accountTransaction) })) }; } - return { ...accountTransactions, data: accountTransactions.data.map(({ deadline, ...accountTransaction }) => ({ @@ -256,19 +292,21 @@ class AccountService { timestamp: accountTransaction.transactionInfo.timestamp, blockHeight: accountTransaction.transactionInfo.height, transactionHash: accountTransaction.transactionInfo.hash, - transactionType: accountTransaction.type === TransactionType.TRANSFER - ? (accountTransaction.signer === address - ? 'outgoing_' + accountTransaction.transactionBody.transactionType - : 'incoming_' + accountTransaction.transactionBody.transactionType - ) - : accountTransaction.transactionBody.transactionType, - extendGraphicValue: TransactionService.extendGraphicValue(accountTransaction), - recipient: accountTransaction.signer === address - ? accountTransaction.transactionBody?.recipient - : '' + transactionType: + accountTransaction.type === TransactionType.TRANSFER + ? accountTransaction.signer === address + ? 'outgoing_' + accountTransaction.transactionBody.transactionType + : 'incoming_' + accountTransaction.transactionBody.transactionType + : accountTransaction.transactionBody.transactionType, + extendGraphicValue: + TransactionService.extendGraphicValue(accountTransaction), + recipient: + accountTransaction.signer === address + ? accountTransaction.transactionBody?.recipient + : '' })) }; - } + }; /** * Gets custom array of confirmed transactions dataset into Vue Component. @@ -294,7 +332,10 @@ class AccountService { return { ...accountNamespaces, data: accountNamespaces.data.map(namespaces => { - const { expiredInSecond } = helper.calculateNamespaceExpiration(currentHeight, namespaces.endHeight); + const { expiredInSecond } = helper.calculateNamespaceExpiration( + currentHeight, + namespaces.endHeight + ); return { ...namespaces, @@ -305,7 +346,7 @@ class AccountService { }; }) }; - } + }; /** * Gets account harvested block receipt list dataset into Vue Component. @@ -327,15 +368,16 @@ class AccountService { const harvestedBlockReceipt = await ReceiptService.searchReceipts(searchCriteria); - const formattedReceipt = await ReceiptService.createReceiptTransactionStatement(harvestedBlockReceipt.data.balanceChangeStatement); + const formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(harvestedBlockReceipt.data.balanceChangeStatement); return { ...harvestedBlockReceipt, data: formattedReceipt.filter(receipt => receipt.targetAddress === address && - receipt.type === ReceiptType.Harvest_Fee) + receipt.type === ReceiptType.Harvest_Fee) }; - } + }; /** * Gets account receipt list dataset into Vue Component. @@ -347,7 +389,8 @@ class AccountService { static getAccountReceiptList = async (pageInfo, filterValue, address) => { const { pageNumber, pageSize } = pageInfo; - const { BalanceTransferReceipt, BalanceChangeReceipt } = Constants.ReceiptTransactionStatementType; + const { BalanceTransferReceipt, BalanceChangeReceipt } = + Constants.ReceiptTransactionStatementType; let searchCriteria = { pageNumber, @@ -357,34 +400,43 @@ class AccountService { ...filterValue }; - if (filterValue.receiptTransactionStatementType === BalanceTransferReceipt) - Object.assign(searchCriteria, { senderAddress: Address.createFromRawAddress(address) }); + if ( + filterValue.receiptTransactionStatementType === BalanceTransferReceipt + ) { + Object.assign(searchCriteria, { + senderAddress: Address.createFromRawAddress(address) + }); + } - if (filterValue.receiptTransactionStatementType === BalanceChangeReceipt) - Object.assign(searchCriteria, { targetAddress: Address.createFromRawAddress(address) }); + if (filterValue.receiptTransactionStatementType === BalanceChangeReceipt) { + Object.assign(searchCriteria, { + targetAddress: Address.createFromRawAddress(address) + }); + } const receipt = await ReceiptService.searchReceipts(searchCriteria); let formattedReceipt = []; - if (filterValue.receiptTransactionStatementType === BalanceTransferReceipt) { + if ( + filterValue.receiptTransactionStatementType === BalanceTransferReceipt + ) { formattedReceipt = await ReceiptService.createReceiptTransactionStatement(receipt.data.balanceTransferStatement); - formattedReceipt = formattedReceipt.filter(receipt => - receipt.senderAddress === address); + formattedReceipt = formattedReceipt.filter(receipt => receipt.senderAddress === address); } if (filterValue.receiptTransactionStatementType === BalanceChangeReceipt) { formattedReceipt = await ReceiptService.createReceiptTransactionStatement(receipt.data.balanceChangeStatement); formattedReceipt = formattedReceipt.filter(receipt => receipt.targetAddress === address && - receipt.type !== ReceiptType.Harvest_Fee); + receipt.type !== ReceiptType.Harvest_Fee); } return { ...receipt, data: formattedReceipt }; - } + }; /** * Gets Account Metadata list dataset into Vue component @@ -405,7 +457,7 @@ class AccountService { const accountMetadatas = await MetadataService.searchMetadatas(searchCriteria); return accountMetadatas; - } + }; /** * Gets Account Hash Lock list dataset into Vue component @@ -439,7 +491,7 @@ class AccountService { ...accountHashLocks, data: hashLocks }; - } + }; /** * Gets Account Secret Lock list dataset into Vue component. @@ -461,19 +513,24 @@ class AccountService { const mosaics = accountSecretLocks.data.map(secretlock => new Mosaic(secretlock.mosaicId, secretlock.amount)); - const { mosaicInfos, mosaicNames, unresolvedMosaicsMap } = await helper.getMosaicInfoAndNamespace(mosaics); + const { mosaicInfos, mosaicNames, unresolvedMosaicsMap } = + await helper.getMosaicInfoAndNamespace(mosaics); let secretLocks = []; for (const secretLock of accountSecretLocks.data) { secretLocks.push({ ...secretLock, - mosaics: helper.mosaicsFieldObjectBuilder([ - new Mosaic( - new MosaicId(unresolvedMosaicsMap[secretLock.mosaicId.toHex()]), - secretLock.amount - ) - ], mosaicInfos, mosaicNames) + mosaics: helper.mosaicsFieldObjectBuilder( + [ + new Mosaic( + new MosaicId(unresolvedMosaicsMap[secretLock.mosaicId.toHex()]), + secretLock.amount + ) + ], + mosaicInfos, + mosaicNames + ) }); } @@ -481,7 +538,7 @@ class AccountService { ...accountSecretLocks, data: secretLocks }; - } + }; /** * Format AccountInfo to readable accountInfo object. @@ -492,13 +549,16 @@ class AccountService { ...accountInfo, address: accountInfo.address.address, addressHeight: accountInfo.addressHeight.compact(), - publicKey: 0 < accountInfo.publicKeyHeight.compact() ? accountInfo.publicKey : Constants.Message.UNKNOWN, + publicKey: + 0 < accountInfo.publicKeyHeight.compact() + ? accountInfo.publicKey + : Constants.Message.UNKNOWN, publicKeyHeight: accountInfo.publicKeyHeight.compact(), accountType: Constants.AccountType[accountInfo.accountType], supplementalPublicKeys: this.formatSupplementalPublicKeys(accountInfo.supplementalPublicKeys), importance: helper.ImportanceScoreToPercent(accountInfo.importance.compact()), importanceHeight: accountInfo.importanceHeight.compact() - }) + }); /** * Format SupplementalPublicKeys to readable SupplementalPublicKeys object. @@ -507,11 +567,13 @@ class AccountService { */ static formatSupplementalPublicKeys = supplementalPublicKeys => ({ ...supplementalPublicKeys, - linked: supplementalPublicKeys.linked?.publicKey || Constants.Message.UNAVAILABLE, - node: supplementalPublicKeys.node?.publicKey || Constants.Message.UNAVAILABLE, + linked: + supplementalPublicKeys.linked?.publicKey || Constants.Message.UNAVAILABLE, + node: + supplementalPublicKeys.node?.publicKey || Constants.Message.UNAVAILABLE, vrf: supplementalPublicKeys.vrf?.publicKey || Constants.Message.UNAVAILABLE, voting: supplementalPublicKeys.voting || [] - }) + }); /** * Extract Name for Account. @@ -525,7 +587,7 @@ class AccountService { const aliasNames = accountName.names.map(names => names.name); return 0 < aliasNames.length ? aliasNames : [Constants.Message.UNAVAILABLE]; - } + }; /** * Get customize MosaicAmountView dataset for Vue component. @@ -544,16 +606,16 @@ class AccountService { if (0 === mosaic.duration) nonExpiredMosaics.push(mosaic); - if (chainInfo.height < (mosaic.startHeight + mosaic.duration)) + if (chainInfo.height < mosaic.startHeight + mosaic.duration) nonExpiredMosaics.push(mosaic); } return helper.sortMosaics(nonExpiredMosaics); - } + }; static checkNis1Account = async address => { return nem.model.address.isValid(address); - } + }; } export default AccountService; diff --git a/src/infrastructure/AnnouncerService.js b/src/infrastructure/AnnouncerService.js index 88856026b..0d852a41f 100644 --- a/src/infrastructure/AnnouncerService.js +++ b/src/infrastructure/AnnouncerService.js @@ -35,109 +35,134 @@ import { } from 'symbol-sdk'; class AnnounceService { - static announceHashLock = (signedHashLockTransaction, signedTransaction) => { - return new Promise((resolve, reject) => { - const { nodeUrl } = http; - const repositoryFactory = new RepositoryFactoryHttp(nodeUrl); - // const listener = repositoryFactory.createListener() - const receiptHttp = repositoryFactory.createReceiptRepository(); - const transactionHttp = repositoryFactory.createTransactionRepository(); - const customWsEndpoint = `${localStorage.getItem('currentNode') |> helper.httpToWsUrl}/ws`; - const listener = new Listener(customWsEndpoint, transactionHttp, WebSocket); - const transactionService = new TransactionService(transactionHttp, receiptHttp); - - listener.open() - .then(() => { - transactionService - .announceHashLockAggregateBonded(signedHashLockTransaction, signedTransaction, listener) - .subscribe( - x => { - listener.close(); - resolve(x); - }, - err => { - console.error('AnnounceService', err); - listener.close(); - reject(err); - } - ); - }); - }); - } - - static getSignedHashLosck = (signedTransaction, account) => { - const networkCurrencyMosaicId = new MosaicId(http.networkCurrency.mosaicId); - - const hashLockTransaction = HashLockTransaction.create( - Deadline.create(), - new Mosaic( - networkCurrencyMosaicId, - UInt64.fromUint(10 * Math.pow(10, http.networkCurrency.divisibility)) - ), - UInt64.fromUint(480), - signedTransaction, - http.networkType, - UInt64.fromUint(2000000) - ); - - const signedHashLockTransaction = account.sign(hashLockTransaction, http.generationHash); - - return signedHashLockTransaction; - } - - static multisigAccountModification = async ({ - accountPrivateKey, - minApprovalDelta = 1, - minRemovalDelta = 1, - additions = [], - deletions = [] - }) => { - // const transactionRepository = await http.createRepositoryFactory.createTransactionRepository(); - const { networkType } = http; - const networkGenerationHash = http.generationHash; - const account = Account.createFromPrivateKey(accountPrivateKey, networkType); - - ; - - const addressAdditions = additions.map(addition => { - if ('string' === typeof addition && 64 === addition.length) - return PublicAccount.createFromPublicKey(addition, networkType).address; - if ('string' === typeof addition && 39 === addition.length) - return Address.createFromRawAddress(addition); - return addition; - }); - - const addressDeletions = deletions.map(delition => { - if ('string' === typeof delition && 64 === delition.length) - return PublicAccount.createFromPublicKey(delition, networkType).address; - if ('string' === typeof delition && 39 === delition.length) - return Address.createFromRawAddress(delition); - return delition; - }); - - const multisigAccountModificationTransaction = MultisigAccountModificationTransaction.create( - Deadline.create(), - minApprovalDelta, - minRemovalDelta, - addressAdditions, - addressDeletions, - networkType - ); - - const aggregateTransaction = AggregateTransaction.createBonded( - Deadline.create(), - [multisigAccountModificationTransaction.toAggregate(account.publicAccount)], - networkType, - [], - UInt64.fromUint(2000000) - ); - - const signedTransaction = account.sign(aggregateTransaction, networkGenerationHash); - - const signedHashLockTransaction = this.getSignedHashLosck(signedTransaction, account); - - this.announceHashLock(signedHashLockTransaction, signedTransaction); - } + static announceHashLock = (signedHashLockTransaction, signedTransaction) => { + return new Promise((resolve, reject) => { + const { nodeUrl } = http; + const repositoryFactory = new RepositoryFactoryHttp(nodeUrl); + // const listener = repositoryFactory.createListener() + const receiptHttp = repositoryFactory.createReceiptRepository(); + const transactionHttp = repositoryFactory.createTransactionRepository(); + const customWsEndpoint = `${ + localStorage.getItem('currentNode') |> helper.httpToWsUrl + }/ws`; + const listener = new Listener( + customWsEndpoint, + transactionHttp, + WebSocket + ); + const transactionService = new TransactionService( + transactionHttp, + receiptHttp + ); + + listener.open().then(() => { + transactionService + .announceHashLockAggregateBonded( + signedHashLockTransaction, + signedTransaction, + listener + ) + .subscribe( + x => { + listener.close(); + resolve(x); + }, + err => { + console.error('AnnounceService', err); + listener.close(); + reject(err); + } + ); + }); + }); + }; + + static getSignedHashLosck = (signedTransaction, account) => { + const networkCurrencyMosaicId = new MosaicId(http.networkCurrency.mosaicId); + + const hashLockTransaction = HashLockTransaction.create( + Deadline.create(), + new Mosaic( + networkCurrencyMosaicId, + UInt64.fromUint(10 * Math.pow(10, http.networkCurrency.divisibility)) + ), + UInt64.fromUint(480), + signedTransaction, + http.networkType, + UInt64.fromUint(2000000) + ); + + const signedHashLockTransaction = account.sign( + hashLockTransaction, + http.generationHash + ); + + return signedHashLockTransaction; + }; + + static multisigAccountModification = async ({ + accountPrivateKey, + minApprovalDelta = 1, + minRemovalDelta = 1, + additions = [], + deletions = [] + }) => { + // const transactionRepository = await http.createRepositoryFactory.createTransactionRepository(); + const { networkType } = http; + const networkGenerationHash = http.generationHash; + const account = Account.createFromPrivateKey( + accountPrivateKey, + networkType + ); + + const addressAdditions = additions.map(addition => { + if ('string' === typeof addition && 64 === addition.length) + return PublicAccount.createFromPublicKey(addition, networkType).address; + if ('string' === typeof addition && 39 === addition.length) + return Address.createFromRawAddress(addition); + return addition; + }); + + const addressDeletions = deletions.map(delition => { + if ('string' === typeof delition && 64 === delition.length) + return PublicAccount.createFromPublicKey(delition, networkType).address; + if ('string' === typeof delition && 39 === delition.length) + return Address.createFromRawAddress(delition); + return delition; + }); + + const multisigAccountModificationTransaction = + MultisigAccountModificationTransaction.create( + Deadline.create(), + minApprovalDelta, + minRemovalDelta, + addressAdditions, + addressDeletions, + networkType + ); + + const aggregateTransaction = AggregateTransaction.createBonded( + Deadline.create(), + [ + multisigAccountModificationTransaction.toAggregate(account.publicAccount) + ], + networkType, + [], + UInt64.fromUint(2000000) + ); + + const signedTransaction = account.sign( + aggregateTransaction, + networkGenerationHash + ); + + const signedHashLockTransaction = this.getSignedHashLosck( + signedTransaction, + account + ); + + this.announceHashLock(signedHashLockTransaction, signedTransaction); + }; } export default AnnounceService; diff --git a/src/infrastructure/BlockService.js b/src/infrastructure/BlockService.js index 0c1150d70..61bc5eb30 100644 --- a/src/infrastructure/BlockService.js +++ b/src/infrastructure/BlockService.js @@ -19,338 +19,372 @@ import http from './http'; import { Constants } from '../config'; import helper from '../helper'; -import { TransactionService, ReceiptService, AccountService, NodeService } from '../infrastructure'; +import { + TransactionService, + ReceiptService, + AccountService, + NodeService +} from '../infrastructure'; import { sha3_256 as sha3256 } from 'js-sha3'; import { MerkleTree } from 'merkletreejs'; import { take, toArray } from 'rxjs/operators'; -import { UInt64, TransactionGroup, Order, BlockOrderBy, BlockType, ReceiptType } from 'symbol-sdk'; +import { + UInt64, + TransactionGroup, + Order, + BlockOrderBy, + BlockType, + ReceiptType +} from 'symbol-sdk'; class BlockService { - /** - * Gets a BlockInfo for a given block height. - * @param {number} height block height. - * @returns {object} Formatted BlockDTO. - */ - static getBlockByHeight = async height => { - const blockInfo = await http.createRepositoryFactory.createBlockRepository() - .getBlockByHeight(UInt64.fromUint(height)) - .toPromise(); - - return this.formatBlock(blockInfo); - } - - /** - * Gets a blocks from searchCriteria. - * @param {object} blockSearchCriteria Block Search Criteria. - * @returns {object} formatted block data with pagination info. - */ - static searchBlocks = async blockSearchCriteria => { - const searchBlocks = await http.createRepositoryFactory.createBlockRepository() - .search(blockSearchCriteria) - .toPromise(); - - return { - ...searchBlocks, - data: searchBlocks.data.map(block => this.formatBlock(block)) - }; - } - - /** - * Gets a blocks from streamer. - * @param {object} searchCriteria - Object Search Criteria. - * @param {number} noOfBlock - Number of blocks returned. - * @returns {array} formatted BlockInfos. - */ - static streamerBlocks = async (searchCriteria, noOfBlock) => { - const streamerBlocks = await http.blockPaginationStreamer - .search(searchCriteria).pipe(take(noOfBlock), toArray()) - .toPromise(); - - return streamerBlocks.map(block => this.formatBlock(block)); - } - - /** - * Gets a merkle path for merkle proof. - * @param {number} height - block height. - * @param {string} hash Transaction hash. - * @returns {array} MerkleProofInfos - */ - static getMerkleTransaction = async (height, hash) => { - const merklePath = await http.createRepositoryFactory.createBlockRepository() - .getMerkleTransaction(UInt64.fromUint(height), hash) - .toPromise(); - - return merklePath.merklePath || []; - } - - /** - * Gets transactions a merkle tree. - * @param {number} height - block height. - * @returns {object} merkleTree object. - */ - static getMerkleTransactionTree = async height => { - const searchCriteria = { - group: TransactionGroup.Confirmed, - height: UInt64.fromUint(height), - pageSize: 100, - order: Order.Desc - }; - - const streamerTransactions = await TransactionService.streamerTransactions(searchCriteria); - const transactions = streamerTransactions.map(transaction => TransactionService.formatTransaction(transaction)); - - const leaves = transactions.sort((n1, n2) => n1.transactionInfo.index - n2.transactionInfo.index) - .map(transaction => transaction.transactionInfo.hash); - - const tree = new MerkleTree(leaves, sha3256, { - duplicateOdd: true, - hashLeaves: false, - sort: false, - sortLeaves: false, - sortPairs: false, - isBitcoinTree: false }); - - return tree.getLayersAsObject(); - } - - /** - * Get formatted BlockInfo[] dataset into Vue Component. - * @param {object} pageInfo - pageNumber and pageSize. - * @returns {object} Block info list. - */ - static getBlockList = async pageInfo => { - const { pageNumber, pageSize } = pageInfo; - const blockSearchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - orderBy: BlockOrderBy.Height - }; - - const blocks = await this.searchBlocks(blockSearchCriteria); - - const signerAddress = blocks.data.map(block => block.signer); - - // Get Inflation rate - const receiptSearchCriteria = { - pageSize: blocks.data.length, - order: Order.Desc, - fromHeight: UInt64.fromUint(blocks.data[blocks.data.length - 1].height), - toHeight: UInt64.fromUint(blocks.data[0].height), - receiptTypes: [ReceiptType.Inflation] - }; - - const [accountInfos, { numBlocks }, balanceTransferReceipt] = await Promise.all([ - AccountService.getAccounts(signerAddress), - NodeService.getStorageInfo(), - ReceiptService.searchReceipts(receiptSearchCriteria) - ]); - - return { - ...blocks, - totalRecords: numBlocks, - data: blocks.data.map(block => { - const { supplementalPublicKeys } = accountInfos.find(account => account.address === block.signer); - const inflationRate = balanceTransferReceipt.data.inflationStatement.data - .find(inflation => Number(inflation.height.toString()) === block.height); - const blockReward = Number(inflationRate?.amount.toString()) || 0; - - return { - ...block, - age: helper.convertTimestampToDate(block.timestamp), - blockReward: helper.toNetworkCurrency(blockReward), - harvester: { - signer: block.signer, - linkedAddress: supplementalPublicKeys.linked === Constants.Message.UNAVAILABLE - ? block.signer - : helper.publicKeyToAddress(supplementalPublicKeys.linked) - } - }; - }) - }; - } - - /** - * Get Custom Transactions dataset into Vue Component - * @param {object} pageInfo - page info such as pageNumber, pageSize - * @param {object} filterValue - search criteria - * @param {number} height - block height - * @returns {object} Custom Transactions dataset - */ - static getBlockTransactionList = async (pageInfo, filterValue, height) => { - const { pageNumber, pageSize } = pageInfo; - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - type: [], - group: TransactionGroup.Confirmed, - height: UInt64.fromUint(height), - ...filterValue - }; - - const [blockInfo, searchTransactions] = await Promise.all([ - BlockService.getBlockInfo(height), - TransactionService.searchTransactions(searchCriteria) - ]); - - const blockTransactions = { - ...searchTransactions, - data: searchTransactions.data.map(transaction => TransactionService.formatTransaction(transaction)) - }; - - return { - ...blockTransactions, - data: blockTransactions.data.map(blockTransaction => ({ - ...blockTransaction, - timestamp: blockInfo.timestamp, - transactionHash: blockTransaction.transactionInfo.hash, - transactionType: blockTransaction.type - })) - }; - } - - /** - * Gets formatted Receipt and Resolution statements. - * @param {number} height - block height. - * @returns {object} Receipt and Resolution info object. - */ - static getBlockReceiptsInfo = async height => { - const searchCriteria = { - order: Order.Desc, - height: UInt64.fromUint(height) - }; - - const [address, mosaic] = await Promise.all([ - ReceiptService.streamerAddressResolution(searchCriteria), - ReceiptService.streamerMosaicResolution(searchCriteria) - ]); - - return { - resolutionStatements: [...address, ...mosaic] - }; - } - - /** - * Get formatted BlockInfo dataset into Vue Component. - * @param {number} height - block height. - * @returns {object} block info object. - */ - static getBlockInfo = async height => { - const block = await this.getBlockByHeight(height); - - const { supplementalPublicKeys } = await AccountService.getAccount(block.signer); - - // Get merkle info - let { stateHash, stateHashSubCacheMerkleRoots, blockReceiptsHash, blockTransactionsHash } = block; - - // Append merkle root name into hash - stateHashSubCacheMerkleRoots = stateHashSubCacheMerkleRoots.map((root, index) => { - return `${Constants.MerkleRootsOrder[index]} - ${root}`; - }); - - let importanceBlockInfo = {}; - - if (block.type === BlockType.ImportanceBlock) { - Object.assign(importanceBlockInfo, { - totalVotingBalance: helper.toNetworkCurrency(block.totalVotingBalance), - harvestingEligibleAccountsCount: Number(block.harvestingEligibleAccountsCount) - }); - } - - return { - ...block, - ...importanceBlockInfo, - symbolTime: block.timestamp, - payloadSize: block.size, - blockHash: block.hash, - harvester: { - signer: block.signer, - linkedAddress: supplementalPublicKeys.linked === Constants.Message.UNAVAILABLE - ? block.signer - : helper.publicKeyToAddress(supplementalPublicKeys.linked) - }, - merkleInfo: { - stateHash, - stateHashSubCacheMerkleRoots, - blockReceiptsHash, - blockTransactionsHash - } - }; - } - - /** - * Gets block receipt list into Vue Component. - * @param {object} pageInfo - page info such as pageNumber, pageSize. - * @param {object} filterValue - search criteria. - * @param {number} height - block height. - * @returns {object} formatted receipt data list - */ - static getBlockReceiptList = async (pageInfo, filterValue, height) => { - const { pageNumber, pageSize } = pageInfo; - - const { - BalanceTransferReceipt, - BalanceChangeReceipt, - InflationReceipt, - ArtifactExpiryReceipt - } = Constants.ReceiptTransactionStatementType; - - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - height: UInt64.fromUint(height), - ...filterValue - }; - - const receipt = await ReceiptService.searchReceipts(searchCriteria); - - let formattedReceipt = []; - - switch (filterValue.receiptTransactionStatementType) { - case BalanceTransferReceipt: - formattedReceipt = await ReceiptService.createReceiptTransactionStatement(receipt.data.balanceTransferStatement); - break; - case BalanceChangeReceipt: - formattedReceipt = await ReceiptService.createReceiptTransactionStatement(receipt.data.balanceChangeStatement); - break; - case InflationReceipt: - formattedReceipt = await ReceiptService.createReceiptTransactionStatement(receipt.data.inflationStatement); - break; - case ArtifactExpiryReceipt: - formattedReceipt = await ReceiptService.createReceiptTransactionStatement(receipt.data.artifactExpiryStatement); - break; - default: - break; - } - - return { - ...receipt, - data: formattedReceipt - }; - } - - /** - * Format Block to readable Block object. - * @param {object} block BlockDTO. - * @returns {object} readable BlockDTO object. - */ - static formatBlock = block => ({ - ...block, - blockType: Constants.BlockType[block.type], - height: block.height.compact(), - timestampRaw: Number(block.timestamp.toString()), - timestamp: helper.networkTimestamp(Number(block.timestamp.toString())), - totalFee: helper.toNetworkCurrency(block.totalFee), - difficulty: helper.convertBlockDifficultyToReadable(block.difficulty), - feeMultiplier: block.feeMultiplier.toString(), - totalTransactions: block.totalTransactionsCount, - statements: block.statementsCount, - transactions: block.transactionsCount, - signer: helper.publicKeyToAddress(block.signer.publicKey), - beneficiaryAddress: block?.beneficiaryAddress.plain() || Constants.Message.UNAVAILABLE - }) + /** + * Gets a BlockInfo for a given block height. + * @param {number} height block height. + * @returns {object} Formatted BlockDTO. + */ + static getBlockByHeight = async height => { + const blockInfo = await http.createRepositoryFactory + .createBlockRepository() + .getBlockByHeight(UInt64.fromUint(height)) + .toPromise(); + + return this.formatBlock(blockInfo); + }; + + /** + * Gets a blocks from searchCriteria. + * @param {object} blockSearchCriteria Block Search Criteria. + * @returns {object} formatted block data with pagination info. + */ + static searchBlocks = async blockSearchCriteria => { + const searchBlocks = await http.createRepositoryFactory + .createBlockRepository() + .search(blockSearchCriteria) + .toPromise(); + + return { + ...searchBlocks, + data: searchBlocks.data.map(block => this.formatBlock(block)) + }; + }; + + /** + * Gets a blocks from streamer. + * @param {object} searchCriteria - Object Search Criteria. + * @param {number} noOfBlock - Number of blocks returned. + * @returns {array} formatted BlockInfos. + */ + static streamerBlocks = async (searchCriteria, noOfBlock) => { + const streamerBlocks = await http.blockPaginationStreamer + .search(searchCriteria) + .pipe(take(noOfBlock), toArray()) + .toPromise(); + + return streamerBlocks.map(block => this.formatBlock(block)); + }; + + /** + * Gets a merkle path for merkle proof. + * @param {number} height - block height. + * @param {string} hash Transaction hash. + * @returns {array} MerkleProofInfos + */ + static getMerkleTransaction = async (height, hash) => { + const merklePath = await http.createRepositoryFactory + .createBlockRepository() + .getMerkleTransaction(UInt64.fromUint(height), hash) + .toPromise(); + + return merklePath.merklePath || []; + }; + + /** + * Gets transactions a merkle tree. + * @param {number} height - block height. + * @returns {object} merkleTree object. + */ + static getMerkleTransactionTree = async height => { + const searchCriteria = { + group: TransactionGroup.Confirmed, + height: UInt64.fromUint(height), + pageSize: 100, + order: Order.Desc + }; + + const streamerTransactions = await TransactionService.streamerTransactions(searchCriteria); + const transactions = streamerTransactions.map(transaction => + TransactionService.formatTransaction(transaction)); + + const leaves = transactions + .sort((n1, n2) => n1.transactionInfo.index - n2.transactionInfo.index) + .map(transaction => transaction.transactionInfo.hash); + + const tree = new MerkleTree(leaves, sha3256, { + duplicateOdd: true, + hashLeaves: false, + sort: false, + sortLeaves: false, + sortPairs: false, + isBitcoinTree: false + }); + + return tree.getLayersAsObject(); + }; + + /** + * Get formatted BlockInfo[] dataset into Vue Component. + * @param {object} pageInfo - pageNumber and pageSize. + * @returns {object} Block info list. + */ + static getBlockList = async pageInfo => { + const { pageNumber, pageSize } = pageInfo; + const blockSearchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + orderBy: BlockOrderBy.Height + }; + + const blocks = await this.searchBlocks(blockSearchCriteria); + + const signerAddress = blocks.data.map(block => block.signer); + + // Get Inflation rate + const receiptSearchCriteria = { + pageSize: blocks.data.length, + order: Order.Desc, + fromHeight: UInt64.fromUint(blocks.data[blocks.data.length - 1].height), + toHeight: UInt64.fromUint(blocks.data[0].height), + receiptTypes: [ReceiptType.Inflation] + }; + + const [accountInfos, { numBlocks }, balanceTransferReceipt] = + await Promise.all([ + AccountService.getAccounts(signerAddress), + NodeService.getStorageInfo(), + ReceiptService.searchReceipts(receiptSearchCriteria) + ]); + + return { + ...blocks, + totalRecords: numBlocks, + data: blocks.data.map(block => { + const { supplementalPublicKeys } = accountInfos.find(account => account.address === block.signer); + const inflationRate = + balanceTransferReceipt.data.inflationStatement.data.find(inflation => + Number(inflation.height.toString()) === block.height); + const blockReward = Number(inflationRate?.amount.toString()) || 0; + + return { + ...block, + age: helper.convertTimestampToDate(block.timestamp), + blockReward: helper.toNetworkCurrency(blockReward), + harvester: { + signer: block.signer, + linkedAddress: + supplementalPublicKeys.linked === Constants.Message.UNAVAILABLE + ? block.signer + : helper.publicKeyToAddress(supplementalPublicKeys.linked) + } + }; + }) + }; + }; + + /** + * Get Custom Transactions dataset into Vue Component + * @param {object} pageInfo - page info such as pageNumber, pageSize + * @param {object} filterValue - search criteria + * @param {number} height - block height + * @returns {object} Custom Transactions dataset + */ + static getBlockTransactionList = async (pageInfo, filterValue, height) => { + const { pageNumber, pageSize } = pageInfo; + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + type: [], + group: TransactionGroup.Confirmed, + height: UInt64.fromUint(height), + ...filterValue + }; + + const [blockInfo, searchTransactions] = await Promise.all([ + BlockService.getBlockInfo(height), + TransactionService.searchTransactions(searchCriteria) + ]); + + const blockTransactions = { + ...searchTransactions, + data: searchTransactions.data.map(transaction => + TransactionService.formatTransaction(transaction)) + }; + + return { + ...blockTransactions, + data: blockTransactions.data.map(blockTransaction => ({ + ...blockTransaction, + timestamp: blockInfo.timestamp, + transactionHash: blockTransaction.transactionInfo.hash, + transactionType: blockTransaction.type + })) + }; + }; + + /** + * Gets formatted Receipt and Resolution statements. + * @param {number} height - block height. + * @returns {object} Receipt and Resolution info object. + */ + static getBlockReceiptsInfo = async height => { + const searchCriteria = { + order: Order.Desc, + height: UInt64.fromUint(height) + }; + + const [address, mosaic] = await Promise.all([ + ReceiptService.streamerAddressResolution(searchCriteria), + ReceiptService.streamerMosaicResolution(searchCriteria) + ]); + + return { + resolutionStatements: [...address, ...mosaic] + }; + }; + + /** + * Get formatted BlockInfo dataset into Vue Component. + * @param {number} height - block height. + * @returns {object} block info object. + */ + static getBlockInfo = async height => { + const block = await this.getBlockByHeight(height); + + const { supplementalPublicKeys } = await AccountService.getAccount(block.signer); + + // Get merkle info + let { + stateHash, + stateHashSubCacheMerkleRoots, + blockReceiptsHash, + blockTransactionsHash + } = block; + + // Append merkle root name into hash + stateHashSubCacheMerkleRoots = stateHashSubCacheMerkleRoots.map((root, index) => { + return `${Constants.MerkleRootsOrder[index]} - ${root}`; + }); + + let importanceBlockInfo = {}; + + if (block.type === BlockType.ImportanceBlock) { + Object.assign(importanceBlockInfo, { + totalVotingBalance: helper.toNetworkCurrency(block.totalVotingBalance), + harvestingEligibleAccountsCount: Number(block.harvestingEligibleAccountsCount) + }); + } + + return { + ...block, + ...importanceBlockInfo, + symbolTime: block.timestamp, + payloadSize: block.size, + blockHash: block.hash, + harvester: { + signer: block.signer, + linkedAddress: + supplementalPublicKeys.linked === Constants.Message.UNAVAILABLE + ? block.signer + : helper.publicKeyToAddress(supplementalPublicKeys.linked) + }, + merkleInfo: { + stateHash, + stateHashSubCacheMerkleRoots, + blockReceiptsHash, + blockTransactionsHash + } + }; + }; + + /** + * Gets block receipt list into Vue Component. + * @param {object} pageInfo - page info such as pageNumber, pageSize. + * @param {object} filterValue - search criteria. + * @param {number} height - block height. + * @returns {object} formatted receipt data list + */ + static getBlockReceiptList = async (pageInfo, filterValue, height) => { + const { pageNumber, pageSize } = pageInfo; + + const { + BalanceTransferReceipt, + BalanceChangeReceipt, + InflationReceipt, + ArtifactExpiryReceipt + } = Constants.ReceiptTransactionStatementType; + + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + height: UInt64.fromUint(height), + ...filterValue + }; + + const receipt = await ReceiptService.searchReceipts(searchCriteria); + + let formattedReceipt = []; + + switch (filterValue.receiptTransactionStatementType) { + case BalanceTransferReceipt: + formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(receipt.data.balanceTransferStatement); + break; + case BalanceChangeReceipt: + formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(receipt.data.balanceChangeStatement); + break; + case InflationReceipt: + formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(receipt.data.inflationStatement); + break; + case ArtifactExpiryReceipt: + formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(receipt.data.artifactExpiryStatement); + break; + default: + break; + } + + return { + ...receipt, + data: formattedReceipt + }; + }; + + /** + * Format Block to readable Block object. + * @param {object} block BlockDTO. + * @returns {object} readable BlockDTO object. + */ + static formatBlock = block => ({ + ...block, + blockType: Constants.BlockType[block.type], + height: block.height.compact(), + timestampRaw: Number(block.timestamp.toString()), + timestamp: helper.networkTimestamp(Number(block.timestamp.toString())), + totalFee: helper.toNetworkCurrency(block.totalFee), + difficulty: helper.convertBlockDifficultyToReadable(block.difficulty), + feeMultiplier: block.feeMultiplier.toString(), + totalTransactions: block.totalTransactionsCount, + statements: block.statementsCount, + transactions: block.transactionsCount, + signer: helper.publicKeyToAddress(block.signer.publicKey), + beneficiaryAddress: + block?.beneficiaryAddress.plain() || Constants.Message.UNAVAILABLE + }); } export default BlockService; diff --git a/src/infrastructure/ChainService.js b/src/infrastructure/ChainService.js index feb6d8042..183e80fad 100644 --- a/src/infrastructure/ChainService.js +++ b/src/infrastructure/ChainService.js @@ -19,24 +19,25 @@ import http from './http'; class ChainService { - /** - * Gets chain info such as current block height, finalized block and etc - * @returns {object} formatted chain info - */ - static getChainInfo = async () => { - const chainInfo = await http.createRepositoryFactory.createChainRepository() - .getChainInfo() - .toPromise(); + /** + * Gets chain info such as current block height, finalized block and etc + * @returns {object} formatted chain info + */ + static getChainInfo = async () => { + const chainInfo = await http.createRepositoryFactory + .createChainRepository() + .getChainInfo() + .toPromise(); - return { - ...chainInfo, - height: chainInfo.height.compact(), - latestFinalizedBlock: { - ...chainInfo.latestFinalizedBlock, - height: chainInfo.latestFinalizedBlock.height.compact() - } - }; - } + return { + ...chainInfo, + height: chainInfo.height.compact(), + latestFinalizedBlock: { + ...chainInfo.latestFinalizedBlock, + height: chainInfo.latestFinalizedBlock.height.compact() + } + }; + }; } export default ChainService; diff --git a/src/infrastructure/CreateTransaction.js b/src/infrastructure/CreateTransaction.js index 2245f1441..808c08f83 100644 --- a/src/infrastructure/CreateTransaction.js +++ b/src/infrastructure/CreateTransaction.js @@ -23,110 +23,137 @@ import { NamespaceService } from '../infrastructure'; import { Address, Mosaic, MosaicId, Convert } from 'symbol-sdk'; class CreateTransaction { - static transferTransaction = async (transactionObj, { mosaicInfos, mosaicNames, unresolvedMosaicsMap }) => { - const { transactionInfo } = transactionObj; - - const [resolvedAddress] = await Promise.all([ - helper.resolvedAddress(transactionObj.recipientAddress, transactionInfo.height) - ]); - - const resolvedMosaics = transactionObj.mosaics.map(mosaic => { - return new Mosaic(new MosaicId(unresolvedMosaicsMap[mosaic.id.toHex()]), mosaic.amount); - }); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - message: transactionObj.message, - recipient: resolvedAddress, - mosaics: helper.mosaicsFieldObjectBuilder(resolvedMosaics, mosaicInfos, mosaicNames) - } - }; - } - - static namespaceRegistration = async transactionObj => { - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - recipient: http.networkConfig.NamespaceRentalFeeSinkAddress.address, - registrationType: Constants.NamespaceRegistrationType[transactionObj.registrationType], - namespaceName: transactionObj.namespaceName, - namespaceId: transactionObj.namespaceId.toHex(), - parentId: 'undefined' !== typeof transactionObj.parentId ? transactionObj.parentId?.toHex() : Constants.Message.UNAVAILABLE, - duration: 'undefined' !== typeof transactionObj.duration ? transactionObj.duration?.compact() : Constants.Message.UNLIMITED - } - }; - } - - static addressAlias = async transactionObj => { - const namespaceNames = await NamespaceService.getNamespacesNames([transactionObj.namespaceId]); - const namespaceName = namespaceNames.find(namespace => namespace.namespaceId === transactionObj.namespaceId.toHex()); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - aliasAction: Constants.AliasAction[transactionObj.aliasAction], - namespaceId: transactionObj.namespaceId.toHex(), - namespaceName: namespaceName.name, - address: transactionObj.address.address - } - }; - } - - static mosaicAlias = async transactionObj => { - const namespaceNames = await NamespaceService.getNamespacesNames([transactionObj.namespaceId]); - const namespaceName = namespaceNames.find(namespace => namespace.namespaceId === transactionObj.namespaceId.toHex()); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - aliasAction: Constants.AliasAction[transactionObj.aliasAction], - namespaceId: transactionObj.namespaceId.id.toHex(), - namespaceName: namespaceName.name, - mosaicId: transactionObj.mosaicId.id.toHex() - } - }; - }; - - static mosaicDefinition = async transactionObj => { - const resolvedMosaic = await helper.resolveMosaicId(transactionObj.mosaicId); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - recipient: http.networkConfig.MosaicRentalSinkAddress.address, - mosaicId: resolvedMosaic.toHex(), - divisibility: transactionObj.divisibility, - duration: transactionObj.duration.compact(), - nonce: transactionObj.nonce.toHex(), - supplyMutable: transactionObj.flags.supplyMutable, - transferable: transactionObj.flags.transferable, - restrictable: transactionObj.flags.restrictable, - revokable: transactionObj.flags.revokable - } - }; - }; - - static mosaicSupplyChange = async transactionObj => { - const resolvedMosaic = await helper.resolveMosaicId(transactionObj.mosaicId); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - mosaicId: resolvedMosaic.toHex(), - action: Constants.MosaicSupplyChangeAction[transactionObj.action], - delta: transactionObj.delta.compact() - } - }; - }; - - static mosaicSupplyRevocation = async (transactionObj, { mosaicInfos, mosaicNames, unresolvedMosaicsMap }) => { + static transferTransaction = async ( + transactionObj, + { mosaicInfos, mosaicNames, unresolvedMosaicsMap } + ) => { + const { transactionInfo } = transactionObj; + + const [resolvedAddress] = await Promise.all([ + helper.resolvedAddress( + transactionObj.recipientAddress, + transactionInfo.height + ) + ]); + + const resolvedMosaics = transactionObj.mosaics.map(mosaic => { + return new Mosaic( + new MosaicId(unresolvedMosaicsMap[mosaic.id.toHex()]), + mosaic.amount + ); + }); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + message: transactionObj.message, + recipient: resolvedAddress, + mosaics: helper.mosaicsFieldObjectBuilder( + resolvedMosaics, + mosaicInfos, + mosaicNames + ) + } + }; + }; + + static namespaceRegistration = async transactionObj => { + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + recipient: http.networkConfig.NamespaceRentalFeeSinkAddress.address, + registrationType: + Constants.NamespaceRegistrationType[transactionObj.registrationType], + namespaceName: transactionObj.namespaceName, + namespaceId: transactionObj.namespaceId.toHex(), + parentId: + 'undefined' !== typeof transactionObj.parentId + ? transactionObj.parentId?.toHex() + : Constants.Message.UNAVAILABLE, + duration: + 'undefined' !== typeof transactionObj.duration + ? transactionObj.duration?.compact() + : Constants.Message.UNLIMITED + } + }; + }; + + static addressAlias = async transactionObj => { + const namespaceNames = await NamespaceService.getNamespacesNames([ + transactionObj.namespaceId + ]); + const namespaceName = namespaceNames.find(namespace => namespace.namespaceId === transactionObj.namespaceId.toHex()); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + aliasAction: Constants.AliasAction[transactionObj.aliasAction], + namespaceId: transactionObj.namespaceId.toHex(), + namespaceName: namespaceName.name, + address: transactionObj.address.address + } + }; + }; + + static mosaicAlias = async transactionObj => { + const namespaceNames = await NamespaceService.getNamespacesNames([ + transactionObj.namespaceId + ]); + const namespaceName = namespaceNames.find(namespace => namespace.namespaceId === transactionObj.namespaceId.toHex()); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + aliasAction: Constants.AliasAction[transactionObj.aliasAction], + namespaceId: transactionObj.namespaceId.id.toHex(), + namespaceName: namespaceName.name, + mosaicId: transactionObj.mosaicId.id.toHex() + } + }; + }; + + static mosaicDefinition = async transactionObj => { + const resolvedMosaic = await helper.resolveMosaicId(transactionObj.mosaicId); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + recipient: http.networkConfig.MosaicRentalSinkAddress.address, + mosaicId: resolvedMosaic.toHex(), + divisibility: transactionObj.divisibility, + duration: transactionObj.duration.compact(), + nonce: transactionObj.nonce.toHex(), + supplyMutable: transactionObj.flags.supplyMutable, + transferable: transactionObj.flags.transferable, + restrictable: transactionObj.flags.restrictable, + revokable: transactionObj.flags.revokable + } + }; + }; + + static mosaicSupplyChange = async transactionObj => { + const resolvedMosaic = await helper.resolveMosaicId(transactionObj.mosaicId); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + mosaicId: resolvedMosaic.toHex(), + action: Constants.MosaicSupplyChangeAction[transactionObj.action], + delta: transactionObj.delta.compact() + } + }; + }; + + static mosaicSupplyRevocation = async ( + transactionObj, + { mosaicInfos, mosaicNames, unresolvedMosaicsMap } + ) => { const resolvedMosaics = [ new Mosaic( new MosaicId(unresolvedMosaicsMap[transactionObj.mosaic.id.toHex()]), @@ -139,295 +166,354 @@ class CreateTransaction { transactionBody: { transactionType: transactionObj.type, address: transactionObj.sourceAddress.address, - mosaics: helper.mosaicsFieldObjectBuilder(resolvedMosaics, mosaicInfos, mosaicNames) + mosaics: helper.mosaicsFieldObjectBuilder( + resolvedMosaics, + mosaicInfos, + mosaicNames + ) + } + }; + }; + + static multisigAccountModification = async transactionObj => { + const { transactionInfo } = transactionObj; + const [addressAdditions, addressDeletions] = await Promise.all([ + Promise.all(transactionObj.addressAdditions.map(address => { + return helper.resolvedAddress(address, transactionInfo.height); + })), + Promise.all(transactionObj.addressDeletions.map(address => { + return helper.resolvedAddress(address, transactionInfo.height); + })) + ]); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + minApprovalDelta: transactionObj.minApprovalDelta, + minRemovalDelta: transactionObj.minRemovalDelta, + addressAdditions: addressAdditions, + addressDeletions: addressDeletions + } + }; + }; + + static hashLock = async ( + transactionObj, + { mosaicInfos, mosaicNames, unresolvedMosaicsMap } + ) => { + const resolvedMosaics = [ + new Mosaic( + new MosaicId(unresolvedMosaicsMap[transactionObj.mosaic.id.toHex()]), + transactionObj.mosaic.amount + ) + ]; + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + duration: transactionObj.duration.compact(), + mosaics: helper.mosaicsFieldObjectBuilder( + resolvedMosaics, + mosaicInfos, + mosaicNames + ), + hash: transactionObj.hash + } + }; + }; + + static secretLock = async ( + transactionObj, + { mosaicInfos, mosaicNames, unresolvedMosaicsMap } + ) => { + const { transactionInfo } = transactionObj; + + const [resolvedAddress] = await Promise.all([ + helper.resolvedAddress( + transactionObj.recipientAddress, + transactionInfo.height + ) + ]); + + const resolvedMosaics = [ + new Mosaic( + new MosaicId(unresolvedMosaicsMap[transactionObj.mosaic.id.toHex()]), + transactionObj.mosaic.amount + ) + ]; + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + duration: transactionObj.duration.compact(), + mosaics: helper.mosaicsFieldObjectBuilder( + resolvedMosaics, + mosaicInfos, + mosaicNames + ), + secret: transactionObj.secret, + recipient: resolvedAddress, + hashAlgorithm: Constants.LockHashAlgorithm[transactionObj.hashAlgorithm] + } + }; + }; + + static secretProof = async transactionObj => { + const { transactionInfo } = transactionObj; + const resolvedAddress = await helper.resolvedAddress( + transactionObj.recipientAddress, + transactionInfo.height + ); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + hashAlgorithm: + Constants.LockHashAlgorithm[transactionObj.hashAlgorithm], + recipient: resolvedAddress, + secret: transactionObj.secret, + proof: transactionObj.proof } }; }; - static multisigAccountModification = async transactionObj => { - const { transactionInfo } = transactionObj; - const [addressAdditions, addressDeletions] = await Promise.all([ - Promise.all(transactionObj.addressAdditions.map(address => { - return helper.resolvedAddress(address, transactionInfo.height); - })), - Promise.all(transactionObj.addressDeletions.map(address => { - return helper.resolvedAddress(address, transactionInfo.height); - })) - ]); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - minApprovalDelta: transactionObj.minApprovalDelta, - minRemovalDelta: transactionObj.minRemovalDelta, - addressAdditions: addressAdditions, - addressDeletions: addressDeletions - } - }; - } - - static hashLock = async (transactionObj, { mosaicInfos, mosaicNames, unresolvedMosaicsMap }) => { - const resolvedMosaics = [ - new Mosaic( - new MosaicId(unresolvedMosaicsMap[transactionObj.mosaic.id.toHex()]), - transactionObj.mosaic.amount - ) - ]; - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - duration: transactionObj.duration.compact(), - mosaics: helper.mosaicsFieldObjectBuilder(resolvedMosaics, mosaicInfos, mosaicNames), - hash: transactionObj.hash - } - }; - } - - static secretLock = async (transactionObj, { mosaicInfos, mosaicNames, unresolvedMosaicsMap }) => { - const { transactionInfo } = transactionObj; - - const [resolvedAddress] = await Promise.all([ - helper.resolvedAddress(transactionObj.recipientAddress, transactionInfo.height) - ]); - - const resolvedMosaics = [ - new Mosaic( - new MosaicId(unresolvedMosaicsMap[transactionObj.mosaic.id.toHex()]), - transactionObj.mosaic.amount - ) - ]; - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - duration: transactionObj.duration.compact(), - mosaics: helper.mosaicsFieldObjectBuilder(resolvedMosaics, mosaicInfos, mosaicNames), - secret: transactionObj.secret, - recipient: resolvedAddress, - hashAlgorithm: Constants.LockHashAlgorithm[transactionObj.hashAlgorithm] - } - }; - }; - - static secretProof = async transactionObj => { - const { transactionInfo } = transactionObj; - const resolvedAddress = await helper.resolvedAddress(transactionObj.recipientAddress, transactionInfo.height); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - hashAlgorithm: Constants.LockHashAlgorithm[transactionObj.hashAlgorithm], - recipient: resolvedAddress, - secret: transactionObj.secret, - proof: transactionObj.proof - } - }; - }; - - static accountAddressRestriction = async transactionObj => { - const { transactionInfo } = transactionObj; - const [addressAdditions, addressDeletions] = await Promise.all([ - Promise.all(transactionObj.restrictionAdditions.map(address => { - return helper.resolvedAddress(address, transactionInfo.height); - })), - Promise.all(transactionObj.restrictionDeletions.map(address => { - return helper.resolvedAddress(address, transactionInfo.height); - })) - ]); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - restrictionType: Constants.AddressRestrictionFlag[transactionObj.restrictionFlags], - restrictionAddressAdditions: addressAdditions, - restrictionAddressDeletions: addressDeletions - } - }; - }; - - static accountMosaicRestriction = async transactionObj => { - // Todo: mosaic restriction field - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - restrictionType: Constants.MosaicRestrictionFlag[transactionObj.restrictionFlags], - restrictionMosaicAdditions: transactionObj.restrictionAdditions.map(restriction => restriction.id.toHex()), - restrictionMosaicDeletions: transactionObj.restrictionDeletions.map(restriction => restriction.id.toHex()) - } - }; - } - - static accountOperationRestriction = async transactionObj => { - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - restrictionType: Constants.OperationRestrictionFlag[transactionObj.restrictionFlags], - restrictionOperationAdditions: transactionObj.restrictionAdditions.map(operation => operation), - restrictionOperationDeletions: transactionObj.restrictionDeletions.map(operation => operation) - } - }; - }; - - static mosaicAddressRestriction = async transactionObj => { - const { transactionInfo } = transactionObj; - const [resolvedMosaic, targetAddress] = await Promise.all([ - helper.resolveMosaicId(transactionObj.mosaicId), - helper.resolvedAddress(transactionObj.targetAddress, transactionInfo.height) - ]); - - const mosaicAliasNames = await helper.getMosaicAliasNames(resolvedMosaic); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - mosaicId: resolvedMosaic.toHex(), - mosaicAliasNames, - targetAddress: targetAddress, - restrictionKey: transactionObj.restrictionKey.toHex(), - previousRestrictionValue: transactionObj.previousRestrictionValue.toString(), - newRestrictionValue: transactionObj.newRestrictionValue.toString() - } - }; - }; - - static mosaicGlobalRestriction = async transactionObj => { - const referenceMosaicId = '0000000000000000' === transactionObj.referenceMosaicId.toHex() - ? transactionObj.mosaicId - : transactionObj.referenceMosaicId; - const mosaicAliasNames = await helper.getMosaicAliasNames(referenceMosaicId); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - referenceMosaicId: referenceMosaicId.toHex(), - mosaicAliasNames, - restrictionKey: transactionObj.restrictionKey.toHex(), - previousRestrictionType: Constants.MosaicRestrictionType[transactionObj.previousRestrictionType], - previousRestrictionValue: transactionObj.previousRestrictionValue.compact(), - newRestrictionType: Constants.MosaicRestrictionType[transactionObj.newRestrictionType], - newRestrictionValue: transactionObj.newRestrictionValue.compact() - } - }; - }; - - static accountMetadata = async transactionObj => { - const { transactionInfo } = transactionObj; - const resolvedAddress = await helper.resolvedAddress(transactionObj.targetAddress, transactionInfo.height); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - scopedMetadataKey: transactionObj.scopedMetadataKey.toHex(), - targetAddress: resolvedAddress, - metadataValue: `${Convert.uint8ToHex(transactionObj.value)} (Text: ${Convert.uint8ToUtf8(transactionObj.value)})`, - valueSizeDelta: transactionObj.valueSizeDelta - } - }; - }; - - static mosaicMetadata = async transactionObj => { - const { transactionInfo } = transactionObj; - const [resolvedMosaic, resolvedAddress] = await Promise.all([ - helper.resolveMosaicId(transactionObj.targetMosaicId), - helper.resolvedAddress(transactionObj.targetAddress, transactionInfo.height) - ]); - - const mosaicAliasNames = await helper.getMosaicAliasNames(resolvedMosaic); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - scopedMetadataKey: transactionObj.scopedMetadataKey.toHex(), - targetMosaicId: resolvedMosaic.toHex(), - targetMosaicAliasNames: mosaicAliasNames, - targetAddress: resolvedAddress, - metadataValue: `${Convert.uint8ToHex(transactionObj.value)} (Text: ${Convert.uint8ToUtf8(transactionObj.value)})`, - valueSizeDelta: transactionObj.valueSizeDelta - } - }; - }; - - static namespaceMetadata = async transactionObj => { - const { transactionInfo } = transactionObj; - const [namespaceName, resolvedAddress] = await Promise.all([ - NamespaceService.getNamespacesNames([transactionObj.targetNamespaceId]), - helper.resolvedAddress(transactionObj.targetAddress, transactionInfo.height) - ]); - - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - scopedMetadataKey: transactionObj.scopedMetadataKey.toHex(), - targetNamespaceId: transactionObj.targetNamespaceId.toHex(), - namespaceName: namespaceName, - targetAddress: resolvedAddress, - metadataValue: `${Convert.uint8ToHex(transactionObj.value)} (Text: ${Convert.uint8ToUtf8(transactionObj.value)})`, - valueSizeDelta: transactionObj.valueSizeDelta - } - }; - }; - - static votingKeyLink = transactionObj => { - return { - ...transactionObj, - transactionBody: { - linkAction: Constants.LinkAction[transactionObj.linkAction], - linkedPublicKey: transactionObj.linkedPublicKey, - linkedAccountAddress: Address.createFromPublicKey(transactionObj.linkedPublicKey, http.networkType).plain(), - startEpoch: transactionObj.startEpoch, - endEpoch: transactionObj.endEpoch - } - }; - }; - - static vrfKeyLink = transactionObj => { - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - linkAction: Constants.LinkAction[transactionObj.linkAction], - linkedPublicKey: transactionObj.linkedPublicKey, - linkedAccountAddress: Address.createFromPublicKey(transactionObj.linkedPublicKey, http.networkType).plain() - } - }; - }; - - static nodeKeyLink = transactionObj => { - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - linkAction: Constants.LinkAction[transactionObj.linkAction], - linkedPublicKey: transactionObj.linkedPublicKey, - linkedAccountAddress: Address.createFromPublicKey(transactionObj.linkedPublicKey, http.networkType).plain() - } - }; - }; - - static accountKeyLink = transactionObj => { - return { - ...transactionObj, - transactionBody: { - transactionType: transactionObj.type, - linkAction: Constants.LinkAction[transactionObj.linkAction], - linkedPublicKey: transactionObj.linkedPublicKey, - linkedAccountAddress: Address.createFromPublicKey(transactionObj.linkedPublicKey, http.networkType).plain() - } - }; - }; -}; + static accountAddressRestriction = async transactionObj => { + const { transactionInfo } = transactionObj; + const [addressAdditions, addressDeletions] = await Promise.all([ + Promise.all(transactionObj.restrictionAdditions.map(address => { + return helper.resolvedAddress(address, transactionInfo.height); + })), + Promise.all(transactionObj.restrictionDeletions.map(address => { + return helper.resolvedAddress(address, transactionInfo.height); + })) + ]); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + restrictionType: + Constants.AddressRestrictionFlag[transactionObj.restrictionFlags], + restrictionAddressAdditions: addressAdditions, + restrictionAddressDeletions: addressDeletions + } + }; + }; + + static accountMosaicRestriction = async transactionObj => { + // Todo: mosaic restriction field + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + restrictionType: + Constants.MosaicRestrictionFlag[transactionObj.restrictionFlags], + restrictionMosaicAdditions: transactionObj.restrictionAdditions.map(restriction => restriction.id.toHex()), + restrictionMosaicDeletions: transactionObj.restrictionDeletions.map(restriction => restriction.id.toHex()) + } + }; + }; + + static accountOperationRestriction = async transactionObj => { + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + restrictionType: + Constants.OperationRestrictionFlag[transactionObj.restrictionFlags], + restrictionOperationAdditions: transactionObj.restrictionAdditions.map(operation => operation), + restrictionOperationDeletions: transactionObj.restrictionDeletions.map(operation => operation) + } + }; + }; + + static mosaicAddressRestriction = async transactionObj => { + const { transactionInfo } = transactionObj; + const [resolvedMosaic, targetAddress] = await Promise.all([ + helper.resolveMosaicId(transactionObj.mosaicId), + helper.resolvedAddress( + transactionObj.targetAddress, + transactionInfo.height + ) + ]); + + const mosaicAliasNames = await helper.getMosaicAliasNames(resolvedMosaic); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + mosaicId: resolvedMosaic.toHex(), + mosaicAliasNames, + targetAddress: targetAddress, + restrictionKey: transactionObj.restrictionKey.toHex(), + previousRestrictionValue: + transactionObj.previousRestrictionValue.toString(), + newRestrictionValue: transactionObj.newRestrictionValue.toString() + } + }; + }; + + static mosaicGlobalRestriction = async transactionObj => { + const referenceMosaicId = + '0000000000000000' === transactionObj.referenceMosaicId.toHex() + ? transactionObj.mosaicId + : transactionObj.referenceMosaicId; + const mosaicAliasNames = await helper.getMosaicAliasNames(referenceMosaicId); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + referenceMosaicId: referenceMosaicId.toHex(), + mosaicAliasNames, + restrictionKey: transactionObj.restrictionKey.toHex(), + previousRestrictionType: + Constants.MosaicRestrictionType[ + transactionObj.previousRestrictionType + ], + previousRestrictionValue: + transactionObj.previousRestrictionValue.compact(), + newRestrictionType: + Constants.MosaicRestrictionType[transactionObj.newRestrictionType], + newRestrictionValue: transactionObj.newRestrictionValue.compact() + } + }; + }; + + static accountMetadata = async transactionObj => { + const { transactionInfo } = transactionObj; + const resolvedAddress = await helper.resolvedAddress( + transactionObj.targetAddress, + transactionInfo.height + ); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + scopedMetadataKey: transactionObj.scopedMetadataKey.toHex(), + targetAddress: resolvedAddress, + metadataValue: `${Convert.uint8ToHex(transactionObj.value)} (Text: ${Convert.uint8ToUtf8(transactionObj.value)})`, + valueSizeDelta: transactionObj.valueSizeDelta + } + }; + }; + + static mosaicMetadata = async transactionObj => { + const { transactionInfo } = transactionObj; + const [resolvedMosaic, resolvedAddress] = await Promise.all([ + helper.resolveMosaicId(transactionObj.targetMosaicId), + helper.resolvedAddress( + transactionObj.targetAddress, + transactionInfo.height + ) + ]); + + const mosaicAliasNames = await helper.getMosaicAliasNames(resolvedMosaic); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + scopedMetadataKey: transactionObj.scopedMetadataKey.toHex(), + targetMosaicId: resolvedMosaic.toHex(), + targetMosaicAliasNames: mosaicAliasNames, + targetAddress: resolvedAddress, + metadataValue: `${Convert.uint8ToHex(transactionObj.value)} (Text: ${Convert.uint8ToUtf8(transactionObj.value)})`, + valueSizeDelta: transactionObj.valueSizeDelta + } + }; + }; + + static namespaceMetadata = async transactionObj => { + const { transactionInfo } = transactionObj; + const [namespaceName, resolvedAddress] = await Promise.all([ + NamespaceService.getNamespacesNames([transactionObj.targetNamespaceId]), + helper.resolvedAddress( + transactionObj.targetAddress, + transactionInfo.height + ) + ]); + + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + scopedMetadataKey: transactionObj.scopedMetadataKey.toHex(), + targetNamespaceId: transactionObj.targetNamespaceId.toHex(), + namespaceName: namespaceName, + targetAddress: resolvedAddress, + metadataValue: `${Convert.uint8ToHex(transactionObj.value)} (Text: ${Convert.uint8ToUtf8(transactionObj.value)})`, + valueSizeDelta: transactionObj.valueSizeDelta + } + }; + }; + + static votingKeyLink = transactionObj => { + return { + ...transactionObj, + transactionBody: { + linkAction: Constants.LinkAction[transactionObj.linkAction], + linkedPublicKey: transactionObj.linkedPublicKey, + linkedAccountAddress: Address.createFromPublicKey( + transactionObj.linkedPublicKey, + http.networkType + ).plain(), + startEpoch: transactionObj.startEpoch, + endEpoch: transactionObj.endEpoch + } + }; + }; + + static vrfKeyLink = transactionObj => { + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + linkAction: Constants.LinkAction[transactionObj.linkAction], + linkedPublicKey: transactionObj.linkedPublicKey, + linkedAccountAddress: Address.createFromPublicKey( + transactionObj.linkedPublicKey, + http.networkType + ).plain() + } + }; + }; + + static nodeKeyLink = transactionObj => { + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + linkAction: Constants.LinkAction[transactionObj.linkAction], + linkedPublicKey: transactionObj.linkedPublicKey, + linkedAccountAddress: Address.createFromPublicKey( + transactionObj.linkedPublicKey, + http.networkType + ).plain() + } + }; + }; + + static accountKeyLink = transactionObj => { + return { + ...transactionObj, + transactionBody: { + transactionType: transactionObj.type, + linkAction: Constants.LinkAction[transactionObj.linkAction], + linkedPublicKey: transactionObj.linkedPublicKey, + linkedAccountAddress: Address.createFromPublicKey( + transactionObj.linkedPublicKey, + http.networkType + ).plain() + } + }; + }; +} export default CreateTransaction; diff --git a/src/infrastructure/DataService.js b/src/infrastructure/DataService.js index 1cd5cf031..f38db5be0 100644 --- a/src/infrastructure/DataService.js +++ b/src/infrastructure/DataService.js @@ -20,47 +20,51 @@ import http from './http'; import axios from 'axios'; class DataService { - /** - * Gets cryptocurrency market price from https://min-api.cryptocompare.com/ - * @param {string} cryptocurrency - name such as XEM, BTC - * @returns {object} Object of data - */ - static getMarketPrice = cryptocurrency => { - return new Promise((resolve, reject) => { - let url = http.marketDataUrl + `data/pricemultifull?fsyms=${cryptocurrency}&tsyms=USD`; + /** + * Gets cryptocurrency market price from https://min-api.cryptocompare.com/ + * @param {string} cryptocurrency - name such as XEM, BTC + * @returns {object} Object of data + */ + static getMarketPrice = cryptocurrency => { + return new Promise((resolve, reject) => { + let url = + http.marketDataUrl + + `data/pricemultifull?fsyms=${cryptocurrency}&tsyms=USD`; - axios - .get(url) - .then(res => { - return resolve(res.data.DISPLAY); - }) - .catch(error => { - // reject(new Error('Fail to request XEM price.')) - reject(new Error(error)); - }); - }); - } + axios + .get(url) + .then(res => { + return resolve(res.data.DISPLAY); + }) + .catch(error => { + // reject(new Error('Fail to request XEM price.')) + reject(new Error(error)); + }); + }); + }; - /** - * Gets cryptocurrency historical hourly graph from https://min-api.cryptocompare.com/ - * @param {string} cryptocurrency - name such as XEM, BTC - * @returns {array} Array of Data - */ - static getHistoricalHourlyGraph = cryptocurrency => { - return new Promise((resolve, reject) => { - let url = http.marketDataUrl + `data/histohour?fsym=${cryptocurrency}&tsym=USD&limit=168`; + /** + * Gets cryptocurrency historical hourly graph from https://min-api.cryptocompare.com/ + * @param {string} cryptocurrency - name such as XEM, BTC + * @returns {array} Array of Data + */ + static getHistoricalHourlyGraph = cryptocurrency => { + return new Promise((resolve, reject) => { + let url = + http.marketDataUrl + + `data/histohour?fsym=${cryptocurrency}&tsym=USD&limit=168`; - axios - .get(url) - .then(res => { - return resolve(res.data); - }) - .catch(error => { - // reject(new Error('Fail to request Xem historical hourly graph.')) - reject(new Error(error)); - }); - }); - } + axios + .get(url) + .then(res => { + return resolve(res.data); + }) + .catch(error => { + // reject(new Error('Fail to request Xem historical hourly graph.')) + reject(new Error(error)); + }); + }); + }; } export default DataService; diff --git a/src/infrastructure/FinalizationService.js b/src/infrastructure/FinalizationService.js index 60779f670..5a9d02aef 100644 --- a/src/infrastructure/FinalizationService.js +++ b/src/infrastructure/FinalizationService.js @@ -19,21 +19,22 @@ import http from './http'; class FinalizationService { - /** - * Gets finalization proof for a given epoch. - * @param {number} epoch - epoch number. - * @returns {object} formatted finalization proof. - */ - static getFinalizationProofAtEpoch = async epoch => { - const finalizationProof = await http.createRepositoryFactory.createFinalizationRepository() - .getFinalizationProofAtEpoch(epoch) - .toPromise(); + /** + * Gets finalization proof for a given epoch. + * @param {number} epoch - epoch number. + * @returns {object} formatted finalization proof. + */ + static getFinalizationProofAtEpoch = async epoch => { + const finalizationProof = await http.createRepositoryFactory + .createFinalizationRepository() + .getFinalizationProofAtEpoch(epoch) + .toPromise(); - return { - ...finalizationProof, - height: finalizationProof.height.compact() - }; - } + return { + ...finalizationProof, + height: finalizationProof.height.compact() + }; + }; } export default FinalizationService; diff --git a/src/infrastructure/ListenerService.js b/src/infrastructure/ListenerService.js index 242e4bf2e..64572a701 100644 --- a/src/infrastructure/ListenerService.js +++ b/src/infrastructure/ListenerService.js @@ -19,28 +19,31 @@ import http from './http'; import { Listener } from 'symbol-sdk'; class ListenerService { - /** - * Subscribe to new blocks announced to the chain. - * @param {function} onAdd - Getters function - * @param {string} wssEndpoint - WSS endpoint in string format. - * @returns {array} Array object [Listener, Subscription] - */ - static subscribeNewBlock = async (onAdd, wssEndpoint) => { - const namespaceRepository = http.createRepositoryFactory.createNamespaceRepository(); - const customWssEndpoint = `${wssEndpoint}/ws`; + /** + * Subscribe to new blocks announced to the chain. + * @param {function} onAdd - Getters function + * @param {string} wssEndpoint - WSS endpoint in string format. + * @returns {array} Array object [Listener, Subscription] + */ + static subscribeNewBlock = async (onAdd, wssEndpoint) => { + const namespaceRepository = + http.createRepositoryFactory.createNamespaceRepository(); + const customWssEndpoint = `${wssEndpoint}/ws`; - const listener = new Listener(customWssEndpoint, namespaceRepository, WebSocket); + const listener = new Listener( + customWssEndpoint, + namespaceRepository, + WebSocket + ); - await listener.open(); - let subscription = listener - .newBlock() - .subscribe( - block => onAdd(block), - err => console.error(err) - ); + await listener.open(); + let subscription = listener.newBlock().subscribe( + block => onAdd(block), + err => console.error(err) + ); - return [listener, subscription]; - } + return [listener, subscription]; + }; } export default ListenerService; diff --git a/src/infrastructure/LockService.js b/src/infrastructure/LockService.js index 20c708372..5e12ad6e3 100644 --- a/src/infrastructure/LockService.js +++ b/src/infrastructure/LockService.js @@ -20,76 +20,81 @@ import http from './http'; import { Constants } from '../config'; class LockService { - /** - * Gets a hash lock from searchCriteria. - * @param {object} hashLockSearchCriteria Search Criteria. - * @returns {object} formatted hash lock data with pagination info. - */ - static searchHashLocks = async hashLockSearchCriteria => { - const searchHashLocks = await http.createRepositoryFactory.createHashLockRepository() - .search(hashLockSearchCriteria) - .toPromise(); + /** + * Gets a hash lock from searchCriteria. + * @param {object} hashLockSearchCriteria Search Criteria. + * @returns {object} formatted hash lock data with pagination info. + */ + static searchHashLocks = async hashLockSearchCriteria => { + const searchHashLocks = await http.createRepositoryFactory + .createHashLockRepository() + .search(hashLockSearchCriteria) + .toPromise(); - return { - ...searchHashLocks, - data: searchHashLocks.data.map(hashLock => this.formatHashLockInfo(hashLock)) - }; - } + return { + ...searchHashLocks, + data: searchHashLocks.data.map(hashLock => + this.formatHashLockInfo(hashLock)) + }; + }; - /** - * Gets hash lock from hash. - * @param {string} hash Transaction hash. - * @returns {object}formatted Hash lock info. - */ - static getHashLock = async hash => { - const hashLock = await http.createRepositoryFactory.createHashLockRepository() - .getHashLock(hash) - .toPromise(); + /** + * Gets hash lock from hash. + * @param {string} hash Transaction hash. + * @returns {object}formatted Hash lock info. + */ + static getHashLock = async hash => { + const hashLock = await http.createRepositoryFactory + .createHashLockRepository() + .getHashLock(hash) + .toPromise(); - return this.formatHashLockInfo(hashLock); - } + return this.formatHashLockInfo(hashLock); + }; - /** - * Gets a secret lock from searchCriteria. - * @param {object} secretLockSearchCriteria Search Criteria. - * @returns {object} formatted secret lock data with pagination info. - */ - static searchSecretLocks = async secretLockSearchCriteria => { - const searchSecretLocks = await http.createRepositoryFactory.createSecretLockRepository() - .search(secretLockSearchCriteria) - .toPromise(); + /** + * Gets a secret lock from searchCriteria. + * @param {object} secretLockSearchCriteria Search Criteria. + * @returns {object} formatted secret lock data with pagination info. + */ + static searchSecretLocks = async secretLockSearchCriteria => { + const searchSecretLocks = await http.createRepositoryFactory + .createSecretLockRepository() + .search(secretLockSearchCriteria) + .toPromise(); - return { - ...searchSecretLocks, - data: searchSecretLocks.data.map(hashLock => this.formatSecretLockInfo(hashLock)) - }; - } + return { + ...searchSecretLocks, + data: searchSecretLocks.data.map(hashLock => + this.formatSecretLockInfo(hashLock)) + }; + }; - /** - * Format secretLockInfoDTO. - * @param {object} secretLockInfo secretLockInfoDTO. - * @returns {object} readable secretLockInfoDTO object. - */ - static formatSecretLockInfo = secretLockInfo => ({ - ...secretLockInfo, - status: Constants.LockStatusType[secretLockInfo.status], - endHeight: Number(secretLockInfo.endHeight.toString()), - ownerAddress: secretLockInfo.ownerAddress.plain(), - recipient: secretLockInfo.recipientAddress.plain(), - hashAlgorithm: Constants.LockHashAlgorithm[secretLockInfo.hashAlgorithm] - }) + /** + * Format secretLockInfoDTO. + * @param {object} secretLockInfo secretLockInfoDTO. + * @returns {object} readable secretLockInfoDTO object. + */ + static formatSecretLockInfo = secretLockInfo => ({ + ...secretLockInfo, + status: Constants.LockStatusType[secretLockInfo.status], + endHeight: Number(secretLockInfo.endHeight.toString()), + ownerAddress: secretLockInfo.ownerAddress.plain(), + recipient: secretLockInfo.recipientAddress.plain(), + hashAlgorithm: Constants.LockHashAlgorithm[secretLockInfo.hashAlgorithm] + }); - /** - * Format HashLockInfoDTO - * @param {object} hashLockInfo hashLockInfoDTO. - * @returns {object} readable HashLockInfoDTO object - */ - static formatHashLockInfo = hashLockInfo => ({ - ...hashLockInfo, - status: Constants.LockStatusType[hashLockInfo.status], - endHeight: Number(hashLockInfo.endHeight.toString()), - ownerAddress: hashLockInfo.ownerAddress.plain() - }) + /** + * Format HashLockInfoDTO + * @param {object} hashLockInfo hashLockInfoDTO. + * @returns {object} readable HashLockInfoDTO object + */ + static formatHashLockInfo = hashLockInfo => ({ + ...hashLockInfo, + status: Constants.LockStatusType[hashLockInfo.status], + endHeight: Number(hashLockInfo.endHeight.toString()), + ownerAddress: hashLockInfo.ownerAddress.plain() + }); } export default LockService; diff --git a/src/infrastructure/MetadataService.js b/src/infrastructure/MetadataService.js index 17efc3451..08dc28638 100644 --- a/src/infrastructure/MetadataService.js +++ b/src/infrastructure/MetadataService.js @@ -20,46 +20,49 @@ import http from './http'; import Constants from '../config/constants'; class MetadataService { - /** - * Gets a metadata from searchCriteria. - * @param {object} metadataSearchCriteria Search Criteria. - * @returns {object} formatted metadatas with pagination info. - */ - static searchMetadatas = async metadataSearchCriteria => { - const searchMetadatas = await http.createRepositoryFactory.createMetadataRepository() - .search(metadataSearchCriteria) - .toPromise(); + /** + * Gets a metadata from searchCriteria. + * @param {object} metadataSearchCriteria Search Criteria. + * @returns {object} formatted metadatas with pagination info. + */ + static searchMetadatas = async metadataSearchCriteria => { + const searchMetadatas = await http.createRepositoryFactory + .createMetadataRepository() + .search(metadataSearchCriteria) + .toPromise(); - return { - ...searchMetadatas, - data: searchMetadatas.data.map(metadata => this.formatMetadata(metadata)) - }; - } + return { + ...searchMetadatas, + data: searchMetadatas.data.map(metadata => this.formatMetadata(metadata)) + }; + }; - /** - * Format Metadata to readable object. - * @param {object} metadata - metadata DTO. - * @returns {object} readable Metadata object. - */ - static formatMetadata = metadata => ({ - metadataId: metadata.id, - ...this.formatMetadataEntry(metadata.metadataEntry) - }) + /** + * Format Metadata to readable object. + * @param {object} metadata - metadata DTO. + * @returns {object} readable Metadata object. + */ + static formatMetadata = metadata => ({ + metadataId: metadata.id, + ...this.formatMetadataEntry(metadata.metadataEntry) + }); - /** - * Format MetadataEntry to readable object. - * @param {object} metadataEntry - metadataEntry DTO. - * @returns {object} readable metadataEntry object. - */ - static formatMetadataEntry = metadataEntry => ({ - ...metadataEntry, - scopedMetadataKey: metadataEntry.scopedMetadataKey.toHex(), - sourceAddress: metadataEntry.sourceAddress.plain(), - targetAddress: metadataEntry.targetAddress.plain(), - metadataType: Constants.MetadataType[metadataEntry.metadataType], - targetId: metadataEntry.targetId ? metadataEntry.targetId.toHex() : Constants.Message.UNAVAILABLE, - value: metadataEntry.value - }) + /** + * Format MetadataEntry to readable object. + * @param {object} metadataEntry - metadataEntry DTO. + * @returns {object} readable metadataEntry object. + */ + static formatMetadataEntry = metadataEntry => ({ + ...metadataEntry, + scopedMetadataKey: metadataEntry.scopedMetadataKey.toHex(), + sourceAddress: metadataEntry.sourceAddress.plain(), + targetAddress: metadataEntry.targetAddress.plain(), + metadataType: Constants.MetadataType[metadataEntry.metadataType], + targetId: metadataEntry.targetId + ? metadataEntry.targetId.toHex() + : Constants.Message.UNAVAILABLE, + value: metadataEntry.value + }); } export default MetadataService; diff --git a/src/infrastructure/MosaicService.js b/src/infrastructure/MosaicService.js index 77e15a026..ba330c388 100644 --- a/src/infrastructure/MosaicService.js +++ b/src/infrastructure/MosaicService.js @@ -19,285 +19,315 @@ import http from './http'; import { Constants } from '../config'; import helper from '../helper'; -import { NamespaceService, MetadataService, ReceiptService } from '../infrastructure'; +import { + NamespaceService, + MetadataService, + ReceiptService +} from '../infrastructure'; import { Address, MosaicId, Order, ReceiptType, UInt64 } from 'symbol-sdk'; class MosaicService { /** - * Gets MosaicInfo for different mosaicIds. - * @param {array} mosaicIds - Array of mosaic ids. - * @returns {array} Formatted MosaicInfos. - */ - static getMosaics = async mosaicIds => { - const mosaics = await http.createRepositoryFactory.createMosaicRepository() - .getMosaics(mosaicIds) - .toPromise(); - const formattedMosaics = mosaics.map(mosaic => this.formatMosaicInfo(mosaic)); - - return formattedMosaics; - } - - /** - * Gets the MosaicInfo for a given mosaicId. - * @param {object} mosaicId - Mosaic id - * @returns {object} Formatted MosaicInfo - */ - static getMosaic = async mosaicId => { - const mosaic = await http.createRepositoryFactory.createMosaicRepository() - .getMosaic(mosaicId) - .toPromise(); - - const formattedMosaic = this.formatMosaicInfo(mosaic); - - return formattedMosaic; - } - - /** - * Get balance mosaics in form of MosaicAmountViews for a given account address. - * @param {string} address - Account address - * @returns {array} formatted MosaicAmountViews - */ - static getMosaicAmountView = async address => { - const mosaicAmountViews = await http.mosaicService.mosaicsAmountViewFromAddress(Address.createFromRawAddress(address)).toPromise(); - - return mosaicAmountViews.map(mosaicAmountView => this.formatMosaicAmountView(mosaicAmountView)); - } - - /** - * Gets a mosaics list from searchCriteria. - * @param {object} mosaicSearchCriteria Search Criteria. - * @returns {object} formatted mosaic data with pagination info. - */ - static searchMosaics = async mosaicSearchCriteria => { - const searchMosaics = await http.createRepositoryFactory.createMosaicRepository() - .search(mosaicSearchCriteria) - .toPromise(); - - return { - ...searchMosaics, - data: searchMosaics.data.map(mosaic => this.formatMosaicInfo(mosaic)) - }; - } - - /** - * Get formatted MosaicInfo dataset into Vue Component. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {object} MosaicInfo info object. - */ - static getMosaicInfo = async hexOrNamespace => { - const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); - const mosaicInfo = await this.getMosaic(mosaicId); - - const mosaicNames = await NamespaceService.getMosaicsNames([mosaicId]); - - const expiredInBlock = mosaicInfo.duration + mosaicInfo.startHeight; - - return { - ...mosaicInfo, - mosaicAliasNames: this.extractMosaicNamespace(mosaicInfo, mosaicNames), - expiredInBlock: expiredInBlock === mosaicInfo.startHeight ? Constants.Message.INFINITY : expiredInBlock - }; - } - - /** - * Get custom MosaicInfo dataset into Vue Component. - * @param {object} pageInfo - pagination info. - * @returns {object} Custom MosaicInfos - */ - static getMosaicList = async pageInfo => { - const { pageNumber, pageSize } = pageInfo; - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc - }; - - const mosaicInfos = await this.searchMosaics(searchCriteria); - - const mosaicIdsList = mosaicInfos.data.map(mosaicInfo => new MosaicId(mosaicInfo.mosaicId)); - - const mosaicNames = await NamespaceService.getMosaicsNames(mosaicIdsList); - - return { - ...mosaicInfos, - data: mosaicInfos.data.map(mosaic => ({ - ...mosaic, - ownerAddress: mosaic.address, - mosaicAliasNames: this.extractMosaicNamespace(mosaic, mosaicNames), - mosaicFlags: { - supplyMutable: mosaic.supplyMutable, - transferable: mosaic.transferable, - restrictable: mosaic.restrictable, - revokable: mosaic.revokable - } - })) - }; - } - - /** - * Get customize MosaicAmountView dataset for Vue component. - * @param {string} address - Account address. - * @returns {object} customize MosaicAmountViews. - */ - static getMosaicAmountViewList = async address => { - const mosaicAmountViewInfos = await this.getMosaicAmountView(address); - - const mosaicIdsList = mosaicAmountViewInfos.map(mosaicAmountViewInfo => new MosaicId(mosaicAmountViewInfo.mosaicId)); - const mosaicNames = await NamespaceService.getMosaicsNames(mosaicIdsList); - - return mosaicAmountViewInfos.map(mosaicAmountViewInfo => ({ - ...mosaicAmountViewInfo, - mosaicAliasNames: this.extractMosaicNamespace(mosaicAmountViewInfo, mosaicNames) - })); - } - - /** - * Gets mosaic Metadata list dataset into Vue component. - * @param {object} pageInfo - page info such as pageNumber, pageSize. - * @param {object} filterValue - search criteria. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {object} formatted mosaic Metadata list. - */ - static getMosaicMetadataList = async (pageInfo, filterValue, hexOrNamespace) => { - const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); - - const { pageNumber, pageSize } = pageInfo; - - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - targetId: mosaicId, - ...filterValue - }; - const mosaicMetadatas = await MetadataService.searchMetadatas(searchCriteria); - - return mosaicMetadatas; - } - - /** - * Gets mosaic balance transfer receipt list dataset into Vue component. - * @param {object} pageInfo - page info such as pageNumber, pageSize. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {object} formatted balance transfer receipt list. - */ - static getMosaicBalanceTransferReceipt = async (pageInfo, hexOrNamespace) => { - const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); - - const { startHeight, address } = await this.getMosaic(mosaicId); - - const { pageNumber, pageSize } = pageInfo; - - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - height: UInt64.fromUint(startHeight), - receiptTypes: [ReceiptType.Mosaic_Rental_Fee], - senderAddress: Address.createFromRawAddress(address) - }; - - const balanceTransferReceipt = await ReceiptService.searchReceipts(searchCriteria); - - const formattedReceipt = await ReceiptService.createReceiptTransactionStatement(balanceTransferReceipt.data.balanceTransferStatement); - - return { - ...balanceTransferReceipt, - data: formattedReceipt.filter(receipt => - receipt.senderAddress === address && - receipt.type === ReceiptType.Mosaic_Rental_Fee) - }; - } - - /** - * Gets mosaic artifact expiry receipt list dataset into Vue component. - * @param {object} pageInfo - page info such as pageNumber, pageSize. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {object} formatted artifact expiry receipt list. - */ - static getMosaicArtifactExpiryReceipt = async (pageInfo, hexOrNamespace) => { - const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); - - const { startHeight, duration } = await this.getMosaic(mosaicId); - - const { pageNumber, pageSize } = pageInfo; - - // Returns empty, artifact expiry receipt does not exist when duration is infinity - if (0 === duration) { - return { - data: [], - pageNumber, - pageSize, - isLastPage: true - }; - } - - const endHeight = startHeight + duration; - - // Todo: Should filter with with ArtifactId rather than height. - // Bug: https://github.com/nemtech/catapult-rest/issues/517 - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - height: UInt64.fromUint(endHeight), - receiptTypes: [ReceiptType.Mosaic_Expired] - }; - - const artifactExpiryReceipt = await ReceiptService.searchReceipts(searchCriteria); - const formattedReceipt = await ReceiptService.createReceiptTransactionStatement(artifactExpiryReceipt.data.artifactExpiryStatement); - - return { - ...artifactExpiryReceipt, - data: formattedReceipt.filter(receipt => receipt.type === ReceiptType.Mosaic_Expired) - }; - } - - /** - * Format MosaicInfo to readable mosaicInfo object. - * @param {object} mosaicInfo MosaicInfoDTO. - * @returns {object} readable MosaicInfoDTO object. - */ - static formatMosaicInfo = mosaicInfo => ({ - mosaicId: mosaicInfo.id.toHex(), - divisibility: mosaicInfo.divisibility, - address: mosaicInfo.ownerAddress.plain(), - supply: mosaicInfo.supply.compact().toLocaleString('en-US'), - relativeAmount: helper.formatMosaicAmountWithDivisibility(mosaicInfo.supply.compact(), mosaicInfo.divisibility), - revision: mosaicInfo.revision, - startHeight: Number(mosaicInfo.startHeight.toString()), - duration: Number(mosaicInfo.duration.toString()), - supplyMutable: mosaicInfo.flags.supplyMutable, - transferable: mosaicInfo.flags.transferable, - restrictable: mosaicInfo.flags.restrictable, - revokable: mosaicInfo.flags.revokable - }) - - /** - * format MosaicAmountView to readable object. - * @param {object} mosaicAmountView - mosaicAmountView DTO. - * @returns {object} formatted mosaicAmountView. - */ - static formatMosaicAmountView = mosaicAmountView => ({ - ...this.formatMosaicInfo(mosaicAmountView.mosaicInfo), - amount: helper.formatMosaicAmountWithDivisibility(mosaicAmountView.amount.compact(), mosaicAmountView.mosaicInfo.divisibility) - }) - - /** - * Extract Name for Mosaic. - * @param {object} mosaicInfo - mosaicInfo DTO. - * @param {array} mosaicNames - MosaicNames[]. - * @returns {array} mosaicNames. - */ - static extractMosaicNamespace = (mosaicInfo, mosaicNames) => { - const mosaicName = mosaicNames.find(name => name.mosaicId === mosaicInfo.mosaicId); - - const aliasNames = mosaicName.names.map(names => names.name); - - const names = 0 < aliasNames.length ? aliasNames : [Constants.Message.UNAVAILABLE]; - - return names; - } + * Gets MosaicInfo for different mosaicIds. + * @param {array} mosaicIds - Array of mosaic ids. + * @returns {array} Formatted MosaicInfos. + */ + static getMosaics = async mosaicIds => { + const mosaics = await http.createRepositoryFactory + .createMosaicRepository() + .getMosaics(mosaicIds) + .toPromise(); + const formattedMosaics = mosaics.map(mosaic => + this.formatMosaicInfo(mosaic)); + + return formattedMosaics; + }; + + /** + * Gets the MosaicInfo for a given mosaicId. + * @param {object} mosaicId - Mosaic id + * @returns {object} Formatted MosaicInfo + */ + static getMosaic = async mosaicId => { + const mosaic = await http.createRepositoryFactory + .createMosaicRepository() + .getMosaic(mosaicId) + .toPromise(); + + const formattedMosaic = this.formatMosaicInfo(mosaic); + + return formattedMosaic; + }; + + /** + * Get balance mosaics in form of MosaicAmountViews for a given account address. + * @param {string} address - Account address + * @returns {array} formatted MosaicAmountViews + */ + static getMosaicAmountView = async address => { + const mosaicAmountViews = await http.mosaicService + .mosaicsAmountViewFromAddress(Address.createFromRawAddress(address)) + .toPromise(); + + return mosaicAmountViews.map(mosaicAmountView => + this.formatMosaicAmountView(mosaicAmountView)); + }; + + /** + * Gets a mosaics list from searchCriteria. + * @param {object} mosaicSearchCriteria Search Criteria. + * @returns {object} formatted mosaic data with pagination info. + */ + static searchMosaics = async mosaicSearchCriteria => { + const searchMosaics = await http.createRepositoryFactory + .createMosaicRepository() + .search(mosaicSearchCriteria) + .toPromise(); + + return { + ...searchMosaics, + data: searchMosaics.data.map(mosaic => this.formatMosaicInfo(mosaic)) + }; + }; + + /** + * Get formatted MosaicInfo dataset into Vue Component. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {object} MosaicInfo info object. + */ + static getMosaicInfo = async hexOrNamespace => { + const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); + const mosaicInfo = await this.getMosaic(mosaicId); + + const mosaicNames = await NamespaceService.getMosaicsNames([mosaicId]); + + const expiredInBlock = mosaicInfo.duration + mosaicInfo.startHeight; + + return { + ...mosaicInfo, + mosaicAliasNames: this.extractMosaicNamespace(mosaicInfo, mosaicNames), + expiredInBlock: + expiredInBlock === mosaicInfo.startHeight + ? Constants.Message.INFINITY + : expiredInBlock + }; + }; + + /** + * Get custom MosaicInfo dataset into Vue Component. + * @param {object} pageInfo - pagination info. + * @returns {object} Custom MosaicInfos + */ + static getMosaicList = async pageInfo => { + const { pageNumber, pageSize } = pageInfo; + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc + }; + + const mosaicInfos = await this.searchMosaics(searchCriteria); + + const mosaicIdsList = mosaicInfos.data.map(mosaicInfo => new MosaicId(mosaicInfo.mosaicId)); + + const mosaicNames = await NamespaceService.getMosaicsNames(mosaicIdsList); + + return { + ...mosaicInfos, + data: mosaicInfos.data.map(mosaic => ({ + ...mosaic, + ownerAddress: mosaic.address, + mosaicAliasNames: this.extractMosaicNamespace(mosaic, mosaicNames), + mosaicFlags: { + supplyMutable: mosaic.supplyMutable, + transferable: mosaic.transferable, + restrictable: mosaic.restrictable, + revokable: mosaic.revokable + } + })) + }; + }; + + /** + * Get customize MosaicAmountView dataset for Vue component. + * @param {string} address - Account address. + * @returns {object} customize MosaicAmountViews. + */ + static getMosaicAmountViewList = async address => { + const mosaicAmountViewInfos = await this.getMosaicAmountView(address); + + const mosaicIdsList = mosaicAmountViewInfos.map(mosaicAmountViewInfo => new MosaicId(mosaicAmountViewInfo.mosaicId)); + const mosaicNames = await NamespaceService.getMosaicsNames(mosaicIdsList); + + return mosaicAmountViewInfos.map(mosaicAmountViewInfo => ({ + ...mosaicAmountViewInfo, + mosaicAliasNames: this.extractMosaicNamespace( + mosaicAmountViewInfo, + mosaicNames + ) + })); + }; + + /** + * Gets mosaic Metadata list dataset into Vue component. + * @param {object} pageInfo - page info such as pageNumber, pageSize. + * @param {object} filterValue - search criteria. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {object} formatted mosaic Metadata list. + */ + static getMosaicMetadataList = async ( + pageInfo, + filterValue, + hexOrNamespace + ) => { + const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); + + const { pageNumber, pageSize } = pageInfo; + + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + targetId: mosaicId, + ...filterValue + }; + const mosaicMetadatas = await MetadataService.searchMetadatas(searchCriteria); + + return mosaicMetadatas; + }; + + /** + * Gets mosaic balance transfer receipt list dataset into Vue component. + * @param {object} pageInfo - page info such as pageNumber, pageSize. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {object} formatted balance transfer receipt list. + */ + static getMosaicBalanceTransferReceipt = async (pageInfo, hexOrNamespace) => { + const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); + + const { startHeight, address } = await this.getMosaic(mosaicId); + + const { pageNumber, pageSize } = pageInfo; + + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + height: UInt64.fromUint(startHeight), + receiptTypes: [ReceiptType.Mosaic_Rental_Fee], + senderAddress: Address.createFromRawAddress(address) + }; + + const balanceTransferReceipt = await ReceiptService.searchReceipts(searchCriteria); + + const formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(balanceTransferReceipt.data.balanceTransferStatement); + + return { + ...balanceTransferReceipt, + data: formattedReceipt.filter(receipt => + receipt.senderAddress === address && + receipt.type === ReceiptType.Mosaic_Rental_Fee) + }; + }; + + /** + * Gets mosaic artifact expiry receipt list dataset into Vue component. + * @param {object} pageInfo - page info such as pageNumber, pageSize. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {object} formatted artifact expiry receipt list. + */ + static getMosaicArtifactExpiryReceipt = async (pageInfo, hexOrNamespace) => { + const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); + + const { startHeight, duration } = await this.getMosaic(mosaicId); + + const { pageNumber, pageSize } = pageInfo; + + // Returns empty, artifact expiry receipt does not exist when duration is infinity + if (0 === duration) { + return { + data: [], + pageNumber, + pageSize, + isLastPage: true + }; + } + + const endHeight = startHeight + duration; + + // Todo: Should filter with with ArtifactId rather than height. + // Bug: https://github.com/nemtech/catapult-rest/issues/517 + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + height: UInt64.fromUint(endHeight), + receiptTypes: [ReceiptType.Mosaic_Expired] + }; + + const artifactExpiryReceipt = await ReceiptService.searchReceipts(searchCriteria); + const formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(artifactExpiryReceipt.data.artifactExpiryStatement); + + return { + ...artifactExpiryReceipt, + data: formattedReceipt.filter(receipt => receipt.type === ReceiptType.Mosaic_Expired) + }; + }; + + /** + * Format MosaicInfo to readable mosaicInfo object. + * @param {object} mosaicInfo MosaicInfoDTO. + * @returns {object} readable MosaicInfoDTO object. + */ + static formatMosaicInfo = mosaicInfo => ({ + mosaicId: mosaicInfo.id.toHex(), + divisibility: mosaicInfo.divisibility, + address: mosaicInfo.ownerAddress.plain(), + supply: mosaicInfo.supply.compact().toLocaleString('en-US'), + relativeAmount: helper.formatMosaicAmountWithDivisibility( + mosaicInfo.supply.compact(), + mosaicInfo.divisibility + ), + revision: mosaicInfo.revision, + startHeight: Number(mosaicInfo.startHeight.toString()), + duration: Number(mosaicInfo.duration.toString()), + supplyMutable: mosaicInfo.flags.supplyMutable, + transferable: mosaicInfo.flags.transferable, + restrictable: mosaicInfo.flags.restrictable, + revokable: mosaicInfo.flags.revokable + }); + + /** + * format MosaicAmountView to readable object. + * @param {object} mosaicAmountView - mosaicAmountView DTO. + * @returns {object} formatted mosaicAmountView. + */ + static formatMosaicAmountView = mosaicAmountView => ({ + ...this.formatMosaicInfo(mosaicAmountView.mosaicInfo), + amount: helper.formatMosaicAmountWithDivisibility( + mosaicAmountView.amount.compact(), + mosaicAmountView.mosaicInfo.divisibility + ) + }); + + /** + * Extract Name for Mosaic. + * @param {object} mosaicInfo - mosaicInfo DTO. + * @param {array} mosaicNames - MosaicNames[]. + * @returns {array} mosaicNames. + */ + static extractMosaicNamespace = (mosaicInfo, mosaicNames) => { + const mosaicName = mosaicNames.find(name => name.mosaicId === mosaicInfo.mosaicId); + + const aliasNames = mosaicName.names.map(names => names.name); + + const names = + 0 < aliasNames.length ? aliasNames : [Constants.Message.UNAVAILABLE]; + + return names; + }; } export default MosaicService; diff --git a/src/infrastructure/MultisigService.js b/src/infrastructure/MultisigService.js index 3055aef48..a63913295 100644 --- a/src/infrastructure/MultisigService.js +++ b/src/infrastructure/MultisigService.js @@ -20,55 +20,64 @@ import http from './http'; import { Address } from 'symbol-sdk'; class MultisigService { - /** - * Gets a MultisigAccountInfo for an account. - * @param {string} address - Account Address. - * @returns {object} MultisigAccountInfo. - */ - static getMultisigAccount = async address => { - let multisigAccountInfo; + /** + * Gets a MultisigAccountInfo for an account. + * @param {string} address - Account Address. + * @returns {object} MultisigAccountInfo. + */ + static getMultisigAccount = async address => { + let multisigAccountInfo; - try { - multisigAccountInfo = await http.createRepositoryFactory.createMultisigRepository() - .getMultisigAccountInfo(Address.createFromRawAddress(address)) - .toPromise(); - } catch (e) { - // To Catch statusCode 404 if Address is not a multisig account. - throw Error('Address is not a multisig account.'); - } + try { + multisigAccountInfo = await http.createRepositoryFactory + .createMultisigRepository() + .getMultisigAccountInfo(Address.createFromRawAddress(address)) + .toPromise(); + } catch (e) { + // To Catch statusCode 404 if Address is not a multisig account. + throw Error('Address is not a multisig account.'); + } - const formattedMultisigAccount = this.formatMultisigAccountInfo(multisigAccountInfo); + const formattedMultisigAccount = + this.formatMultisigAccountInfo(multisigAccountInfo); - return formattedMultisigAccount; - } + return formattedMultisigAccount; + }; - /** - * Get Customize MultisigAccountInfo for Vue component. - * @param {string} address - Account Address. - * @returns {object} customize MultisigAccountInfo. - */ - static getMultisigAccountInfo = async address => { - const multisigAccountInfo = await this.getMultisigAccount(address); + /** + * Get Customize MultisigAccountInfo for Vue component. + * @param {string} address - Account Address. + * @returns {object} customize MultisigAccountInfo. + */ + static getMultisigAccountInfo = async address => { + const multisigAccountInfo = await this.getMultisigAccount(address); - return { - ...multisigAccountInfo, - minApproval: 0 < multisigAccountInfo?.cosignatoryAddresses.length ? multisigAccountInfo.minApproval : null, - minRemoval: 0 < multisigAccountInfo?.cosignatoryAddresses.length ? multisigAccountInfo.minRemoval : null, - cosignatoryAddresses: multisigAccountInfo?.cosignatoryAddresses, - multisigAddresses: multisigAccountInfo?.multisigAddresses - }; - } + return { + ...multisigAccountInfo, + minApproval: + 0 < multisigAccountInfo?.cosignatoryAddresses.length + ? multisigAccountInfo.minApproval + : null, + minRemoval: + 0 < multisigAccountInfo?.cosignatoryAddresses.length + ? multisigAccountInfo.minRemoval + : null, + cosignatoryAddresses: multisigAccountInfo?.cosignatoryAddresses, + multisigAddresses: multisigAccountInfo?.multisigAddresses + }; + }; - /** - * Format multisigAccountInfo DTO to readable object. - * @param {object} multisigAccountInfo - multisigAccountInfo DTO. - * @returns {object} formatted multisigAccountInfo DTO. - */ - static formatMultisigAccountInfo = multisigAccountInfo => ({ - ...multisigAccountInfo, - cosignatoryAddresses: multisigAccountInfo.cosignatoryAddresses.map(address => address.plain()), - multisigAddresses: multisigAccountInfo.multisigAddresses.map(address => address.plain()) - }) + /** + * Format multisigAccountInfo DTO to readable object. + * @param {object} multisigAccountInfo - multisigAccountInfo DTO. + * @returns {object} formatted multisigAccountInfo DTO. + */ + static formatMultisigAccountInfo = multisigAccountInfo => ({ + ...multisigAccountInfo, + cosignatoryAddresses: multisigAccountInfo.cosignatoryAddresses.map(address => address.plain()), + multisigAddresses: multisigAccountInfo.multisigAddresses.map(address => + address.plain()) + }); } export default MultisigService; diff --git a/src/infrastructure/NamespaceService.js b/src/infrastructure/NamespaceService.js index 1b56b22eb..3683f7b89 100644 --- a/src/infrastructure/NamespaceService.js +++ b/src/infrastructure/NamespaceService.js @@ -20,429 +20,485 @@ import http from './http'; import Constants from '../config/constants'; import globalConfig from '../config/globalConfig'; import helper from '../helper'; -import { ChainService, MetadataService, ReceiptService } from '../infrastructure'; +import { + ChainService, + MetadataService, + ReceiptService +} from '../infrastructure'; import { Order, NamespaceId, UInt64, ReceiptType, Address } from 'symbol-sdk'; class NamespaceService { - /** - * Gets array of NamespaceName for different namespaceIds. - * @param {array} namespaceIds - Array of namespace ids. - * @returns {array} Formatted NamespaceName. - */ - static getNamespacesNames = async namespaceIds => { - let namespaceNames = await http.createRepositoryFactory.createNamespaceRepository() - .getNamespacesNames(namespaceIds) - .toPromise(); - - let formattedNamespacesName = namespaceNames.map(namespaceName => this.formatNamespaceName(namespaceName)); - - return formattedNamespacesName; - } - - /** - * Get readable names for a set of mosaics Returns friendly names for mosaics. - * @param {array} mosaicIds - Array of mosaic ids. - * @returns {array} MosaicNames. - */ - static getMosaicsNames = async mosaicIds => { - const mosaicNames = await http.createRepositoryFactory.createNamespaceRepository() - .getMosaicsNames(mosaicIds) - .toPromise(); - const formattedMosaicNames = mosaicNames.map(mosaicName => this.formatMosaicName(mosaicName)); - - return formattedMosaicNames; - } - - /** - * Returns friendly names for array of addresses. - * @param {array} addresses - Array of addresses. - * @returns {array} AccountNames. - */ - static getAccountsNames = async addresses => { - const accountNames = await http.createRepositoryFactory.createNamespaceRepository() - .getAccountsNames(addresses) - .toPromise(); - - const formattedAccountNames = accountNames.map(accountName => this.formatAccountName(accountName)); - - return formattedAccountNames; - } - - /** - * Get namespace info and name from namespace Id. - * @param {number} namespaceId - Namespace id. - * @returns {object} formatted namespace info and name. - */ - static getNamespace = async namespaceId => { - let namespace = await http.namespaceService.namespace(namespaceId).toPromise(); - - let formattedNamespace = this.formatNamespace(namespace); - - return formattedNamespace; - } - - /** - * Get linked address from namespace Id - * @param {object} namespaceId - Namespace id - * @returns {object} Address - */ - static getLinkedAddress = async namespaceId => { - const address = await http.createRepositoryFactory.createNamespaceRepository() - .getLinkedAddress(namespaceId) - .toPromise(); - - return address; - } - - /** - * Get linked mosaicId from namespace Id. - * @param {object} namespaceId - Namespace id - * @returns {object} mosaicId - */ - static getLinkedMosaicId = async namespaceId => { - const mosaicId = await http.createRepositoryFactory.createNamespaceRepository() - .getLinkedMosaicId(namespaceId) - .toPromise(); - - return mosaicId; - } - - /** - * Gets a namespace list from searchCriteria. - * @param {object} namespaceSearchCriteria Search Criteria - * @returns {object} formatted namespace data with pagination info - */ - static searchNamespaces = async namespaceSearchCriteria => { - const searchNamespaces = await http.createRepositoryFactory.createNamespaceRepository() - .search(namespaceSearchCriteria) - .toPromise(); - - // Convert NamespaceInfo[] to Namespace[] - const namespaces = await this.toNamespaces(searchNamespaces.data); - - return { - ...searchNamespaces, - data: namespaces.map(namespace => this.formatNamespace(namespace)) - }; - } - - /** - * Get namespace info for Vue Component. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {object} customize namespace info Object. - */ - static getNamespaceInfo = async hexOrNamespace => { - const namespaceId = await helper.hexOrNamespaceToId(hexOrNamespace, 'namespace'); - - const namespace = await this.getNamespace(namespaceId); - const { height: currentHeight } = await ChainService.getChainInfo(); - - const { - isExpired, - expiredInBlock, - expiredInSecond - } = helper.calculateNamespaceExpiration(currentHeight, namespace.endHeight); - - let formattedNamespaceInfo = { - ...namespace, - duration: helper.convertTimeFromNowInSec(expiredInSecond) || Constants.Message.UNLIMITED, - status: isExpired ? Constants.Message.EXPIRED : Constants.Message.ACTIVE - }; - - // create alias props by alias type. - if (namespace.aliasType === Constants.Message.ADDRESS) - formattedNamespaceInfo.aliasAddress = namespace.alias; - - if (namespace.aliasType === Constants.Message.MOSAIC) - formattedNamespaceInfo.aliasMosaic = namespace.alias; - - // End height disable click before expired. - formattedNamespaceInfo.expiredInBlock = helper.isNativeNamespace(namespace.namespaceName) - ? Constants.Message.INFINITY - : expiredInBlock + ' ≈ ' + formattedNamespaceInfo.duration; - - if (isExpired) - delete formattedNamespaceInfo.expiredInBlock; - - if (currentHeight < formattedNamespaceInfo.endHeight) { - formattedNamespaceInfo.beforeEndHeight = helper.isNativeNamespace(namespace.namespaceName) - ? Constants.Message.INFINITY - : formattedNamespaceInfo.endHeight + ` ( ${http.networkConfig.NamespaceGraceDuration} blocks of grace period )`; - delete formattedNamespaceInfo.endHeight; - } - - return formattedNamespaceInfo; - } - - /** - * Gets NamespaceName list from Vue Component. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {array} Namespace name list. - */ - static getNamespaceLevelList = async hexOrNamespace => { - let namespaceId = await helper.hexOrNamespaceToId(hexOrNamespace, 'namespace'); - - let namespacesName = await this.getNamespacesNames([namespaceId]); - - return namespacesName; - } - - /** - * Get customize NamespaceInfo dataset into Vue Component. - * @param {object} pageInfo - pagination info. - * @param {object} filterValue - search criteria. - * @returns {array} customize NamespaceInfo. - */ - static getNamespaceList = async (pageInfo, filterValue) => { - const { pageNumber, pageSize } = pageInfo; - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - ...filterValue - }; - - const namespaceInfos = await this.searchNamespaces(searchCriteria); - const { height: currentHeight } = await ChainService.getChainInfo(); - - return { - ...namespaceInfos, - data: namespaceInfos.data.map(namespace => { - const { isExpired, expiredInSecond, expiredInBlock } - = helper.calculateNamespaceExpiration(currentHeight, namespace.endHeight); - - return { - ...namespace, - isExpired: isExpired, - approximateExpired: helper.isNativeNamespace(namespace.namespaceName) - ? Constants.Message.INFINITY - : helper.convertSecondToDate(expiredInSecond), - expiredInBlock: expiredInBlock - }; - }) - }; - } - - /** - * Gets namespace metadata list dataset into Vue component. - * @param {object} pageInfo - page info such as pageNumber, pageSize. - * @param {object} filterValue - search criteria. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {array} formatted namespace Metadata list - */ - static getNamespaceMetadataList = async (pageInfo, filterValue, hexOrNamespace) => { - const namespaceId = await helper.hexOrNamespaceToId(hexOrNamespace, 'namespace'); - - const { pageNumber, pageSize } = pageInfo; - - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - targetId: namespaceId, - ...filterValue - }; - const namespaceMetadatas = await MetadataService.searchMetadatas(searchCriteria); - - return namespaceMetadatas; - } - - /** - * Gets namespace balance transfer receipt list dataset into Vue component. - * @param {object} pageInfo - page info such as pageNumber, pageSize. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {array} formatted balance transfer receipt list. - */ - static getNamespaceBalanceTransferReceipt = async (pageInfo, hexOrNamespace) => { - const namespaceId = await helper.hexOrNamespaceToId(hexOrNamespace, 'namespace'); - - const { ownerAddress, startHeight } = await this.getNamespace(namespaceId); - - const { pageNumber, pageSize } = pageInfo; - - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - height: UInt64.fromUint(startHeight), - receiptTypes: [ReceiptType.Namespace_Rental_Fee], - senderAddress: Address.createFromRawAddress(ownerAddress) - }; - - const balanceTransferReceipt = await ReceiptService.searchReceipts(searchCriteria); - - const formattedReceipt = await ReceiptService.createReceiptTransactionStatement(balanceTransferReceipt.data.balanceTransferStatement); - - return { - ...balanceTransferReceipt, - data: formattedReceipt.filter(receipt => - receipt.senderAddress === ownerAddress && - receipt.type === ReceiptType.Namespace_Rental_Fee) - }; - } - - /** - * Gets namespace artifact expiry receipt list dataset into Vue component. - * @param {object} pageInfo - page info such as pageNumber, pageSize. - * @param {string} hexOrNamespace - hex value or namespace name. - * @returns {array} formatted artifact expiry receipt list. - */ - static getNamespaceArtifactExpiryReceipt = async (pageInfo, hexOrNamespace) => { - const namespaceId = await helper.hexOrNamespaceToId(hexOrNamespace, 'namespace'); - - const { endHeight } = await this.getNamespace(namespaceId); - - const { pageNumber, pageSize } = pageInfo; - - // Todo: Should filter with with ArtifactId rather than height. - // Bug: https://github.com/nemtech/catapult-rest/issues/517 - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - height: UInt64.fromUint(endHeight), - receiptTypes: [ReceiptType.Namespace_Expired, ReceiptType.Namespace_Deleted] - }; - - const artifactExpiryReceipt = await ReceiptService.searchReceipts(searchCriteria); - const formattedReceipt = await ReceiptService.createReceiptTransactionStatement(artifactExpiryReceipt.data.artifactExpiryStatement); - - return { - ...artifactExpiryReceipt, - data: formattedReceipt.filter(receipt => receipt.type === ReceiptType.Namespace_Expired - || receipt.type === ReceiptType.Namespace_Deleted) - }; - } - - /** - * Convert NamespaceInfo[] to Namespace[]. - * @param {array} namespaceInfos - array of NamespaceInfo. - * @returns {array} Namespaces. - */ - static toNamespaces = async namespaceInfos => { - const namespaceIdsList = namespaceInfos.map(namespaceInfo => namespaceInfo.id); - const namespaceNames = await this.getNamespacesNames(namespaceIdsList); - - return namespaceInfos.map(namespaceInfo => ({ - ...namespaceInfo, - id: namespaceInfo.id, - name: this.extractFullNamespace(namespaceInfo, namespaceNames) - })); - } - - /** - * Gets native namespaces name in from nemesis transactions. - * @returns {array} Namespaces - */ - static getNativeNamespaces = async () => { - const namespace = globalConfig.networkConfig.namespaceName; - const rootNamespace = namespace.split('.')[0]; - const namespaceids = [rootNamespace, namespace].map(namespace => new NamespaceId(namespace)); - - const namespaceInfos = await Promise.all(namespaceids.map(async namespaceid => { - return (NamespaceService.getNamespace(namespaceid)); - })); - - return namespaceInfos; - } - - /** - * Format namespaceName to readable object. - * @param {object} namespaceName namespaceNameDTO - * @returns {object} readable namespaceNameDTO. - */ - static formatNamespaceName = namespaceName => ({ - ...namespaceName, - namespaceId: namespaceName.namespaceId.toHex(), - parentId: namespaceName?.parentId ? namespaceName.parentId.toHex() : Constants.Message.UNAVAILABLE - }) - - /** - * Format alias to readable object. - * @param {string} alias alias type. - * @returns {object} readable Alias object. - */ - static formatAlias = alias => { - switch (alias.type) { - case 0: - return { - ...alias, - aliasType: Constants.Message.UNAVAILABLE - }; - case 1: // Mosaic id alias - return { - ...alias, - aliasType: Constants.Message.MOSAIC, - alias: alias?.mosaicId.toHex() - }; - case 2: // Address alias - return { - ...alias, - aliasType: Constants.Message.ADDRESS, - alias: alias?.address.plain() - }; - } - } - - /** - * Format namespace to readable object. - * @param {object} namespace - namespace DTO. - * @returns {object} readable namespaceDTO. - */ - static formatNamespace = namespace => ({ - ...namespace, - ownerAddress: namespace.ownerAddress.plain(), - namespaceName: namespace.name, - namespaceId: namespace.id.toHex(), - registrationType: Constants.NamespaceRegistrationType[namespace.registrationType], - startHeight: Number(namespace.startHeight.toString()), - endHeight: helper.isNativeNamespace(namespace.name) - ? Constants.Message.INFINITY - : Number(namespace.endHeight.toString()), - active: namespace.active ? Constants.Message.ACTIVE : Constants.Message.INACTIVE, - ...this.formatAlias(namespace.alias), - parentName: 0 !== namespace.registrationType ? namespace.name.split('.')[0] : '', - levels: namespace.levels - }) - - /** - * Format mosaic name to readable object. - * @param {object} mosaicName - mosaicName DTO. - * @returns {object} readable mosaicName DTO. - */ - static formatMosaicName = mosaicName => ({ - ...mosaicName, - mosaicId: mosaicName.mosaicId.toHex() - }) - - /** - * Format account name to readable object. - * @param {object} accountName - accountName DTO. - * @returns {object} readable accountName DTO. - */ - static formatAccountName = accountName => ({ - ...accountName, - address: accountName.address.plain(), - names: accountName.names.map(name => this.formatNamespaceName(name)) - }) - - /** - * Extract full name for Namespace. - * @param {object} namespaceInfo - namespaceInfo DTO. - * @param {array} namespaceNames - NamespaceNames. - * @returns {string} full name. - */ - static extractFullNamespace = (namespaceInfo, namespaceNames) => { - return namespaceInfo.levels.map(level => { - const namespaceName = namespaceNames.find(name => name.namespaceId === level.toHex()); - - if (namespaceName === undefined) - throw new Error('Not found'); - return namespaceName; - }) - .map(namespaceName => namespaceName.name) - .join('.'); - } + /** + * Gets array of NamespaceName for different namespaceIds. + * @param {array} namespaceIds - Array of namespace ids. + * @returns {array} Formatted NamespaceName. + */ + static getNamespacesNames = async namespaceIds => { + let namespaceNames = await http.createRepositoryFactory + .createNamespaceRepository() + .getNamespacesNames(namespaceIds) + .toPromise(); + + let formattedNamespacesName = namespaceNames.map(namespaceName => + this.formatNamespaceName(namespaceName)); + + return formattedNamespacesName; + }; + + /** + * Get readable names for a set of mosaics Returns friendly names for mosaics. + * @param {array} mosaicIds - Array of mosaic ids. + * @returns {array} MosaicNames. + */ + static getMosaicsNames = async mosaicIds => { + const mosaicNames = await http.createRepositoryFactory + .createNamespaceRepository() + .getMosaicsNames(mosaicIds) + .toPromise(); + const formattedMosaicNames = mosaicNames.map(mosaicName => + this.formatMosaicName(mosaicName)); + + return formattedMosaicNames; + }; + + /** + * Returns friendly names for array of addresses. + * @param {array} addresses - Array of addresses. + * @returns {array} AccountNames. + */ + static getAccountsNames = async addresses => { + const accountNames = await http.createRepositoryFactory + .createNamespaceRepository() + .getAccountsNames(addresses) + .toPromise(); + + const formattedAccountNames = accountNames.map(accountName => + this.formatAccountName(accountName)); + + return formattedAccountNames; + }; + + /** + * Get namespace info and name from namespace Id. + * @param {number} namespaceId - Namespace id. + * @returns {object} formatted namespace info and name. + */ + static getNamespace = async namespaceId => { + let namespace = await http.namespaceService + .namespace(namespaceId) + .toPromise(); + + let formattedNamespace = this.formatNamespace(namespace); + + return formattedNamespace; + }; + + /** + * Get linked address from namespace Id + * @param {object} namespaceId - Namespace id + * @returns {object} Address + */ + static getLinkedAddress = async namespaceId => { + const address = await http.createRepositoryFactory + .createNamespaceRepository() + .getLinkedAddress(namespaceId) + .toPromise(); + + return address; + }; + + /** + * Get linked mosaicId from namespace Id. + * @param {object} namespaceId - Namespace id + * @returns {object} mosaicId + */ + static getLinkedMosaicId = async namespaceId => { + const mosaicId = await http.createRepositoryFactory + .createNamespaceRepository() + .getLinkedMosaicId(namespaceId) + .toPromise(); + + return mosaicId; + }; + + /** + * Gets a namespace list from searchCriteria. + * @param {object} namespaceSearchCriteria Search Criteria + * @returns {object} formatted namespace data with pagination info + */ + static searchNamespaces = async namespaceSearchCriteria => { + const searchNamespaces = await http.createRepositoryFactory + .createNamespaceRepository() + .search(namespaceSearchCriteria) + .toPromise(); + + // Convert NamespaceInfo[] to Namespace[] + const namespaces = await this.toNamespaces(searchNamespaces.data); + + return { + ...searchNamespaces, + data: namespaces.map(namespace => this.formatNamespace(namespace)) + }; + }; + + /** + * Get namespace info for Vue Component. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {object} customize namespace info Object. + */ + static getNamespaceInfo = async hexOrNamespace => { + const namespaceId = await helper.hexOrNamespaceToId( + hexOrNamespace, + 'namespace' + ); + + const namespace = await this.getNamespace(namespaceId); + const { height: currentHeight } = await ChainService.getChainInfo(); + + const { isExpired, expiredInBlock, expiredInSecond } = + helper.calculateNamespaceExpiration(currentHeight, namespace.endHeight); + + let formattedNamespaceInfo = { + ...namespace, + duration: + helper.convertTimeFromNowInSec(expiredInSecond) || + Constants.Message.UNLIMITED, + status: isExpired ? Constants.Message.EXPIRED : Constants.Message.ACTIVE + }; + + // create alias props by alias type. + if (namespace.aliasType === Constants.Message.ADDRESS) + formattedNamespaceInfo.aliasAddress = namespace.alias; + + if (namespace.aliasType === Constants.Message.MOSAIC) + formattedNamespaceInfo.aliasMosaic = namespace.alias; + + // End height disable click before expired. + formattedNamespaceInfo.expiredInBlock = helper.isNativeNamespace(namespace.namespaceName) + ? Constants.Message.INFINITY + : expiredInBlock + ' ≈ ' + formattedNamespaceInfo.duration; + + if (isExpired) + delete formattedNamespaceInfo.expiredInBlock; + + if (currentHeight < formattedNamespaceInfo.endHeight) { + formattedNamespaceInfo.beforeEndHeight = helper.isNativeNamespace(namespace.namespaceName) + ? Constants.Message.INFINITY + : formattedNamespaceInfo.endHeight + + ` ( ${http.networkConfig.NamespaceGraceDuration} blocks of grace period )`; + delete formattedNamespaceInfo.endHeight; + } + + return formattedNamespaceInfo; + }; + + /** + * Gets NamespaceName list from Vue Component. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {array} Namespace name list. + */ + static getNamespaceLevelList = async hexOrNamespace => { + let namespaceId = await helper.hexOrNamespaceToId( + hexOrNamespace, + 'namespace' + ); + + let namespacesName = await this.getNamespacesNames([namespaceId]); + + return namespacesName; + }; + + /** + * Get customize NamespaceInfo dataset into Vue Component. + * @param {object} pageInfo - pagination info. + * @param {object} filterValue - search criteria. + * @returns {array} customize NamespaceInfo. + */ + static getNamespaceList = async (pageInfo, filterValue) => { + const { pageNumber, pageSize } = pageInfo; + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + ...filterValue + }; + + const namespaceInfos = await this.searchNamespaces(searchCriteria); + const { height: currentHeight } = await ChainService.getChainInfo(); + + return { + ...namespaceInfos, + data: namespaceInfos.data.map(namespace => { + const { isExpired, expiredInSecond, expiredInBlock } = + helper.calculateNamespaceExpiration( + currentHeight, + namespace.endHeight + ); + + return { + ...namespace, + isExpired: isExpired, + approximateExpired: helper.isNativeNamespace(namespace.namespaceName) + ? Constants.Message.INFINITY + : helper.convertSecondToDate(expiredInSecond), + expiredInBlock: expiredInBlock + }; + }) + }; + }; + + /** + * Gets namespace metadata list dataset into Vue component. + * @param {object} pageInfo - page info such as pageNumber, pageSize. + * @param {object} filterValue - search criteria. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {array} formatted namespace Metadata list + */ + static getNamespaceMetadataList = async ( + pageInfo, + filterValue, + hexOrNamespace + ) => { + const namespaceId = await helper.hexOrNamespaceToId( + hexOrNamespace, + 'namespace' + ); + + const { pageNumber, pageSize } = pageInfo; + + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + targetId: namespaceId, + ...filterValue + }; + const namespaceMetadatas = await MetadataService.searchMetadatas(searchCriteria); + + return namespaceMetadatas; + }; + + /** + * Gets namespace balance transfer receipt list dataset into Vue component. + * @param {object} pageInfo - page info such as pageNumber, pageSize. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {array} formatted balance transfer receipt list. + */ + static getNamespaceBalanceTransferReceipt = async ( + pageInfo, + hexOrNamespace + ) => { + const namespaceId = await helper.hexOrNamespaceToId( + hexOrNamespace, + 'namespace' + ); + + const { ownerAddress, startHeight } = await this.getNamespace(namespaceId); + + const { pageNumber, pageSize } = pageInfo; + + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + height: UInt64.fromUint(startHeight), + receiptTypes: [ReceiptType.Namespace_Rental_Fee], + senderAddress: Address.createFromRawAddress(ownerAddress) + }; + + const balanceTransferReceipt = await ReceiptService.searchReceipts(searchCriteria); + + const formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(balanceTransferReceipt.data.balanceTransferStatement); + + return { + ...balanceTransferReceipt, + data: formattedReceipt.filter(receipt => + receipt.senderAddress === ownerAddress && + receipt.type === ReceiptType.Namespace_Rental_Fee) + }; + }; + + /** + * Gets namespace artifact expiry receipt list dataset into Vue component. + * @param {object} pageInfo - page info such as pageNumber, pageSize. + * @param {string} hexOrNamespace - hex value or namespace name. + * @returns {array} formatted artifact expiry receipt list. + */ + static getNamespaceArtifactExpiryReceipt = async ( + pageInfo, + hexOrNamespace + ) => { + const namespaceId = await helper.hexOrNamespaceToId( + hexOrNamespace, + 'namespace' + ); + + const { endHeight } = await this.getNamespace(namespaceId); + + const { pageNumber, pageSize } = pageInfo; + + // Todo: Should filter with with ArtifactId rather than height. + // Bug: https://github.com/nemtech/catapult-rest/issues/517 + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + height: UInt64.fromUint(endHeight), + receiptTypes: [ + ReceiptType.Namespace_Expired, + ReceiptType.Namespace_Deleted + ] + }; + + const artifactExpiryReceipt = await ReceiptService.searchReceipts(searchCriteria); + const formattedReceipt = + await ReceiptService.createReceiptTransactionStatement(artifactExpiryReceipt.data.artifactExpiryStatement); + + return { + ...artifactExpiryReceipt, + data: formattedReceipt.filter(receipt => + receipt.type === ReceiptType.Namespace_Expired || + receipt.type === ReceiptType.Namespace_Deleted) + }; + }; + + /** + * Convert NamespaceInfo[] to Namespace[]. + * @param {array} namespaceInfos - array of NamespaceInfo. + * @returns {array} Namespaces. + */ + static toNamespaces = async namespaceInfos => { + const namespaceIdsList = namespaceInfos.map(namespaceInfo => namespaceInfo.id); + const namespaceNames = await this.getNamespacesNames(namespaceIdsList); + + return namespaceInfos.map(namespaceInfo => ({ + ...namespaceInfo, + id: namespaceInfo.id, + name: this.extractFullNamespace(namespaceInfo, namespaceNames) + })); + }; + + /** + * Gets native namespaces name in from nemesis transactions. + * @returns {array} Namespaces + */ + static getNativeNamespaces = async () => { + const namespace = globalConfig.networkConfig.namespaceName; + const rootNamespace = namespace.split('.')[0]; + const namespaceids = [rootNamespace, namespace].map(namespace => new NamespaceId(namespace)); + + const namespaceInfos = await Promise.all(namespaceids.map(async namespaceid => { + return NamespaceService.getNamespace(namespaceid); + })); + + return namespaceInfos; + }; + + /** + * Format namespaceName to readable object. + * @param {object} namespaceName namespaceNameDTO + * @returns {object} readable namespaceNameDTO. + */ + static formatNamespaceName = namespaceName => ({ + ...namespaceName, + namespaceId: namespaceName.namespaceId.toHex(), + parentId: namespaceName?.parentId + ? namespaceName.parentId.toHex() + : Constants.Message.UNAVAILABLE + }); + + /** + * Format alias to readable object. + * @param {string} alias alias type. + * @returns {object} readable Alias object. + */ + static formatAlias = alias => { + switch (alias.type) { + case 0: + return { + ...alias, + aliasType: Constants.Message.UNAVAILABLE + }; + case 1: // Mosaic id alias + return { + ...alias, + aliasType: Constants.Message.MOSAIC, + alias: alias?.mosaicId.toHex() + }; + case 2: // Address alias + return { + ...alias, + aliasType: Constants.Message.ADDRESS, + alias: alias?.address.plain() + }; + } + }; + + /** + * Format namespace to readable object. + * @param {object} namespace - namespace DTO. + * @returns {object} readable namespaceDTO. + */ + static formatNamespace = namespace => ({ + ...namespace, + ownerAddress: namespace.ownerAddress.plain(), + namespaceName: namespace.name, + namespaceId: namespace.id.toHex(), + registrationType: + Constants.NamespaceRegistrationType[namespace.registrationType], + startHeight: Number(namespace.startHeight.toString()), + endHeight: helper.isNativeNamespace(namespace.name) + ? Constants.Message.INFINITY + : Number(namespace.endHeight.toString()), + active: namespace.active + ? Constants.Message.ACTIVE + : Constants.Message.INACTIVE, + ...this.formatAlias(namespace.alias), + parentName: + 0 !== namespace.registrationType ? namespace.name.split('.')[0] : '', + levels: namespace.levels + }); + + /** + * Format mosaic name to readable object. + * @param {object} mosaicName - mosaicName DTO. + * @returns {object} readable mosaicName DTO. + */ + static formatMosaicName = mosaicName => ({ + ...mosaicName, + mosaicId: mosaicName.mosaicId.toHex() + }); + + /** + * Format account name to readable object. + * @param {object} accountName - accountName DTO. + * @returns {object} readable accountName DTO. + */ + static formatAccountName = accountName => ({ + ...accountName, + address: accountName.address.plain(), + names: accountName.names.map(name => this.formatNamespaceName(name)) + }); + + /** + * Extract full name for Namespace. + * @param {object} namespaceInfo - namespaceInfo DTO. + * @param {array} namespaceNames - NamespaceNames. + * @returns {string} full name. + */ + static extractFullNamespace = (namespaceInfo, namespaceNames) => { + return namespaceInfo.levels + .map(level => { + const namespaceName = namespaceNames.find(name => name.namespaceId === level.toHex()); + + if (namespaceName === undefined) + throw new Error('Not found'); + return namespaceName; + }) + .map(namespaceName => namespaceName.name) + .join('.'); + }; } export default NamespaceService; diff --git a/src/infrastructure/NetworkService.js b/src/infrastructure/NetworkService.js index 746f96e76..95fab45ae 100644 --- a/src/infrastructure/NetworkService.js +++ b/src/infrastructure/NetworkService.js @@ -19,64 +19,71 @@ import http from './http'; class NetworkService { - /** - * Get estimated effective rental fees for namespaces and mosaics. - * @returns {object} rental fees information - */ - static getRentalFees = async () => { - const rentalFees = await http.createRepositoryFactory.createNetworkRepository() - .getRentalFees() - .toPromise(); + /** + * Get estimated effective rental fees for namespaces and mosaics. + * @returns {object} rental fees information + */ + static getRentalFees = async () => { + const rentalFees = await http.createRepositoryFactory + .createNetworkRepository() + .getRentalFees() + .toPromise(); - return this.formatRentalFees(rentalFees); - } + return this.formatRentalFees(rentalFees); + }; - /** - * Get average, median, highest and lower fee multiplier over the last "numBlocksTransactionFeeStats". - * @returns {object} transaction fees information - */ - static getTransactionFees = async () => { - const transactionFees = await http.createRepositoryFactory.createNetworkRepository() - .getTransactionFees() - .toPromise(); + /** + * Get average, median, highest and lower fee multiplier over the last "numBlocksTransactionFeeStats". + * @returns {object} transaction fees information + */ + static getTransactionFees = async () => { + const transactionFees = await http.createRepositoryFactory + .createNetworkRepository() + .getTransactionFees() + .toPromise(); - return transactionFees; - } + return transactionFees; + }; - /** - * Formatted Transaction Fees multiplier into Vue Component. - * @returns {object} Transaction Fees Info for Vue Component. - */ - static getTransactionFeesInfo = async () => { - const transactionFees = await this.getTransactionFees(); + /** + * Formatted Transaction Fees multiplier into Vue Component. + * @returns {object} Transaction Fees Info for Vue Component. + */ + static getTransactionFeesInfo = async () => { + const transactionFees = await this.getTransactionFees(); - return transactionFees; - } + return transactionFees; + }; - /** - * Formatted Rental Fees into Vue Component. - * @returns {object} Rental Fees Info for Vue Component. - */ - static getRentalFeesInfo = async () => { - const rentalFees = await this.getRentalFees(); + /** + * Formatted Rental Fees into Vue Component. + * @returns {object} Rental Fees Info for Vue Component. + */ + static getRentalFeesInfo = async () => { + const rentalFees = await this.getRentalFees(); - return rentalFees; - } + return rentalFees; + }; - /** - * Format RentalfeesDTO to readable object. - * @param {object} rentalFees rental fees. - * @returns {object} readable RentalfeesDTO object. - */ - static formatRentalFees = rentalFees => { - const { divisibility } = http.networkCurrency; + /** + * Format RentalfeesDTO to readable object. + * @param {object} rentalFees rental fees. + * @returns {object} readable RentalfeesDTO object. + */ + static formatRentalFees = rentalFees => { + const { divisibility } = http.networkCurrency; - return { - effectiveRootNamespaceRentalFeePerBlock: rentalFees.effectiveRootNamespaceRentalFeePerBlock / Math.pow(10, divisibility), - effectiveChildNamespaceRentalFee: rentalFees.effectiveChildNamespaceRentalFee / Math.pow(10, divisibility), - effectiveMosaicRentalFee: rentalFees.effectiveMosaicRentalFee / Math.pow(10, divisibility) - }; - } + return { + effectiveRootNamespaceRentalFeePerBlock: + rentalFees.effectiveRootNamespaceRentalFeePerBlock / + Math.pow(10, divisibility), + effectiveChildNamespaceRentalFee: + rentalFees.effectiveChildNamespaceRentalFee / + Math.pow(10, divisibility), + effectiveMosaicRentalFee: + rentalFees.effectiveMosaicRentalFee / Math.pow(10, divisibility) + }; + }; } export default NetworkService; diff --git a/src/infrastructure/NodeService.js b/src/infrastructure/NodeService.js index e8a8c3eea..39f93635f 100644 --- a/src/infrastructure/NodeService.js +++ b/src/infrastructure/NodeService.js @@ -23,188 +23,228 @@ import moment from 'moment'; import * as symbol from 'symbol-sdk'; class NodeService { - /** - * Get Storage Info from symbol SDK. - * @returns {object} StorageInfo - */ - static getStorageInfo = () => { - return http.createRepositoryFactory.createNodeRepository() - .getStorageInfo() - .toPromise(); - } - - /** - * Get Node Info from symbol SDK. - * @returns {object} NodeInfo - */ - static getCurrentNodeInfo = () => { - return http.createRepositoryFactory.createNodeRepository() - .getNodeInfo() - .toPromise(); - } - - /** - * Get Node Peers from symbol SDK. - * @returns {array} NodeInfo[] - */ - static getNodePeers = async () => { - let nodePeers = []; - - try { - nodePeers = await http.statisticServiceRestClient().getNodes(); - } catch (e) { - console.error('Statistics service getNodes error: ', e); - } - - return nodePeers - .map(nodeInfo => this.formatNodeInfo(nodeInfo)) - .sort((a, b) => a.friendlyName.localeCompare(b.friendlyName)); - } - - /** - * Get node health status by endpoint. - * @param {string} currentUrl api-node endpoint such as http:localhost:3000 - * @returns {boolean} boolean - */ - static isNodeActive = async currentUrl => { - let status = true; - - try { - await new symbol.NodeHttp(currentUrl).getNodeHealth() - .toPromise(); - } catch (e) { - status = false; - } - - return status; - } - - /** - * Format NodeInfoDTO to readable NodeInfo object. - * @param {object} nodeInfo NodeInfoDTO. - * @returns {object} readable NodeInfo. - */ - static formatNodeInfo = nodeInfo => ({ - ...nodeInfo, - nodePublicKey: nodeInfo.publicKey, - address: symbol.Address.createFromPublicKey(nodeInfo.publicKey, nodeInfo.networkIdentifier).plain(), - rolesRaw: nodeInfo.roles, - roles: Constants.RoleType[nodeInfo.roles], - network: Constants.NetworkType[nodeInfo.networkIdentifier], - version: helper.formatNodeVersion(nodeInfo.version), - apiEndpoint: - 2 === nodeInfo.roles || - 3 === nodeInfo.roles || - 6 === nodeInfo.roles || - 7 === nodeInfo.roles - ? nodeInfo.apiStatus.restGatewayUrl - : Constants.Message.UNAVAILABLE - }) - - /** - * Format Node Peers dataset into Vue Component. - * @param {string} filter role filter. - * @returns {object} Node peers object for Vue component. - */ - static getNodePeerList = async filter => { - let nodePeers = await this.getNodePeers(); - - return { - data: - nodePeers - .filter(el => !filter.rolesRaw || el.rolesRaw === filter.rolesRaw) - .map(el => { - let node = { - ...el - }; - - node['softwareVersion'] = { version: el.version }; - - if (el.apiStatus) { - const { chainHeight, finalization, lastStatusCheck, restVersion, isHttpsEnabled } = el.apiStatus; - - node['chainInfo'] = { - chainHeight, - finalizationHeight: finalization?.height, - lastStatusCheck - }; - - node['softwareVersion'] = { - ...node.softwareVersion, - restVersion, - isHttpsEnabled - }; - } else { node['chainInfo'] = {}; } - - if (node?.hostDetail) { - node = { ...node, ...node.hostDetail }; - delete node.hostDetail; - } - - return node; - }) - }; - } - - static getNodeInfo = async publicKey => { - let node = {}; - - try { - node = await http.statisticServiceRestClient().getNode(publicKey); - } catch (e) { - throw Error('Statistics service getNode error: ', e); - } - const formattedNode = this.formatNodeInfo(node); - - if (2 === formattedNode.rolesRaw || - 3 === formattedNode.rolesRaw || - 6 === formattedNode.rolesRaw || - 7 === formattedNode.rolesRaw - ) { - const { - finalization, - chainHeight, - lastStatusCheck, - nodeStatus, - isAvailable, - isHttpsEnabled, - restVersion - } = formattedNode.apiStatus; - - // // Api status - formattedNode.apiStatus = { - connectionStatus: isAvailable, - databaseStatus: 'up' === nodeStatus?.db || Constants.Message.UNAVAILABLE, - apiNodeStatus: 'up' === nodeStatus?.apiNode || Constants.Message.UNAVAILABLE, - isHttpsEnabled, - restVersion, - lastStatusCheck: moment.utc(lastStatusCheck).format('YYYY-MM-DD HH:mm:ss') - }; - - if (finalization && chainHeight) { - // Chain info - formattedNode.chainInfo = { - height: chainHeight, - finalizedHeight: finalization?.height, - finalizationEpoch: finalization?.epoch, - finalizationPoint: finalization?.point, - finalizedHash: finalization?.hash, - lastStatusCheck: moment.utc(lastStatusCheck).format('YYYY-MM-DD HH:mm:ss') - }; - } else { formattedNode.chainInfo = {}; } - } - if (formattedNode?.peerStatus) - formattedNode.peerStatus.lastStatusCheck = moment(formattedNode.peerStatus.lastStatusCheck).format('YYYY-MM-DD HH:mm:ss'); - return formattedNode; - } + /** + * Get Storage Info from symbol SDK. + * @returns {object} StorageInfo + */ + static getStorageInfo = () => { + return http.createRepositoryFactory + .createNodeRepository() + .getStorageInfo() + .toPromise(); + }; - static getNodeStats = async () => { + /** + * Get Node Info from symbol SDK. + * @returns {object} NodeInfo + */ + static getCurrentNodeInfo = () => { + return http.createRepositoryFactory + .createNodeRepository() + .getNodeInfo() + .toPromise(); + }; + + /** + * Get node health status by endpoint. + * @param {string} currentUrl api-node endpoint such as http:localhost:3000 + * @returns {boolean} boolean + */ + static isNodeActive = async currentUrl => { + let status = true; + + try { + await new symbol.NodeHttp(currentUrl).getNodeHealth().toPromise(); + } catch (e) { + status = false; + } + + return status; + }; + + /** + * Format NodeInfoDTO to readable NodeInfo object. + * @param {object} nodeInfo NodeInfoDTO. + * @returns {object} readable NodeInfo. + */ + static formatNodeInfo = nodeInfo => ({ + ...nodeInfo, + nodePublicKey: nodeInfo.publicKey, + address: symbol.Address.createFromPublicKey( + nodeInfo.publicKey, + nodeInfo.networkIdentifier + ).plain(), + rolesRaw: nodeInfo.roles, + roles: Constants.RoleType[nodeInfo.roles], + network: Constants.NetworkType[nodeInfo.networkIdentifier], + version: helper.formatNodeVersion(nodeInfo.version), + apiEndpoint: + 2 === nodeInfo.roles || + 3 === nodeInfo.roles || + 6 === nodeInfo.roles || + 7 === nodeInfo.roles + ? nodeInfo.apiStatus.restGatewayUrl + : Constants.Message.UNAVAILABLE + }); + + /** + * Get available node list from statistic service. + * @returns {array} NodeInfo[] + */ + static getAvailableNodes = async () => { + try { + const nodePeers = await http.statisticServiceRestClient().getNodes(); + + return nodePeers + .filter(({ apiStatus, roles, peerStatus }) => { + if (1 === roles || 4 === roles || 5 === roles) + return peerStatus?.isAvailable; + else if (3 === roles || 6 === roles || 7 === roles) + return apiStatus?.isAvailable || peerStatus?.isAvailable; + else + return apiStatus?.isAvailable; + }) + .map(nodeInfo => this.formatNodeInfo(nodeInfo)) + .sort((a, b) => a.friendlyName.localeCompare(b.friendlyName)); + } catch (e) { + console.error(e); + throw Error('Statistics service getNodes error'); + } + }; + + /** + * Format Available Node Peers dataset into Vue Component. + * @param {string} filter role filter. + * @returns {object} Node peers object for Vue component. + */ + static getAvailableNodeList = async filter => { + const availableNodes = await this.getAvailableNodes(); + + return { + data: availableNodes + .filter(el => !filter.rolesRaw || el.rolesRaw === filter.rolesRaw) + .map(el => { + let node = { + ...el + }; + + node['softwareVersion'] = { version: el.version }; + + if (el.apiStatus) { + const { + chainHeight, + finalization, + lastStatusCheck, + restVersion, + isHttpsEnabled + } = el.apiStatus; + + node['chainInfo'] = { + chainHeight, + finalizationHeight: finalization?.height, + lastStatusCheck + }; + + node['softwareVersion'] = { + ...node.softwareVersion, + restVersion, + isHttpsEnabled + }; + } else { + node['chainInfo'] = {}; + } + + if (node?.hostDetail) { + node = { ...node, ...node.hostDetail }; + delete node.hostDetail; + } + + return node; + }) + }; + }; + + static getNodeInfo = async publicKey => { try { - return await http.statisticServiceRestClient().getNodeStats(); + const node = await http.statisticServiceRestClient().getNode(publicKey); + const formattedNode = this.formatNodeInfo(node); + + if (formattedNode?.apiStatus) { + const { + finalization, + chainHeight, + lastStatusCheck, + nodeStatus, + isAvailable, + isHttpsEnabled, + restVersion + } = formattedNode.apiStatus; + + // Api status + formattedNode.apiStatus = { + connectionStatus: isAvailable, + databaseStatus: + 'up' === nodeStatus?.db || Constants.Message.UNAVAILABLE, + apiNodeStatus: + 'up' === nodeStatus?.apiNode || Constants.Message.UNAVAILABLE, + isHttpsEnabled, + restVersion, + lastStatusCheck: moment + .utc(lastStatusCheck) + .format('YYYY-MM-DD HH:mm:ss') + }; + + // Chain info + formattedNode.chainInfo = { + height: chainHeight, + finalizedHeight: finalization?.height, + finalizationEpoch: finalization?.epoch, + finalizationPoint: finalization?.point, + finalizedHash: finalization?.hash, + lastStatusCheck: moment + .utc(lastStatusCheck) + .format('YYYY-MM-DD HH:mm:ss') + }; + } else { + formattedNode.apiStatus = {}; + formattedNode.chainInfo = {}; + } + + if (formattedNode?.peerStatus) { + const { isAvailable, lastStatusCheck } = formattedNode.peerStatus; + + formattedNode.peerStatus = { + connectionStatus: isAvailable, + lastStatusCheck: moment + .utc(lastStatusCheck) + .format('YYYY-MM-DD HH:mm:ss') + }; + } else { + formattedNode.peerStatus = {}; + } + + return formattedNode; } catch (e) { - throw Error('Statistics service getNodeStats error: ', e); + console.error(e); + throw Error('Statistics service getNode error'); } - } + }; + + static getNodeStats = async () => { + const availableNodes = await this.getAvailableNodes(); + + let nodeTypes = {}; + + // 7 types of roles + Array.from(Array(7).keys()).map(index => { + Object.assign(nodeTypes, { + [index + 1]: availableNodes.filter(node => node.rolesRaw === index + 1) + .length + }); + }); + + return nodeTypes; + }; static getNodeHeightStats = async () => { try { @@ -213,20 +253,26 @@ class NodeService { return [ { name: 'Height', - data: data.height.map(el => ({ x: '' + parseInt(el.value), y: parseInt(el.count) })) + data: data.height.map(el => ({ + x: '' + parseInt(el.value), + y: parseInt(el.count) + })) }, { name: 'Finalized Height', - data: data.finalizedHeight.map(el => ({ x: '' + parseInt(el.value), y: parseInt(el.count) })) + data: data.finalizedHeight.map(el => ({ + x: '' + parseInt(el.value), + y: parseInt(el.count) + })) } ]; } catch (e) { throw Error('Statistics service getNodeHeightStats error: ', e); } - } + }; static getNodeListCSV = async filter => { - const nodes = await this.getNodePeerList(filter); + const nodes = await this.getActiveNodeList(filter); const formattedData = nodes.data.map((node, index) => ({ no: index + 1, @@ -243,33 +289,37 @@ class NodeService { })); return helper.convertArrayToCSV(formattedData); - } + }; /** - * Gets node list from statistics service. + * Gets node list from statistics service. * @param {string} filter (optional) 'preferred | suggested'. * @param {number} limit (optional) number of records. * @param {boolean} ssl (optional) return ssl ready node. - * @returns {array} nodes - */ - static getNodeList = async (filter, limit, ssl) => { - try { - return await http.statisticServiceRestClient().getNodes(filter, limit, ssl); - } catch (e) { - throw Error('Statistics service getNodeHeightStats error: ', e); - } - } - - /** - * Get API node list dataset into Vue Component. - * @returns {array} API Node list object for Vue component. - */ - static getAPINodeList = async () => { - // get 30 ssl ready nodes from statistics service the list - const nodes = await this.getNodeList('suggested', 30, true); - - return nodes.map(nodeInfo => this.formatNodeInfo(nodeInfo)).sort((a, b) => a.friendlyName.localeCompare(b.friendlyName)); - } + * @returns {array} nodes + */ + static getNodeList = async (filter, limit, ssl) => { + try { + return await http + .statisticServiceRestClient() + .getNodes(filter, limit, ssl); + } catch (e) { + throw Error('Statistics service getNodeHeightStats error: ', e); + } + }; + + /** + * Get API node list dataset into Vue Component. + * @returns {array} API Node list object for Vue component. + */ + static getAPINodeList = async () => { + // get 30 ssl ready nodes from statistics service the list + const nodes = await this.getNodeList('suggested', 30, true); + + return nodes + .map(nodeInfo => this.formatNodeInfo(nodeInfo)) + .sort((a, b) => a.friendlyName.localeCompare(b.friendlyName)); + }; } export default NodeService; diff --git a/src/infrastructure/ReceiptExtractor.js b/src/infrastructure/ReceiptExtractor.js index 8c06765d0..39fe19933 100644 --- a/src/infrastructure/ReceiptExtractor.js +++ b/src/infrastructure/ReceiptExtractor.js @@ -3,88 +3,100 @@ import helper from '../helper'; import { Mosaic, ReceiptType, MosaicId } from 'symbol-sdk'; class ReceiptExtractor { - static balanceChangeReceipt = async transactionStatement => { - let balanceChangeReceipt = []; - - const mosaics = transactionStatement.map(statement => new Mosaic(statement.mosaicId, statement.amount)); - - const { mosaicInfos, mosaicNames, unresolvedMosaicsMap } = await helper.getMosaicInfoAndNamespace(mosaics); - - for (const statement of transactionStatement) { - balanceChangeReceipt.push({ - ...statement, - height: statement.height.compact(), - receiptType: Constants.ReceiptType[statement.type], - targetAddress: statement.targetAddress.plain(), - mosaics: helper.mosaicsFieldObjectBuilder([ - new Mosaic( - new MosaicId(unresolvedMosaicsMap[statement.mosaicId.toHex()]), - statement.amount - ) - ], mosaicInfos, mosaicNames) - }); - } - - return balanceChangeReceipt; - } - - static balanceTransferReceipt = async transactionStatement => { - let balanceTransferReceipt = []; - - for (const statement of transactionStatement) { - const mosaic = new Mosaic(statement.mosaicId, statement.amount); - - balanceTransferReceipt.push({ - ...statement, - height: statement.height.compact(), - receiptType: Constants.ReceiptType[statement.type], - senderAddress: statement.senderAddress.address, - recipient: statement.recipientAddress.address, - mosaics: helper.mosaicsFieldObjectBuilder([mosaic]) - }); - } - - return balanceTransferReceipt; - } - - static inflationReceipt = async transactionStatement => { - let inflationReceipt = []; - - for (const statement of transactionStatement) { - const mosaic = new Mosaic(statement.mosaicId, statement.amount); - - inflationReceipt.push({ - ...statement, - height: statement.height.compact(), - receiptType: Constants.ReceiptType[statement.type], - mosaics: helper.mosaicsFieldObjectBuilder([mosaic]) - }); - } - - return inflationReceipt; - } - - static artifactExpiryReceipt = async transactionStatement => { - let artifactExpiryReceipt = []; - - for (const statement of transactionStatement) { - let artifactObj = { - ...statement, - height: statement.height.compact(), - receiptType: Constants.ReceiptType[statement.type], - artifactId: statement.artifactId.toHex() - }; - - if (ReceiptType.Mosaic_Expired === statement.type) - Object.assign(artifactObj, { mosaicArtifactId: statement.artifactId.toHex() }); - else if (ReceiptType.Namespace_Expired === statement.type || ReceiptType.Namespace_Deleted === statement.type) - Object.assign(artifactObj, { namespaceArtifactId: statement.artifactId.toHex() }); - - artifactExpiryReceipt.push(artifactObj); - } - - return artifactExpiryReceipt; - } + static balanceChangeReceipt = async transactionStatement => { + let balanceChangeReceipt = []; + + const mosaics = transactionStatement.map(statement => new Mosaic(statement.mosaicId, statement.amount)); + + const { mosaicInfos, mosaicNames, unresolvedMosaicsMap } = + await helper.getMosaicInfoAndNamespace(mosaics); + + for (const statement of transactionStatement) { + balanceChangeReceipt.push({ + ...statement, + height: statement.height.compact(), + receiptType: Constants.ReceiptType[statement.type], + targetAddress: statement.targetAddress.plain(), + mosaics: helper.mosaicsFieldObjectBuilder( + [ + new Mosaic( + new MosaicId(unresolvedMosaicsMap[statement.mosaicId.toHex()]), + statement.amount + ) + ], + mosaicInfos, + mosaicNames + ) + }); + } + + return balanceChangeReceipt; + }; + + static balanceTransferReceipt = async transactionStatement => { + let balanceTransferReceipt = []; + + for (const statement of transactionStatement) { + const mosaic = new Mosaic(statement.mosaicId, statement.amount); + + balanceTransferReceipt.push({ + ...statement, + height: statement.height.compact(), + receiptType: Constants.ReceiptType[statement.type], + senderAddress: statement.senderAddress.address, + recipient: statement.recipientAddress.address, + mosaics: helper.mosaicsFieldObjectBuilder([mosaic]) + }); + } + + return balanceTransferReceipt; + }; + + static inflationReceipt = async transactionStatement => { + let inflationReceipt = []; + + for (const statement of transactionStatement) { + const mosaic = new Mosaic(statement.mosaicId, statement.amount); + + inflationReceipt.push({ + ...statement, + height: statement.height.compact(), + receiptType: Constants.ReceiptType[statement.type], + mosaics: helper.mosaicsFieldObjectBuilder([mosaic]) + }); + } + + return inflationReceipt; + }; + + static artifactExpiryReceipt = async transactionStatement => { + let artifactExpiryReceipt = []; + + for (const statement of transactionStatement) { + let artifactObj = { + ...statement, + height: statement.height.compact(), + receiptType: Constants.ReceiptType[statement.type], + artifactId: statement.artifactId.toHex() + }; + + if (ReceiptType.Mosaic_Expired === statement.type) + {Object.assign(artifactObj, { + mosaicArtifactId: statement.artifactId.toHex() + });} + else if ( + ReceiptType.Namespace_Expired === statement.type || + ReceiptType.Namespace_Deleted === statement.type + ) + {Object.assign(artifactObj, { + namespaceArtifactId: statement.artifactId.toHex() + });} + + artifactExpiryReceipt.push(artifactObj); + } + + return artifactExpiryReceipt; + }; } export default ReceiptExtractor; diff --git a/src/infrastructure/ReceiptService.js b/src/infrastructure/ReceiptService.js index 21a032d2a..49c0c4e27 100644 --- a/src/infrastructure/ReceiptService.js +++ b/src/infrastructure/ReceiptService.js @@ -18,9 +18,7 @@ import http from './http'; import Constants from '../config/constants'; -import { - ReceiptExtractor -} from '../infrastructure'; +import { ReceiptExtractor } from '../infrastructure'; import { take, toArray } from 'rxjs/operators'; import { ReceiptType, ResolutionType } from 'symbol-sdk'; @@ -30,90 +28,100 @@ class ReceiptService { * @param {object} transactionStatementSearchCriteria Block Search Criteria. * @returns {object} formatted Receipts data with pagination info. */ - static searchReceipts = async transactionStatementSearchCriteria => { - const searchReceipts = await http.createRepositoryFactory.createReceiptRepository() - .searchReceipts(transactionStatementSearchCriteria) - .toPromise(); - - return { - ...searchReceipts, - data: this.transactionStatementBuilder(searchReceipts.data) - }; - } - - /** + static searchReceipts = async transactionStatementSearchCriteria => { + const searchReceipts = await http.createRepositoryFactory + .createReceiptRepository() + .searchReceipts(transactionStatementSearchCriteria) + .toPromise(); + + return { + ...searchReceipts, + data: this.transactionStatementBuilder(searchReceipts.data) + }; + }; + + /** * Gets a Address Resolution from searchCriteria. * @param {object} resolutionStatementSearchCriteria Block Search Criteria. * @returns {object} formatted address resolution data with pagination info. */ - static searchAddressResolutionStatements = async resolutionStatementSearchCriteria => { - const searchAddressResolutionStatements = await http.createRepositoryFactory.createReceiptRepository() - .searchAddressResolutionStatements(resolutionStatementSearchCriteria) - .toPromise(); - - return { - ...searchAddressResolutionStatements, - data: this.formatResolutionStatement(searchAddressResolutionStatements.data) - }; - } - - /** + static searchAddressResolutionStatements = + async resolutionStatementSearchCriteria => { + const searchAddressResolutionStatements = + await http.createRepositoryFactory + .createReceiptRepository() + .searchAddressResolutionStatements(resolutionStatementSearchCriteria) + .toPromise(); + + return { + ...searchAddressResolutionStatements, + data: this.formatResolutionStatement(searchAddressResolutionStatements.data) + }; + }; + + /** * Gets a Mosaic Resolution from searchCriteria. * @param {object} resolutionStatementSearchCriteria Block Search Criteria. * @returns {object} formatted mosaic resolution data with pagination info. */ - static searchMosaicResolutionStatements = async resolutionStatementSearchCriteria => { - const searchMosaicResolutionStatements = await http.createRepositoryFactory.createReceiptRepository() - .searchMosaicResolutionStatements(resolutionStatementSearchCriteria) - .toPromise(); - - return { - ...searchMosaicResolutionStatements, - data: this.formatResolutionStatement(searchMosaicResolutionStatements.data) - }; - } - - /** - * Gets a receipts from streamer. - * @param {object} searchCriteria - Search Criteria. - * @returns {array} formatted statementReceipt[] - */ - static streamerReceipts = async searchCriteria => { - const streamerReceipts = await http.transactionStatementPaginationStreamer() - .search(searchCriteria) - .pipe(take(10), toArray()) - .toPromise(); - - return this.transactionStatementBuilder(streamerReceipts); - } - - /** - * Gets a Address Resolution statement from streamer. - * @param {object} searchCriteria - Search Criteria. - * @returns {array} formatted statementAddressResolution[] - */ + static searchMosaicResolutionStatements = + async resolutionStatementSearchCriteria => { + const searchMosaicResolutionStatements = + await http.createRepositoryFactory + .createReceiptRepository() + .searchMosaicResolutionStatements(resolutionStatementSearchCriteria) + .toPromise(); + + return { + ...searchMosaicResolutionStatements, + data: this.formatResolutionStatement(searchMosaicResolutionStatements.data) + }; + }; + + /** + * Gets a receipts from streamer. + * @param {object} searchCriteria - Search Criteria. + * @returns {array} formatted statementReceipt[] + */ + static streamerReceipts = async searchCriteria => { + const streamerReceipts = await http + .transactionStatementPaginationStreamer() + .search(searchCriteria) + .pipe(take(10), toArray()) + .toPromise(); + + return this.transactionStatementBuilder(streamerReceipts); + }; + + /** + * Gets a Address Resolution statement from streamer. + * @param {object} searchCriteria - Search Criteria. + * @returns {array} formatted statementAddressResolution[] + */ static streamerAddressResolution = async searchCriteria => { - const streamerAddressResolution = await http.addressResolutionStatementPaginationStreamer() + const streamerAddressResolution = await http + .addressResolutionStatementPaginationStreamer() .search(searchCriteria) .pipe(take(10), toArray()) .toPromise(); return this.formatResolutionStatement(streamerAddressResolution); - } + }; - /** - * Gets a Mosaic Resolution statement from streamer. - * @param {object} searchCriteria - Search Criteria. - * @returns {array} formatted statementMosaicResolution[] - */ + /** + * Gets a Mosaic Resolution statement from streamer. + * @param {object} searchCriteria - Search Criteria. + * @returns {array} formatted statementMosaicResolution[] + */ static streamerMosaicResolution = async searchCriteria => { - const streamerMosaicResolution = await http.mosaicResolutionStatementPaginationStreamer() + const streamerMosaicResolution = await http + .mosaicResolutionStatementPaginationStreamer() .search(searchCriteria) .pipe(take(10), toArray()) .toPromise(); return this.formatResolutionStatement(streamerMosaicResolution); - } + }; static createReceiptTransactionStatement = async transactionStatement => { const { receiptTransactionStatementType } = transactionStatement; @@ -127,128 +135,133 @@ class ReceiptService { case Constants.ReceiptTransactionStatementType.InflationReceipt: return ReceiptExtractor.inflationReceipt(transactionStatement.data); default: - throw new Error('Unimplemented receipt transaction statement with type ' + receiptTransactionStatementType); + throw new Error('Unimplemented receipt transaction statement with type ' + + receiptTransactionStatementType); } + }; + + /** + * Format Receipt Statements. + * @param {array} transactionStatement - List of transaction statement. + * @returns {object} collection of receipts + * + */ + static groupTransactionStatement = transactionStatement => { + let balanceChangeReceipt = []; + + let balanceTransferReceipt = []; + + let inflationReceipt = []; + + let artifactExpiryReceipt = []; + + transactionStatement.forEach(statement => { + statement.receipts.forEach(receipt => { + switch (receipt.type) { + case ReceiptType.Harvest_Fee: + case ReceiptType.LockHash_Created: + case ReceiptType.LockHash_Completed: + case ReceiptType.LockHash_Expired: + case ReceiptType.LockSecret_Created: + case ReceiptType.LockSecret_Completed: + case ReceiptType.LockSecret_Expired: + balanceChangeReceipt.push({ + ...receipt, + height: statement.height + }); + break; + case ReceiptType.Mosaic_Rental_Fee: + case ReceiptType.Namespace_Rental_Fee: + balanceTransferReceipt.push({ + ...receipt, + height: statement.height + }); + break; + case ReceiptType.Mosaic_Expired: + case ReceiptType.Namespace_Expired: + case ReceiptType.Namespace_Deleted: + artifactExpiryReceipt.push({ + ...receipt, + height: statement.height + }); + break; + case ReceiptType.Inflation: + inflationReceipt.push({ + ...receipt, + height: statement.height + }); + break; + } + }); + }); + + return { + balanceChangeReceipt, + balanceTransferReceipt, + inflationReceipt, + artifactExpiryReceipt + }; + }; + + static transactionStatementBuilder(transactionStatement) { + const { + balanceChangeReceipt, + balanceTransferReceipt, + inflationReceipt, + artifactExpiryReceipt + } = this.groupTransactionStatement(transactionStatement); + + return { + balanceChangeStatement: { + receiptTransactionStatementType: + Constants.ReceiptTransactionStatementType.BalanceChangeReceipt, + data: balanceChangeReceipt + }, + balanceTransferStatement: { + receiptTransactionStatementType: + Constants.ReceiptTransactionStatementType.BalanceTransferReceipt, + data: balanceTransferReceipt + }, + inflationStatement: { + receiptTransactionStatementType: + Constants.ReceiptTransactionStatementType.InflationReceipt, + data: inflationReceipt + }, + artifactExpiryStatement: { + receiptTransactionStatementType: + Constants.ReceiptTransactionStatementType.ArtifactExpiryReceipt, + data: artifactExpiryReceipt + } + }; } - /** - * Format Receipt Statements. - * @param {array} transactionStatement - List of transaction statement. - * @returns {object} collection of receipts - * - */ - static groupTransactionStatement = transactionStatement => { - let balanceChangeReceipt = []; - - let balanceTransferReceipt = []; - - let inflationReceipt = []; - - let artifactExpiryReceipt = []; - - transactionStatement.forEach(statement => { - statement.receipts.forEach(receipt => { - switch (receipt.type) { - case ReceiptType.Harvest_Fee: - case ReceiptType.LockHash_Created: - case ReceiptType.LockHash_Completed: - case ReceiptType.LockHash_Expired: - case ReceiptType.LockSecret_Created: - case ReceiptType.LockSecret_Completed: - case ReceiptType.LockSecret_Expired: - balanceChangeReceipt.push({ - ...receipt, - height: statement.height - }); - break; - case ReceiptType.Mosaic_Rental_Fee: - case ReceiptType.Namespace_Rental_Fee: - balanceTransferReceipt.push({ - ...receipt, - height: statement.height - }); - break; - case ReceiptType.Mosaic_Expired: - case ReceiptType.Namespace_Expired: - case ReceiptType.Namespace_Deleted: - artifactExpiryReceipt.push({ - ...receipt, - height: statement.height - }); - break; - case ReceiptType.Inflation: - inflationReceipt.push({ - ...receipt, - height: statement.height - }); - break; - } - }); - }); - - return { - balanceChangeReceipt, - balanceTransferReceipt, - inflationReceipt, - artifactExpiryReceipt - }; - } - - static transactionStatementBuilder (transactionStatement) { - const { - balanceChangeReceipt, - balanceTransferReceipt, - inflationReceipt, - artifactExpiryReceipt - } = this.groupTransactionStatement(transactionStatement); - - return { - balanceChangeStatement: { - receiptTransactionStatementType: Constants.ReceiptTransactionStatementType.BalanceChangeReceipt, - data: balanceChangeReceipt - }, - balanceTransferStatement: { - receiptTransactionStatementType: Constants.ReceiptTransactionStatementType.BalanceTransferReceipt, - data: balanceTransferReceipt - }, - inflationStatement: { - receiptTransactionStatementType: Constants.ReceiptTransactionStatementType.InflationReceipt, - data: inflationReceipt - }, - artifactExpiryStatement: { - receiptTransactionStatementType: Constants.ReceiptTransactionStatementType.ArtifactExpiryReceipt, - data: artifactExpiryReceipt - } - }; - } - - /** - * Format Resolution Statements - * @param {array} resolutionStatement - list of resolution statement. - * @returns {object} Address Resolution | Mosaic Resolution - */ - static formatResolutionStatement = resolutionStatement => { - return resolutionStatement.map(statement => { - if (statement.resolutionType === ResolutionType.Address) { - return { - ...statement, - height: statement.height.compact(), - resolutionType: Constants.ResolutionType[statement.resolutionType], - unresolved: statement.unresolved.toHex(), - addressResolutionEntries: statement.resolutionEntries.map(resolutionEntry => resolutionEntry.resolved.address) - }; - } - - if (statement.resolutionType === ResolutionType.Mosaic) { - return { - ...statement, - resolutionType: Constants.ResolutionType[statement.resolutionType], - unresolved: statement.unresolved.toHex(), - mosaicResolutionEntries: statement.resolutionEntries.map(resolutionEntry => resolutionEntry.resolved.toHex()) - }; - } - }); - } + /** + * Format Resolution Statements + * @param {array} resolutionStatement - list of resolution statement. + * @returns {object} Address Resolution | Mosaic Resolution + */ + static formatResolutionStatement = resolutionStatement => { + return resolutionStatement.map(statement => { + if (statement.resolutionType === ResolutionType.Address) { + return { + ...statement, + height: statement.height.compact(), + resolutionType: Constants.ResolutionType[statement.resolutionType], + unresolved: statement.unresolved.toHex(), + addressResolutionEntries: statement.resolutionEntries.map(resolutionEntry => resolutionEntry.resolved.address) + }; + } + + if (statement.resolutionType === ResolutionType.Mosaic) { + return { + ...statement, + resolutionType: Constants.ResolutionType[statement.resolutionType], + unresolved: statement.unresolved.toHex(), + mosaicResolutionEntries: statement.resolutionEntries.map(resolutionEntry => resolutionEntry.resolved.toHex()) + }; + } + }); + }; } export default ReceiptService; diff --git a/src/infrastructure/RestrictionService.js b/src/infrastructure/RestrictionService.js index 7576bd45e..52aaadf79 100644 --- a/src/infrastructure/RestrictionService.js +++ b/src/infrastructure/RestrictionService.js @@ -13,174 +13,194 @@ import { } from 'symbol-sdk'; class RestrictionService { - /** - * Get Account Restriction from symbol SDK - * @param {string} address - Account address to be created from PublicKey or RawAddress - * @returns {array} AccountRestrictions[] - */ - static getAccountRestrictions = async address => { - let accountRestrictions; - - try { - accountRestrictions = await http.createRepositoryFactory.createRestrictionAccountRepository() - .getAccountRestrictions(Address.createFromRawAddress(address)) - .toPromise(); - } catch (e) { - // To catch statusCode 404 - throw Error('Account restrictions are not available.'); - } - - return accountRestrictions.restrictions.map(restriction => this.formatAccountRestriction(restriction)); - } - - /** - * Gets a mosaic restrictions list from searchCriteria - * @param {object} restrictionMosaicSearchCriteria Object of Search Criteria - * @returns {object} formatted namespace data with pagination info - */ - static searchMosaicRestrictions = async restrictionMosaicSearchCriteria => { - const searchMosaicRestrictions = await http.createRepositoryFactory.createRestrictionMosaicRepository() - .search(restrictionMosaicSearchCriteria) - .toPromise(); - - return { - ...searchMosaicRestrictions, - data: searchMosaicRestrictions.data.map(mosaicRestriction => { - if (mosaicRestriction instanceof MosaicAddressRestriction) - return this.formatMosaicAddressRestriction(mosaicRestriction); - - if (mosaicRestriction instanceof MosaicGlobalRestriction) - return this.formatMosaicGlobalRestriction(mosaicRestriction); - }) - }; - } - - /** - * Format AccountRestriction to readable object. - * @param {object} accountRestriction account restriction dto. - * @returns {object} readable AccountRestriction object. - */ - static formatAccountRestriction = accountRestriction => { - switch (accountRestriction.restrictionFlags) { - case AddressRestrictionFlag.AllowIncomingAddress: - case AddressRestrictionFlag.BlockIncomingAddress: - case AddressRestrictionFlag.AllowOutgoingAddress: - case AddressRestrictionFlag.BlockOutgoingAddress: - return { - restrictionType: Constants.AddressRestrictionFlag[accountRestriction.restrictionFlags], - restrictionAddressValues: accountRestriction.values.map(value => value.address) - }; - case MosaicRestrictionFlag.AllowMosaic: - case MosaicRestrictionFlag.BlockMosaic: - return { - restrictionType: Constants.MosaicRestrictionFlag[accountRestriction.restrictionFlags], - restrictionMosaicValues: accountRestriction.values.map(value => value.id.toHex()) - }; - case OperationRestrictionFlag.AllowOutgoingTransactionType: - case OperationRestrictionFlag.BlockOutgoingTransactionType: - return { - restrictionType: Constants.OperationRestrictionFlag[accountRestriction.restrictionFlags], - restrictionTransactionValues: accountRestriction.values.map(value => Constants.TransactionType[value]) - }; - } - } - - /** - * Format MosaicGlobalRestrictions to readable object. - * @param {object} mosaicRestriction mosaic global restriction dto. - * @returns {object } readable MosaicGlobalRestrictions object. - */ - static formatMosaicGlobalRestriction = mosaicRestriction => { - return { - ...mosaicRestriction, - entryType: Constants.MosaicRestrictionEntryType[mosaicRestriction.entryType], - mosaicId: mosaicRestriction.mosaicId.toHex(), - restrictions: mosaicRestriction.restrictions.map(item => ({ - restrictionKey: item.key.toString(), - restrictionType: Constants.MosaicRestrictionType[item.restrictionType], - restrictionValue: item.restrictionValue.toString(), - referenceMosaicId: '0000000000000000' === item.referenceMosaicId.toHex() - ? mosaicRestriction.mosaicId.toHex() - : item.referenceMosaicId.toHex() - })) - }; - } - - /** - * Format MosaicAddressRestriction to readable object. - * @param {object} addressRestriction address restriction dto. - * @returns {object} Custom address restriction object - */ - static formatMosaicAddressRestriction = addressRestriction => { - return { - ...addressRestriction, - entryType: Constants.MosaicRestrictionEntryType[addressRestriction.entryType], - mosaicId: addressRestriction.mosaicId.toHex(), - targetAddress: addressRestriction.targetAddress.address, - restrictions: addressRestriction.restrictions.map(item => ({ - restrictionKey: item.key.toString(), - restrictionValue: item.restrictionValue.toString() - })) - }; - } - - /** - * Format Account Restriction list dataset into Vue component - * @param {string} address - Address in string format. - * @returns {array} Account Restriction list - */ - static getAccountRestrictionList = async address => { - const accountRestrictions = await this.getAccountRestrictions(address); - - return accountRestrictions; - } - - /** - * Gets Mosaic Restriction list dataset into Vue component - * @param {object} pageInfo - page info such as pageNumber, pageSize - * @param {object} filterValue - search criteria eg. mosaic global or mosaic address - * @param {string} hexOrNamespace - hex value or namespace name - * @returns {array} formatted mosaic restriction list - */ - static getMosaicRestrictionList = async (pageInfo, filterValue, hexOrNamespace) => { - const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); - - const { pageNumber, pageSize } = pageInfo; - - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - mosaicId: mosaicId, - ...filterValue - }; - - const mosaicRestrictions = await this.searchMosaicRestrictions(searchCriteria); - - return mosaicRestrictions; - } - - /** - * Gets Mosaic Address Restriction list dataset into Vue component - * @param {object} pageInfo - object for page info such as pageNumber, pageSize - * @param {string} address - account Address - * @returns {array} formatted mosaic address restriction list - */ - static getMosaicAddressRestrictionList = async (pageInfo, address) => { - const { pageNumber, pageSize } = pageInfo; - - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - entryType: MosaicRestrictionEntryType.ADDRESS, - targetAddress: Address.createFromRawAddress(address) - }; - - const addressRestrictions = await this.searchMosaicRestrictions(searchCriteria); - - return addressRestrictions; - } + /** + * Get Account Restriction from symbol SDK + * @param {string} address - Account address to be created from PublicKey or RawAddress + * @returns {array} AccountRestrictions[] + */ + static getAccountRestrictions = async address => { + let accountRestrictions; + + try { + accountRestrictions = await http.createRepositoryFactory + .createRestrictionAccountRepository() + .getAccountRestrictions(Address.createFromRawAddress(address)) + .toPromise(); + } catch (e) { + // To catch statusCode 404 + throw Error('Account restrictions are not available.'); + } + + return accountRestrictions.restrictions.map(restriction => + this.formatAccountRestriction(restriction)); + }; + + /** + * Gets a mosaic restrictions list from searchCriteria + * @param {object} restrictionMosaicSearchCriteria Object of Search Criteria + * @returns {object} formatted namespace data with pagination info + */ + static searchMosaicRestrictions = async restrictionMosaicSearchCriteria => { + const searchMosaicRestrictions = await http.createRepositoryFactory + .createRestrictionMosaicRepository() + .search(restrictionMosaicSearchCriteria) + .toPromise(); + + return { + ...searchMosaicRestrictions, + data: searchMosaicRestrictions.data.map(mosaicRestriction => { + if (mosaicRestriction instanceof MosaicAddressRestriction) + return this.formatMosaicAddressRestriction(mosaicRestriction); + + if (mosaicRestriction instanceof MosaicGlobalRestriction) + return this.formatMosaicGlobalRestriction(mosaicRestriction); + }) + }; + }; + + /** + * Format AccountRestriction to readable object. + * @param {object} accountRestriction account restriction dto. + * @returns {object} readable AccountRestriction object. + */ + static formatAccountRestriction = accountRestriction => { + switch (accountRestriction.restrictionFlags) { + case AddressRestrictionFlag.AllowIncomingAddress: + case AddressRestrictionFlag.BlockIncomingAddress: + case AddressRestrictionFlag.AllowOutgoingAddress: + case AddressRestrictionFlag.BlockOutgoingAddress: + return { + restrictionType: + Constants.AddressRestrictionFlag[ + accountRestriction.restrictionFlags + ], + restrictionAddressValues: accountRestriction.values.map(value => value.address) + }; + case MosaicRestrictionFlag.AllowMosaic: + case MosaicRestrictionFlag.BlockMosaic: + return { + restrictionType: + Constants.MosaicRestrictionFlag[ + accountRestriction.restrictionFlags + ], + restrictionMosaicValues: accountRestriction.values.map(value => + value.id.toHex()) + }; + case OperationRestrictionFlag.AllowOutgoingTransactionType: + case OperationRestrictionFlag.BlockOutgoingTransactionType: + return { + restrictionType: + Constants.OperationRestrictionFlag[ + accountRestriction.restrictionFlags + ], + restrictionTransactionValues: accountRestriction.values.map(value => Constants.TransactionType[value]) + }; + } + }; + + /** + * Format MosaicGlobalRestrictions to readable object. + * @param {object} mosaicRestriction mosaic global restriction dto. + * @returns {object } readable MosaicGlobalRestrictions object. + */ + static formatMosaicGlobalRestriction = mosaicRestriction => { + return { + ...mosaicRestriction, + entryType: + Constants.MosaicRestrictionEntryType[mosaicRestriction.entryType], + mosaicId: mosaicRestriction.mosaicId.toHex(), + restrictions: mosaicRestriction.restrictions.map(item => ({ + restrictionKey: item.key.toString(), + restrictionType: Constants.MosaicRestrictionType[item.restrictionType], + restrictionValue: item.restrictionValue.toString(), + referenceMosaicId: + '0000000000000000' === item.referenceMosaicId.toHex() + ? mosaicRestriction.mosaicId.toHex() + : item.referenceMosaicId.toHex() + })) + }; + }; + + /** + * Format MosaicAddressRestriction to readable object. + * @param {object} addressRestriction address restriction dto. + * @returns {object} Custom address restriction object + */ + static formatMosaicAddressRestriction = addressRestriction => { + return { + ...addressRestriction, + entryType: + Constants.MosaicRestrictionEntryType[addressRestriction.entryType], + mosaicId: addressRestriction.mosaicId.toHex(), + targetAddress: addressRestriction.targetAddress.address, + restrictions: addressRestriction.restrictions.map(item => ({ + restrictionKey: item.key.toString(), + restrictionValue: item.restrictionValue.toString() + })) + }; + }; + + /** + * Format Account Restriction list dataset into Vue component + * @param {string} address - Address in string format. + * @returns {array} Account Restriction list + */ + static getAccountRestrictionList = async address => { + const accountRestrictions = await this.getAccountRestrictions(address); + + return accountRestrictions; + }; + + /** + * Gets Mosaic Restriction list dataset into Vue component + * @param {object} pageInfo - page info such as pageNumber, pageSize + * @param {object} filterValue - search criteria eg. mosaic global or mosaic address + * @param {string} hexOrNamespace - hex value or namespace name + * @returns {array} formatted mosaic restriction list + */ + static getMosaicRestrictionList = async ( + pageInfo, + filterValue, + hexOrNamespace + ) => { + const mosaicId = await helper.hexOrNamespaceToId(hexOrNamespace, 'mosaic'); + + const { pageNumber, pageSize } = pageInfo; + + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + mosaicId: mosaicId, + ...filterValue + }; + + const mosaicRestrictions = await this.searchMosaicRestrictions(searchCriteria); + + return mosaicRestrictions; + }; + + /** + * Gets Mosaic Address Restriction list dataset into Vue component + * @param {object} pageInfo - object for page info such as pageNumber, pageSize + * @param {string} address - account Address + * @returns {array} formatted mosaic address restriction list + */ + static getMosaicAddressRestrictionList = async (pageInfo, address) => { + const { pageNumber, pageSize } = pageInfo; + + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + entryType: MosaicRestrictionEntryType.ADDRESS, + targetAddress: Address.createFromRawAddress(address) + }; + + const addressRestrictions = await this.searchMosaicRestrictions(searchCriteria); + + return addressRestrictions; + }; } export default RestrictionService; diff --git a/src/infrastructure/TransactionService.js b/src/infrastructure/TransactionService.js index bba5fb0fe..a1faafe15 100644 --- a/src/infrastructure/TransactionService.js +++ b/src/infrastructure/TransactionService.js @@ -19,10 +19,7 @@ import http from './http'; import Constants from '../config/constants'; import helper from '../helper'; -import { - LockService, - CreateTransaction -} from '../infrastructure'; +import { LockService, CreateTransaction } from '../infrastructure'; import { toArray } from 'rxjs/operators'; import { TransactionType, @@ -35,722 +32,766 @@ import { } from 'symbol-sdk'; class TransactionService { - /** - * Gets a transaction status for a transaction hash - * @param {string} hash Transaction hash - * @returns {object} TransactionStatus object - */ - static getTransactionStatus = hash => { - return new Promise((resolve, reject) => { - let transactionStatus = { - message: null, - detail: {} - }; - - http.createRepositoryFactory.createTransactionStatusRepository() - .getTransactionStatus(hash) - .toPromise() - .then(response => { - transactionStatus.message = response.group; - transactionStatus.detail = response; - resolve(transactionStatus); - }) - .catch(error => { - // handle REST error https://github.com/nemtech/catapult-rest/pull/499 - // Todo: Remove if statement, after REST error is fix. - if (-1 === error.message.search('statusCode')) { - transactionStatus.message = error.message; - transactionStatus.detail = error; - resolve(transactionStatus); - } - resolve(transactionStatus); - }); - }); - } - - /** - * Gets a transaction from hash. - * @param {string} hash Transaction hash. - * @param {string} transactionGroup transaction status. - * @returns {object} Transaction. - */ - static getTransaction = async (hash, transactionGroup) => { - const transaction = await http.createRepositoryFactory.createTransactionRepository() - .getTransaction(hash, transactionGroup) - .toPromise(); - - return transaction; - } - - /** - * Gets a transaction from searchCriteria - * @param {object} transactionSearchCriteria Object of Search Criteria - * @returns {object} transaction data with pagination info - */ - static searchTransactions = async transactionSearchCriteria => { - const searchTransactions = await http.createRepositoryFactory.createTransactionRepository() - .search(transactionSearchCriteria) - .toPromise(); - - return searchTransactions; - } - - /** - * Gets a transactions from streamer - * @param {object} transactionSearchCriteria Object of Search Criteria - * @returns {array} Transaction[] - */ - static streamerTransactions = async transactionSearchCriteria => { - const streamerTransactions = await http.transactionPaginationStreamer - .search(transactionSearchCriteria).pipe(toArray()) - .toPromise(); - - return streamerTransactions; - } - - /** - * Gets Formatted Transaction Info for Vue component - * @param {string} hash Transaction hash - * @returns {object} Custom Transaction object - */ - static getTransactionInfo = async hash => { - const transactionStatus = await this.getTransactionStatus(hash); - const transactionGroup = transactionStatus.message; - const transaction = await this.getTransaction(hash, transactionGroup); - - const {maxFee, ...formattedTransaction} = await this.createTransactionFromSDK(transaction); - - const transactionInfo = { - ...formattedTransaction, - blockHeight: formattedTransaction.transactionInfo.height || undefined, - transactionHash: formattedTransaction.transactionInfo.hash, - timestamp: formattedTransaction.transactionInfo.timestamp | null, - status: transactionStatus.detail.code, - confirm: transactionStatus.message - }; - - // Display max fees if unconfirmed or partial transaction - if (0 === formattedTransaction.transactionInfo.height) { - Object.assign(transactionInfo, { - maxFee - }); - } else { - Object.assign(transactionInfo, { - effectiveFee: helper.toNetworkCurrency(formattedTransaction.payloadSize * formattedTransaction.transactionInfo.feeMultiplier) - }); - } - - return transactionInfo; - } - - /** - * Gets Formatted Hash Lock Info for Vue component - * @param {string} hash Transaction hash - * @returns {object} Custom Hash Lock object - */ - static getHashLockInfo = async hash => { - const hashInfo = await LockService.getHashLock(hash); - - const mosaics = [new Mosaic(hashInfo.mosaicId, hashInfo.amount)]; - - const mosaicsFieldObject = helper.mosaicsFieldObjectBuilder(mosaics); - - return { - ...hashInfo, - mosaics: mosaicsFieldObject - }; - } - - /** - * Gets array of transactions - * @param {object} pageInfo - object for page info such as pageNumber, pageSize - * @param {object} filterValue - object for search criteria - * @returns {array} Formatted transactionDTO[] - */ - static getTransactionList = async (pageInfo, filterValue) => { - const { pageNumber, pageSize } = pageInfo; - const searchCriteria = { - pageNumber, - pageSize, - order: Order.Desc, - type: [], - group: TransactionGroup.Confirmed, - ...filterValue - }; - - const searchTransactions = await this.searchTransactions(searchCriteria); - - const transactions = { - ...searchTransactions, - data: searchTransactions.data.map(transaction => this.formatTransaction(transaction)) - }; - - await Promise.all(transactions.data.map(async transaction => { - if (transaction?.recipientAddress) { - const { recipientAddress, transactionBody, transactionInfo } = transaction; - - return (transactionBody.recipient = await helper.resolvedAddress(recipientAddress, transactionInfo.height)); - } - })); - - if (searchCriteria.group === TransactionGroup.Partial || searchCriteria.group === TransactionGroup.Unconfirmed) { - return { - ...transactions, - data: transactions.data.map(transaction => ({ - ...transaction, - transactionHash: transaction.transactionInfo.hash, - transactionType: transaction.type, - recipient: transaction.transactionBody?.recipient, - extendGraphicValue: this.extendGraphicValue(transaction) - })) - }; - } - - // Cap data in 50 pages - const totalRecords = 50 * pageSize; - - return { - ...transactions, - totalRecords, - data: transactions.data.map(({ deadline, maxFee, ...transaction }) => ({ - ...transaction, - effectiveFee: helper.toNetworkCurrency(transaction.payloadSize * transaction.transactionInfo.feeMultiplier), - age: helper.convertTimestampToDate(transaction.transactionInfo.timestamp), - height: transaction.transactionInfo.height, - transactionHash: transaction.transactionInfo.hash, - transactionType: transaction.type, - recipient: transaction.transactionBody?.recipient, - extendGraphicValue: this.extendGraphicValue(transaction) - })) - }; - } - - /** - * Format Transaction - * @param {object} transaction transaction object from endpoint. - * @returns {object} readable transactionDTO object. - */ - static formatTransaction = transaction => ({ - ...transaction, - deadline: helper.networkTimestamp(transaction.deadline.adjustedValue), - maxFee: helper.toNetworkCurrency(Number(transaction.maxFee.toString())), - signer: transaction.signer.address.plain(), - transactionBody: this.formatTransactionBody(transaction), - transactionInfo: this.formatTransactionInfo(transaction.transactionInfo) - }) - - /** - * Format Different Type of Transaction such as TransferTransaction - * @param {object} transactionBody transaction body info. - * @returns {object} readable TransactionBody object - */ - static formatTransactionBody = transactionBody => { - switch (transactionBody.type) { - case TransactionType.TRANSFER: - return { - transactionType: transactionBody.type, - recipient: transactionBody.recipientAddress, - mosaics: transactionBody.mosaics.map(mosaic => ({ - ...mosaic, - id: mosaic.id.toHex(), - amount: mosaic.amount.compact().toString() - })), - message: transactionBody.message - }; - - case TransactionType.NAMESPACE_REGISTRATION: - let parentIdHex = transactionBody.parentId ? transactionBody.parentId.toHex() : ''; - - let duration = transactionBody.duration ? transactionBody.duration.compact() : 0; - - return { - transactionType: transactionBody.type, - recipient: http.networkConfig.NamespaceRentalFeeSinkAddress.address, - registrationType: Constants.NamespaceRegistrationType[transactionBody.registrationType], - namespaceName: transactionBody.namespaceName, - namespaceId: transactionBody.namespaceId.toHex(), - parentId: '' === parentIdHex ? Constants.Message.UNAVAILABLE : parentIdHex, - duration: 0 === duration ? Constants.Message.UNLIMITED : duration - }; - - case TransactionType.ADDRESS_ALIAS: - return { - transactionType: transactionBody.type, - aliasAction: Constants.AliasAction[transactionBody.aliasAction], - namespaceId: transactionBody.namespaceId.toHex(), - namespaceName: transactionBody.namespaceId.fullName, - address: transactionBody.address.address - }; - - case TransactionType.MOSAIC_ALIAS: - return { - transactionType: transactionBody.type, - aliasAction: Constants.AliasAction[transactionBody.aliasAction], - namespaceId: transactionBody.namespaceId.id.toHex(), - namespaceName: transactionBody.namespaceId.fullName, - mosaicId: transactionBody.mosaicId.id.toHex() - }; - - case TransactionType.MOSAIC_DEFINITION: - return { - transactionType: transactionBody.type, - recipient: http.networkConfig.MosaicRentalSinkAddress.address, - mosaicId: transactionBody.mosaicId.toHex(), - divisibility: transactionBody.divisibility, - duration: transactionBody.duration.compact(), - nonce: transactionBody.nonce.toHex(), - supplyMutable: transactionBody.flags.supplyMutable, - transferable: transactionBody.flags.transferable, - restrictable: transactionBody.flags.restrictable, - revokable: transactionBody.flags.revokable - }; - - case TransactionType.MOSAIC_SUPPLY_CHANGE: - return { - transactionType: transactionBody.type, - mosaicId: transactionBody.mosaicId.id.toHex(), - action: Constants.MosaicSupplyChangeAction[transactionBody.action], - delta: transactionBody.delta.compact() - }; - case TransactionType.MOSAIC_SUPPLY_REVOCATION: - return { - transactionType: transactionBody.type, - address: transactionBody.sourceAddress.address, - mosaics: [{ - id: transactionBody.mosaic.id.toHex(), - amount: transactionBody.mosaic.amount.compact().toString() - }] - }; - - case TransactionType.MULTISIG_ACCOUNT_MODIFICATION: - return { - transactionType: transactionBody.type, - minApprovalDelta: transactionBody.minApprovalDelta, - minRemovalDelta: transactionBody.minRemovalDelta, - addressAdditions: transactionBody.addressAdditions.map(address => address.address), - addressDeletions: transactionBody.addressDeletions.map(address => address.address) - }; - - case TransactionType.AGGREGATE_COMPLETE: - return { - transactionType: transactionBody.type, - innerTransactions: transactionBody.innerTransactions, - cosignatures: transactionBody.cosignatures.map(cosigner => ({ - ...cosigner, - signer: cosigner.signer.address.address - })) - }; - - case TransactionType.AGGREGATE_BONDED: - return { - transactionType: transactionBody.type, - innerTransactions: transactionBody.innerTransactions, - cosignatures: transactionBody.cosignatures.map(cosigner => ({ - ...cosigner, - signer: cosigner.signer.address.address - })) - }; - - case TransactionType.HASH_LOCK: - return { - transactionType: transactionBody.type, - duration: transactionBody.duration.compact(), - mosaicId: transactionBody.mosaic.id.toHex(), - amount: helper.toNetworkCurrency(transactionBody.mosaic.amount), - hash: transactionBody.hash - }; - - case TransactionType.SECRET_LOCK: - return { - transactionType: transactionBody.type, - duration: transactionBody.duration.compact(), - mosaicId: transactionBody.mosaic.id.toHex(), - amount: helper.toNetworkCurrency(transactionBody.mosaic.amount), - secret: transactionBody.secret, - recipient: transactionBody.recipientAddress, - hashAlgorithm: Constants.LockHashAlgorithm[transactionBody.hashAlgorithm] - }; - - case TransactionType.SECRET_PROOF: - return { - transactionType: transactionBody.type, - hashAlgorithm: Constants.LockHashAlgorithm[transactionBody.hashAlgorithm], - recipient: transactionBody.recipientAddress, - secret: transactionBody.secret, - proof: transactionBody.proof - }; - case TransactionType.ACCOUNT_ADDRESS_RESTRICTION: - return { - transactionType: transactionBody.type, - restrictionType: Constants.AddressRestrictionFlag[transactionBody.restrictionFlags], - restrictionAddressAdditions: transactionBody.restrictionAdditions.map(restriction => { - if (restriction instanceof Address) - return restriction.address; - - return restriction.fullName; - }), - restrictionAddressDeletions: transactionBody.restrictionDeletions.map(restriction => { - if (restriction instanceof Address) - return restriction.address; - - return restriction.fullName; - }) - }; - - case TransactionType.ACCOUNT_MOSAIC_RESTRICTION: - return { - transactionType: transactionBody.type, - restrictionType: Constants.MosaicRestrictionFlag[transactionBody.restrictionFlags], - restrictionMosaicAdditions: transactionBody.restrictionAdditions.map(mosaic => mosaic.id.toHex()), - restrictionMosaicDeletions: transactionBody.restrictionDeletions.map(mosaic => mosaic.id.toHex()) - }; - - case TransactionType.ACCOUNT_OPERATION_RESTRICTION: - return { - transactionType: transactionBody.type, - restrictionType: Constants.OperationRestrictionFlag[transactionBody.restrictionFlags], - restrictionOperationAdditions: transactionBody.restrictionAdditions, - restrictionOperationDeletions: transactionBody.restrictionDeletions - }; - - case TransactionType.MOSAIC_ADDRESS_RESTRICTION: - return { - transactionType: transactionBody.type, - mosaicId: transactionBody.mosaicId.toHex(), - targetAddress: transactionBody.targetAddress, - restrictionKey: transactionBody.restrictionKey.toHex(), - previousRestrictionValue: transactionBody.previousRestrictionValue.toString(), - newRestrictionValue: transactionBody.newRestrictionValue.toString() - }; - - case TransactionType.MOSAIC_GLOBAL_RESTRICTION: - return { - transactionType: transactionBody.type, - referenceMosaicId: '0000000000000000' === transactionBody.referenceMosaicId.toHex() - ? transactionBody.mosaicId.toHex() - : transactionBody.referenceMosaicId.toHex(), - restrictionKey: transactionBody.restrictionKey.toHex(), - previousRestrictionType: Constants.MosaicRestrictionType[transactionBody.previousRestrictionType], - previousRestrictionValue: transactionBody.previousRestrictionValue.compact(), - newRestrictionType: Constants.MosaicRestrictionType[transactionBody.newRestrictionType], - newRestrictionValue: transactionBody.newRestrictionValue.compact() - }; - - case TransactionType.ACCOUNT_METADATA: - return { - transactionType: transactionBody.type, - scopedMetadataKey: transactionBody.scopedMetadataKey.toHex(), - targetAddress: transactionBody.targetAddress.address, - metadataValue: transactionBody.value, - valueSizeDelta: transactionBody.valueSizeDelta - }; - - case TransactionType.MOSAIC_METADATA: - return { - transactionType: transactionBody.type, - scopedMetadataKey: transactionBody.scopedMetadataKey.toHex(), - targetMosaicId: transactionBody.targetMosaicId.toHex(), - targetAddress: transactionBody.targetAddress.address, - metadataValue: transactionBody.value, - valueSizeDelta: transactionBody.valueSizeDelta - }; - - case TransactionType.NAMESPACE_METADATA: - return { - transactionType: transactionBody.type, - scopedMetadataKey: transactionBody.scopedMetadataKey.toHex(), - targetNamespaceId: transactionBody.targetNamespaceId.toHex(), - targetAddress: transactionBody.targetAddress.address, - metadataValue: transactionBody.value, - valueSizeDelta: transactionBody.valueSizeDelta - }; - case TransactionType.VOTING_KEY_LINK: - return { - transactionType: transactionBody.type, - linkAction: Constants.LinkAction[transactionBody.linkAction], - linkedPublicKey: transactionBody.linkedPublicKey, - linkedAccountAddress: Address.createFromPublicKey(transactionBody.linkedPublicKey, http.networkType).plain(), - startEpoch: transactionBody.startEpoch, - endEpoch: transactionBody.endEpoch - }; - case TransactionType.VRF_KEY_LINK: - case TransactionType.NODE_KEY_LINK: - case TransactionType.ACCOUNT_KEY_LINK: - return { - transactionType: transactionBody.type, - linkAction: Constants.LinkAction[transactionBody.linkAction], - linkedPublicKey: transactionBody.linkedPublicKey, - linkedAccountAddress: Address.createFromPublicKey(transactionBody.linkedPublicKey, http.networkType).plain() - }; - } - } - - /** - * Format transactionInfoDTO. - * @param {object} transactionInfo transactionInfoDTO. - * @returns {object} readable transactionInfoDTO object. - */ - static formatTransactionInfo = transactionInfo => { - if (transactionInfo instanceof TransactionInfo) { - return { - ...transactionInfo, - height: transactionInfo.height.compact(), - timestamp: helper.networkTimestamp(Number(transactionInfo.timestamp.toString())) - }; - } - - if (transactionInfo instanceof AggregateTransactionInfo) { - return { - ...transactionInfo - }; - } - - return {}; - } - - /** - * extend graphic value for transaction list. - * @param {object} transactionInfo formatted transaction info. - * @returns {array} graphicValue. - */ - static extendGraphicValue = transactionInfo => { - const { transactionBody } = transactionInfo; - - switch (transactionInfo.type) { - case TransactionType.TRANSFER: - return { - nativeMosaic: helper.getNetworkCurrencyBalance(transactionInfo.mosaics), - message: transactionBody.message, - mosaics: transactionBody.mosaics.filter(mosaic => - mosaic.id !== http.networkCurrency.mosaicId && - mosaic.id !== http.networkCurrency.namespaceId) - }; - case TransactionType.NAMESPACE_REGISTRATION: - return [{ namespace: { - namespaceId: transactionBody.namespaceId, - namespaceName: transactionBody.namespaceName - } - }]; - case TransactionType.ADDRESS_ALIAS: - return [ - { linkAction: transactionBody.aliasAction } - ]; - case TransactionType.MOSAIC_ALIAS: - return [ - { linkAction: transactionBody.aliasAction } - ]; - case TransactionType.MOSAIC_DEFINITION: - return [ - { mosaicId: transactionBody.mosaicId } - ]; - case TransactionType.MOSAIC_SUPPLY_CHANGE: - return [ - { action: transactionBody.action } - ]; - case TransactionType.MOSAIC_SUPPLY_REVOCATION: - return { - mosaics: transactionBody.mosaics - }; - case TransactionType.MULTISIG_ACCOUNT_MODIFICATION: - return [ - { minApprovalDelta: transactionBody.minApprovalDelta }, - { minRemovalDelta: transactionBody.minRemovalDelta } - ]; - case TransactionType.HASH_LOCK: - return [ - { amount: transactionBody.amount } - ]; - case TransactionType.SECRET_LOCK: - return [ - { secret: transactionBody.secret } - ]; - case TransactionType.SECRET_PROOF: - return [ - { proof: transactionBody.proof } - ]; - case TransactionType.ACCOUNT_ADDRESS_RESTRICTION: - return [ - { restrictionAddressAdditions: transactionBody.restrictionAddressAdditions }, - { restrictionAddressDeletions: transactionBody.restrictionAddressDeletions } - ]; - case TransactionType.ACCOUNT_MOSAIC_RESTRICTION: - return [ - { restrictionMosaicAdditions: transactionBody.restrictionMosaicAdditions }, - { restrictionMosaicDeletions: transactionBody.restrictionMosaicDeletions } - ]; - case TransactionType.ACCOUNT_OPERATION_RESTRICTION: - return [ - { restrictionOperationAdditions: transactionBody.restrictionOperationAdditions }, - { restrictionOperationDeletions: transactionBody.restrictionOperationDeletions } - ]; - case TransactionType.MOSAIC_ADDRESS_RESTRICTION: - return [ - { targetAddress: transactionBody.targetAddress } - ]; - case TransactionType.MOSAIC_GLOBAL_RESTRICTION: - return [ - { referenceMosaicId: transactionBody.referenceMosaicId } - ]; - case TransactionType.ACCOUNT_METADATA: - case TransactionType.MOSAIC_METADATA: - case TransactionType.NAMESPACE_METADATA: - return [ - { metadataValue: transactionBody.metadataValue } - ]; - case TransactionType.VOTING_KEY_LINK: - case TransactionType.VRF_KEY_LINK: - case TransactionType.NODE_KEY_LINK: - case TransactionType.ACCOUNT_KEY_LINK: - return [ - { linkAction: transactionBody.linkAction } - ]; - default: - return []; - } - } - - /** - * Build standalone transaction object for Vue components. - * @param {object} transactionDTO - transaction dto from SDK. - * @returns {object} formatted transactionObj. - */ - static createStandaloneTransactionFromSDK = async (transactionDTO, { mosaicInfos, mosaicNames, unresolvedMosaicsMap }) => { - const transactionObj = { - ...transactionDTO, - transactionType: transactionDTO.type, - deadline: helper.networkTimestamp(transactionDTO.deadline.adjustedValue), - maxFee: helper.toNetworkCurrency(transactionDTO.maxFee), - signer: transactionDTO.signer.address.plain(), - transactionInfo: this.formatTransactionInfo(transactionDTO.transactionInfo) - }; - - switch (transactionDTO.type) { - case TransactionType.TRANSFER: - return CreateTransaction.transferTransaction(transactionObj, { - mosaicInfos, - mosaicNames, - unresolvedMosaicsMap - }); - case TransactionType.NAMESPACE_REGISTRATION: - return CreateTransaction.namespaceRegistration(transactionObj); - case TransactionType.ADDRESS_ALIAS: - return CreateTransaction.addressAlias(transactionObj); - case TransactionType.MOSAIC_ALIAS: - return CreateTransaction.mosaicAlias(transactionObj); - case TransactionType.MOSAIC_DEFINITION: - return CreateTransaction.mosaicDefinition(transactionObj); - case TransactionType.MOSAIC_SUPPLY_CHANGE: - return CreateTransaction.mosaicSupplyChange(transactionObj); - case TransactionType.MOSAIC_SUPPLY_REVOCATION: - return CreateTransaction.mosaicSupplyRevocation(transactionObj, { - mosaicInfos, - mosaicNames, - unresolvedMosaicsMap - }); - case TransactionType.MULTISIG_ACCOUNT_MODIFICATION: - return CreateTransaction.multisigAccountModification(transactionObj); - case TransactionType.HASH_LOCK: - return CreateTransaction.hashLock(transactionObj, { - mosaicInfos, - mosaicNames, - unresolvedMosaicsMap - }); - case TransactionType.SECRET_LOCK: - return CreateTransaction.secretLock(transactionObj, { - mosaicInfos, - mosaicNames, - unresolvedMosaicsMap - }); - case TransactionType.SECRET_PROOF: - return CreateTransaction.secretProof(transactionObj); - case TransactionType.ACCOUNT_ADDRESS_RESTRICTION: - return CreateTransaction.accountAddressRestriction(transactionObj); - case TransactionType.ACCOUNT_MOSAIC_RESTRICTION: - return CreateTransaction.accountMosaicRestriction(transactionObj); - case TransactionType.ACCOUNT_OPERATION_RESTRICTION: - return CreateTransaction.accountOperationRestriction(transactionObj); - case TransactionType.MOSAIC_ADDRESS_RESTRICTION: - return CreateTransaction.mosaicAddressRestriction(transactionObj); - case TransactionType.MOSAIC_GLOBAL_RESTRICTION: - return CreateTransaction.mosaicGlobalRestriction(transactionObj); - case TransactionType.ACCOUNT_METADATA: - return CreateTransaction.accountMetadata(transactionObj); - case TransactionType.MOSAIC_METADATA: - return CreateTransaction.mosaicMetadata(transactionObj); - case TransactionType.NAMESPACE_METADATA: - return CreateTransaction.namespaceMetadata(transactionObj); - case TransactionType.VOTING_KEY_LINK: - return CreateTransaction.votingKeyLink(transactionObj); - case TransactionType.VRF_KEY_LINK: - return CreateTransaction.vrfKeyLink(transactionObj); - case TransactionType.NODE_KEY_LINK: - return CreateTransaction.nodeKeyLink(transactionObj); - case TransactionType.ACCOUNT_KEY_LINK: - return CreateTransaction.accountKeyLink(transactionObj); - default: - throw new Error('Unimplemented transaction with type ' + transactionDTO.type); - } - } - - /** - * Build transaction object for Vue components. - * @param {object} transactionDTO - transaction dto from SDK - * @returns {object} transactionObj - */ - static createTransactionFromSDK = async transactionDTO => { - if (transactionDTO.type === TransactionType.AGGREGATE_BONDED - || transactionDTO.type === TransactionType.AGGREGATE_COMPLETE) { - - const { - mosaicInfos, - mosaicNames, - unresolvedMosaicsMap - } = await helper.getTransactionMosaicInfoAndNamespace(transactionDTO.innerTransactions); - - const innerTransactions = transactionDTO.innerTransactions - ? await Promise.all(transactionDTO.innerTransactions.map(async (transaction, index) => { - return { - index: index + 1, - ...await this.createStandaloneTransactionFromSDK(transaction, { - mosaicInfos, - mosaicNames, - unresolvedMosaicsMap - }) - }; - })) : []; - - return { - ...transactionDTO, - innerTransactions, - cosignatures: transactionDTO.cosignatures ? transactionDTO.cosignatures.map(cosignature => { - return { - ...cosignature, - signature: cosignature.signature, - signer: cosignature.signer.address.plain() - }; - }) : [], - deadline: helper.networkTimestamp(transactionDTO.deadline.adjustedValue), - maxFee: helper.toNetworkCurrency(transactionDTO.maxFee), - signer: transactionDTO.signer.address.plain(), - transactionInfo: this.formatTransactionInfo(transactionDTO.transactionInfo), - transactionBody: { - transactionType: transactionDTO.type - } - }; - } else { - const { - mosaicInfos, - mosaicNames, - unresolvedMosaicsMap - } = await helper.getTransactionMosaicInfoAndNamespace([transactionDTO]); - - return this.createStandaloneTransactionFromSDK(transactionDTO, { - mosaicInfos, - mosaicNames, - unresolvedMosaicsMap - }); - } - } + /** + * Gets a transaction status for a transaction hash + * @param {string} hash Transaction hash + * @returns {object} TransactionStatus object + */ + static getTransactionStatus = hash => { + return new Promise((resolve, reject) => { + let transactionStatus = { + message: null, + detail: {} + }; + + http.createRepositoryFactory + .createTransactionStatusRepository() + .getTransactionStatus(hash) + .toPromise() + .then(response => { + transactionStatus.message = response.group; + transactionStatus.detail = response; + resolve(transactionStatus); + }) + .catch(error => { + // handle REST error https://github.com/nemtech/catapult-rest/pull/499 + // Todo: Remove if statement, after REST error is fix. + if (-1 === error.message.search('statusCode')) { + transactionStatus.message = error.message; + transactionStatus.detail = error; + resolve(transactionStatus); + } + resolve(transactionStatus); + }); + }); + }; + + /** + * Gets a transaction from hash. + * @param {string} hash Transaction hash. + * @param {string} transactionGroup transaction status. + * @returns {object} Transaction. + */ + static getTransaction = async (hash, transactionGroup) => { + const transaction = await http.createRepositoryFactory + .createTransactionRepository() + .getTransaction(hash, transactionGroup) + .toPromise(); + + return transaction; + }; + + /** + * Gets a transaction from searchCriteria + * @param {object} transactionSearchCriteria Object of Search Criteria + * @returns {object} transaction data with pagination info + */ + static searchTransactions = async transactionSearchCriteria => { + const searchTransactions = await http.createRepositoryFactory + .createTransactionRepository() + .search(transactionSearchCriteria) + .toPromise(); + + return searchTransactions; + }; + + /** + * Gets a transactions from streamer + * @param {object} transactionSearchCriteria Object of Search Criteria + * @returns {array} Transaction[] + */ + static streamerTransactions = async transactionSearchCriteria => { + const streamerTransactions = await http.transactionPaginationStreamer + .search(transactionSearchCriteria) + .pipe(toArray()) + .toPromise(); + + return streamerTransactions; + }; + + /** + * Gets Formatted Transaction Info for Vue component + * @param {string} hash Transaction hash + * @returns {object} Custom Transaction object + */ + static getTransactionInfo = async hash => { + const transactionStatus = await this.getTransactionStatus(hash); + const transactionGroup = transactionStatus.message; + const transaction = await this.getTransaction(hash, transactionGroup); + + const { maxFee, ...formattedTransaction } = + await this.createTransactionFromSDK(transaction); + + const transactionInfo = { + ...formattedTransaction, + blockHeight: formattedTransaction.transactionInfo.height || undefined, + transactionHash: formattedTransaction.transactionInfo.hash, + timestamp: formattedTransaction.transactionInfo.timestamp | null, + status: transactionStatus.detail.code, + confirm: transactionStatus.message + }; + + // Display max fees if unconfirmed or partial transaction + if (0 === formattedTransaction.transactionInfo.height) { + Object.assign(transactionInfo, { + maxFee + }); + } else { + Object.assign(transactionInfo, { + effectiveFee: helper.toNetworkCurrency(formattedTransaction.payloadSize * + formattedTransaction.transactionInfo.feeMultiplier) + }); + } + + return transactionInfo; + }; + + /** + * Gets Formatted Hash Lock Info for Vue component + * @param {string} hash Transaction hash + * @returns {object} Custom Hash Lock object + */ + static getHashLockInfo = async hash => { + const hashInfo = await LockService.getHashLock(hash); + + const mosaics = [new Mosaic(hashInfo.mosaicId, hashInfo.amount)]; + + const mosaicsFieldObject = helper.mosaicsFieldObjectBuilder(mosaics); + + return { + ...hashInfo, + mosaics: mosaicsFieldObject + }; + }; + + /** + * Gets array of transactions + * @param {object} pageInfo - object for page info such as pageNumber, pageSize + * @param {object} filterValue - object for search criteria + * @returns {array} Formatted transactionDTO[] + */ + static getTransactionList = async (pageInfo, filterValue) => { + const { pageNumber, pageSize } = pageInfo; + const searchCriteria = { + pageNumber, + pageSize, + order: Order.Desc, + type: [], + group: TransactionGroup.Confirmed, + ...filterValue + }; + + const searchTransactions = await this.searchTransactions(searchCriteria); + + const transactions = { + ...searchTransactions, + data: searchTransactions.data.map(transaction => + this.formatTransaction(transaction)) + }; + + await Promise.all(transactions.data.map(async transaction => { + if (transaction?.recipientAddress) { + const { recipientAddress, transactionBody, transactionInfo } = + transaction; + + return (transactionBody.recipient = await helper.resolvedAddress( + recipientAddress, + transactionInfo.height + )); + } + })); + + if ( + searchCriteria.group === TransactionGroup.Partial || + searchCriteria.group === TransactionGroup.Unconfirmed + ) { + return { + ...transactions, + data: transactions.data.map(transaction => ({ + ...transaction, + transactionHash: transaction.transactionInfo.hash, + transactionType: transaction.type, + recipient: transaction.transactionBody?.recipient, + extendGraphicValue: this.extendGraphicValue(transaction) + })) + }; + } + + // Cap data in 50 pages + const totalRecords = 50 * pageSize; + + return { + ...transactions, + totalRecords, + data: transactions.data.map(({ deadline, maxFee, ...transaction }) => ({ + ...transaction, + effectiveFee: helper.toNetworkCurrency(transaction.payloadSize * transaction.transactionInfo.feeMultiplier), + age: helper.convertTimestampToDate(transaction.transactionInfo.timestamp), + height: transaction.transactionInfo.height, + transactionHash: transaction.transactionInfo.hash, + transactionType: transaction.type, + recipient: transaction.transactionBody?.recipient, + extendGraphicValue: this.extendGraphicValue(transaction) + })) + }; + }; + + /** + * Format Transaction + * @param {object} transaction transaction object from endpoint. + * @returns {object} readable transactionDTO object. + */ + static formatTransaction = transaction => ({ + ...transaction, + deadline: helper.networkTimestamp(transaction.deadline.adjustedValue), + maxFee: helper.toNetworkCurrency(Number(transaction.maxFee.toString())), + signer: transaction.signer.address.plain(), + transactionBody: this.formatTransactionBody(transaction), + transactionInfo: this.formatTransactionInfo(transaction.transactionInfo) + }); + + /** + * Format Different Type of Transaction such as TransferTransaction + * @param {object} transactionBody transaction body info. + * @returns {object} readable TransactionBody object + */ + static formatTransactionBody = transactionBody => { + switch (transactionBody.type) { + case TransactionType.TRANSFER: + return { + transactionType: transactionBody.type, + recipient: transactionBody.recipientAddress, + mosaics: transactionBody.mosaics.map(mosaic => ({ + ...mosaic, + id: mosaic.id.toHex(), + amount: mosaic.amount.compact().toString() + })), + message: transactionBody.message + }; + + case TransactionType.NAMESPACE_REGISTRATION: + let parentIdHex = transactionBody.parentId + ? transactionBody.parentId.toHex() + : ''; + + let duration = transactionBody.duration + ? transactionBody.duration.compact() + : 0; + + return { + transactionType: transactionBody.type, + recipient: http.networkConfig.NamespaceRentalFeeSinkAddress.address, + registrationType: + Constants.NamespaceRegistrationType[ + transactionBody.registrationType + ], + namespaceName: transactionBody.namespaceName, + namespaceId: transactionBody.namespaceId.toHex(), + parentId: + '' === parentIdHex ? Constants.Message.UNAVAILABLE : parentIdHex, + duration: 0 === duration ? Constants.Message.UNLIMITED : duration + }; + + case TransactionType.ADDRESS_ALIAS: + return { + transactionType: transactionBody.type, + aliasAction: Constants.AliasAction[transactionBody.aliasAction], + namespaceId: transactionBody.namespaceId.toHex(), + namespaceName: transactionBody.namespaceId.fullName, + address: transactionBody.address.address + }; + + case TransactionType.MOSAIC_ALIAS: + return { + transactionType: transactionBody.type, + aliasAction: Constants.AliasAction[transactionBody.aliasAction], + namespaceId: transactionBody.namespaceId.id.toHex(), + namespaceName: transactionBody.namespaceId.fullName, + mosaicId: transactionBody.mosaicId.id.toHex() + }; + + case TransactionType.MOSAIC_DEFINITION: + return { + transactionType: transactionBody.type, + recipient: http.networkConfig.MosaicRentalSinkAddress.address, + mosaicId: transactionBody.mosaicId.toHex(), + divisibility: transactionBody.divisibility, + duration: transactionBody.duration.compact(), + nonce: transactionBody.nonce.toHex(), + supplyMutable: transactionBody.flags.supplyMutable, + transferable: transactionBody.flags.transferable, + restrictable: transactionBody.flags.restrictable, + revokable: transactionBody.flags.revokable + }; + + case TransactionType.MOSAIC_SUPPLY_CHANGE: + return { + transactionType: transactionBody.type, + mosaicId: transactionBody.mosaicId.id.toHex(), + action: Constants.MosaicSupplyChangeAction[transactionBody.action], + delta: transactionBody.delta.compact() + }; + case TransactionType.MOSAIC_SUPPLY_REVOCATION: + return { + transactionType: transactionBody.type, + address: transactionBody.sourceAddress.address, + mosaics: [ + { + id: transactionBody.mosaic.id.toHex(), + amount: transactionBody.mosaic.amount.compact().toString() + } + ] + }; + + case TransactionType.MULTISIG_ACCOUNT_MODIFICATION: + return { + transactionType: transactionBody.type, + minApprovalDelta: transactionBody.minApprovalDelta, + minRemovalDelta: transactionBody.minRemovalDelta, + addressAdditions: transactionBody.addressAdditions.map(address => address.address), + addressDeletions: transactionBody.addressDeletions.map(address => address.address) + }; + + case TransactionType.AGGREGATE_COMPLETE: + return { + transactionType: transactionBody.type, + innerTransactions: transactionBody.innerTransactions, + cosignatures: transactionBody.cosignatures.map(cosigner => ({ + ...cosigner, + signer: cosigner.signer.address.address + })) + }; + + case TransactionType.AGGREGATE_BONDED: + return { + transactionType: transactionBody.type, + innerTransactions: transactionBody.innerTransactions, + cosignatures: transactionBody.cosignatures.map(cosigner => ({ + ...cosigner, + signer: cosigner.signer.address.address + })) + }; + + case TransactionType.HASH_LOCK: + return { + transactionType: transactionBody.type, + duration: transactionBody.duration.compact(), + mosaicId: transactionBody.mosaic.id.toHex(), + amount: helper.toNetworkCurrency(transactionBody.mosaic.amount), + hash: transactionBody.hash + }; + + case TransactionType.SECRET_LOCK: + return { + transactionType: transactionBody.type, + duration: transactionBody.duration.compact(), + mosaicId: transactionBody.mosaic.id.toHex(), + amount: helper.toNetworkCurrency(transactionBody.mosaic.amount), + secret: transactionBody.secret, + recipient: transactionBody.recipientAddress, + hashAlgorithm: + Constants.LockHashAlgorithm[transactionBody.hashAlgorithm] + }; + + case TransactionType.SECRET_PROOF: + return { + transactionType: transactionBody.type, + hashAlgorithm: + Constants.LockHashAlgorithm[transactionBody.hashAlgorithm], + recipient: transactionBody.recipientAddress, + secret: transactionBody.secret, + proof: transactionBody.proof + }; + case TransactionType.ACCOUNT_ADDRESS_RESTRICTION: + return { + transactionType: transactionBody.type, + restrictionType: + Constants.AddressRestrictionFlag[transactionBody.restrictionFlags], + restrictionAddressAdditions: transactionBody.restrictionAdditions.map(restriction => { + if (restriction instanceof Address) + return restriction.address; + + return restriction.fullName; + }), + restrictionAddressDeletions: transactionBody.restrictionDeletions.map(restriction => { + if (restriction instanceof Address) + return restriction.address; + + return restriction.fullName; + }) + }; + + case TransactionType.ACCOUNT_MOSAIC_RESTRICTION: + return { + transactionType: transactionBody.type, + restrictionType: + Constants.MosaicRestrictionFlag[transactionBody.restrictionFlags], + restrictionMosaicAdditions: transactionBody.restrictionAdditions.map(mosaic => mosaic.id.toHex()), + restrictionMosaicDeletions: transactionBody.restrictionDeletions.map(mosaic => mosaic.id.toHex()) + }; + + case TransactionType.ACCOUNT_OPERATION_RESTRICTION: + return { + transactionType: transactionBody.type, + restrictionType: + Constants.OperationRestrictionFlag[ + transactionBody.restrictionFlags + ], + restrictionOperationAdditions: transactionBody.restrictionAdditions, + restrictionOperationDeletions: transactionBody.restrictionDeletions + }; + + case TransactionType.MOSAIC_ADDRESS_RESTRICTION: + return { + transactionType: transactionBody.type, + mosaicId: transactionBody.mosaicId.toHex(), + targetAddress: transactionBody.targetAddress, + restrictionKey: transactionBody.restrictionKey.toHex(), + previousRestrictionValue: + transactionBody.previousRestrictionValue.toString(), + newRestrictionValue: transactionBody.newRestrictionValue.toString() + }; + + case TransactionType.MOSAIC_GLOBAL_RESTRICTION: + return { + transactionType: transactionBody.type, + referenceMosaicId: + '0000000000000000' === transactionBody.referenceMosaicId.toHex() + ? transactionBody.mosaicId.toHex() + : transactionBody.referenceMosaicId.toHex(), + restrictionKey: transactionBody.restrictionKey.toHex(), + previousRestrictionType: + Constants.MosaicRestrictionType[ + transactionBody.previousRestrictionType + ], + previousRestrictionValue: + transactionBody.previousRestrictionValue.compact(), + newRestrictionType: + Constants.MosaicRestrictionType[transactionBody.newRestrictionType], + newRestrictionValue: transactionBody.newRestrictionValue.compact() + }; + + case TransactionType.ACCOUNT_METADATA: + return { + transactionType: transactionBody.type, + scopedMetadataKey: transactionBody.scopedMetadataKey.toHex(), + targetAddress: transactionBody.targetAddress.address, + metadataValue: transactionBody.value, + valueSizeDelta: transactionBody.valueSizeDelta + }; + + case TransactionType.MOSAIC_METADATA: + return { + transactionType: transactionBody.type, + scopedMetadataKey: transactionBody.scopedMetadataKey.toHex(), + targetMosaicId: transactionBody.targetMosaicId.toHex(), + targetAddress: transactionBody.targetAddress.address, + metadataValue: transactionBody.value, + valueSizeDelta: transactionBody.valueSizeDelta + }; + + case TransactionType.NAMESPACE_METADATA: + return { + transactionType: transactionBody.type, + scopedMetadataKey: transactionBody.scopedMetadataKey.toHex(), + targetNamespaceId: transactionBody.targetNamespaceId.toHex(), + targetAddress: transactionBody.targetAddress.address, + metadataValue: transactionBody.value, + valueSizeDelta: transactionBody.valueSizeDelta + }; + case TransactionType.VOTING_KEY_LINK: + return { + transactionType: transactionBody.type, + linkAction: Constants.LinkAction[transactionBody.linkAction], + linkedPublicKey: transactionBody.linkedPublicKey, + linkedAccountAddress: Address.createFromPublicKey( + transactionBody.linkedPublicKey, + http.networkType + ).plain(), + startEpoch: transactionBody.startEpoch, + endEpoch: transactionBody.endEpoch + }; + case TransactionType.VRF_KEY_LINK: + case TransactionType.NODE_KEY_LINK: + case TransactionType.ACCOUNT_KEY_LINK: + return { + transactionType: transactionBody.type, + linkAction: Constants.LinkAction[transactionBody.linkAction], + linkedPublicKey: transactionBody.linkedPublicKey, + linkedAccountAddress: Address.createFromPublicKey( + transactionBody.linkedPublicKey, + http.networkType + ).plain() + }; + } + }; + + /** + * Format transactionInfoDTO. + * @param {object} transactionInfo transactionInfoDTO. + * @returns {object} readable transactionInfoDTO object. + */ + static formatTransactionInfo = transactionInfo => { + if (transactionInfo instanceof TransactionInfo) { + return { + ...transactionInfo, + height: transactionInfo.height.compact(), + timestamp: helper.networkTimestamp(Number(transactionInfo.timestamp.toString())) + }; + } + + if (transactionInfo instanceof AggregateTransactionInfo) { + return { + ...transactionInfo + }; + } + + return {}; + }; + + /** + * extend graphic value for transaction list. + * @param {object} transactionInfo formatted transaction info. + * @returns {array} graphicValue. + */ + static extendGraphicValue = transactionInfo => { + const { transactionBody } = transactionInfo; + + switch (transactionInfo.type) { + case TransactionType.TRANSFER: + return { + nativeMosaic: helper.getNetworkCurrencyBalance(transactionInfo.mosaics), + message: transactionBody.message, + mosaics: transactionBody.mosaics.filter(mosaic => + mosaic.id !== http.networkCurrency.mosaicId && + mosaic.id !== http.networkCurrency.namespaceId) + }; + case TransactionType.NAMESPACE_REGISTRATION: + return [ + { + namespace: { + namespaceId: transactionBody.namespaceId, + namespaceName: transactionBody.namespaceName + } + } + ]; + case TransactionType.ADDRESS_ALIAS: + return [{ linkAction: transactionBody.aliasAction }]; + case TransactionType.MOSAIC_ALIAS: + return [{ linkAction: transactionBody.aliasAction }]; + case TransactionType.MOSAIC_DEFINITION: + return [{ mosaicId: transactionBody.mosaicId }]; + case TransactionType.MOSAIC_SUPPLY_CHANGE: + return [{ action: transactionBody.action }]; + case TransactionType.MOSAIC_SUPPLY_REVOCATION: + return { + mosaics: transactionBody.mosaics + }; + case TransactionType.MULTISIG_ACCOUNT_MODIFICATION: + return [ + { minApprovalDelta: transactionBody.minApprovalDelta }, + { minRemovalDelta: transactionBody.minRemovalDelta } + ]; + case TransactionType.HASH_LOCK: + return [{ amount: transactionBody.amount }]; + case TransactionType.SECRET_LOCK: + return [{ secret: transactionBody.secret }]; + case TransactionType.SECRET_PROOF: + return [{ proof: transactionBody.proof }]; + case TransactionType.ACCOUNT_ADDRESS_RESTRICTION: + return [ + { + restrictionAddressAdditions: + transactionBody.restrictionAddressAdditions + }, + { + restrictionAddressDeletions: + transactionBody.restrictionAddressDeletions + } + ]; + case TransactionType.ACCOUNT_MOSAIC_RESTRICTION: + return [ + { + restrictionMosaicAdditions: + transactionBody.restrictionMosaicAdditions + }, + { + restrictionMosaicDeletions: + transactionBody.restrictionMosaicDeletions + } + ]; + case TransactionType.ACCOUNT_OPERATION_RESTRICTION: + return [ + { + restrictionOperationAdditions: + transactionBody.restrictionOperationAdditions + }, + { + restrictionOperationDeletions: + transactionBody.restrictionOperationDeletions + } + ]; + case TransactionType.MOSAIC_ADDRESS_RESTRICTION: + return [{ targetAddress: transactionBody.targetAddress }]; + case TransactionType.MOSAIC_GLOBAL_RESTRICTION: + return [{ referenceMosaicId: transactionBody.referenceMosaicId }]; + case TransactionType.ACCOUNT_METADATA: + case TransactionType.MOSAIC_METADATA: + case TransactionType.NAMESPACE_METADATA: + return [{ metadataValue: transactionBody.metadataValue }]; + case TransactionType.VOTING_KEY_LINK: + case TransactionType.VRF_KEY_LINK: + case TransactionType.NODE_KEY_LINK: + case TransactionType.ACCOUNT_KEY_LINK: + return [{ linkAction: transactionBody.linkAction }]; + default: + return []; + } + }; + + /** + * Build standalone transaction object for Vue components. + * @param {object} transactionDTO - transaction dto from SDK. + * @returns {object} formatted transactionObj. + */ + static createStandaloneTransactionFromSDK = async ( + transactionDTO, + { mosaicInfos, mosaicNames, unresolvedMosaicsMap } + ) => { + const transactionObj = { + ...transactionDTO, + transactionType: transactionDTO.type, + deadline: helper.networkTimestamp(transactionDTO.deadline.adjustedValue), + maxFee: helper.toNetworkCurrency(transactionDTO.maxFee), + signer: transactionDTO.signer.address.plain(), + transactionInfo: this.formatTransactionInfo(transactionDTO.transactionInfo) + }; + + switch (transactionDTO.type) { + case TransactionType.TRANSFER: + return CreateTransaction.transferTransaction(transactionObj, { + mosaicInfos, + mosaicNames, + unresolvedMosaicsMap + }); + case TransactionType.NAMESPACE_REGISTRATION: + return CreateTransaction.namespaceRegistration(transactionObj); + case TransactionType.ADDRESS_ALIAS: + return CreateTransaction.addressAlias(transactionObj); + case TransactionType.MOSAIC_ALIAS: + return CreateTransaction.mosaicAlias(transactionObj); + case TransactionType.MOSAIC_DEFINITION: + return CreateTransaction.mosaicDefinition(transactionObj); + case TransactionType.MOSAIC_SUPPLY_CHANGE: + return CreateTransaction.mosaicSupplyChange(transactionObj); + case TransactionType.MOSAIC_SUPPLY_REVOCATION: + return CreateTransaction.mosaicSupplyRevocation(transactionObj, { + mosaicInfos, + mosaicNames, + unresolvedMosaicsMap + }); + case TransactionType.MULTISIG_ACCOUNT_MODIFICATION: + return CreateTransaction.multisigAccountModification(transactionObj); + case TransactionType.HASH_LOCK: + return CreateTransaction.hashLock(transactionObj, { + mosaicInfos, + mosaicNames, + unresolvedMosaicsMap + }); + case TransactionType.SECRET_LOCK: + return CreateTransaction.secretLock(transactionObj, { + mosaicInfos, + mosaicNames, + unresolvedMosaicsMap + }); + case TransactionType.SECRET_PROOF: + return CreateTransaction.secretProof(transactionObj); + case TransactionType.ACCOUNT_ADDRESS_RESTRICTION: + return CreateTransaction.accountAddressRestriction(transactionObj); + case TransactionType.ACCOUNT_MOSAIC_RESTRICTION: + return CreateTransaction.accountMosaicRestriction(transactionObj); + case TransactionType.ACCOUNT_OPERATION_RESTRICTION: + return CreateTransaction.accountOperationRestriction(transactionObj); + case TransactionType.MOSAIC_ADDRESS_RESTRICTION: + return CreateTransaction.mosaicAddressRestriction(transactionObj); + case TransactionType.MOSAIC_GLOBAL_RESTRICTION: + return CreateTransaction.mosaicGlobalRestriction(transactionObj); + case TransactionType.ACCOUNT_METADATA: + return CreateTransaction.accountMetadata(transactionObj); + case TransactionType.MOSAIC_METADATA: + return CreateTransaction.mosaicMetadata(transactionObj); + case TransactionType.NAMESPACE_METADATA: + return CreateTransaction.namespaceMetadata(transactionObj); + case TransactionType.VOTING_KEY_LINK: + return CreateTransaction.votingKeyLink(transactionObj); + case TransactionType.VRF_KEY_LINK: + return CreateTransaction.vrfKeyLink(transactionObj); + case TransactionType.NODE_KEY_LINK: + return CreateTransaction.nodeKeyLink(transactionObj); + case TransactionType.ACCOUNT_KEY_LINK: + return CreateTransaction.accountKeyLink(transactionObj); + default: + throw new Error('Unimplemented transaction with type ' + transactionDTO.type); + } + }; + + /** + * Build transaction object for Vue components. + * @param {object} transactionDTO - transaction dto from SDK + * @returns {object} transactionObj + */ + static createTransactionFromSDK = async transactionDTO => { + if ( + transactionDTO.type === TransactionType.AGGREGATE_BONDED || + transactionDTO.type === TransactionType.AGGREGATE_COMPLETE + ) { + const { mosaicInfos, mosaicNames, unresolvedMosaicsMap } = + await helper.getTransactionMosaicInfoAndNamespace(transactionDTO.innerTransactions); + + const innerTransactions = transactionDTO.innerTransactions + ? await Promise.all(transactionDTO.innerTransactions.map(async (transaction, index) => { + return { + index: index + 1, + ...(await this.createStandaloneTransactionFromSDK(transaction, { + mosaicInfos, + mosaicNames, + unresolvedMosaicsMap + })) + }; + })) + : []; + + return { + ...transactionDTO, + innerTransactions, + cosignatures: transactionDTO.cosignatures + ? transactionDTO.cosignatures.map(cosignature => { + return { + ...cosignature, + signature: cosignature.signature, + signer: cosignature.signer.address.plain() + }; + }) + : [], + deadline: helper.networkTimestamp(transactionDTO.deadline.adjustedValue), + maxFee: helper.toNetworkCurrency(transactionDTO.maxFee), + signer: transactionDTO.signer.address.plain(), + transactionInfo: this.formatTransactionInfo(transactionDTO.transactionInfo), + transactionBody: { + transactionType: transactionDTO.type + } + }; + } else { + const { mosaicInfos, mosaicNames, unresolvedMosaicsMap } = + await helper.getTransactionMosaicInfoAndNamespace([transactionDTO]); + + return this.createStandaloneTransactionFromSDK(transactionDTO, { + mosaicInfos, + mosaicNames, + unresolvedMosaicsMap + }); + } + }; } export default TransactionService; diff --git a/src/infrastructure/http.js b/src/infrastructure/http.js index 57ffe3f1f..3e2ce43bb 100644 --- a/src/infrastructure/http.js +++ b/src/infrastructure/http.js @@ -20,7 +20,10 @@ import accountLabels from '../config/accountLabels'; import globalConfig from '../config/globalConfig'; import { NamespaceService } from '../infrastructure'; import * as symbol from 'symbol-sdk'; -import { Configuration, NodeApi } from 'symbol-statistics-service-typescript-fetch-client'; +import { + Configuration, + NodeApi +} from 'symbol-statistics-service-typescript-fetch-client'; let NODE_URL; @@ -39,140 +42,169 @@ let NATIVE_NAMESPACES; let EPOCH_ADJUSTMENT; export default class http { - static init = async (nodeUrl, marketDataUrl) => { - NODE_URL = nodeUrl; - MARKET_DATA_URL = marketDataUrl; - - [NETWORK_TYPE, GENERATION_HASH, NETWORK_PROPERTIES, EPOCH_ADJUSTMENT, NETWORK_CURRECY] = await Promise.all([ - http.createRepositoryFactory.getNetworkType().toPromise(), - http.createRepositoryFactory.getGenerationHash().toPromise(), - http.createRepositoryFactory.createNetworkRepository().getNetworkProperties() - .toPromise(), - http.createRepositoryFactory.getEpochAdjustment().toPromise(), - http.createRepositoryFactory.getCurrencies().toPromise() - ]); - - NATIVE_NAMESPACES = await NamespaceService.getNativeNamespaces() || []; - } - - static get networkCurrency () { - return { - namespaceName: NETWORK_CURRECY?.currency.namespaceId?.fullName || globalConfig.networkConfig.namespaceName, - namespaceId: NETWORK_CURRECY?.currency.namespaceId?.id?.toHex() || globalConfig.networkConfig.namespaceId, - mosaicId: NETWORK_CURRECY?.currency.mosaicId?.toHex() || undefined, - divisibility: NETWORK_CURRECY?.currency.divisibility || globalConfig.networkConfig.divisibility - }; - } - - static get nativeNamespaces () { - return NATIVE_NAMESPACES; - } - - static get networkProperties () { - return new symbol.NetworkConfiguration(NETWORK_PROPERTIES.network, NETWORK_PROPERTIES.chain, NETWORK_PROPERTIES.plugins); - } - - static get networkConfig () { - const { - chain: { totalChainImportance, blockGenerationTargetTime }, - plugins: { namespace, mosaic } - } = this.networkProperties; - const convertedTotalChainImportance = +totalChainImportance.replace(/'/g, ''); - const convertedNamespaceGracePeriodDuration = +namespace.namespaceGracePeriodDuration.replace(/d/g, ''); - const convertedBlockGenerationTargetTime = +blockGenerationTargetTime.replace(/s/g, ''); - const blockPerday = (60 / convertedBlockGenerationTargetTime) * 60 * 24; - - return { - MosaicRentalSinkAddress: symbol.Address.createFromRawAddress(mosaic.mosaicRentalFeeSinkAddress), - NamespaceRentalFeeSinkAddress: symbol.Address.createFromRawAddress(namespace.namespaceRentalFeeSinkAddress), - NetworkType: this.networkType, - NemsisTimestamp: this.epochAdjustment, - TargetBlockTime: convertedBlockGenerationTargetTime, - NamespaceGraceDuration: convertedNamespaceGracePeriodDuration * blockPerday, - TotalChainImportance: convertedTotalChainImportance - }; - } - - static get timezone () { - return globalConfig.timezone || 'Local'; - } - - static get marketDataUrl () { - return MARKET_DATA_URL; - } - - static get nodeUrl () { - return NODE_URL; - } - - static get generationHash () { - return GENERATION_HASH; - } - - static get networkType () { - return NETWORK_TYPE; - } - - static get epochAdjustment () { - return EPOCH_ADJUSTMENT; - } - - static get accountLabels () { - return accountLabels || {}; - } - - static get createRepositoryFactory () { - return new symbol.RepositoryFactoryHttp(this.nodeUrl, { - networkType: this.networkType, - generationHash: this.generationHash - }); - } - - static get mosaicService () { - const accountRepository = this.createRepositoryFactory.createAccountRepository(); - const mosaicRepository = this.createRepositoryFactory.createMosaicRepository(); - - return new symbol.MosaicService(accountRepository, mosaicRepository); - } - - static get namespaceService () { - const namespaceRepository = this.createRepositoryFactory.createNamespaceRepository(); - - return new symbol.NamespaceService(namespaceRepository); - } - - static get blockPaginationStreamer () { - return new symbol.BlockPaginationStreamer(this.createRepositoryFactory.createBlockRepository()); - } - - static transactionStatementPaginationStreamer () { - return symbol.ReceiptPaginationStreamer.transactionStatements(this.createRepositoryFactory.createReceiptRepository()); - } - - static addressResolutionStatementPaginationStreamer () { - return symbol.ReceiptPaginationStreamer.addressResolutionStatements(this.createRepositoryFactory.createReceiptRepository()); - } - - static mosaicResolutionStatementPaginationStreamer () { - return symbol.ReceiptPaginationStreamer.mosaicResolutionStatements(this.createRepositoryFactory.createReceiptRepository()); - } - - static get transactionPaginationStreamer () { - return new symbol.TransactionPaginationStreamer(this.createRepositoryFactory.createTransactionRepository()); - } - - static statisticServiceRestClient () { - try { - const statisticsServiceUrl = globalConfig.endpoints.statisticsService; - - if (statisticsServiceUrl && statisticsServiceUrl.length) { - return new NodeApi(new Configuration({ - fetchApi: fetch, - basePath: statisticsServiceUrl - })); - } else { throw Error('Statistics service endpoint is not provided'); } - } catch (error) { - console.error(error); - } - } + static init = async (nodeUrl, marketDataUrl) => { + NODE_URL = nodeUrl; + MARKET_DATA_URL = marketDataUrl; + + [ + NETWORK_TYPE, + GENERATION_HASH, + NETWORK_PROPERTIES, + EPOCH_ADJUSTMENT, + NETWORK_CURRECY + ] = await Promise.all([ + http.createRepositoryFactory.getNetworkType().toPromise(), + http.createRepositoryFactory.getGenerationHash().toPromise(), + http.createRepositoryFactory + .createNetworkRepository() + .getNetworkProperties() + .toPromise(), + http.createRepositoryFactory.getEpochAdjustment().toPromise(), + http.createRepositoryFactory.getCurrencies().toPromise() + ]); + + NATIVE_NAMESPACES = (await NamespaceService.getNativeNamespaces()) || []; + }; + + static get networkCurrency() { + return { + namespaceName: + NETWORK_CURRECY?.currency.namespaceId?.fullName || + globalConfig.networkConfig.namespaceName, + namespaceId: + NETWORK_CURRECY?.currency.namespaceId?.id?.toHex() || + globalConfig.networkConfig.namespaceId, + mosaicId: NETWORK_CURRECY?.currency.mosaicId?.toHex() || undefined, + divisibility: + NETWORK_CURRECY?.currency.divisibility || + globalConfig.networkConfig.divisibility + }; + } + + static get nativeNamespaces() { + return NATIVE_NAMESPACES; + } + + static get networkProperties() { + return new symbol.NetworkConfiguration( + NETWORK_PROPERTIES.network, + NETWORK_PROPERTIES.chain, + NETWORK_PROPERTIES.plugins + ); + } + + static get networkConfig() { + const { + chain: { totalChainImportance, blockGenerationTargetTime }, + plugins: { namespace, mosaic } + } = this.networkProperties; + const convertedTotalChainImportance = +totalChainImportance.replace( + /'/g, + '' + ); + const convertedNamespaceGracePeriodDuration = + +namespace.namespaceGracePeriodDuration.replace(/d/g, ''); + const convertedBlockGenerationTargetTime = + +blockGenerationTargetTime.replace(/s/g, ''); + const blockPerday = (60 / convertedBlockGenerationTargetTime) * 60 * 24; + + return { + MosaicRentalSinkAddress: symbol.Address.createFromRawAddress(mosaic.mosaicRentalFeeSinkAddress), + NamespaceRentalFeeSinkAddress: symbol.Address.createFromRawAddress(namespace.namespaceRentalFeeSinkAddress), + NetworkType: this.networkType, + NemsisTimestamp: this.epochAdjustment, + TargetBlockTime: convertedBlockGenerationTargetTime, + NamespaceGraceDuration: + convertedNamespaceGracePeriodDuration * blockPerday, + TotalChainImportance: convertedTotalChainImportance + }; + } + + static get timezone() { + return globalConfig.timezone || 'Local'; + } + + static get marketDataUrl() { + return MARKET_DATA_URL; + } + + static get nodeUrl() { + return NODE_URL; + } + + static get generationHash() { + return GENERATION_HASH; + } + + static get networkType() { + return NETWORK_TYPE; + } + + static get epochAdjustment() { + return EPOCH_ADJUSTMENT; + } + + static get accountLabels() { + return accountLabels || {}; + } + + static get createRepositoryFactory() { + return new symbol.RepositoryFactoryHttp(this.nodeUrl, { + networkType: this.networkType, + generationHash: this.generationHash + }); + } + + static get mosaicService() { + const accountRepository = + this.createRepositoryFactory.createAccountRepository(); + const mosaicRepository = + this.createRepositoryFactory.createMosaicRepository(); + + return new symbol.MosaicService(accountRepository, mosaicRepository); + } + + static get namespaceService() { + const namespaceRepository = + this.createRepositoryFactory.createNamespaceRepository(); + + return new symbol.NamespaceService(namespaceRepository); + } + + static get blockPaginationStreamer() { + return new symbol.BlockPaginationStreamer(this.createRepositoryFactory.createBlockRepository()); + } + + static transactionStatementPaginationStreamer() { + return symbol.ReceiptPaginationStreamer.transactionStatements(this.createRepositoryFactory.createReceiptRepository()); + } + + static addressResolutionStatementPaginationStreamer() { + return symbol.ReceiptPaginationStreamer.addressResolutionStatements(this.createRepositoryFactory.createReceiptRepository()); + } + + static mosaicResolutionStatementPaginationStreamer() { + return symbol.ReceiptPaginationStreamer.mosaicResolutionStatements(this.createRepositoryFactory.createReceiptRepository()); + } + + static get transactionPaginationStreamer() { + return new symbol.TransactionPaginationStreamer(this.createRepositoryFactory.createTransactionRepository()); + } + + static statisticServiceRestClient() { + try { + const statisticsServiceUrl = globalConfig.endpoints.statisticsService; + + if (statisticsServiceUrl && statisticsServiceUrl.length) { + return new NodeApi(new Configuration({ + fetchApi: fetch, + basePath: statisticsServiceUrl + })); + } else { + throw Error('Statistics service endpoint is not provided'); + } + } catch (error) { + console.error(error); + } + } } diff --git a/src/store/account.js b/src/store/account.js index 7ef56fa0a..c00cdb184 100644 --- a/src/store/account.js +++ b/src/store/account.js @@ -37,37 +37,39 @@ import { Address } from 'symbol-sdk'; const managers = [ new Pagination({ name: 'timeline', - fetchFunction: (pageInfo, filterValue) => AccountService.getAccountList(pageInfo, filterValue), + fetchFunction: (pageInfo, filterValue) => + AccountService.getAccountList(pageInfo, filterValue), pageInfo: { pageSize: Constants.PageSize }, filter: filters.account }), - new DataSet( - 'info', - address => AccountService.getAccountInfo(address) - ), - new DataSet( - 'OwnedMosaic', - address => AccountService.getAccountMosaicList(address) - ), + new DataSet('info', address => AccountService.getAccountInfo(address)), + new DataSet('OwnedMosaic', address => + AccountService.getAccountMosaicList(address)), new Pagination({ name: 'OwnedNamespace', fetchFunction: (pageInfo, filterValue, store) => - AccountService.getAccountNamespaceList(pageInfo, filterValue, store.getters.getCurrentAccountAddress), + AccountService.getAccountNamespaceList( + pageInfo, + filterValue, + store.getters.getCurrentAccountAddress + ), pageInfo: { pageSize: 10 }, filter: filters.namespace }), - new DataSet( - 'multisig', - address => MultisigService.getMultisigAccountInfo(address) - ), + new DataSet('multisig', address => + MultisigService.getMultisigAccountInfo(address)), new Pagination({ name: 'transactions', fetchFunction: (pageInfo, filterValue, store) => - AccountService.getAccountTransactionList(pageInfo, filterValue, store.getters.getCurrentAccountAddress), + AccountService.getAccountTransactionList( + pageInfo, + filterValue, + store.getters.getCurrentAccountAddress + ), pageInfo: { pageSize: 10 }, @@ -76,7 +78,10 @@ const managers = [ new Pagination({ name: 'harvestedBlocks', fetchFunction: (pageInfo, filterValue, store) => - AccountService.getAccountHarvestedReceiptList(pageInfo, store.getters.getCurrentAccountAddress), + AccountService.getAccountHarvestedReceiptList( + pageInfo, + store.getters.getCurrentAccountAddress + ), pageInfo: { pageSize: 10 } @@ -84,7 +89,11 @@ const managers = [ new Pagination({ name: 'receipt', fetchFunction: (pageInfo, filterValue, store) => - AccountService.getAccountReceiptList(pageInfo, filterValue, store.getters.getCurrentAccountAddress), + AccountService.getAccountReceiptList( + pageInfo, + filterValue, + store.getters.getCurrentAccountAddress + ), pageInfo: { pageSize: 10 }, @@ -93,7 +102,10 @@ const managers = [ new Pagination({ name: 'mosaicAddressRestrictions', fetchFunction: (pageInfo, filterValue, store) => - RestrictionService.getMosaicAddressRestrictionList(pageInfo, store.getters.getCurrentAccountAddress), + RestrictionService.getMosaicAddressRestrictionList( + pageInfo, + store.getters.getCurrentAccountAddress + ), pageInfo: { pageSize: Constants.PageSize } @@ -101,7 +113,11 @@ const managers = [ new Pagination({ name: 'metadatas', fetchFunction: (pageInfo, filterValue, store) => - AccountService.getAccountMetadataList(pageInfo, filterValue, store.getters.getCurrentAccountAddress), + AccountService.getAccountMetadataList( + pageInfo, + filterValue, + store.getters.getCurrentAccountAddress + ), pageInfo: { pageSize: 10 }, @@ -110,7 +126,10 @@ const managers = [ new Pagination({ name: 'hashLocks', fetchFunction: (pageInfo, filterValue, store) => - AccountService.getAccountHashLockList(pageInfo, store.getters.getCurrentAccountAddress), + AccountService.getAccountHashLockList( + pageInfo, + store.getters.getCurrentAccountAddress + ), pageInfo: { pageSize: 10 } @@ -118,15 +137,16 @@ const managers = [ new Pagination({ name: 'secretLocks', fetchFunction: (pageInfo, filterValue, store) => - AccountService.getAccountSecretLockList(pageInfo, store.getters.getCurrentAccountAddress), + AccountService.getAccountSecretLockList( + pageInfo, + store.getters.getCurrentAccountAddress + ), pageInfo: { pageSize: 10 } }), - new DataSet( - 'accountRestrictions', - address => RestrictionService.getAccountRestrictionList(address) - ) + new DataSet('accountRestrictions', address => + RestrictionService.getAccountRestrictionList(address)) ]; const LOCK = Lock.create(); @@ -143,15 +163,18 @@ export default { ...getGettersFromManagers(managers), getInitialized: state => state.initialized, getActivityBucketList: state => state.info?.data.activityBucket || [], - getSupplementalPublicKeys: state => state.info?.data.supplementalPublicKeys || {}, + getSupplementalPublicKeys: state => + state.info?.data.supplementalPublicKeys || {}, getVotingKeyList: state => state.info?.data.votingList || [], getCurrentAccountAddress: state => state.currentAccountAddress, balanceWidget: (state, getters) => ({ - address: state.currentAccountAddress ? Address - .createFromRawAddress(state.currentAccountAddress) - .pretty() : '', + address: state.currentAccountAddress + ? Address.createFromRawAddress(state.currentAccountAddress).pretty() + : '', mosaic: getters.OwnedMosaic?.data[0], - alias: getters.info?.data?.accountAliasNames /* || Constants.Message.UNAVAILABLE */ + alias: + getters.info?.data + ?.accountAliasNames /* || Constants.Message.UNAVAILABLE */ }) }, mutations: { @@ -166,7 +189,7 @@ export default { actions: { ...getActionsFromManagers(managers), // Initialize the account model. - async initialize ({ commit, dispatch, getters }) { + async initialize({ commit, dispatch, getters }) { const callback = async () => { await dispatch('initializePage'); }; @@ -175,22 +198,22 @@ export default { }, // Uninitialize the account model. - async uninitialize ({ commit, dispatch, getters }) { + async uninitialize({ commit, dispatch, getters }) { const callback = async () => { dispatch('uninitializeDetail'); - getters.timeline?.uninitialize(); + getters.timeline?.uninitialize(); }; await LOCK.uninitialize(callback, commit, dispatch, getters); }, // Fetch data from the SDK and initialize the page. - initializePage (context) { + initializePage(context) { context.getters.timeline.setStore(context).initialFetch(); }, // Fetch account data by address, publicKey or alias namespaceName - async fetchAccountDetail (context, payload) { + async fetchAccountDetail(context, payload) { let { address } = payload; try { @@ -208,22 +231,28 @@ export default { context.getters.OwnedNamespace.setStore(context).initialFetch(address); context.getters.multisig.setStore(context).initialFetch(address); context.getters.metadatas.setStore(context).initialFetch(address); - context.getters.mosaicAddressRestrictions.setStore(context).initialFetch(address); + context.getters.mosaicAddressRestrictions + .setStore(context) + .initialFetch(address); context.getters.harvestedBlocks.setStore(context).initialFetch(address); - context.getters.accountRestrictions.setStore(context).initialFetch(address); + context.getters.accountRestrictions + .setStore(context) + .initialFetch(address); context.getters.hashLocks.setStore(context).initialFetch(address); context.getters.secretLocks.setStore(context).initialFetch(address); context.getters.receipt.setStore(context).initialFetch(address); }, - uninitializeDetail (context) { + uninitializeDetail(context) { context.getters.info.setStore(context).uninitialize(); context.getters.OwnedMosaic.setStore(context).uninitialize(); context.getters.OwnedNamespace.setStore(context).uninitialize(); context.getters.multisig.setStore(context).uninitialize(); context.getters.transactions.setStore(context).uninitialize(); context.getters.metadatas.setStore(context).uninitialize(); - context.getters.mosaicAddressRestrictions.setStore(context).uninitialize(); + context.getters.mosaicAddressRestrictions + .setStore(context) + .uninitialize(); context.getters.harvestedBlocks.setStore(context).uninitialize(); context.getters.accountRestrictions.setStore(context).uninitialize(); context.getters.hashLocks.setStore(context).uninitialize(); diff --git a/src/store/chain.js b/src/store/chain.js index bc7322b5d..285cdf81d 100644 --- a/src/store/chain.js +++ b/src/store/chain.js @@ -138,7 +138,7 @@ export default { // commit('setMarketData', { marketData, graphData }); if (nodeStats) - commit('setNodeStats', nodeStats.nodeTypes); + commit('setNodeStats', nodeStats); }, async getChainInfo ({ commit }) { diff --git a/src/store/namespace.js b/src/store/namespace.js index 296e0a157..cef7e27f2 100644 --- a/src/store/namespace.js +++ b/src/store/namespace.js @@ -33,24 +33,25 @@ const LOCK = Lock.create(); const managers = [ new Pagination({ name: 'timeline', - fetchFunction: (pageInfo, filterValue) => NamespaceService.getNamespaceList(pageInfo, filterValue), + fetchFunction: (pageInfo, filterValue) => + NamespaceService.getNamespaceList(pageInfo, filterValue), pageInfo: { pageSize: Constants.PageSize }, filter: filters.namespace }), - new DataSet( - 'info', - namespaceOrHex => NamespaceService.getNamespaceInfo(namespaceOrHex) - ), - new DataSet( - 'namespaceLevel', - namespaceOrHex => NamespaceService.getNamespaceLevelList(namespaceOrHex) - ), + new DataSet('info', namespaceOrHex => + NamespaceService.getNamespaceInfo(namespaceOrHex)), + new DataSet('namespaceLevel', namespaceOrHex => + NamespaceService.getNamespaceLevelList(namespaceOrHex)), new Pagination({ name: 'metadatas', fetchFunction: (pageInfo, filterValue, store) => - NamespaceService.getNamespaceMetadataList(pageInfo, filterValue, store.getters.getCurrentNamespaceId), + NamespaceService.getNamespaceMetadataList( + pageInfo, + filterValue, + store.getters.getCurrentNamespaceId + ), pageInfo: { pageSize: 10 }, @@ -59,7 +60,10 @@ const managers = [ new Pagination({ name: 'balanceTransferReceipt', fetchFunction: (pageInfo, filterValue, store) => - NamespaceService.getNamespaceBalanceTransferReceipt(pageInfo, store.getters.getCurrentNamespaceId), + NamespaceService.getNamespaceBalanceTransferReceipt( + pageInfo, + store.getters.getCurrentNamespaceId + ), pageInfo: { pageSize: 10 } @@ -67,7 +71,10 @@ const managers = [ new Pagination({ name: 'artifactExpiryReceipt', fetchFunction: (pageInfo, filterValue, store) => - NamespaceService.getNamespaceArtifactExpiryReceipt(pageInfo, store.getters.getCurrentNamespaceId), + NamespaceService.getNamespaceArtifactExpiryReceipt( + pageInfo, + store.getters.getCurrentNamespaceId + ), pageInfo: { pageSize: 10 } @@ -85,7 +92,8 @@ export default { getters: { getInitialized: state => state.initialized, getCurrentNamespaceId: state => state.currentNamespaceId, - getRecentList: state => state.timeline?.data?.filter((item, index) => 4 > index) || [], + getRecentList: state => + state.timeline?.data?.filter((item, index) => 4 > index) || [], ...getGettersFromManagers(managers) }, mutations: { @@ -100,7 +108,7 @@ export default { actions: { ...getActionsFromManagers(managers), // Initialize the namespace model. - async initialize ({ commit, dispatch, getters }) { + async initialize({ commit, dispatch, getters }) { const callback = async () => { await dispatch('initializePage'); }; @@ -109,7 +117,7 @@ export default { }, // Uninitialize the namespace model. - async uninitialize ({ commit, dispatch, getters }) { + async uninitialize({ commit, dispatch, getters }) { const callback = async () => { dispatch('uninitializeDetail'); getters.timeline?.uninitialize(); @@ -119,22 +127,30 @@ export default { }, // Fetch data from the SDK and initialize the page. - initializePage (context) { + initializePage(context) { context.getters.timeline.setStore(context).initialFetch(); }, // Fetch data from the SDK. - fetchNamespaceInfo (context, payload) { + fetchNamespaceInfo(context, payload) { context.dispatch('uninitializeDetail'); context.commit('setCurrentNamespaceId', payload.namespaceId); context.getters.info.setStore(context).initialFetch(payload.namespaceId); - context.getters.namespaceLevel.setStore(context).initialFetch(payload.namespaceId); - context.getters.metadatas.setStore(context).initialFetch(payload.namespaceId); - context.getters.balanceTransferReceipt.setStore(context).initialFetch(payload.namespaceId); - context.getters.artifactExpiryReceipt.setStore(context).initialFetch(payload.namespaceId); + context.getters.namespaceLevel + .setStore(context) + .initialFetch(payload.namespaceId); + context.getters.metadatas + .setStore(context) + .initialFetch(payload.namespaceId); + context.getters.balanceTransferReceipt + .setStore(context) + .initialFetch(payload.namespaceId); + context.getters.artifactExpiryReceipt + .setStore(context) + .initialFetch(payload.namespaceId); }, - uninitializeDetail (context) { + uninitializeDetail(context) { context.getters.info.setStore(context).uninitialize(); context.getters.namespaceLevel.setStore(context).uninitialize(); context.getters.metadatas.setStore(context).uninitialize(); diff --git a/src/store/node.js b/src/store/node.js index bb3afabc0..7b8fccf0e 100644 --- a/src/store/node.js +++ b/src/store/node.js @@ -31,7 +31,7 @@ import { NodeService, StatisticService } from '../infrastructure'; const managers = [ new Pagination({ name: 'timeline', - fetchFunction: (pageInfo, filterValue) => NodeService.getNodePeerList(filterValue), + fetchFunction: (pageInfo, filterValue) => NodeService.getAvailableNodeList(filterValue), filter: filters.nodeRoles }), new DataSet( diff --git a/src/store/ui.js b/src/store/ui.js index be18bb7a0..93baa0f33 100644 --- a/src/store/ui.js +++ b/src/store/ui.js @@ -103,7 +103,7 @@ export default { search: ({ dispatch, rootGetters }, _searchString) => { return new Promise(async (resolve, reject) => { if (null !== _searchString && '' !== _searchString) { - const searchString = _searchString.replace(/\s|-/g, ''); + const searchString = _searchString.replace(/\s/g, ''); if (helper.isBlockHeight(searchString)) { dispatch('openPage', { pageName: 'block',