{"id":15129999,"url":"https://github.com/harrysolovay/rescripts","last_synced_at":"2025-09-28T19:31:05.218Z","repository":{"id":46104344,"uuid":"157147572","full_name":"harrysolovay/rescripts","owner":"harrysolovay","description":"💥 Use the latest react-scripts with custom configurations for Babel, ESLint, TSLint, Webpack,... ∞","archived":true,"fork":false,"pushed_at":"2021-03-12T22:08:46.000Z","size":27722,"stargazers_count":1064,"open_issues_count":8,"forks_count":56,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-09-21T11:43:38.021Z","etag":null,"topics":["configuration","cra","customization","react","react-scripts"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/harrysolovay.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-11-12T02:50:02.000Z","updated_at":"2025-09-09T18:54:10.000Z","dependencies_parsed_at":"2022-08-12T12:40:48.670Z","dependency_job_id":null,"html_url":"https://github.com/harrysolovay/rescripts","commit_stats":null,"previous_names":["rescripts/rescripts"],"tags_count":172,"template":false,"template_full_name":null,"purl":"pkg:github/harrysolovay/rescripts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harrysolovay%2Frescripts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harrysolovay%2Frescripts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harrysolovay%2Frescripts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harrysolovay%2Frescripts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/harrysolovay","download_url":"https://codeload.github.com/harrysolovay/rescripts/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/harrysolovay%2Frescripts/sbom","scorecard":{"id":456288,"data":{"date":"2025-08-11","repo":{"name":"github.com/harrysolovay/rescripts","commit":"dd913e5e90a41b6afd711a4df8e06d0b1ab8a3cf"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.1,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":3,"reason":"Found 7/18 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 19 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"161 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-6chw-6frg-f759","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-whgm-jr23-g3j9","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-fwr7-v2mv-hh25","Warn: Project is vulnerable to: GHSA-qwcr-r2fm-qrc7","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-cwfw-4gq5-mrqx","Warn: Project is vulnerable to: GHSA-g95f-p29q-9xw4","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-x9w5-v3q2-3rhw","Warn: Project is vulnerable to: GHSA-w8qv-6jwh-64r5","Warn: Project is vulnerable to: GHSA-257v-vj4p-3w2h","Warn: Project is vulnerable to: GHSA-pxg6-pf52-xh8x","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-p28h-cc7q-c4fg","Warn: Project is vulnerable to: GHSA-gxpj-cx7g-858c","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-3wcq-x3mq-6r9p","Warn: Project is vulnerable to: GHSA-ff7x-qrg7-qggm","Warn: Project is vulnerable to: GHSA-vh7m-p724-62c2","Warn: Project is vulnerable to: GHSA-r9p9-mrjm-926w","Warn: Project is vulnerable to: GHSA-434g-2637-qmqr","Warn: Project is vulnerable to: GHSA-49q7-c7j4-3p7m","Warn: Project is vulnerable to: GHSA-977x-g7h5-7qgw","Warn: Project is vulnerable to: GHSA-f7q4-pwc6-w24p","Warn: Project is vulnerable to: GHSA-fc9h-whq2-v747","Warn: Project is vulnerable to: GHSA-vjh7-7g9h-fjfh","Warn: Project is vulnerable to: GHSA-6h5x-7c5m-7cr7","Warn: Project is vulnerable to: GHSA-rv95-896h-c2vc","Warn: Project is vulnerable to: GHSA-qw6h-vgh9-j6wx","Warn: Project is vulnerable to: GHSA-74fj-2j2h-c42q","Warn: Project is vulnerable to: GHSA-pw2r-vq6v-hr8c","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-8r6j-v8pm-fqw3","Warn: Project is vulnerable to: MAL-2023-462","Warn: Project is vulnerable to: GHSA-w457-6q6x-cgp9","Warn: Project is vulnerable to: GHSA-62gr-4qp9-h98f","Warn: Project is vulnerable to: GHSA-f52g-6jhx-586p","Warn: Project is vulnerable to: GHSA-2cf5-4w76-r9qv","Warn: Project is vulnerable to: GHSA-3cqr-58rm-57f8","Warn: Project is vulnerable to: GHSA-g9r4-xpmj-mj65","Warn: Project is vulnerable to: GHSA-q2c6-c6pm-g3gh","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-c429-5p7v-vgjp","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-pfq8-rq6v-vf5m","Warn: Project is vulnerable to: GHSA-6x33-pw7p-hmpq","Warn: Project is vulnerable to: GHSA-c7qv-q95q-8v27","Warn: Project is vulnerable to: GHSA-qqgx-2p2h-9c37","Warn: Project is vulnerable to: GHSA-78xj-cgh5-2h22","Warn: Project is vulnerable to: GHSA-2p57-rm9w-gvfp","Warn: Project is vulnerable to: GHSA-7r28-3m3f-r2pr","Warn: Project is vulnerable to: GHSA-r8j5-h5cx-65gg","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-76p3-8jx3-jpfq","Warn: Project is vulnerable to: GHSA-3rfm-jhwj-7488","Warn: Project is vulnerable to: GHSA-hhq3-ff78-jv3g","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-7wpw-2hjm-89gp","Warn: Project is vulnerable to: GHSA-r6rj-9ch6-g264","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-92xj-mqp7-vmcj","Warn: Project is vulnerable to: GHSA-wxgw-qj99-44c2","Warn: Project is vulnerable to: GHSA-5rrq-pxf6-6jx5","Warn: Project is vulnerable to: GHSA-8fr3-hfg3-gpgp","Warn: Project is vulnerable to: GHSA-gf8q-jrpm-jvxq","Warn: Project is vulnerable to: GHSA-2r2c-g63r-vccr","Warn: Project is vulnerable to: GHSA-cfm4-qjh2-4765","Warn: Project is vulnerable to: GHSA-x4jg-mjrx-434g","Warn: Project is vulnerable to: GHSA-5fw9-fq32-wv5p","Warn: Project is vulnerable to: GHSA-rp65-9cf3-cjxr","Warn: Project is vulnerable to: GHSA-76c9-3jph-rj3q","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-9wv6-86v2-598j","Warn: Project is vulnerable to: GHSA-rhx6-c78j-4q9w","Warn: Project is vulnerable to: GHSA-h7cp-r72f-jxh6","Warn: Project is vulnerable to: GHSA-v62p-rq8g-8h59","Warn: Project is vulnerable to: GHSA-566m-qj78-rww5","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-hwj9-h5mp-3pm3","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-5q6m-3h65-w53x","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-m6fv-jmcg-4jfg","Warn: Project is vulnerable to: GHSA-h9rv-jmmf-4pgx","Warn: Project is vulnerable to: GHSA-hxcc-f52p-wc94","Warn: Project is vulnerable to: GHSA-cm22-4g7w-348p","Warn: Project is vulnerable to: GHSA-4g88-fppr-53pp","Warn: Project is vulnerable to: GHSA-4jqc-8m5r-9rpr","Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7","Warn: Project is vulnerable to: GHSA-c9g6-9335-x697","Warn: Project is vulnerable to: GHSA-vx3p-948g-6vhq","Warn: Project is vulnerable to: GHSA-3jfq-g458-7qm9","Warn: Project is vulnerable to: GHSA-r628-mhmh-qjhw","Warn: Project is vulnerable to: GHSA-9r2w-394v-53qc","Warn: Project is vulnerable to: GHSA-5955-9wpr-37jh","Warn: Project is vulnerable to: GHSA-qq89-hq3f-393p","Warn: Project is vulnerable to: GHSA-f5x3-32g6-xq36","Warn: Project is vulnerable to: GHSA-4wf5-vphf-c2xc","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-jgrx-mgxx-jf9v","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-46c4-8wrp-j99v","Warn: Project is vulnerable to: GHSA-9m6j-fcg5-2442","Warn: Project is vulnerable to: GHSA-hh27-ffr2-f2jc","Warn: Project is vulnerable to: GHSA-rqff-837h-mm52","Warn: Project is vulnerable to: GHSA-8v38-pw62-9cw2","Warn: Project is vulnerable to: GHSA-hgjh-723h-mx2j","Warn: Project is vulnerable to: GHSA-jf5r-8hm2-f872","Warn: Project is vulnerable to: GHSA-wr3j-pwj9-hqq6","Warn: Project is vulnerable to: GHSA-cf66-xwfp-gvc4","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-g78m-2chm-r7qv","Warn: Project is vulnerable to: GHSA-6fc8-4gx4-v693","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp","Warn: Project is vulnerable to: GHSA-w5p7-h5w8-2hfq","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-h5c3-5r3r-rr8q","Warn: Project is vulnerable to: GHSA-rmvr-2pp2-xj38","Warn: Project is vulnerable to: GHSA-xx4v-prfh-6cgc","Warn: Project is vulnerable to: GHSA-ww39-953v-wcq6","Warn: Project is vulnerable to: GHSA-rc47-6667-2j5j","Warn: Project is vulnerable to: GHSA-w7q9-p3jq-fmhm","Warn: Project is vulnerable to: GHSA-xvf7-4v9q-58w6","Warn: Project is vulnerable to: GHSA-r683-j2x4-v87g","Warn: Project is vulnerable to: GHSA-3j8f-xvm3-ffx4","Warn: Project is vulnerable to: GHSA-4p35-cfcx-8653","Warn: Project is vulnerable to: GHSA-7f3x-x4pr-wqhj","Warn: Project is vulnerable to: GHSA-jpp7-7chh-cf67","Warn: Project is vulnerable to: GHSA-q6wq-5p59-983w","Warn: Project is vulnerable to: GHSA-j9fq-vwqv-2fm2","Warn: Project is vulnerable to: GHSA-pqw5-jmp5-px4v","Warn: Project is vulnerable to: GHSA-x565-32qp-m3vf","Warn: Project is vulnerable to: GHSA-6fw4-hr69-g3rv","Warn: Project is vulnerable to: GHSA-3f95-r44v-8mrg","Warn: Project is vulnerable to: GHSA-28xr-mwxg-3qc8","Warn: Project is vulnerable to: GHSA-9p95-fxvg-qgq2","Warn: Project is vulnerable to: GHSA-9w5j-4mwv-2wj8","Warn: Project is vulnerable to: GHSA-38fc-wpqx-33j7","Warn: Project is vulnerable to: GHSA-cf4h-3jhx-xvhq","Warn: Project is vulnerable to: GHSA-v4rh-8p82-6h5w","Warn: Project is vulnerable to: GHSA-776f-qx25-q3cc"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T09:45:59.740Z","repository_id":46104344,"created_at":"2025-08-19T09:45:59.740Z","updated_at":"2025-08-19T09:45:59.740Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276729642,"owners_count":25694275,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-24T02:00:09.776Z","response_time":97,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["configuration","cra","customization","react","react-scripts"],"created_at":"2024-09-26T02:26:21.283Z","updated_at":"2025-09-28T19:31:04.639Z","avatar_url":"https://github.com/harrysolovay.png","language":"JavaScript","readme":"\u003ch1 align='center'\u003e\n  \u003cimg src='readme-assets/banner.png' alt='banner' /\u003e\n\u003c/h1\u003e\n\n\u003c!-- LICENSE --\u003e\n\n\u003cp align='center'\u003e\n\n\u003c!-- LICENSE --\u003e\n\u003ca href='https://github.com/rescripts/rescripts/blob/master/LICENSE'\u003e\n  \u003cimg src='https://img.shields.io/packagist/l/doctrine/orm.svg' /\u003e\n\u003c/a\u003e\n\n\u003c!-- PRs --\u003e\n\u003ca href='http://makeapullrequest.com'\u003e\n  \u003cimg src='https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square' /\u003e\n\u003c/a\u003e\n\n\u003c!-- Lerna --\u003e\n\u003ca href='https://lernajs.io/'\u003e\n  \u003cimg src='https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg' /\u003e\n\u003c/a\u003e\n\n\u003c!-- NPM --\u003e\n\u003ca href='https://www.npmjs.com/settings/rescripts/packages'\u003e\n  \u003cimg src='https://img.shields.io/npm/v/@rescripts/cli.svg?style=flat-square' /\u003e\n\u003c/a\u003e\n\n\u003c/p\u003e\n\n\u003chr /\u003e\n\n\u003e Take control of your [create-react-app](https://github.com/facebook/create-react-app) project configurations. No ejecting, no custom react-scripts fork, no limitations.\n\n## Highlights\n\n- 🎯 create the perfect config with minimal effort\n\n- 🎩 take advantage of cutting-edge software that hasn't made its way into CRA\n\n- 🥳 draw from a library of open-source \"rescripts\"\n\n- 👽 compatibility with \"rewires\" designed for react-app-rewired\n\n## Guide\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n- [Background](#background)\n- [Installation](#installation)\n- [Basic Usage](#basic-usage)\n- [Advanced Usage](#advanced-usage)\n- [Rescript Structure](#rescript-structure)\n- [Rescript SDK](#rescript-sdk)\n- [Middleware](#middleware)\n- [Rescript Library](#rescript-library)\n- [Miscellaneous](#miscellaneous)\n- [Acknowledgements](#acknowledgements)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n## Background\n\n[CRA (create-react-app)](https://github.com/facebook/create-react-app) provides a first-class React developer experience. For building single-page web apps, it's not only the fastest bootstrap––it's also the most carefully-curated, well-supported, and feature-fledged. There is a downside, however: in an effort to create stability and simplicity for beginners, its creators excluded many configuration options and newer technologies (such as Babel transformations based on early-stage [TC39](https://github.com/tc39) proposals). CRA comes with an \"eject\" script which––once irreversibly run––allows customization of the \"start\", \"build\", and \"test\" scripts, along with their corresponding configurations. While this does allow you some DX freedom, it isn't always preferable; ejection makes it impossible to upgrade to new versions of `react-scripts`, and it exposes a lot of tedious, knarly-lookin' code. Rescripts is for developers who don't want to eject or worry about configuration, but still want to use cutting-edge tools.\n\nTim Arney's [react-app-rewired](https://github.com/timarney/react-app-rewired) was the first project to successfully tackle this problem. It offered a solution that led to many \"rewires\" (community-made plugins for simpler setup). But––when CRA 2.0 came around––there were some breaking changes. Not to mention, the react-app-rewired DX was something to be further simplified.\n\nRescripts tackles this same probem for CRA 2.0+ with several key DX differences. First off, it was designed to be more of a focal point for all non-standard configuration. The underlaying loader can handle deeply nested \"rescripts\" (conceptually similar to babel plugins), all of which can modify any CRA process. The tools used to transform configuration are more robust and flexible than its predecessor's ([@rescripts/utilities](#rescript-sdk)), and should weather most updates. The API also exposes a middleware entry, so that you can track your configurations as they are transformed. It should also be noted that Rescripts is compatible with many Webpack rewires built for react-app-rewired.\n\nIf you like this framework, please tweet at [@gaearon](https://twitter.com/dan_abramov) requesting an \"everything-i-did-not-include\" rescript!\n\n## Installation\n\n#### Install `@rescripts/cli` as a dev dependency:\n\n```sh\nnpm i -D @rescripts/cli\n```\n\n\u003e react-scripts@^2.1.2 requires you be using at least @rescripts/utilities^0.0.4 and @rescripts/cli^0.0.7\n\n#### Install the rescript(s) you wish to use:\n\n```sh\nnpm i -D @rescripts/rescript-env\n```\n\n\u003e @rescripts/rescript-env scans your `package.json` \u0026 project root for Babel, ESLint and TSLint configuration files. If present, these configurations will override the CRA defaults.\n\n## Basic Usage\n\n#### 1) Replace `react-scripts` calls with `rescripts` calls\n\n`package.json`\n\n```diff\n{\n  \"name\": \"built-with-rescripts\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"react\": \"^16.6.1\",\n    \"react-dom\": \"^16.6.1\",\n    \"react-scripts\": \"2.1.1\"\n  }\n  \"devDependencies\": {\n    \"@rescripts/cli\": \"^0.0.11\",\n    \"@rescripts/rescript-env\": \"^0.0.10\"\n  }\n  \"scripts\": {\n-   \"start\": \"react-scripts start\",\n+   \"start\": \"rescripts start\",\n-   \"build\": \"react-scripts build\",\n+   \"build\": \"rescripts build\",\n-   \"test\": \"react-scripts test\",\n+   \"test\": \"rescripts test\",\n-   \"eject\": \"react-scripts eject\"\n  },\n  \"eslintConfig\": {\n    \"extends\": \"react-app\"\n  },\n  \"browserslist\": [\n    \"\u003e0.2%\",\n    \"not dead\",\n    \"not ie \u003c= 11\",\n    \"not op_mini all\"\n  ]\n}\n```\n\n#### 2) Define a 'rescripts' field and specify which to use\n\n`package.json`\n\n```diff\n{\n  \"name\": \"built-with-rescripts\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"dependencies\": {\n    \"react\": \"^16.6.1\",\n    \"react-dom\": \"^16.6.1\",\n    \"react-scripts\": \"2.1.1\"\n  }\n  \"devDependencies\": {\n    \"@rescripts/cli\": \"^0.1.0\"\n  }\n  \"scripts\": {\n    \"start\": \"rescripts start\",\n    \"build\": \"rescripts build\",\n    \"test\": \"rescripts test\"\n  },\n  \"eslintConfig\": {\n    \"extends\": \"react-app\"\n  },\n  \"browserslist\": [\n    \"\u003e0.2%\",\n    \"not dead\",\n    \"not ie \u003c= 11\",\n    \"not op_mini all\"\n  ],\n+ \"rescripts\": [\n+   \"env\"\n+ ]\n}\n```\n\nYou could also––instead of placing this in your `package.json`––specify your \"root rescript\" in a root-level `.rescriptsrc` file (with whatever convention you prefer: `.js`, `.json`, or no extension.)\n\n#### 3) Use the newly-enabled feature(s)\n\nIn the case of [@rescripts/rescript-env](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/env), you will now be able to use custom Babel, ESLint and TSLint configurations. Use any of the following conventions:\n\n**Babel:** place config inside of a root-level `.babelrc`, `.babelrc.js`, `.babelrc.json`, or `babel.config.js` file, or inside of the `babel` field of your `package.json`\n\n**ESLint:** place config inside of a root-level`.eslintrc`, `.eslintrc.js`, `.eslintrc.json`, or `eslint.config.js` file, or inside of the `eslintConfig` field of your `package.json`\n\n**TSLint:** place config inside of a root-level`tslint.js` or `tslint.json` file\n\n#### 4) Good practice with the `env` rescript\n\n`@rescripts/rescript-env` actually installs 3 rescripts:\n\n- [`@rescripts/rescript-use-babel-config`](https://github.com/rescripts/rescripts/tree/master/packages/rescripts/use-babel-config)\n- [`@rescripts/rescript-use-eslint-config`](https://github.com/rescripts/rescripts/tree/master/packages/rescripts/use-eslint-config)\n- [`@rescripts/rescript-use-tslint-config`](https://github.com/rescripts/rescripts/tree/master/packages/rescripts/use-tslint-config)\n\nFor an incrementally faster boot time, use these independently and actually specify their configurations. Aka...\n\n`.rescriptsrc`\n\n```js\nmodule.exports = [\n  ['use-babel-config', '.babel.json'],\n  ['use-tslint-config', 'tslint.json'],\n]\n```\n\n## Advanced Usage\n\nYour root rescript should be an array of other rescripts. Some rescripts take in options and/or other parameters. Some do not. Some contain functions that transform your webpack config. Some contain transformations for any combination of processes (`webpack`, `devServer` and `jest`). Consider the following:\n\nIn this example, the root rescript makes reference to [@rescripts/rescript-env](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/env). This rescript takes in no arguments, which means that it has to scan your project at every run.\n\n```js\nmodule.exports = ['env']\n```\n\nAlternatively, you could use [@rescripts/rescript-use-babel-config](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/use-babel-config) and [@rescripts/rescript-use-eslint-config](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/use-eslint-config) (or [@rescripts/rescript-use-tslint-config](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/use-tslint-config) if you prefer TypeScript):\n\n```js\nmodule.exports = [\n  ['use-babel-config', '.babelrc'],\n  ['use-eslint-config', '.eslintrc'],\n]\n```\n\nThis example illustrates how arguments can be passed to a rescript by wrapping its reference inside of another array and adding the arguments as subsequent elements.\n\nThe eventual goal of Rescripts is to provide a single, simple interface for deep customizations:\n\n`.rescriptsrc.js`\n\n```js\nmodule.exports = [\n  [\n    'use-babel-config',\n    {\n      presets: ['react-app'],\n      plugins: [\n        'react-require',\n        [\n          'module-resolver',\n          {\n            root: '.',\n            alias: {\n              '~': './src',\n            },\n          },\n        ],\n      ],\n    },\n  ],\n  [\n    'use-eslint-config',\n    {\n      extends: ['react-app'],\n      plugins: ['ramda'],\n      rules: {\n        'ramda/compose-pipe-style': 'error',\n        'react/react-in-jsx-scope': 0,\n      },\n    },\n  ],\n]\n```\n\n## Rescript Structure\n\nRescripts transform the default configurations used by the three main processes of CRA (webpack, its developement server, and test-running via Jest). Rescripts can do much more though, such as writing logs, caching files, commiting changes and triggering other processes.\n\n#### A rescript can be...\n\n\u003cdetails\u003e\n\u003csummary\u003ean array of other rescripts\u003c/summary\u003e\n\n`child-rescript.js`\n\n```js\n// define child rescript\nmodule.exports = ['rescript-a', 'rescript-b', 'rescript-c']\n```\n\n`parent-rescript.js`\n\n```js\n// use child rescript\nmodule.exports = [require.resolve('path/to/child-rescript')]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ea function that takes in and returns a webpack config\u003c/summary\u003e\n\n`child-rescript.js`\n\n```js\n// define child rescript\nmodule.exports = config =\u003e {\n  const newConfig = doSomethingToTheConfig(config)\n  return newConfig\n},\n```\n\n`parent-rescript.js`\n\n```js\n// use child rescript\nmodule.exports = [require.resolve('path/to/child-rescript')]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ean object containing (any combination of) `webpack`, `devServer`, and `jest` functions, which take in and return their respective configs\u003c/summary\u003e\n\n`child-rescript.js`\n\n```js\n// define child rescript\nmodule.exports = {\n  webpack: config =\u003e {\n    const newConfig = transformWebpackConfig(config)\n    return newConfig\n  },\n  devServer: config =\u003e {\n    const newConfig = transformDevServerConfig(config)\n    return newConfig\n  },\n  jest: config =\u003e {\n    const newConfig = transformJestConfig(config)\n    return newConfig\n  },\n}\n```\n\n`parent-rescript.js`\n\n```js\n// use child rescript\nmodule.exports = [require.resolve('path/to/child-rescript')]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ea function that takes in arguments and outputs a new rescript\u003c/summary\u003e\n\n`child-rescript.js`\n\n```js\n// webpack only:\nmodule.exports = options =\u003e config =\u003e {\n  const newConfig = someTransformation(config, options)\n  return newConfig\n}\n\n// or with multiple processes:\nmodule.exports = (webpackArg, devServerArg, jestArg) =\u003e ({\n  webpack: config =\u003e {\n    const newConfig = transformWebpackConfig(config, webpackArg)\n    return newConfig\n  },\n  devServer: config =\u003e {\n    const newConfig = transformDevServerConfig(config, devServerArg)\n    return newConfig\n  },\n  jest: config =\u003e {\n    const newConfig = transformJestConfig(config, jestArg)\n    return newConfig\n  },\n})\n```\n\n`parent-rescript.js`\n\n```js\n// use child rescript\n\n// webpack only:\nmodule.exports = [\n  [require.resolve('path/to/child-rescript'), 'some important webpack arg'],\n]\n\n// multiple processes:\nmodule.exports = [\n  [\n    require.resolve('path/to/child-rescript'),\n    'webpackArg',\n    'devServerArg',\n    'jestArg',\n  ],\n]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003ea combination of formats\u003c/summary\u003e\n\n`child-rescript.js`\n\n```js\n// define child rescript\nmodule.exports = [\n  'some-rescripts',\n  [\n    'rescript-that-takes-args',\n    {\n      docsQuality: 'helpful?',\n    },\n  ],\n  config =\u003e {\n    const newConfig = doSomethingToTheConfig(config)\n    return newConfig\n  },\n  [\n    someArg =\u003e config =\u003e {\n      const newConfig = doSomethingToTheConfig(config, someArg)\n      return newConfig\n    },\n    'some argument',\n  ],\n]\n```\n\n`parent-rescript.js`\n\n```js\n// use child rescript\nmodule.exports = [require.resolve('path/to/child-rescript')]\n```\n\n\u003c/details\u003e\n\n## Rescript SDK\n\nThe `@rescripts/utilities` package makes it far easier to interact with configuration, while also reducing code size and the amount of conflict you'd otherwise see from composing numerous rescripts. You can use the tools in this package to identify and transform parts of any configuration without an exact path.\n\n```sh\nnpm i -D @rescripts/utilities\n```\n\n\u003e @rescripts/utilities comes with @rescripts/cli (so there's no need to install if you're already working on a rescripted project)\n\n### Reference\n\n\u003e **For FP-lovers: all of `@rescripts/utilities`' methods are curried, so feel free to call them in stages. Use Ramda's [`R.__`](https://ramdajs.com/docs/#__) placeholder to reorder how arguments are pieced together in the resulting functions.**\n\n#### `getPaths(predicate, scanTarget)`\n\nRecursively traverses your config (or any object for that matter) and returns an array of paths to any nodes that match the predicate. This is useful for editing parts of a config that may change location at runtime (ostensibly because of another rescript in the transformation pipeline).\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {getPaths} = require('@rescripts/utilities')\n\nconst isBabelLoader = inQuestion =\u003e\n  inQuestion \u0026\u0026 inQuestion.loader \u0026\u0026 inQuestion.loader.includes('babel-loader')\n\nmodule.exports = config =\u003e {\n  const babelLoaderPaths = getPaths(isBabelLoader, config)\n  console.log(babelLoaderPaths) // [['module', 'rules', 2, 'oneOf', 1]]\n  return config\n}\n```\n\n\u003c/details\u003e\n\n#### `edit(transform, paths, config)`\n\nTakes in a transformation function and the paths at which that function should be applied, along with the object on which to apply it.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {getPaths, edit} = require('@rescripts/utilities')\n\nmodule.exports = config =\u003e {\n  const paths = getPaths(somePredicate, config)\n  return edit(\n    matchedSection =\u003e {\n      // change something about the subsection\n      const updatedSection = someTransformation(matchedSection)\n      return updatedSection\n    },\n    paths,\n    config,\n  )\n}\n```\n\n\u003c/details\u003e\n\n#### `replace(replacement, paths, config)`\n\nWorks the same as `edit`, only it takes in a replacement for the specified path rather than a transformation function.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {getPaths, replace} = require('@rescripts/utilities')\n\nmodule.exports = config =\u003e {\n  const paths = getPaths(somePredicate, config)\n  return replace('some replacement', paths, config)\n}\n```\n\n\u003c/details\u003e\n\n#### `remove(paths, config)`\n\nTakes in the specified path and the object for the path-specified deletion.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {getPaths, remove} = require('@rescripts/utilities')\n\nmodule.exports = config =\u003e {\n  const paths = getPaths(somePredicate, config)\n  return remove(paths, config)\n}\n```\n\n\u003c/details\u003e\n\n#### `getWebpackPlugin(constructorName, config)`\n\nRetrieve a plugin instance from the webpack config with the plugin's constructor name.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {getWebpackPlugin} = require('@rescripts/utilities')\n\nmodule.exports = config =\u003e {\n  getWebpackPlugin('ForkTsCheckerWebpackPlugin', config) \u0026\u0026\n    console.log('TypeScript enabled')\n  return config\n}\n```\n\n\u003c/details\u003e\n\n#### `prependWebpackPlugin(pluginInstance, config)`\n\nAdd a plugin instance to the first slot of the Webpack configuration's `plugins` array.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {prependWebpackPlugin} = require('@rescripts/utilities')\nconst WebpackBuildNotifierPlugin = require('webpack-build-notifier')\n\nmodule.exports = config =\u003e {\n  return prependWebpackPlugin(\n    new WebpackBuildNotifierPlugin({\n      title: 'Rescripted App',\n      logo: require.resolve('./public/icon.png'),\n      suppressSuccess: true,\n    }),\n    config,\n  )\n}\n\n// or simplified...\n\nmodule.exports = prependWebpackPlugin(\n  new WebpackBuildNotifierPlugin({\n    title: 'Rescripted App',\n    logo: require.resolve('./public/icon.png'),\n    suppressSuccess: true,\n  }),\n)\n```\n\n\u003c/details\u003e\n\n#### `appendWebpackPlugin(pluginInstance, config)`\n\nAdd a plugin instance to the last slot of the Webpack configuration's `plugins` array.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {appendWebpackPlugin} = require('@rescripts/utilities')\nconst WebpackBuildNotifierPlugin = require('webpack-build-notifier')\n\nmodule.exports = config =\u003e {\n  return appendWebpackPlugin(\n    new WebpackBuildNotifierPlugin({\n      title: 'Rescripted App',\n      logo: require.resolve('./public/icon.png'),\n      suppressSuccess: true,\n    }),\n    config,\n  )\n}\n\n// or simplified...\n\nmodule.exports = appendWebpackPlugin(\n  new WebpackBuildNotifierPlugin({\n    title: 'Rescripted App',\n    logo: require.resolve('./public/icon.png'),\n    suppressSuccess: true,\n  }),\n)\n```\n\n\u003c/details\u003e\n\n#### `editWebpackPlugin(transform, constructorName, config)`\n\nApplies the `transform` function to the Webpack plugin whose constructor name is a match.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {editWebpackPlugin} = require('@rescripts/utilities')\n\nmodule.exports = config =\u003e {\n  const edited = editWebpackPlugin(\n    p =\u003e {\n      p.someOption = 'changed'\n      return p\n    },\n    'DefinePlugin',\n    config,\n  )\n  return edited\n}\n\n// or simplified...\n\nmodule.exports = editWebpackPlugin(\n  p =\u003e {\n    p.someOption = 'changed some option'\n    return p\n  },\n  'DefinePlugin',\n  config,\n)\n```\n\n\u003c/details\u003e\n\n#### `replaceWebpackPlugin(replacement, constructorName, config)`\n\nReplaces the matched plugin with another.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {replaceWebpackPlugin} = require('@rescripts/utilities')\nconst WebpackPWAManifestPlugin = require('webpack-pwa-manifest')\n\nmodule.exports = config =\u003e {\n  const replaced = replaceWebpackPlugin(\n    new WebpackPWAManifestPlugin({\n      name: 'Rescripted App',\n      short_name: 'Example',\n      description: 'An example app that uses Rescripts',\n      background_color: '#fff',\n      crossorigin: 'use-credentials',\n      icons: [\n        {\n          src: require.resolve('./public/icon.png'),\n          sizes: [96, 128, 192, 256, 384, 512],\n        },\n      ],\n    }),\n    'ManifestPlugin',\n    config,\n  )\n  return replaced\n}\n```\n\n\u003c/details\u003e\n\n#### `removeWebpackPlugin(constructorName, config)`\n\nRemove the matched plugin from your config.\n\n\u003cdetails\u003e\n\u003csummary\u003eusage example\u003c/summary\u003e\n\n```js\nconst {removeWebpackPlugin} = require('@rescripts/utilities')\n\nmodule.exports = config =\u003e {\n  const withoutIgnorePlugin = removeWebpackPlugin('IgnorePlugin', config)\n  return withoutIgnorePlugin\n}\n\n// or simplified ...\n\nconst {removeWebpackPlugin} = require('@rescripts/utilities')\n\nmodule.exports = removeWebpackPlugin('IgnorePlugin', config)\n```\n\n\u003c/details\u003e\n\n## Middleware\n\n#### The term \"middleware\" in Rescripts describes a kind of rescript that runs between all other rescripts.\n\nLet's say your stack of rescripts looks like this:\n\n```js\nconst logConfig = config =\u003e {\n  console.log(config)\n  return config\n}\n\nlogConfig.isMiddleware = true\n\nmodule.exports = [\n  ['use-babel-config', '.babelrc'],\n  ['use-tslint-config', 'tslint.json'],\n  logConfig,\n]\n```\n\nThe execution order will be as follows:\n\n1. `logConfig`\n2. `use-babel-config`\n3. `logConfig`\n4. `use-tslint-config`\n5. `logConfig`\n\nDon't be afraid to track data in the outer scope:\n\n```js\nconst equal = require('deep-equal')\nlet lastConfig = null\n\nconst logConfig = config =\u003e {\n  const unchanged = equal(config, lastConfig)\n  console.log(unchanged ? 'config unchanged' : 'config changed')\n  lastConfig = config\n  return config\n}\n\nlogConfig.isMiddleware = true\n\nmodule.exports = [\n  ['use-babel-config', '.babelrc'],\n  ['use-tslint-config', 'tslint.json'],\n  logConfig,\n]\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eIn simplified form\u003c/summary\u003e\n\n```js\nconst equal = require('deep-equal')\nlet lastConfig = null\n\nmodule.exports = [\n  ['use-babel-config', '.babelrc'],\n  ['use-tslint-config', 'tslint.json'],\n  Object.assign(\n    config =\u003e {\n      const unchanged = equal(config, lastConfig)\n      console.log(unchanged ? 'config unchanged' : 'config changed')\n      lastConfig = config\n      return config\n    },\n    {isMiddleware: true},\n  ),\n]\n```\n\n\u003c/details\u003e\n\nWe prefer to keep and mutate a `lastConfig` reference incase other middleware is applied before `logConfig`; middleware isn't spread around other middleware (this would be chaos), and yet middleware can transform what's passed to subsequent rescripts (including other middleware). This can get messy if you're not deliberate about your middleware's behavior.\n\n## Rescript Library\n\n- [env](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/env) – use Babel, ESLint, and/or TSLint\n- [use-babel-config](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/use-babel-config) – specify a Babel configuration\n- [use-eslint-config](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/use-eslint-config) – specify an ESLint configuration\n- [use-tslint-config](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/use-tslint-config) – specify a TSLint configuration\n- [use-babel-jest-config](https://github.com/jsxtools/rescript-use-babel-jest-config) - specify a Babel Jest configuration\n- [use-postcss-config](https://github.com/jsxtools/rescript-use-postcss-config) - specify a PostCSS configuration\n- [use-rewire](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/use-rewire) – use a rewire designed for react-app-rewired\n- [use-stylelint-config](https://github.com/rescripts/rescripts/blob/master/packages/rescripts/use-stylelint-config) – specify a StyleLint config (works for CSS, SCSS \u0026 CSS-in-JS)\n- [use-antd](https://github.com/RcKeller/rescripts/tree/master/use-antd) – use [Ant Design](https://ant.design/docs/react/introduce) components with support for tree shaking and custom themes\n- [worker-loader](https://github.com/linonetwo/rescript-worker-loader) - Enable [web worker loader](https://github.com/webpack-contrib/worker-loader) in Webpack\n- [disable-eslint](https://github.com/linonetwo/rescript-disable-eslint) - Disable preflight eslint check, for those who want only to check in their code editor and CI.\n- [service-worker-loader](https://github.com/linonetwo/rescript-service-worker-loader) - Enable [serviceworker-webpack-plugin](https://github.com/oliviertassinari/serviceworker-webpack-plugin) for your create-react-app project.\n- [use-yarn-workspaces](https://github.com/Negan1911/rescripts-use-yarn-workspaces) - Allows the use of CRA under Yarn workspaces.\n\n## Miscellaneous\n\nThank you for checking out (and maybe even building software with) Rescripts. If you have any bug reports or feature ideas, please go ahead and file an issue. If you have any other questions, comments, etc., please reach out to harrysolovay@gmail.com.\n\n## Acknowledgements\n\nBig shout out to...\n\n- [Nilan Marktanner](https://github.com/marktani), an inspirational dude\n- [Daniel Shaffer](https://github.com/danielshaffer), learning Vue instead of React 🤬\n- [Weiliy](https://github.com/weiliy), the original owner of the NPM name 'rescripts'\n\nThis library has been released under the [MIT license](../blob/master/LICENSE)\n\n**SO DO WHATEVER THE \\$%#@ YOU WANT WITH IT!!!**\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharrysolovay%2Frescripts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fharrysolovay%2Frescripts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fharrysolovay%2Frescripts/lists"}