@papillonarts/setup 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/babel/index.js +1 -1
  2. package/eslint/index.js +24 -9
  3. package/jest/config.js +5 -3
  4. package/package.json +2 -2
  5. package/storybook/index.ts +3 -0
  6. package/storybook/mainSetup.ts +277 -0
  7. package/storybook/managerSetup.ts +9 -0
  8. package/storybook/previewSetup.tsx +50 -0
  9. package/webpack/constant/index.ts +24 -0
  10. package/webpack/index.ts +27 -0
  11. package/webpack/loader/babelLoader.ts +38 -0
  12. package/webpack/loader/cssLoader.ts +13 -0
  13. package/webpack/loader/fontLoader.ts +8 -0
  14. package/webpack/loader/imageLoader.ts +8 -0
  15. package/webpack/loader/markdownLoader.ts +17 -0
  16. package/webpack/loader/postCSSLoader.ts +14 -0
  17. package/webpack/loader/{sassLoader.js → sassLoader.ts} +7 -14
  18. package/webpack/loader/svgrLoader.ts +17 -0
  19. package/webpack/plugin/bannerPlugin.ts +18 -0
  20. package/webpack/plugin/cleanWebpackPlugin.ts +27 -0
  21. package/webpack/plugin/copyWebpackPlugin.ts +18 -0
  22. package/webpack/plugin/cssMinimizerWebpackPlugin.ts +7 -0
  23. package/webpack/plugin/dotenvWebpack.ts +19 -0
  24. package/webpack/plugin/hotModuleReplacementPlugin.ts +7 -0
  25. package/webpack/plugin/htmlWebpackPlugin.ts +25 -0
  26. package/webpack/plugin/miniCSSExtractPlugin.ts +16 -0
  27. package/webpack/plugin/moduleConcatenationPlugin.ts +7 -0
  28. package/webpack/plugin/webpackBundleAnalyzer.ts +7 -0
  29. package/webpack/plugin/webpackManifestPlugin.ts +15 -0
  30. package/webpack/server/devServer.ts +13 -0
  31. package/webpack/setup/commonSetup.ts +36 -0
  32. package/webpack/setup/developmentSetup.ts +52 -0
  33. package/webpack/setup/productionSetup.ts +66 -0
  34. package/storybook/index.js +0 -26
  35. package/storybook/mainSetup.js +0 -265
  36. package/storybook/managerSetup.js +0 -16
  37. package/storybook/previewSetup.js +0 -54
  38. package/webpack/constant/index.js +0 -15
  39. package/webpack/index.js +0 -202
  40. package/webpack/loader/babelLoader.js +0 -31
  41. package/webpack/loader/cssLoader.js +0 -22
  42. package/webpack/loader/fontLoader.js +0 -14
  43. package/webpack/loader/imageLoader.js +0 -14
  44. package/webpack/loader/markdownLoader.js +0 -20
  45. package/webpack/loader/postCSSLoader.js +0 -22
  46. package/webpack/loader/svgrLoader.js +0 -25
  47. package/webpack/plugin/bannerPlugin.js +0 -16
  48. package/webpack/plugin/cleanWebpackPlugin.js +0 -31
  49. package/webpack/plugin/copyWebpackPlugin.js +0 -24
  50. package/webpack/plugin/cssMinimizerWebpackPlugin.js +0 -13
  51. package/webpack/plugin/dotenvWebpack.js +0 -35
  52. package/webpack/plugin/hotModuleReplacementPlugin.js +0 -13
  53. package/webpack/plugin/htmlWebpackPlugin.js +0 -42
  54. package/webpack/plugin/miniCSSExtractPlugin.js +0 -22
  55. package/webpack/plugin/moduleConcatenationPlugin.js +0 -13
  56. package/webpack/plugin/webpackBundleAnalyzer.js +0 -15
  57. package/webpack/plugin/webpackManifestPlugin.js +0 -21
  58. package/webpack/server/devServer.js +0 -21
  59. package/webpack/setup/commonSetup.js +0 -37
  60. package/webpack/setup/developmentSetup.js +0 -54
  61. package/webpack/setup/productionSetup.js +0 -59
