├── .nvmrc ├── __tests__ ├── next-10 │ ├── .npmrc │ ├── next.config.js │ ├── pages │ │ ├── _app.js │ │ └── index.js │ └── package.json ├── next-10-local │ ├── .npmrc │ ├── src │ │ └── components │ │ │ ├── css-component │ │ │ ├── styles.css │ │ │ └── index.js │ │ │ └── scss-component │ │ │ ├── styles.scss │ │ │ └── index.js │ ├── next.config.js │ ├── pages │ │ ├── _app.js │ │ └── index.js │ └── package.json ├── next-10-ssr │ ├── .npmrc │ ├── pages │ │ ├── index.js │ │ ├── _app.js │ │ └── _document.js │ ├── next.config.js │ └── package.json ├── next-12-react-18-local │ ├── .npmrc │ ├── src │ │ └── components │ │ │ ├── css-component │ │ │ ├── styles.css │ │ │ └── index.js │ │ │ └── scss-component │ │ │ ├── styles.scss │ │ │ └── index.js │ ├── next.config.js │ ├── pages │ │ ├── _app.js │ │ └── index.js │ └── package.json ├── __fixtures__ │ └── 3d-party-library │ │ ├── component │ │ ├── styles.css │ │ └── index.js │ │ ├── scss-component │ │ ├── styles.scss │ │ └── index.js │ │ └── package.json └── index.test.js ├── .npmrc ├── lib ├── constants.js ├── patch-global-require.js └── index.js ├── .prettierrc ├── .editorconfig ├── .github └── workflows │ └── ci.yml ├── package.json ├── license.md ├── readme.md └── .gitignore /.nvmrc: -------------------------------------------------------------------------------- 1 | 12.18.1 2 | -------------------------------------------------------------------------------- /__tests__/next-10/.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /__tests__/next-10-local/.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /__tests__/next-10-ssr/.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | tag-version-prefix="v" 2 | message="chore: release %s" 3 | -------------------------------------------------------------------------------- /__tests__/__fixtures__/3d-party-library/component/styles.css: -------------------------------------------------------------------------------- 1 | .Component { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /__tests__/next-10-local/src/components/css-component/styles.css: -------------------------------------------------------------------------------- 1 | .css-button { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /__tests__/next-10-local/src/components/scss-component/styles.scss: -------------------------------------------------------------------------------- 1 | .scss-button { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /__tests__/__fixtures__/3d-party-library/scss-component/styles.scss: -------------------------------------------------------------------------------- 1 | .scss-Component { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/src/components/css-component/styles.css: -------------------------------------------------------------------------------- 1 | .css-button { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/src/components/scss-component/styles.scss: -------------------------------------------------------------------------------- 1 | .scss-button { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /__tests__/next-10/next.config.js: -------------------------------------------------------------------------------- 1 | const { withGlobalCss } = require('../../lib') 2 | 3 | module.exports = withGlobalCss()() 4 | -------------------------------------------------------------------------------- /__tests__/next-10-local/next.config.js: -------------------------------------------------------------------------------- 1 | const { withGlobalCss } = require('../../lib') 2 | 3 | module.exports = withGlobalCss()() 4 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/next.config.js: -------------------------------------------------------------------------------- 1 | const { withGlobalCss } = require('../../lib') 2 | 3 | module.exports = withGlobalCss()() 4 | -------------------------------------------------------------------------------- /__tests__/next-10-ssr/pages/index.js: -------------------------------------------------------------------------------- 1 | import { Component } from '3d-party-library/component' 2 | 3 | export default function Home() { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/next-10/pages/_app.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export default function MyApp({ Component, pageProps }) { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/next-10-local/pages/_app.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export default function MyApp({ Component, pageProps }) { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/next-10-ssr/pages/_app.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export default function MyApp({ Component, pageProps }) { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/next-10-ssr/next.config.js: -------------------------------------------------------------------------------- 1 | const { withGlobalCss } = require('../../lib') 2 | 3 | module.exports = withGlobalCss()({ 4 | future: { 5 | webpack5: true, 6 | }, 7 | }) 8 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/pages/_app.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | export default function MyApp({ Component, pageProps }) { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/__fixtures__/3d-party-library/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "3d-party-library", 3 | "version": "0.0.1", 4 | "private": "true", 5 | "dependencies": { 6 | "react": "^17.0.2" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /__tests__/next-10-local/src/components/css-component/index.js: -------------------------------------------------------------------------------- 1 | import './styles.css' 2 | 3 | export const CssComponent = () => { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/next-10-local/src/components/scss-component/index.js: -------------------------------------------------------------------------------- 1 | import './styles.scss' 2 | 3 | export const ScssComponent = () => { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/src/components/css-component/index.js: -------------------------------------------------------------------------------- 1 | import './styles.css' 2 | 3 | export const CssComponent = () => { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/src/components/scss-component/index.js: -------------------------------------------------------------------------------- 1 | import './styles.scss' 2 | 3 | export const ScssComponent = () => { 4 | return 5 | } 6 | -------------------------------------------------------------------------------- /lib/constants.js: -------------------------------------------------------------------------------- 1 | const globalCssRe = [/(? { 5 | return React.createElement('div', { className: 'Component' }, 'Component!') 6 | } 7 | -------------------------------------------------------------------------------- /__tests__/__fixtures__/3d-party-library/scss-component/index.js: -------------------------------------------------------------------------------- 1 | const React = require('react') 2 | require('./styles.scss') 3 | 4 | module.exports.ScssComponent = () => { 5 | return React.createElement('div', { className: 'scss-Component' }, 'Component!') 6 | } 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig is awesome: http://EditorConfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | end_of_line = lf 10 | insert_final_newline = true 11 | max_line_length = 100 12 | -------------------------------------------------------------------------------- /__tests__/next-10/pages/index.js: -------------------------------------------------------------------------------- 1 | import { Component } from '3d-party-library/component' 2 | import { ScssComponent } from '3d-party-library/scss-component' 3 | 4 | export default function Home() { 5 | return ( 6 | <> 7 | 8 | 9 | 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /lib/patch-global-require.js: -------------------------------------------------------------------------------- 1 | const Module = require('module') 2 | 3 | const { globalCssRe } = require('./constants') 4 | 5 | Module.prototype.require = new Proxy(Module.prototype.require, { 6 | apply(target, thisArg, args) { 7 | if (globalCssRe.some((reg) => reg.test(args[0]))) { 8 | return '' 9 | } 10 | return Reflect.apply(target, thisArg, args) 11 | }, 12 | }) 13 | -------------------------------------------------------------------------------- /__tests__/next-10-local/pages/index.js: -------------------------------------------------------------------------------- 1 | import { Component } from '3d-party-library/component' 2 | import { ScssComponent } from '../src/components/scss-component' 3 | import { CssComponent } from '../src/components/css-component' 4 | 5 | export default function Home() { 6 | return ( 7 | <> 8 | 9 | 10 | 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | tests: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v1 17 | - uses: actions/setup-node@v1 18 | with: 19 | node-version: 12 20 | 21 | - name: tests 22 | run: npm run test 23 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/pages/index.js: -------------------------------------------------------------------------------- 1 | import { Component } from '3d-party-library/component' 2 | import { ScssComponent } from '../src/components/scss-component' 3 | import { CssComponent } from '../src/components/css-component' 4 | 5 | export default function Home() { 6 | return ( 7 | <> 8 | 9 | 10 | 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /__tests__/next-10-ssr/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-10-ssr", 3 | "version": "0.0.1", 4 | "private": "true", 5 | "scripts": { 6 | "build": "next build", 7 | "dev": "next dev" 8 | }, 9 | "dependencies": { 10 | "3d-party-library": "file:../__fixtures__/3d-party-library/3d-party-library-0.0.1.tgz", 11 | "next": "^10.2.0", 12 | "react": "^17.0.2", 13 | "react-dom": "^17.0.2" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /__tests__/next-10-ssr/pages/_document.js: -------------------------------------------------------------------------------- 1 | import BaseDocument, { Html, Head, Main, NextScript } from 'next/document' 2 | import '3d-party-library/component' 3 | 4 | export default class Document extends BaseDocument { 5 | render() { 6 | return ( 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | ) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /__tests__/next-10/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-10", 3 | "version": "0.0.1", 4 | "private": "true", 5 | "scripts": { 6 | "build": "next build", 7 | "dev": "next dev" 8 | }, 9 | "dependencies": { 10 | "3d-party-library": "file:../__fixtures__/3d-party-library/3d-party-library-0.0.1.tgz", 11 | "next": "^10.2.0", 12 | "react": "^17.0.2", 13 | "react-dom": "^17.0.2", 14 | "sass": "^1.34.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /__tests__/next-10-local/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-10-local", 3 | "version": "0.0.1", 4 | "private": "true", 5 | "scripts": { 6 | "build": "next build", 7 | "dev": "next dev" 8 | }, 9 | "dependencies": { 10 | "3d-party-library": "file:../__fixtures__/3d-party-library/3d-party-library-0.0.1.tgz", 11 | "next": "^10.2.0", 12 | "react": "^17.0.2", 13 | "react-dom": "^17.0.2", 14 | "sass": "^1.34.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /__tests__/next-12-react-18-local/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-10-local", 3 | "version": "0.0.1", 4 | "private": "true", 5 | "scripts": { 6 | "build": "next build", 7 | "dev": "next dev" 8 | }, 9 | "dependencies": { 10 | "3d-party-library": "file:../__fixtures__/3d-party-library/3d-party-library-0.0.1.tgz", 11 | "next": "^12.1.4", 12 | "react": "^18.0.0", 13 | "react-dom": "^18.0.0", 14 | "sass": "^1.34.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /__tests__/index.test.js: -------------------------------------------------------------------------------- 1 | const { resolve } = require('path') 2 | const { execSync } = require('child_process') 3 | 4 | const arg = process.argv[2] 5 | const version = arg.split('=')[1] 6 | 7 | function prepareFixture(version) { 8 | console.log('> Pack 3d-party-library') 9 | execSync('npm pack', { cwd: resolve(__dirname, '__fixtures__/3d-party-library'), stdio: 'ignore' }) 10 | console.log(`> Install next-${version} deps`) 11 | execSync('npm i --no-package-lock', { cwd: resolve(__dirname, `next-${version}`), stdio: 'ignore' }) 12 | } 13 | 14 | function runBuild(version) { 15 | console.log(`> Run next-${version} build`) 16 | execSync('npm run build', { cwd: resolve(__dirname, `next-${version}`), stdio: 'ignore' }) 17 | } 18 | 19 | prepareFixture(version) 20 | runBuild(version) 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-global-css", 3 | "version": "1.3.1", 4 | "main": "lib/index.js", 5 | "files": [ 6 | "lib" 7 | ], 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/bem/next-global-css.git" 11 | }, 12 | "license": "MIT", 13 | "bugs": { 14 | "url": "https://github.com/bem/next-global-css/issues" 15 | }, 16 | "homepage": "https://github.com/bem/next-global-css#readme", 17 | "scripts": { 18 | "test-next-10-local": "node ./__tests__/index.test.js --version=10-local", 19 | "test-next-10-ssr": "node ./__tests__/index.test.js --version=10-ssr", 20 | "test-next-10": "node ./__tests__/index.test.js --version=10", 21 | "test-next-12-react-18-local": "node ./__tests__/index.test.js --version=12-react-18-local", 22 | "test": "npm run test-next-10-local && npm run test-next-10-ssr && npm run test-next-10 && npm run test-next-12-react-18-local" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /license.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2021 Tropin Eugeniy 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 19 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 21 | OR OTHER DEALINGS IN THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | const { globalCssRe, globalCssModulesRe } = require('./constants') 2 | 3 | function patchServerWebpackConfig(config) { 4 | const originalEntry = config.entry 5 | config.entry = async () => { 6 | const entry = await originalEntry() 7 | const patchPath = require.resolve('./patch-global-require') 8 | // Prepend module with patched `require` for ignore load css files. 9 | if (entry['pages/_app'] && !entry['pages/_app'].includes(patchPath)) { 10 | entry['pages/_app'].unshift(patchPath) 11 | } 12 | if (entry['pages/_document'] && !entry['pages/_document'].includes(patchPath)) { 13 | entry['pages/_document'].unshift(patchPath) 14 | } 15 | return entry 16 | } 17 | } 18 | 19 | function patchCommonWebpackConfig(config) { 20 | for (const rule of config.module.rules) { 21 | if (rule.oneOf) { 22 | for (const oneOfRule of rule.oneOf) { 23 | patchWebpackStyleRules(oneOfRule) 24 | } 25 | } else { 26 | patchWebpackStyleRules(rule) 27 | } 28 | } 29 | } 30 | 31 | function patchWebpackStyleRules(rawRule) { 32 | const rules = Array.isArray(rawRule) ? rawRule : [rawRule] 33 | const cssRe = [...globalCssRe, ...globalCssModulesRe] 34 | 35 | for (const rule of rules) { 36 | if (rule.test && cssRe.some((reg) => reg.source === rule.test.source)) { 37 | // Remove issuer for allow import css from 3d-party libs and locals. 38 | delete rule.issuer 39 | } 40 | } 41 | } 42 | 43 | function patchWebpackConfig(config, { isServer }) { 44 | if (isServer) { 45 | patchServerWebpackConfig(config) 46 | } 47 | 48 | patchCommonWebpackConfig(config) 49 | 50 | return config 51 | } 52 | 53 | function withGlobalCss() { 54 | return (nextConfig) => { 55 | const config = { 56 | webpack: (config, { isServer }) => { 57 | return patchWebpackConfig(config, { isServer }) 58 | }, 59 | } 60 | return { ...nextConfig, ...config } 61 | } 62 | } 63 | 64 | module.exports = { 65 | withGlobalCss, 66 | patchWebpackConfig, 67 | } 68 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # next-global-css 2 | 3 | [![npm](https://img.shields.io/npm/v/next-global-css.svg?style=flat-square&labelColor=111)][npm] [![node](https://img.shields.io/badge/nextjs-10+-007ecc?style=flat-square&labelColor=111)][nextjs] 4 | 5 | A preset for [nextjs][nextjs] allowing using 3d party libraries with global css. 6 | 7 | > ⚠️ Be careful, this solution can be unstable due to [nextjs][nextjs] updates. 8 | 9 | ## 🏗 Compatible 10 | 11 | Current version works only for 10th version of [nextjs][nextjs] or higher. 12 | 13 | ## ☄️ Install and usage 14 | 15 | **Installation:** 16 | 17 | ```sh 18 | npm i -PE next-global-css 19 | ``` 20 | 21 | **Configure:** 22 | 23 | ```js 24 | const { withGlobalCss } = require('next-global-css') 25 | 26 | const withConfig = withGlobalCss() 27 | 28 | module.exports = withConfig({ 29 | /* Next.js config options here */ 30 | }) 31 | ``` 32 | 33 | **If your webpack configuration is already customized:** 34 | 35 | ```js 36 | const { patchWebpackConfig } = require('next-global-css') 37 | 38 | const nextConfig = { 39 | /* config options here */ 40 | /* your already customized webpack option */ 41 | webpack: (config, options) => { 42 | patchWebpackConfig(config, options) 43 | }, 44 | } 45 | ``` 46 | 47 | **Allow css-modules from node-modules:** 48 | 49 | ```js 50 | const { patchWebpackConfig } = require('next-global-css') 51 | const webpackNodeExternals = require('webpack-node-externals') 52 | 53 | module.exports = { 54 | reactStrictMode: true, 55 | webpack: (config, options) => { 56 | patchWebpackConfig(config, options) 57 | 58 | if (options.isServer) { 59 | config.externals = webpackNodeExternals({ 60 | // Uses list to add this modules for server bundle and process. 61 | allowlist: [/design-system/], 62 | }) 63 | } 64 | 65 | return config 66 | }, 67 | } 68 | ``` 69 | 70 | ## 📜 License 71 | 72 | Project is [MIT licensed](https://github.com/yarastqt/next-global-css/blob/master/license.md). 73 | 74 | [nextjs]: https://nextjs.org/ 75 | [npm]: https://www.npmjs.com/package/next-global-css 76 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.gitignore.io/api/node,osx,windows,linux 2 | 3 | ### Linux ### 4 | *~ 5 | 6 | # temporary files which can be created if a process still has a handle open of a deleted file 7 | .fuse_hidden* 8 | 9 | # KDE directory preferences 10 | .directory 11 | 12 | # Linux trash folder which might appear on any partition or disk 13 | .Trash-* 14 | 15 | # .nfs files are created when an open file is removed but is still being accessed 16 | .nfs* 17 | 18 | ### Node ### 19 | # Logs 20 | logs 21 | *.log 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # Runtime data 27 | pids 28 | *.pid 29 | *.seed 30 | *.pid.lock 31 | 32 | # Directory for instrumented libs generated by jscoverage/JSCover 33 | lib-cov 34 | 35 | # Coverage directory used by tools like istanbul 36 | coverage 37 | 38 | # nyc test coverage 39 | .nyc_output 40 | 41 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 42 | .grunt 43 | 44 | # Bower dependency directory (https://bower.io/) 45 | bower_components 46 | 47 | # node-waf configuration 48 | .lock-wscript 49 | 50 | # Compiled binary addons (http://nodejs.org/api/addons.html) 51 | build/Release 52 | 53 | # Dependency directories 54 | node_modules/ 55 | jspm_packages/ 56 | 57 | # Typescript v1 declaration files 58 | typings/ 59 | 60 | # Optional npm cache directory 61 | .npm 62 | !.npmrc 63 | 64 | # Optional eslint cache 65 | .eslintcache 66 | 67 | # Optional REPL history 68 | .node_repl_history 69 | 70 | # Output of 'npm pack' 71 | *.tgz 72 | 73 | # Yarn Integrity file 74 | .yarn-integrity 75 | 76 | # Yarn Lock file 77 | yarn.lock 78 | 79 | # dotenv environment variables file 80 | .env 81 | 82 | 83 | ### OSX ### 84 | *.DS_Store 85 | .AppleDouble 86 | .LSOverride 87 | 88 | # Thumbnails 89 | ._* 90 | 91 | # Files that might appear in the root of a volume 92 | .DocumentRevisions-V100 93 | .fseventsd 94 | .Spotlight-V100 95 | .TemporaryItems 96 | .Trashes 97 | .VolumeIcon.icns 98 | .com.apple.timemachine.donotpresent 99 | 100 | # Directories potentially created on remote AFP share 101 | .AppleDB 102 | .AppleDesktop 103 | Network Trash Folder 104 | Temporary Items 105 | .apdisk 106 | 107 | ### Windows ### 108 | # Windows thumbnail cache files 109 | Thumbs.db 110 | ehthumbs.db 111 | ehthumbs_vista.db 112 | 113 | # Folder config file 114 | Desktop.ini 115 | 116 | # Recycle Bin used on file shares 117 | $RECYCLE.BIN/ 118 | 119 | # Windows Installer files 120 | *.cab 121 | *.msi 122 | *.msm 123 | *.msp 124 | 125 | # Windows shortcuts 126 | *.lnk 127 | 128 | ### Project ### 129 | # Next 130 | .next 131 | 132 | # End of https://www.gitignore.io/api/node,osx,windows,linux 133 | --------------------------------------------------------------------------------