diff --git a/CHANGELOG.md b/CHANGELOG.md index 47338570..a1d9fbd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,22 @@ # Solid React Application Generator +## 0.6.0 (August 14, 2019) + +#### Solid React Application Base + +##### Added +* New Tic-Tac-Toe Game + * Demonstrates key Solid functionality such as: + * Discovering where a user wants their application data to be stored + * Creating application-specific files and folders + * Managing permissions of files and folders + * Discovering a global inbox + * Sending game invite notifications to a global inbox + * Creating and/or discovering an application-specific inbox + * Sending application-specific notifications to the application inbox + * Granting access to different Pods, to allow opponents to read data from and write data to your Pod + * Interoperable notification data structure, so notifications in the global inbox can be read by any compatible application + ## 0.5.2 (June 19, 2019) #### Solid React Application Base @@ -11,7 +28,7 @@ ##### Fixed * Fixed some missing error translations -## 0.5.1 (June 5, 2019) +## 0.5.1 (June 5, 2019) #### Solid React Application Base diff --git a/README.md b/README.md index 33ab277e..e4e341c7 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ In the event you want more specific errors in a given component, you can call Er } > - + ``` ## Internationalization @@ -151,9 +151,22 @@ To add a new language: Once those two steps are complete then the new language should be compatible with the generated application. +## Access Control +When building new apps, it's crucial to be able to create and manage access to files and containers. Currently your application requests permissions when the user first authenticates, granting permissions to your application. + +However, many applications will also need to create files or containers and grant access to other people. To that end, the SDK includes examples of creating files and granting access to other users. + +For more information, please see the solid-react-components. + +## Notifications +A key part of modern web applications is notifications. Alongside the solid-react-components library, the generated application now has built-in real time notifications. It reads from both the global inbox (if there is one) and the application-specific inbox that the app generates using the components library. + +Notifications are generated via the TicTacToe game example. Invites are sent to webIDs provided in the game creation form, and whenever a move is taken in the game a notification is sent to the opponent. + ## Deployment Once your application is ready, you can deploy it to a server of your choice. It is ***highly recommended*** that you ensure your server is utilizing TLS. If not, you may encounter security-related errors in the browser, particularly in Google Chrome. + diff --git a/generators/app/templates/.env b/generators/app/templates/.env index dddb7195..dc00ae15 100644 --- a/generators/app/templates/.env +++ b/generators/app/templates/.env @@ -1,3 +1,4 @@ +REACT_APP_TICTAC_PATH=public/games/tictactoe/ REACT_APP_VERSION=$npm_package_version REACT_APP_NAME=$npm_package_name -REACT_APP_COMPANY_NAME='inrupt Inc.' +REACT_APP_COMPANY_NAME=inrupt Inc. diff --git a/generators/app/templates/.env.example b/generators/app/templates/.env.example new file mode 100644 index 00000000..6a97b496 --- /dev/null +++ b/generators/app/templates/.env.example @@ -0,0 +1,4 @@ +REACT_APP_TICTAC_PATH=public/game/tictactoe/ +REACT_APP_VERSION=$npm_package_version +REACT_APP_NAME=$npm_package_name +REACT_APP_COMPANY_NAME=inrupt Inc. diff --git a/generators/app/templates/.eslintrc b/generators/app/templates/.eslintrc new file mode 100644 index 00000000..49d2efa0 --- /dev/null +++ b/generators/app/templates/.eslintrc @@ -0,0 +1,36 @@ +{ + "parser": "babel-eslint", + "extends": ["react-app", "airbnb", "prettier"], + "plugins": ["react", "prettier", "import"], + "rules": { + "prettier/prettier": [1], + "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }], + "no-underscore-dangle": [0], + "import/no-unresolved": [0], + "no-unused-vars": [1], + "react/prop-types": [1], + "no-shadow": [0], + "no-restricted-syntax": [0], + "consistent-return": [0], + "import/prefer-default-export": [0], + "import/no-cycle": [0], + "quotes": [1, "single"], + "react/no-array-index-key": [1], + "react/jsx-one-expression-per-line": [0], + "react/no-unescaped-entities": [0], + "import/no-named-as-default": [0], + "linebreak-style": [0], + "jsx-a11y/label-has-associated-control": [0], + "jsx-a11y/label-has-for": [0] + }, + "parserOptions": { + "ecmaFeatures": { + "jsx": true, + "modules": true + } + }, + "env": { + "browser": true, + "jest": true + } +} diff --git a/generators/app/templates/.prettierrc b/generators/app/templates/.prettierrc new file mode 100644 index 00000000..554f2a3b --- /dev/null +++ b/generators/app/templates/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "printWidth": 100 +} diff --git a/generators/app/templates/config/env.js b/generators/app/templates/config/env.js index a3eef254..a75c57ff 100644 --- a/generators/app/templates/config/env.js +++ b/generators/app/templates/config/env.js @@ -1,3 +1,4 @@ +/* eslint-disable */ const fs = require('fs'); const path = require('path'); const paths = require('./paths'); @@ -7,9 +8,7 @@ delete require.cache[require.resolve('./paths')]; const NODE_ENV = process.env.NODE_ENV; if (!NODE_ENV) { - throw new Error( - 'The NODE_ENV environment variable is required but was not specified.' - ); + throw new Error('The NODE_ENV environment variable is required but was not specified.'); } // https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use @@ -20,7 +19,7 @@ var dotenvFiles = [ // since normally you expect test to produce the same // results for everyone NODE_ENV !== 'test' && `${paths.dotenv}.local`, - paths.dotenv, + paths.dotenv ].filter(Boolean); // Load environment variables from .env* files. Suppress warnings using silent @@ -32,7 +31,7 @@ dotenvFiles.forEach(dotenvFile => { if (fs.existsSync(dotenvFile)) { require('dotenv-expand')( require('dotenv').config({ - path: dotenvFile, + path: dotenvFile }) ); } @@ -74,7 +73,7 @@ function getClientEnvironment(publicUrl) { // For example, . // This should only be used as an escape hatch. Normally you would put // images into the `src` and `import` them in code to get their paths. - PUBLIC_URL: publicUrl, + PUBLIC_URL: publicUrl } ); // Stringify all values so we can feed into Webpack DefinePlugin @@ -82,7 +81,7 @@ function getClientEnvironment(publicUrl) { 'process.env': Object.keys(raw).reduce((env, key) => { env[key] = JSON.stringify(raw[key]); return env; - }, {}), + }, {}) }; return { raw, stringified }; diff --git a/generators/app/templates/config/jest/cssTransform.js b/generators/app/templates/config/jest/cssTransform.js index d3612352..e9c68de2 100644 --- a/generators/app/templates/config/jest/cssTransform.js +++ b/generators/app/templates/config/jest/cssTransform.js @@ -8,5 +8,5 @@ module.exports = { getCacheKey() { // The output is always the same. return 'cssTransform'; - }, + } }; diff --git a/generators/app/templates/config/jest/fileTransform.js b/generators/app/templates/config/jest/fileTransform.js index 166b8672..18818044 100644 --- a/generators/app/templates/config/jest/fileTransform.js +++ b/generators/app/templates/config/jest/fileTransform.js @@ -24,5 +24,5 @@ module.exports = { } return `module.exports = ${assetFilename};`; - }, + } }; diff --git a/generators/app/templates/config/paths.js b/generators/app/templates/config/paths.js index cc188e45..fce21123 100644 --- a/generators/app/templates/config/paths.js +++ b/generators/app/templates/config/paths.js @@ -1,3 +1,4 @@ +/* eslint-disable */ const path = require('path'); const fs = require('fs'); const url = require('url'); @@ -20,8 +21,7 @@ function ensureSlash(inputPath, needsSlash) { } } -const getPublicUrl = appPackageJson => - envPublicUrl || require(appPackageJson).homepage; +const getPublicUrl = appPackageJson => envPublicUrl || require(appPackageJson).homepage; // We use `PUBLIC_URL` environment variable or "homepage" field to infer // "public path" at which the app is served. @@ -31,8 +31,7 @@ const getPublicUrl = appPackageJson => // like /todos/42/static/js/bundle.7289d.js. We have to know the root. function getServedPath(appPackageJson) { const publicUrl = getPublicUrl(appPackageJson); - const servedUrl = - envPublicUrl || (publicUrl ? url.parse(publicUrl).pathname : '/'); + const servedUrl = envPublicUrl || (publicUrl ? url.parse(publicUrl).pathname : '/'); return ensureSlash(servedUrl, true); } @@ -47,7 +46,7 @@ const moduleFileExtensions = [ 'tsx', 'json', 'web.jsx', - 'jsx', + 'jsx' ]; // Resolve file paths in the same order as webpack @@ -79,9 +78,7 @@ module.exports = { proxySetup: resolveApp('src/setupProxy.js'), appNodeModules: resolveApp('node_modules'), publicUrl: getPublicUrl(resolveApp('package.json')), - servedPath: getServedPath(resolveApp('package.json')), + servedPath: getServedPath(resolveApp('package.json')) }; - - module.exports.moduleFileExtensions = moduleFileExtensions; diff --git a/generators/app/templates/config/webpack.config.js b/generators/app/templates/config/webpack.config.js index 72e27210..703115ae 100644 --- a/generators/app/templates/config/webpack.config.js +++ b/generators/app/templates/config/webpack.config.js @@ -1,37 +1,36 @@ -""; +/* eslint-disable */ +const fs = require('fs'); +const path = require('path'); +const webpack = require('webpack'); +const resolve = require('resolve'); +const PnpWebpackPlugin = require('pnp-webpack-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); +const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); +const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin'); +const TerserPlugin = require('terser-webpack-plugin'); +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); +const safePostCssParser = require('postcss-safe-parser'); +const ManifestPlugin = require('webpack-manifest-plugin'); +const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); +const WorkboxWebpackPlugin = require('workbox-webpack-plugin'); +const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); +const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); +const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent'); +const paths = require('./paths'); +const getClientEnvironment = require('./env'); +const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin'); +const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin-alt'); +const typescriptFormatter = require('react-dev-utils/typescriptFormatter'); -const fs = require("fs"); -const path = require("path"); -const webpack = require("webpack"); -const resolve = require("resolve"); -const PnpWebpackPlugin = require("pnp-webpack-plugin"); -const HtmlWebpackPlugin = require("html-webpack-plugin"); -const CaseSensitivePathsPlugin = require("case-sensitive-paths-webpack-plugin"); -const InlineChunkHtmlPlugin = require("react-dev-utils/InlineChunkHtmlPlugin"); -const TerserPlugin = require("terser-webpack-plugin"); -const MiniCssExtractPlugin = require("mini-css-extract-plugin"); -const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin"); -const safePostCssParser = require("postcss-safe-parser"); -const ManifestPlugin = require("webpack-manifest-plugin"); -const InterpolateHtmlPlugin = require("react-dev-utils/InterpolateHtmlPlugin"); -const WorkboxWebpackPlugin = require("workbox-webpack-plugin"); -const WatchMissingNodeModulesPlugin = require("react-dev-utils/WatchMissingNodeModulesPlugin"); -const ModuleScopePlugin = require("react-dev-utils/ModuleScopePlugin"); -const getCSSModuleLocalIdent = require("react-dev-utils/getCSSModuleLocalIdent"); -const paths = require("./paths"); -const getClientEnvironment = require("./env"); -const ModuleNotFoundPlugin = require("react-dev-utils/ModuleNotFoundPlugin"); -const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin-alt"); -const typescriptFormatter = require("react-dev-utils/typescriptFormatter"); - -const CopyWebpackPlugin = require("copy-webpack-plugin"); -const HtmlWebpackIncludeAssetsPlugin = require("html-webpack-include-assets-plugin"); +const CopyWebpackPlugin = require('copy-webpack-plugin'); +const HtmlWebpackIncludeAssetsPlugin = require('html-webpack-include-assets-plugin'); // Source maps are resource heavy and can cause out of memory issue for large source files. -const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== "false"; +const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false'; // Some apps do not need the benefits of saving a web request, so not inlining the chunk // makes for a smoother build process. -const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== "false"; +const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== 'false'; // Check if TypeScript is setup const useTypeScript = fs.existsSync(paths.appTsConfig); @@ -43,67 +42,63 @@ const sassRegex = /\.(scss|sass)$/; const sassModuleRegex = /\.module\.(scss|sass)$/; const externalAssets = [ - "solid-auth-client/dist-popup/popup.html", - "solid-auth-client/dist-lib/solid-auth-client.bundle.js", - "solid-auth-client/dist-lib/solid-auth-client.bundle.js.map", - "@solid/query-ldflex/dist/solid-query-ldflex.bundle.js", - "@solid/query-ldflex/dist/solid-query-ldflex.bundle.js.map" + 'solid-auth-client/dist-popup/popup.html', + 'solid-auth-client/dist-lib/solid-auth-client.bundle.js', + 'solid-auth-client/dist-lib/solid-auth-client.bundle.js.map', + '@solid/query-ldflex/dist/solid-query-ldflex.bundle.js', + '@solid/query-ldflex/dist/solid-query-ldflex.bundle.js.map' ]; // This is the production and development configuration. // It is focused on developer experience, fast rebuilds, and a minimal bundle. module.exports = function(webpackEnv) { - const isEnvDevelopment = webpackEnv === "development"; - const isEnvProduction = webpackEnv === "production"; + const isEnvDevelopment = webpackEnv === 'development'; + const isEnvProduction = webpackEnv === 'production'; // Webpack uses `publicPath` to determine where the app is being served from. // It requires a trailing slash, or the file assets will get an incorrect path. // In development, we always serve from the root. This makes config easier. - const publicPath = isEnvProduction - ? paths.servedPath - : isEnvDevelopment && "/"; + const publicPath = isEnvProduction ? paths.servedPath : isEnvDevelopment && '/'; // Some apps do not use client-side routing with pushState. // For these, "homepage" can be set to "." to enable relative asset paths. - const shouldUseRelativeAssetPaths = publicPath === "./"; + const shouldUseRelativeAssetPaths = publicPath === './'; // `publicUrl` is just like `publicPath`, but we will provide it to our app // as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript. // Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz. - const publicUrl = isEnvProduction - ? publicPath.slice(0, -1) - : isEnvDevelopment && ""; + const publicUrl = isEnvProduction ? publicPath.slice(0, -1) : isEnvDevelopment && ''; // Get environment variables to inject into our app. const env = getClientEnvironment(publicUrl); // common function to get style loaders const getStyleLoaders = (cssOptions, preProcessor) => { const loaders = [ - isEnvDevelopment && require.resolve("style-loader"), + isEnvDevelopment && require.resolve('style-loader'), isEnvProduction && { loader: MiniCssExtractPlugin.loader, options: Object.assign( {}, - shouldUseRelativeAssetPaths ? { publicPath: "../../" } : undefined + shouldUseRelativeAssetPaths ? { publicPath: '../../' } : undefined ) }, { - loader: require.resolve("css-loader"), + loader: require.resolve('css-loader'), options: cssOptions }, { // Options for PostCSS as we reference these options twice // Adds vendor prefixing based on your specified browser support in // package.json - loader: require.resolve("postcss-loader"), + loader: require.resolve('postcss-loader'), options: { // Necessary for external CSS imports to work // https://github.com/facebook/create-react-app/issues/2677 - ident: "postcss", + ident: 'postcss', plugins: () => [ - require("postcss-flexbugs-fixes"), - require("postcss-preset-env")({ + require('postcss-flexbugs-fixes'), + require('postcss-preset-env')({ autoprefixer: { - flexbox: "no-2009" + flexbox: 'no-2009' }, stage: 3 }) @@ -124,14 +119,14 @@ module.exports = function(webpackEnv) { }; return { - mode: isEnvProduction ? "production" : isEnvDevelopment && "development", + mode: isEnvProduction ? 'production' : isEnvDevelopment && 'development', // Stop compilation early in production bail: isEnvProduction, devtool: isEnvProduction ? shouldUseSourceMap - ? "source-map" + ? 'source-map' : false - : isEnvDevelopment && "cheap-module-source-map", + : isEnvDevelopment && 'cheap-module-source-map', // These are the "entry points" to our application. // This means they will be the "root" imports that are included in JS bundle. entry: [ @@ -145,8 +140,7 @@ module.exports = function(webpackEnv) { // the line below with these two lines if you prefer the stock client: // require.resolve('webpack-dev-server/client') + '?/', // require.resolve('webpack/hot/dev-server'), - isEnvDevelopment && - require.resolve("react-dev-utils/webpackHotDevClient"), + isEnvDevelopment && require.resolve('react-dev-utils/webpackHotDevClient'), // Finally, this is your app's code: paths.appIndexJs // We include the app code last so that if there is a runtime error during @@ -161,23 +155,19 @@ module.exports = function(webpackEnv) { // There will be one main bundle, and one file per asynchronous chunk. // In development, it does not produce real files. filename: isEnvProduction - ? "static/js/[name].[chunkhash:8].js" - : isEnvDevelopment && "static/js/bundle.js", + ? 'static/js/[name].[chunkhash:8].js' + : isEnvDevelopment && 'static/js/bundle.js', // There are also additional JS chunk files if you use code splitting. chunkFilename: isEnvProduction - ? "static/js/[name].[chunkhash:8].chunk.js" - : isEnvDevelopment && "static/js/[name].chunk.js", + ? 'static/js/[name].[chunkhash:8].chunk.js' + : isEnvDevelopment && 'static/js/[name].chunk.js', // We inferred the "public path" (such as / or /my-project) from homepage. // We use "/" in development. publicPath: publicPath, // Point sourcemap entries to original disk location (format as URL on Windows) devtoolModuleFilenameTemplate: isEnvProduction - ? info => - path - .relative(paths.appSrc, info.absoluteResourcePath) - .replace(/\\/g, "/") - : isEnvDevelopment && - (info => path.resolve(info.absoluteResourcePath).replace(/\\/g, "/")) + ? info => path.relative(paths.appSrc, info.absoluteResourcePath).replace(/\\/g, '/') + : isEnvDevelopment && (info => path.resolve(info.absoluteResourcePath).replace(/\\/g, '/')) }, optimization: { minimize: isEnvProduction, @@ -246,7 +236,7 @@ module.exports = function(webpackEnv) { // https://twitter.com/wSokra/status/969633336732905474 // https://medium.com/webpack/webpack-4-code-splitting-chunk-graph-and-the-splitchunks-optimization-be739a861366 splitChunks: { - chunks: "all", + chunks: 'all', name: false }, // Keep the runtime chunk separated to enable long term caching @@ -258,7 +248,7 @@ module.exports = function(webpackEnv) { // We placed these paths second because we want `node_modules` to "win" // if there are any conflicts. This matches Node resolution mechanism. // https://github.com/facebook/create-react-app/issues/253 - modules: ["node_modules"].concat( + modules: ['node_modules'].concat( // It is guaranteed to exist because we tweak it in `env.js` process.env.NODE_PATH.split(path.delimiter).filter(Boolean) ), @@ -270,12 +260,12 @@ module.exports = function(webpackEnv) { // for React Native Web. extensions: paths.moduleFileExtensions .map(ext => `.${ext}`) - .filter(ext => useTypeScript || !ext.includes("ts")), + .filter(ext => useTypeScript || !ext.includes('ts')), alias: { - react: require.resolve("react"), + react: require.resolve('react'), // Support React Native Web // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ - "react-native": "react-native-web" + 'react-native': 'react-native-web' }, plugins: [ // Adds support for installing with Plug'n'Play, leading to faster installs and adding @@ -306,14 +296,14 @@ module.exports = function(webpackEnv) { // It's important to do this before Babel processes the JS. { test: /\.(js|mjs|jsx)$/, - enforce: "pre", + enforce: 'pre', use: [ { options: { - formatter: require.resolve("react-dev-utils/eslintFormatter"), - eslintPath: require.resolve("eslint") + formatter: require.resolve('react-dev-utils/eslintFormatter'), + eslintPath: require.resolve('eslint') }, - loader: require.resolve("eslint-loader") + loader: require.resolve('eslint-loader') } ], include: paths.appSrc @@ -328,10 +318,10 @@ module.exports = function(webpackEnv) { // A missing `test` is equivalent to a match. { test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/], - loader: require.resolve("url-loader"), + loader: require.resolve('url-loader'), options: { limit: 10000, - name: "static/media/[name].[hash:8].[ext]" + name: 'static/media/[name].[hash:8].[ext]' } }, // Process application JS with Babel. @@ -339,19 +329,17 @@ module.exports = function(webpackEnv) { { test: /\.(js|mjs|jsx|ts|tsx)$/, include: paths.appSrc, - loader: require.resolve("babel-loader"), + loader: require.resolve('babel-loader'), options: { - customize: require.resolve( - "babel-preset-react-app/webpack-overrides" - ), + customize: require.resolve('babel-preset-react-app/webpack-overrides'), plugins: [ [ - require.resolve("babel-plugin-named-asset-import"), + require.resolve('babel-plugin-named-asset-import'), { loaderMap: { svg: { - ReactComponent: "@svgr/webpack?-prettier,-svgo![path]" + ReactComponent: '@svgr/webpack?-prettier,-svgo![path]' } } } @@ -370,16 +358,13 @@ module.exports = function(webpackEnv) { { test: /\.(js|mjs)$/, exclude: /@babel(?:\/|\\{1,2})runtime/, - loader: require.resolve("babel-loader"), + loader: require.resolve('babel-loader'), options: { babelrc: false, configFile: false, compact: false, presets: [ - [ - require.resolve("babel-preset-react-app/dependencies"), - { helpers: true } - ] + [require.resolve('babel-preset-react-app/dependencies'), { helpers: true }] ], cacheDirectory: true, cacheCompression: isEnvProduction, @@ -433,7 +418,7 @@ module.exports = function(webpackEnv) { importLoaders: 2, sourceMap: isEnvProduction && shouldUseSourceMap }, - "sass-loader" + 'sass-loader' ), // Don't consider CSS imports dead code even if the // containing package claims to have no side effects. @@ -452,7 +437,7 @@ module.exports = function(webpackEnv) { modules: true, getLocalIdent: getCSSModuleLocalIdent }, - "sass-loader" + 'sass-loader' ) }, // "file" loader makes sure those assets get served by WebpackDevServer. @@ -461,14 +446,14 @@ module.exports = function(webpackEnv) { // This loader doesn't use a "test" so it will catch all modules // that fall through the other loaders. { - loader: require.resolve("file-loader"), + loader: require.resolve('file-loader'), // Exclude `js` files to keep "css" loader working as it injects // its runtime that would otherwise be processed through "file" loader. // Also exclude `html` and `json` extensions so they get processed // by webpacks internal loaders. exclude: [/\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.json$/], options: { - name: "static/media/[name].[hash:8].[ext]" + name: 'static/media/[name].[hash:8].[ext]' } } // ** STOP ** Are you adding a new loader? @@ -481,7 +466,7 @@ module.exports = function(webpackEnv) { new CopyWebpackPlugin(externalAssets.map(a => require.resolve(a))), new HtmlWebpackIncludeAssetsPlugin({ - assets: [...externalAssets.map(f => f.replace(/.*\//, ""))].filter(f => + assets: [...externalAssets.map(f => f.replace(/.*\//, ''))].filter(f => /\.(js|css)$/.test(f) ), append: false @@ -543,20 +528,19 @@ module.exports = function(webpackEnv) { // to restart the development server for Webpack to discover it. This plugin // makes the discovery automatic so you don't have to restart. // See https://github.com/facebook/create-react-app/issues/186 - isEnvDevelopment && - new WatchMissingNodeModulesPlugin(paths.appNodeModules), + isEnvDevelopment && new WatchMissingNodeModulesPlugin(paths.appNodeModules), isEnvProduction && new MiniCssExtractPlugin({ // Options similar to the same options in webpackOptions.output // both options are optional - filename: "static/css/[name].[contenthash:8].css", - chunkFilename: "static/css/[name].[contenthash:8].chunk.css" + filename: 'static/css/[name].[contenthash:8].css', + chunkFilename: 'static/css/[name].[contenthash:8].chunk.css' }), // Generate a manifest file which contains a mapping of all asset filenames // to their corresponding output file so that tools can pick it up without // having to parse `index.html`. new ManifestPlugin({ - fileName: "asset-manifest.json", + fileName: 'asset-manifest.json', publicPath: publicPath }), // Moment.js is an extremely popular library that bundles large locale files @@ -571,40 +555,40 @@ module.exports = function(webpackEnv) { new WorkboxWebpackPlugin.GenerateSW({ clientsClaim: true, exclude: [/\.map$/, /asset-manifest\.json$/], - importWorkboxFrom: "cdn", - navigateFallback: publicUrl + "/index.html", + importWorkboxFrom: 'cdn', + navigateFallback: publicUrl + '/index.html', navigateFallbackBlacklist: [ // Exclude URLs starting with /_, as they're likely an API call - new RegExp("^/_"), + new RegExp('^/_'), // Exclude URLs containing a dot, as they're likely a resource in // public/ and not a SPA route - new RegExp("/[^/]+\\.[^/]+$") + new RegExp('/[^/]+\\.[^/]+$') ] }), // TypeScript type checking useTypeScript && new ForkTsCheckerWebpackPlugin({ - typescript: resolve.sync("typescript", { + typescript: resolve.sync('typescript', { basedir: paths.appNodeModules }), async: false, checkSyntacticErrors: true, tsconfig: paths.appTsConfig, compilerOptions: { - module: "esnext", - moduleResolution: "node", + module: 'esnext', + moduleResolution: 'node', resolveJsonModule: true, isolatedModules: true, noEmit: true, - jsx: "preserve" + jsx: 'preserve' }, reportFiles: [ - "**", - "!**/*.json", - "!**/__tests__/**", - "!**/?(*.)(spec|test).*", - "!**/src/setupProxy.*", - "!**/src/setupTests.*" + '**', + '!**/*.json', + '!**/__tests__/**', + '!**/?(*.)(spec|test).*', + '!**/src/setupProxy.*', + '!**/src/setupTests.*' ], watch: paths.appSrc, silent: true, @@ -614,17 +598,17 @@ module.exports = function(webpackEnv) { // CRL: add externals block since it's a library // no need to ship React since it's shipped with the main app externals: { - "solid-auth-client": ["solid", "auth"], - "@solid/query-ldflex": ["solid", "data"] + 'solid-auth-client': ['solid', 'auth'], + '@solid/query-ldflex': ['solid', 'data'] }, // Some libraries import Node modules but don't use them in the browser. // Tell Webpack to provide empty mocks for them so importing them works. node: { - dgram: "empty", - fs: "empty", - net: "empty", - tls: "empty", - child_process: "empty" + dgram: 'empty', + fs: 'empty', + net: 'empty', + tls: 'empty', + child_process: 'empty' }, // Turn off performance processing because we utilize // our own hints via the FileSizeReporter diff --git a/generators/app/templates/config/webpackDevServer.config.js b/generators/app/templates/config/webpackDevServer.config.js index 285ced4f..65c81c36 100644 --- a/generators/app/templates/config/webpackDevServer.config.js +++ b/generators/app/templates/config/webpackDevServer.config.js @@ -1,3 +1,4 @@ +/* eslint-disable */ const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware'); const evalSourceMapMiddleware = require('react-dev-utils/evalSourceMapMiddleware'); const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware'); @@ -26,8 +27,7 @@ module.exports = function(proxy, allowedHost) { // So we will disable the host check normally, but enable it if you have // specified the `proxy` setting. Finally, we let you override it if you // really know what you're doing with a special environment variable. - disableHostCheck: - !proxy || process.env.DANGEROUSLY_DISABLE_HOST_CHECK === 'true', + disableHostCheck: !proxy || process.env.DANGEROUSLY_DISABLE_HOST_CHECK === 'true', // Enable gzip compression of generated files. compress: true, // Silence WebpackDevServer's own logs since they're generally not useful. @@ -67,7 +67,7 @@ module.exports = function(proxy, allowedHost) { // src/node_modules is not ignored to support absolute imports // https://github.com/facebook/create-react-app/issues/1065 watchOptions: { - ignored: ignoredFiles(paths.appSrc), + ignored: ignoredFiles(paths.appSrc) }, // Enable HTTPS if the HTTPS environment variable is set to 'true' https: protocol === 'https', @@ -76,7 +76,7 @@ module.exports = function(proxy, allowedHost) { historyApiFallback: { // Paths with dots should still use the history fallback. // See https://github.com/facebook/create-react-app/issues/387. - disableDotRule: true, + disableDotRule: true }, public: allowedHost, proxy, @@ -97,6 +97,6 @@ module.exports = function(proxy, allowedHost) { // it used the same host and port. // https://github.com/facebook/create-react-app/issues/2272#issuecomment-302832432 app.use(noopServiceWorkerMiddleware()); - }, + } }; }; diff --git a/generators/app/templates/package-lock.json b/generators/app/templates/package-lock.json index e73c2858..2c25b99d 100644 --- a/generators/app/templates/package-lock.json +++ b/generators/app/templates/package-lock.json @@ -1855,14 +1855,6 @@ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.6.6.tgz", "integrity": "sha512-ojhgxzUHZ7am3D2jHkMzPpsBAiB005GF5YU4ea+8DNPybMk01JJUM9V9YRlF/GE95tcOm8DxQvWA2jq19bGalQ==" }, - "@emotion/is-prop-valid": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.6.8.tgz", - "integrity": "sha512-IMSL7ekYhmFlILXcouA6ket3vV7u9BqStlXzbKOF9HBtpUPMMlHU+bBxrLOa2NvleVwNIxeq/zL8LafLbeUXcA==", - "requires": { - "@emotion/memoize": "^0.6.6" - } - }, "@emotion/memoize": { "version": "0.6.6", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.6.6.tgz", @@ -1961,28 +1953,57 @@ } }, "@inrupt/solid-react-components": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@inrupt/solid-react-components/-/solid-react-components-0.4.3.tgz", - "integrity": "sha512-E+YhTdrnQsGmrCdCgCaAPy2vG+40qo22ihHv+570+cODoGNMX3BvG+dVfMPOqRvXAwYg9Ybj1WFs3mkiQuencg==", + "version": "0.4.4-rc.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/@inrupt/solid-react-components/-/solid-react-components-0.4.4-rc.0.tgz", + "integrity": "sha512-l7Xfc2Uzmxhw2zYryenyNDz3wef+zjT/F7ZVboCi7iaXnS8aOE+mXPOZNNyDuiNoWAq/b46oFJTPw/QhWhL7kQ==", "requires": { "@babel/runtime": "^7.1.2", "@rdfjs/data-model": "^1.1.1", "@shexjs/core": "^1.0.0-alpha.4", "@shexjs/parser": "^1.0.0-alpha.4", - "@solid/query-ldflex": "^2.5.1", "@solid/react": "^1.6.0", "file-type": "^10.7.1", "html-webpack-include-assets-plugin": "^1.0.6", + "jsonld": "^1.6.2", + "ldflex": "^2.4.0", + "lodash": "^4.17.15", "mime-types": "^2.1.24", + "moment": "^2.24.0", + "n3": "^1.1.1", + "rdflib": "^0.20.1", "react-router-dom": "^4.3.1", "react-select": "^2.2.0", "solid-auth-client": "^2.3.0", + "unique": "0.0.1", "unique-string": "^1.0.0" + }, + "dependencies": { + "jsonld": { + "version": "1.6.2", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/jsonld/-/jsonld-1.6.2.tgz", + "integrity": "sha512-eMzFHqhF2kPMrMUjw8+Lz9IF1QkrxTOIfVndkP/OpuoZs31VdDtfDs8mLa5EOC/ROdemFTQGLdYPZbRtmMe2Yw==", + "requires": { + "rdf-canonize": "^1.0.2", + "request": "^2.88.0", + "semver": "^5.6.0", + "xmldom": "0.1.19" + } + }, + "ldflex": { + "version": "2.4.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/ldflex/-/ldflex-2.4.0.tgz", + "integrity": "sha512-q7OPKmtKh4Z1gCrqpUOPe2AfKH8+zkNi/YwvmeNkDcXk0hyBL0ZhZTz/jyYNzTfzA0L16CrI8RLG0gB+3GEU9g==", + "requires": { + "@babel/runtime": "^7.1.5", + "@rdfjs/data-model": "^1.1.1", + "jsonld-context-parser": "^1.2.0" + } + } } }, "@inrupt/solid-style-guide": { "version": "0.1.34", - "resolved": "https://registry.npmjs.org/@inrupt/solid-style-guide/-/solid-style-guide-0.1.34.tgz", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/@inrupt/solid-style-guide/-/solid-style-guide-0.1.34.tgz", "integrity": "sha512-vfjVRYz+lyscskzDJGT5vjpjqNOwKUQXIB8NgUVwoO8aknmecHDenRep1X/kwYf+RvSibjNbH/0bwm3jVbhjIQ==" }, "@jest/console": { @@ -2287,6 +2308,36 @@ "@shexjs/core": "^1.0.0-alpha.4" } }, + "@solid/cli": { + "version": "0.1.1", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/@solid/cli/-/cli-0.1.1.tgz", + "integrity": "sha512-NRmSKWGycV2u/YDHTB2DWa7JIH9lK/WqT7HEuaRfWWhxlxSiM52p08aJw90qavEp6pWIz+2Os4kRQpQqJU2oiQ==", + "requires": { + "@solid/oidc-rp": "^0.9.0" + }, + "dependencies": { + "@solid/oidc-rp": { + "version": "0.9.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/@solid/oidc-rp/-/oidc-rp-0.9.0.tgz", + "integrity": "sha512-y2gBGp/0+f6D+TEZ+AxjEY2Qx1aqcN0smNR2W+PjaVXGio0t4HXh68kKoSPpSiGd84aMQY9GJfG2ZsVskqjdsg==", + "requires": { + "@solid/jose": "0.1.8", + "@trust/json-document": "^0.1.4", + "@trust/webcrypto": "0.9.2", + "base64url": "^3.0.0", + "node-fetch": "^2.1.2", + "standard-http-error": "^2.0.1", + "text-encoding": "^0.6.4", + "whatwg-url": "^6.4.1" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + } + } + }, "@solid/jose": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/@solid/jose/-/jose-0.1.8.tgz", @@ -3566,9 +3617,9 @@ }, "dependencies": { "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "version": "1.11.1", + "resolved": "http://localhost:4873/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", "requires": { "path-parse": "^1.0.6" } @@ -5036,14 +5087,6 @@ "stylis-rule-sheet": "^0.0.10" } }, - "create-emotion-styled": { - "version": "9.2.8", - "resolved": "https://registry.npmjs.org/create-emotion-styled/-/create-emotion-styled-9.2.8.tgz", - "integrity": "sha512-2LrNM5MREWzI5hZK+LyiBHglwE18WE3AEbBQgpHQ1+zmyLSm/dJsUZBeFAwuIMb+TjNZP0KsMZlV776ufOtFdg==", - "requires": { - "@emotion/is-prop-valid": "^0.6.1" - } - }, "create-hash": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", @@ -5476,9 +5519,9 @@ } }, "csstype": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.5.tgz", - "integrity": "sha512-JsTaiksRsel5n7XwqPAfB0l3TFKdpjW/kgAELf9vrb5adGA7UCPLajKK5s3nFrcFm3Rkyp/Qkgl73ENc1UY3cA==" + "version": "2.6.6", + "resolved": "http://localhost:4873/csstype/-/csstype-2.6.6.tgz", + "integrity": "sha512-RpFbQGUE74iyPgvr46U9t1xoQBM8T4BL8SxrN66Le2xYAPSaDJJKeztV3awugusb3g3G9iL8StmkBBXhcbbXhg==" }, "cyclist": { "version": "0.2.2", @@ -6179,6 +6222,37 @@ } } }, + "eslint-config-airbnb": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-17.1.0.tgz", + "integrity": "sha512-R9jw28hFfEQnpPau01NO5K/JWMGLi6aymiF6RsnMURjTk+MqZKllCqGK/0tOvHkPi/NWSSOU2Ced/GX++YxLnw==", + "dev": true, + "requires": { + "eslint-config-airbnb-base": "^13.1.0", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4" + } + }, + "eslint-config-airbnb-base": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-13.1.0.tgz", + "integrity": "sha512-XWwQtf3U3zIoKO1BbHh6aUhJZQweOwSt4c2JrPDg9FP3Ltv3+YfEv7jIDB8275tVnO/qOHbfuYg3kzw6Je7uWw==", + "dev": true, + "requires": { + "eslint-restricted-globals": "^0.1.1", + "object.assign": "^4.1.0", + "object.entries": "^1.0.4" + } + }, + "eslint-config-prettier": { + "version": "3.6.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/eslint-config-prettier/-/eslint-config-prettier-3.6.0.tgz", + "integrity": "sha512-ixJ4U3uTLXwJts4rmSVW/lMXjlGwCijhBJHk8iVqKKSifeI0qgFEfWl8L63isfc8Od7EiBALF6BX3jKLluf/jQ==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, "eslint-config-react-app": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-3.0.8.tgz", @@ -6188,6 +6262,12 @@ "confusing-browser-globals": "^1.0.6" } }, + "eslint-config-xo": { + "version": "0.25.1", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/eslint-config-xo/-/eslint-config-xo-0.25.1.tgz", + "integrity": "sha512-ePb7s4GsmhOn+PSeEka8mltxvimBuPfkq6CSLkdZMJXEOtiDJ5wuHcAEOzqdP/EPZ71X/KGAcaoB8/naPCX/Bw==", + "dev": true + }, "eslint-import-resolver-node": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", @@ -6486,6 +6566,15 @@ } } }, + "eslint-plugin-prettier": { + "version": "3.1.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.0.tgz", + "integrity": "sha512-XWX2yVuwVNLOUhQijAkXz+rMPPoCr7WFiAl8ig6I7Xn+pPVhDhzg4DxHpmbeb0iqjO9UronEA3Tb09ChnFVHHA==", + "dev": true, + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, "eslint-plugin-react": { "version": "7.11.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", @@ -6515,6 +6604,12 @@ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.6.0.tgz", "integrity": "sha512-lHBVRIaz5ibnIgNG07JNiAuBUeKhEf8l4etNx5vfAEwqQ5tcuK3jV9yjmopPgQDagQb7HwIuQVsE3IVcGrRnag==" }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, "eslint-scope": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", @@ -6626,6 +6721,11 @@ "strip-eof": "^1.0.0" } }, + "exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha1-KueOhdmJQVhnCwPUe+wfA72Ru50=" + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -6872,6 +6972,12 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, "fast-glob": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", @@ -7241,21 +7347,25 @@ "dependencies": { "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "optional": true }, "ansi-regex": { "version": "2.1.1", - "bundled": true + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "optional": true }, "are-we-there-yet": { "version": "1.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "optional": true, "requires": { "delegates": "^1.0.0", @@ -7264,11 +7374,13 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -7276,29 +7388,35 @@ }, "chownr": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "optional": true }, "code-point-at": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "concat-map": { "version": "0.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "console-control-strings": { "version": "1.1.0", - "bundled": true + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "optional": true }, "debug": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "optional": true, "requires": { "ms": "^2.1.1" @@ -7306,22 +7424,26 @@ }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "optional": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "optional": true }, "detect-libc": { "version": "1.0.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "optional": true }, "fs-minipass": { "version": "1.2.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", "optional": true, "requires": { "minipass": "^2.2.1" @@ -7329,12 +7451,14 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "optional": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { "aproba": "^1.0.3", @@ -7349,7 +7473,8 @@ }, "glob": { "version": "7.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "optional": true, "requires": { "fs.realpath": "^1.0.0", @@ -7362,12 +7487,14 @@ }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "optional": true }, "iconv-lite": { "version": "0.4.24", - "bundled": true, + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -7375,7 +7502,8 @@ }, "ignore-walk": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", "optional": true, "requires": { "minimatch": "^3.0.4" @@ -7383,7 +7511,8 @@ }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "optional": true, "requires": { "once": "^1.3.0", @@ -7392,39 +7521,46 @@ }, "inherits": { "version": "2.0.3", - "bundled": true + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "ini": { "version": "1.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "optional": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { "number-is-nan": "^1.0.0" } }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "optional": true }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "minipass": { "version": "2.3.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -7432,7 +7568,8 @@ }, "minizlib": { "version": "1.2.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "optional": true, "requires": { "minipass": "^2.2.1" @@ -7440,19 +7577,22 @@ }, "mkdirp": { "version": "0.5.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { "minimist": "0.0.8" } }, "ms": { "version": "2.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "optional": true }, "needle": { "version": "2.3.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz", + "integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==", "optional": true, "requires": { "debug": "^4.1.0", @@ -7462,7 +7602,8 @@ }, "node-pre-gyp": { "version": "0.12.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz", + "integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==", "optional": true, "requires": { "detect-libc": "^1.0.2", @@ -7479,7 +7620,8 @@ }, "nopt": { "version": "4.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { "abbrev": "1", @@ -7488,12 +7630,14 @@ }, "npm-bundled": { "version": "1.0.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", "optional": true }, "npm-packlist": { "version": "1.4.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", "optional": true, "requires": { "ignore-walk": "^3.0.1", @@ -7502,7 +7646,8 @@ }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "optional": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -7513,33 +7658,39 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "optional": true }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { "wrappy": "1" } }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "optional": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "optional": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "optional": true, "requires": { "os-homedir": "^1.0.0", @@ -7548,17 +7699,20 @@ }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "optional": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "optional": true }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "optional": true, "requires": { "deep-extend": "^0.6.0", @@ -7569,14 +7723,16 @@ "dependencies": { "minimist": { "version": "1.2.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "optional": true } } }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "optional": true, "requires": { "core-util-is": "~1.0.0", @@ -7590,7 +7746,8 @@ }, "rimraf": { "version": "2.6.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "optional": true, "requires": { "glob": "^7.1.3" @@ -7598,36 +7755,43 @@ }, "safe-buffer": { "version": "5.1.2", - "bundled": true + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "optional": true }, "sax": { "version": "1.2.4", - "bundled": true, + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "optional": true }, "semver": { "version": "5.7.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "optional": true }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "optional": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "optional": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -7636,7 +7800,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "optional": true, "requires": { "safe-buffer": "~5.1.0" @@ -7644,19 +7809,22 @@ }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { "ansi-regex": "^2.0.0" } }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "optional": true }, "tar": { "version": "4.4.8", - "bundled": true, + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "optional": true, "requires": { "chownr": "^1.1.1", @@ -7670,12 +7838,14 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "optional": true }, "wide-align": { "version": "1.1.3", - "bundled": true, + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "optional": true, "requires": { "string-width": "^1.0.2 || 2" @@ -7683,11 +7853,13 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "yallist": { "version": "3.0.3", - "bundled": true + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" } } }, @@ -8064,9 +8236,9 @@ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" }, "hierarchy-closure": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hierarchy-closure/-/hierarchy-closure-1.1.0.tgz", - "integrity": "sha512-HpApcPeYFkuPNWQNjlsKiITOe5+HLbt6iWesycmVJMMseQenJD2u9DEQNcKjdbglS2oSQUVRHp3D6Dwe2wNAlg==" + "version": "1.2.1", + "resolved": "http://localhost:4873/hierarchy-closure/-/hierarchy-closure-1.2.1.tgz", + "integrity": "sha512-3Lm4gqKditachEhU94qyd5YtyfVOcKAs3WZVAd62DxQGLaA1ZU4mGPg7bOvgm9JTzWbcXoipTikYRvrflY7Orw==" }, "history": { "version": "4.9.0", @@ -9990,9 +10162,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -10391,9 +10563,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "requires": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -10793,6 +10965,18 @@ "object-keys": "^1.0.11" } }, + "object.entries": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", + "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, "object.fromentries": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.0.tgz", @@ -12108,6 +12292,15 @@ "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.18.2.tgz", "integrity": "sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==" }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "requires": { + "fast-diff": "^1.1.2" + } + }, "pretty-bytes": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.2.0.tgz", @@ -12362,6 +12555,22 @@ "strip-json-comments": "~2.0.1" } }, + "rdf-canonize": { + "version": "1.0.3", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/rdf-canonize/-/rdf-canonize-1.0.3.tgz", + "integrity": "sha512-piLMOB5Q6LJSVx2XzmdpHktYVb8TmVTy8coXJBFtdkcMC96DknZOuzpAYqCWx2ERZX7xEW+mMi8/wDuMJS/95w==", + "requires": { + "node-forge": "^0.8.1", + "semver": "^5.6.0" + }, + "dependencies": { + "node-forge": { + "version": "0.8.5", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/node-forge/-/node-forge-0.8.5.tgz", + "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" + } + } + }, "rdf-string": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/rdf-string/-/rdf-string-1.3.1.tgz", @@ -12379,6 +12588,36 @@ "lodash.uniqwith": "^4.5.0" } }, + "rdflib": { + "version": "0.20.1", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/rdflib/-/rdflib-0.20.1.tgz", + "integrity": "sha512-5G1t7rURqPdsYE+mjpDW2e9/H19XFMuChTIjPFPtH2tI0fma+xlJYwrSgmd1aOm45SOYKpqwJfTSIvFpmP2n+g==", + "requires": { + "async": "^0.9.x", + "jsonld": "^0.4.5", + "n3": "^0.4.1", + "solid-auth-cli": "^0.1.12", + "solid-auth-client": "^2.3.0", + "xmldom": "^0.1.22" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/async/-/async-0.9.2.tgz", + "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" + }, + "n3": { + "version": "0.4.5", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/n3/-/n3-0.4.5.tgz", + "integrity": "sha1-W3DTq2ohyejUyb2io9TZCQm+tQg=" + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" + } + } + }, "rdfxml-streaming-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/rdfxml-streaming-parser/-/rdfxml-streaming-parser-1.2.3.tgz", @@ -12520,15 +12759,6 @@ "scheduler": "^0.13.4" } }, - "react-emotion": { - "version": "9.2.12", - "resolved": "https://registry.npmjs.org/react-emotion/-/react-emotion-9.2.12.tgz", - "integrity": "sha512-qt7XbxnEKX5sZ73rERJ92JMbEOoyOwG3BuCRFRkXrsJhEe+rFBRTljRw7yOLHZUCQC4GBObZhjXIduQ8S0ZpYw==", - "requires": { - "babel-plugin-emotion": "^9.2.11", - "create-emotion-styled": "^9.2.8" - } - }, "react-error-overlay": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", @@ -12561,6 +12791,17 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "react-modal": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.8.2.tgz", + "integrity": "sha512-wxNk94wy/DMh2LyJa8K+LyOQDhQfhKuBrZ4SxS091p75cpW+STfY+9GpAuvl6P6Yt2r/+wxYH8Z3G5Ww/L8Tiw==", + "requires": { + "exenv": "^1.2.0", + "prop-types": "^15.5.10", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + } + }, "react-router": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-4.3.1.tgz", @@ -13789,6 +14030,19 @@ "raf": "^3.4.0", "react-input-autosize": "^2.2.1", "react-transition-group": "^2.2.1" + }, + "dependencies": { + "react-transition-group": { + "version": "2.9.0", + "resolved": "http://localhost:4873/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + } } }, "react-testing-library": { @@ -13801,25 +14055,39 @@ "dom-testing-library": "^3.19.0" } }, - "react-toast-notifications": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/react-toast-notifications/-/react-toast-notifications-1.4.0.tgz", - "integrity": "sha512-O9D76tEwDpJRqted8z+2ukCHbbzPaV3Lfvr+IKOY43go64F1oLdX0Vj3yRk6zwuq5+hOB1ExgR2iqTJ5hi1oEw==", + "react-toastify": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-5.3.0.tgz", + "integrity": "sha512-01Tc1ZfeAgmbUp+CWj0J/G+6KqCGpo2XKdBSZ9/fpDw0Qmvne6fIrEzg7bGx2Uz7at5GDgd/ii4ek/6TY/T+6Q==", "requires": { - "emotion": "^9.1.1", - "react-emotion": "^9.1.3", - "react-transition-group": "^2.3.1" + "@babel/runtime": "^7.4.2", + "classnames": "^2.2.6", + "prop-types": "^15.7.2", + "react-transition-group": "^2.6.1" + }, + "dependencies": { + "react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "requires": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + } + } } }, "react-transition-group": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", - "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.1.1.tgz", + "integrity": "sha512-K/N1wqJ2GRP2yj3WBqEUYa0KV5fiaAWpUfU9SpHOHefeKvyrO+VrnMBML21M19QZoVbDZKmuQFHZYoMMi1xuJA==", "requires": { + "@babel/runtime": "^7.4.5", "dom-helpers": "^3.4.0", "loose-envify": "^1.4.0", - "prop-types": "^15.6.2", - "react-lifecycles-compat": "^3.0.4" + "prop-types": "^15.6.2" } }, "read-pkg": { @@ -14575,9 +14843,9 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -14846,6 +15114,40 @@ "url-parse": "^1.4.3" } }, + "solid-auth-cli": { + "version": "0.1.14", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/solid-auth-cli/-/solid-auth-cli-0.1.14.tgz", + "integrity": "sha512-G1xhi4hASPW5hib1UxN10rm0X2lTYqqNQELJ4neRjcM07qWnkKUG08Q4fMFz5xeKAWjDh8ytqhvq5M349/CZsw==", + "requires": { + "@solid/cli": "^0.1.1", + "async": "^2.6.1", + "isomorphic-fetch": "^2.2.1", + "jsonld": "^1.4.0", + "n3": "^1.0.3", + "solid-rest": "^1.0.2" + }, + "dependencies": { + "async": { + "version": "2.6.3", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "jsonld": { + "version": "1.6.2", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/jsonld/-/jsonld-1.6.2.tgz", + "integrity": "sha512-eMzFHqhF2kPMrMUjw8+Lz9IF1QkrxTOIfVndkP/OpuoZs31VdDtfDs8mLa5EOC/ROdemFTQGLdYPZbRtmMe2Yw==", + "requires": { + "rdf-canonize": "^1.0.2", + "request": "^2.88.0", + "semver": "^5.6.0", + "xmldom": "0.1.19" + } + } + } + }, "solid-auth-client": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/solid-auth-client/-/solid-auth-client-2.3.0.tgz", @@ -14858,6 +15160,60 @@ "isomorphic-fetch": "^2.2.1" } }, + "solid-rest": { + "version": "1.0.7", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/solid-rest/-/solid-rest-1.0.7.tgz", + "integrity": "sha512-OiNKV1nW00RVdnd88HfCVIcY+LKI6VAc6DbY0Tujy5/eiURkCnxqAkMJXLd10lKmpQZ2NNYpsfBN/QWnoIBczA==", + "requires": { + "concat-stream": "^2.0.0", + "fs-extra": "^8.0.1", + "mime-types": "^2.1.24", + "node-fetch": "^2.6.0" + }, + "dependencies": { + "concat-stream": { + "version": "2.0.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.2.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/graceful-fs/-/graceful-fs-4.2.0.tgz", + "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -16012,35 +16368,14 @@ } }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "uniq": { @@ -16053,6 +16388,11 @@ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" }, + "unique": { + "version": "0.0.1", + "resolved": "https://repo.janeirodigital.com/repository/npm-all/unique/-/unique-0.0.1.tgz", + "integrity": "sha1-iCXJRG2bD9J14wDt2yD200cw/Yc=" + }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", diff --git a/generators/app/templates/package.json b/generators/app/templates/package.json index 3b7f8873..88eb8b16 100644 --- a/generators/app/templates/package.json +++ b/generators/app/templates/package.json @@ -4,7 +4,7 @@ "@fortawesome/free-brands-svg-icons": "^5.8.0", "@fortawesome/free-solid-svg-icons": "^5.6.3", "@fortawesome/react-fontawesome": "^0.1.4", - "@inrupt/solid-react-components": "0.4.3", + "@inrupt/solid-react-components": "^0.4.4", "@inrupt/solid-style-guide": "^0.1.34", "@rdfjs/data-model": "^1.1.1", "@solid/query-ldflex": "^2.4.0", @@ -22,6 +22,7 @@ "i18next-xhr-backend": "^2.0.1", "identity-obj-proxy": "3.0.0", "moment": "^2.24.0", + "n3": "^1.1.1", "normalize.css": "^8.0.1", "optimize-css-assets-webpack-plugin": "5.0.1", "pnp-webpack-plugin": "1.1.0", @@ -31,9 +32,11 @@ "react-click-outside": "^3.0.1", "react-dev-utils": "^7.0.1", "react-i18next": "^10.1.2", + "react-modal": "^3.8.2", "react-router-dom": "^4.3.1", "react-scripts": "^3.0.1", - "react-toast-notifications": "^1.3.1", + "react-toastify": "^5.3.0", + "react-transition-group": "^4.1.1", "solid-auth-client": "^2.3.0", "styled-components": "^4.1.3" }, @@ -116,7 +119,9 @@ "@layouts": "./src/layouts", "@contexts": "./src/contexts/", "@hocs": "./src/hocs", - "@utils": "./src/utils" + "@utils": "./src/utils", + "@hooks": "./src/hooks", + "@constants": "./src/constants" } } ] @@ -132,36 +137,41 @@ "babel-eslint": "9.0.0", "babel-jest": "^24.5.0", "babel-loader": "8.0.4", + "babel-plugin-module-resolver": "^3.1.2", "babel-plugin-named-asset-import": "^0.3.0", "babel-preset-react-app": "^7.0.0", - "babel-plugin-module-resolver": "^3.1.2", "copy-webpack-plugin": "^4.6.0", "css-loader": "1.0.0", - "husky": "^1.3.1", - "jest-dom": "^3.1.2", - "react-testing-library": "^6.0.0", "eslint": "5.6.0", + "eslint-config-airbnb": "^17.1.0", "eslint-config-react-app": "^3.0.6", "eslint-loader": "2.1.1", "eslint-plugin-flowtype": "2.50.1", "eslint-plugin-import": "2.14.0", "eslint-plugin-jsx-a11y": "6.1.2", + "eslint-plugin-prettier": "^3.0.0", + "eslint-config-prettier": "^3.3.0", + "eslint-config-xo": "^0.25.0", "eslint-plugin-react": "7.11.1", "file-loader": "2.0.0", - "resolve": "1.8.1", + "html-webpack-include-assets-plugin": "^1.0.6", + "html-webpack-plugin": "4.0.0-alpha.2", + "husky": "^1.3.1", "jest": "^24.1.0", + "jest-dom": "^3.1.2", "jest-pnp-resolver": "1.0.1", "jest-resolve": "23.6.0", + "mini-css-extract-plugin": "0.4.3", "postcss-flexbugs-fixes": "4.1.0", "postcss-loader": "3.0.0", "postcss-preset-env": "6.3.1", "postcss-safe-parser": "4.0.1", + "prettier": "^1.18.2", + "react-testing-library": "^6.0.0", + "resolve": "1.8.1", "sass-loader": "7.1.0", "style-loader": "0.23.0", "terser-webpack-plugin": "1.1.0", - "mini-css-extract-plugin": "0.4.3", - "html-webpack-include-assets-plugin": "^1.0.6", - "html-webpack-plugin": "4.0.0-alpha.2", "url-loader": "1.1.1", "webpack": "4.19.1", "webpack-dev-server": "3.1.14", diff --git a/generators/app/templates/public/img/icon/tictactoe.svg b/generators/app/templates/public/img/icon/tictactoe.svg new file mode 100644 index 00000000..7b74784f --- /dev/null +++ b/generators/app/templates/public/img/icon/tictactoe.svg @@ -0,0 +1,18 @@ + + + + 01_01_Tic-Tac-Toe-Icons-color + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/generators/app/templates/public/img/tic-tac-toe-color.svg b/generators/app/templates/public/img/tic-tac-toe-color.svg new file mode 100644 index 00000000..0a7d28c3 --- /dev/null +++ b/generators/app/templates/public/img/tic-tac-toe-color.svg @@ -0,0 +1,52 @@ + + + + 02_01_Tic-Tac-Toe-Icons-color + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/generators/app/templates/public/index.html b/generators/app/templates/public/index.html index e60135ca..68224cd2 100644 --- a/generators/app/templates/public/index.html +++ b/generators/app/templates/public/index.html @@ -3,10 +3,7 @@ - +