package/babel/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
 
3
3
  module.exports = {
4
- presets: ['@babel/preset-env', '@babel/preset-react'],
4
+ presets: ['@babel/preset-env', '@babel/preset-react', '@babel/preset-typescript'],
5
5
  plugins: [['@babel/plugin-transform-react-jsx', {
6
6
  runtime: 'automatic'
7
7
  }], '@babel/plugin-transform-runtime', 'syntax-async-functions']
package/eslint/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ // https://typescript-eslint.io/users/configs/
4
+
3
5
  module.exports = {
4
6
  env: {
5
7
  amd: true,
@@ -11,7 +13,7 @@ module.exports = {
11
13
  mocha: true,
12
14
  node: true
13
15
  },
14
- "extends": ['eslint:recommended', 'plugin:import/errors', 'plugin:import/warnings', 'airbnb', 'airbnb/hooks', 'plugin:react/recommended', 'plugin:jsx-a11y/recommended', 'plugin:jest/recommended', 'prettier'],
16
+ "extends": ['eslint:recommended', 'plugin:import/errors', 'plugin:import/warnings', 'plugin:react/recommended', 'plugin:jsx-a11y/recommended', 'plugin:jest/recommended', 'prettier', 'plugin:@typescript-eslint/stylistic-type-checked'],
15
17
  globals: {
16
18
  document: false,
17
19
  expect: false,
@@ -20,17 +22,19 @@ module.exports = {
20
22
  renderMount: false,
21
23
  renderShallow: false
22
24
  },
23
- parser: '@babel/eslint-parser',
25
+ parser: '@typescript-eslint/parser',
26
+ // https://typescript-eslint.io/packages/parser/#configuration
24
27
  parserOptions: {
25
28
  ecmaFeatures: {
26
29
  jsx: true
27
30
  },
28
31
  ecmaVersion: 16,
29
- sourceType: 'module'
32
+ projectService: {
33
+ allowDefaultProject: ['*.js', '*.jsx', '*.ts', '*.tsx']
34
+ }
30
35
  },
31
36
  plugins: ['react', 'react-hooks', 'jsx-a11y', 'jest', 'prettier'],
32
37
  rules: {
33
- 'comma-dangle': 2,
34
38
  'import/named': 2,
35
39
  'import/no-extraneous-dependencies': [0, {
36
40
  devDependencies: ['**/*.test.js', '**/*.story.js']
@@ -38,28 +42,39 @@ module.exports = {
38
42
  'import/prefer-default-export': 'off',
39
43
  'import/no-relative-packages': 'off',
40
44
  'jsx-a11y/accessible-emoji': 0,
41
- 'object-curly-spacing': 2,
42
45
  'prettier/prettier': 'error',
43
46
  'react-hooks/exhaustive-deps': 'warn',
44
47
  'react-hooks/rules-of-hooks': 'error',
45
48
  'react/jsx-boolean-value': 0,
46
49
  'react/jsx-filename-extension': [2, {
47
- extensions: ['.js', '.jsx']
50
+ extensions: ['.js', '.jsx', '.ts', '.tsx']
48
51
  }],
49
52
  'react/jsx-fragments': 0,
50
53
  'react/jsx-props-no-spreading': 0,
51
54
  'react/jsx-uses-react': 'off',
52
55
  'react/react-in-jsx-scope': 'off',
53
- semi: ['error', 'never']
56
+ semi: ['error', 'never'],
57
+ 'import/extensions': ['error', 'ignorePackages', {
58
+ js: 'never',
59
+ jsx: 'never',
60
+ ts: 'never',
61
+ tsx: 'never'
62
+ }],
63
+ '@typescript-eslint/no-empty-function': 0,
64
+ '@typescript-eslint/strict-boolean-expressions': 0,
65
+ '@typescript-eslint/prefer-nullish-coalescing': 0,
66
+ 'object-curly-spacing': 0,
67
+ 'comma-dangle': 0,
68
+ 'no-unused-vars': 0
54
69
  },
55
70
  settings: {
56
71
  'import/resolver': {
57
72
  alias: {
58
73
  map: [['@papillonarts/components', '@papillonarts/components/build']],
59
- extensions: ['.js']
74
+ extensions: ['.js', '.jsx', '.ts', '.tsx']
60
75
  },
61
76
  node: {
62
- extensions: ['.js', '.jsx']
77
+ extensions: ['.js', '.jsx', '.ts', '.tsx']
63
78
  }
64
79
  },
65
80
  react: {
package/jest/config.js CHANGED
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.getJestSetup = getJestSetup;
7
+ // https://jestjs.io/docs/getting-started#using-typescript
8
+
7
9
  function getJestSetup(_ref) {
8
10
  var testPathIgnorePatterns = _ref.testPathIgnorePatterns,
9
11
  coverageDirectory = _ref.coverageDirectory,
@@ -11,11 +13,11 @@ function getJestSetup(_ref) {
11
13
  collectCoverageFrom = _ref.collectCoverageFrom,
12
14
  coverageThreshold = _ref.coverageThreshold;
13
15
  return {
14
- testMatch: ['**/?(*.)test.js?(x)'],
16
+ testMatch: ['**/?(*.)test.(js|ts)?(x)'],
15
17
  testPathIgnorePatterns: testPathIgnorePatterns,
16
18
  roots: ['<rootDir>'],
17
19
  transform: {
18
- '^.+\\.(js|jsx)$': 'babel-jest'
20
+ '^.+\\.(js|jsx|ts|tsx)$': 'babel-jest'
19
21
  },
20
22
  coverageDirectory: coverageDirectory,
21
23
  collectCoverage: collectCoverage,
@@ -28,7 +30,7 @@ function getJestSetup(_ref) {
28
30
  },
29
31
  // https://jestjs.io/docs/tutorial-react-native#transformignorepatterns-customization
30
32
  transformIgnorePatterns: ['node_modules/(?!((@)?uuid|parse5|jsdom/node_modules/parse5)/)'],
31
- moduleFileExtensions: ['js', 'jsx'],
33
+ moduleFileExtensions: ['js', 'jsx', 'ts', 'tsx'],
32
34
  coverageThreshold: coverageThreshold
33
35
  };
34
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@papillonarts/setup",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Papillon Arts Setup",
5
5
  "homepage": "https://github.com/papillonarts/papillonarts/tree/master/packages/setup",
6
6
  "repository": {
@@ -29,5 +29,5 @@
29
29
  "build-acceptance": "npm run build",
30
30
  "build-release": "npm run build"
31
31
  },
32
- "gitHead": "20dbfd5958c9d5cbbfbc8efd7103983409861851"
32
+ "gitHead": "bd716a6232e363ba61f8c1367faefbb20d4b503f"
33
33
  }
@@ -0,0 +1,3 @@
1
+ export { getStorybookMainSetup } from './mainSetup'
2
+ export { setStorybookManagerSetup } from './managerSetup'
3
+ export { getStorybookPreviewSetup } from './previewSetup'
@@ -0,0 +1,277 @@
1
+ /* https://storybook.js.org/docs/configure/integration/typescript */
2
+ /* eslint-disable no-unused-vars */
3
+ /* eslint-disable no-param-reassign */
4
+ /* eslint-disable global-require */
5
+ import webpack from 'webpack'
6
+ import type { StorybookConfig } from '@storybook/react-webpack5'
7
+ import { isEmptyObject } from '@papillonarts/library/object'
8
+ import { getBabelLoaderAdvancedSetup } from '@papillonarts/setup/webpack'
9
+
10
+ export function getStorybookMainSetup({ storiesBasePath, includeBasePath, modulesBasePath, rootAttributesDefaults }): StorybookConfig {
11
+ // https://storybook.js.org/docs/react/api/main-config
12
+ return {
13
+ // https://storybook.js.org/docs/api/main-config/main-config-preview-body
14
+ previewBody: (body) => {
15
+ if (rootAttributesDefaults) {
16
+ // https://github.com/storybookjs/storybook/issues/24429
17
+ return `
18
+ ${body}
19
+ <script type="text/javascript">
20
+ (() => {
21
+ document.addEventListener('DOMContentLoaded', function() {
22
+ const storybookRootElement = document.getElementById("storybook-root")
23
+
24
+ // https://primer.style/foundations/primitives/getting-started
25
+ storybookRootElement.setAttribute("data-color-mode", "light")
26
+ storybookRootElement.setAttribute("data-light-theme", "light")
27
+ storybookRootElement.setAttribute("data-dark-theme", "dark")
28
+ });
29
+ })()
30
+ </script>
31
+ `
32
+ }
33
+ return `${body}`
34
+ },
35
+ // https://storybook.js.org/docs/react/configure/frameworks
36
+ framework: {
37
+ name: '@storybook/react-webpack5',
38
+ options: {
39
+ fastRefresh: false,
40
+ strictMode: false,
41
+ legacyRootApi: false,
42
+ },
43
+ },
44
+
45
+ // https://storybook.js.org/docs/react/api/main-config-stories
46
+ stories: [storiesBasePath],
47
+
48
+ // https://storybook.js.org/docs/react/api/main-config-addons
49
+ // https://storybook.js.org/docs/react/addons/introduction
50
+ // https://storybook.js.org/integrations
51
+ addons: [
52
+ // https://storybook.js.org/addons/@storybook/addon-a11y
53
+ '@storybook/addon-a11y',
54
+
55
+ // included by default in @storybook/addon-essentials
56
+ // https://storybook.js.org/docs/react/essentials/actions
57
+ // https://storybook.js.org/addons/@storybook/addon-actions
58
+ // '@storybook/addon-actions',
59
+
60
+ // included by default in @storybook/addon-essentials
61
+ // https://storybook.js.org/docs/react/essentials/backgrounds
62
+ // https://storybook.js.org/addons/@storybook/addon-backgrounds
63
+ // '@storybook/addon-backgrounds',
64
+
65
+ // https://storybook.js.org/addons/chromatic
66
+ // chromatic
67
+
68
+ // included by default in @storybook/addon-essentials
69
+ // https://storybook.js.org/docs/react/essentials/controls
70
+ // https://storybook.js.org/addons/@storybook/addon-controls
71
+ // '@storybook/addon-controls',
72
+
73
+ // https://storybook.js.org/addons/storybook-addon-designs
74
+ // storybook-addon-designs
75
+
76
+ // included by default in @storybook/addon-essentials
77
+ // https://storybook.js.org/docs/react/essentials/docs (404)
78
+ // https://storybook.js.org/addons/@storybook/addon-docs
79
+ // {
80
+ // name: '@storybook/addon-docs',
81
+ // options: {
82
+ // jsxOptions: {},
83
+ // csfPluginOptions: null,
84
+ // mdxPluginOptions: {},
85
+ // transcludeMarkdown: true,
86
+ // },
87
+ // },
88
+
89
+ // https://storybook.js.org/docs/react/essentials/introduction
90
+ // https://storybook.js.org/integrations/tag/essentials
91
+ // '@storybook/addon-essentials',
92
+
93
+ // included by default in @storybook/addon-essentials
94
+ // https://storybook.js.org/docs/react/essentials/highlight (404)
95
+ // https://storybook.js.org/addons/@storybook/addon-highlight
96
+ // '@storybook/addon-highlight',
97
+
98
+ // https://storybook.js.org/addons/@storybook/addon-interactions
99
+ // '@storybook/addon-interactions',
100
+
101
+ // https://storybook.js.org/addons/@storybook/addon-jest
102
+ '@storybook/addon-jest',
103
+
104
+ // https://storybook.js.org/addons/@storybook/addon-links
105
+ '@storybook/addon-links',
106
+
107
+ // https://storybook.js.org/addons/msw-storybook-addon
108
+ // msw-storybook-addon
109
+
110
+ // included by default in @storybook/addon-essentials
111
+ // https://storybook.js.org/docs/react/essentials/measure-and-outline
112
+ // https://storybook.js.org/addons/@storybook/addon-measure
113
+ // https://storybook.js.org/addons/@storybook/addon-outline
114
+ // '@storybook/addon-measure',
115
+ // '@storybook/addon-outline',
116
+
117
+ // included by default in @storybook/addon-essentials
118
+ // https://storybook.js.org/docs/react/essentials/toolbars-and-globals
119
+ // https://storybook.js.org/addons/@storybook/addon-toolbars
120
+ // '@storybook/addon-toolbars',
121
+
122
+ // included by default in @storybook/addon-essentials
123
+ // https://storybook.js.org/docs/react/essentials/viewport
124
+ // https://storybook.js.org/addons/@storybook/addon-viewport
125
+ // '@storybook/addon-viewport',
126
+
127
+ '@chromatic-com/storybook',
128
+
129
+ // https://storybook.js.org/addons/@storybook/addon-styling-webpack
130
+ '@storybook/addon-styling-webpack',
131
+
132
+ // https://storybook.js.org/addons/@storybook/addon-themes
133
+ '@storybook/addon-themes',
134
+
135
+ '@storybook/addon-webpack5-compiler-babel',
136
+ ],
137
+
138
+ // https://storybook.js.org/docs/react/api/main-config-babel
139
+ // ...
140
+
141
+ // https://storybook.js.org/docs/react/api/main-config-babel-default
142
+ // ...
143
+
144
+ // https://storybook.js.org/docs/react/api/main-config-core
145
+ // https://storybook.js.org/docs/api/main-config/main-config-core#builder
146
+ core: { builder: { name: '@storybook/builder-webpack5', options: null } },
147
+
148
+ // https://storybook.js.org/docs/react/api/main-config-docs
149
+ // https://storybook.js.org/docs/react/writing-docs/autodocs
150
+ // https://storybook.js.org/docs/react/writing-docs/mdx
151
+ // https://storybook.js.org/docs/writing-docs/autodocs
152
+ docs: { defaultName: 'Documentation', docsMode: false },
153
+
154
+ // https://storybook.js.org/docs/react/api/main-config-env
155
+ // ...
156
+
157
+ // https://storybook.js.org/docs/react/api/main-config-features
158
+ // ...
159
+
160
+ // https://storybook.js.org/docs/react/api/main-config-log-level
161
+ logLevel: 'debug',
162
+
163
+ // https://storybook.js.org/docs/react/api/main-config-manager-head
164
+ // ...
165
+
166
+ // https://storybook.js.org/docs/react/api/main-config-preview-annotations
167
+ // ...
168
+
169
+ // https://storybook.js.org/docs/react/api/main-config-preview-body
170
+ // ...
171
+
172
+ // https://storybook.js.org/docs/react/api/main-config-preview-head
173
+ // ...
174
+
175
+ // https://storybook.js.org/docs/react/api/main-config-refs
176
+ // ...
177
+
178
+ // https://storybook.js.org/docs/react/api/main-config-static-dirs
179
+ // ...
180
+
181
+ // https://storybook.js.org/docs/react/api/main-config-typescript
182
+ // ...
183
+
184
+ // https://storybook.js.org/docs/react/api/main-config-webpack-final
185
+ webpackFinal: async (config, { configType }) => {
186
+ // @ts-ignore
187
+ const fileLoaderRuleSVG = config.module.rules.find((rule) => !isEmptyObject(rule) && rule.test.test?.('.svg'))
188
+ // @ts-ignore
189
+ fileLoaderRuleSVG.exclude = /\.svg$/
190
+
191
+ config.module.rules = config.module.rules.concat([
192
+ {
193
+ test: /\.(css|scss)$/,
194
+ use: [
195
+ {
196
+ loader: 'style-loader',
197
+ },
198
+ {
199
+ loader: 'css-loader',
200
+ options: {
201
+ importLoaders: 2,
202
+ sourceMap: true,
203
+ modules: {
204
+ localIdentName: '[name]__[local]___[hash:base64:5]',
205
+ /* https://webpack.js.org/loaders/css-loader/#exportlocalsconvention */
206
+ exportLocalsConvention: 'as-is',
207
+ },
208
+ /* https://stackoverflow.com/questions/78589664/style-loader-does-not-recoginize-default-imports-of-css-modules-in-storybooks */
209
+ esModule: false,
210
+ },
211
+ },
212
+ {
213
+ loader: 'postcss-loader',
214
+ options: {
215
+ postcssOptions: {
216
+ sourceMap: true,
217
+ plugins: () => [require('postcss-preset-env')()],
218
+ parser: 'postcss-scss',
219
+ },
220
+ },
221
+ },
222
+ {
223
+ loader: 'sass-loader',
224
+ options: {
225
+ sassOptions: {
226
+ includePaths: [modulesBasePath],
227
+ // https://sass-lang.com/documentation/js-api/interfaces/options/#quietDeps
228
+ // https://sass-lang.com/documentation/js-api/interfaces/options/#silenceDeprecations
229
+ // https://sass-lang.com/documentation/js-api/interfaces/deprecations/
230
+ quietDeps: true,
231
+ silenceDeprecations: ['import', 'global-builtin'],
232
+ },
233
+ },
234
+ },
235
+ ],
236
+ },
237
+ {
238
+ test: /\.svg$/i,
239
+ issuer: /\.[jt]sx?$/,
240
+ use: ['@svgr/webpack'],
241
+ },
242
+ {
243
+ test: /\.int.story\.mdx$/,
244
+ use: [
245
+ {
246
+ loader: 'babel-loader',
247
+ options: {
248
+ plugins: ['@babel/plugin-transform-react-jsx'],
249
+ },
250
+ },
251
+ {
252
+ loader: '@mdx-js/loader',
253
+ options: {},
254
+ },
255
+ ],
256
+ },
257
+ getBabelLoaderAdvancedSetup(),
258
+ ])
259
+ config.plugins.push(
260
+ new webpack.ProvidePlugin({
261
+ process: 'process/browser',
262
+ }),
263
+ )
264
+
265
+ config.resolve.fallback = {
266
+ ...config.resolve.fallback,
267
+ tty: require.resolve('tty-browserify'),
268
+ }
269
+
270
+ return config
271
+ },
272
+ typescript: {
273
+ reactDocgen: 'react-docgen-typescript',
274
+ check: true,
275
+ },
276
+ }
277
+ }
@@ -0,0 +1,9 @@
1
+ import { addons } from 'storybook/manager-api'
2
+ import { create } from 'storybook/theming'
3
+
4
+ export function setStorybookManagerSetup({ panelPosition, theme }) {
5
+ addons.setConfig({
6
+ panelPosition,
7
+ theme: create(theme),
8
+ })
9
+ }
@@ -0,0 +1,50 @@
1
+ import { MemoryRouter } from 'react-router-dom'
2
+ import { DocsPage, DocsContainer } from '@storybook/addon-docs/blocks'
3
+
4
+ export function getStorybookPreviewSetup({ parameters: { a11y, decorators, docs } }) {
5
+ let parameters = {}
6
+
7
+ if (a11y) {
8
+ parameters = {
9
+ ...parameters,
10
+ a11y: {
11
+ ...{
12
+ // optional selector which element to inspect
13
+ // element: '#root',
14
+ // axe-core configurationOptions (https://github.com/dequelabs/axe-core/blob/develop/doc/API.md#parameters-1)
15
+ config: {},
16
+ // axe-core optionsParameter (https://github.com/dequelabs/axe-core/blob/develop/doc/API.md#options-parameter)
17
+ options: {},
18
+ // optional flag to prevent the automatic check
19
+ // manual: true,
20
+ },
21
+ },
22
+ }
23
+ }
24
+
25
+ if (decorators) {
26
+ parameters = {
27
+ ...parameters,
28
+ decorators: [
29
+ ...[
30
+ (Story) => (
31
+ <MemoryRouter>
32
+ <Story />
33
+ </MemoryRouter>
34
+ ),
35
+ ],
36
+ ],
37
+ }
38
+ }
39
+
40
+ if (docs) {
41
+ parameters = {
42
+ ...parameters,
43
+ docs: {
44
+ ...{ container: DocsContainer, page: DocsPage },
45
+ },
46
+ }
47
+ }
48
+
49
+ return { parameters }
50
+ }
@@ -0,0 +1,24 @@
1
+ export const coreJSVersion = '3.46.0'
2
+
3
+ export const targetBrowsers = {
4
+ production: ['> 1%', 'last 2 versions', 'Firefox ESR'],
5
+ legacyBrowsers: ['> 1%', 'last 2 versions', 'Firefox ESR'],
6
+ modernBrowsers: [
7
+ 'last 2 Chrome versions',
8
+ 'not Chrome < 60',
9
+ 'last 2 Safari versions',
10
+ 'not Safari < 10.1',
11
+ 'last 2 iOS versions',
12
+ 'not iOS < 10.3',
13
+ 'last 2 Firefox versions',
14
+ 'not Firefox < 54',
15
+ 'last 2 Edge versions',
16
+ 'not Edge < 15',
17
+ ],
18
+ }
19
+
20
+ export const manifestFileName = 'manifest.json'
21
+
22
+ export const indexHTMLName = 'index.html'
23
+
24
+ export const extensions = ['.js', '.jsx', '.json', '.scss']
@@ -0,0 +1,27 @@
1
+ export { getBabelLoaderAdvancedSetup } from './loader/babelLoader'
2
+ export { getCSSLoaderStandardSetup } from './loader/cssLoader'
3
+ export { getFontLoaderStandardSetup } from './loader/fontLoader'
4
+ export { getImageLoaderStandardSetup } from './loader/imageLoader'
5
+ export { getMarkdownLoaderStandardSetup } from './loader/markdownLoader'
6
+ export { getPostCSSLoaderStandardSetup } from './loader/postCSSLoader'
7
+ export { getSassLoaderStandardSetup } from './loader/sassLoader'
8
+ export { getSVGRLoaderStandardSetup, getSVGRLoaderAdvancedSetup } from './loader/svgrLoader'
9
+ export { getBannerPluginStandardSetup } from './plugin/bannerPlugin'
10
+ export { getCleanWebpackPluginStandardSetup, getCleanWebpackPluginAdvancedSetup } from './plugin/cleanWebpackPlugin'
11
+ export { getCopyWebpackPluginStandardSetup } from './plugin/copyWebpackPlugin'
12
+ export { getCSSMinimizerWebpackPluginStandardSetup } from './plugin/cssMinimizerWebpackPlugin'
13
+ export { getDotenvWebpackStandardSetup, getDotenvWebpackAdvancedSetup } from './plugin/dotenvWebpack'
14
+ export { getHotModuleReplacementPluginStandardSetup } from './plugin/hotModuleReplacementPlugin'
15
+ export { getHtmlWebpackPluginStandardSetup, getHtmlWebpackPluginAdvancedSetup } from './plugin/htmlWebpackPlugin'
16
+ export {
17
+ MiniCSSExtractPluginLoader,
18
+ getMiniCSSExtractPluginStandardSetup,
19
+ getMiniCSSExtractPluginAdvancedSetup,
20
+ } from './plugin/miniCSSExtractPlugin'
21
+ export { getModuleConcatenationPluginStandardSetup } from './plugin/moduleConcatenationPlugin'
22
+ export { getWebpackBundleAnalyzerStandardSetup } from './plugin/webpackBundleAnalyzer'
23
+ export { getWebpackManifestPluginStandardSetup } from './plugin/webpackManifestPlugin'
24
+ export { getDevServerStandardSetup } from './server/devServer'
25
+ export { getWebpackCommonSetup } from './setup/commonSetup'
26
+ export { getWebpackDevelopmentSetup } from './setup/developmentSetup'
27
+ export { getWebpackProductionSetup } from './setup/productionSetup'
@@ -0,0 +1,38 @@
1
+ // https://github.com/babel/babel-loader
2
+
3
+ import { coreJSVersion, targetBrowsers } from '../constant'
4
+
5
+ export function getBabelLoaderAdvancedSetup() {
6
+ return {
7
+ test: /\.(js|jsx)$/,
8
+ exclude: /node_modules/,
9
+ use: {
10
+ loader: 'babel-loader',
11
+ options: {
12
+ presets: [
13
+ [
14
+ '@babel/preset-env',
15
+ {
16
+ modules: false,
17
+ useBuiltIns: 'entry',
18
+ corejs: coreJSVersion,
19
+ targets: { browsers: Object.values(targetBrowsers.modernBrowsers) },
20
+ },
21
+ ],
22
+ '@babel/preset-react',
23
+ '@babel/preset-typescript',
24
+ ],
25
+ plugins: [
26
+ [
27
+ '@babel/plugin-transform-react-jsx',
28
+ {
29
+ runtime: 'automatic',
30
+ },
31
+ ],
32
+ '@babel/plugin-transform-runtime',
33
+ 'syntax-async-functions',
34
+ ],
35
+ },
36
+ },
37
+ }
38
+ }
@@ -0,0 +1,13 @@
1
+ // https://github.com/webpack-contrib/css-loader
2
+
3
+ export function getCSSLoaderStandardSetup({ sourceMap, modules, esModule }) {
4
+ return {
5
+ loader: 'css-loader',
6
+ options: {
7
+ importLoaders: 2,
8
+ sourceMap,
9
+ modules,
10
+ esModule,
11
+ },
12
+ }
13
+ }
@@ -0,0 +1,8 @@
1
+ // https://webpack.js.org/guides/asset-management/#loading-fonts
2
+
3
+ export function getFontLoaderStandardSetup() {
4
+ return {
5
+ test: /\.(woff|woff2|eot|ttf|otf)$/i,
6
+ type: 'asset/resource',
7
+ }
8
+ }
@@ -0,0 +1,8 @@
1
+ // https://webpack.js.org/guides/asset-management/#loading-images
2
+
3
+ export function getImageLoaderStandardSetup() {
4
+ return {
5
+ test: /\.(png|jpg|jpeg|gif)$/i,
6
+ type: 'asset/resource',
7
+ }
8
+ }
@@ -0,0 +1,17 @@
1
+ // https://github.com/webpack-contrib/html-loader
2
+ // https://github.com/peerigon/markdown-loader
3
+
4
+ export function getMarkdownLoaderStandardSetup() {
5
+ return {
6
+ test: /\.md$/,
7
+ use: [
8
+ {
9
+ loader: 'html-loader',
10
+ },
11
+ {
12
+ loader: 'markdown-loader',
13
+ options: {},
14
+ },
15
+ ],
16
+ }
17
+ }
@@ -0,0 +1,14 @@
1
+ // https://github.com/webpack-contrib/postcss-loader
2
+
3
+ export function getPostCSSLoaderStandardSetup() {
4
+ return {
5
+ loader: 'postcss-loader',
6
+ options: {
7
+ postcssOptions: {
8
+ sourceMap: true,
9
+ plugins: () => ['postcss-preset-env'],
10
+ parser: 'postcss-scss',
11
+ },
12
+ },
13
+ }
14
+ }