├── .circleci └── config.yml ├── .dependabot └── config.yml ├── .editorconfig ├── Classes ├── Aspect │ ├── CollectDebugInformationAspect.php │ ├── ContentCacheSegmentAspect.php │ └── RuntimeTracingAspect.php ├── Http │ └── Middleware │ │ ├── AddServerTimingMiddleware.php │ │ └── MeasureServerTimingMiddleware.php ├── Logging │ └── DebugStack.php └── Service │ ├── DebugService.php │ └── RenderTimer.php ├── Configuration └── Settings.yaml ├── LICENSE ├── README.md ├── Resources ├── Private │ └── Fusion │ │ └── Root.fusion └── Public │ ├── Script │ └── main.js │ └── Style │ └── main.css ├── composer.json ├── composer.json.ci ├── e2e ├── .gitignore ├── Settings.yaml ├── cypress.json ├── cypress │ ├── integration │ │ └── debug-console │ │ │ ├── cacheModule.ts │ │ │ ├── sqlModule.ts │ │ │ └── usage.ts │ ├── plugins │ │ └── index.js │ ├── support │ │ ├── commands.js │ │ └── index.js │ └── tsconfig.json ├── package-lock.json └── package.json ├── phpcs.xml.dist ├── server-timing-example.jpg └── t3n-neos-debug.jpg /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | aliases: 4 | - &ci-build-image quay.io/yeebase/ci-build:7.3 5 | - &workspace_root ~/workspace 6 | 7 | - &save_composer_cache 8 | key: composer-cache-v1-{{ .Branch }}-{{ checksum "composer.json" }} 9 | paths: 10 | - /composer/cache-dir 11 | 12 | - &restore_composer_cache 13 | keys: 14 | - composer-cache-v1-{{ .Branch }}-{{ checksum "composer.json.ci" }} 15 | - composer-cache-v1-{{ .Branch }}- 16 | - composer-cache-v1- 17 | 18 | - &save_js_packages 19 | key: js-packages-v2-{{ .Branch }}-{{ checksum "neos-debug/e2e/package-lock.json" }} 20 | paths: 21 | - /root/.npm 22 | - /root/.cache/Cypress 23 | 24 | - &restore_js_packages 25 | keys: 26 | - js-packages-v2-{{ .Branch }}-{{ checksum "e2e/package-lock.json" }} 27 | - js-packages-v2-{{ .Branch }}- 28 | - js-packages-v2- 29 | 30 | - &attach_workspace 31 | at: *workspace_root 32 | 33 | - &persist_to_workspace 34 | root: . 35 | paths: 36 | - . 37 | 38 | jobs: 39 | checkout: 40 | docker: 41 | - image: *ci-build-image 42 | environment: 43 | COMPOSER_CACHE_DIR: /composer/cache-dir 44 | steps: 45 | - checkout 46 | - restore_cache: *restore_composer_cache 47 | - restore_cache: *restore_js_packages 48 | 49 | - run: | 50 | mkdir neos-debug 51 | shopt -s extglob dotglob 52 | mv !(neos-debug) neos-debug 53 | shopt -u dotglob 54 | cp neos-debug/composer.json.ci composer.json 55 | cp neos-debug/phpcs.xml.dist phpcs.xml.dist 56 | composer update 57 | mkdir -p Configuration 58 | cp neos-debug/e2e/Settings.yaml Configuration/Settings.yaml 59 | 60 | - run: cd neos-debug/e2e && npm ci 61 | 62 | - save_cache: *save_composer_cache 63 | - save_cache: *save_js_packages 64 | - persist_to_workspace: *persist_to_workspace 65 | 66 | lint: 67 | working_directory: *workspace_root 68 | docker: 69 | - image: *ci-build-image 70 | steps: 71 | - attach_workspace: *attach_workspace 72 | - run: bin/phpcs neos-debug/Classes 73 | 74 | e2e: 75 | working_directory: *workspace_root 76 | environment: 77 | FLOW_CONTEXT: Production 78 | docker: 79 | - image: *ci-build-image 80 | - image: circleci/mariadb:10.2 81 | environment: 82 | MYSQL_DATABASE: neos-debug 83 | MYSQL_ROOT_PASSWORD: some-password 84 | steps: 85 | - attach_workspace: *attach_workspace 86 | - restore_cache: 87 | keys: 88 | - js-packages-v2-{{ .Branch }}-{{ checksum "neos-debug/e2e/package-lock.json" }} 89 | - js-packages-v2-{{ .Branch }}- 90 | - js-packages-v2- 91 | 92 | - run: | 93 | ./flow flow:cache:flush 94 | ./flow flow:cache:warmup 95 | ./flow doctrine:migrate 96 | ./flow resource:publish 97 | ./flow site:import --package-key Neos.Demo 98 | - run: 99 | name: Start flow server 100 | command: ./flow server:run --port 8081 101 | background: true 102 | - run: cd neos-debug/e2e && npm run cy 103 | 104 | - store_artifacts: 105 | path: neos-debug/e2e/cypress/videos 106 | - store_artifacts: 107 | path: neos-debug/e2e/cypress/screenshots 108 | - store_artifacts: 109 | path: Data/Logs 110 | 111 | workflows: 112 | version: 2 113 | build_and_test: 114 | jobs: 115 | - checkout: 116 | filters: 117 | branches: 118 | ignore: /dependabot.*/ 119 | - lint: 120 | requires: 121 | - checkout 122 | - e2e: 123 | requires: 124 | - checkout 125 | 126 | build_and_test_dependabot: 127 | jobs: 128 | - hold: 129 | type: approval 130 | filters: 131 | branches: 132 | only: /dependabot.*/ 133 | - checkout: 134 | requires: 135 | - hold 136 | - lint: 137 | requires: 138 | - checkout 139 | - e2e: 140 | requires: 141 | - checkout 142 | -------------------------------------------------------------------------------- /.dependabot/config.yml: -------------------------------------------------------------------------------- 1 | version: 1 2 | update_configs: 3 | - package_manager: "php:composer" 4 | directory: "/" 5 | update_schedule: "weekly" 6 | target_branch: "master" 7 | - package_manager: "javascript" 8 | directory: "/e2e" 9 | update_schedule: "weekly" 10 | target_branch: "master" 11 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.js] 4 | indent_size = 2 5 | -------------------------------------------------------------------------------- /Classes/Aspect/CollectDebugInformationAspect.php: -------------------------------------------------------------------------------- 1 | render()) && t3n\Neos\Debug\Aspect\CollectDebugInformationAspect->debuggingActive") 83 | * @Flow\Around("method(Neos\Fusion\View\FusionView->render()) && t3n\Neos\Debug\Aspect\CollectDebugInformationAspect->debuggingActive") 84 | * 85 | * @param \Neos\Flow\AOP\JoinPointInterface $joinPoint 86 | * 87 | * @return string|Response 88 | */ 89 | public function addDebugValues(JoinPointInterface $joinPoint) 90 | { 91 | $startRenderAt = microtime(true) * 1000; 92 | $response = $joinPoint->getAdviceChain()->proceed($joinPoint); 93 | $endRenderAt = microtime(true) * 1000; 94 | 95 | $renderTime = round($endRenderAt - $startRenderAt, 2); 96 | $sqlExecutionTime = round($this->sqlLoggingStack->executionTime, 2); 97 | 98 | if ($this->serverTimingHeaderEnabled) { 99 | $this->debugService->addMetric('fusionRenderTime', $renderTime, 'Fusion rendering'); 100 | $this->debugService->addMetric('sqlExecutionTime', $sqlExecutionTime, 'Combined SQL execution'); 101 | if ($this->contentCacheMisses === 0) { 102 | $this->debugService->addMetric('contentCacheHit', null, 'Content cache hit'); 103 | } else { 104 | $this->debugService->addMetric('contentCacheMiss', null, 'Content cache miss'); 105 | } 106 | } 107 | 108 | if (! $this->htmlOutputEnabled) { 109 | return $response; 110 | } 111 | 112 | if ($response instanceof Response) { 113 | $output = $response->getBody()->getContents(); 114 | $response->getBody()->rewind(); 115 | 116 | if ($response->getHeader('Content-Type') !== 'text/html' 117 | && strpos($output, '') === false) { 118 | return $response; 119 | } 120 | } else { 121 | $output = $response; 122 | } 123 | 124 | $data = [ 125 | 'startRenderAt' => $startRenderAt, 126 | 'endRenderAt' => $endRenderAt, 127 | 'renderTime' => $renderTime, 128 | 'sqlData' => [ 129 | 'queryCount' => $this->sqlLoggingStack->queryCount, 130 | 'executionTime' => $sqlExecutionTime, 131 | 'tables' => $this->sqlLoggingStack->tables, 132 | 'slowQueries' => $this->sqlLoggingStack->slowQueries, 133 | ], 134 | 'cCacheHits' => $this->contentCacheHits, 135 | 'cCacheMisses' => $this->contentCacheMisses, 136 | ]; 137 | 138 | $debugOutput = ''; 139 | $htmlEndPosition = strpos($output, ''); 140 | 141 | if ($htmlEndPosition === false) { 142 | $output .= $debugOutput; 143 | } else { 144 | $output = substr($output, 0, $htmlEndPosition) . $debugOutput . substr($output, $htmlEndPosition); 145 | } 146 | 147 | if ($response instanceof Response) { 148 | return $response->withBody(Utils::streamFor($output)); 149 | } 150 | return $output; 151 | } 152 | 153 | /** 154 | * @Flow\Before("method(Neos\Flow\Mvc\Routing\Router->route()) && t3n\Neos\Debug\Aspect\CollectDebugInformationAspect->debuggingActive") 155 | */ 156 | public function startSqlLogging(\Neos\Flow\AOP\JoinPointInterface $joinPoint): void 157 | { 158 | $this->sqlLoggingStack = new DebugStack(); 159 | $this->entityManager->getConfiguration()->setSQLLogger($this->sqlLoggingStack); 160 | } 161 | 162 | /** 163 | * @Flow\Around("method(Neos\Fusion\Core\Cache\ContentCache->getCachedSegment()) && t3n\Neos\Debug\Aspect\CollectDebugInformationAspect->debuggingActive") 164 | * 165 | * @phpcsSuppress SlevomatCodingStandard.TypeHints.ReturnTypeHint.MissingAnyTypeHint 166 | */ 167 | public function addCacheMiss(\Neos\Flow\AOP\JoinPointInterface $joinPoint) 168 | { 169 | $fusionPath = $joinPoint->getMethodArgument('fusionPath'); 170 | 171 | $result = $joinPoint->getAdviceChain()->proceed($joinPoint); 172 | if ($result === false) { 173 | $this->contentCacheMisses[]= $fusionPath; 174 | } 175 | return $result; 176 | } 177 | 178 | /** 179 | * @Flow\AfterReturning("method(Neos\Fusion\Core\Cache\ContentCache->replaceCachePlaceholders()) && t3n\Neos\Debug\Aspect\CollectDebugInformationAspect->debuggingActive") 180 | */ 181 | public function addCacheHit(\Neos\Flow\AOP\JoinPointInterface $joinPoint): void 182 | { 183 | $result = $joinPoint->getResult(); 184 | $this->contentCacheHits += $result; 185 | } 186 | } 187 | -------------------------------------------------------------------------------- /Classes/Aspect/ContentCacheSegmentAspect.php: -------------------------------------------------------------------------------- 1 | cacheSegmentTail = ContentCache::CACHE_SEGMENT_END_TOKEN . $randomCacheMarker; 61 | } 62 | 63 | /** 64 | * @Flow\Pointcut("setting(t3n.Neos.Debug.enabled) && setting(t3n.Neos.Debug.htmlOutput.enabled)") 65 | */ 66 | public function debuggingActive(): void 67 | { 68 | } 69 | 70 | /** 71 | * @Flow\Around("method(Neos\Fusion\Core\Cache\ContentCache->createCacheSegment()) && t3n\Neos\Debug\Aspect\ContentCacheSegmentAspect->debuggingActive") 72 | */ 73 | public function wrapCachedSegment(JoinPointInterface $joinPoint): string 74 | { 75 | $segment = $joinPoint->getAdviceChain()->proceed($joinPoint); 76 | $fusionPath = $joinPoint->getMethodArgument('fusionPath'); 77 | $renderTime = $this->renderTimer->stop($fusionPath); 78 | 79 | return $this->renderCacheInfoIntoSegment($segment, [ 80 | 'mode' => static::MODE_CACHED, 81 | 'fusionPath' => $fusionPath, 82 | 'renderMetrics' => $renderTime, 83 | 'entryIdentifier' => $this->interceptedCacheEntryValues, 84 | 'entryTags' => $joinPoint->getMethodArgument('tags'), 85 | 'lifetime' => $joinPoint->getMethodArgument('lifetime') 86 | ]); 87 | } 88 | 89 | /** 90 | * @Flow\Around("method(Neos\Fusion\Core\Cache\RuntimeContentCache->evaluateUncached()) && t3n\Neos\Debug\Aspect\ContentCacheSegmentAspect->debuggingActive") 91 | * 92 | * @return mixed the result of uncached segments might not be of type string, so we cannot define the return type 93 | */ 94 | public function wrapEvaluateUncached(JoinPointInterface $joinPoint) 95 | { 96 | $start = microtime(true); 97 | $segment = $joinPoint->getAdviceChain()->proceed($joinPoint); 98 | $end = microtime(true); 99 | 100 | return $this->renderCacheInfoIntoSegment($segment, [ 101 | 'mode' => static::MODE_UNCACHED, 102 | 'renderTime' => round(($end - $start) * 1000, 2) . ' ms', 103 | 'fusionPath' => $joinPoint->getMethodArgument('path'), 104 | 'contextVariables' => array_keys($joinPoint->getMethodArgument('contextArray')), 105 | '' 106 | ]); 107 | } 108 | 109 | /** 110 | * @Flow\Around("method(Neos\Fusion\Core\Cache\ContentCache->createUncachedSegment()) && t3n\Neos\Debug\Aspect\ContentCacheSegmentAspect->debuggingActive") 111 | */ 112 | public function wrapUncachedSegment(JoinPointInterface $joinPoint): string 113 | { 114 | $segment = $joinPoint->getAdviceChain()->proceed($joinPoint); 115 | 116 | return $this->renderCacheInfoIntoSegment($segment, [ 117 | 'mode' => static::MODE_UNCACHED, 118 | 'fusionPath' => $joinPoint->getMethodArgument('fusionPath'), 119 | 'contextVariables' => array_keys($joinPoint->getMethodArgument('contextVariables')), 120 | ]); 121 | } 122 | 123 | /** 124 | * @Flow\Around("method(Neos\Fusion\Core\Cache\ContentCache->createDynamicCachedSegment()) && t3n\Neos\Debug\Aspect\ContentCacheSegmentAspect->debuggingActive") 125 | */ 126 | public function wrapDynamicSegment(JoinPointInterface $joinPoint): string 127 | { 128 | $segment = $joinPoint->getAdviceChain()->proceed($joinPoint); 129 | 130 | return $this->renderCacheInfoIntoSegment($segment, [ 131 | 'mode' => static::MODE_DYNAMIC, 132 | 'fusionPath' => $joinPoint->getMethodArgument('fusionPath'), 133 | 'entryIdentifier' => $this->interceptedCacheEntryValues, 134 | 'entryTags' => $joinPoint->getMethodArgument('tags'), 135 | 'lifetime' => $joinPoint->getMethodArgument('lifetime'), 136 | 'contextVariables' => array_keys($joinPoint->getMethodArgument('contextVariables')), 137 | 'entryDiscriminator' => $joinPoint->getMethodArgument('cacheDiscriminator'), 138 | ]); 139 | } 140 | 141 | /** 142 | * @Flow\Around("method(Neos\Fusion\Core\Cache\ContentCache->renderContentCacheEntryIdentifier()) && t3n\Neos\Debug\Aspect\ContentCacheSegmentAspect->debuggingActive") 143 | */ 144 | public function interceptContentCacheEntryIdentifier(JoinPointInterface $joinPoint): string 145 | { 146 | $fusionPath = $joinPoint->getMethodArgument('fusionPath'); 147 | $cacheIdentifierValues = $joinPoint->getMethodArgument('cacheIdentifierValues'); 148 | $this->interceptedCacheEntryValues = []; 149 | 150 | foreach ($cacheIdentifierValues as $key => $value) { 151 | if ($value instanceof CacheAwareInterface) { 152 | $this->interceptedCacheEntryValues[$key] = $value->getCacheEntryIdentifier(); 153 | } elseif (is_string($value) || is_bool($value) || is_int($value)) { 154 | $this->interceptedCacheEntryValues[$key] = $value; 155 | } 156 | } 157 | 158 | $result = $joinPoint->getAdviceChain()->proceed($joinPoint); 159 | $this->interceptedCacheEntryValues['[fusionPath]'] = htmlspecialchars($fusionPath); 160 | $this->interceptedCacheEntryValues['=> hashed identifier'] = $result; 161 | return $result; 162 | } 163 | 164 | /** 165 | * @Flow\Before("method(Neos\Fusion\Core\Cache\RuntimeContentCache->postProcess()) && t3n\Neos\Debug\Aspect\ContentCacheSegmentAspect->debuggingActive") 166 | */ 167 | public function interceptFusionObject(JoinPointInterface $joinPoint): void 168 | { 169 | $this->interceptedFusionObject = $joinPoint->getMethodArgument('fusionObject'); 170 | } 171 | 172 | /** 173 | * @param mixed $segment This is mixed as the RuntimeContentCache might also return none string values 174 | * @param mixed[] $info 175 | * 176 | * @return mixed the cached data might not be of type string, so we cannot define the return type 177 | */ 178 | protected function renderCacheInfoIntoSegment($segment, array $info) 179 | { 180 | $injectPosition = 2; 181 | $info = array_slice($info, 0, $injectPosition, true) 182 | + ['fusionObject' => ObjectAccess::getProperty($this->interceptedFusionObject, 'fusionObjectName', true)] 183 | + array_slice($info, $injectPosition, count($info) - $injectPosition, true); 184 | 185 | // Add debug data only to html output 186 | $segmentFormat = $info['entryIdentifier']['format'] ?? null; 187 | 188 | if ($segmentFormat !== 'html') { 189 | return $segment; 190 | } 191 | 192 | $info['created'] = (new \DateTime())->format(DATE_W3C); 193 | 194 | $cCacheDebugData = ''; 195 | 196 | if (! is_string($segment)) { 197 | return $cCacheDebugData; 198 | } 199 | 200 | if ($info['mode'] === self::MODE_UNCACHED && strpos($segment, $this->cacheSegmentTail) === false) { 201 | // on a second page load, when outer caches are created, the uncached will be evaluated via 202 | // RuntimeContentCache->evaluateUncached() which won't add the cache marker. So we can just append 203 | // the meta data 204 | return $segment . $cCacheDebugData; 205 | } 206 | 207 | $segmentHead = substr($segment, 0, strlen($segment) - strlen($this->cacheSegmentTail)); 208 | $segmentEnd = $this->cacheSegmentTail; 209 | 210 | // Ensure we don't place comments outside of the html tag 211 | $htmlEndPosition = strpos($segmentHead, ''); 212 | if ($htmlEndPosition !== false) { 213 | $segmentEnd = substr($segmentHead, $htmlEndPosition) . $segmentEnd; 214 | $segmentHead = substr($segmentHead, 0, $htmlEndPosition); 215 | } 216 | 217 | return $segmentHead . $cCacheDebugData . $segmentEnd; 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /Classes/Aspect/RuntimeTracingAspect.php: -------------------------------------------------------------------------------- 1 | enter()) && t3n\Neos\Debug\Aspect\RuntimeTracingAspect->debuggingActive") 43 | */ 44 | public function onEnter(JoinPointInterface $joinPoint): void 45 | { 46 | $configuration = $joinPoint->getMethodArgument('configuration'); 47 | $fusionPath = $joinPoint->getMethodArgument('fusionPath'); 48 | 49 | $cacheMode = $configuration['mode'] ?? null; 50 | 51 | if (! $cacheMode) { 52 | return; 53 | } 54 | 55 | $this->renderTimer->start($fusionPath); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Classes/Http/Middleware/AddServerTimingMiddleware.php: -------------------------------------------------------------------------------- 1 | handle($request); 46 | 47 | if (! $this->enabled) { 48 | return $response; 49 | } 50 | 51 | $serverTiming = ''; 52 | $this->debugService->setStartRequestAt($request->getAttribute(MeasureServerTimingMiddleware::TIMING_ATTRIBUTE)); 53 | $metrics = $this->debugService->getMetrics(); 54 | foreach ($metrics as $key => ['value' => $value, 'description' => $description]) { 55 | $serverTiming .= ($serverTiming ? ', ' : '') . $key; 56 | if ($description) { 57 | $serverTiming .= ';desc="' . $description . '"'; 58 | } 59 | if ($value !== null) { 60 | $serverTiming .= ';dur=' . $value; 61 | } 62 | } 63 | 64 | return $response->withAddedHeader('Server-Timing', $serverTiming); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Classes/Http/Middleware/MeasureServerTimingMiddleware.php: -------------------------------------------------------------------------------- 1 | enabled) { 45 | $timerStart = $this->debugService->startRequestTimer(); 46 | $response = $handler->handle($request->withAttribute(self::TIMING_ATTRIBUTE, $timerStart)); 47 | } else { 48 | $response = $handler->handle($request); 49 | } 50 | 51 | return $response; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Classes/Logging/DebugStack.php: -------------------------------------------------------------------------------- 1 | parseTableName($sql); 67 | $this->queries[++$this->queryCount] = ['sql' => $sql, 'table' => $tableName, 'params' => $params, 'types' => $types, 'executionMS' => 0]; 68 | $this->startTime = microtime(true); 69 | } 70 | 71 | public function stopQuery(): void 72 | { 73 | $executionTime = (microtime(true) - $this->startTime) * 1000; 74 | $this->queries[$this->queryCount]['executionMS'] = $executionTime; 75 | $this->executionTime += $executionTime; 76 | 77 | if ($executionTime > $this->slowQueryAfter) { 78 | $this->slowQueries[] = $this->queries[$this->queryCount]; 79 | } 80 | 81 | $table = $this->queries[$this->queryCount]['table']; 82 | if (! array_key_exists($table, $this->tables)) { 83 | $this->tables[$table] = [ 84 | 'queryCount' => 1, 85 | 'executionTime' => $executionTime, 86 | ]; 87 | } else { 88 | $this->tables[$table]['queryCount']++; 89 | $this->tables[$table]['executionTime'] += $executionTime; 90 | } 91 | } 92 | 93 | protected function parseTableName(string $sql): string 94 | { 95 | $sql = strtolower($sql); 96 | $start = strpos($sql, 'from ') + 5; 97 | $end = strpos($sql, ' ', $start); 98 | $tableName = substr($sql, $start, $end - $start); 99 | 100 | if ($tableName === false) { 101 | return ''; 102 | } 103 | 104 | return $tableName; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /Classes/Service/DebugService.php: -------------------------------------------------------------------------------- 1 | startRequestAt = microtime(true) * 1000; 45 | } 46 | 47 | /** 48 | * Sets the starttime of the request 49 | */ 50 | public function setStartRequestAt(float $startRequestAt): void 51 | { 52 | $this->startRequestAt = $startRequestAt; 53 | } 54 | 55 | /** 56 | * Stops the timer for the request process 57 | */ 58 | public function stopRequestTime(): float 59 | { 60 | return $this->stopRequestAt = microtime(true) * 1000; 61 | } 62 | 63 | /** 64 | * Adds a metric which will be later appended to the http header 65 | * 66 | * @param string $name the short identifier for the metric 67 | * @param float|null $value a numeric float value with up to 2 decimals 68 | * @param string|null $description the short description for the metric 69 | */ 70 | public function addMetric(string $name, ?float $value = null, ?string $description = null): void 71 | { 72 | $this->metrics[$this->cleanString($name)] = [ 73 | 'value' => $value, 74 | 'description' => $this->cleanString($description), 75 | ]; 76 | } 77 | 78 | /** 79 | * Remove any special characters that might break the header 80 | */ 81 | protected function cleanString(string $input): string 82 | { 83 | return preg_replace('/[^A-Za-z0-9 ]/', '', $input); 84 | } 85 | 86 | /** 87 | * Returns the time elapsed since `startRequestTime` and will stop the timer 88 | * if it has not been stopped yet. 89 | */ 90 | public function getRequestTime(): float 91 | { 92 | if (! $this->stopRequestAt) { 93 | $this->stopRequestTime(); 94 | } 95 | return round($this->stopRequestAt - $this->startRequestAt, 2); 96 | } 97 | 98 | /** 99 | * Returns the list of stored metrics including the request time 100 | * 101 | * @return mixed[] 102 | */ 103 | public function getMetrics(): array 104 | { 105 | if (! array_key_exists('processRequest', $this->metrics)) { 106 | $this->addMetric('processRequest', $this->getRequestTime(), 'Process request'); 107 | } 108 | return $this->metrics; 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /Classes/Service/RenderTimer.php: -------------------------------------------------------------------------------- 1 | entityManager->getConfiguration()->getSQLLogger(); 44 | $queryCount = $sqlLoggingStack instanceof DebugStack ? $sqlLoggingStack->queryCount : 0; 45 | 46 | $this->renderMetrics[$fusionPath] = [ 47 | 'startRenderAt' => $this->ts(), 48 | 'sqlQueryCount' => $queryCount, 49 | ]; 50 | } 51 | 52 | /** 53 | * Return current microtime in ms 54 | */ 55 | private function ts(): float 56 | { 57 | return microtime(true) * 1000; 58 | } 59 | 60 | /** 61 | * Stops the timer and returns the computed values 62 | * 63 | * @return mixed[]|null 64 | */ 65 | public function stop(string $fusionPath): ?array 66 | { 67 | if (! array_key_exists($fusionPath, $this->renderMetrics)) { 68 | return null; 69 | } 70 | 71 | $metrics = $this->renderMetrics[$fusionPath]; 72 | $sqlLoggingStack = $this->entityManager->getConfiguration()->getSQLLogger(); 73 | $queryCount = $sqlLoggingStack instanceof DebugStack ? $sqlLoggingStack->queryCount : 0; 74 | 75 | return [ 76 | 'renderTime' => round($this->ts() - $metrics['startRenderAt'], 2) . ' ms', 77 | 'sqlQueryCount' => $queryCount - $metrics['sqlQueryCount'], 78 | ]; 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /Configuration/Settings.yaml: -------------------------------------------------------------------------------- 1 | t3n: 2 | Neos: 3 | Debug: 4 | enabled: false 5 | htmlOutput: 6 | enabled: true 7 | serverTimingHeader: 8 | enabled: false 9 | sql: 10 | # Set when a query should be considered as slow query. In ms 11 | slowQueryAfter: 10 12 | 13 | Neos: 14 | Neos: 15 | fusion: 16 | autoInclude: 17 | 't3n.Neos.Debug': true 18 | 19 | Flow: 20 | http: 21 | middlewares: 22 | t3n.Neos.Debug:MeasureServerTiming: 23 | position: 'start 999' 24 | middleware: 't3n\Neos\Debug\Http\Middleware\MeasureServerTimingMiddleware' 25 | t3n.Neos.Debug:AddServerTimingHeader: 26 | position: 'before dispatch 999' 27 | middleware: 't3n\Neos\Debug\Http\Middleware\AddServerTimingMiddleware' 28 | 29 | reflection: 30 | ignoredTags: 31 | 'phpcsSuppress': true 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 yeebase media GmbH 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![CircleCI](https://circleci.com/gh/t3n/neos-debug.svg?style=svg)](https://circleci.com/gh/t3n/neos-debug) [![Latest Stable Version](https://poser.pugx.org/t3n/neos-debug/v/stable)](https://packagist.org/packages/t3n/neos-debug) [![License](https://poser.pugx.org/t3n/neos-debug/license)](https://packagist.org/packages/t3n/neos-debug) 2 | 3 | # t3n.Neos.Debug 4 | 5 | The t3n.Neos.Debug package is a small helper package to add a debug panel to your Neos CMS website. 6 | At this point in time you're able to debug your content cache configuration as well as sql queries. 7 | Additionally, the Server-Timing http header can be enabled that will add request timings to responses. 8 | Those then can be viewed in the browser network tab. 9 | 10 | _Note: This is still a very early rough version. Contributions are welcome in any Error. Nevertheless, it's already adding value to your debug experience_ 11 | 12 | ![Neos CMS Demo Site with enabled debug console](t3n-neos-debug.jpg 'Neos CMS Demo Site with enabled debug console') 13 | ![Server-Timing header in the browser network tab](server-timing-example.jpg 'Viewing the timings in the browser network tab') 14 | 15 | ## Installation & configuration 16 | 17 | Install the package via composer 18 | 19 | ``` 20 | composer require t3n/neos-debug --dev 21 | ``` 22 | 23 | The debug mode is disabled by default. To enable it add this to your Settings.yaml 24 | 25 | ```yaml 26 | t3n: 27 | Neos: 28 | Debug: 29 | enabled: true 30 | ``` 31 | 32 | To bring up the debug panel run this command in your js console: 33 | ```js 34 | __enable_neos_debug__() 35 | ``` 36 | 37 | _Disclaimer: Once the debug mode is enabled you might expose sensitive data. Make sure to **not** use this in production. At least be warned_ 38 | 39 | In a previous version of this package your current user needed a specific role as well. We dropped this requirement for now as you could not use this package if you don't have a frontend login on your site. Once the package is active it will render some metadata in your html output. 40 | 41 | To get the debugger running you now need to include some javascript and css to acutally render the debug console. This package ships two fusion prototypes to include all resources. If your Document extends `Neos.Neos:Page` you don't need to include anything. We already added the resources to `Neos.Neos:Page` prototype. 42 | 43 | ### HTTP Server-Timing header 44 | 45 | The header is disabled by default. To enable it add this to your Settings.yaml 46 | 47 | ```yaml 48 | t3n: 49 | Neos: 50 | Debug: 51 | serverTimingHeader: 52 | enabled: true 53 | ``` 54 | 55 | If you only want the header with all timings but not the debug mode, do this: 56 | 57 | ```yaml 58 | t3n: 59 | Neos: 60 | Debug: 61 | enabled: true 62 | htmlOutput: 63 | enabled: false 64 | serverTimingHeader: 65 | enabled: true 66 | ``` 67 | 68 | ## Usage 69 | 70 | To enable the cache visualization open your browsers developer console and execute 71 | `__enable_neos_debug__()`. This will bring up the debug console at the bottom of your screen. 72 | 73 | ### 🔦 Inspect 74 | 75 | Once you enable the inspect mode a visualization will pop up and add overlays on your cached parts. Cached parts are marked green, uncached red and dynamic caches are marked yellow. If you hover the loupe you will also see some meta data regarding the cache. 76 | 77 | ### ⚡️ Cache 78 | 79 | This module will add a new modal including some statistics regarding cache hits and misses as well as a table of all rendered cache entries. 80 | 81 | ### 🗄 SQL 82 | 83 | In addition to the content cache we're also exposing some debug SQL informations and statistics. It will also detect slow queries. You can configure from when a query should be marked as slow: 84 | 85 | ```yaml 86 | t3n: 87 | Neos: 88 | Debug: 89 | sql: 90 | # Set when a query should be considered as slow query. In ms 91 | slowQueryAfter: 10 92 | ``` 93 | 94 | ### 🚫 Close 95 | 96 | To shutdown the debug console simply close it. If you'd like to persist the active debug state you can add a `true` to the method 97 | 98 | ``` 99 | __enable_neos_debug__(true) 100 | ``` 101 | 102 | This will set a cookie and the debug mode will still be active after a page refresh. 103 | -------------------------------------------------------------------------------- /Resources/Private/Fusion/Root.fusion: -------------------------------------------------------------------------------- 1 | 2 | prototype(t3n.Neos.Debug:Styles) < prototype(Neos.Fusion:Tag) { 3 | tagName = 'link' 4 | attributes { 5 | rel = 'stylesheet' 6 | href = Neos.Fusion:ResourceUri { 7 | path = 'resource://t3n.Neos.Debug/Public/Style/main.css' 8 | } 9 | } 10 | 11 | @if.notInBackend = ${!documentNode.context.inBackend} 12 | @if.isActive = ${Configuration.setting('t3n.Neos.Debug.enabled') && Configuration.setting('t3n.Neos.Debug.htmlOutput.enabled')} 13 | } 14 | 15 | prototype(t3n.Neos.Debug:JavaScript) < prototype(Neos.Fusion:Tag) { 16 | tagName = 'script' 17 | attributes { 18 | src = Neos.Fusion:ResourceUri { 19 | path = 'resource://t3n.Neos.Debug/Public/Script/main.js' 20 | } 21 | } 22 | 23 | @if.notInBackend = ${!documentNode.context.inBackend} 24 | @if.isHtml = ${request.format == 'html'} 25 | @if.isActive = ${Configuration.setting('t3n.Neos.Debug.enabled') && Configuration.setting('t3n.Neos.Debug.htmlOutput.enabled')} 26 | } 27 | 28 | prototype(Neos.Neos:Page) { 29 | head.contentCacheDebugStyle = t3n.Neos.Debug:Styles { 30 | @position = 'end' 31 | } 32 | contentCacheDebugScript = t3n.Neos.Debug:JavaScript { 33 | @position = 'before closingBodyTag' 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Resources/Public/Script/main.js: -------------------------------------------------------------------------------- 1 | window.__enable_neos_debug__ = (setCookie = false) => { 2 | if (window.__enable_neos_debug__.active) { 3 | return; 4 | } 5 | 6 | if (setCookie) { 7 | document.cookie = '__neos_debug__=true;path=/'; 8 | } 9 | 10 | console.log('%c Starting Neos Debug Tool ... ', 'color: white; background: #f9423a; line-height: 20px; font-weight: bold'); 11 | if (!setCookie) { 12 | console.log('Start the Debug tool with "__enable_neos_debug__(true)" to start up the Debug tool on every page load'); 13 | } 14 | console.log('If you have any issues or feature requests checkout the repository at https://github.com/t3n/neos-debug'); 15 | 16 | window.__enable_neos_debug__.active = true; 17 | 18 | const PREFIX = '__T3N_CONTENT_CACHE_DEBUG__'; 19 | const DEBUG_PREFIX = '__T3N_NEOS_DEBUG__'; 20 | const mouseOffset = 10; 21 | 22 | // parse content cache comments 23 | const cCacheTreeWalker = document.createTreeWalker(document.getRootNode(), NodeFilter.SHOW_COMMENT, node => (node.nodeValue.indexOf(PREFIX) === 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP), false); 24 | const cCacheNodes = []; 25 | while (cCacheTreeWalker.nextNode()) { 26 | cCacheNodes.push(cCacheTreeWalker.currentNode); 27 | } 28 | 29 | // parse debug values 30 | const debugValuesWalker = document.createTreeWalker(document.getRootNode(), NodeFilter.SHOW_COMMENT, node => (node.nodeValue.indexOf(DEBUG_PREFIX) === 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP), false); 31 | const dataNode = debugValuesWalker.nextNode(); 32 | let debugInfos = {}; 33 | if (dataNode) { 34 | debugInfos = JSON.parse(dataNode.nodeValue.substring(DEBUG_PREFIX.length)); 35 | } 36 | 37 | if (!Object.keys(debugInfos).length) return; 38 | 39 | debugInfos.cCacheUncached = 0; 40 | 41 | // Takes an ISO time and returns a string representing how 42 | // long ago the date represents. 43 | function prettyDate(time) { 44 | var date = new Date((time || "").replace(/-/g, "/").replace(/[TZ]/g, " ")), 45 | diff = (((new Date()).getTime() - date.getTime()) / 1000), 46 | day_diff = Math.floor(diff / 86400); 47 | 48 | if (isNaN(day_diff) || day_diff < 0 || day_diff >= 31) return; 49 | 50 | return day_diff === 0 && ( 51 | diff < 60 && "just now" || diff < 120 && "1 minute ago" || diff < 3600 && Math.floor(diff / 60) + " minutes ago" || diff < 7200 && "1 hour ago" || diff < 86400 && Math.floor(diff / 3600) + " hours ago") || day_diff === 1 && "Yesterday" || day_diff < 7 && day_diff + " days ago" || day_diff < 31 && Math.ceil(day_diff / 7) + " weeks ago"; 52 | } 53 | 54 | const infoElements = []; 55 | const createInfoElement = ({ parentNode, cacheInfo, index }) => { 56 | if (cacheInfo.mode === 'uncached') { 57 | debugInfos.cCacheUncached++; 58 | } 59 | 60 | const container = document.createElement('div'); 61 | container.classList.add('t3n__content-cache-debug-container'); 62 | 63 | const button = document.createElement('button'); 64 | button.innerText = '🔎'; 65 | container.appendChild(button); 66 | 67 | const overlay = document.createElement('div'); 68 | overlay.classList.add(cacheInfo.mode); 69 | container.appendChild(overlay); 70 | 71 | const table = document.createElement('table'); 72 | table.classList.add('t3n__content-cache-debug-table'); 73 | 74 | const clone = parentNode.cloneNode(); 75 | clone.innerHTML = ''; 76 | cacheInfo['created'] = new Date(cacheInfo['created']).toLocaleString() + (cacheInfo['mode'] !== 'uncached' ? ' - ' + prettyDate(cacheInfo['created']) : ''); 77 | cacheInfo['markup'] = 78 | clone.outerHTML 79 | .replace(/<\/.+/, '') 80 | .replace(//g, '>') 82 | .substring(0, 150) + ' ...'; 83 | 84 | Object.keys(cacheInfo).forEach(key => { 85 | const tr = document.createElement('tr'); 86 | const firstCell = document.createElement('td'); 87 | const secondCell = document.createElement('td'); 88 | 89 | firstCell.innerText = key; 90 | secondCell.classList.add(key.toLowerCase()); 91 | 92 | let value = cacheInfo[key]; 93 | 94 | if (value === null) { 95 | return; 96 | } 97 | 98 | let arrayValue; 99 | if (Array.isArray(value)) { 100 | arrayValue = value.map((v, i) => `${i}: ${v}`); 101 | } else if (typeof value === 'object') { 102 | arrayValue = Object.keys(value).map(subKey => `${subKey}: ${value[subKey]}`); 103 | } 104 | 105 | if (arrayValue) { 106 | secondCell.classList.add('object-values'); 107 | if (arrayValue.length > 10) { 108 | arrayValue = arrayValue 109 | .slice(0, 5) 110 | .concat(['....']) 111 | .concat(arrayValue.slice(arrayValue.length - 5)); 112 | } 113 | secondCell.innerHTML = arrayValue.join(''); 114 | } else { 115 | secondCell.innerHTML = value; 116 | } 117 | 118 | tr.appendChild(firstCell); 119 | tr.appendChild(secondCell); 120 | table.appendChild(tr); 121 | }); 122 | 123 | let left = 0; 124 | let top = 0; 125 | 126 | const positionTable = event => { 127 | let x = event.pageX - left + mouseOffset; 128 | let y = event.pageY - top + mouseOffset; 129 | 130 | const rightEdge = x + table.offsetWidth + left - window.scrollX; 131 | if (rightEdge > window.innerWidth) { 132 | x -= rightEdge - window.innerWidth; 133 | } 134 | 135 | const bottomEdge = y + table.offsetHeight + top - window.scrollY; 136 | if (bottomEdge > window.innerHeight) { 137 | y -= bottomEdge - window.innerHeight; 138 | } 139 | 140 | table.setAttribute('style', `left: ${x}px; top: ${y}px`); 141 | }; 142 | 143 | button.addEventListener('click', () => { 144 | container.classList.add('removed'); 145 | }); 146 | 147 | button.addEventListener('mouseenter', event => { 148 | button.innerText = '❌'; 149 | container.appendChild(table); 150 | positionTable(event); 151 | }); 152 | 153 | button.addEventListener('mousemove', positionTable); 154 | 155 | button.addEventListener('mouseleave', () => { 156 | container.removeChild(table); 157 | button.innerText = '🔎'; 158 | }); 159 | 160 | infoElements.push({ 161 | container, 162 | cacheInfo, 163 | table, 164 | show: () => { 165 | let { x, y, width, height } = parentNode.getBoundingClientRect(); 166 | 167 | x += window.scrollX; 168 | y += window.scrollY; 169 | 170 | if (y < 0) { 171 | height += y; 172 | y = 0; 173 | } 174 | 175 | left = x; 176 | top = y; 177 | document.body.prepend(container); 178 | container.setAttribute('style', `width: ${width}px; height: ${height}px; left: ${x}px; top: ${y}px`); 179 | }, 180 | hide: () => { 181 | table.remove(); 182 | container.remove(); 183 | } 184 | }); 185 | }; 186 | 187 | // convert all content cache parts to info elements 188 | cCacheNodes.forEach((node, index) => { 189 | const cacheInfo = JSON.parse(node.nodeValue.substring(PREFIX.length)); 190 | const parentNode = node.previousElementSibling; 191 | 192 | if (parentNode) { 193 | // build up 194 | createInfoElement({ parentNode, cacheInfo, index }); 195 | } 196 | }); 197 | 198 | // sort info elements by fusion path 199 | infoElements.sort((a, b) => { 200 | const fa = a.cacheInfo.fusionPath; 201 | const fb = b.cacheInfo.fusionPath; 202 | 203 | if (fa < fb) return -1; 204 | if (fa > fb) return 1; 205 | return 0; 206 | }); 207 | 208 | const sqlTable = (() => { 209 | const container = document.createElement('div'); 210 | container.classList.add('t3n__content-cache-debug-modal'); 211 | 212 | const sqlLegend = document.createElement('div'); 213 | sqlLegend.innerHTML = `

SQL Information

Queries: ${debugInfos.sqlData.queryCount} with ${debugInfos.sqlData.executionTime} ms execution time

`; 214 | container.appendChild(sqlLegend); 215 | 216 | const infoTable = document.createElement('table'); 217 | infoTable.classList.add('t3n__debug-info-table'); 218 | 219 | const headRow = document.createElement('tr'); 220 | headRow.innerHTML = 'Table nameExecution countTotal execution time'; 221 | infoTable.appendChild(headRow); 222 | 223 | Object.keys(debugInfos.sqlData.tables).map(table => { 224 | const row = document.createElement('tr'); 225 | row.innerHTML = `${table}${debugInfos.sqlData.tables[table].queryCount}${Number(debugInfos.sqlData.tables[table].executionTime).toFixed(2)} ms`; 226 | infoTable.appendChild(row); 227 | }); 228 | container.appendChild(infoTable); 229 | 230 | slowQueryLegend = document.createElement('div'); 231 | slowQueryLegend.classList.add('debug-meta'); 232 | slowQueryLegend.innerHTML = `

Slow Queries: ${debugInfos.sqlData.slowQueries.length}

`; 233 | container.appendChild(slowQueryLegend); 234 | 235 | slowQueryTable = document.createElement('table'); 236 | slowQueryTable.classList.add('t3n__debug-info-table'); 237 | 238 | const slowQueryHeadRow = document.createElement('tr'); 239 | slowQueryHeadRow.innerHTML = 'TableExecution timeSQL'; 240 | slowQueryTable.appendChild(slowQueryHeadRow); 241 | 242 | debugInfos.sqlData.slowQueries.forEach(({ executionMS, params, sql, table }) => { 243 | const queryRow = document.createElement('tr'); 244 | queryRow.classList.add('detail-row'); 245 | 246 | const detailCell = document.createElement('td'); 247 | detailCell.innerHTML = `

${sql}

Params:
${params.map(param => '' + param + '')}`; 248 | detailCell.setAttribute('colspan', 4); 249 | 250 | queryRow.appendChild(detailCell); 251 | 252 | const row = document.createElement('tr'); 253 | row.innerHTML = `${table}${Number(executionMS).toFixed(2)} ms${sql.substring(0, 50)}...`; 254 | 255 | const actionCell = document.createElement('td'); 256 | const toggleSqlQuery = document.createElement('button'); 257 | toggleSqlQuery.innerText = 'Show full query'; 258 | toggleSqlQuery.addEventListener('click', () => { 259 | queryRow.classList.toggle('-show'); 260 | toggleSqlQuery.classList.toggle('-active'); 261 | }); 262 | actionCell.appendChild(toggleSqlQuery); 263 | row.appendChild(actionCell); 264 | slowQueryTable.appendChild(row); 265 | slowQueryTable.appendChild(queryRow); 266 | }); 267 | container.appendChild(slowQueryTable); 268 | 269 | return { 270 | show: () => document.body.appendChild(container), 271 | hide: () => container.remove() 272 | }; 273 | })(); 274 | 275 | // build up cache table for cache module 276 | const cacheTable = (() => { 277 | const container = document.createElement('div'); 278 | container.classList.add('t3n__content-cache-debug-modal'); 279 | 280 | const cacheLegend = document.createElement('div'); 281 | cacheLegend.innerHTML = `

Cache Information

Hits: ${debugInfos.cCacheHits}

Misses: ${debugInfos.cCacheMisses.length}

Uncached: ${debugInfos.cCacheUncached}

`; 282 | container.appendChild(cacheLegend); 283 | 284 | const infoTable = document.createElement('table'); 285 | infoTable.classList.add('t3n__debug-info-table'); 286 | 287 | const headRow = document.createElement('tr'); 288 | headRow.innerHTML = 'ModeCache hitFusion path'; 289 | infoTable.appendChild(headRow); 290 | 291 | infoElements.forEach(({ cacheInfo, table, show }) => { 292 | const detailRow = document.createElement('tr'); 293 | detailRow.classList.add('detail-row'); 294 | 295 | const detailCell = document.createElement('td'); 296 | detailCell.setAttribute('colspan', 4); 297 | 298 | // we clone the node so the inspect button won't trigger the remove on this table 299 | detailCell.appendChild(table.cloneNode(true)); 300 | detailRow.appendChild(detailCell); 301 | detailRow.appendChild(document.createElement('td')); 302 | 303 | const row = document.createElement('tr'); 304 | const fusionPath = cacheInfo.fusionPath.replace(/\//g, '/').replace(/<([^>\/]{2,})>/g, '$1'); 305 | const cacheHit = !debugInfos.cCacheMisses.includes(cacheInfo.fusionPath) && cacheInfo.mode !== 'uncached'; 306 | 307 | row.innerHTML = `${cacheInfo.mode}`; 308 | row.innerHTML += `${cacheHit ? 'yes' : 'no'}`; 309 | row.innerHTML += `${fusionPath}`; 310 | 311 | const actions = document.createElement('td'); 312 | const togglePrototype = document.createElement('button'); 313 | togglePrototype.innerText = 'Show/Hide prototype'; 314 | 315 | togglePrototype.addEventListener('click', () => { 316 | row.classList.toggle('-show-prototype'); 317 | togglePrototype.classList.toggle('-active'); 318 | }); 319 | 320 | actions.appendChild(togglePrototype); 321 | 322 | const toggleCacheInfos = document.createElement('button'); 323 | toggleCacheInfos.innerText = 'Details'; 324 | toggleCacheInfos.addEventListener('click', () => { 325 | detailRow.classList.toggle('-show'); 326 | toggleCacheInfos.classList.toggle('-active'); 327 | }); 328 | actions.appendChild(toggleCacheInfos); 329 | 330 | row.appendChild(actions); 331 | infoTable.appendChild(row); 332 | infoTable.appendChild(detailRow); 333 | }); 334 | 335 | container.appendChild(infoTable); 336 | 337 | return { 338 | show: () => document.body.appendChild(container), 339 | hide: () => container.remove() 340 | }; 341 | })(); 342 | 343 | let infoVisible = false; 344 | let listVisible = false; 345 | let sqlInfosVisible = false; 346 | 347 | const shelf = document.createElement('div'); 348 | shelf.classList.add('t3n__content-cache-debug-shelf'); 349 | 350 | if (debugInfos.renderTime) { 351 | const parseTime = document.createElement('div'); 352 | parseTime.innerText = debugInfos.renderTime + ' ms render time'; 353 | 354 | shelf.appendChild(parseTime); 355 | } 356 | 357 | const infoButton = document.createElement('span'); 358 | infoButton.innerText = '🔦 Inspect'; 359 | 360 | let reposition = null; 361 | const onScroll = () => { 362 | if (reposition === null) { 363 | infoElements.forEach(e => e.hide()); 364 | } 365 | clearTimeout(reposition); 366 | reposition = setTimeout(() => { 367 | infoElements.forEach(e => e.show()); 368 | reposition = null; 369 | }, 200); 370 | }; 371 | 372 | infoButton.addEventListener('click', () => { 373 | if (infoVisible) { 374 | infoElements.forEach(e => e.hide()); 375 | window.removeEventListener('scroll', onScroll); 376 | } else { 377 | infoElements.forEach(e => e.show()); 378 | window.addEventListener('scroll', onScroll); 379 | } 380 | infoButton.classList.toggle('-active'); 381 | infoVisible = !infoVisible; 382 | }); 383 | 384 | shelf.appendChild(infoButton); 385 | 386 | if (debugInfos.sqlData) { 387 | const sql = document.createElement('span'); 388 | sql.innerText = `🗄 SQL (${debugInfos.sqlData.queryCount} queries, ${debugInfos.sqlData.slowQueries.length} are slow)`; 389 | sql.addEventListener('click', () => { 390 | if (sqlInfosVisible) { 391 | sqlTable.hide(); 392 | } else { 393 | sqlTable.show(); 394 | } 395 | sql.classList.toggle('-active'); 396 | sqlInfosVisible = !sqlInfosVisible; 397 | }); 398 | shelf.appendChild(sql); 399 | } 400 | 401 | const listButton = document.createElement('span'); 402 | if (debugInfos.cCacheHits || debugInfos.cCacheMisses) { 403 | listButton.innerText = `⚡️ Cache (hits: ${debugInfos.cCacheHits}, misses: ${debugInfos.cCacheMisses.length}, uncached ${debugInfos.cCacheUncached})`; 404 | } else { 405 | listButton.innerText = '️⚡️Cache'; 406 | } 407 | listButton.addEventListener('click', () => { 408 | if (listVisible) { 409 | cacheTable.hide(); 410 | } else { 411 | cacheTable.show(); 412 | } 413 | listButton.classList.toggle('-active'); 414 | listVisible = !listVisible; 415 | }); 416 | 417 | shelf.appendChild(listButton); 418 | 419 | const closeButton = document.createElement('span'); 420 | closeButton.innerText = '🚫 Close'; 421 | 422 | closeButton.addEventListener('click', () => { 423 | shelf.remove(); 424 | infoVisible && infoElements.forEach(e => e.hide()); 425 | listVisible && cacheTable.hide(); 426 | window.__enable_neos_debug__.active = false; 427 | document.cookie = '__neos_debug__=; expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/'; 428 | console.log('%c Closing Neos Debug Tool> ', 'color: white; background: #f9423a; line-height: 20px; font-weight: bold'); 429 | }); 430 | 431 | shelf.appendChild(closeButton); 432 | 433 | document.body.appendChild(shelf); 434 | }; 435 | 436 | (() => { 437 | const cookies = document.cookie 438 | .split(';') 439 | .map(v => v.trim()) 440 | .forEach(c => { 441 | const p = c.split('='); 442 | if (p[0] === '__neos_debug__' && p[1] === 'true') { 443 | window.addEventListener('load', __enable_neos_debug__); 444 | } 445 | }); 446 | })(); 447 | -------------------------------------------------------------------------------- /Resources/Public/Style/main.css: -------------------------------------------------------------------------------- 1 | .t3n__content-cache-debug-container { 2 | position: absolute; 3 | z-index: 10000; 4 | pointer-events: none; 5 | outline: 2px solid black; 6 | outline-offset: -5px; 7 | } 8 | 9 | .t3n__content-cache-debug-container:hover { 10 | z-index: 10001; 11 | } 12 | 13 | .t3n__content-cache-debug-container.removed { 14 | display: none; 15 | } 16 | 17 | .t3n__content-cache-debug-table { 18 | pointer-events: none; 19 | background: #fff; 20 | padding: 20px; 21 | color: #2a2a2a; 22 | font-size: 1em; 23 | line-height: 1.5em; 24 | position: absolute; 25 | box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); 26 | z-index: 10002; 27 | } 28 | .t3n__content-cache-debug-table tr { 29 | padding: 10px 0; 30 | border-bottom: 1px solid #e2e2e2; 31 | } 32 | 33 | .t3n__content-cache-debug-table th { 34 | font-weight: bold; 35 | text-align: left; 36 | vertical-align: top; 37 | background: #fff; 38 | padding: 5px 10px; 39 | color: #2a2a2a; 40 | } 41 | 42 | .t3n__content-cache-debug-table td { 43 | word-wrap: break-word; 44 | background: #fff; 45 | padding-right: 10px; 46 | padding-left: 10px; 47 | color: #2a2a2a; 48 | font-size: 1em; 49 | } 50 | 51 | .t3n__content-cache-debug-table .object-values { 52 | display: grid; 53 | grid-template-columns: auto 1fr; 54 | grid-gap: .2rem .5rem; 55 | } 56 | 57 | .t3n__content-cache-debug-table .object-values span { 58 | max-width: 90%; 59 | overflow: hidden; 60 | text-overflow: ellipsis; 61 | white-space: nowrap; 62 | } 63 | 64 | .t3n__content-cache-debug-table i { 65 | font-style: normal; 66 | font-weight: bold; 67 | } 68 | 69 | .t3n__content-cache-debug-shelf div:first-child { 70 | border-left: none; 71 | border-top-left-radius: 4px; 72 | } 73 | 74 | .t3n__content-cache-debug-shelf span:last-child { 75 | border-top-right-radius: 4px; 76 | } 77 | 78 | .t3n__content-cache-debug-shelf span, 79 | .t3n__content-cache-debug-shelf div { 80 | pointer-events: all; 81 | font-size: 0.75em; 82 | line-height: 2.5em; 83 | border-left: 1px solid #e2e2e2; 84 | padding: 5px 15px; 85 | color: #2a2a2a; 86 | } 87 | .t3n__content-cache-debug-shelf span:hover, 88 | .t3n__content-cache-debug-shelf span.-active { 89 | background-color: #f9423a; 90 | color: #fff; 91 | cursor: pointer; 92 | } 93 | 94 | .t3n__content-cache-debug-container button { 95 | position: absolute; 96 | top: 5px; 97 | left: 5px; 98 | border-radius: 0px; 99 | background: #fff; 100 | display: flex; 101 | justify-content: center; 102 | pointer-events: all; 103 | border: none; 104 | z-index: 10001; 105 | border-radius: 4px; 106 | font-size: 1.25em; 107 | padding: 5px; 108 | line-height: 2em; 109 | width: 40px; 110 | height: 40px; 111 | box-shadow: 0 2px 10px rgba(0, 0, 0, 0.6); 112 | } 113 | 114 | .t3n__content-cache-debug-container div { 115 | position: absolute; 116 | top: 0; 117 | left: 0; 118 | width: 100%; 119 | height: 100%; 120 | outline-offset: -3px; 121 | outline-style: solid; 122 | outline-width: 3px; 123 | } 124 | 125 | .t3n__content-cache-debug-container div.cached { 126 | outline-color: rgb(0, 255, 0); 127 | } 128 | 129 | .t3n__content-cache-debug-container button:hover ~ div.cached { 130 | background-color: rgba(0, 255, 0, 0.2); 131 | } 132 | 133 | .t3n__content-cache-debug-container div.uncached { 134 | outline-color: #f9423a; 135 | } 136 | 137 | .t3n__content-cache-debug-container button:hover ~ div.uncached { 138 | background-color: rgba(255, 0, 0, 0.2); 139 | } 140 | 141 | .t3n__content-cache-debug-container div.dynamic { 142 | outline-color: rgba(251, 190, 53, 1); 143 | } 144 | 145 | .t3n__content-cache-debug-container button:hover ~ div.dynamic { 146 | background-color: rgba(251, 190, 53, 0.2); 147 | } 148 | 149 | .t3n__content-cache-debug-modal h4 { 150 | margin: 0; 151 | } 152 | 153 | .t3n__content-cache-debug-modal { 154 | position: fixed; 155 | top: 10px; 156 | right: 10px; 157 | bottom: 55px; 158 | left: 10px; 159 | z-index: 10002; 160 | background: rgba(255, 255, 255); 161 | color: white; 162 | padding: 40px; 163 | font-size: 12px; 164 | overflow: auto; 165 | display: flex; 166 | flex-direction: column; 167 | align-items: flex-start; 168 | box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); 169 | } 170 | 171 | .t3n__content-cache-debug-modal .debug-meta { 172 | display: flex; 173 | margin: 20px 0; 174 | } 175 | .t3n__content-cache-debug-modal .debug-meta p { 176 | color: #2a2a2a; 177 | font-size: 16px; 178 | } 179 | .t3n__content-cache-debug-modal .debug-meta div { 180 | margin-right: 20px; 181 | } 182 | 183 | .t3n__content-cache-debug-modal > div { 184 | margin-bottom: 5px; 185 | padding: 0 5px; 186 | cursor: pointer; 187 | } 188 | 189 | .t3n__debug-info-table button { 190 | background: none; 191 | color: #2a2a2a; 192 | border: 2px solid #2a2a2a; 193 | padding: 5px 10px; 194 | border-radius: 4px; 195 | margin-right: 5px; 196 | } 197 | .t3n__debug-info-table button.-active { 198 | background-color: #f9423a; 199 | border-color: #f9423a; 200 | color: #fff; 201 | } 202 | 203 | .t3n__debug-info-table { 204 | color: #2a2a2a; 205 | width: 100%; 206 | margin-bottom: 40px; 207 | } 208 | 209 | .t3n__debug-info-table span.tag { 210 | font-style: normal; 211 | background: #f9423a; 212 | color: #fff; 213 | padding: 0 5px; 214 | border-radius: 2px; 215 | margin: 0 5px; 216 | } 217 | .t3n__debug-info-table th { 218 | font-weight: bold; 219 | font-size: 16px; 220 | padding: 10px 5px; 221 | } 222 | .t3n__debug-info-table tr { 223 | font-size: 13px; 224 | margin-bottom: 5px; 225 | border-bottom: 1px solid #a2a2a2; 226 | } 227 | .t3n__debug-info-table tr:last-child { 228 | border-bottom: none; 229 | } 230 | .t3n__debug-info-table td.cached { 231 | background-color: rgba(52, 232, 143, 0.4); 232 | } 233 | .t3n__debug-info-table td.uncached { 234 | background-color: rgba(249, 66, 58, 0.4); 235 | } 236 | .t3n__debug-info-table td.dynamic { 237 | background-color: rgba(251, 190, 53, 0.4); 238 | } 239 | .t3n__debug-info-table tr.detail-row { 240 | display: none; 241 | } 242 | .t3n__debug-info-table p.small { 243 | font-size: 12px; 244 | } 245 | .t3n__debug-info-table tr.detail-row .t3n__content-cache-debug-table th, 246 | .t3n__debug-info-table tr.detail-row .t3n__content-cache-debug-table td { 247 | font-size: 13px; 248 | } 249 | .t3n__debug-info-table tr.detail-row .t3n__content-cache-debug-table { 250 | position: relative; 251 | width: 100%; 252 | box-shadow: none; 253 | } 254 | .t3n__debug-info-table tr.detail-row.-show { 255 | display: table-row; 256 | } 257 | .t3n__debug-info-table td { 258 | padding: 5px; 259 | } 260 | .t3n__debug-info-table .fusion-prototype { 261 | display: none; 262 | margin-bottom: 5px; 263 | } 264 | .t3n__debug-info-table .fusion-prototype span { 265 | font-style: normal; 266 | background: #f9423a; 267 | color: #fff; 268 | padding: 0 4px; 269 | border-radius: 2px; 270 | } 271 | 272 | .t3n__debug-info-table tr.-show-prototype .fusion-prototype { 273 | display: block; 274 | } 275 | 276 | .t3n__content-cache-debug-modal > div.cached { 277 | background: rgba(52, 232, 143, 0.4); 278 | } 279 | 280 | .t3n__content-cache-debug-modal > div.uncached { 281 | background: rgba(255, 0, 0, 0.4); 282 | } 283 | 284 | .t3n__content-cache-debug-modal > div.dynamic { 285 | background: rgba(251, 190, 53, 0.4); 286 | } 287 | 288 | .t3n__content-cache-debug-modal > div i { 289 | font-style: normal; 290 | font-weight: bold; 291 | color: darkgrey; 292 | padding: 0 5px; 293 | } 294 | 295 | .t3n__content-cache-debug-modal > div span { 296 | font-weight: bold; 297 | color: rgb(50, 50, 50); 298 | padding: 0 0 0 3px; 299 | } 300 | 301 | .t3n__content-cache-debug-shelf { 302 | position: fixed; 303 | bottom: 0; 304 | z-index: 10003; 305 | display: flex; 306 | width: auto; 307 | justify-content: center; 308 | pointer-events: none; 309 | background-color: #fff; 310 | right: 40px; 311 | border-top-left-radius: 4px; 312 | border-top-right-radius: 4px; 313 | font-size: 18px; 314 | box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); 315 | } 316 | 317 | .t3n__content-cache-debug-shelf button { 318 | position: static; 319 | margin: 0 3px; 320 | } 321 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "t3n/neos-debug", 3 | "description": "Helper package to visualize debug inforamations for neos including fusion content cache", 4 | "license": "MIT", 5 | "type": "neos-package", 6 | "require": { 7 | "neos/neos": "^7.0 || ^8.0" 8 | }, 9 | "autoload": { 10 | "psr-4": { 11 | "t3n\\Neos\\Debug\\": "Classes/" 12 | } 13 | }, 14 | "extra": { 15 | "neos": { 16 | "package-key": "t3n.Neos.Debug", 17 | "loading-order": { 18 | "after": [ "neos/neos" ] 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /composer.json.ci: -------------------------------------------------------------------------------- 1 | { 2 | "name": "t3n/test-setup", 3 | "description": "Test setup for flow packages", 4 | "config": { 5 | "vendor-dir": "Packages/Libraries", 6 | "bin-dir": "bin" 7 | }, 8 | "require": { 9 | "neos/neos": "^5.1", 10 | "neos/nodetypes": "^5.1", 11 | "neos/demo": "^6.1", 12 | "neos/buildessentials": "^6.1", 13 | "t3n/neos-debug": "@dev", 14 | "t3n/coding-standard": "~1.1.0" 15 | }, 16 | "require-dev": { 17 | "squizlabs/php_codesniffer": "~3.5", 18 | "phpunit/phpunit": "~8.5", 19 | "mikey179/vfsstream": "~1.6" 20 | }, 21 | "repositories": { 22 | "srcPackage": { 23 | "type": "path", 24 | "url": "./neos-debug" 25 | } 26 | }, 27 | "scripts": { 28 | "post-update-cmd": "Neos\\Flow\\Composer\\InstallerScripts::postUpdateAndInstall", 29 | "post-install-cmd": "Neos\\Flow\\Composer\\InstallerScripts::postUpdateAndInstall", 30 | "post-package-update": "Neos\\Flow\\Composer\\InstallerScripts::postPackageUpdateAndInstall", 31 | "post-package-install": "Neos\\Flow\\Composer\\InstallerScripts::postPackageUpdateAndInstall" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /e2e/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | build 4 | cypress/videos 5 | cypress/screenshots 6 | -------------------------------------------------------------------------------- /e2e/Settings.yaml: -------------------------------------------------------------------------------- 1 | Neos: 2 | Flow: 3 | persistence: 4 | backendOptions: 5 | driver: 'pdo_mysql' 6 | dbname: 'neos-debug' 7 | password: 'some-password' 8 | user: root 9 | host: 127.0.0.1 10 | 11 | t3n: 12 | Neos: 13 | Debug: 14 | enabled: true 15 | -------------------------------------------------------------------------------- /e2e/cypress.json: -------------------------------------------------------------------------------- 1 | { 2 | "baseUrl": "http://127.0.0.1:8081", 3 | "viewportWidth": 1200, 4 | "viewportHeight": 1000 5 | } 6 | -------------------------------------------------------------------------------- /e2e/cypress/integration/debug-console/cacheModule.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | describe('cache module can be used', () => { 5 | it('sql module can be used will bring up', () => { 6 | // the console is not there yet+ 7 | cy.visit('/').openConsole(); 8 | cy.queryByText(/cache \(/i) 9 | .click() 10 | .queryByText(/cache information/i) 11 | .should('exist') 12 | .queryByText(/cache \(/i) 13 | .click() 14 | .queryByText(/cache information/i) 15 | .should('not.exist'); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /e2e/cypress/integration/debug-console/sqlModule.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | describe('sql module can be used', () => { 5 | it('sql module can be used will bring up', () => { 6 | // the console is not there yet+ 7 | cy.visit('/').openConsole(); 8 | cy.queryByText(/sql \(/i) 9 | .click() 10 | .queryByText(/sql information/i) 11 | .should('exist') 12 | .queryByText(/Slow Queries:/i) 13 | .should('exist') 14 | .queryByText(/sql \(/i) 15 | .click() 16 | .queryByText(/sql information/i) 17 | .should('not.exist'); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /e2e/cypress/integration/debug-console/usage.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | describe("debug console can be used at all", () => { 5 | it("console can be opened and closed", () => { 6 | // the console is not there yet+ 7 | cy.visit("/") 8 | .queryByText(/cache \(/i) 9 | .should("not.exist"); 10 | 11 | // bring up the console 12 | cy.openConsole() 13 | .queryByText(/cache \(/i) 14 | .should("exist") 15 | .queryByText(/close/i) 16 | .should("exist"); 17 | 18 | // close it 19 | cy.window() 20 | .queryByText(/close/i) 21 | .click() 22 | .queryByText(/cache \(/i) 23 | .should("not.exist"); 24 | }); 25 | 26 | it("cookie can be set so console stays on a refresh", () => { 27 | cy.visit("/") 28 | .queryByText(/cache \(/i) 29 | .should("not.exist"); 30 | 31 | // bring up the console 32 | cy.openConsole(true) 33 | .queryByText(/cache \(/i) 34 | .should("exist") 35 | .getCookie("__neos_debug__") 36 | .should("have.property", "value") 37 | .should("eq", "true"); 38 | }); 39 | 40 | it("debug console opens when the cookie is set", () => { 41 | cy.setCookie("__neos_debug__", "true") 42 | .visit("/") 43 | .queryByText(/cache \(/i) 44 | .should("exist"); 45 | }); 46 | 47 | it("closing the console will also delete the cooke", () => { 48 | cy.setCookie("__neos_debug__", "true") 49 | .visit("/") 50 | .queryByText(/close/i) 51 | .click() 52 | .getCookie("__neos_debug__") 53 | .should("eq", null); 54 | }); 55 | }); 56 | -------------------------------------------------------------------------------- /e2e/cypress/plugins/index.js: -------------------------------------------------------------------------------- 1 | module.exports = (on, config) => { 2 | // `on` is used to hook into various events Cypress emits 3 | // `config` is the resolved Cypress config 4 | }; 5 | -------------------------------------------------------------------------------- /e2e/cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | 4 | Cypress.Commands.add('openConsole', (setCookie = false) => { 5 | cy.window() 6 | .should('have.property', '__enable_neos_debug__') 7 | .then(debugStartupScript => debugStartupScript(setCookie)); 8 | }); 9 | -------------------------------------------------------------------------------- /e2e/cypress/support/index.js: -------------------------------------------------------------------------------- 1 | // 2 | // 3 | 4 | import "@testing-library/cypress/add-commands"; 5 | import "./commands"; 6 | -------------------------------------------------------------------------------- /e2e/cypress/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "strict": true, 4 | "baseUrl": "../node_modules", 5 | "target": "es5", 6 | "lib": ["es5", "dom"], 7 | "types": ["cypress", "@types/testing-library__cypress"] 8 | }, 9 | "include": ["**/*.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /e2e/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "t3n-neos-debug-e2e", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.5.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 10 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.5.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 19 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "@babel/runtime": { 28 | "version": "7.7.7", 29 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.7.7.tgz", 30 | "integrity": "sha512-uCnC2JEVAu8AKB5do1WRIsvrdJ0flYx/A/9f/6chdacnEZ7LmavjdsDXr5ksYBegxtuTPR5Va9/+13QF/kFkCA==", 31 | "dev": true, 32 | "requires": { 33 | "regenerator-runtime": "^0.13.2" 34 | } 35 | }, 36 | "@cypress/listr-verbose-renderer": { 37 | "version": "0.4.1", 38 | "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", 39 | "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", 40 | "dev": true, 41 | "requires": { 42 | "chalk": "^1.1.3", 43 | "cli-cursor": "^1.0.2", 44 | "date-fns": "^1.27.2", 45 | "figures": "^1.7.0" 46 | }, 47 | "dependencies": { 48 | "chalk": { 49 | "version": "1.1.3", 50 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 51 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 52 | "dev": true, 53 | "requires": { 54 | "ansi-styles": "^2.2.1", 55 | "escape-string-regexp": "^1.0.2", 56 | "has-ansi": "^2.0.0", 57 | "strip-ansi": "^3.0.0", 58 | "supports-color": "^2.0.0" 59 | } 60 | }, 61 | "supports-color": { 62 | "version": "2.0.0", 63 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 64 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 65 | "dev": true 66 | } 67 | } 68 | }, 69 | "@cypress/xvfb": { 70 | "version": "1.2.4", 71 | "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", 72 | "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", 73 | "dev": true, 74 | "requires": { 75 | "debug": "^3.1.0", 76 | "lodash.once": "^4.1.1" 77 | } 78 | }, 79 | "@jest/types": { 80 | "version": "24.9.0", 81 | "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", 82 | "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", 83 | "dev": true, 84 | "requires": { 85 | "@types/istanbul-lib-coverage": "^2.0.0", 86 | "@types/istanbul-reports": "^1.1.1", 87 | "@types/yargs": "^13.0.0" 88 | } 89 | }, 90 | "@sheerun/mutationobserver-shim": { 91 | "version": "0.3.2", 92 | "resolved": "https://registry.npmjs.org/@sheerun/mutationobserver-shim/-/mutationobserver-shim-0.3.2.tgz", 93 | "integrity": "sha512-vTCdPp/T/Q3oSqwHmZ5Kpa9oI7iLtGl3RQaA/NyLHikvcrPxACkkKVr/XzkSPJWXHRhKGzVvb0urJsbMlRxi1Q==", 94 | "dev": true 95 | }, 96 | "@testing-library/cypress": { 97 | "version": "5.0.2", 98 | "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-5.0.2.tgz", 99 | "integrity": "sha512-AmvBLE+isA/vpdBTXpJ5tu+UYMDgqNW015RVa0nBPJHrv5UXNlmDZyu8tpkxGTFhcf+iFSA2pHuK1jUCQ8PnXQ==", 100 | "dev": true, 101 | "requires": { 102 | "@babel/runtime": "^7.5.5", 103 | "@testing-library/dom": "^6.0.0", 104 | "@types/testing-library__cypress": "^5.0.0" 105 | } 106 | }, 107 | "@testing-library/dom": { 108 | "version": "6.11.0", 109 | "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-6.11.0.tgz", 110 | "integrity": "sha512-Pkx9LMIGshyNbfmecjt18rrAp/ayMqGH674jYER0SXj0iG9xZc+zWRjk2Pg9JgPBDvwI//xGrI/oOQkAi4YEew==", 111 | "dev": true, 112 | "requires": { 113 | "@babel/runtime": "^7.6.2", 114 | "@sheerun/mutationobserver-shim": "^0.3.2", 115 | "@types/testing-library__dom": "^6.0.0", 116 | "aria-query": "3.0.0", 117 | "pretty-format": "^24.9.0", 118 | "wait-for-expect": "^3.0.0" 119 | } 120 | }, 121 | "@types/istanbul-lib-coverage": { 122 | "version": "2.0.1", 123 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", 124 | "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", 125 | "dev": true 126 | }, 127 | "@types/istanbul-lib-report": { 128 | "version": "1.1.1", 129 | "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", 130 | "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", 131 | "dev": true, 132 | "requires": { 133 | "@types/istanbul-lib-coverage": "*" 134 | } 135 | }, 136 | "@types/istanbul-reports": { 137 | "version": "1.1.1", 138 | "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", 139 | "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", 140 | "dev": true, 141 | "requires": { 142 | "@types/istanbul-lib-coverage": "*", 143 | "@types/istanbul-lib-report": "*" 144 | } 145 | }, 146 | "@types/sizzle": { 147 | "version": "2.3.2", 148 | "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", 149 | "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", 150 | "dev": true 151 | }, 152 | "@types/testing-library__cypress": { 153 | "version": "5.0.1", 154 | "resolved": "https://registry.npmjs.org/@types/testing-library__cypress/-/testing-library__cypress-5.0.1.tgz", 155 | "integrity": "sha512-z2JKxVTh3PDeLbATRofwDUImEwuytsBeu8Si6YLzxwc2HK4xGIDs50HFlwYD9MPlclGDQRm0QL7ynnaIjRtCGg==", 156 | "dev": true, 157 | "requires": { 158 | "@types/testing-library__dom": "*", 159 | "cypress": "^3.5.0" 160 | }, 161 | "dependencies": { 162 | "cypress": { 163 | "version": "3.8.1", 164 | "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.8.1.tgz", 165 | "integrity": "sha512-eLk5OpL/ZMDfQx9t7ZaDUAGVcvSOPTi7CG1tiUnu9BGk7caBiDhuFi3Tz/D5vWqH/Dl6Uh4X+Au4W+zh0xzbXw==", 166 | "dev": true, 167 | "requires": { 168 | "@cypress/listr-verbose-renderer": "0.4.1", 169 | "@cypress/xvfb": "1.2.4", 170 | "@types/sizzle": "2.3.2", 171 | "arch": "2.1.1", 172 | "bluebird": "3.5.0", 173 | "cachedir": "1.3.0", 174 | "chalk": "2.4.2", 175 | "check-more-types": "2.24.0", 176 | "commander": "2.15.1", 177 | "common-tags": "1.8.0", 178 | "debug": "3.2.6", 179 | "execa": "0.10.0", 180 | "executable": "4.1.1", 181 | "extract-zip": "1.6.7", 182 | "fs-extra": "5.0.0", 183 | "getos": "3.1.1", 184 | "is-ci": "1.2.1", 185 | "is-installed-globally": "0.1.0", 186 | "lazy-ass": "1.6.0", 187 | "listr": "0.12.0", 188 | "lodash": "4.17.15", 189 | "log-symbols": "2.2.0", 190 | "minimist": "1.2.0", 191 | "moment": "2.24.0", 192 | "ramda": "0.24.1", 193 | "request": "2.88.0", 194 | "request-progress": "3.0.0", 195 | "supports-color": "5.5.0", 196 | "tmp": "0.1.0", 197 | "untildify": "3.0.3", 198 | "url": "0.11.0", 199 | "yauzl": "2.10.0" 200 | } 201 | } 202 | } 203 | }, 204 | "@types/testing-library__dom": { 205 | "version": "6.11.1", 206 | "resolved": "https://registry.npmjs.org/@types/testing-library__dom/-/testing-library__dom-6.11.1.tgz", 207 | "integrity": "sha512-ImChHtQqmjwraRLqBC2sgSQFtczeFvBmBcfhTYZn/3KwXbyD07LQykEQ0xJo7QHc1GbVvf7pRyGaIe6PkCdxEw==", 208 | "dev": true, 209 | "requires": { 210 | "pretty-format": "^24.3.0" 211 | } 212 | }, 213 | "@types/yargs": { 214 | "version": "13.0.5", 215 | "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.5.tgz", 216 | "integrity": "sha512-CF/+sxTO7FOwbIRL4wMv0ZYLCRfMid2HQpzDRyViH7kSpfoAFiMdGqKIxb1PxWfjtQXQhnQuD33lvRHNwr809Q==", 217 | "dev": true, 218 | "requires": { 219 | "@types/yargs-parser": "*" 220 | } 221 | }, 222 | "@types/yargs-parser": { 223 | "version": "13.1.0", 224 | "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-13.1.0.tgz", 225 | "integrity": "sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg==", 226 | "dev": true 227 | }, 228 | "acorn": { 229 | "version": "7.3.1", 230 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", 231 | "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", 232 | "dev": true 233 | }, 234 | "acorn-jsx": { 235 | "version": "5.1.0", 236 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", 237 | "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", 238 | "dev": true 239 | }, 240 | "ajv": { 241 | "version": "6.10.0", 242 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 243 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 244 | "dev": true, 245 | "requires": { 246 | "fast-deep-equal": "^2.0.1", 247 | "fast-json-stable-stringify": "^2.0.0", 248 | "json-schema-traverse": "^0.4.1", 249 | "uri-js": "^4.2.2" 250 | } 251 | }, 252 | "ansi-escapes": { 253 | "version": "1.4.0", 254 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 255 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", 256 | "dev": true 257 | }, 258 | "ansi-regex": { 259 | "version": "2.1.1", 260 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 261 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 262 | "dev": true 263 | }, 264 | "ansi-styles": { 265 | "version": "2.2.1", 266 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 267 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 268 | "dev": true 269 | }, 270 | "arch": { 271 | "version": "2.1.1", 272 | "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz", 273 | "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg==", 274 | "dev": true 275 | }, 276 | "argparse": { 277 | "version": "1.0.10", 278 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 279 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 280 | "dev": true, 281 | "requires": { 282 | "sprintf-js": "~1.0.2" 283 | } 284 | }, 285 | "aria-query": { 286 | "version": "3.0.0", 287 | "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", 288 | "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", 289 | "dev": true, 290 | "requires": { 291 | "ast-types-flow": "0.0.7", 292 | "commander": "^2.11.0" 293 | } 294 | }, 295 | "asn1": { 296 | "version": "0.2.4", 297 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 298 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 299 | "dev": true, 300 | "requires": { 301 | "safer-buffer": "~2.1.0" 302 | } 303 | }, 304 | "assert-plus": { 305 | "version": "1.0.0", 306 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 307 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 308 | "dev": true 309 | }, 310 | "ast-types-flow": { 311 | "version": "0.0.7", 312 | "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", 313 | "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", 314 | "dev": true 315 | }, 316 | "astral-regex": { 317 | "version": "1.0.0", 318 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 319 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 320 | "dev": true 321 | }, 322 | "async": { 323 | "version": "2.6.1", 324 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 325 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 326 | "dev": true, 327 | "requires": { 328 | "lodash": "^4.17.10" 329 | } 330 | }, 331 | "asynckit": { 332 | "version": "0.4.0", 333 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 334 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 335 | "dev": true 336 | }, 337 | "aws-sign2": { 338 | "version": "0.7.0", 339 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 340 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 341 | "dev": true 342 | }, 343 | "aws4": { 344 | "version": "1.9.0", 345 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", 346 | "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==", 347 | "dev": true 348 | }, 349 | "balanced-match": { 350 | "version": "1.0.0", 351 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 352 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 353 | "dev": true 354 | }, 355 | "bcrypt-pbkdf": { 356 | "version": "1.0.2", 357 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 358 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 359 | "dev": true, 360 | "requires": { 361 | "tweetnacl": "^0.14.3" 362 | } 363 | }, 364 | "bluebird": { 365 | "version": "3.5.0", 366 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", 367 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", 368 | "dev": true 369 | }, 370 | "brace-expansion": { 371 | "version": "1.1.11", 372 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 373 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 374 | "dev": true, 375 | "requires": { 376 | "balanced-match": "^1.0.0", 377 | "concat-map": "0.0.1" 378 | } 379 | }, 380 | "buffer-crc32": { 381 | "version": "0.2.13", 382 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 383 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", 384 | "dev": true 385 | }, 386 | "buffer-from": { 387 | "version": "1.1.1", 388 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 389 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 390 | "dev": true 391 | }, 392 | "cachedir": { 393 | "version": "1.3.0", 394 | "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-1.3.0.tgz", 395 | "integrity": "sha512-O1ji32oyON9laVPJL1IZ5bmwd2cB46VfpxkDequezH+15FDzzVddEyrGEeX4WusDSqKxdyFdDQDEG1yo1GoWkg==", 396 | "dev": true, 397 | "requires": { 398 | "os-homedir": "^1.0.1" 399 | } 400 | }, 401 | "callsites": { 402 | "version": "3.1.0", 403 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 404 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 405 | "dev": true 406 | }, 407 | "caseless": { 408 | "version": "0.12.0", 409 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 410 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 411 | "dev": true 412 | }, 413 | "chalk": { 414 | "version": "2.4.2", 415 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 416 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 417 | "dev": true, 418 | "requires": { 419 | "ansi-styles": "^3.2.1", 420 | "escape-string-regexp": "^1.0.5", 421 | "supports-color": "^5.3.0" 422 | }, 423 | "dependencies": { 424 | "ansi-styles": { 425 | "version": "3.2.1", 426 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 427 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 428 | "dev": true, 429 | "requires": { 430 | "color-convert": "^1.9.0" 431 | } 432 | } 433 | } 434 | }, 435 | "chardet": { 436 | "version": "0.7.0", 437 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 438 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 439 | "dev": true 440 | }, 441 | "check-more-types": { 442 | "version": "2.24.0", 443 | "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", 444 | "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", 445 | "dev": true 446 | }, 447 | "ci-info": { 448 | "version": "1.6.0", 449 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", 450 | "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", 451 | "dev": true 452 | }, 453 | "cli-cursor": { 454 | "version": "1.0.2", 455 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 456 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", 457 | "dev": true, 458 | "requires": { 459 | "restore-cursor": "^1.0.1" 460 | } 461 | }, 462 | "cli-spinners": { 463 | "version": "0.1.2", 464 | "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", 465 | "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", 466 | "dev": true 467 | }, 468 | "cli-truncate": { 469 | "version": "0.2.1", 470 | "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", 471 | "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", 472 | "dev": true, 473 | "requires": { 474 | "slice-ansi": "0.0.4", 475 | "string-width": "^1.0.1" 476 | } 477 | }, 478 | "cli-width": { 479 | "version": "2.2.0", 480 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 481 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 482 | "dev": true 483 | }, 484 | "code-point-at": { 485 | "version": "1.1.0", 486 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 487 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 488 | "dev": true 489 | }, 490 | "color-convert": { 491 | "version": "1.9.3", 492 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 493 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 494 | "dev": true, 495 | "requires": { 496 | "color-name": "1.1.3" 497 | } 498 | }, 499 | "color-name": { 500 | "version": "1.1.3", 501 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 502 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 503 | "dev": true 504 | }, 505 | "combined-stream": { 506 | "version": "1.0.8", 507 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 508 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 509 | "dev": true, 510 | "requires": { 511 | "delayed-stream": "~1.0.0" 512 | } 513 | }, 514 | "commander": { 515 | "version": "2.15.1", 516 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 517 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 518 | "dev": true 519 | }, 520 | "common-tags": { 521 | "version": "1.8.0", 522 | "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", 523 | "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", 524 | "dev": true 525 | }, 526 | "concat-map": { 527 | "version": "0.0.1", 528 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 529 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 530 | "dev": true 531 | }, 532 | "concat-stream": { 533 | "version": "1.6.2", 534 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 535 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 536 | "dev": true, 537 | "requires": { 538 | "buffer-from": "^1.0.0", 539 | "inherits": "^2.0.3", 540 | "readable-stream": "^2.2.2", 541 | "typedarray": "^0.0.6" 542 | } 543 | }, 544 | "core-util-is": { 545 | "version": "1.0.2", 546 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 547 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 548 | "dev": true 549 | }, 550 | "cross-spawn": { 551 | "version": "6.0.5", 552 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 553 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 554 | "dev": true, 555 | "requires": { 556 | "nice-try": "^1.0.4", 557 | "path-key": "^2.0.1", 558 | "semver": "^5.5.0", 559 | "shebang-command": "^1.2.0", 560 | "which": "^1.2.9" 561 | } 562 | }, 563 | "cypress": { 564 | "version": "3.8.3", 565 | "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.8.3.tgz", 566 | "integrity": "sha512-I9L/d+ilTPPA4vq3NC1OPKmw7jJIpMKNdyfR8t1EXYzYCjyqbc59migOm1YSse/VRbISLJ+QGb5k4Y3bz2lkYw==", 567 | "dev": true, 568 | "requires": { 569 | "@cypress/listr-verbose-renderer": "0.4.1", 570 | "@cypress/xvfb": "1.2.4", 571 | "@types/sizzle": "2.3.2", 572 | "arch": "2.1.1", 573 | "bluebird": "3.5.0", 574 | "cachedir": "1.3.0", 575 | "chalk": "2.4.2", 576 | "check-more-types": "2.24.0", 577 | "commander": "2.15.1", 578 | "common-tags": "1.8.0", 579 | "debug": "3.2.6", 580 | "eventemitter2": "4.1.2", 581 | "execa": "0.10.0", 582 | "executable": "4.1.1", 583 | "extract-zip": "1.6.7", 584 | "fs-extra": "5.0.0", 585 | "getos": "3.1.1", 586 | "is-ci": "1.2.1", 587 | "is-installed-globally": "0.1.0", 588 | "lazy-ass": "1.6.0", 589 | "listr": "0.12.0", 590 | "lodash": "4.17.15", 591 | "log-symbols": "2.2.0", 592 | "minimist": "1.2.0", 593 | "moment": "2.24.0", 594 | "ramda": "0.24.1", 595 | "request": "2.88.0", 596 | "request-progress": "3.0.0", 597 | "supports-color": "5.5.0", 598 | "tmp": "0.1.0", 599 | "untildify": "3.0.3", 600 | "url": "0.11.0", 601 | "yauzl": "2.10.0" 602 | } 603 | }, 604 | "dashdash": { 605 | "version": "1.14.1", 606 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 607 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 608 | "dev": true, 609 | "requires": { 610 | "assert-plus": "^1.0.0" 611 | } 612 | }, 613 | "date-fns": { 614 | "version": "1.30.1", 615 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", 616 | "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", 617 | "dev": true 618 | }, 619 | "debug": { 620 | "version": "3.2.6", 621 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 622 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 623 | "dev": true, 624 | "requires": { 625 | "ms": "^2.1.1" 626 | } 627 | }, 628 | "deep-is": { 629 | "version": "0.1.3", 630 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 631 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 632 | "dev": true 633 | }, 634 | "delayed-stream": { 635 | "version": "1.0.0", 636 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 637 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 638 | "dev": true 639 | }, 640 | "doctrine": { 641 | "version": "3.0.0", 642 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 643 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 644 | "dev": true, 645 | "requires": { 646 | "esutils": "^2.0.2" 647 | } 648 | }, 649 | "ecc-jsbn": { 650 | "version": "0.1.2", 651 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 652 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 653 | "dev": true, 654 | "requires": { 655 | "jsbn": "~0.1.0", 656 | "safer-buffer": "^2.1.0" 657 | } 658 | }, 659 | "elegant-spinner": { 660 | "version": "1.0.1", 661 | "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", 662 | "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", 663 | "dev": true 664 | }, 665 | "emoji-regex": { 666 | "version": "8.0.0", 667 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 668 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 669 | "dev": true 670 | }, 671 | "escape-string-regexp": { 672 | "version": "1.0.5", 673 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 674 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 675 | "dev": true 676 | }, 677 | "eslint": { 678 | "version": "6.8.0", 679 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", 680 | "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", 681 | "dev": true, 682 | "requires": { 683 | "@babel/code-frame": "^7.0.0", 684 | "ajv": "^6.10.0", 685 | "chalk": "^2.1.0", 686 | "cross-spawn": "^6.0.5", 687 | "debug": "^4.0.1", 688 | "doctrine": "^3.0.0", 689 | "eslint-scope": "^5.0.0", 690 | "eslint-utils": "^1.4.3", 691 | "eslint-visitor-keys": "^1.1.0", 692 | "espree": "^6.1.2", 693 | "esquery": "^1.0.1", 694 | "esutils": "^2.0.2", 695 | "file-entry-cache": "^5.0.1", 696 | "functional-red-black-tree": "^1.0.1", 697 | "glob-parent": "^5.0.0", 698 | "globals": "^12.1.0", 699 | "ignore": "^4.0.6", 700 | "import-fresh": "^3.0.0", 701 | "imurmurhash": "^0.1.4", 702 | "inquirer": "^7.0.0", 703 | "is-glob": "^4.0.0", 704 | "js-yaml": "^3.13.1", 705 | "json-stable-stringify-without-jsonify": "^1.0.1", 706 | "levn": "^0.3.0", 707 | "lodash": "^4.17.14", 708 | "minimatch": "^3.0.4", 709 | "mkdirp": "^0.5.1", 710 | "natural-compare": "^1.4.0", 711 | "optionator": "^0.8.3", 712 | "progress": "^2.0.0", 713 | "regexpp": "^2.0.1", 714 | "semver": "^6.1.2", 715 | "strip-ansi": "^5.2.0", 716 | "strip-json-comments": "^3.0.1", 717 | "table": "^5.2.3", 718 | "text-table": "^0.2.0", 719 | "v8-compile-cache": "^2.0.3" 720 | }, 721 | "dependencies": { 722 | "ansi-regex": { 723 | "version": "4.1.0", 724 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 725 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 726 | "dev": true 727 | }, 728 | "debug": { 729 | "version": "4.1.1", 730 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 731 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 732 | "dev": true, 733 | "requires": { 734 | "ms": "^2.1.1" 735 | } 736 | }, 737 | "globals": { 738 | "version": "12.3.0", 739 | "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", 740 | "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", 741 | "dev": true, 742 | "requires": { 743 | "type-fest": "^0.8.1" 744 | } 745 | }, 746 | "semver": { 747 | "version": "6.3.0", 748 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 749 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 750 | "dev": true 751 | }, 752 | "strip-ansi": { 753 | "version": "5.2.0", 754 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 755 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 756 | "dev": true, 757 | "requires": { 758 | "ansi-regex": "^4.1.0" 759 | } 760 | } 761 | } 762 | }, 763 | "eslint-config-cypress": { 764 | "version": "0.28.0", 765 | "resolved": "https://registry.npmjs.org/eslint-config-cypress/-/eslint-config-cypress-0.28.0.tgz", 766 | "integrity": "sha1-s0E6TrSQzoW8Gqo7ob2lZni38cE=", 767 | "dev": true, 768 | "requires": { 769 | "eslint-plugin-cypress": "^2.0.1" 770 | } 771 | }, 772 | "eslint-plugin-cypress": { 773 | "version": "2.8.1", 774 | "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.8.1.tgz", 775 | "integrity": "sha512-jDpcP+MmjmqQO/x3bwIXgp4cl7Q66RYS5/IsuOQP4Qo2sEqE3DI8tTxBQ1EhnV5qEDd2Z2TYHR+5vYI6oCN4uw==", 776 | "dev": true, 777 | "requires": { 778 | "globals": "^11.12.0" 779 | }, 780 | "dependencies": { 781 | "globals": { 782 | "version": "11.12.0", 783 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 784 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 785 | "dev": true 786 | } 787 | } 788 | }, 789 | "eslint-scope": { 790 | "version": "5.0.0", 791 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 792 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 793 | "dev": true, 794 | "requires": { 795 | "esrecurse": "^4.1.0", 796 | "estraverse": "^4.1.1" 797 | } 798 | }, 799 | "eslint-utils": { 800 | "version": "1.4.3", 801 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", 802 | "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", 803 | "dev": true, 804 | "requires": { 805 | "eslint-visitor-keys": "^1.1.0" 806 | } 807 | }, 808 | "eslint-visitor-keys": { 809 | "version": "1.1.0", 810 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 811 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 812 | "dev": true 813 | }, 814 | "espree": { 815 | "version": "6.1.2", 816 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", 817 | "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", 818 | "dev": true, 819 | "requires": { 820 | "acorn": "^7.1.0", 821 | "acorn-jsx": "^5.1.0", 822 | "eslint-visitor-keys": "^1.1.0" 823 | } 824 | }, 825 | "esprima": { 826 | "version": "4.0.1", 827 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 828 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 829 | "dev": true 830 | }, 831 | "esquery": { 832 | "version": "1.0.1", 833 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 834 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 835 | "dev": true, 836 | "requires": { 837 | "estraverse": "^4.0.0" 838 | } 839 | }, 840 | "esrecurse": { 841 | "version": "4.2.1", 842 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 843 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 844 | "dev": true, 845 | "requires": { 846 | "estraverse": "^4.1.0" 847 | } 848 | }, 849 | "estraverse": { 850 | "version": "4.3.0", 851 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 852 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 853 | "dev": true 854 | }, 855 | "esutils": { 856 | "version": "2.0.3", 857 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 858 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 859 | "dev": true 860 | }, 861 | "eventemitter2": { 862 | "version": "4.1.2", 863 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-4.1.2.tgz", 864 | "integrity": "sha1-DhqEd6+CGm7zmVsxG/dMI6UkfxU=", 865 | "dev": true 866 | }, 867 | "execa": { 868 | "version": "0.10.0", 869 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", 870 | "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", 871 | "dev": true, 872 | "requires": { 873 | "cross-spawn": "^6.0.0", 874 | "get-stream": "^3.0.0", 875 | "is-stream": "^1.1.0", 876 | "npm-run-path": "^2.0.0", 877 | "p-finally": "^1.0.0", 878 | "signal-exit": "^3.0.0", 879 | "strip-eof": "^1.0.0" 880 | } 881 | }, 882 | "executable": { 883 | "version": "4.1.1", 884 | "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", 885 | "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", 886 | "dev": true, 887 | "requires": { 888 | "pify": "^2.2.0" 889 | } 890 | }, 891 | "exit-hook": { 892 | "version": "1.1.1", 893 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 894 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", 895 | "dev": true 896 | }, 897 | "extend": { 898 | "version": "3.0.2", 899 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 900 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 901 | "dev": true 902 | }, 903 | "external-editor": { 904 | "version": "3.1.0", 905 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 906 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 907 | "dev": true, 908 | "requires": { 909 | "chardet": "^0.7.0", 910 | "iconv-lite": "^0.4.24", 911 | "tmp": "^0.0.33" 912 | }, 913 | "dependencies": { 914 | "tmp": { 915 | "version": "0.0.33", 916 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 917 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 918 | "dev": true, 919 | "requires": { 920 | "os-tmpdir": "~1.0.2" 921 | } 922 | } 923 | } 924 | }, 925 | "extract-zip": { 926 | "version": "1.6.7", 927 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", 928 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 929 | "dev": true, 930 | "requires": { 931 | "concat-stream": "1.6.2", 932 | "debug": "2.6.9", 933 | "mkdirp": "0.5.1", 934 | "yauzl": "2.4.1" 935 | }, 936 | "dependencies": { 937 | "debug": { 938 | "version": "2.6.9", 939 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 940 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 941 | "dev": true, 942 | "requires": { 943 | "ms": "2.0.0" 944 | } 945 | }, 946 | "ms": { 947 | "version": "2.0.0", 948 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 949 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 950 | "dev": true 951 | }, 952 | "yauzl": { 953 | "version": "2.4.1", 954 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 955 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 956 | "dev": true, 957 | "requires": { 958 | "fd-slicer": "~1.0.1" 959 | } 960 | } 961 | } 962 | }, 963 | "extsprintf": { 964 | "version": "1.3.0", 965 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 966 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 967 | "dev": true 968 | }, 969 | "fast-deep-equal": { 970 | "version": "2.0.1", 971 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 972 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 973 | "dev": true 974 | }, 975 | "fast-json-stable-stringify": { 976 | "version": "2.0.0", 977 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 978 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 979 | "dev": true 980 | }, 981 | "fast-levenshtein": { 982 | "version": "2.0.6", 983 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 984 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 985 | "dev": true 986 | }, 987 | "fd-slicer": { 988 | "version": "1.0.1", 989 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 990 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 991 | "dev": true, 992 | "requires": { 993 | "pend": "~1.2.0" 994 | } 995 | }, 996 | "figures": { 997 | "version": "1.7.0", 998 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 999 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 1000 | "dev": true, 1001 | "requires": { 1002 | "escape-string-regexp": "^1.0.5", 1003 | "object-assign": "^4.1.0" 1004 | } 1005 | }, 1006 | "file-entry-cache": { 1007 | "version": "5.0.1", 1008 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 1009 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 1010 | "dev": true, 1011 | "requires": { 1012 | "flat-cache": "^2.0.1" 1013 | } 1014 | }, 1015 | "flat-cache": { 1016 | "version": "2.0.1", 1017 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 1018 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 1019 | "dev": true, 1020 | "requires": { 1021 | "flatted": "^2.0.0", 1022 | "rimraf": "2.6.3", 1023 | "write": "1.0.3" 1024 | } 1025 | }, 1026 | "flatted": { 1027 | "version": "2.0.1", 1028 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 1029 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 1030 | "dev": true 1031 | }, 1032 | "forever-agent": { 1033 | "version": "0.6.1", 1034 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1035 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 1036 | "dev": true 1037 | }, 1038 | "form-data": { 1039 | "version": "2.3.3", 1040 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 1041 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 1042 | "dev": true, 1043 | "requires": { 1044 | "asynckit": "^0.4.0", 1045 | "combined-stream": "^1.0.6", 1046 | "mime-types": "^2.1.12" 1047 | } 1048 | }, 1049 | "fs-extra": { 1050 | "version": "5.0.0", 1051 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", 1052 | "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", 1053 | "dev": true, 1054 | "requires": { 1055 | "graceful-fs": "^4.1.2", 1056 | "jsonfile": "^4.0.0", 1057 | "universalify": "^0.1.0" 1058 | } 1059 | }, 1060 | "fs.realpath": { 1061 | "version": "1.0.0", 1062 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1063 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1064 | "dev": true 1065 | }, 1066 | "functional-red-black-tree": { 1067 | "version": "1.0.1", 1068 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 1069 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 1070 | "dev": true 1071 | }, 1072 | "get-stream": { 1073 | "version": "3.0.0", 1074 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 1075 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", 1076 | "dev": true 1077 | }, 1078 | "getos": { 1079 | "version": "3.1.1", 1080 | "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.1.tgz", 1081 | "integrity": "sha512-oUP1rnEhAr97rkitiszGP9EgDVYnmchgFzfqRzSkgtfv7ai6tEi7Ko8GgjNXts7VLWEqrTWyhsOKLe5C5b/Zkg==", 1082 | "dev": true, 1083 | "requires": { 1084 | "async": "2.6.1" 1085 | } 1086 | }, 1087 | "getpass": { 1088 | "version": "0.1.7", 1089 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1090 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1091 | "dev": true, 1092 | "requires": { 1093 | "assert-plus": "^1.0.0" 1094 | } 1095 | }, 1096 | "glob": { 1097 | "version": "7.1.3", 1098 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1099 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1100 | "dev": true, 1101 | "requires": { 1102 | "fs.realpath": "^1.0.0", 1103 | "inflight": "^1.0.4", 1104 | "inherits": "2", 1105 | "minimatch": "^3.0.4", 1106 | "once": "^1.3.0", 1107 | "path-is-absolute": "^1.0.0" 1108 | } 1109 | }, 1110 | "glob-parent": { 1111 | "version": "5.1.0", 1112 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", 1113 | "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", 1114 | "dev": true, 1115 | "requires": { 1116 | "is-glob": "^4.0.1" 1117 | } 1118 | }, 1119 | "global-dirs": { 1120 | "version": "0.1.1", 1121 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", 1122 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", 1123 | "dev": true, 1124 | "requires": { 1125 | "ini": "^1.3.4" 1126 | } 1127 | }, 1128 | "graceful-fs": { 1129 | "version": "4.2.3", 1130 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 1131 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", 1132 | "dev": true 1133 | }, 1134 | "har-schema": { 1135 | "version": "2.0.0", 1136 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1137 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 1138 | "dev": true 1139 | }, 1140 | "har-validator": { 1141 | "version": "5.1.3", 1142 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 1143 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 1144 | "dev": true, 1145 | "requires": { 1146 | "ajv": "^6.5.5", 1147 | "har-schema": "^2.0.0" 1148 | } 1149 | }, 1150 | "has-ansi": { 1151 | "version": "2.0.0", 1152 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1153 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1154 | "dev": true, 1155 | "requires": { 1156 | "ansi-regex": "^2.0.0" 1157 | } 1158 | }, 1159 | "has-flag": { 1160 | "version": "3.0.0", 1161 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1162 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1163 | "dev": true 1164 | }, 1165 | "http-signature": { 1166 | "version": "1.2.0", 1167 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1168 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1169 | "dev": true, 1170 | "requires": { 1171 | "assert-plus": "^1.0.0", 1172 | "jsprim": "^1.2.2", 1173 | "sshpk": "^1.7.0" 1174 | } 1175 | }, 1176 | "iconv-lite": { 1177 | "version": "0.4.24", 1178 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1179 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1180 | "dev": true, 1181 | "requires": { 1182 | "safer-buffer": ">= 2.1.2 < 3" 1183 | } 1184 | }, 1185 | "ignore": { 1186 | "version": "4.0.6", 1187 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1188 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 1189 | "dev": true 1190 | }, 1191 | "import-fresh": { 1192 | "version": "3.2.1", 1193 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", 1194 | "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", 1195 | "dev": true, 1196 | "requires": { 1197 | "parent-module": "^1.0.0", 1198 | "resolve-from": "^4.0.0" 1199 | } 1200 | }, 1201 | "imurmurhash": { 1202 | "version": "0.1.4", 1203 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1204 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1205 | "dev": true 1206 | }, 1207 | "indent-string": { 1208 | "version": "2.1.0", 1209 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 1210 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 1211 | "dev": true, 1212 | "requires": { 1213 | "repeating": "^2.0.0" 1214 | } 1215 | }, 1216 | "inflight": { 1217 | "version": "1.0.6", 1218 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1219 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1220 | "dev": true, 1221 | "requires": { 1222 | "once": "^1.3.0", 1223 | "wrappy": "1" 1224 | } 1225 | }, 1226 | "inherits": { 1227 | "version": "2.0.3", 1228 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1229 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 1230 | "dev": true 1231 | }, 1232 | "ini": { 1233 | "version": "1.3.5", 1234 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1235 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1236 | "dev": true 1237 | }, 1238 | "inquirer": { 1239 | "version": "7.0.3", 1240 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", 1241 | "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", 1242 | "dev": true, 1243 | "requires": { 1244 | "ansi-escapes": "^4.2.1", 1245 | "chalk": "^2.4.2", 1246 | "cli-cursor": "^3.1.0", 1247 | "cli-width": "^2.0.0", 1248 | "external-editor": "^3.0.3", 1249 | "figures": "^3.0.0", 1250 | "lodash": "^4.17.15", 1251 | "mute-stream": "0.0.8", 1252 | "run-async": "^2.2.0", 1253 | "rxjs": "^6.5.3", 1254 | "string-width": "^4.1.0", 1255 | "strip-ansi": "^5.1.0", 1256 | "through": "^2.3.6" 1257 | }, 1258 | "dependencies": { 1259 | "ansi-escapes": { 1260 | "version": "4.3.0", 1261 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", 1262 | "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", 1263 | "dev": true, 1264 | "requires": { 1265 | "type-fest": "^0.8.1" 1266 | } 1267 | }, 1268 | "ansi-regex": { 1269 | "version": "5.0.0", 1270 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 1271 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", 1272 | "dev": true 1273 | }, 1274 | "cli-cursor": { 1275 | "version": "3.1.0", 1276 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", 1277 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", 1278 | "dev": true, 1279 | "requires": { 1280 | "restore-cursor": "^3.1.0" 1281 | } 1282 | }, 1283 | "figures": { 1284 | "version": "3.1.0", 1285 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", 1286 | "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", 1287 | "dev": true, 1288 | "requires": { 1289 | "escape-string-regexp": "^1.0.5" 1290 | } 1291 | }, 1292 | "is-fullwidth-code-point": { 1293 | "version": "3.0.0", 1294 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1295 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1296 | "dev": true 1297 | }, 1298 | "onetime": { 1299 | "version": "5.1.0", 1300 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 1301 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 1302 | "dev": true, 1303 | "requires": { 1304 | "mimic-fn": "^2.1.0" 1305 | } 1306 | }, 1307 | "restore-cursor": { 1308 | "version": "3.1.0", 1309 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", 1310 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", 1311 | "dev": true, 1312 | "requires": { 1313 | "onetime": "^5.1.0", 1314 | "signal-exit": "^3.0.2" 1315 | } 1316 | }, 1317 | "rxjs": { 1318 | "version": "6.5.4", 1319 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", 1320 | "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", 1321 | "dev": true, 1322 | "requires": { 1323 | "tslib": "^1.9.0" 1324 | } 1325 | }, 1326 | "string-width": { 1327 | "version": "4.2.0", 1328 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 1329 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 1330 | "dev": true, 1331 | "requires": { 1332 | "emoji-regex": "^8.0.0", 1333 | "is-fullwidth-code-point": "^3.0.0", 1334 | "strip-ansi": "^6.0.0" 1335 | }, 1336 | "dependencies": { 1337 | "strip-ansi": { 1338 | "version": "6.0.0", 1339 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 1340 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", 1341 | "dev": true, 1342 | "requires": { 1343 | "ansi-regex": "^5.0.0" 1344 | } 1345 | } 1346 | } 1347 | }, 1348 | "strip-ansi": { 1349 | "version": "5.2.0", 1350 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1351 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1352 | "dev": true, 1353 | "requires": { 1354 | "ansi-regex": "^4.1.0" 1355 | }, 1356 | "dependencies": { 1357 | "ansi-regex": { 1358 | "version": "4.1.0", 1359 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1360 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1361 | "dev": true 1362 | } 1363 | } 1364 | } 1365 | } 1366 | }, 1367 | "is-ci": { 1368 | "version": "1.2.1", 1369 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", 1370 | "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", 1371 | "dev": true, 1372 | "requires": { 1373 | "ci-info": "^1.5.0" 1374 | } 1375 | }, 1376 | "is-extglob": { 1377 | "version": "2.1.1", 1378 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1379 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1380 | "dev": true 1381 | }, 1382 | "is-finite": { 1383 | "version": "1.0.2", 1384 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1385 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1386 | "dev": true, 1387 | "requires": { 1388 | "number-is-nan": "^1.0.0" 1389 | } 1390 | }, 1391 | "is-fullwidth-code-point": { 1392 | "version": "1.0.0", 1393 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1394 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1395 | "dev": true, 1396 | "requires": { 1397 | "number-is-nan": "^1.0.0" 1398 | } 1399 | }, 1400 | "is-glob": { 1401 | "version": "4.0.1", 1402 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1403 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1404 | "dev": true, 1405 | "requires": { 1406 | "is-extglob": "^2.1.1" 1407 | } 1408 | }, 1409 | "is-installed-globally": { 1410 | "version": "0.1.0", 1411 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", 1412 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", 1413 | "dev": true, 1414 | "requires": { 1415 | "global-dirs": "^0.1.0", 1416 | "is-path-inside": "^1.0.0" 1417 | } 1418 | }, 1419 | "is-path-inside": { 1420 | "version": "1.0.1", 1421 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1422 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1423 | "dev": true, 1424 | "requires": { 1425 | "path-is-inside": "^1.0.1" 1426 | } 1427 | }, 1428 | "is-promise": { 1429 | "version": "2.1.0", 1430 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1431 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 1432 | "dev": true 1433 | }, 1434 | "is-stream": { 1435 | "version": "1.1.0", 1436 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 1437 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 1438 | "dev": true 1439 | }, 1440 | "is-typedarray": { 1441 | "version": "1.0.0", 1442 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1443 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 1444 | "dev": true 1445 | }, 1446 | "isarray": { 1447 | "version": "1.0.0", 1448 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1449 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 1450 | "dev": true 1451 | }, 1452 | "isexe": { 1453 | "version": "2.0.0", 1454 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1455 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1456 | "dev": true 1457 | }, 1458 | "isstream": { 1459 | "version": "0.1.2", 1460 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1461 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 1462 | "dev": true 1463 | }, 1464 | "js-tokens": { 1465 | "version": "4.0.0", 1466 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1467 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1468 | "dev": true 1469 | }, 1470 | "js-yaml": { 1471 | "version": "3.13.1", 1472 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1473 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1474 | "dev": true, 1475 | "requires": { 1476 | "argparse": "^1.0.7", 1477 | "esprima": "^4.0.0" 1478 | } 1479 | }, 1480 | "jsbn": { 1481 | "version": "0.1.1", 1482 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1483 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1484 | "dev": true 1485 | }, 1486 | "json-schema": { 1487 | "version": "0.2.3", 1488 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1489 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 1490 | "dev": true 1491 | }, 1492 | "json-schema-traverse": { 1493 | "version": "0.4.1", 1494 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1495 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1496 | "dev": true 1497 | }, 1498 | "json-stable-stringify-without-jsonify": { 1499 | "version": "1.0.1", 1500 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1501 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 1502 | "dev": true 1503 | }, 1504 | "json-stringify-safe": { 1505 | "version": "5.0.1", 1506 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1507 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1508 | "dev": true 1509 | }, 1510 | "jsonfile": { 1511 | "version": "4.0.0", 1512 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1513 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1514 | "dev": true, 1515 | "requires": { 1516 | "graceful-fs": "^4.1.6" 1517 | } 1518 | }, 1519 | "jsprim": { 1520 | "version": "1.4.1", 1521 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1522 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1523 | "dev": true, 1524 | "requires": { 1525 | "assert-plus": "1.0.0", 1526 | "extsprintf": "1.3.0", 1527 | "json-schema": "0.2.3", 1528 | "verror": "1.10.0" 1529 | } 1530 | }, 1531 | "lazy-ass": { 1532 | "version": "1.6.0", 1533 | "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", 1534 | "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", 1535 | "dev": true 1536 | }, 1537 | "levn": { 1538 | "version": "0.3.0", 1539 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1540 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1541 | "dev": true, 1542 | "requires": { 1543 | "prelude-ls": "~1.1.2", 1544 | "type-check": "~0.3.2" 1545 | } 1546 | }, 1547 | "listr": { 1548 | "version": "0.12.0", 1549 | "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", 1550 | "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", 1551 | "dev": true, 1552 | "requires": { 1553 | "chalk": "^1.1.3", 1554 | "cli-truncate": "^0.2.1", 1555 | "figures": "^1.7.0", 1556 | "indent-string": "^2.1.0", 1557 | "is-promise": "^2.1.0", 1558 | "is-stream": "^1.1.0", 1559 | "listr-silent-renderer": "^1.1.1", 1560 | "listr-update-renderer": "^0.2.0", 1561 | "listr-verbose-renderer": "^0.4.0", 1562 | "log-symbols": "^1.0.2", 1563 | "log-update": "^1.0.2", 1564 | "ora": "^0.2.3", 1565 | "p-map": "^1.1.1", 1566 | "rxjs": "^5.0.0-beta.11", 1567 | "stream-to-observable": "^0.1.0", 1568 | "strip-ansi": "^3.0.1" 1569 | }, 1570 | "dependencies": { 1571 | "chalk": { 1572 | "version": "1.1.3", 1573 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1574 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1575 | "dev": true, 1576 | "requires": { 1577 | "ansi-styles": "^2.2.1", 1578 | "escape-string-regexp": "^1.0.2", 1579 | "has-ansi": "^2.0.0", 1580 | "strip-ansi": "^3.0.0", 1581 | "supports-color": "^2.0.0" 1582 | } 1583 | }, 1584 | "log-symbols": { 1585 | "version": "1.0.2", 1586 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", 1587 | "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", 1588 | "dev": true, 1589 | "requires": { 1590 | "chalk": "^1.0.0" 1591 | } 1592 | }, 1593 | "supports-color": { 1594 | "version": "2.0.0", 1595 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1596 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1597 | "dev": true 1598 | } 1599 | } 1600 | }, 1601 | "listr-silent-renderer": { 1602 | "version": "1.1.1", 1603 | "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", 1604 | "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", 1605 | "dev": true 1606 | }, 1607 | "listr-update-renderer": { 1608 | "version": "0.2.0", 1609 | "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz", 1610 | "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", 1611 | "dev": true, 1612 | "requires": { 1613 | "chalk": "^1.1.3", 1614 | "cli-truncate": "^0.2.1", 1615 | "elegant-spinner": "^1.0.1", 1616 | "figures": "^1.7.0", 1617 | "indent-string": "^3.0.0", 1618 | "log-symbols": "^1.0.2", 1619 | "log-update": "^1.0.2", 1620 | "strip-ansi": "^3.0.1" 1621 | }, 1622 | "dependencies": { 1623 | "chalk": { 1624 | "version": "1.1.3", 1625 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1626 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1627 | "dev": true, 1628 | "requires": { 1629 | "ansi-styles": "^2.2.1", 1630 | "escape-string-regexp": "^1.0.2", 1631 | "has-ansi": "^2.0.0", 1632 | "strip-ansi": "^3.0.0", 1633 | "supports-color": "^2.0.0" 1634 | } 1635 | }, 1636 | "indent-string": { 1637 | "version": "3.2.0", 1638 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", 1639 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", 1640 | "dev": true 1641 | }, 1642 | "log-symbols": { 1643 | "version": "1.0.2", 1644 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", 1645 | "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", 1646 | "dev": true, 1647 | "requires": { 1648 | "chalk": "^1.0.0" 1649 | } 1650 | }, 1651 | "supports-color": { 1652 | "version": "2.0.0", 1653 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1654 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1655 | "dev": true 1656 | } 1657 | } 1658 | }, 1659 | "listr-verbose-renderer": { 1660 | "version": "0.4.1", 1661 | "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", 1662 | "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", 1663 | "dev": true, 1664 | "requires": { 1665 | "chalk": "^1.1.3", 1666 | "cli-cursor": "^1.0.2", 1667 | "date-fns": "^1.27.2", 1668 | "figures": "^1.7.0" 1669 | }, 1670 | "dependencies": { 1671 | "chalk": { 1672 | "version": "1.1.3", 1673 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1674 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1675 | "dev": true, 1676 | "requires": { 1677 | "ansi-styles": "^2.2.1", 1678 | "escape-string-regexp": "^1.0.2", 1679 | "has-ansi": "^2.0.0", 1680 | "strip-ansi": "^3.0.0", 1681 | "supports-color": "^2.0.0" 1682 | } 1683 | }, 1684 | "supports-color": { 1685 | "version": "2.0.0", 1686 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1687 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1688 | "dev": true 1689 | } 1690 | } 1691 | }, 1692 | "lodash": { 1693 | "version": "4.17.15", 1694 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1695 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1696 | "dev": true 1697 | }, 1698 | "lodash.once": { 1699 | "version": "4.1.1", 1700 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1701 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", 1702 | "dev": true 1703 | }, 1704 | "log-symbols": { 1705 | "version": "2.2.0", 1706 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 1707 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 1708 | "dev": true, 1709 | "requires": { 1710 | "chalk": "^2.0.1" 1711 | } 1712 | }, 1713 | "log-update": { 1714 | "version": "1.0.2", 1715 | "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", 1716 | "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", 1717 | "dev": true, 1718 | "requires": { 1719 | "ansi-escapes": "^1.0.0", 1720 | "cli-cursor": "^1.0.2" 1721 | } 1722 | }, 1723 | "mime-db": { 1724 | "version": "1.42.0", 1725 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", 1726 | "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==", 1727 | "dev": true 1728 | }, 1729 | "mime-types": { 1730 | "version": "2.1.25", 1731 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", 1732 | "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", 1733 | "dev": true, 1734 | "requires": { 1735 | "mime-db": "1.42.0" 1736 | } 1737 | }, 1738 | "mimic-fn": { 1739 | "version": "2.1.0", 1740 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 1741 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 1742 | "dev": true 1743 | }, 1744 | "minimatch": { 1745 | "version": "3.0.4", 1746 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1747 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1748 | "dev": true, 1749 | "requires": { 1750 | "brace-expansion": "^1.1.7" 1751 | } 1752 | }, 1753 | "minimist": { 1754 | "version": "1.2.0", 1755 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1756 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1757 | "dev": true 1758 | }, 1759 | "mkdirp": { 1760 | "version": "0.5.1", 1761 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1762 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1763 | "dev": true, 1764 | "requires": { 1765 | "minimist": "0.0.8" 1766 | }, 1767 | "dependencies": { 1768 | "minimist": { 1769 | "version": "0.0.8", 1770 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1771 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1772 | "dev": true 1773 | } 1774 | } 1775 | }, 1776 | "moment": { 1777 | "version": "2.24.0", 1778 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", 1779 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", 1780 | "dev": true 1781 | }, 1782 | "ms": { 1783 | "version": "2.1.1", 1784 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1785 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 1786 | "dev": true 1787 | }, 1788 | "mute-stream": { 1789 | "version": "0.0.8", 1790 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", 1791 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", 1792 | "dev": true 1793 | }, 1794 | "natural-compare": { 1795 | "version": "1.4.0", 1796 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1797 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1798 | "dev": true 1799 | }, 1800 | "nice-try": { 1801 | "version": "1.0.5", 1802 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 1803 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 1804 | "dev": true 1805 | }, 1806 | "npm-run-path": { 1807 | "version": "2.0.2", 1808 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1809 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1810 | "dev": true, 1811 | "requires": { 1812 | "path-key": "^2.0.0" 1813 | } 1814 | }, 1815 | "number-is-nan": { 1816 | "version": "1.0.1", 1817 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1818 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 1819 | "dev": true 1820 | }, 1821 | "oauth-sign": { 1822 | "version": "0.9.0", 1823 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 1824 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 1825 | "dev": true 1826 | }, 1827 | "object-assign": { 1828 | "version": "4.1.1", 1829 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1830 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 1831 | "dev": true 1832 | }, 1833 | "once": { 1834 | "version": "1.4.0", 1835 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1836 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1837 | "dev": true, 1838 | "requires": { 1839 | "wrappy": "1" 1840 | } 1841 | }, 1842 | "onetime": { 1843 | "version": "1.1.0", 1844 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 1845 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", 1846 | "dev": true 1847 | }, 1848 | "optionator": { 1849 | "version": "0.8.3", 1850 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", 1851 | "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", 1852 | "dev": true, 1853 | "requires": { 1854 | "deep-is": "~0.1.3", 1855 | "fast-levenshtein": "~2.0.6", 1856 | "levn": "~0.3.0", 1857 | "prelude-ls": "~1.1.2", 1858 | "type-check": "~0.3.2", 1859 | "word-wrap": "~1.2.3" 1860 | } 1861 | }, 1862 | "ora": { 1863 | "version": "0.2.3", 1864 | "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", 1865 | "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", 1866 | "dev": true, 1867 | "requires": { 1868 | "chalk": "^1.1.1", 1869 | "cli-cursor": "^1.0.2", 1870 | "cli-spinners": "^0.1.2", 1871 | "object-assign": "^4.0.1" 1872 | }, 1873 | "dependencies": { 1874 | "chalk": { 1875 | "version": "1.1.3", 1876 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1877 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1878 | "dev": true, 1879 | "requires": { 1880 | "ansi-styles": "^2.2.1", 1881 | "escape-string-regexp": "^1.0.2", 1882 | "has-ansi": "^2.0.0", 1883 | "strip-ansi": "^3.0.0", 1884 | "supports-color": "^2.0.0" 1885 | } 1886 | }, 1887 | "supports-color": { 1888 | "version": "2.0.0", 1889 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1890 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1891 | "dev": true 1892 | } 1893 | } 1894 | }, 1895 | "os-homedir": { 1896 | "version": "1.0.2", 1897 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1898 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1899 | "dev": true 1900 | }, 1901 | "os-tmpdir": { 1902 | "version": "1.0.2", 1903 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1904 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1905 | "dev": true 1906 | }, 1907 | "p-finally": { 1908 | "version": "1.0.0", 1909 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1910 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 1911 | "dev": true 1912 | }, 1913 | "p-map": { 1914 | "version": "1.2.0", 1915 | "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", 1916 | "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", 1917 | "dev": true 1918 | }, 1919 | "parent-module": { 1920 | "version": "1.0.1", 1921 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1922 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1923 | "dev": true, 1924 | "requires": { 1925 | "callsites": "^3.0.0" 1926 | } 1927 | }, 1928 | "path-is-absolute": { 1929 | "version": "1.0.1", 1930 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1931 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1932 | "dev": true 1933 | }, 1934 | "path-is-inside": { 1935 | "version": "1.0.2", 1936 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1937 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 1938 | "dev": true 1939 | }, 1940 | "path-key": { 1941 | "version": "2.0.1", 1942 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1943 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 1944 | "dev": true 1945 | }, 1946 | "pend": { 1947 | "version": "1.2.0", 1948 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1949 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", 1950 | "dev": true 1951 | }, 1952 | "performance-now": { 1953 | "version": "2.1.0", 1954 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1955 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 1956 | "dev": true 1957 | }, 1958 | "pify": { 1959 | "version": "2.3.0", 1960 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1961 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", 1962 | "dev": true 1963 | }, 1964 | "prelude-ls": { 1965 | "version": "1.1.2", 1966 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1967 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 1968 | "dev": true 1969 | }, 1970 | "pretty-format": { 1971 | "version": "24.9.0", 1972 | "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", 1973 | "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", 1974 | "dev": true, 1975 | "requires": { 1976 | "@jest/types": "^24.9.0", 1977 | "ansi-regex": "^4.0.0", 1978 | "ansi-styles": "^3.2.0", 1979 | "react-is": "^16.8.4" 1980 | }, 1981 | "dependencies": { 1982 | "ansi-regex": { 1983 | "version": "4.1.0", 1984 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1985 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1986 | "dev": true 1987 | }, 1988 | "ansi-styles": { 1989 | "version": "3.2.1", 1990 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 1991 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 1992 | "dev": true, 1993 | "requires": { 1994 | "color-convert": "^1.9.0" 1995 | } 1996 | } 1997 | } 1998 | }, 1999 | "process-nextick-args": { 2000 | "version": "2.0.1", 2001 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2002 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 2003 | "dev": true 2004 | }, 2005 | "progress": { 2006 | "version": "2.0.3", 2007 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 2008 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 2009 | "dev": true 2010 | }, 2011 | "psl": { 2012 | "version": "1.6.0", 2013 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", 2014 | "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==", 2015 | "dev": true 2016 | }, 2017 | "punycode": { 2018 | "version": "2.1.1", 2019 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2020 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 2021 | "dev": true 2022 | }, 2023 | "qs": { 2024 | "version": "6.5.2", 2025 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2026 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 2027 | "dev": true 2028 | }, 2029 | "querystring": { 2030 | "version": "0.2.0", 2031 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2032 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 2033 | "dev": true 2034 | }, 2035 | "ramda": { 2036 | "version": "0.24.1", 2037 | "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", 2038 | "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", 2039 | "dev": true 2040 | }, 2041 | "react-is": { 2042 | "version": "16.12.0", 2043 | "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", 2044 | "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", 2045 | "dev": true 2046 | }, 2047 | "readable-stream": { 2048 | "version": "2.3.6", 2049 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2050 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2051 | "dev": true, 2052 | "requires": { 2053 | "core-util-is": "~1.0.0", 2054 | "inherits": "~2.0.3", 2055 | "isarray": "~1.0.0", 2056 | "process-nextick-args": "~2.0.0", 2057 | "safe-buffer": "~5.1.1", 2058 | "string_decoder": "~1.1.1", 2059 | "util-deprecate": "~1.0.1" 2060 | } 2061 | }, 2062 | "regenerator-runtime": { 2063 | "version": "0.13.3", 2064 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", 2065 | "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", 2066 | "dev": true 2067 | }, 2068 | "regexpp": { 2069 | "version": "2.0.1", 2070 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 2071 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 2072 | "dev": true 2073 | }, 2074 | "repeating": { 2075 | "version": "2.0.1", 2076 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 2077 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 2078 | "dev": true, 2079 | "requires": { 2080 | "is-finite": "^1.0.0" 2081 | } 2082 | }, 2083 | "request": { 2084 | "version": "2.88.0", 2085 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 2086 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 2087 | "dev": true, 2088 | "requires": { 2089 | "aws-sign2": "~0.7.0", 2090 | "aws4": "^1.8.0", 2091 | "caseless": "~0.12.0", 2092 | "combined-stream": "~1.0.6", 2093 | "extend": "~3.0.2", 2094 | "forever-agent": "~0.6.1", 2095 | "form-data": "~2.3.2", 2096 | "har-validator": "~5.1.0", 2097 | "http-signature": "~1.2.0", 2098 | "is-typedarray": "~1.0.0", 2099 | "isstream": "~0.1.2", 2100 | "json-stringify-safe": "~5.0.1", 2101 | "mime-types": "~2.1.19", 2102 | "oauth-sign": "~0.9.0", 2103 | "performance-now": "^2.1.0", 2104 | "qs": "~6.5.2", 2105 | "safe-buffer": "^5.1.2", 2106 | "tough-cookie": "~2.4.3", 2107 | "tunnel-agent": "^0.6.0", 2108 | "uuid": "^3.3.2" 2109 | } 2110 | }, 2111 | "request-progress": { 2112 | "version": "3.0.0", 2113 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", 2114 | "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", 2115 | "dev": true, 2116 | "requires": { 2117 | "throttleit": "^1.0.0" 2118 | } 2119 | }, 2120 | "resolve-from": { 2121 | "version": "4.0.0", 2122 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2123 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2124 | "dev": true 2125 | }, 2126 | "restore-cursor": { 2127 | "version": "1.0.1", 2128 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 2129 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", 2130 | "dev": true, 2131 | "requires": { 2132 | "exit-hook": "^1.0.0", 2133 | "onetime": "^1.0.0" 2134 | } 2135 | }, 2136 | "rimraf": { 2137 | "version": "2.6.3", 2138 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2139 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2140 | "dev": true, 2141 | "requires": { 2142 | "glob": "^7.1.3" 2143 | } 2144 | }, 2145 | "run-async": { 2146 | "version": "2.3.0", 2147 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 2148 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 2149 | "dev": true, 2150 | "requires": { 2151 | "is-promise": "^2.1.0" 2152 | } 2153 | }, 2154 | "rxjs": { 2155 | "version": "5.5.12", 2156 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", 2157 | "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", 2158 | "dev": true, 2159 | "requires": { 2160 | "symbol-observable": "1.0.1" 2161 | } 2162 | }, 2163 | "safe-buffer": { 2164 | "version": "5.1.2", 2165 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2166 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 2167 | "dev": true 2168 | }, 2169 | "safer-buffer": { 2170 | "version": "2.1.2", 2171 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2172 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2173 | "dev": true 2174 | }, 2175 | "semver": { 2176 | "version": "5.7.0", 2177 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 2178 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", 2179 | "dev": true 2180 | }, 2181 | "shebang-command": { 2182 | "version": "1.2.0", 2183 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 2184 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 2185 | "dev": true, 2186 | "requires": { 2187 | "shebang-regex": "^1.0.0" 2188 | } 2189 | }, 2190 | "shebang-regex": { 2191 | "version": "1.0.0", 2192 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 2193 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 2194 | "dev": true 2195 | }, 2196 | "signal-exit": { 2197 | "version": "3.0.2", 2198 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2199 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 2200 | "dev": true 2201 | }, 2202 | "slice-ansi": { 2203 | "version": "0.0.4", 2204 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 2205 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 2206 | "dev": true 2207 | }, 2208 | "sprintf-js": { 2209 | "version": "1.0.3", 2210 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2211 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2212 | "dev": true 2213 | }, 2214 | "sshpk": { 2215 | "version": "1.16.1", 2216 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 2217 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 2218 | "dev": true, 2219 | "requires": { 2220 | "asn1": "~0.2.3", 2221 | "assert-plus": "^1.0.0", 2222 | "bcrypt-pbkdf": "^1.0.0", 2223 | "dashdash": "^1.12.0", 2224 | "ecc-jsbn": "~0.1.1", 2225 | "getpass": "^0.1.1", 2226 | "jsbn": "~0.1.0", 2227 | "safer-buffer": "^2.0.2", 2228 | "tweetnacl": "~0.14.0" 2229 | } 2230 | }, 2231 | "stream-to-observable": { 2232 | "version": "0.1.0", 2233 | "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", 2234 | "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", 2235 | "dev": true 2236 | }, 2237 | "string-width": { 2238 | "version": "1.0.2", 2239 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2240 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2241 | "dev": true, 2242 | "requires": { 2243 | "code-point-at": "^1.0.0", 2244 | "is-fullwidth-code-point": "^1.0.0", 2245 | "strip-ansi": "^3.0.0" 2246 | } 2247 | }, 2248 | "string_decoder": { 2249 | "version": "1.1.1", 2250 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2251 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2252 | "dev": true, 2253 | "requires": { 2254 | "safe-buffer": "~5.1.0" 2255 | } 2256 | }, 2257 | "strip-ansi": { 2258 | "version": "3.0.1", 2259 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2260 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2261 | "dev": true, 2262 | "requires": { 2263 | "ansi-regex": "^2.0.0" 2264 | } 2265 | }, 2266 | "strip-eof": { 2267 | "version": "1.0.0", 2268 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 2269 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 2270 | "dev": true 2271 | }, 2272 | "strip-json-comments": { 2273 | "version": "3.0.1", 2274 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 2275 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 2276 | "dev": true 2277 | }, 2278 | "supports-color": { 2279 | "version": "5.5.0", 2280 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 2281 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 2282 | "dev": true, 2283 | "requires": { 2284 | "has-flag": "^3.0.0" 2285 | } 2286 | }, 2287 | "symbol-observable": { 2288 | "version": "1.0.1", 2289 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 2290 | "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", 2291 | "dev": true 2292 | }, 2293 | "table": { 2294 | "version": "5.4.6", 2295 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 2296 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 2297 | "dev": true, 2298 | "requires": { 2299 | "ajv": "^6.10.2", 2300 | "lodash": "^4.17.14", 2301 | "slice-ansi": "^2.1.0", 2302 | "string-width": "^3.0.0" 2303 | }, 2304 | "dependencies": { 2305 | "ajv": { 2306 | "version": "6.10.2", 2307 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 2308 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 2309 | "dev": true, 2310 | "requires": { 2311 | "fast-deep-equal": "^2.0.1", 2312 | "fast-json-stable-stringify": "^2.0.0", 2313 | "json-schema-traverse": "^0.4.1", 2314 | "uri-js": "^4.2.2" 2315 | } 2316 | }, 2317 | "ansi-regex": { 2318 | "version": "4.1.0", 2319 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2320 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2321 | "dev": true 2322 | }, 2323 | "ansi-styles": { 2324 | "version": "3.2.1", 2325 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2326 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2327 | "dev": true, 2328 | "requires": { 2329 | "color-convert": "^1.9.0" 2330 | } 2331 | }, 2332 | "emoji-regex": { 2333 | "version": "7.0.3", 2334 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 2335 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 2336 | "dev": true 2337 | }, 2338 | "is-fullwidth-code-point": { 2339 | "version": "2.0.0", 2340 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2341 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 2342 | "dev": true 2343 | }, 2344 | "slice-ansi": { 2345 | "version": "2.1.0", 2346 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 2347 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 2348 | "dev": true, 2349 | "requires": { 2350 | "ansi-styles": "^3.2.0", 2351 | "astral-regex": "^1.0.0", 2352 | "is-fullwidth-code-point": "^2.0.0" 2353 | } 2354 | }, 2355 | "string-width": { 2356 | "version": "3.1.0", 2357 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2358 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2359 | "dev": true, 2360 | "requires": { 2361 | "emoji-regex": "^7.0.1", 2362 | "is-fullwidth-code-point": "^2.0.0", 2363 | "strip-ansi": "^5.1.0" 2364 | } 2365 | }, 2366 | "strip-ansi": { 2367 | "version": "5.2.0", 2368 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2369 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2370 | "dev": true, 2371 | "requires": { 2372 | "ansi-regex": "^4.1.0" 2373 | } 2374 | } 2375 | } 2376 | }, 2377 | "text-table": { 2378 | "version": "0.2.0", 2379 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2380 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2381 | "dev": true 2382 | }, 2383 | "throttleit": { 2384 | "version": "1.0.0", 2385 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 2386 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", 2387 | "dev": true 2388 | }, 2389 | "through": { 2390 | "version": "2.3.8", 2391 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2392 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2393 | "dev": true 2394 | }, 2395 | "tmp": { 2396 | "version": "0.1.0", 2397 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", 2398 | "integrity": "sha512-J7Z2K08jbGcdA1kkQpJSqLF6T0tdQqpR2pnSUXsIchbPdTI9v3e85cLW0d6WDhwuAleOV71j2xWs8qMPfK7nKw==", 2399 | "dev": true, 2400 | "requires": { 2401 | "rimraf": "^2.6.3" 2402 | } 2403 | }, 2404 | "tough-cookie": { 2405 | "version": "2.4.3", 2406 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 2407 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 2408 | "dev": true, 2409 | "requires": { 2410 | "psl": "^1.1.24", 2411 | "punycode": "^1.4.1" 2412 | }, 2413 | "dependencies": { 2414 | "punycode": { 2415 | "version": "1.4.1", 2416 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 2417 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 2418 | "dev": true 2419 | } 2420 | } 2421 | }, 2422 | "tslib": { 2423 | "version": "1.10.0", 2424 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 2425 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 2426 | "dev": true 2427 | }, 2428 | "tunnel-agent": { 2429 | "version": "0.6.0", 2430 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2431 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2432 | "dev": true, 2433 | "requires": { 2434 | "safe-buffer": "^5.0.1" 2435 | } 2436 | }, 2437 | "tweetnacl": { 2438 | "version": "0.14.5", 2439 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2440 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2441 | "dev": true 2442 | }, 2443 | "type-check": { 2444 | "version": "0.3.2", 2445 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2446 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2447 | "dev": true, 2448 | "requires": { 2449 | "prelude-ls": "~1.1.2" 2450 | } 2451 | }, 2452 | "type-fest": { 2453 | "version": "0.8.1", 2454 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", 2455 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", 2456 | "dev": true 2457 | }, 2458 | "typedarray": { 2459 | "version": "0.0.6", 2460 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2461 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", 2462 | "dev": true 2463 | }, 2464 | "typescript": { 2465 | "version": "3.7.5", 2466 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz", 2467 | "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==", 2468 | "dev": true 2469 | }, 2470 | "universalify": { 2471 | "version": "0.1.2", 2472 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 2473 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 2474 | "dev": true 2475 | }, 2476 | "untildify": { 2477 | "version": "3.0.3", 2478 | "resolved": "https://registry.npmjs.org/untildify/-/untildify-3.0.3.tgz", 2479 | "integrity": "sha512-iSk/J8efr8uPT/Z4eSUywnqyrQU7DSdMfdqK4iWEaUVVmcP5JcnpRqmVMwcwcnmI1ATFNgC5V90u09tBynNFKA==", 2480 | "dev": true 2481 | }, 2482 | "uri-js": { 2483 | "version": "4.2.2", 2484 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 2485 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 2486 | "dev": true, 2487 | "requires": { 2488 | "punycode": "^2.1.0" 2489 | } 2490 | }, 2491 | "url": { 2492 | "version": "0.11.0", 2493 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 2494 | "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", 2495 | "dev": true, 2496 | "requires": { 2497 | "punycode": "1.3.2", 2498 | "querystring": "0.2.0" 2499 | }, 2500 | "dependencies": { 2501 | "punycode": { 2502 | "version": "1.3.2", 2503 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2504 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 2505 | "dev": true 2506 | } 2507 | } 2508 | }, 2509 | "util-deprecate": { 2510 | "version": "1.0.2", 2511 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2512 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", 2513 | "dev": true 2514 | }, 2515 | "uuid": { 2516 | "version": "3.3.3", 2517 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 2518 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", 2519 | "dev": true 2520 | }, 2521 | "v8-compile-cache": { 2522 | "version": "2.1.0", 2523 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 2524 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 2525 | "dev": true 2526 | }, 2527 | "verror": { 2528 | "version": "1.10.0", 2529 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2530 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2531 | "dev": true, 2532 | "requires": { 2533 | "assert-plus": "^1.0.0", 2534 | "core-util-is": "1.0.2", 2535 | "extsprintf": "^1.2.0" 2536 | } 2537 | }, 2538 | "wait-for-expect": { 2539 | "version": "3.0.1", 2540 | "resolved": "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.1.tgz", 2541 | "integrity": "sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==", 2542 | "dev": true 2543 | }, 2544 | "which": { 2545 | "version": "1.3.1", 2546 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 2547 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 2548 | "dev": true, 2549 | "requires": { 2550 | "isexe": "^2.0.0" 2551 | } 2552 | }, 2553 | "word-wrap": { 2554 | "version": "1.2.3", 2555 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", 2556 | "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2557 | "dev": true 2558 | }, 2559 | "wrappy": { 2560 | "version": "1.0.2", 2561 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2562 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2563 | "dev": true 2564 | }, 2565 | "write": { 2566 | "version": "1.0.3", 2567 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 2568 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 2569 | "dev": true, 2570 | "requires": { 2571 | "mkdirp": "^0.5.1" 2572 | } 2573 | }, 2574 | "yauzl": { 2575 | "version": "2.10.0", 2576 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 2577 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 2578 | "dev": true, 2579 | "requires": { 2580 | "buffer-crc32": "~0.2.3", 2581 | "fd-slicer": "~1.1.0" 2582 | }, 2583 | "dependencies": { 2584 | "fd-slicer": { 2585 | "version": "1.1.0", 2586 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 2587 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 2588 | "dev": true, 2589 | "requires": { 2590 | "pend": "~1.2.0" 2591 | } 2592 | } 2593 | } 2594 | } 2595 | } 2596 | } 2597 | -------------------------------------------------------------------------------- /e2e/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "t3n-neos-debug-e2e", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "cy": "cypress run", 8 | "cy:open": "cypress open" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "devDependencies": { 13 | "@testing-library/cypress": "^5.0.2", 14 | "cypress": "^3.8.3", 15 | "eslint": "^6.8.0", 16 | "eslint-config-cypress": "^0.28.0", 17 | "typescript": "^3.7.5" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /phpcs.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Classes 13 | 14 | 15 | -------------------------------------------------------------------------------- /server-timing-example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3n/neos-debug/048365523b2dd57b1b45f3e0a6aeb68c98a92d43/server-timing-example.jpg -------------------------------------------------------------------------------- /t3n-neos-debug.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3n/neos-debug/048365523b2dd57b1b45f3e0a6aeb68c98a92d43/t3n-neos-debug.jpg --------------------------------------------------------------------------------