{"_id":"ui-migration-stats","_rev":"208-85afa724391c9359d12cff0b6d50d58d","name":"ui-migration-stats","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"ui-migration-stats","version":"1.0.0","keywords":["migration","statistics","stats","webpack","loc","ui","framework"],"author":{"name":"Sachin Fernandes","email":"sachin@cloudflare.com"},"license":"BSD-3-Clause","_id":"ui-migration-stats@1.0.0","maintainers":[{"name":"miksu","email":"vojtech@miksu.cz"}],"homepage":"https://github.com/cloudflare/ui-migration-stats","bugs":{"url":"https://github.com/cloudflare/ui-migration-stats/issues"},"bin":{"stats":"./lib/stats.js"},"dist":{"shasum":"8a5e07664ae8b48cdc92c138b88c14cd90144ec8","tarball":"https://registry.npmjs.org/ui-migration-stats/-/ui-migration-stats-1.0.0.tgz","integrity":"sha512-9Hnc1GZsYT0Uw0J6IODhqJ4rsVaVxBkuyh96gbQ/oRqLvyNmh4MzQy8WB7n26RH9ytc8WN9kGXNacYoPKBRFFg==","signatures":[{"sig":"MEUCIQCdNzis/eEGOq3jIjTQFQ0xraZxvk17XfTNaH78NCZwSgIgKpvVClPprlP+5F+spcU4uMzvU9Kl4exosxmC0GKyED0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"jest":{"cacheDirectory":".jest","collectCoverageFrom":["**/*.{js}","!**/node_modules/**","!**/example/**"]},"main":"./lib/stats.js","_from":".","babel":{"ignore":["/example/"],"presets":["es2015"],"comments":false,"minified":true},"_shasum":"8a5e07664ae8b48cdc92c138b88c14cd90144ec8","gitHead":"1b9ce508db71f5d86a5c12d5f319f2260423b1a4","scripts":{"dev":"watch 'yarn build;yarn demo' ./src ./example","demo":"yarn build && node ./lib/stats --config='../example/stats-example.conf.js'","lint":"eslint ./src/stats.js ./src/stats-constants.json ./src/utils/helpers.js","test":"jest","build":"rm -rf ./lib && node_modules/babel-cli/bin/babel.js src --out-dir lib --copy-files","clean":"rm -rf .jest node_modules","cover":"jest --coverage","format":"eslint --fix ./src/stats.js ./src/stats-constants.json ./src/utils/helpers.js","prepush":"yarn build && yarn test && yarn format","dev-test":"watch 'yarn build;yarn test' ./src ./test"},"_npmUser":{"name":"miksu","email":"vojtech@miksu.cz"},"repository":{"url":"git+https://github.com/cloudflare/ui-migration-stats.git","type":"git"},"_npmVersion":"4.1.2","description":"Migration stats for frameworks","directories":{},"_nodeVersion":"7.7.3","dependencies":{"sloc":"^0.2.0","chalk":"^1.1.3","commander":"^2.9.0","prettyjson":"^1.2.1","directory-tree":"^1.2.1"},"devDependencies":{"jest":"^19.0.2","husky":"^0.13.3","watch":"^1.0.2","eslint":"^3.19.0","shelljs":"^0.7.7","prettier":"^1.1.0","babel-cli":"^6.24.1","eslint-plugin-json":"^1.2.0","babel-preset-es2015":"^6.24.1","eslint-plugin-react":"^6.10.3","eslint-plugin-cflint":"^1.0.0","eslint-plugin-compat":"^1.0.2","eslint-plugin-import":"^2.2.0","eslint-plugin-prettier":"^2.0.1"},"_npmOperationalInternal":{"tmp":"tmp/ui-migration-stats-1.0.0.tgz_1493153674450_0.7266752193681896","host":"packages-18-east.internal.npmjs.com"}},"1.0.2":{"name":"ui-migration-stats","version":"1.0.2","keywords":["migration","statistics","stats","webpack","loc","ui","framework"],"author":{"name":"Sachin Fernandes","email":"sachin@cloudflare.com"},"license":"BSD-3-Clause","_id":"ui-migration-stats@1.0.2","maintainers":[{"name":"miksu","email":"vojtech@miksu.cz"}],"homepage":"https://github.com/cloudflare/ui-migration-stats","bugs":{"url":"https://github.com/cloudflare/ui-migration-stats/issues"},"bin":{"stats":"./lib/stats.js"},"dist":{"shasum":"8ca170c8f9fb84ea56355420ca4b43fc98efda98","tarball":"https://registry.npmjs.org/ui-migration-stats/-/ui-migration-stats-1.0.2.tgz","integrity":"sha512-eum4y6/gWWI/oXyjIJGhGASnt9uNIYBfpiikw2ug0MOUZgbKdVOoV+l+sL8b/VejLj/R/tZhyMFFM40H5+7obQ==","signatures":[{"sig":"MEYCIQCpW0jkAzq9hV6MCByJz1NkQ3QdmEeQQoi2RuqNsMrIMQIhANqfcYiCF5eO+eb9ovY8I2PFaWVfOXRDRgy1sl+TZ5tA","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"jest":{"cacheDirectory":".jest","collectCoverageFrom":["**/*.{js}","!**/node_modules/**","!**/example/**"]},"main":"./lib/stats.js","_from":".","babel":{"ignore":["/example/"],"presets":["es2015"],"comments":false,"minified":true},"_shasum":"8ca170c8f9fb84ea56355420ca4b43fc98efda98","gitHead":"f170270d37e4195aed245cfb461da3aed4ce36dd","scripts":{"dev":"watch 'yarn build;yarn demo' ./src ./example","demo":"yarn build && node ./lib/stats --config='./example/stats-example.conf.js'","lint":"eslint ./src/stats.js ./src/stats-constants.json ./src/utils/helpers.js","test":"jest","build":"rm -rf ./lib && node_modules/babel-cli/bin/babel.js src --out-dir lib --copy-files","clean":"rm -rf .jest node_modules","cover":"jest --coverage","format":"eslint --fix ./src/stats.js ./src/stats-constants.json ./src/utils/helpers.js","prepush":"yarn build && yarn test && yarn format","dev-test":"watch 'yarn build;yarn test' ./src ./test"},"_npmUser":{"name":"miksu","email":"vojtech@miksu.cz"},"repository":{"url":"git+https://github.com/cloudflare/ui-migration-stats.git","type":"git"},"_npmVersion":"4.1.2","description":"Migration stats for frameworks","directories":{},"_nodeVersion":"7.7.3","dependencies":{"sloc":"^0.2.0","chalk":"^1.1.3","commander":"^2.9.0","prettyjson":"^1.2.1","directory-tree":"^1.2.1"},"devDependencies":{"jest":"^19.0.2","husky":"^0.13.3","watch":"^1.0.2","eslint":"^3.19.0","shelljs":"^0.7.7","prettier":"^1.1.0","babel-cli":"^6.24.1","eslint-plugin-json":"^1.2.0","babel-preset-es2015":"^6.24.1","eslint-plugin-react":"^6.10.3","eslint-plugin-cflint":"^1.0.0","eslint-plugin-compat":"^1.0.2","eslint-plugin-import":"^2.2.0","eslint-plugin-prettier":"^2.0.1"},"_npmOperationalInternal":{"tmp":"tmp/ui-migration-stats-1.0.2.tgz_1493160487260_0.7072454579174519","host":"packages-12-west.internal.npmjs.com"}},"2.0.0":{"name":"ui-migration-stats","version":"2.0.0","keywords":["migration","statistics","stats","webpack","loc","ui","framework"],"author":{"name":"Sachin Fernandes","email":"sachin@cloudflare.com"},"license":"BSD-3-Clause","_id":"ui-migration-stats@2.0.0","maintainers":[{"name":"manatarms","email":"fernandes.sachin@gmail.com"},{"name":"cf-ci","email":"npm-readonly@cloudflare.com"},{"name":"jparyani-cloudflare","email":"jparyani@cloudflare.com"},{"name":"ryan0x44","email":"npmjs@ryan0x44.com"},{"name":"johndotawesome","email":"jrf0110@gmail.com"},{"name":"sejoker","email":"sejoker@gmail.com"},{"name":"hturan","email":"harley@hturan.com"},{"name":"thellimist","email":"mufuyil@gmail.com"},{"name":"koddsson","email":"koddsson@gmail.com"},{"name":"wyuenho","email":"wyuenho@gmail.com"},{"name":"marksteyn","email":"mark@cloudflare.com"},{"name":"jculvey","email":"jculveyhouse@gmail.com"},{"name":"jwineman","email":"john.wineman@gmail.com"},{"name":"nkcmr","email":"nick@comer.io"},{"name":"miksu","email":"vojtech@miksu.cz"},{"name":"toekneestuck","email":"toekneestuck@gmail.com"},{"name":"terinjokes","email":"terinjokes@gmail.com"}],"homepage":"https://github.com/cloudflare/ui-migration-stats","bugs":{"url":"https://github.com/cloudflare/ui-migration-stats/issues"},"bin":{"stats":"./lib/stats.js"},"dist":{"shasum":"5e6d0bb46f3589f53f122f524a7abcc13967183e","tarball":"https://registry.npmjs.org/ui-migration-stats/-/ui-migration-stats-2.0.0.tgz","integrity":"sha512-V/3k/r0zqWH1fkb751rANGa/rarFGaeI6XrzQq+zUQm94AUIYyno8Jh8Xps9sbvnsW9I2F96hpvwMyVDQncJGw==","signatures":[{"sig":"MEQCIDhKoqwyKM0A1r51AECc+WHrxIvjv28/auAjlytV+P1sAiBFvw+RSASMoxTsIk6aOjS/TcQW+67+aDxLsZbVzrQIgQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"jest":{"cacheDirectory":".jest","collectCoverageFrom":["**/*.{js}","!**/node_modules/**","!**/example/**"]},"main":"./lib/stats.js","_from":".","babel":{"ignore":["/example/"],"presets":["es2015"],"comments":false,"minified":true},"_shasum":"5e6d0bb46f3589f53f122f524a7abcc13967183e","gitHead":"4261e77d74986cec9d7c6bd182998f8a8cce58a0","scripts":{"dev":"watch 'yarn build;yarn demo' ./src ./example","demo":"yarn build && node ./lib/stats --config='./example/stats-example.conf.js'","lint":"eslint ./src/stats.js ./src/stats-constants.json ./src/utils/helpers.js","test":"jest","build":"rm -rf ./lib && node_modules/babel-cli/bin/babel.js src --out-dir lib --copy-files","clean":"rm -rf .jest node_modules","cover":"jest --coverage","format":"eslint --fix ./src/stats.js ./src/stats-constants.json ./src/utils/helpers.js","prepush":"yarn build && yarn test && yarn format","dev-test":"watch 'yarn build;yarn test' ./src ./test"},"_npmUser":{"name":"manatarms","email":"fernandes.sachin@gmail.com"},"repository":{"url":"git+https://github.com/cloudflare/ui-migration-stats.git","type":"git"},"_npmVersion":"2.15.1","description":"Migration stats for frameworks","directories":{},"_nodeVersion":"4.4.4","dependencies":{"sloc":"^0.2.0","chalk":"^1.1.3","commander":"^2.9.0","prettyjson":"^1.2.1","directory-tree":"^2.0.0"},"devDependencies":{"jest":"^20.0.1","husky":"^0.13.3","watch":"^1.0.2","eslint":"^3.19.0","shelljs":"^0.7.7","prettier":"^1.1.0","babel-cli":"^6.24.1","eslint-plugin-json":"^1.2.0","babel-preset-es2015":"^6.24.1","eslint-plugin-react":"^7.0.1","eslint-plugin-cflint":"^1.0.0","eslint-plugin-compat":"^1.0.2","eslint-plugin-import":"^2.2.0","eslint-plugin-prettier":"^2.0.1"},"_npmOperationalInternal":{"tmp":"tmp/ui-migration-stats-2.0.0.tgz_1495131395951_0.5704968380741775","host":"packages-18-east.internal.npmjs.com"}}},"time":{"created":"2017-04-25T20:54:36.425Z","modified":"2026-09-03T14:25:10.954Z","1.0.0":"2017-04-25T20:54:36.425Z","1.0.2":"2017-04-25T22:48:07.540Z","2.0.0":"2017-05-18T18:16:39.914Z"},"bugs":{"url":"https://github.com/cloudflare/ui-migration-stats/issues"},"author":{"name":"Sachin Fernandes","email":"sachin@cloudflare.com"},"license":"BSD-3-Clause","homepage":"https://github.com/cloudflare/ui-migration-stats","keywords":["migration","statistics","stats","webpack","loc","ui","framework"],"repository":{"url":"git+https://github.com/cloudflare/ui-migration-stats.git","type":"git"},"description":"Migration stats for frameworks","maintainers":[{"email":"npm-readonly@cloudflare.com","name":"cf-ci-write"},{"email":"service-account@cloudflare-ui.com","name":"dash_service_account"},{"email":"workers-devprod@cloudflare.com","name":"wrangler-publisher"},{"email":"ui-platform-production@cloudflare.com","name":"cf-npm-publish"},{"email":"vojtech@miksu.cz","name":"miksu"}],"readme":"[![Build Status](https://travis-ci.org/cloudflare/ui-migration-stats.svg?branch=master)](https://travis-ci.org/cloudflare/ui-migration-stats)\n\n# ui-migration-stats\n\nStats for migration and code base.\n\nMigrating between frameworks can be hard. Having some way to quantify the migration can help with the process.\nui-migration-stats provides the specific dependency feedback and numbers related to each your frameworks.\n\nTo contribute look at [Contributing and Development](#contributing-and-development) or https://github.com/cloudflare/ui-migration-stats/blob/master/CONTRIBUTING.md\n\n## Example\n\nSay you were trying to migrate from BackboneJS to ReactJS OR maybe you've already started migrating a few modules/components to ReactJS.\nYou now want to see how much of your codebase is migrated and how much is still in Backbone. Additionally, you don't know if \nmigrating your `super-important-module` will break something. This is where ui-migration-stats comes in, you can use the tool to \nquantify your migration and also look for dependencies in your codebase for your `super-important-module`. \nYou can also consume the stats object outputs and make some pretty charts or have a timeline for your migration.\n\n## Installation\n\n```\nyarn add ui-migration-stats\n```\nOr\n```\nnpm install ui-migration-stats\n```\n\n## Usage\n\nYou can pass command line args to ui-migration-stats\n```\nstats --help\n\nUsage: stats [options]\n\nOptions:\n\n  -h, --help            output usage information\n  -V, --version         output the version number\n  -s, --subdirectories  Display subdirectories\n  -S, --silent          Be silent\n  -c, --config <path>   Set config path, defaults to ./stats.conf.json\n```\n\n## Configuring ui-migration-stats\n\nThe script reads a config file that is named `stats.conf.json` by default.\nThe example uses a file called `stats-example.conf.json` which is passed in using a --config flag.\nYou can edit your package.json to use your config file as required.\n\n```\n\"scripts\": {\n  \"stats\": \"stats --config='./your-stats.conf.json'\",\n}\n```\n\nIt has the following structure\n\n```\nconst config = {\n  framework1: {\n    name: 'Backbone',\n    src: {\n      exclude: /test/,\n      filetypes: ['.js', '.handlebars', '.json'],\n      path: './example/javascripts/'\n    },\n    test: {\n      filetypes: ['.js', '.handlebars', '.json'],\n      path: './example/tests/',\n      includeOnly: /overview/\n    }\n  },\n  framework2: {\n    name: 'React',\n    src: {\n      filetypes: ['.js', '.json'],\n      path: './example/react/src/'\n    },\n    test: {\n      filetypes: ['.js', '.json'],\n      path: './example/react/test/'\n    }\n  },\n  options: {\n    modules: ['Cell', 'Header'],\n    outputFilename: './out/stats-out.json',\n    silent: false,\n    sort: true,\n    subdirectories: false,\n    unconditionalLoc: true,\n    webpackStatsFile: './example/webpack-stats-example.json',\n    webpackStatsOutputFilename: './out/webpack-stats-out.json'\n  }\n};\n\nmodule.exports = config;\n```\n\n### `framework1` (Required), `framework2` (Required)\n\n| Key   | Required | Type |Default|Description |\n|-------------|----------|----------|----------|-------------|\n| `name`    | yes       | string | none | Name of the framework |\n| `src`    | yes       | string| none | Object that holds  framework src keys |\n| `test`    | no      | string | none| Object that holds  framework src keys |\n\n### `src` (Required), `test` (Optional)\n\n| Key   | Required | Type |Default|Description |\n|-------------|----------|----------|----------|-------------|\n| `exclude`    | no      | regex | none| Regex that excludes matching files or folders |\n| `filetypes`    | no      | array | includes all files |An array of filetypes to include `[\".js\",\".handlebars\",\".json\"]`. Although this is not required, it is better to include file types so that `.DS_Store` and other hidden files are not included. |\n| `includeOnly`    | no      | regex | none| Includes only files and folders matching this regex. Useful for complex folder structures. |\n| `path`    | yes      | string | none| Path to the src or test directory. **NOTE** Paths are relative to cwd, unless absolute paths are provided |\n\n\n### `options` (Optional)\n\n| Key   | Required | Type |Default|Description |\n|-------------|----------|----------|----------|-------------|\n| `modules`    | no       | array | Analyzes all modules present in `webpackStatsFile` | It will analyze any module that contains the substrings present in this array. For example `['some']` will include all modules with some in their name i.e. `some-module` will be included. If not present in config, all modules will be included. |\n| `outputFilename`    | no       | string | none | Path and name of output file. If key is not present, it will **NOT** output a stats JSON file. If directory is not present it will create one for you. |\n| `silent`    | no       | boolean | false | Don't output to stdout |\n| `subdirectories`    | no      | boolean  |false| Flag to include subdirectories in output JSON file/stdout, **NOTE** For accuracy and completeness, this option will not prevent the traversal of the subdirectories. It will only exclude the subdirectories from the final output JSON/stdout. Defaults to `false`   |\n| `sort`    | no       | boolean | false | Sorts the output of `webpack-stats` by number of includes if true  |\n| `unconditionalLoc`    | no       | boolean | false | This option is useful when you have code written in an unrecognized language or if you have a lot of schema files. You will get a warning about skipped files if there is an unrecognized language. Use this option to add those files as pure source code i.e. ignoring comments and other language constructs. If you're confused, it's best to set this to true. |\n| `webpackStatsFile`    | no       | string | none | Path and name of webpack stats input  JSON file. If not present, it will skip webpack analysis |\n| `webpackStatsOutputFilename`    | no       | string | none | Path and name of webpack stats output  JSON file. If key is not present, it will **NOTE** output a webpack stats JSON file.If directory is not present it will create one for you. |\n\n**NOTE** All paths are relative to cwd, unless absolute paths are provided.\n\n## Generating webpack-stats.json \n\nYou will need to generate your project's webpack stats file. This can be done using the webpack cli or through your webpack config.\n\nYou can use the following command to generate your file\n\n```webpack --progress --json > webpack-stats.json```\n\n**NOTE: If for some reason your file is empty or if you're watching files in webpack, make sure your environment is set to production.** \nUse this to set your environment to production for the json output \n\n```NODE_ENV=production webpack --progress --json > webpack-stats.json```\n\nwebpack stats config: https://webpack.js.org/configuration/stats/\n\nEmpty file: http://stackoverflow.com/questions/41520410/webpack-stats-json-file-is-empty\n\n\n## Output JSON\nThis is what standard output json file looks like\n\n### Migration Stats\n```\n{\n  \"timestamp\": \"2017-04-10T17:02:25.590Z\",\n  \"framework1\": {\n    \"name\": \"Backbone\",\n    \"srcPath\": \"./example/javascripts/\",\n    \"testPath\": \"./example/tests/\",\n    \"filetypes\": [\n      \".js\",\n      \".handlebars\",\n      \".json\"\n    ],\n    \"files\": 6,\n    \"tests\": 3,\n    \"percentage\": 53,\n    \"srcSubdirectories\": [\n      {\n        \"Path\": \"./example/javascripts/\",\n        \"length\": 2\n      },\n      {\n        \"Path\": \"example/javascripts/modules/traffic\",\n        \"length\": 1\n      },\n      {\n        \"Path\": \"example/javascripts/modules/traffic/lib\",\n        \"length\": 1\n      }\n    ],\n    \"testsSubdirectories\": [\n      {\n        \"Path\": \"./example/tests/\",\n        \"length\": 1\n      },\n      {\n        \"Path\": \"example/tests/modules\",\n        \"length\": 1\n      }\n    ],\n    \"filesLoc\": {\n      \"total\": 465,\n      \"source\": 403,\n      \"comment\": 14,\n      \"single\": 14,\n      \"block\": 0,\n      \"mixed\": 1,\n      \"empty\": 40,\n      \"todo\": 0,\n      \"unrecognized\": 9\n    },\n    \"testsLoc\": {\n      \"total\": 240,\n      \"source\": 201,\n      \"comment\": 9,\n      \"single\": 9,\n      \"block\": 0,\n      \"mixed\": 0,\n      \"empty\": 30,\n      \"todo\": 0\n    },\n    \"percentageLoc\": 63\n  },\n  \"framework2\": {\n    \"name\": \"React\",\n    \"srcPath\": \"./example/react/src/\",\n    \"testPath\": \"./example/react/test/\",\n    \"filetypes\": [\n      \".js\",\n      \".json\"\n    ],\n    \"files\": 3,\n    \"tests\": 5,\n    \"percentage\": 47,\n    \"srcSubdirectories\": [\n      {\n        \"path\": \"./example/react/src/\",\n        \"length\": 2\n      },\n      {\n        \"path\": \"example/react/src/containers\",\n        \"length\": 1\n      },\n      {\n        \"path\": \"example/react/src/components\",\n        \"length\": 1\n      }\n    ],\n    \"testsSubdirectories\": [\n      {\n        \"path\": \"./example/react/test/\",\n        \"length\": 1\n      },\n      {\n        \"path\": \"example/react/test/selectors\",\n        \"length\": 1\n      }\n    ],\n    \"filesLoc\": {\n      \"total\": 72,\n      \"source\": 53,\n      \"comment\": 7,\n      \"single\": 4,\n      \"block\": 3,\n      \"mixed\": 0,\n      \"empty\": 12,\n      \"todo\": 1\n    },\n    \"testsLoc\": {\n      \"total\": 341,\n      \"source\": 306,\n      \"comment\": 0,\n      \"single\": 0,\n      \"block\": 0,\n      \"mixed\": 0,\n      \"empty\": 35,\n      \"todo\": 0\n    },\n    \"percentageLoc\": 37\n  }\n}\n``` \n### Output keys\n| Key   | Description |\n|-------------|----------|\n| `timestamp`    | Timestamp when the script was run |\n| `name`    | Name of the framework |\n| `path`     |Path to src directory of framework |\n| `testPath`    | Path to test directory of framework |\n| `filetypes`    |An array of filetypes to include `[\".js\",\".handlebars\",\".json\"]`|\n| `files`    | Number of files found in framework source directory |\n| `tests`    | Number of files found in framework source directory |\n| `percentage`    | Percentage of total codebase by number of files  |\n| `srcSubdirectories`    | Array of source subdirectories and the number of subdirectories they include i.e. `length` |\n| `testsSubdirectories`    | Array of test subdirectories and the number of subdirectories they include i.e. `length` |\n| `filesLoc`    | The number of lines of code in the source directory. See [Lines of code break down](#lines-of-code-breakdown) for details |\n| `percentageLoc`    | Percentage of total codebase by lines of code  |\n\n#### Lines of code breakdown\n* total - total lines of code\n* source - source lines of code\n* comment - comment lines of code\n* single - single line comments\n* block - block comments\n* mixed - mixed comments\n* empty - empty lines\n* todo - todos found in code\n* unrecognized - unconditionally added lines i.e. unrecognized lines\n\n### Module Stats\n\n```\n{\n  \"timestamp\": \"2017-04-07T16:42:28.531Z\",\n  \"webpackStats\": [\n    {\n      \"module\": \"some-component\",\n      \"entry\": \"../~/some-component/lib/index.js\",\n      \"exports\": [\n        \"some-sub-component\",\n        \"some-other-sub-component\"\n      ],\n      \"count\": 3,\n      \"issuers\": [\n      \"../react/src/issuer1.js\",\n      \"../react/src/issuer2.js\",\n      \"../react/src/issuer3.js\"\n      ]\n    }\n  ]\n}\n```\n### Output keys\n| Key   | Description |\n|-------------|----------|\n| `timestamp`    | Timestamp when the script was run |\n| `module`    | Name of the module |\n| `entry`     |Entry point of module|\n| `exports`    | An array of module exports |\n| `count`    |Number of times the module was included|\n| `issuers`    |  An array of paths where the module was included |\n\n\n## Contributing and Development\n\nTo get started run:\n\n```sh\ngit clone git@github.com:cloudflare/ui-migration-stats.git\n```\n\nor for https\n```sh\ngit clone https://github.com/cloudflare/ui-migration-stats.git\ncd ui-migration-stats\nyarn install\nyarn build\nyarn demo\n```\nThe demo task runs the tool on the example app found in `example`. \nExample code is from various random open source libraries.\n\n\n## Development tasks\n\n```sh\nyarn build # Build the lib folder\nyarn dev # Watch for changes in src and rebuild\nyarn dev-test # Watch for changes in src,test and rebuild\nyarn run clean # Delete node_modules and coverage folders\nyarn lint # Run the eslint\nyarn test # Run the tests\n```\n\n### Tests :)\n```\nyarn test\n```\n\n### Linting\n```\nyarn lint\n```\nYou can also format your code using\n```\nyarn format\n``` \n","readmeFilename":"README.md"}