diff --git a/.eslintrc.js b/.eslintrc.js index 206e359..ea4628a 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -6,7 +6,12 @@ module.exports = { }, plugins: ["prettier"], rules: { - "prettier/prettier": ["error"], + "prettier/prettier": [ + "error", + { + trailingComma: "es5", + }, + ], "global-require": 0, "prefer-destructuring": 0, "no-console": 0, diff --git a/.gitignore b/.gitignore index ce8c6cd..caca678 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,7 @@ dist/* !dist/README.md !dist/index.js !dist/package.json +branch_structure.json +temp_auto_push.bat +temp_interactive_push.bat +.gitignore diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..2e3b646 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "myml.vscode-markdown-plantuml-preview", + "esbenp.prettier-vscode", + "jebbs.plantuml" + ] +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..a5177ab --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,50 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug SST", + "type": "node", + "request": "launch", + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/sst", + "runtimeArgs": ["dev", "--increase-timeout"], + "console": "integratedTerminal", + "skipFiles": ["/**"], + // sourceMapRenames helps with the loading spinner when debugging and viewing local variables + "sourceMapRenames": false, + "env": { + "AWS_PROFILE": "flo-ct-flo360" + } + }, + { + "name": "Debug Tests - Unit", + "type": "node", + "request": "launch", + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/sst", + "runtimeArgs": ["bind", "yarn", "\"jest\"", "\"--watch\"", "\"--config\"", "\"./jest.unit.config.cjs\"", "\"${input:scopeTestsFileName}\""], + "console": "integratedTerminal", + "skipFiles": ["/**"], + "env": { + "AWS_PROFILE": "flo-ct-flo360" + }, + }, + { + "name": "Debug Tests - E2E", + "type": "node", + "request": "launch", + "runtimeExecutable": "${workspaceRoot}/node_modules/.bin/sst", + "runtimeArgs": ["bind", "yarn", "\"vitest\"", "\"--config\"", "\"./vitest.e2e.config.ts\"", "\"${input:scopeTestsFileName}\""], + "console": "integratedTerminal", + "skipFiles": ["/**"], + "env": { + "AWS_PROFILE": "flo-ct-flo360" + }, + }, + ], + "inputs": [ + { + "id": "scopeTestsFileName", + "type": "promptString", + "description": "Partial file name to scope test debugging to. ex. arena. Leave blank to run all tests.", + } + ] +} diff --git a/.vscode/spellright.dict b/.vscode/spellright.dict new file mode 100644 index 0000000..51b1974 --- /dev/null +++ b/.vscode/spellright.dict @@ -0,0 +1,2 @@ +Contentful +Lerna diff --git a/data/source/_template.js b/data/source/_template.js index edd1f18..7c9ee09 100644 --- a/data/source/_template.js +++ b/data/source/_template.js @@ -1,19 +1,10 @@ -const includesAny = require("../util/includesAny"); - module.exports = { + key: "", name: "", description: "", aka: [""], - tags: [ - { - name: "", - description: ".", - // If the tag can be matched automatically, include a match function. - // Otherwise set the tag in each matching project's 'tags' property. - match: project => includesAny(project.dependencies, [""]) - } - ], + tags: [], - projects: [{ url: "" }] + projects: [], }; diff --git a/data/source/all.js b/data/source/all.js index 896caf4..3f27d01 100644 --- a/data/source/all.js +++ b/data/source/all.js @@ -1,12 +1,23 @@ module.exports = [ + require("./awesome-lists"), + require("./bundlers"), + require("./devtools"), + require("./email-tools"), + require("./error"), + require("./state-managers"), require("./interesting"), + require("./javascript-tutorials"), + require("./linters"), require("./loggers"), + require("./networking-libraries"), require("./react-components"), require("./react-example-apps"), require("./react-starter-projects"), - require("./react-style-libraries"), require("./react-tutorials"), require("./static-site-generators"), + require("./style-libraries"), + require("./test-utilities"), require("./utility-libraries"), - require("./view-libraries") + require("./view-libraries"), + require("./learning-resources"), ]; diff --git a/data/source/awesome-lists.js b/data/source/awesome-lists.js new file mode 100644 index 0000000..5e4c741 --- /dev/null +++ b/data/source/awesome-lists.js @@ -0,0 +1,15 @@ +module.exports = { + key: "awesome-lists", + name: "Awesome Lists", + description: "Lists of awesome things - JavaScript focus only.", + aka: ["nice lists", "cool lists", "pretty good lists"], + tags: [], + projects: [ + { url: "https://github.com/sindresorhus/awesome-nodejs" }, + { url: "https://github.com/sorrycc/awesome-javascript" }, + { url: "https://github.com/wbkd/awesome-d3" }, + { url: "https://github.com/sindresorhus/promise-fun" }, + { url: "https://github.com/wbinnssmith/awesome-promises" }, + { url: "https://github.com/zingchart/awesome-charting" }, + ], +}; diff --git a/data/source/bundlers.js b/data/source/bundlers.js new file mode 100644 index 0000000..fd63248 --- /dev/null +++ b/data/source/bundlers.js @@ -0,0 +1,21 @@ +module.exports = { + key: "bundlers", + name: "Bundlers", + description: + "These are tools that transform JS and CSS. They are typically highly configurable and pluggable.", + aka: ["JavaScript bundlers", "packagers"], + + tags: [ + { + name: "zero config", + description: + "Bundler will build an app without any configuration file whatsoever, usually by relying on conventions.", + }, + ], + projects: [ + { url: "https://github.com/brunch/brunch" }, + { url: "https://github.com/webpack/webpack" }, + { url: "https://github.com/parcel-bundler/parcel", tags: ["zero config"] }, + { url: "https://github.com/rollup/rollup" }, + ], +}; diff --git a/data/source/css-frameworks.js b/data/source/css-frameworks.js new file mode 100644 index 0000000..33d1e8d --- /dev/null +++ b/data/source/css-frameworks.js @@ -0,0 +1,10 @@ +module.exports = { + key: "", + name: "", + description: "", + aka: [""], + + tags: [], + + projects: [{ url: "https://github.com/jgthms/bulma" }], +}; diff --git a/data/source/devtools.js b/data/source/devtools.js index a39f4b7..57c3400 100644 --- a/data/source/devtools.js +++ b/data/source/devtools.js @@ -3,13 +3,50 @@ module.exports = { name: "Developer Tools", description: "Tools used by developers while building JavaScript applications.", - aka: ["dev-tools"], - - tags: [], - + aka: ["dev tools"], + tags: [ + { + name: "IDE", + description: + "Integrated development environment: a text editor specifically for software development.", + }, + ], projects: [ - { url: "https://github.com/FormidableLabs/webpack-dashboard" }, + { url: "https://github.com/reactide/reactide", tags: ["IDE", "react"] }, + { url: "https://github.com/atom/atom", tags: ["IDE"] }, + { url: "https://github.com/depcheck/depcheck" }, + { + url: "https://github.com/robertknight/webpack-bundle-size-analyzer", + tags: ["webpack"], + }, + { + url: "https://github.com/FormidableLabs/webpack-dashboard", + tags: ["webpack"], + }, { url: "https://github.com/typicode/husky" }, - { url: "https://github.com/okonet/lint-staged" } - ] + { url: "https://github.com/okonet/lint-staged" }, + { url: "https://github.com/kitze/sizzy" }, + { + url: "https://github.com/reduxjs/redux-devtools", + tags: ["react", "browser extension"], + }, + { + url: "https://github.com/facebook/react-devtools", + tags: ["react", "browser extension"], + }, + { + url: "https://github.com/vuejs/vue-devtools", + tags: ["vue", "browser extension"], + }, + { url: "https://github.com/kdzwinel/betwixt" }, + { url: "https://github.com/foreverjs/forever" }, + { url: "https://github.com/geuis/helium-css" }, + { url: "https://github.com/lerna/lerna" }, + { + url: "https://github.com/node-inspector/node-inspector", + deprecated: true, + }, + { url: "https://github.com/zalmoxisus/remote-redux-devtools" }, + { url: "https://github.com/infinitered/reactotron", tags: ["react"] }, + ], }; diff --git a/data/source/email-tools.js b/data/source/email-tools.js new file mode 100644 index 0000000..1a11ffa --- /dev/null +++ b/data/source/email-tools.js @@ -0,0 +1,17 @@ +module.exports = { + key: "email-tools", + name: "Email Tools", + description: + "Tools that are useful for creating, designing, or sending email in JavaScript.", + aka: ["other", "unknown"], + + tags: [], + + projects: [ + { url: "https://github.com/niftylettuce/email-templates" }, + { url: "https://github.com/nodemailer/nodemailer" }, + { url: "https://github.com/freeCodeCamp/mail-for-good" }, + { url: "https://github.com/chromakode/react-html-email", tags: ["react"] }, + { url: "https://github.com/revivek/oy", tags: ["react"] }, + ], +}; diff --git a/data/source/emoji-tools.js b/data/source/emoji-tools.js new file mode 100644 index 0000000..b8b0868 --- /dev/null +++ b/data/source/emoji-tools.js @@ -0,0 +1,14 @@ +module.exports = { + key: "emoji-tools", + name: "Emoji Tools", + description: + "Tools used for translating, generating or otherwise dealing with emoji.", + aka: [""], + + tags: [], + + projects: [ + { url: "https://github.com/notwaldorf/emoji-translate" }, + { url: "https://github.com/iamcal/js-emoji" }, + ], +}; diff --git a/data/source/error.js b/data/source/error.js index 66f815c..b67d2cc 100644 --- a/data/source/error.js +++ b/data/source/error.js @@ -12,12 +12,12 @@ module.exports = { { url: "https://github.com/japgolly/scalajs-react" }, { url: "https://github.com/tomocchino/react-snake", tags: ["game"] }, { url: "https://github.com/felixgborrego/simple-docker-ui" }, - { url: "https://github.com/fruux/Baikal" }, + { url: "https://github.com/sabre-io/Baikal" }, // Has package.json but not using master branch { url: "https://github.com/Merri/react-tabbordion", tags: ["set"] }, { url: "https://github.com/mapbox/react-colorpickr", - tags: ["color", "picker"] + tags: ["color", "picker"], }, // Example apps @@ -27,7 +27,7 @@ module.exports = { // Haven't looked into these yet { url: "https://github.com/fdecampredon/react-rxjs-todomvc", - tags: ["todo"] + tags: ["todo"], }, { url: "https://github.com/javierbyte/clashjs", tags: ["game"] }, { url: "https://github.com/rmosolgo/graphql-ruby-demo" }, @@ -41,6 +41,6 @@ module.exports = { { url: "https://github.com/AdaptiveConsulting/ReactiveTraderCloud" }, { url: "https://github.com/ryanatkn/react-mobx-typescript-experiments" }, { url: "https://github.com/tsurupin/portfolio" }, - { url: "https://github.com/cjlarose/de-jong", tags: ["educational"] } - ] + { url: "https://github.com/cjlarose/de-jong", tags: ["educational"] }, + ], }; diff --git a/data/source/interesting.js b/data/source/interesting.js index ee8125d..e7ef447 100644 --- a/data/source/interesting.js +++ b/data/source/interesting.js @@ -8,14 +8,6 @@ module.exports = { tags: [], projects: [ - // Loads your components indiviually. Seems similar to storybook. - { url: "https://github.com/react-cosmos/react-cosmos" }, - - // Display your components with a variety of different props. - // Can be thought of as a testing tool, but also helps encourage isolation during development. - // Seems similar to react-cosmos. - { url: "https://github.com/storybooks/storybook" }, - // This is technically a React component but also similar to storybook and react-cosmos { url: "https://github.com/scup/atellier" }, @@ -107,6 +99,9 @@ module.exports = { // Helps you compare/contrast react, angular, and other frameworks. // A simple todo implementation in all the different frameworks. - { url: "https://github.com/tastejs/todomvc" } - ] + { url: "https://github.com/tastejs/todomvc" }, + + // maybe there should be a vue starter projects list + { url: "https://github.com/SimulatedGREG/electron-vue" }, + ], }; diff --git a/data/source/javascript-tutorials.js b/data/source/javascript-tutorials.js new file mode 100644 index 0000000..fbf023f --- /dev/null +++ b/data/source/javascript-tutorials.js @@ -0,0 +1,18 @@ +module.exports = { + key: "javascript-tutorials", + name: "JavaScript Tutorials", + description: "", + aka: [""], + + tags: [ + { + name: "", + description: ".", + }, + ], + + projects: [ + { url: "https://github.com/freeCodeCamp/freeCodeCamp" }, + { url: "https://github.com/GitbookIO/javascript" }, + ], +}; diff --git a/data/source/learning-resources.js b/data/source/learning-resources.js new file mode 100644 index 0000000..b1b262d --- /dev/null +++ b/data/source/learning-resources.js @@ -0,0 +1,15 @@ +module.exports = { + key: "learning-resources", + name: "Learning Resources", + description: + "These are GitHub projects that assist in learning JavaScript or related tools.", + aka: ["educational repositories"], + tags: [], + projects: [ + { url: "https://github.com/dexteryy/spellbook-of-modern-webdev" }, + { url: "https://github.com/FreeCodeCampChina/freecodecamp.cn" }, + { url: "https://github.com/happypoulp/redux-tutorial" }, + { url: "https://github.com/StephenGrider/ReduxCasts" }, + { url: "https://github.com/wesbos/Learn-Redux-Starter-Files" }, + ], +}; diff --git a/data/source/linters.js b/data/source/linters.js new file mode 100644 index 0000000..2681f03 --- /dev/null +++ b/data/source/linters.js @@ -0,0 +1,74 @@ +module.exports = { + key: "linters", + name: "Linters", + description: + "Linters find potential errors and/or formatting inconsistencies in your code. Some will automatically fix your code for you.", + aka: ["code formatters", "beautifiers", "prettifiers"], + + tags: [ + { + name: "html", + description: "Formats/beautifies HTML.", + }, + { + name: "css", + description: "Formats/beautifies CSS.", + }, + { + name: "js", + description: "Formats/beautifies JavaScript.", + }, + { + name: "opinionated", + description: + "These don't need configuration because they take a stance on every rule.", + }, + { + name: "english", + description: "These lint english - not a programming language.", + }, + { + name: "autofix", + description: "These linters will automatically fix your code for you.", + }, + { + name: "eslint", + description: "These linters are powered by ESLint", + }, + { + name: "typescript", + description: "Linter for TypeScript", + }, + ], + + projects: [ + { url: "https://github.com/palantir/tslint", tags: ["typescript"] }, + { + url: "https://github.com/beautify-web/js-beautify", + tags: ["js", "html", "autofix"], + }, + { + url: "https://github.com/prettier/prettier", + tags: ["js", "css", "autofix"], + }, + { url: "https://github.com/CSSLint/csslint", tags: ["css"] }, + { url: "https://github.com/csscomb/csscomb.js", tags: ["css"] }, + { + url: "https://github.com/standard/standard", + tags: ["js", "opinionated", "eslint", "autofix"], + }, + { url: "https://github.com/douglascrockford/JSLint", tags: ["js"] }, + { + url: "https://github.com/eslint/eslint", + tags: ["js", "eslint", "autofix"], + }, + { url: "https://github.com/jshint/jshint", tags: ["js"] }, + { url: "https://github.com/stylelint/stylelint", tags: ["css"] }, + { url: "https://github.com/btford/write-good", tags: ["english"] }, + { + url: "https://github.com/xojs/xo", + tags: ["js", "opinionated", "eslint", "autofix"], + }, + { url: "https://github.com/wooorm/alex", tags: ["english"] }, + ], +}; diff --git a/data/source/loggers.js b/data/source/loggers.js index fb0f964..a92df6c 100644 --- a/data/source/loggers.js +++ b/data/source/loggers.js @@ -4,12 +4,14 @@ module.exports = { description: 'Utilities that help you log useful information to the console (or elsewhere). These are alternatives to "console.log".', aka: ["logging libraries"], - tags: [], - projects: [ { url: "https://github.com/guigrpa/storyboard" }, { url: "https://github.com/mohebifar/konsul" }, - { url: "https://github.com/visionmedia/debug" } - ] + { url: "https://github.com/visionmedia/debug" }, + { url: "https://github.com/winstonjs/winston", tags: ["node-only"] }, + { url: "https://github.com/pinojs/pino", tags: ["node-only"] }, + { url: "https://github.com/baryon/tracer", tags: ["node-only"] }, + { url: "https://github.com/evgenyrodionov/redux-logger" }, + ], }; diff --git a/data/source/networking-libraries.js b/data/source/networking-libraries.js new file mode 100644 index 0000000..ee8eeed --- /dev/null +++ b/data/source/networking-libraries.js @@ -0,0 +1,21 @@ +module.exports = { + key: "networking-libraries", + name: "Networking Libraries", + description: "Tool that assist with making networking or AJAX calls", + aka: ["AJAX libraries"], + tags: [], + projects: [ + { url: "https://github.com/pagekit/vue-resource", tags: ["vue"] }, + { url: "https://github.com/axios/axios", tags: ["promises"] }, + { url: "https://github.com/request/request" }, + { url: "https://github.com/visionmedia/superagent", tags: ["node"] }, + { url: "https://github.com/developit/unfetch", tags: ["fetch"] }, + { url: "https://github.com/github/fetch", tags: ["fetch"] }, + { + url: "https://github.com/matthew-andrews/isomorphic-fetch", + tags: ["fetch", "node"], + }, + { url: "https://github.com/bitinn/node-fetch", tags: ["fetch", "node"] }, + { url: "https://github.com/facebook/relay", tags: ["react"] }, + ], +}; diff --git a/data/source/react-components.js b/data/source/react-components.js index f8677ea..52f31df 100644 --- a/data/source/react-components.js +++ b/data/source/react-components.js @@ -1,6 +1,7 @@ module.exports = { key: "react-components", name: "React Components", + fetchPackageJson: true, description: "The building blocks of React apps. These are components that you can use in your own apps.", aka: ["React Component Libraries", "React UI Frameworks"], @@ -9,60 +10,90 @@ module.exports = { { name: "dataviz", description: "Charts, graphs, or other infographics for displaying data.", - aka: ["datavis", "data visualization", "infographics", "charts", "graphs"] + aka: [ + "datavis", + "data visualization", + "infographics", + "charts", + "graphs", + ], }, { name: "calendar", description: "Allows the user to select a date or date range.", - aka: ["date picker"] + aka: ["date picker"], }, { name: "grid", - aka: ["layout"] + aka: ["layout"], }, { name: "set", description: - "A few components with a similar use-case. For instance color pickers or form components." + "A few components with a similar use-case. For instance color pickers or form components.", }, { name: "toolkit", description: "A large set of components in the same style that you can use to quickly bootstrap your project.", - aka: ["library", "framework"] + aka: ["library", "framework"], }, { name: "abandoned", description: "The project has been discontinued / abandoned by the creators", - aka: ["discontinued"] + aka: ["discontinued"], }, { name: "native", description: - "Components for react native - to be used in native iOS/Android apps (not the web)" + "Components for react native - to be used in native iOS/Android apps (not the web)", }, { name: "text editor", - description: "Component for writing / editing rich text in the browser" - } + description: "Component for writing / editing rich text in the browser", + }, ], /** - * TODO: see how these components are styled and add tags for that. Some people may not want to use - * components that require a change to their webpack config. + * TODO: see how these components are styled and add tags for that. Some + * people may not want to use components that require a change to their + * webpack config. */ projects: [ + { url: "https://github.com/jaredpalmer/formik", tags: ["form"] }, + { url: "https://github.com/yjose/reactjs-popup" }, + { + url: "https://github.com/MailOnline/libreact", + tags: ["toolkit"], + }, + { url: "https://github.com/reakit/reakit", tags: ["toolkit"] }, + { url: "https://github.com/josephmaxim/sc-react" }, + { + url: "https://github.com/ArthurClemens/polythene", + tags: ["material design", "toolkit"], + }, + { + url: "https://github.com/LINKIWI/react-elemental", + tags: ["toolkit"], + }, + { + url: "https://github.com/appbaseio/reactivesearch", + tags: ["toolkit"], + }, { url: "https://github.com/mlaursen/react-md", - tags: ["toolkit", "material design"] + tags: ["toolkit", "material design"], }, { url: "https://github.com/react-toolbox/react-toolbox", - tags: ["toolkit", "material design"] + tags: ["toolkit", "material design"], + }, + { + url: "https://github.com/frontend-collective/react-sortable-tree", + tags: ["list"], }, - { url: "https://github.com/fritz-c/react-sortable-tree", tags: ["list"] }, - { url: "https://github.com/andreasur/react-font-picker", tags: ["picker"] }, + { url: "https://github.com/nardeas/react-font-picker", tags: ["picker"] }, { url: "https://github.com/jxnblk/reflexbox", tags: ["grid"] }, { url: "https://github.com/chrvadala/react-svg-pan-zoom" }, { url: "https://github.com/jacted/lead-form" }, @@ -73,21 +104,21 @@ module.exports = { { url: "https://github.com/airbnb/react-dates", tags: ["calendar"] }, { url: "https://github.com/clauderic/react-infinite-calendar", - tags: ["calendar"] + tags: ["calendar"], }, { url: "https://github.com/troch/react-timer-hoc" }, { url: "https://github.com/erikras/redux-form", tags: ["set", "form"] }, { url: "https://github.com/clauderic/react-sortable-hoc", tags: ["list"] }, { url: "https://github.com/mironov/react-redux-loading-bar", - tags: ["spinner"] + tags: ["spinner"], }, { url: "https://github.com/sevenleaps/chat-template", tags: ["chat"] }, { url: "https://github.com/alex3165/react-mapbox-gl", tags: ["map"] }, { url: "https://github.com/mzabriskie/react-draggable" }, { url: "https://github.com/patientslikeme/react-calendar-heatmap", - tags: ["calendar"] + tags: ["calendar"], }, { url: "https://github.com/bvaughn/react-virtualized", tags: ["list"] }, { url: "https://github.com/maisano/react-router-transition", tags: [] }, @@ -98,20 +129,20 @@ module.exports = { { url: "https://github.com/facebook/draft-js", tags: ["text editor"] }, { url: "https://github.com/draft-js-plugins/draft-js-plugins", - tags: ["text editor"] + tags: ["text editor"], }, { url: "https://github.com/sstur/react-rte", tags: ["text editor"] }, { url: "https://github.com/malte-wessel/react-matchmedia-connect" }, { url: "https://github.com/seejamescode/draft-js-gutter", - tags: ["text editor"] + tags: ["text editor"], }, - { url: "https://github.com/bokuweb/react-balloon" }, + { url: "https://github.com/bokuweb-sandbox/react-balloon" }, { url: "https://github.com/KtorZ/elm-react-component" }, { url: "https://github.com/fatiherikli/react-designer", tags: ["set"] }, { url: "https://github.com/joshwcomeau/react-flip-move", - tags: ["animation"] + tags: ["animation"], }, { url: "https://github.com/cameronbourke/react-cardstack" }, { url: "https://github.com/conorhastings/react-emoji-react" }, @@ -123,7 +154,7 @@ module.exports = { { url: "https://github.com/abhijeetNmishra/react-password-strength-meter" }, { url: "https://github.com/mozilla-services/react-jsonschema-form", - tags: ["set"] + tags: ["set"], }, { url: "https://github.com/dogfessional/react-swipeable" }, { url: "https://github.com/bokuweb/react-rnd" }, @@ -131,64 +162,67 @@ module.exports = { { url: "https://github.com/clari/react-ios-switch", tags: ["button"] }, { url: "https://github.com/wangzuo/input-moment" }, { url: "https://github.com/neptunian/react-photo-gallery" }, - { url: "https://github.com/bokuweb/react-motion-menu", tags: ["menu"] }, + { + url: "https://github.com/bokuweb-sandbox/react-motion-menu", + tags: ["menu"], + }, { url: "https://github.com/romainberger/react-portal-tooltip" }, { url: "https://github.com/alexkuz/react-input-enhancements", - tags: ["set"] + tags: ["set"], }, { url: "https://github.com/alexkuz/cake-chart", tags: ["dataviz"] }, { url: "https://github.com/BelkaLab/react-yearly-calendar", - tags: ["calendar"] + tags: ["calendar"], }, { url: "https://github.com/FormidableLabs/victory", tags: ["dataviz"] }, - { url: "https://github.com/dustingetz/react-chatview", tags: ["chat"] }, + { url: "https://github.com/jsdevkr/react-chatview", tags: ["chat"] }, { url: "https://github.com/arsich/react-redux-cats" }, { url: "https://github.com/nosovsh/fifteen", tags: ["game"] }, { url: "https://github.com/intljusticemission/react-big-calendar" }, { url: "https://github.com/Swizec/space-invaders", tags: ["game"] }, { url: "https://github.com/mderrick/react-html5video" }, { url: "https://github.com/gorangajic/react-svg-morph", tags: ["set"] }, - { url: "https://github.com/alexcurtis/react-treebeard" }, + { url: "https://github.com/storybooks/react-treebeard" }, { url: "https://github.com/furqanZafar/react-selectize", tags: ["set"] }, { url: "https://github.com/conorhastings/react-thermometer" }, { url: "https://github.com/luqin/react-icheck" }, - { url: "https://github.com/orgsync/react-list", tags: ["list"] }, + { url: "https://github.com/coderiety/react-list", tags: ["list"] }, { url: "https://github.com/socialtables/react-user-tour" }, { url: "https://github.com/tomkp/react-split-pane" }, { url: "https://github.com/nkbt/react-collapse" }, { url: "https://github.com/jstejada/react-typist" }, { - url: "https://github.com/twitter-fabric/velocity-react", - tags: ["animation"] + url: "https://github.com/google-fabric/velocity-react", + tags: ["animation"], }, { url: "https://github.com/James-Oldfield/react-rpg" }, - { url: "https://github.com/gorangajic/react-icons", tags: ["set"] }, + { url: "https://github.com/react-icons/react-icons", tags: ["set"] }, { url: "https://github.com/tgecho/react-prosemirror", - tags: ["text editor"] + tags: ["text editor"], }, { url: "https://github.com/formly-js/react-formly", tags: ["form"] }, { url: "https://github.com/jossmac/react-images", tags: ["grid"] }, { url: "https://github.com/sanniassin/react-input-mask", tags: ["input"] }, { url: "https://github.com/saulhoward/react-evil-icons", tags: ["icon"] }, - { url: "https://github.com/IBM-Bluemix/election-insights" }, + { url: "https://github.com/IBM-Cloud/election-insights" }, { url: "https://github.com/alanrsoares/redux-game-of-life", - tags: ["game"] + tags: ["game"], }, { url: "https://github.com/andyyou/react-coverflow" }, { url: "https://github.com/peterKaleta/react-token-autocomplete", - tags: ["autocomplete"] + tags: ["autocomplete"], }, { url: "https://github.com/whoisandy/react-rangeslider", tags: ["slider"] }, { url: "https://github.com/andrepolischuk/react-rotation" }, { url: "https://github.com/daviferreira/react-sanfona" }, { url: "https://github.com/casesandberg/react-color", - tags: ["set", "color", "picker"] + tags: ["set", "color", "picker"], }, { url: "https://github.com/jquense/react-formal", tags: ["set", "form"] }, { url: "https://github.com/KyleAMathews/react-spinkit", tags: ["spinner"] }, @@ -201,21 +235,21 @@ module.exports = { { url: "https://github.com/nikgraf/belle", tags: ["toolkit"] }, { url: "https://github.com/adazzle/react-data-grid", - tags: ["grid", "set"] + tags: ["grid", "set"], }, { url: "https://github.com/rsamec/react-pathjs-chart", tags: ["dataviz"] }, { url: "https://github.com/nsisodiya/react-json-viewer", tags: ["icon"] }, { url: "https://github.com/bharani91/react-select-popover", - tags: ["autocomplete"] + tags: ["autocomplete"], }, { url: "https://github.com/mxstbr/sharingbuttons.io", - tags: ["set", "button"] + tags: ["set", "button"], }, { url: "https://github.com/AllenFang/react-bootstrap-table", - tags: ["list"] + tags: ["list"], }, { url: "https://github.com/dreyescat/react-rating" }, { url: "https://github.com/pqx/react-ui-tree" }, @@ -223,71 +257,74 @@ module.exports = { { url: "https://github.com/negomi/react-burger-menu", tags: ["menu"] }, { url: "https://github.com/wangzuo/react-input-color", - tags: ["color", "picker"] + tags: ["color", "picker"], }, { url: "https://github.com/malte-wessel/react-custom-scrollbars" }, { url: "https://github.com/wangzuo/react-medium-editor", - tags: ["text editor"] + tags: ["text editor"], }, { url: "https://github.com/k4wo/react-notify", tags: ["notification"] }, { url: "https://github.com/georgeOsdDev/react-draggable-tab" }, { url: "https://github.com/arqex/react-json-table", tags: ["list"] }, { url: "https://github.com/mathieudutour/react-progress-button", - tags: ["button"] + tags: ["button"], }, { url: "https://github.com/Lapple/react-transitive-number", - tags: ["animation"] + tags: ["animation"], }, { url: "https://github.com/Lapple/react-json-inspector", - tags: ["devtool"] + tags: ["devtool"], }, { url: "https://github.com/DropsOfSerenity/react-avatar-cropper" }, { url: "https://github.com/RakanNimer/react-google-charts", - tags: ["dataviz"] + tags: ["dataviz"], }, { url: "https://github.com/LevInteractive/react-serial-forms", - tags: ["form"] + tags: ["form"], }, - { url: "https://github.com/effektif/react-mentions" }, - { url: "https://github.com/istarkov/google-map-react", tags: ["map"] }, - { url: "https://github.com/chrisui/react-hotkeys" }, + { url: "https://github.com/signavio/react-mentions" }, + { + url: "https://github.com/google-map-react/google-map-react", + tags: ["map"], + }, + { url: "https://github.com/greena13/react-hotkeys" }, { url: "https://github.com/jakubzloczewski/react-steps" }, { url: "https://github.com/whoisandy/react-blocks", tags: ["grid"] }, { url: "https://github.com/jxnblk/react-fitter-happier-text", - tags: ["text"] + tags: ["text"], }, { url: "https://github.com/jxnblk/rgx", tags: ["grid"] }, { url: "https://github.com/xudafeng/autoresponsive-react", tags: ["grid"] }, { url: "https://github.com/enkidevs/react-search-input", tags: ["search"] }, { url: "https://github.com/FormidableLabs/component-playground", - tags: ["devtool"] + tags: ["devtool"], }, { url: "https://github.com/jxnblk/react-geomicons", tags: ["icon"] }, { url: "https://github.com/roadmanfong/react-cropper" }, { url: "https://github.com/Evo-Forge/Essence", - tags: ["toolkit", "material design", "abandoned"] + tags: ["toolkit", "material design", "abandoned"], }, { url: "https://github.com/felixrieseberg/React-Spreadsheet-Component", - tags: ["spreadsheet"] + tags: ["spreadsheet"], }, { url: "https://github.com/javierbyte/react-number-easing", - tags: ["animation"] + tags: ["animation"], }, { url: "https://github.com/zenoamaro/react-quill", tags: ["text editor"] }, { url: "https://github.com/igorprado/react-notification-system", - tags: ["notification"] + tags: ["notification"], }, { url: "https://github.com/prakhar1989/react-tags" }, { url: "https://github.com/liferay/alloy-editor", tags: ["text editor"] }, @@ -296,17 +333,17 @@ module.exports = { { url: "https://github.com/rexxars/react-markdown" }, { url: "https://github.com/JedWatson/react-codemirror", - tags: ["text editor"] + tags: ["text editor"], }, { url: "https://github.com/react-dnd/react-dnd" }, { url: "https://github.com/developerdizzle/react-virtual-list", - tags: ["list"] + tags: ["list"], }, { url: "https://github.com/javierbyte/react-textgradient", tags: ["text"] }, { url: "https://github.com/davidguttman/react-pivot", - tags: ["spreadsheet"] + tags: ["spreadsheet"], }, { url: "https://github.com/andreypopp/react-fa", tags: ["icon"] }, { url: "https://github.com/tajo/react-portal" }, @@ -320,43 +357,46 @@ module.exports = { { url: "https://github.com/FormidableLabs/nuka-carousel" }, { url: "https://github.com/jrm2k6/react-markdown-editor", - tags: ["text editor"] + tags: ["text editor"], }, { url: "https://github.com/brigade/react-simple-pie-chart", - tags: ["dataviz"] + tags: ["dataviz"], }, { url: "https://github.com/moroshko/react-autosuggest", - tags: ["autocomplete"] + tags: ["autocomplete"], }, { url: "https://github.com/flipboard/react-canvas", tags: ["graphics"] }, { url: "https://github.com/MicheleBertoli/react-gmaps", tags: ["map"] }, { url: "https://github.com/insin/react-auto-form", tags: ["form"] }, { url: "https://github.com/skratchdot/react-bootstrap-daterangepicker", - tags: ["calendar"] + tags: ["calendar"], }, { url: "https://github.com/gfazioli/react-switch-button", - tags: ["button"] + tags: ["button"], }, { url: "https://github.com/KyleAMathews/react-headroom" }, { url: "https://github.com/codesuki/react-d3-components", - tags: ["dataviz"] + tags: ["dataviz"], }, { url: "https://github.com/javierbyte/react-blur" }, { url: "https://github.com/Sitebase/react-avatar" }, { url: "https://github.com/react-component/menu", tags: ["menu"] }, { url: "https://github.com/Hacker0x01/react-datepicker", - tags: ["calendar"] + tags: ["calendar"], }, { url: "https://github.com/marcio/react-skylight" }, { url: "https://github.com/react-component/form", tags: ["form"] }, { url: "https://github.com/ggordan/react-infinite-grid", tags: ["grid"] }, - { url: "https://github.com/facebook/fixed-data-table", tags: ["list"] }, + { + url: "https://github.com/facebookarchive/fixed-data-table", + tags: ["list"], + }, { url: "https://github.com/contra/react-responsive", tags: ["layout"] }, { url: "https://github.com/wmira/react-sidenav", tags: ["layout"] }, { url: "https://github.com/reactjs/react-chartjs", tags: ["dataviz"] }, @@ -366,7 +406,7 @@ module.exports = { { url: "https://github.com/fraserxu/react-dropdown", tags: ["dropdown"] }, { url: "https://github.com/brigand/react-zeroclipboard", - tags: ["wrapper"] + tags: ["wrapper"], }, { url: "https://github.com/nmn/react-timeago" }, { url: "https://github.com/STRML/react-grid-layout", tags: ["grid"] }, @@ -375,16 +415,16 @@ module.exports = { { url: "https://github.com/akiran/react-slick" }, { url: "https://github.com/olahol/react-tagsinput" }, { url: "https://github.com/svenanders/react-breadcrumbs" }, - { url: "https://github.com/Srdjan/react-multistep", tags: ["form"] }, + { url: "https://github.com/srdjan/react-multistep", tags: ["form"] }, { url: "https://github.com/palantir/blueprint", tags: ["toolkit"] }, // https://www.reddit.com/r/reactjs/comments/6n8pm4/anyone_use_blueprintjs_here_palantirs_react_based/ { url: "https://github.com/react-bootstrap/react-bootstrap", - tags: ["toolkit"] + tags: ["toolkit"], }, { url: "https://github.com/reactstrap/reactstrap", tags: ["toolkit"] }, { - url: "https://github.com/callemall/material-ui", - tags: ["toolkit", "material design"] + url: "https://github.com/mui-org/material-ui", + tags: ["toolkit", "material design"], }, { url: "https://github.com/grommet/grommet", tags: ["toolkit"] }, { url: "https://github.com/tomchentw/react-google-maps", tags: ["map"] }, @@ -392,14 +432,18 @@ module.exports = { { url: "https://github.com/leecade/react-native-swiper", tags: ["native"] }, { url: "https://github.com/FaridSafi/react-native-gifted-chat", - tags: ["native"] + tags: ["native"], }, { url: "https://github.com/GeekyAnts/NativeBase", tags: ["native"] }, { url: "https://github.com/elementalui/elemental", tags: ["toolkit"] }, { url: "https://github.com/ianstormtaylor/slate", tags: ["text editor"] }, { url: "https://github.com/WhitestormJS/whs.js", - tags: ["toolkit", "3d", "game"] - } - ] + tags: ["toolkit", "3d", "game"], + }, + { + url: "https://github.com/video-react/video-react", + tags: ["video"], + }, + ], }; diff --git a/data/source/react-example-apps.js b/data/source/react-example-apps.js index 18aaf52..0297995 100644 --- a/data/source/react-example-apps.js +++ b/data/source/react-example-apps.js @@ -1,19 +1,20 @@ module.exports = { key: "react-example-apps", name: "React Example Apps", + fetchPackageJson: true, description: "Open-source apps that use React.", aka: ["react sample code", "react sample apps"], - tags: [ { name: "educational", aka: ["learning"], description: - "The project helps the user (not just the developer) to learn something." - } + "The project helps the user (not just the developer) to learn something.", + }, ], - projects: [ + { url: "https://github.com/GeekyAnts/NativeBase-KitchenSink" }, + { url: "https://github.com/BTMPL/react-yt", tags: ["video"] }, { url: "https://github.com/ahfarmer/calculator", tags: ["clone"] }, { url: "https://github.com/ahfarmer/emoji-search" }, { url: "https://github.com/insin/react-hn" }, @@ -24,7 +25,7 @@ module.exports = { { url: "https://github.com/hadijaveed/All-Convertors" }, { url: "https://github.com/skidding/illustrated-algorithms", - tags: ["educational"] + tags: ["educational"], }, { url: "https://github.com/SKempin/reactjs-tmdb-app" }, { url: "https://github.com/devtools-html/debugger.html" }, @@ -32,7 +33,7 @@ module.exports = { { url: "https://github.com/chvin/react-tetris", tags: ["game"] }, { url: "https://github.com/sgwilym/relay-visual-learners", - tags: ["educational"] + tags: ["educational"], }, { url: "https://github.com/suddi/suddi.github.io" }, { url: "https://github.com/FormidableLabs/react-music" }, @@ -54,7 +55,7 @@ module.exports = { { url: "https://github.com/mkfreeman/central-limit" }, { url: "https://github.com/Haseeb-Qureshi/n-queens-visualizer", - tags: ["educational"] + tags: ["educational"], }, { url: "https://github.com/pearofducks/foodprocessor" }, { url: "https://github.com/cosmicjs/cosmicapp-voting-app" }, @@ -63,12 +64,12 @@ module.exports = { { url: "https://github.com/devnews/web" }, { url: "https://github.com/pcottle/learnGitBranching", - tags: ["educational"] + tags: ["educational"], }, { url: "https://github.com/gshakir/S3-Infrequent-Access-Calculator" }, { url: "https://github.com/fullstackreact/react-yelp-clone", - tags: ["clone"] + tags: ["clone"], }, { url: "https://github.com/cogentlabs/cloud-vision-explorer" }, { url: "https://github.com/apollographql/GitHunt-React" }, @@ -77,13 +78,13 @@ module.exports = { { url: "https://github.com/project-bobon/bobonroastprofile" }, { url: "https://github.com/browniefed/react-native-animation-book", - tags: ["educational"] + tags: ["educational"], }, { url: "https://github.com/ryanatkn/ear-sharpener", tags: ["game"] }, { url: "https://github.com/sotojuan/saga-login-flow" }, { url: "https://github.com/JoseGonzalez321/react-mega-man-robot-masters", - tags: ["game"] + tags: ["game"], }, { url: "https://github.com/paulhoughton/mortgage-mobx" }, { url: "https://github.com/paulhoughton/fx" }, @@ -110,11 +111,10 @@ module.exports = { { url: "https://github.com/Swizec/react-particles-experiment" }, { url: "https://github.com/jshjohnson/NumberRush", - tags: ["game", "educational"] + tags: ["game", "educational"], }, { url: "https://github.com/hoppula/refire-forum" }, - { url: "https://github.com/bu-ist/housing-available-units" }, - { url: "https://github.com/thejameskyle/spectacle-code-slide" }, + { url: "https://github.com/jamiebuilds/spectacle-code-slide" }, { url: "https://github.com/sherubthakur/N-Puzzle", tags: ["game"] }, { url: "https://github.com/DevAlien/dripr-ui" }, { url: "https://github.com/gre/gl-react-image-effects" }, @@ -149,7 +149,7 @@ module.exports = { { url: "https://github.com/sonnylazuardi/react-komik" }, { url: - "https://github.com/wclittle/Rails5-ActionCable-Redux-React-ChatAppExample" + "https://github.com/wclittle/Rails5-ActionCable-Redux-React-ChatAppExample", }, { url: "https://github.com/rexxars/markdown-editor" }, { url: "https://github.com/ddewaele/web-gpio-react" }, @@ -186,7 +186,7 @@ module.exports = { { url: "https://github.com/Radivarig/react-speed-reader" }, { url: "https://github.com/kadira-samples/react-graphql-todos", - tags: ["todo"] + tags: ["todo"], }, { url: "https://github.com/lahmatiy/component-inspector" }, { url: "https://github.com/fraserxu/soundredux-native" }, @@ -202,13 +202,13 @@ module.exports = { { url: "https://github.com/pwambach/fat-file-finder" }, { url: "https://github.com/raineroviir/react-redux-socketio-chat", - tags: ["chat"] + tags: ["chat"], }, - { url: "https://github.com/romseguy/d3-state-visualizer" }, + { url: "https://github.com/reduxjs/d3-state-visualizer" }, { url: "https://github.com/srtucker22/glipchat", tags: ["chat"] }, { url: "https://github.com/gokulkrishh/React-hacker-news", - tags: ["clone"] + tags: ["clone"], }, { url: "https://github.com/cdglabs/apparatus" }, { url: "https://github.com/circuitsim/circuit-simulator" }, @@ -236,7 +236,7 @@ module.exports = { { url: "https://github.com/whoisandy/yoda" }, { url: "https://github.com/FormidableLabs/es6-interactive-guide", - tags: ["educational"] + tags: ["educational"], }, { url: "https://github.com/pbeshai/linked-highlighting-react-d3-reflux" }, { url: "https://github.com/christopherdro/react-native-rss-reader" }, @@ -244,16 +244,16 @@ module.exports = { { url: "https://github.com/asamiller/den" }, { url: "https://github.com/iSimar/HackerNews-React-Native", - tags: ["clone"] + tags: ["clone"], }, { url: "https://github.com/gre/bezier-easing-editor" }, { url: "https://github.com/joemaddalone/react-native-todo", - tags: ["todo"] + tags: ["todo"], }, { url: "https://github.com/gpbl/isomorphic500" }, { url: "https://github.com/bradoyler/newswatch-react-native" }, { url: "https://github.com/ccoenraets/belgian-beer-explorer" }, - { url: "https://github.com/jhewlett/react-reversi", tags: ["game"] } - ] + { url: "https://github.com/jhewlett/react-reversi", tags: ["game"] }, + ], }; diff --git a/data/source/react-starter-project-tags.js b/data/source/react-starter-project-tags.js index f1832f2..5533c3f 100644 --- a/data/source/react-starter-project-tags.js +++ b/data/source/react-starter-project-tags.js @@ -3,17 +3,30 @@ const get = require("lodash/get"); const includesAny = require("../util/includesAny"); module.exports = [ + { + name: "dependency", + aka: ["updateable"], + description: + "Rather than copying the project, you add it as a dependency. This makes updates a lot easier and keeps your project cleaner.", + }, + { + name: "gatsby", + description: + "Gatsby is a static site generator. These starters are static sites built with Gatsby.", + match: project => includesAny(project.dependencies, ["gatsby"]), + }, { name: "babel", description: "Babel transpiles JavaScript.", - match: project => includesAny(project.dependencies, ["babel", "babel-core"]) + match: project => + includesAny(project.dependencies, ["babel", "babel-core"]), }, { name: "coffeescript", aka: ["coffee", "coffee script"], description: "CoffeeScript is a language that compiles into JavaScript", match: project => - includesAny(project.dependencies, ["coffee-loader", "coffee-script"]) + includesAny(project.dependencies, ["coffee-loader", "coffee-script"]), }, { name: "css modules", @@ -24,7 +37,7 @@ module.exports = [ if ( includesAny(project.dependencies, [ "css-modules-require-hook", - "css-modules" + "css-modules", ]) ) { return true; @@ -34,48 +47,22 @@ module.exports = [ // Add the tag manually if necessary. return false; - } + }, }, { - name: "es6", - aka: ["esnext", "es6+", "es7", "es2015", "es2016", "transpiled"], - description: - "Uses transpiling to convert JavaScript with the latest language features into well-supported (ES5) code", - - match: project => { - // Projects with coffeescript are automatically considered to NOT be using ES6 - if ( - includesAny(project.dependencies, ["coffee-loader", "coffee-script"]) - ) { - return false; - } - - return includesAny(project.dependencies, [ - "babel", - "babel-core", - "babel-loader", - "babel-preset-react", - "babel-preset-es2015", - "babelify", - "babel-jest" - ]); - } + name: "redux", + description: "Redux is used for state management.", + match: project => includesAny(project.dependencies, ["redux"]), }, { name: "flux", - description: "Something flux-like is used: Redux, Mobx, Flux, Reflux, etc.", - match: project => - includesAny(project.dependencies, [ - "flux", - "mobx", - "redux", - "reflux", - "alt", - "alt.js", - "flummox", - "martyjs", - "miniflux" - ]) + description: "Flux is used for state management.", + match: project => includesAny(project.dependencies, ["flux"]), + }, + { + name: "mobx", + description: "Mobx is used for state management.", + match: project => includesAny(project.dependencies, ["mobx"]), }, { name: "hmr", @@ -94,16 +81,16 @@ module.exports = [ "react-hot-loader", "react-transform-hmr", "webpack-hot-middleware", - "livereactload" // hot reload for browserify + "livereactload", // hot reload for browserify ]); - } + }, }, { name: "inline style", aka: ["inline CSS"], description: "CSS is added with inline style properties rather than in a separate stylesheet.", - match: project => includesAny(project.dependencies, ["react-inline-css"]) + match: project => includesAny(project.dependencies, ["react-inline-css"]), }, { name: "linter", @@ -117,8 +104,9 @@ module.exports = [ "jscs", "eslint-plugin-react", "gulp-eslint", - "babel-eslint" - ]) + "babel-eslint", + "tslint", + ]), }, { name: "live reload", @@ -126,28 +114,28 @@ module.exports = [ description: "Automatic browser refresh whenever the developer makes code changes in the text editor.", match: project => - includesAny(project.dependencies, ["BrowserSync", "piping"]) + includesAny(project.dependencies, ["BrowserSync", "piping"]), }, { name: "minimal", aka: ["simple"], description: "A project is considered 'minimal' if it has fewer than 20 dependencies.", - match: project => project.dependencies.length < 20 + match: project => project.dependencies.length < 20, }, { name: "rails", - match: project => project.dependencies.includes("react-rails") + match: project => project.dependencies.includes("react-rails"), }, { name: "native", - match: project => project.dependencies.includes("react-native") + match: project => project.dependencies.includes("react-native"), }, { name: "router", aka: ["routing"], description: "Uses react-router to keep the UI in sync with the URL.", - match: project => project.dependencies.includes("react-router") + match: project => project.dependencies.includes("react-router"), }, { name: "tests", @@ -159,14 +147,14 @@ module.exports = [ "jest-cli", "mocha", "jasmine", - "karma" - ]) + "karma", + ]), }, { name: "typescript", description: "TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.", - match: project => project.dependencies.includes("typescript") + match: project => project.dependencies.includes("typescript"), }, { name: "universal", @@ -185,13 +173,34 @@ module.exports = [ description.match(/isomorphic/i) || description.match(/universal/i) ); - } + }, }, { - name: "webpack 2", - aka: ["webpack2"], - description: - "Webpack 2 was released in Jan 2017 and includes some breaking changes.", + name: "webpack 3", + aka: ["webpack3"], + description: "Webpack 3 was released in June 2017.", + match: project => { + const dependencies = Object.assign( + {}, + project.packageJson.dependencies, + project.packageJson.devDependencies + ); + const webpackVersionRange = dependencies.webpack; + if (!webpackVersionRange) { + return false; + } + // Get the first digit + const webpackMajorVersion = webpackVersionRange.match(/[0-9]/)[0]; + if (!webpackMajorVersion) { + return false; + } + return webpackMajorVersion === "3"; + }, + }, + { + name: "webpack 4", + aka: ["webpack4"], + description: "Webpack 4 was released in Feb 2018.", match: project => { const dependencies = Object.assign( {}, @@ -207,13 +216,29 @@ module.exports = [ if (!webpackMajorVersion) { return false; } - return webpackMajorVersion === "2"; - } + return webpackMajorVersion === "4"; + }, }, { name: "flow", - aka: "flowtype", + aka: ["flowtype"], description: "Static type checker by Facebook", - match: project => includesAny(project.dependencies, ["babel-preset-flow"]) - } + match: project => includesAny(project.dependencies, ["babel-preset-flow"]), + }, + { + name: "parcel-bundler", + aka: ["parcel"], + description: "Blazing fast, zero configuration web application bundler", + match: project => includesAny(project.dependencies, ["parcel-bundler"]), + }, + { + name: "electron", + description: "Tool for building desktop apps.", + match: project => + includesAny(project.dependencies, [ + "electron-packager", + "electron", + "electron-rebuild", + ]), + }, ]; diff --git a/data/source/react-starter-projects.js b/data/source/react-starter-projects.js index 78be8cb..a7776c9 100644 --- a/data/source/react-starter-projects.js +++ b/data/source/react-starter-projects.js @@ -1,30 +1,121 @@ +/** + * It's awesome when you add to this list. + * + * TO ADD YOUR REPO: Just add a line like this to the end: + * { url: "https://github.com/" } + * And you're done! + * + * ABOUT TAGS: Most of the them are automatic - you don't need to write them out. + * See react-starter-project-tags.js - the tags that have a 'match' function + * are added automatically. + * + * The automatic matchers ensure that tags are consistent and also saves some + * maintenance effort. One common tag that is not added automatically is + * 'css modules'. + */ const starterProjectTags = require("./react-starter-project-tags"); module.exports = { key: "react-starter-projects", name: "React Starter Projects", + fetchPackageJson: true, description: "Repositories that you can copy and modify to create your own React app.", aka: ["react boilerplates", "react starters", "react seeds"], tags: starterProjectTags, - projects: [ + { url: "https://github.com/spencercarli/getting-started-react-navigation" }, + { + url: "https://github.com/crazyfactory/ts-react-boilerplate", + }, + { url: "https://github.com/chentsulin/electron-react-boilerplate" }, + { + url: "https://github.com/jaredpalmer/after.js", + tags: ["dependency"], + }, + { + url: "https://github.com/gatsbyjs/gatsby", + tags: ["dependency", "css modules"], + packagePaths: ["packages/gatsby/package.json"], + }, + { + url: "https://github.com/gatsbyjs/gatsby-starter-default", + tags: ["css modules"], + }, + { + url: "https://github.com/gatsbyjs/gatsby-starter-blog", + tags: ["css modules"], + }, + { + url: "https://github.com/gatsbyjs/gatsby-starter-hello-world", + tags: ["css modules"], + }, + { + url: "https://github.com/Vagr9K/gatsby-material-starter", + tags: ["css modules"], + }, + { + url: "https://github.com/fabien0102/gatsby-starter", + tags: ["css modules"], + }, + { + url: "https://github.com/jaxx2104/gatsby-starter-bootstrap", + tags: ["css modules"], + }, + { + url: "https://github.com/dschau/gatsby-blog-starter-kit", + tags: ["css modules"], + }, + { + url: "https://github.com/Vagr9K/gatsby-advanced-starter", + tags: ["css modules"], + }, + { + url: "https://github.com/100ideas/glitch-gatsby-starter-blog", + tags: ["css modules"], + }, + { + url: "https://github.com/alampros/gatsby-starter-grommet", + tags: ["css modules"], + }, + { + url: "https://github.com/PrototypeInteractive/gatsby-react-boilerplate", + tags: ["css modules"], + }, + { + url: "https://github.com/angeloocana/gatsby-starter-default-i18n", + tags: ["css modules"], + }, + { + url: "https://github.com/saschajullmann/gatsby-starter-gatsbythemes", + tags: ["css modules"], + }, + { + url: "https://github.com/AustinGreen/gatsby-starter-netlify-cms", + tags: ["css modules"], + }, + { + url: "https://github.com/LeKoArts/gatsby-starter-portfolio-emma", + tags: ["css modules"], + }, + { url: "https://github.com/esausilva/react-starter-boilerplate-hmr" }, { url: "https://github.com/a-tarasyuk/rr-boilerplate", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/acdlite/flummox-isomorphic-demo" }, { url: "https://github.com/adampash/react-native-hot-redux-starter" }, { url: "https://github.com/akopichin/webpack-react-template" }, { - url: "https://github.com/alicoding/react-webpack-babel", - tags: ["css modules"] + url: "https://github.com/ReactJSResources/react-webpack-babel", + tags: ["css modules"], }, + { url: "https://github.com/amaurymartiny/cra-lerna-electron" }, { url: "https://github.com/amaurymartiny/react-redux-auth0-kit" }, { url: "https://github.com/andy9775/YARSP" }, { url: "https://github.com/anorudes/redux-easy-boilerplate", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/atSistemas/react-base" }, { url: "https://github.com/Atyantik/react-pwa" }, @@ -44,7 +135,7 @@ module.exports = { { url: "https://github.com/cloudmu/react-redux-starter-kit" }, { url: - "https://github.com/codefoundries/isomorphic-material-relay-starter-kit" + "https://github.com/codefoundries/isomorphic-material-relay-starter-kit", }, { url: "https://github.com/codefoundries/UniversalRelayBoilerplate" }, { url: "https://github.com/coryhouse/react-flux-starter-kit" }, @@ -53,18 +144,16 @@ module.exports = { { url: "https://github.com/ctrlplusb/react-universally" }, { url: "https://github.com/davezuko/react-redux-starter-kit" }, { - url: - "https://github.com/developer239/ReactReduxApolloGraphQLHotBoilerplate" + url: "https://github.com/developer239/react-apollo-graphql", }, { url: "https://github.com/developer239/workbox-webpack-react" }, { url: "https://github.com/diegohaz/arc" }, { url: "https://github.com/djizco/boilerplate-react" }, { url: "https://github.com/DominicTobias/universal-react" }, { url: "https://github.com/dozoisch/koa-react-full-example" }, - { url: "https://github.com/dvajs/dva" }, { url: "https://github.com/eanplatter/react-starter" }, { url: "https://github.com/elierotenberg/react-rails-starterkit" }, - { url: "https://github.com/emyann/typescript-webpack-starter" }, + { url: "https://github.com/nobrainr/typescript-webpack-starter" }, { url: "https://github.com/ericelliott/react-pure-component-starter" }, { url: "https://github.com/erikras/react-redux-universal-hot-example" }, { url: "https://github.com/este/este" }, @@ -73,7 +162,7 @@ module.exports = { { url: "https://github.com/gaearon/react-hot-boilerplate" }, { url: "https://github.com/gilamran/fullstack-typescript", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/goshakkk/no-bs-react-webpack-starter" }, { url: "https://github.com/granmoe/react-redux-saga-boilerplate" }, @@ -81,13 +170,13 @@ module.exports = { { url: "https://github.com/iam4x/isomorphic-flux-boilerplate" }, { url: "https://github.com/iroy2000/react-redux-boilerplate", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/irvinebroque/isomorphic-hot-loader" }, { url: "https://github.com/ivanzotov/react-native-example" }, { url: "https://github.com/jahe/jahe-react-starter" }, { url: "https://github.com/janoist1/universal-react-redux-starter-kit" }, - { url: "https://github.com/jaredpalmer/razzle" }, + { url: "https://github.com/jaredpalmer/razzle", tags: ["dependency"] }, { url: "https://github.com/jcreamer898/expressiso" }, { url: "https://github.com/jedireza/aqua" }, { url: "https://github.com/jeffschwartz/react-quickstart" }, @@ -95,12 +184,12 @@ module.exports = { { url: "https://github.com/jkup/react-app-starter" }, { url: - "https://github.com/jquintozamora/react-es6-webpack-minimal-starter-template" + "https://github.com/jquintozamora/react-es6-webpack-minimal-starter-template", }, { url: "https://github.com/jquintozamora/react-typescript-webpack2-cssModules-postCSS", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/khalilgharbaoui/flux-boilerplate" }, { url: "https://github.com/kireerik/razzle-material-ui-styled-example" }, @@ -108,13 +197,17 @@ module.exports = { { url: "https://github.com/krasimir/react-webpack-starter" }, { url: "https://github.com/kriasoft/aspnet-starter-kit", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/kriasoft/babel-starter-kit" }, { url: "https://github.com/kriasoft/react-starter-kit" }, - { url: "https://github.com/kriasoft/react-static-boilerplate" }, + { url: "https://github.com/kriasoft/react-firebase-starter" }, { url: "https://github.com/kristinbaumann/react-sketchapp-starter-kit" }, { url: "https://github.com/KyleAMathews/coffee-react-quickstart" }, + { + url: "https://github.com/smith-chris/react-coffee-starter", + tags: ["css modules"], + }, { url: "https://github.com/LEINWAND/react-redux-app" }, { url: "https://github.com/lifenautjoe/webpack-starter-basic" }, { url: "https://github.com/lubien/koa-react-redux-universal-boilerplate" }, @@ -122,14 +215,14 @@ module.exports = { { url: "https://github.com/madeagency/reactivity" }, { url: "https://github.com/MadeInHaus/react-flux-gulp-starter" }, { - url: "https://github.com/madnight/react-webpack-babel-karma-boilerplate" + url: "https://github.com/madnight/react-webpack-babel-karma-boilerplate", }, - { url: "https://github.com/mcnamee/react-native-starter-app" }, + { url: "https://github.com/mcnamee/react-native-starter-kit" }, { url: "https://github.com/mhart/simple-relay-starter" }, { url: "https://github.com/mikechabot/react-boilerplate" }, { url: "https://github.com/mobxjs/mobx-react-boilerplate" }, { url: "https://github.com/mobxjs/mobx-react-typescript-boilerplate" }, - { url: "https://github.com/MoOx/phenomic" }, + { url: "https://github.com/phenomic/phenomic" }, { url: "https://github.com/mozilla-neutrino/react-router-starter" }, { url: "https://github.com/mozilla-neutrino/react-starter" }, { url: "https://github.com/ngduc/react-setup" }, @@ -138,7 +231,7 @@ module.exports = { { url: "https://github.com/obetomuniz/reeakt" }, { url: "https://github.com/olebedev/go-starter-kit", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/oscarmorrison/react-webpack-starter" }, { url: "https://github.com/osxi/react-pouch-redux-starter-kit" }, @@ -146,21 +239,22 @@ module.exports = { { url: "https://github.com/peppesilletti/webpack-project" }, { url: "https://github.com/peter-mouland/react-lego", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/phenomic/phenomic" }, { url: "https://github.com/pheuter/essential-react" }, { - url: "https://github.com/piotrwitek/react-redux-typescript-starter-kit", - tags: ["css modules"] + url: "https://github.com/piotrwitek/react-redux-typescript-jspm-starter", + tags: ["css modules"], }, { url: "https://github.com/przeor/react-router-flux-starter-kit" }, { url: "https://github.com/radenkovic/react-vanilla" }, + { url: "https://github.com/radenkovic/styled-react-boilerplate" }, { url: "https://github.com/rangle/react-redux-example" }, { url: "https://github.com/rauschma/react-starter-project" }, { url: "https://github.com/rbartoli/react-boilerplate", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/react-boilerplate/react-boilerplate" }, { url: "https://github.com/reactGo/reactGo", tags: ["css modules"] }, @@ -172,15 +266,19 @@ module.exports = { { url: "https://github.com/samblake/react-native-typescript-starter-2017" }, { url: "https://github.com/scalable-react/scalable-react-boilerplate", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/skolmer/react-hot-boilerplate-vscode" }, { url: "https://github.com/sotnikov-link/ts-react-boilerplate" }, { - url: "https://github.com/stample/gulp-browserify-react-phonegap-starter" + url: "https://github.com/stample/gulp-browserify-react-phonegap-starter", }, { url: "https://github.com/start-react/native-starter-kit" }, - { url: "https://github.com/stoikerty/dev-toolkit", tags: ["css modules"] }, + { + url: "https://github.com/stoikerty/dev-toolkit", + tags: ["css modules"], + packagePaths: ["src/package.json"], + }, { url: "https://github.com/Stupidism/stupid-rc-starter" }, { url: "https://github.com/substack/react-starter-hmr" }, { url: "https://github.com/survivejs/react-component-boilerplate" }, @@ -196,7 +294,7 @@ module.exports = { { url: "https://github.com/vitalybe/ReactNativeUniversal" }, { url: "https://github.com/vodkabears/another-one-fucking-boilerplate", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/VulcanJS/Vulcan" }, { url: "https://github.com/vutran/spa-starter-kit" }, @@ -205,43 +303,44 @@ module.exports = { { url: "https://github.com/webpack/react-starter" }, { url: "https://github.com/WeLikeGraphQL/universal-react-apollo-example", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/wellyshen/react-cool-starter", - tags: ["css modules"] + tags: ["css modules"], }, { url: "https://github.com/wwsun/starter-node-react" }, { url: "https://github.com/xkawi/react-universal-saga" }, { url: "https://github.com/xpepermint/isomorphic-react-relay-boilerplate" }, { url: "https://github.com/YUzhva/create-react-redux-app" }, - { url: "https://github.com/zeit/next.js" }, + { url: "https://github.com/zeit/next.js", tags: ["dependency"] }, + { url: "https://github.com/nozzle/react-static" }, { url: "https://github.com/zxbodya/reactive-widgets" }, { url: "https://github.com/gaearon/react-transform-boilerplate" }, - - // package.json elsewhere, or needs tag adjustments { - url: "https://github.com/facebookincubator/create-react-app" + url: "https://github.com/facebook/create-react-app", + tags: ["dependency"], }, { - url: "https://github.com/ahfarmer/minimal-react-starter", - tags: ["HMR"] + url: "https://github.com/react-community/create-react-native-app", + tags: ["dependency"], }, + { url: "https://github.com/ahfarmer/minimal-react-starter", tags: ["HMR"] }, { url: "https://github.com/FredericHeem/starhackit", - packagePaths: ["client/package.json", "server/package.json"] + packagePaths: ["client/package.json", "server/package.json"], }, { url: "https://github.com/kjda/ReactJs-Phonegap", - packagePaths: ["app/package.json", "server/package.json"] + packagePaths: ["app/package.json", "server/package.json"], }, { url: "https://github.com/geowarin/boot-react", - packagePaths: ["frontend/package.json"] + packagePaths: ["frontend/package.json"], }, { url: "https://github.com/pauldotknopf/react-aspnet-boilerplate", - packagePaths: ["src/ReactBoilerplate/package.json"] + packagePaths: ["src/ReactBoilerplate/package.json"], }, { url: "https://github.com/NYTimes/kyt", @@ -254,12 +353,62 @@ module.exports = { "packages/kyt-starter-static/package.json", "packages/kyt-starter-universal/package.json", "packages/kyt-utils/package.json", - "packages/stylelint-config-kyt/package.json" - ] + "packages/stylelint-config-kyt/package.json", + ], }, { url: "https://github.com/agrcrobles/react-native-web-boilerplate", - packagePaths: ["package.json", "electron/package.json"] - } - ] + packagePaths: ["package.json", "electron/package.json"], + }, + { url: "https://github.com/StephenGrider/ReduxSimpleStarter" }, + { + url: "https://github.com/alinz/example-react-native-redux", + packagePaths: ["Counter/package.json", "Counters/package.json"], + }, + { url: "https://github.com/mirrorjs/mirror", tags: ["dependency"] }, + { + url: "https://github.com/lnked/react-starter", + tags: ["css modules"], + }, + { + url: "https://github.com/karpusa/heroku-react-starter-kit", + tags: ["css modules"], + }, + { + url: "https://github.com/iaincollins/nextjs-starter", + }, + { + url: "https://github.com/dazlious/react-typescript-starter", + }, + { + url: "https://github.com/rtivital/react-pages-boilerplate", + }, + { + url: "https://github.com/jesalg/pevn-starter", + }, + { + url: "https://github.com/manuelbieh/react-ssr-setup", + tags: ["css modules"], + }, + { + url: "https://github.com/king-prawns/webpack4-starter-kit", + }, + { + url: "https://github.com/eldrego/react-redux-starter-kit", + }, + { + url: "https://github.com/reactjs-starter-kit/React-Starter-Kit", + }, + { + url: "https://github.com/theqdev/react-big-bang", + }, + { + url: + "https://github.com/alishahlakhani/Reactsx-React-TS-SCSS-PWA-Boilerplate", + tags: ["css modules"], + }, + { + url: "https://github.com/praveen-me/reenode", + }, + ], }; diff --git a/data/source/react-style-libraries.js b/data/source/react-style-libraries.js deleted file mode 100644 index 16cc2f2..0000000 --- a/data/source/react-style-libraries.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - key: "react-style-libraries", - name: "React Style Libraries", - description: - "Tools that assist you with styling your React components. This list specifically excludes general CSS processors - it only includes tools that are designed specifically for React.", - aka: ["react styling", "react style utilities"], - - tags: [], - - projects: [ - { url: "https://github.com/rofrischmann/fela" }, - { url: "https://github.com/styled-components/styled-components" }, - { url: "https://github.com/FormidableLabs/radium", tags: ["inline"] }, - { url: "https://github.com/paypal/glamorous", tags: ["inline"] } - ] -}; diff --git a/data/source/react-tutorials.js b/data/source/react-tutorials.js index 716524d..ebfd53a 100644 --- a/data/source/react-tutorials.js +++ b/data/source/react-tutorials.js @@ -8,8 +8,8 @@ module.exports = { tags: [ { name: "redux", - description: "The tutorial introduces Redux in combination with React." - } + description: "The tutorial introduces Redux in combination with React.", + }, ], articles: [ @@ -19,7 +19,7 @@ module.exports = { author: "Petr Tichy", date: "2017-09-11", description: - "React tutorial for complete beginners. Learn the basic or React.js by following this simple guide for React newbies." + "React tutorial for complete beginners. Learn the basic or React.js by following this simple guide for React newbies.", }, { title: "Learning React.js: Getting Started and Concepts", @@ -28,9 +28,9 @@ module.exports = { author: "Ken Wheeler", date: "2017-10-18", description: - "The first installment in a new series of tutorials, Learning React, that will focus on becoming proficient and effective with Facebook&'s React library", + "The first installment in a new series of tutorials, Learning React, that will focus on becoming proficient and effective with Facebook's React library", notes: - "This article was published way back in 2014, but the author has kept it up-to-date. It has been updated for react 16." + "This article was published way back in 2014, but the author has kept it up-to-date. It has been updated for react 16.", }, { title: "Build with React Tutorial", @@ -38,7 +38,7 @@ module.exports = { author: "buildwithreact", date: "2016-9-13", description: - "Learn ReactJS with this simple and interactive tutorial. Topics include JSX, components, events, state, and a quick look under the hood." + "Learn ReactJS with this simple and interactive tutorial. Topics include JSX, components, events, state, and a quick look under the hood.", }, { title: "Raw React", @@ -46,7 +46,7 @@ module.exports = { author: "James K Nelson", date: "2016-4-24", description: - "Learn React from the ground up, without worrying about JSX, Flux, ES6, Webpack, etc." + "Learn React from the ground up, without worrying about JSX, Flux, ES6, Webpack, etc.", }, { title: "Official React Tutorial", @@ -54,7 +54,7 @@ module.exports = { author: "Facebook", date: "2017-10-27", description: - "The React tutorial included in the official React documentation." + "The React tutorial included in the official React documentation.", }, { title: "Comprehensive React.js Guide", @@ -62,7 +62,7 @@ module.exports = { "http://tylermcginnis.com/reactjs-tutorial-a-comprehensive-guide-to-building-apps-with-react/", author: "Tyler McGinnis", date: "2015-1-12", - description: "Guide for learning to build apps with React." + description: "Guide for learning to build apps with React.", }, { title: "Full-Stack Redux Tutorial", @@ -71,7 +71,7 @@ module.exports = { date: "2016-2-24", description: "A Comprehensive Guide to Test-First Development with Redux, React, and Immutable", - tags: ["redux"] - } - ] + tags: ["redux"], + }, + ], }; diff --git a/data/source/state-managers.js b/data/source/state-managers.js new file mode 100644 index 0000000..fbaea3b --- /dev/null +++ b/data/source/state-managers.js @@ -0,0 +1,68 @@ +module.exports = { + key: "state-managers", + name: "State Managers", + description: "These manage the state of your JavaScript application.", + aka: ["flux libraries"], + tags: [ + { + name: "pure flux", + description: "Matches exactly the original definition of flux", + }, + { + name: "react", + description: + "Has code or documentation that specifically helps to integrate with React", + }, + { + name: "redux", + description: "A Redux plugin", + }, + { + name: "mobx", + description: "A MobX plugin.", + }, + ], + projects: [ + { url: "https://github.com/bcherny/undux" }, + { url: "https://github.com/mweststrate/immer" }, + { url: "https://github.com/cerebral/cerebral" }, + { url: "https://github.com/jumpsuit/jumpstate" }, + { + url: "https://github.com/dvajs/dva", + packagePaths: ["package.json", "packages/dva-core/package.json"], + }, + { url: "https://github.com/keajs/kea" }, + { url: "https://github.com/Olical/EventEmitter" }, + { url: "https://github.com/jeromeetienne/microevent.js" }, + { url: "https://github.com/mroderick/PubSubJS" }, + { url: "https://github.com/solkimicreb/react-easy-state", tags: ["react"] }, + { url: "https://github.com/facebook/flux", tags: ["pure flux"] }, + { url: "https://github.com/goatslacker/alt", tags: ["pure flux"] }, + { url: "https://github.com/optimizely/nuclear-js", tags: ["pure flux"] }, + { url: "https://github.com/yahoo/fluxible", tags: ["pure flux"] }, + { url: "https://github.com/acdlite/flummox", tags: ["pure flux"] }, + { url: "https://github.com/mobxjs/mobx", tags: ["react", "mobx"] }, + { + url: "https://github.com/mobxjs/mobx-state-tree", + tags: ["react", "mobx"], + }, + { url: "https://github.com/reduxjs/redux", tags: ["react", "redux"] }, + { + url: "https://github.com/redux-saga/redux-saga", + tags: ["react", "redux"], + }, + { url: "https://github.com/reduxjs/react-redux", tags: ["react", "redux"] }, + { + url: "https://github.com/tommikaikkonen/redux-orm", + tags: ["react", "redux"], + }, + { url: "https://github.com/vuejs/vuex", tags: ["vue"] }, + { url: "https://github.com/cerebral/cerebral" }, + { + url: "https://github.com/robinvdvleuten/vuex-persistedstate", + tags: ["vue"], + }, + { url: "https://github.com/moreartyjs/moreartyjs", tags: ["react"] }, + { url: "https://github.com/jamiebuilds/unstated", tags: ["react"] }, + ], +}; diff --git a/data/source/static-site-generators.js b/data/source/static-site-generators.js index a9af0ea..3cfa7a9 100644 --- a/data/source/static-site-generators.js +++ b/data/source/static-site-generators.js @@ -1,13 +1,38 @@ module.exports = { key: "static-site-generators", name: "Static Site Generators", - description: "", - aka: [""], + description: "Tools that help you generate a static site.", + aka: ["static site builder", "static site framework"], - tags: [], + tags: [ + { + name: "react", + description: + "The generator either uses React internally or encourages and supports you using it in combination with the generator.", + }, + ], projects: [ - { url: "https://github.com/antwarjs/antwar" }, - { url: "https://github.com/gatsbyjs/gatsby" } - ] + { url: "https://github.com/antwarjs/antwar", tags: ["react"] }, + { url: "https://github.com/gatsbyjs/gatsby", tags: ["react"] }, + { url: "https://github.com/nozzle/react-static", tags: ["react"] }, + { url: "https://github.com/jnordberg/wintersmith" }, + { url: "https://github.com/static-dev/spike" }, + { url: "https://github.com/phenomic/phenomic" }, + { url: "https://github.com/segmentio/metalsmith" }, + { url: "https://github.com/sintaxi/harp" }, + { url: "https://github.com/assemble/assemble" }, + { url: "https://github.com/docpad/docpad" }, + { url: "https://github.com/hexojs/hexo" }, + { url: "https://github.com/lord/slate", tags: ["documentation"] }, + { + url: + "https://github.com/markdalgleish/static-site-generator-webpack-plugin", + }, + { url: "https://github.com/GitbookIO/gitbook" }, + { url: "https://github.com/elmasse/nextein", tags: ["react"] }, + { url: "https://github.com/flatiron/blacksmith" }, + { url: "https://github.com/eduardoboucas/staticman" }, + { url: "https://github.com/vigetlabs/blendid" }, + ], }; diff --git a/data/source/style-libraries.js b/data/source/style-libraries.js new file mode 100644 index 0000000..6ee818b --- /dev/null +++ b/data/source/style-libraries.js @@ -0,0 +1,61 @@ +module.exports = { + key: "style-libraries", + name: "Style Libraries", + description: + "Tools that assist you with applying CSS to your components or HTML.", + aka: ["css processors", "style utilities", "stylers"], + + tags: [ + { + name: "css processor", + description: + "Converts another language into CSS or modifies/improves CSS.", + }, + { + name: "inline", + description: + "Works by setting styles in JavaScript rather than in a separate style file.", + }, + { + name: "react", + description: + "Works only with React or mentions specifically that it works well with React.", + }, + ], + + projects: [ + { url: "https://github.com/Khan/aphrodite" }, + { url: "https://github.com/adamterlson/cairn" }, + { url: "https://github.com/blakeembrey/react-free-style", tags: ["react"] }, + { + url: "https://github.com/casesandberg/reactcss", + tags: ["inline", "react"], + }, + { url: "https://github.com/css-modules/css-modules", tags: ["react"] }, + { url: "https://github.com/FormidableLabs/radium", tags: ["inline"] }, + { url: "https://github.com/gajus/react-css-modules", tags: ["react"] }, + { url: "https://github.com/iamvdo/pleeease", tags: ["css processor"] }, + { url: "https://github.com/cssinjs/jss" }, + { url: "https://github.com/less/less.js", tags: ["css processor"] }, + { url: "https://github.com/maxguzenski/react-easy-style", tags: ["react"] }, + { url: "https://github.com/paypal/glamorous", tags: ["inline"] }, + { url: "https://github.com/jsxstyle/jsxstyle", tags: ["inline"] }, + { url: "https://github.com/postcss/postcss", tags: ["css processor"] }, + { url: "https://github.com/rofrischmann/fela" }, + { url: "https://github.com/rofrischmann/react-look", tags: ["react"] }, + { url: "https://github.com/sass/sass", tags: ["css processor"] }, + { url: "https://github.com/segmentio/myth", tags: ["css processor"] }, + { + url: "https://github.com/styled-components/styled-components", + tags: ["react"], + }, + { url: "https://github.com/stylus/stylus", tags: ["css processor"] }, + { + url: "https://github.com/unicorn-standard/react-pacomo", + tags: ["react"], + }, + { url: "https://github.com/rtsao/styletron" }, + { url: "https://github.com/zeit/styled-jsx", tags: ["react"] }, + { url: "https://github.com/emotion-js/emotion", tags: ["inline"] }, + ], +}; diff --git a/data/source/test-utilities.js b/data/source/test-utilities.js new file mode 100644 index 0000000..733579f --- /dev/null +++ b/data/source/test-utilities.js @@ -0,0 +1,24 @@ +module.exports = { + key: "test-utilities", + name: "Test Utilities", + description: "Tools that help you test your app.", + aka: ["test frameworks", "test tools"], + tags: [], + projects: [ + { url: "https://github.com/facebook/jest", tags: ["runner"] }, + { url: "https://github.com/Raathigesh/majestic" }, + { url: "https://github.com/cypress-io/cypress" }, + { url: "https://github.com/mochajs/mocha" }, + { url: "https://github.com/airbnb/enzyme", tags: ["react"] }, + { url: "https://github.com/nathanboktae/mocha-phantomjs" }, + { url: "https://github.com/dareid/chakram" }, + { url: "https://github.com/karma-runner/karma", tags: ["runner"] }, + { url: "https://github.com/vue-play/vue-play", tags: ["vue"] }, + { url: "https://github.com/storybooks/storybook", tags: ["react"] }, + { url: "https://github.com/chaijs/chai" }, + { url: "https://github.com/domenic/chai-as-promised" }, + { url: "https://github.com/domenic/sinon-chai" }, + { url: "https://github.com/react-cosmos/react-cosmos", tags: ["react"] }, + { url: "https://github.com/avajs/ava", tags: ["runner"] }, + ], +}; diff --git a/data/source/utility-libraries.js b/data/source/utility-libraries.js index ec423a0..35889b0 100644 --- a/data/source/utility-libraries.js +++ b/data/source/utility-libraries.js @@ -6,19 +6,34 @@ module.exports = { aka: [ "lodash alternatives", "jquery alternatives", - "underscore alternatives" + "underscore alternatives", ], tags: [ { name: "ajax", - description: "Includes methods for sending HTTP requests." - } + description: "Includes methods for sending HTTP requests.", + }, + { + name: "multi-tool", + description: + "These libraries have functions for a wide variety of use-cases - they are not focused on one task.", + aka: ["toolkit"], + }, + { + name: "date", + description: "These tools help with parsing & formatting dates & times", + aka: ["time"], + }, ], projects: [ - { url: "https://github.com/lodash/lodash" }, - { url: "https://github.com/jashkenas/underscore" }, - { url: "https://github.com/jquery/jquery", tags: ["ajax"] } - ] + { url: "https://github.com/moment/moment", tags: ["date"] }, + { url: "https://github.com/date-fns/date-fns", tags: ["date"] }, + { url: "https://github.com/lodash/lodash", tags: ["multi-tool"] }, + { url: "https://github.com/jashkenas/underscore", tags: ["multi-tool"] }, + { url: "https://github.com/jquery/jquery", tags: ["multi-tool", "ajax"] }, + { url: "https://github.com/faisalman/ua-parser-js" }, + { url: "https://github.com/moment/luxon", tags: ["date"] }, + ], }; diff --git a/data/source/view-libraries.js b/data/source/view-libraries.js index 0e17cd6..0996822 100644 --- a/data/source/view-libraries.js +++ b/data/source/view-libraries.js @@ -5,20 +5,25 @@ module.exports = { "View libraries render your app in the browser. You provide some code or data in a format that is specific to the library, and the library handles rendering DOM elements and styles. All of these run within the browser, but some also run on the server.", aka: ["UX Libraries", "UX Frameworks"], - tags: [], + tags: [ + { + name: "mobile", + description: + "Renders native views on iOS/Android instead of browser DOM elements.", + }, + ], projects: [ + { url: "https://github.com/hyperapp/hyperapp" }, { url: "https://github.com/facebook/react" }, - { - url: "https://github.com/developit/preact", - notes: - "Smaller library than React which strives for (almost) feature parity" - }, + { url: "https://github.com/developit/preact" }, { url: "https://github.com/angular/angular" }, { url: "https://github.com/MithrilJS/mithril.js" }, - { url: "https://github.com/elm-lang/core", packagePaths: [] }, - { url: "https://github.com/facebook/react-native" }, + { url: "https://github.com/elm/compiler" }, + { url: "https://github.com/facebook/react-native", tags: ["mobile"] }, { url: "https://github.com/OnsenUI/OnsenUI" }, - { url: "https://github.com/emberjs/ember.js" } - ] + { url: "https://github.com/emberjs/ember.js" }, + { url: "https://github.com/vuejs/vue" }, + { url: "https://github.com/NativeScript/NativeScript", tags: ["mobile"] }, + ], }; diff --git a/data/util/__tests__/testIncludesAny.js b/data/util/__tests__/testIncludesAny.js index c626c6c..aec99a2 100644 --- a/data/util/__tests__/testIncludesAny.js +++ b/data/util/__tests__/testIncludesAny.js @@ -18,7 +18,7 @@ describe("includesAny", () => { "alt.js", "flummox", "martyjs", - "miniflux" + "miniflux", ] ) ).to.be.true; diff --git a/dist/package.json b/dist/package.json index fae5226..1b5f911 100644 --- a/dist/package.json +++ b/dist/package.json @@ -1,9 +1,13 @@ { "name": "javascriptstuff-db", "description": "Database of JavaScript project lists.", - "version": "1.1.1", + "version": "1.13.0", "author": "Andrew Farmer ", "homepage": "https://www.javascriptstuff.com", + "repository": { + "type": "git", + "url": "git+https://github.com/ahfarmer/javascriptstuff-db.git" + }, "keywords": [ "javascript", "lists", diff --git a/gather/src/category/fetchAllCategories.js b/gather/src/category/fetchAllCategories.js index 38ebbfb..729cb27 100644 --- a/gather/src/category/fetchAllCategories.js +++ b/gather/src/category/fetchAllCategories.js @@ -1,22 +1,30 @@ const fetchCategory = require(`./fetchCategory`); +/** + * Fetch all the categories. + * Resolves to an object like: { categories: [...], errors: [...] }. + * Errors are per-project so there can be more errors than categories. + */ module.exports = function fetchAllCategories( githubClient, categorySources, cache ) { - let promise = Promise.resolve([]); + let promise = Promise.resolve({ categories: [], errors: [] }); categorySources.forEach(categorySource => { const index = categorySources.indexOf(categorySource); - promise = promise.then(outputList => + promise = promise.then(infoSoFar => fetchCategory( githubClient, categorySource, cache, index, categorySources.length - ).then(outputData => outputList.concat(outputData)) + ).then(({ category, errors }) => ({ + categories: infoSoFar.categories.concat([category]), + errors: infoSoFar.errors.concat(errors), + })) ); }); return promise; diff --git a/gather/src/category/fetchCategory.js b/gather/src/category/fetchCategory.js index e70f40b..389c840 100644 --- a/gather/src/category/fetchCategory.js +++ b/gather/src/category/fetchCategory.js @@ -4,8 +4,25 @@ const uniq = require(`lodash/uniq`); const fetchAllFullProjects = require(`../project/fetchAllFullProjects`); const getCleanTag = require(`../project/getCleanTag`); +function getCategoryTags(inputData) { + const allTags = inputData.tags || []; + const entities = inputData.articles || inputData.projects || []; + const entityTagNames = uniq( + entities.reduce((tags, project) => tags.concat(project.tags || []), []) + ); + entityTagNames.forEach(tagName => { + if (!allTags.find(x => x.name === tagName)) { + allTags.push({ name: tagName }); + } + }); + return allTags.map(getCleanTag); +} + /** * Given the source data for a category, fetches all the data for that category. + * Resolves to a promise like { category: {}, errors: [] }. + * If there was a problem fetching the data for one of the projects in this, + * category there will be an error in the error array. */ module.exports = function fetchCategory( githubClient, @@ -25,16 +42,7 @@ module.exports = function fetchCategory( outputData[propertyKey] = value; } }); - const manualTagNames = (categoryData.articles || - categoryData.projects || - [] - ).reduce((tags, project) => tags.concat(project.tags || []), []); - const manualTags = uniq(manualTagNames.map(tagName => ({ name: tagName }))); - outputData.tags = (categoryData.tags || []) - .concat(manualTags) - .map(getCleanTag); - outputData.notes = categoryData.notes || ``; - + outputData.tags = getCategoryTags(categoryData); // TODO: some processing on articles - perhaps just fetch the article meta image outputData.articles = !categoryData.articles ? [] @@ -46,8 +54,11 @@ module.exports = function fetchCategory( githubClient, categoryData, cache - ).then(projects => { + ).then(({ projects, errors }) => { outputData.projects = projects.map(project => project.stableObject()); - return outputData; + return { + category: outputData, + errors, + }; }); }; diff --git a/gather/src/category/writeCombinedCategoryList.js b/gather/src/category/writeCombinedCategoryList.js index f1096e4..cb93f9d 100644 --- a/gather/src/category/writeCombinedCategoryList.js +++ b/gather/src/category/writeCombinedCategoryList.js @@ -1,5 +1,6 @@ const fse = require(`fs-extra`); const path = require(`path`); +const colors = require(`colors/safe`); const fetchAllCategories = require(`./fetchAllCategories`); const paths = require(`../util/paths`); @@ -14,8 +15,9 @@ module.exports = function writeCategoryList( githubClient, categorySources, cache - ).then(categoryList => { - fse.outputJsonSync(outputPath, categoryList, { spaces: 2 }); - return categoryList; + ).then(({ categories, errors }) => { + fse.outputJsonSync(outputPath, categories, { spaces: 2 }); + console.log(colors.red(`${errors.length} errors`)); + return categories; }); }; diff --git a/gather/src/category/writeSeparateCategoryLists.js b/gather/src/category/writeSeparateCategoryLists.js index 2df6b79..c87acd2 100644 --- a/gather/src/category/writeSeparateCategoryLists.js +++ b/gather/src/category/writeSeparateCategoryLists.js @@ -7,21 +7,24 @@ module.exports = function writeSeparateCategoryLists( categorySources, cache ) { - let promise = Promise.resolve([]); + let promise = Promise.resolve({ categories: [], errors: [] }); categorySources.forEach(categorySource => { const index = categorySources.indexOf(categorySource); - promise = promise.then(outputList => + promise = promise.then(infoSoFar => fetchCategory( githubClient, categorySource, cache, index, categorySources.length - ).then(outputData => { - writeJsAndJson(paths.dataBuild, categorySource.key, outputData); + ).then(({ category, errors }) => { + writeJsAndJson(paths.dataBuild, categorySource.key, category); - return outputList.concat(outputData); + return { + categories: infoSoFar.categories.concat([category]), + errors: infoSoFar.errors.concat(errors), + }; }) ); }); diff --git a/gather/src/index.js b/gather/src/index.js index 31c2c09..b5cb672 100644 --- a/gather/src/index.js +++ b/gather/src/index.js @@ -1,6 +1,7 @@ const dotenv = require(`dotenv`); const GithubApi = require(`github`); const program = require(`commander`); +const colors = require(`colors/safe`); const categorySources = require(`../../data/source/all`); const writeSeparateCategoryLists = require(`./category/writeSeparateCategoryLists`); @@ -10,12 +11,12 @@ dotenv.config(); const githubClient = new GithubApi({ headers: { - "user-agent": process.env.GITHUB_USER_AGENT - } + "user-agent": process.env.GITHUB_USER_AGENT, + }, }); githubClient.authenticate({ type: `token`, - token: process.env.GITHUB_TOKEN + token: process.env.GITHUB_TOKEN, }); function run() { @@ -28,8 +29,17 @@ function run() { categorySources, !program.forceDownload ) - .then(categories => { + .then(({ categories, errors }) => { console.log(`\nFinished ${categories.length} categories`); + if (errors.length > 0) { + console.log( + colors.red( + `${errors.length} error${errors.length === 1 ? "" : "s"}\n` + ) + ); + } else { + console.log(colors.green(`Success`)); + } writeCatalogue(categorySources); }) .catch(error => { diff --git a/gather/src/model/FullProject.js b/gather/src/model/FullProject.js index d9a83f5..ba5d8bb 100644 --- a/gather/src/model/FullProject.js +++ b/gather/src/model/FullProject.js @@ -59,7 +59,7 @@ module.exports = class FullProject { tags: this.tags, lastStarCount: this.starCount, lastUpdatedAt: this.updatedAt, - avatarUrl: this.avatarUrl + avatarUrl: this.avatarUrl, }; } @@ -72,7 +72,7 @@ module.exports = class FullProject { sourceProject: this.sourceProject, packageJson: this.packageJson, githubData: this.githubData, - readme: this.readme + readme: this.readme, }; } diff --git a/gather/src/project/fetchAllFullProjects.js b/gather/src/project/fetchAllFullProjects.js index 0dfb034..6ebc3a8 100644 --- a/gather/src/project/fetchAllFullProjects.js +++ b/gather/src/project/fetchAllFullProjects.js @@ -2,24 +2,32 @@ const fetchFullProjectCache = require(`./fetchFullProjectCache`); const SourceProject = require(`../model/SourceProject`); const getProjectTags = require(`./getProjectTags`); +/** + * Fetch all the projects in a given category. + * Resolves to an object like { projects: [...], errors: [...] }. + * Should never return a rejection. + */ module.exports = function fetchAllFullProjects( githubClient, categoryData, cache ) { if (!categoryData.projects) { - return Promise.resolve([]); + return Promise.resolve({ projects: [], errors: [] }); } - const sourceProjects = categoryData.projects.map( - url => new SourceProject(url) - ); + const sourceProjects = categoryData.projects + .filter(x => !x.deprecated) + .map(url => new SourceProject(url)); - let promise = Promise.resolve([]); + let promise = Promise.resolve({ + projects: [], + errors: [], + }); sourceProjects.forEach(sourceProject => { const index = sourceProjects.indexOf(sourceProject); promise = promise.then( - projects => + info => // This promise is always resolved. // If there is an error while fetching a full project, we simply do not include that // project in the results. @@ -27,6 +35,7 @@ module.exports = function fetchAllFullProjects( fetchFullProjectCache( githubClient, sourceProject, + categoryData.fetchPackageJson, cache, index, sourceProjects.length @@ -35,14 +44,20 @@ module.exports = function fetchAllFullProjects( project.tags = (project.tags || []).concat( getProjectTags(project, categoryData.tags) ); - resolve(projects.concat(project)); + resolve({ + projects: info.projects.concat(project), + errors: info.errors, + }); }) .catch(err => { console.error( `Error fetching project ${sourceProject.githubPath}`, err ); - resolve(projects); + resolve({ + projects: info.projects, + errors: info.errors.concat(err), + }); }); }) ); diff --git a/gather/src/project/fetchFullProject.js b/gather/src/project/fetchFullProject.js index a3f71ad..91f2ff1 100644 --- a/gather/src/project/fetchFullProject.js +++ b/gather/src/project/fetchFullProject.js @@ -5,41 +5,31 @@ const fetchPackageJsons = require(`./fetchPackageJsons`); const mergePackageJsons = require(`./mergePackageJsons`); const FullProject = require(`../model/FullProject`); -function createFullProject(githubClient, sourceProject, outerCallback) { - // console.log('Growing repo:', repo.url); +function createFullProject( + githubClient, + sourceProject, + shouldFetchPackageJson, + outerCallback +) { if (!sourceProject || !sourceProject.url) { throw new Error(`sourceProject is null`); } - function taskOne(callback) { - fetchPackageJsons( - sourceProject.githubPath, - sourceProject.packagePaths, - (error, packageJsons) => { - if (error) { - callback(error, null); - return; - } - callback(null, mergePackageJsons(packageJsons)); - } - ); - } - - function taskTwo(callback) { + function repoDataTask(callback) { githubClient.repos.get( { owner: sourceProject.owner, - repo: sourceProject.repo + repo: sourceProject.repo, }, callback ); } - function taskThree(callback) { + function readmeTask(callback) { githubClient.repos.getReadme( { owner: sourceProject.owner, - repo: sourceProject.repo + repo: sourceProject.repo, }, (error, response) => { if (error || !response || !response.data || !response.data.content) { @@ -63,16 +53,35 @@ function createFullProject(githubClient, sourceProject, outerCallback) { ); } - async.parallel([taskOne, taskTwo, taskThree], (error, results) => { + function packageJsonTask(callback) { + fetchPackageJsons( + sourceProject.githubPath, + sourceProject.packagePaths, + (error, packageJsons) => { + if (error) { + callback(error, null); + return; + } + callback(null, mergePackageJsons(packageJsons)); + } + ); + } + + const tasks = [repoDataTask, readmeTask]; + if (shouldFetchPackageJson) { + tasks.push(packageJsonTask); + } + + async.parallel(tasks, (error, results) => { if (error) { outerCallback(error, null); return; } - const packageJson = results[0]; - const githubData = results[1]; - const readmeStr = results[2]; - if (!packageJson) { + const githubData = results[0]; + const readmeStr = results[1]; + const packageJson = results[2]; + if (sourceProject.fetchPackageJson && !packageJson) { outerCallback( new Error( `No package.json found for source project: ${sourceProject.url}` @@ -81,6 +90,20 @@ function createFullProject(githubClient, sourceProject, outerCallback) { ); return; } + if ( + githubData && + githubData.data.full_name.toLowerCase() !== + sourceProject.githubPath.toLowerCase() + ) { + outerCallback( + new Error( + `Project moved from ${sourceProject.githubPath} -> ${ + githubData.data.full_name + }` + ) + ); + return; + } const fullProject = new FullProject( sourceProject, @@ -95,23 +118,38 @@ function createFullProject(githubClient, sourceProject, outerCallback) { /** * Attempt to fetch all the data for this project a few times before giving up. */ -function fetchRetry(githubClient, sourceProject, index, total, cb) { - const logPrefix = `${colors.gray( - `[${index + 1}/${total}]` - )} ${sourceProject.githubPath}`; +function fetchRetry( + githubClient, + sourceProject, + shouldFetchPackageJson, + index, + total, + cb +) { + const logPrefix = `${colors.gray(`[${index + 1}/${total}]`)} ${ + sourceProject.githubPath + }`; let attemptNumber = 0; async.retry( 3, taskCallback => { attemptNumber += 1; - createFullProject(githubClient, sourceProject, (error, value) => { - if (error) { - console.log(`${logPrefix} Attempt #${attemptNumber} failure:`, error); - } else { - console.log(logPrefix); + createFullProject( + githubClient, + sourceProject, + shouldFetchPackageJson, + (error, value) => { + if (error) { + console.log( + `${logPrefix} Attempt #${attemptNumber} failure:`, + error + ); + } else { + console.log(logPrefix); + } + taskCallback(error, value); } - taskCallback(error, value); - }); + ); }, cb ); @@ -124,6 +162,7 @@ function fetchRetry(githubClient, sourceProject, index, total, cb) { * * @param {Object} githubClient * @param {SourceProject} sourceProject + * @param {Boolean} shouldFetchPackageJson * @param {Number} index * @param {Number} total * @return {Promise} resolves to a full project @@ -131,6 +170,7 @@ function fetchRetry(githubClient, sourceProject, index, total, cb) { module.exports = function fetchFullProject( githubClient, sourceProject, + shouldFetchPackageJson, index = 0, total = 1 ) { @@ -138,6 +178,7 @@ module.exports = function fetchFullProject( fetchRetry( githubClient, sourceProject, + shouldFetchPackageJson, index, total, (error, fullProject) => { diff --git a/gather/src/project/fetchFullProjectCache.js b/gather/src/project/fetchFullProjectCache.js index 3aa85b5..0f483f8 100644 --- a/gather/src/project/fetchFullProjectCache.js +++ b/gather/src/project/fetchFullProjectCache.js @@ -43,6 +43,7 @@ function checkCache(cache, cacheFilePath) { module.exports = function fetchFullProjectCache( githubClient, sourceProject, + shouldFetchPackageJson, cache, index = 0, total = 1 @@ -65,6 +66,7 @@ module.exports = function fetchFullProjectCache( return fetchFullProject( githubClient, sourceProject, + shouldFetchPackageJson, index, total ).then(fullProject => { diff --git a/gather/src/project/getDependencyNames.js b/gather/src/project/getDependencyNames.js index 4351d4f..f589398 100644 --- a/gather/src/project/getDependencyNames.js +++ b/gather/src/project/getDependencyNames.js @@ -7,6 +7,9 @@ const get = require(`lodash/get`); * @return {String[]} */ module.exports = function getDependencyNames(packageJson) { + if (!packageJson) { + return null; + } const dependencyNames = Object.keys(get(packageJson, `dependencies`, {})); const devDependencyNames = Object.keys( get(packageJson, `devDependencies`, {}) diff --git a/gather/src/util/paths.js b/gather/src/util/paths.js index cbcab4d..e70ee9c 100644 --- a/gather/src/util/paths.js +++ b/gather/src/util/paths.js @@ -3,5 +3,5 @@ const path = require(`path`); module.exports = { data: path.join(__dirname, `../../../data`), dataCache: path.join(__dirname, `../../../data/.cache`), - dataBuild: path.join(__dirname, `../../../dist`) + dataBuild: path.join(__dirname, `../../../dist`), }; diff --git a/package.json b/package.json index e690fab..d8b0746 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "eslint-plugin-react": "^7.4.0", "husky": "^0.14.3", "lint-staged": "^4.3.0", - "prettier": "^1.7.3", - "prettier-eslint": "^8.2.0" + "prettier": "^1.9.2", + "prettier-eslint": "^8.6.0" }, "keywords": [ "package", @@ -40,6 +40,12 @@ "precommit": "lint-staged" }, "lint-staged": { - "*.js": ["eslint --fix", "git add"] + "*.js": [ + "eslint --fix", + "git add" + ] + }, + "prettier": { + "trailingComma": "es5" } } diff --git a/public/fonts/README.md b/public/fonts/README.md new file mode 100644 index 0000000..1e4f9ba --- /dev/null +++ b/public/fonts/README.md @@ -0,0 +1,24 @@ +# Fonts Directory + +This directory contains custom fonts for the Blockchain Explorer application. + +## Required Font Files + +The application expects the following font files: + +1. **BlockchainFont-Regular.woff2** and **BlockchainFont-Regular.woff** + - Regular weight font for the main UI + +2. **BlockchainFont-Bold.woff2** and **BlockchainFont-Bold.woff** + - Bold weight font for headings + +3. **TechMono-Regular.woff2** and **TechMono-Regular.woff** + - Monospace font for code and hash displays + +## Note + +If you don't have custom fonts, the application will fall back to system fonts: +- BlockchainFont → system sans-serif fonts +- TechMono → system monospace fonts (Courier New, etc.) + +The fonts are referenced in `public/index.html` and will be loaded automatically when available. diff --git a/public/fonts/fa-brands-400.eot b/public/fonts/fa-brands-400.eot new file mode 100644 index 0000000..a1bc094 Binary files /dev/null and b/public/fonts/fa-brands-400.eot differ diff --git a/public/fonts/fa-brands-400.svg b/public/fonts/fa-brands-400.svg new file mode 100644 index 0000000..46ad237 --- /dev/null +++ b/public/fonts/fa-brands-400.svg @@ -0,0 +1,3570 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/fonts/fa-brands-400.ttf b/public/fonts/fa-brands-400.ttf new file mode 100644 index 0000000..948a2a6 Binary files /dev/null and b/public/fonts/fa-brands-400.ttf differ diff --git a/public/fonts/fa-brands-400.woff b/public/fonts/fa-brands-400.woff new file mode 100644 index 0000000..2a89d52 Binary files /dev/null and b/public/fonts/fa-brands-400.woff differ diff --git a/public/fonts/fa-brands-400.woff2 b/public/fonts/fa-brands-400.woff2 new file mode 100644 index 0000000..141a90a Binary files /dev/null and b/public/fonts/fa-brands-400.woff2 differ diff --git a/public/fonts/fa-regular-400.eot b/public/fonts/fa-regular-400.eot new file mode 100644 index 0000000..38cf251 Binary files /dev/null and b/public/fonts/fa-regular-400.eot differ diff --git a/public/fonts/fa-regular-400.svg b/public/fonts/fa-regular-400.svg new file mode 100644 index 0000000..48634a9 --- /dev/null +++ b/public/fonts/fa-regular-400.svg @@ -0,0 +1,803 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/fonts/fa-regular-400.ttf b/public/fonts/fa-regular-400.ttf new file mode 100644 index 0000000..abe99e2 Binary files /dev/null and b/public/fonts/fa-regular-400.ttf differ diff --git a/public/fonts/fa-regular-400.woff b/public/fonts/fa-regular-400.woff new file mode 100644 index 0000000..24de566 Binary files /dev/null and b/public/fonts/fa-regular-400.woff differ diff --git a/public/fonts/fa-regular-400.woff2 b/public/fonts/fa-regular-400.woff2 new file mode 100644 index 0000000..7e0118e Binary files /dev/null and b/public/fonts/fa-regular-400.woff2 differ diff --git a/public/fonts/fa-solid-900.eot b/public/fonts/fa-solid-900.eot new file mode 100644 index 0000000..d3b77c2 Binary files /dev/null and b/public/fonts/fa-solid-900.eot differ diff --git a/public/fonts/fa-solid-900.svg b/public/fonts/fa-solid-900.svg new file mode 100644 index 0000000..7742838 --- /dev/null +++ b/public/fonts/fa-solid-900.svg @@ -0,0 +1,4938 @@ + + + + + +Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/fonts/fa-solid-900.ttf b/public/fonts/fa-solid-900.ttf new file mode 100644 index 0000000..5b97903 Binary files /dev/null and b/public/fonts/fa-solid-900.ttf differ diff --git a/public/fonts/fa-solid-900.woff b/public/fonts/fa-solid-900.woff new file mode 100644 index 0000000..beec791 Binary files /dev/null and b/public/fonts/fa-solid-900.woff differ diff --git a/public/fonts/fa-solid-900.woff2 b/public/fonts/fa-solid-900.woff2 new file mode 100644 index 0000000..978a681 Binary files /dev/null and b/public/fonts/fa-solid-900.woff2 differ diff --git a/yarn.lock b/yarn.lock index 69494e0..58ecaec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,10 @@ acorn@^5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" +acorn@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" + ajv-keywords@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.0.tgz#a296e17f7bfae7c1ce4f7e0de53d29cb32162df0" @@ -29,6 +33,15 @@ ajv@^5.2.0, ajv@^5.2.3: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -37,7 +50,7 @@ ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" -ansi-regex@^2.0.0, ansi-regex@^2.1.1: +ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -49,7 +62,7 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.0.0, ansi-styles@^3.1.0, ansi-styles@^3.2.0: +ansi-styles@^3.1.0, ansi-styles@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: @@ -819,7 +832,7 @@ debug@^2.6.8: dependencies: ms "2.0.0" -debug@^3.0.1: +debug@^3.0.1, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -872,6 +885,12 @@ doctrine@^2.0.0: esutils "^2.0.2" isarray "^1.0.0" +doctrine@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.2.tgz#68f96ce8efc56cc42651f1faadb4f175273b0075" + dependencies: + esutils "^2.0.2" + electron-to-chromium@^1.3.24: version "1.3.27" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" @@ -1010,7 +1029,53 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@^4.10.0, eslint@^4.5.0: +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^4.0.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.14.0.tgz#96609768d1dd23304faba2d94b7fefe5a5447a82" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.0.2" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.2" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "^4.0.1" + text-table "~0.2.0" + +eslint@^4.10.0: version "4.10.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.10.0.tgz#f25d0d7955c81968c2309aa5c9a229e045176bb7" dependencies: @@ -1059,6 +1124,13 @@ espree@^3.5.1: acorn "^5.1.1" acorn-jsx "^3.0.0" +espree@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" + dependencies: + acorn "^5.2.1" + acorn-jsx "^3.0.0" + esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -1221,6 +1293,10 @@ globals@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/globals/-/globals-10.1.0.tgz#4425a1881be0d336b4a823a82a7be725d5dd987c" +globals@^11.0.1: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.1.0.tgz#632644457f5f0e3ae711807183700ebf2e4633e4" + globals@^9.17.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -1490,6 +1566,10 @@ json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -1883,32 +1963,25 @@ prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" -prettier-eslint@^8.2.0: - version "8.2.1" - resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.2.1.tgz#cd66cf8b1a2c2fce2217f1b28474809031b9a77c" +prettier-eslint@^8.6.0: + version "8.6.0" + resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-8.6.0.tgz#b88af92d1a630a1dc2f504fbfe56dca3f6b3aaff" dependencies: common-tags "^1.4.0" dlv "^1.1.0" - eslint "^4.5.0" + eslint "^4.0.0" indent-string "^3.2.0" lodash.merge "^4.6.0" loglevel-colored-level-prefix "^1.0.0" - prettier "^1.7.1" - pretty-format "^20.0.3" + prettier "^1.7.0" + pretty-format "^22.0.3" require-relative "^0.8.7" typescript "^2.5.1" - typescript-eslint-parser "^8.0.0" + typescript-eslint-parser "^11.0.0" -prettier@^1.7.1, prettier@^1.7.3: - version "1.7.4" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.7.4.tgz#5e8624ae9363c80f95ec644584ecdf55d74f93fa" - -pretty-format@^20.0.3: - version "20.0.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14" - dependencies: - ansi-regex "^2.1.1" - ansi-styles "^3.0.0" +prettier@^1.7.0, prettier@^1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.9.2.tgz#96bc2132f7a32338e6078aeb29727178c6335827" pretty-format@^21.2.1: version "21.2.1" @@ -1917,6 +1990,13 @@ pretty-format@^21.2.1: ansi-regex "^3.0.0" ansi-styles "^3.2.0" +pretty-format@^22.0.3: + version "22.0.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.0.3.tgz#a2bfa59fc33ad24aa4429981bb52524b41ba5dd7" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + private@^0.1.6, private@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -2283,9 +2363,9 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript-eslint-parser@^8.0.0: - version "8.0.1" - resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-8.0.1.tgz#e8cac537d996e16c3dbb0d7c4d509799e67afe0c" +typescript-eslint-parser@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-11.0.0.tgz#37dba6a0130dd307504aa4b4b21b0d3dc7d4e9f2" dependencies: lodash.unescape "4.0.1" semver "5.4.1"