arui-scripts 20.0.0 → 20.1.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.
@@ -0,0 +1,130 @@
1
+ # Compression dictionary transport
2
+
3
+ ## Настройки
4
+
5
+ ### `dictionaryCompression.dictionaryPath`
6
+ **Тип:** `string[]`
7
+ **По умолчанию:** `[]`
8
+ **Описание:** Массив путей до предыдущих версий ассетов или готовых словарей для сжатия бандла приложения.
9
+
10
+ - Поддерживает как абсолютные, так и относительные пути (относительно корня проекта)
11
+ - Может содержать как файлы (готовые словари), так и директории (предыдущие версии приложения)
12
+ - Словари будут скопированы в директорию сборки
13
+ - Директории используются для создания DCB-файлов из предыдущих версий
14
+
15
+ ### `dictionaryCompression.enablePreviousVersionHeaders`
16
+ **Тип:** `boolean`
17
+ **По умолчанию:** `false`
18
+ **Описание:** Включает автоматическую простановку заголовка `brotli_auto_dictionary on;` в конфигурации nginx для использования ресурсов приложения как словарей.
19
+
20
+ ## Пример конфигурации
21
+
22
+ ```ts
23
+ import { PackageSettings } from 'arui-scripts';
24
+
25
+ const settings: PackageSettings = {
26
+ dictionaryCompression: {
27
+ dictionaryPath: [
28
+ './build-v1.0', // Предыдущая версия (директория)
29
+ './custom.dict' // Готовый словарь (файл)
30
+ ],
31
+ enablePreviousVersionHeaders: true
32
+ }
33
+ };
34
+
35
+ export default settings;
36
+ ```
37
+
38
+ ## Общее описание механизма
39
+
40
+ Механизм [compression dictionary transport](https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Compression_dictionary_transport)
41
+ позволяет использовать кастомные словари для сжатия ресурсов приложения.
42
+
43
+ На данный момент arui-scripts поддерживает два механизма работы со словарями:
44
+ 1. Использование вашего собственного словаря для сжатия ресурсов приложения
45
+ 2. Использование одной версии вашего приложения для сжатия ресурсов другой версии.
46
+
47
+ Оба механизма работают только для prod сборки приложения при использовании базового docker образа, поставляемого с arui-scripts.
48
+
49
+ ### Использование вашего словаря
50
+
51
+ По умолчанию brotli использует встроенный в него словарь для более эффективного сжатия. Встроенный в brotli словарь подготовлен
52
+ на основании данных из всего интернета. Если сделать словарь персонально под ваши ресурсы - можно получить более эффективное сжатие, даже
53
+ учитывая дополнительные затраты на загрузку словаря на клиент.
54
+
55
+ #### Создание персонального словаря
56
+ Для создания персонального словаря вы можете использовать утилиту [brotli-dict](https://www.npmjs.com/package/brotli-dict).
57
+
58
+ ```shell
59
+ npx brotli-dict generate file1.js file2.js file3.css -o dictionary.dict -s 200000
60
+ ```
61
+
62
+ Здесь:
63
+ - `file1.js`, `file2.js`, `file3.css` - произвольные текстовые файлы которые вы хотите использовать для создания словаря
64
+ - `dictionary.dict` - имя файла для создаваемого словаря
65
+ - `-s 200000` - ограничивает максимальную длину словаря в 200000. Имейте в виду, что словарь после создания так же можно сжать, поэтому по сети будет передаваться меньше данных.
66
+
67
+ Рекомендуется создать 1 словарь на всю систему, живущую на одном домене. Вы можете взять ресурсы с самых посещаемых страниц и использовать их как исходники для словаря.
68
+ Обновлять их при изменении приложений не обязательно - словари скорее всего не будут содержать сильно специфичного для конкретной версии контента.
69
+
70
+ #### Выбор идентификатора для словаря
71
+
72
+ Для корректной работы со словарем у него должен быть идентификатор. Он будет:
73
+ - использоваться как имя файла для словаря
74
+ - использоваться как суффикс имени сжатых словарем ассетов
75
+ - использоваться в заголовке `Use-As-Dictionary`.
76
+
77
+ В дальнейших примерах я буду использовать идентификатор `dict-id`.
78
+
79
+ #### Загрузка словаря на клиент
80
+ Для того чтобы браузер начал использовать словари их нужно как то загрузить на клиент.
81
+ Это можно сделать 3 способами:
82
+
83
+ - Указав заголовок `Link '</assets/dict-id.dict>; rel="compression-dictionary"';` в ответе на запрос за любым документом
84
+ - Добавив тег `<link rel="compression-dictionary" href="./assets/dict-id.dict" />` в html вашего приложения
85
+ - Сделав `fetch` адреса словаря из вашего кода (`fetch('./assets/dict-id.dict')`).
86
+
87
+ В независимости от метода, в ответ браузер **должен** получить помимо контента словаря так же заголовок `Use-As-Dictionary`, например:
88
+ ```
89
+ Use-As-Dictionary: 'match="/assets/*", id="dict-id"'
90
+ ```
91
+
92
+ Вы можете добиться этого добавив такие строки в nginx.conf:
93
+
94
+ ```
95
+ location /assets/dict-id.dict {
96
+ expires max;
97
+ add_header Use-As-Dictionary 'match="/assets/*", id="dict-id"';
98
+ root /src/.build;
99
+ }
100
+ ```
101
+
102
+ Про то, как корректно настраивать заголовок `Use-As-Dictionary` можно прочитать в [mdn](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Use-As-Dictionary).
103
+
104
+ ### Использование предыдущих версий приложения
105
+
106
+ Если ваше приложение часто обновляется, а пользователи все время возвращаются - можно использовать механизм сжатия с помощью предыдущих версий.
107
+ Он может давать очень высокий коэффицент сжатия если у пользователя есть предыдущая версия приложения в кеше.
108
+
109
+ #### Настройка
110
+
111
+ ```ts
112
+ const settings: PackageSettings = {
113
+ dictionaryCompression: {
114
+ dictionaryPath: [
115
+ './previous-builds/v1.0/assets',
116
+ './previous-builds/v1.1/assets'
117
+ ],
118
+ enablePreviousVersionHeaders: true
119
+ }
120
+ };
121
+ ```
122
+
123
+ При такой конфигурации:
124
+ 1. **arui-scripts** найдёт все `.js` и `.css` файлы в указанных директориях
125
+ 2. Создаст DCB-файлы (Dictionary Compressed Brotli) для каждого файла текущей сборки, используя соответствующие файлы из предыдущих версий как словари
126
+ 3. Nginx будет настроен с `brotli_auto_dictionary on;` для автоматического использования этих словарей
127
+
128
+ Соответствие файлов определяется по их имени. Считаем что файлы в сборке используют формат вида `{stable-name}.{hash}.{ext}`. Соответствующими считаются файлы с одинаковым
129
+ `{stable-name}` и `{ext}`.
130
+ DCB файлы будут иметь название `{stable-name}.{hash}.{ext}.{dict hash}.dcb`.
package/docs/settings.md CHANGED
@@ -162,7 +162,6 @@ const settings = {
162
162
  Ко всем клиентским entryPoint так же будут добавлены `clientPolyfillsEntry` (если задан)
163
163
  и, в dev режиме, необходимые для hot-module-reload файлы
164
164
 
165
-
166
165
  ### Настройки сборки артефактов
167
166
 
168
167
  #### dockerRegistry
@@ -200,6 +199,20 @@ const settings = {
200
199
  #### archiveName
201
200
  Имя архива, который будет создан при использовании команды [archive-build](./commands.md#archive-build). По умолчанию `'build.tar'`.
202
201
 
202
+ #### dictionaryCompression
203
+
204
+ Настройки сжатия со словарём. Используется для сжатия ассетов с поддержкой compression dictionary transport.
205
+
206
+ - `dictionaryCompression.dictionaryPath` - массив строк с путями до предыдущих версий ассетов или словарей, с помощью которых будет сжат бандл приложения.
207
+ - `dictionaryCompression.enablePreviousVersionHeaders` - включает автоматическую простановку заголовков `Use-As-Dictionary` для использования ресурсов приложения как словарей. Можно включать только при использовании последних версий базовых докер-образов.
208
+
209
+ Если `dictionaryPath` содержит путь до единичного файла - этот файл будет использован как словарь для сжатия всех ассетов приложения.
210
+ Сам словарь так же будет добавлен в сборку и сжат с помощью brotli.
211
+
212
+ Если `dictionaryPath` содержит путь до папки - эта папка будет рассматриваться как папка с предыдущей версией приложения. Файлы из текущей сборки будут сжиматься с помощью совпадающих файлов предыдущей версии.
213
+
214
+ Подробнее об этой фиче можно почитать в [отдельном документе](./compression-dictionary).
215
+
203
216
  ### Модификация сборки
204
217
  #### keepPropTypes
205
218
  Позволяет отключить удаление `prop-types` из бандла. По умолчанию `false`.
package/package.json CHANGED
@@ -1,180 +1,181 @@
1
1
  {
2
- "name": "arui-scripts",
3
- "version": "20.0.0",
4
- "main": "./build/index.js",
5
- "typings": "./build/index.d.ts",
6
- "license": "MPL-2.0",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/core-ds/arui-scripts.git"
10
- },
11
- "bugs": {
12
- "url": "https://github.com/core-ds/arui-scripts/issues"
13
- },
14
- "homepage": "https://github.com/core-ds/arui-scripts#readme",
15
- "bin": "./build/bin/index.js",
16
- "dependencies": {
17
- "@alfalab/postcss-custom-properties": "^9.1.2",
18
- "@babel/core": "7.22.10",
19
- "@babel/plugin-proposal-decorators": "^7.23.7",
20
- "@babel/plugin-proposal-export-default-from": "^7.23.3",
21
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
22
- "@babel/plugin-transform-class-properties": "^7.23.3",
23
- "@babel/plugin-transform-export-namespace-from": "^7.23.4",
24
- "@babel/plugin-transform-modules-commonjs": "7.22.5",
25
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
26
- "@babel/plugin-transform-numeric-separator": "^7.23.4",
27
- "@babel/plugin-transform-object-rest-spread": "^7.23.4",
28
- "@babel/plugin-transform-optional-chaining": "^7.23.4",
29
- "@babel/plugin-transform-private-methods": "^7.23.3",
30
- "@babel/plugin-transform-private-property-in-object": "^7.23.4",
31
- "@babel/plugin-transform-proto-to-assign": "^7.23.3",
32
- "@babel/plugin-transform-react-constant-elements": "^7.23.3",
33
- "@babel/plugin-transform-react-inline-elements": "^7.23.3",
34
- "@babel/plugin-transform-runtime": "^7.23.7",
35
- "@babel/preset-env": "^7.23.8",
36
- "@babel/preset-react": "^7.23.3",
37
- "@babel/preset-typescript": "^7.23.3",
38
- "@babel/runtime": "^7.23.8",
39
- "@pmmmwh/react-refresh-webpack-plugin": "0.5.11",
40
- "@rsdoctor/rspack-plugin": "0.4.11",
41
- "@rspack/cli": "1.1.5",
42
- "@rspack/core": "1.1.5",
43
- "@rspack/dev-server": "1.0.9",
44
- "@rspack/plugin-react-refresh": "^1.0.0",
45
- "@swc/core": "1.9.3",
46
- "@swc/jest": "^0.2.36",
47
- "assets-webpack-plugin": "7.1.1",
48
- "autoprefixer": "^10.3.16",
49
- "babel-core": "^7.0.0-bridge.0",
50
- "babel-jest": "28.1.3",
51
- "babel-loader": "9.2.1",
52
- "babel-plugin-istanbul": "^7.0.0",
53
- "babel-plugin-transform-react-remove-prop-types": "0.4.24",
54
- "case-sensitive-paths-webpack-plugin": "2.4.0",
55
- "chalk": "^2.4.2",
56
- "compression-webpack-plugin": "9.2.0",
57
- "core-js": "3.32.0",
58
- "css-loader": "6.8.1",
59
- "css-minimizer-webpack-plugin": "3.4.1",
60
- "expose-loader": "3.1.0",
61
- "filesize": "^6.4.0",
62
- "fork-ts-checker-webpack-plugin": "6.5.3",
63
- "fs-extra": "6.0.1",
64
- "gzip-size": "5.1.1",
65
- "html-webpack-plugin": "^5.6.0",
66
- "image-minimizer-webpack-plugin": "^3.8.3",
67
- "imagemin": "^8.0.1",
68
- "imagemin-svgo": "^10.0.1",
69
- "jest": "^29.7.0",
70
- "jest-config": "^29.7.0",
71
- "jest-resolve": "^29.7.0",
72
- "jest-snapshot-serializer-class-name-to-string": "1.0.0",
73
- "lodash.merge": "4.6.2",
74
- "mini-css-extract-plugin": "2.7.6",
75
- "mini-svg-data-uri": "^1.4.4",
76
- "null-loader": "0.1.1",
77
- "pnp-webpack-plugin": "1.7.0",
78
- "postcss": "^8.4.31",
79
- "postcss-calc": "^9.0.0",
80
- "postcss-color-function": "^4.0.0",
81
- "postcss-color-mod-function": "^3.0.0",
82
- "postcss-custom-media": "^9.0.0",
83
- "postcss-custom-properties": "^13.0.0",
84
- "postcss-discard-comments": "^6.0.0",
85
- "postcss-discard-duplicates": "^6.0.0",
86
- "postcss-each": "^1.0.0",
87
- "postcss-for": "^2.0.0",
88
- "postcss-import": "^15.0.0",
89
- "postcss-inherit": "^4.0.0",
90
- "postcss-loader": "^7.0.0",
91
- "postcss-media-query-parser": "^0.2.3",
92
- "postcss-mixins": "^9.0.0",
93
- "postcss-nested": "^6.0.0",
94
- "postcss-omit-import-tilde": "^1.0.0",
95
- "postcss-remove-root": "^0.0.2",
96
- "postcss-strip-units": "^2.0.0",
97
- "postcss-url": "^10.0.0",
98
- "react-dev-utils": "12.0.1",
99
- "react-refresh": "0.10.0",
100
- "react-refresh-typescript": "2.0.2",
101
- "rimraf": "^2.7.1",
102
- "rspack-manifest-plugin": "5.0.1",
103
- "run-script-webpack-plugin": "0.0.11",
104
- "semver": "^7.5.4",
105
- "shelljs": "0.8.5",
106
- "strip-ansi": "6.0.1",
107
- "style-loader": "3.3.3",
108
- "swc-loader": "^0.2.6",
109
- "swc-plugin-coverage-instrument": "^0.0.25",
110
- "tar": "6.2.1",
111
- "terser-webpack-plugin": "5.3.14",
112
- "ts-jest": "28.0.8",
113
- "ts-loader": "9.4.4",
114
- "ts-node": "9.1.1",
115
- "webpack-bundle-analyzer": "4.10.2",
116
- "webpack-deduplication-plugin": "^0.0.8",
117
- "webpack-manifest-plugin": "3.2.0",
118
- "webpack-node-externals": "3.0.0"
119
- },
120
- "devDependencies": {
121
- "@types/assets-webpack-plugin": "6.1.2",
122
- "@types/case-sensitive-paths-webpack-plugin": "2.1.6",
123
- "@types/compression-webpack-plugin": "4.0.1",
124
- "@types/fs-extra": "^9.0.13",
125
- "@types/jest": "^29.5.14",
126
- "@types/lodash.merge": "^4.6.7",
127
- "@types/node": "12.20.55",
128
- "@types/postcss-media-query-parser": "0.2.4",
129
- "@types/react-dev-utils": "9.0.11",
130
- "@types/semver": "^7.5.0",
131
- "@types/shelljs": "^0.8.12",
132
- "@types/start-server-webpack-plugin": "2.2.2",
133
- "@types/tar": "^4.0.5",
134
- "@types/webpack": "^5.28.5",
135
- "@types/webpack-bundle-analyzer": "4.7.0",
136
- "@types/webpack-dev-server": "^4.7.1",
137
- "@types/webpack-manifest-plugin": "3.0.5",
138
- "@types/webpack-node-externals": "^3.0.0",
139
- "eslint": "^8.20.0",
140
- "eslint-config-custom": "workspace:*",
141
- "prettier": "^2.7.1",
142
- "stylelint": "^14.9.1",
143
- "type-fest": "2.19.0",
144
- "typescript": "5.6.3"
145
- },
146
- "optionalDependencies": {
147
- "brotli-size": "^4.0.0"
148
- },
149
- "engines": {
150
- "node": ">=12.13.0"
151
- },
152
- "scripts": {
153
- "build": "sh bin/build.sh",
154
- "test": "jest",
155
- "lint:css": "stylelint ./src/**/*.css",
156
- "lint:scripts": "eslint \"**/*.{js,jsx,ts,tsx}\" --ext .js,.jsx,.ts,.tsx",
157
- "lint": "yarn lint:css && yarn lint:scripts",
158
- "lint:fix": "yarn lint:css --fix && yarn lint:scripts --fix",
159
- "format": "prettier --write $INIT_CWD/{config,src}/**/*.{ts,tsx,js,jsx,css}",
160
- "audit": "yarn npm audit --severity high --environment production"
161
- },
162
- "peerDependencies": {
163
- "imagemin-gifsicle": "^7.0.0",
164
- "imagemin-mozjpeg": "^10.0.0",
165
- "imagemin-optipng": "^8.0.0",
166
- "react": ">=16.3.0",
167
- "react-dom": ">=16.3.0",
168
- "typescript": ">=4.0.0"
169
- },
170
- "jest": {
171
- "testRegex": "src/.*/__tests__/.*\\.ts$",
172
- "moduleFileExtensions": [
173
- "ts",
174
- "js"
175
- ],
176
- "transform": {
177
- "^.+\\.tsx?$": "ts-jest"
178
- }
2
+ "name": "arui-scripts",
3
+ "version": "20.1.0",
4
+ "main": "./build/index.js",
5
+ "typings": "./build/index.d.ts",
6
+ "license": "MPL-2.0",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/core-ds/arui-scripts.git"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/core-ds/arui-scripts/issues"
13
+ },
14
+ "homepage": "https://github.com/core-ds/arui-scripts#readme",
15
+ "bin": "./build/bin/index.js",
16
+ "dependencies": {
17
+ "@alfalab/postcss-custom-properties": "^9.1.2",
18
+ "@babel/core": "7.22.10",
19
+ "@babel/plugin-proposal-decorators": "^7.23.7",
20
+ "@babel/plugin-proposal-export-default-from": "^7.23.3",
21
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
22
+ "@babel/plugin-transform-class-properties": "^7.23.3",
23
+ "@babel/plugin-transform-export-namespace-from": "^7.23.4",
24
+ "@babel/plugin-transform-modules-commonjs": "7.22.5",
25
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
26
+ "@babel/plugin-transform-numeric-separator": "^7.23.4",
27
+ "@babel/plugin-transform-object-rest-spread": "^7.23.4",
28
+ "@babel/plugin-transform-optional-chaining": "^7.23.4",
29
+ "@babel/plugin-transform-private-methods": "^7.23.3",
30
+ "@babel/plugin-transform-private-property-in-object": "^7.23.4",
31
+ "@babel/plugin-transform-proto-to-assign": "^7.23.3",
32
+ "@babel/plugin-transform-react-constant-elements": "^7.23.3",
33
+ "@babel/plugin-transform-react-inline-elements": "^7.23.3",
34
+ "@babel/plugin-transform-runtime": "^7.23.7",
35
+ "@babel/preset-env": "^7.23.8",
36
+ "@babel/preset-react": "^7.23.3",
37
+ "@babel/preset-typescript": "^7.23.3",
38
+ "@babel/runtime": "^7.26.10",
39
+ "@pmmmwh/react-refresh-webpack-plugin": "0.5.11",
40
+ "@rsdoctor/rspack-plugin": "0.4.11",
41
+ "@rspack/cli": "1.1.5",
42
+ "@rspack/core": "1.1.5",
43
+ "@rspack/dev-server": "1.0.9",
44
+ "@rspack/plugin-react-refresh": "^1.0.0",
45
+ "@swc/core": "1.9.3",
46
+ "@swc/jest": "^0.2.36",
47
+ "assets-webpack-plugin": "7.1.1",
48
+ "autoprefixer": "^10.3.16",
49
+ "babel-core": "^7.0.0-bridge.0",
50
+ "babel-jest": "28.1.3",
51
+ "babel-loader": "9.2.1",
52
+ "babel-plugin-istanbul": "^7.0.0",
53
+ "babel-plugin-transform-react-remove-prop-types": "0.4.24",
54
+ "brotli-dict": "^1.1.4",
55
+ "case-sensitive-paths-webpack-plugin": "2.4.0",
56
+ "chalk": "^2.4.2",
57
+ "compression-webpack-plugin": "9.2.0",
58
+ "core-js": "3.32.0",
59
+ "css-loader": "6.8.1",
60
+ "css-minimizer-webpack-plugin": "3.4.1",
61
+ "expose-loader": "3.1.0",
62
+ "filesize": "^6.4.0",
63
+ "fork-ts-checker-webpack-plugin": "6.5.3",
64
+ "fs-extra": "6.0.1",
65
+ "gzip-size": "5.1.1",
66
+ "html-webpack-plugin": "^5.6.0",
67
+ "image-minimizer-webpack-plugin": "^3.8.3",
68
+ "imagemin": "^8.0.1",
69
+ "imagemin-svgo": "^10.0.1",
70
+ "jest": "^29.7.0",
71
+ "jest-config": "^29.7.0",
72
+ "jest-resolve": "^29.7.0",
73
+ "jest-snapshot-serializer-class-name-to-string": "1.0.0",
74
+ "lodash.merge": "4.6.2",
75
+ "mini-css-extract-plugin": "2.7.6",
76
+ "mini-svg-data-uri": "^1.4.4",
77
+ "null-loader": "0.1.1",
78
+ "pnp-webpack-plugin": "1.7.0",
79
+ "postcss": "^8.4.31",
80
+ "postcss-calc": "^9.0.0",
81
+ "postcss-color-function": "^4.0.0",
82
+ "postcss-color-mod-function": "^3.0.0",
83
+ "postcss-custom-media": "^9.0.0",
84
+ "postcss-custom-properties": "^13.0.0",
85
+ "postcss-discard-comments": "^6.0.0",
86
+ "postcss-discard-duplicates": "^6.0.0",
87
+ "postcss-each": "^1.0.0",
88
+ "postcss-for": "^2.0.0",
89
+ "postcss-import": "^15.0.0",
90
+ "postcss-inherit": "^4.0.0",
91
+ "postcss-loader": "^7.0.0",
92
+ "postcss-media-query-parser": "^0.2.3",
93
+ "postcss-mixins": "^9.0.0",
94
+ "postcss-nested": "^6.0.0",
95
+ "postcss-omit-import-tilde": "^1.0.0",
96
+ "postcss-remove-root": "^0.0.2",
97
+ "postcss-strip-units": "^2.0.0",
98
+ "postcss-url": "^10.0.0",
99
+ "react-dev-utils": "12.0.1",
100
+ "react-refresh": "0.10.0",
101
+ "react-refresh-typescript": "2.0.2",
102
+ "rimraf": "^2.7.1",
103
+ "rspack-manifest-plugin": "5.0.1",
104
+ "run-script-webpack-plugin": "0.0.11",
105
+ "semver": "^7.5.4",
106
+ "shelljs": "0.8.5",
107
+ "strip-ansi": "6.0.1",
108
+ "style-loader": "3.3.3",
109
+ "swc-loader": "^0.2.6",
110
+ "swc-plugin-coverage-instrument": "^0.0.25",
111
+ "tar": "6.2.1",
112
+ "terser-webpack-plugin": "5.3.14",
113
+ "ts-jest": "28.0.8",
114
+ "ts-loader": "9.4.4",
115
+ "ts-node": "9.1.1",
116
+ "webpack-bundle-analyzer": "4.10.2",
117
+ "webpack-deduplication-plugin": "^0.0.8",
118
+ "webpack-manifest-plugin": "3.2.0",
119
+ "webpack-node-externals": "3.0.0"
120
+ },
121
+ "devDependencies": {
122
+ "@types/assets-webpack-plugin": "6.1.2",
123
+ "@types/case-sensitive-paths-webpack-plugin": "2.1.6",
124
+ "@types/compression-webpack-plugin": "4.0.1",
125
+ "@types/fs-extra": "^9.0.13",
126
+ "@types/jest": "^29.5.14",
127
+ "@types/lodash.merge": "^4.6.7",
128
+ "@types/node": "18.19.121",
129
+ "@types/postcss-media-query-parser": "0.2.4",
130
+ "@types/react-dev-utils": "9.0.11",
131
+ "@types/semver": "^7.5.0",
132
+ "@types/shelljs": "^0.8.12",
133
+ "@types/start-server-webpack-plugin": "2.2.2",
134
+ "@types/tar": "^4.0.5",
135
+ "@types/webpack": "^5.28.5",
136
+ "@types/webpack-bundle-analyzer": "4.7.0",
137
+ "@types/webpack-dev-server": "^4.7.1",
138
+ "@types/webpack-manifest-plugin": "3.0.5",
139
+ "@types/webpack-node-externals": "^3.0.0",
140
+ "eslint": "^8.20.0",
141
+ "eslint-config-custom": "0.0.0",
142
+ "prettier": "^2.7.1",
143
+ "stylelint": "^14.9.1",
144
+ "type-fest": "2.19.0",
145
+ "typescript": "5.6.3"
146
+ },
147
+ "optionalDependencies": {
148
+ "brotli-size": "^4.0.0"
149
+ },
150
+ "engines": {
151
+ "node": ">=12.13.0"
152
+ },
153
+ "scripts": {
154
+ "build": "sh bin/build.sh",
155
+ "test": "jest",
156
+ "lint:css": "stylelint ./src/**/*.css",
157
+ "lint:scripts": "eslint \"**/*.{js,jsx,ts,tsx}\" --ext .js,.jsx,.ts,.tsx",
158
+ "lint": "yarn lint:css && yarn lint:scripts",
159
+ "lint:fix": "yarn lint:css --fix && yarn lint:scripts --fix",
160
+ "format": "prettier --write $INIT_CWD/{config,src}/**/*.{ts,tsx,js,jsx,css}",
161
+ "audit": "yarn npm audit --severity high --environment production"
162
+ },
163
+ "peerDependencies": {
164
+ "imagemin-gifsicle": "^7.0.0",
165
+ "imagemin-mozjpeg": "^10.0.0",
166
+ "imagemin-optipng": "^8.0.0",
167
+ "react": ">=16.3.0",
168
+ "react-dom": ">=16.3.0",
169
+ "typescript": ">=4.0.0"
170
+ },
171
+ "jest": {
172
+ "testRegex": "src/.*/__tests__/.*\\.ts$",
173
+ "moduleFileExtensions": [
174
+ "ts",
175
+ "js"
176
+ ],
177
+ "transform": {
178
+ "^.+\\.tsx?$": "ts-jest"
179
179
  }
180
- }
180
+ }
181
+ }