@tramvai/cli 3.24.1 → 3.25.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.
package/README.md CHANGED
@@ -305,3 +305,4 @@ Documentation:
305
305
 
306
306
  - [How to use React Profiler](https://legacy.reactjs.org/blog/2018/09/10/introducing-the-react-profiler.html)
307
307
  - [Introducing a new React profiler (React 18)](https://github.com/reactwg/react-18/discussions/76)
308
+ - [React DevTools tutorial](https://react-devtools-tutorial.vercel.app/)
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/builder/webpack/devServer/setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAsC9D,eAAO,MAAM,eAAe;QAMtB,SAAS;cACH,aAAa;mBACR,cAAc,sBAAsB,CAAC;kBACtC,0BAA0B;yBAsCzC,CAAC"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../../src/builder/webpack/devServer/setup.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AACvF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAsC9D,eAAO,MAAM,eAAe;QAMtB,SAAS;cACH,aAAa;mBACR,cAAc,sBAAsB,CAAC;kBACtC,0BAA0B;yBAyCzC,CAAC"}
@@ -56,7 +56,7 @@ const createDevServer = ({ di, compiler, configManager, staticServer, }) => {
56
56
  },
57
57
  });
58
58
  if (configManager.hotRefresh.enabled) {
59
- app.use(getHotModulePrefix(configManager), (0, webpack_hot_middleware_1.default)(compiler, { log: false }));
59
+ app.use(getHotModulePrefix(configManager), (0, webpack_hot_middleware_1.default)(compiler, { log: false, statsOptions: { cached: false } }));
60
60
  }
61
61
  const rootDir = di.get(tokens_1.CONFIG_ROOT_DIR_TOKEN);
62
62
  app.use(express_1.default.static(rootDir));
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/builder/webpack/devServer/setup.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/builder/webpack/devServer/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const getImageMiniatureDataURL: (content: Buffer, width: number, height: number, extension: string) => Promise<string>;
2
+ //# sourceMappingURL=getImageMiniatureURL.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getImageMiniatureURL.d.ts","sourceRoot":"","sources":["../../../../../src/library/webpack/loaders/image-loader/getImageMiniatureURL.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,wBAAwB,YAC1B,MAAM,SACR,MAAM,UACL,MAAM,aACH,MAAM,oBAwBlB,CAAC"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getImageMiniatureDataURL = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const BLUR_WIDTH = 10;
6
+ const BLUR_HEIGHT = 10;
7
+ const getImageMiniatureDataURL = (content, width, height, extension) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
8
+ try {
9
+ const sharp = require('sharp');
10
+ const image = sharp(content, { sequentialRead: true });
11
+ // https://sharp.pixelplumbing.com/api-resize#resize
12
+ image.resize(BLUR_WIDTH, BLUR_HEIGHT, {
13
+ fit: 'inside',
14
+ });
15
+ if (extension === 'jpeg' || extension === 'jpg') {
16
+ image.jpeg({
17
+ progressive: true,
18
+ });
19
+ }
20
+ const optimizedBuffer = yield image.toBuffer();
21
+ const dataURL = `data:image/${extension};base64,${optimizedBuffer.toString('base64')}`;
22
+ return dataURL;
23
+ }
24
+ catch (e) {
25
+ console.error('image placeholder generation error: ', e);
26
+ }
27
+ });
28
+ exports.getImageMiniatureDataURL = getImageMiniatureDataURL;
29
+ //# sourceMappingURL=getImageMiniatureURL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getImageMiniatureURL.js","sourceRoot":"","sources":["../../../../../src/library/webpack/loaders/image-loader/getImageMiniatureURL.ts"],"names":[],"mappings":";;;;AAEA,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,WAAW,GAAG,EAAE,CAAC;AAEhB,MAAM,wBAAwB,GAAG,CACtC,OAAe,EACf,KAAa,EACb,MAAc,EACd,SAAiB,EACjB,EAAE;IACF,IAAI;QACF,MAAM,KAAK,GAAiB,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,oDAAoD;QACpD,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE;YACpC,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QACH,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,KAAK,KAAK,EAAE;YAC/C,KAAK,CAAC,IAAI,CAAC;gBACT,WAAW,EAAE,IAAI;aAClB,CAAC,CAAC;SACJ;QAED,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;QAE/C,MAAM,OAAO,GAAG,cAAc,SAAS,WAAW,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAEvF,OAAO,OAAO,CAAC;KAChB;IAAC,OAAO,CAAC,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC;KAC1D;AACH,CAAC,CAAA,CAAC;AA5BW,QAAA,wBAAwB,4BA4BnC"}
@@ -1,7 +1,8 @@
1
+ /// <reference types="node" />
1
2
  import type { LoaderContext } from 'webpack';
2
3
  /**
3
4
  * Reuse file-loader logic, but return a object with src and size of image
4
5
  */
5
- export default function (this: LoaderContext<{}>, content: string): any;
6
+ export default function (this: LoaderContext<{}>, content: Buffer): Promise<any>;
6
7
  export declare const raw = true;
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/library/webpack/loaders/image-loader/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;GAEG;AACH,MAAM,CAAC,OAAO,WAAW,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,OAkBhE;AAED,eAAO,MAAM,GAAG,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/library/webpack/loaders/image-loader/index.ts"],"names":[],"mappings":";AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAI7C;;GAEG;AACH,yBAA+B,IAAI,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,gBA2BtE;AAED,eAAO,MAAM,GAAG,OAAO,CAAC"}
@@ -3,14 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.raw = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const image_size_1 = tslib_1.__importDefault(require("image-size"));
6
+ const loader_utils_1 = require("loader-utils");
7
+ const getImageMiniatureURL_1 = require("./getImageMiniatureURL");
6
8
  /**
7
9
  * Reuse file-loader logic, but return a object with src and size of image
8
10
  */
9
11
  function default_1(content) {
10
- const result = require('file-loader').call(this, content);
11
- const dimensions = (0, image_size_1.default)(this.resourcePath);
12
- // @todo: image blur placeholder in Base64, sharp or imagemin or jimp?
13
- return result.replace(/^export default (__webpack_public_path__ \+ .+);$/, `const path = $1;
12
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
13
+ const result = require('file-loader').call(this, content);
14
+ const dimensions = (0, image_size_1.default)(this.resourcePath);
15
+ const options = this.getOptions();
16
+ const extension = (0, loader_utils_1.interpolateName)(this, '[ext]', options);
17
+ const dataURL = yield (0, getImageMiniatureURL_1.getImageMiniatureDataURL)(content, dimensions.width, dimensions.height, extension);
18
+ return result.replace(/^export default (__webpack_public_path__ \+ .+);$/, `const path = $1;
14
19
 
15
20
  export default path;
16
21
 
@@ -18,7 +23,9 @@ export const image = {
18
23
  src: $1,
19
24
  width: ${JSON.stringify(dimensions.width)},
20
25
  height: ${JSON.stringify(dimensions.height)},
26
+ blurDataURL: ${JSON.stringify(dataURL)},
21
27
  };`);
28
+ });
22
29
  }
23
30
  exports.default = default_1;
24
31
  exports.raw = true;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/library/webpack/loaders/image-loader/index.ts"],"names":[],"mappings":";;;;AAAA,oEAAgC;AAGhC;;GAEG;AACH,mBAAkD,OAAe;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAE1D,MAAM,UAAU,GAAG,IAAA,oBAAM,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAE7C,sEAAsE;IACtE,OAAO,MAAM,CAAC,OAAO,CACnB,mDAAmD,EACnD;;;;;;WAMO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;GAC1C,CACA,CAAC;AACJ,CAAC;AAlBD,4BAkBC;AAEY,QAAA,GAAG,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/library/webpack/loaders/image-loader/index.ts"],"names":[],"mappings":";;;;AAAA,oEAAgC;AAEhC,+CAA+C;AAC/C,iEAAkE;AAElE;;GAEG;AACH,mBAAwD,OAAe;;QACrE,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,IAAA,oBAAM,EAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAElC,MAAM,SAAS,GAAG,IAAA,8BAAe,EAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAE1D,MAAM,OAAO,GAAG,MAAM,IAAA,+CAAwB,EAC5C,OAAO,EACP,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,MAAM,EACjB,SAAS,CACV,CAAC;QAEF,OAAO,MAAM,CAAC,OAAO,CACnB,mDAAmD,EACnD;;;;;;WAMO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC;iBAC5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;GACrC,CACA,CAAC;IACJ,CAAC;CAAA;AA3BD,4BA2BC;AAEY,QAAA,GAAG,GAAG,IAAI,CAAC"}
@@ -2,6 +2,7 @@ interface ImageObject {
2
2
  src: string;
3
3
  width: number;
4
4
  height: number;
5
+ blurDataURL: string;
5
6
  }
6
7
  declare module '*.css' {
7
8
  interface IClassNames {
@@ -1 +1 @@
1
- {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/typings/application.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,WAAW;QACnB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;KAC7B;IACD,MAAM,UAAU,EAAE,WAAW,CAAC;IAC9B,SAAS,UAAU,CAAC;CACrB;AAED,OAAO,QAAQ,SAAS,CAAC;IACvB,MAAM,IAAI,EAAE,MAAM,CAAC;IACnB,SAAS,IAAI,CAAC;CACf;AAED,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B,OAAO,QAAQ,OAAO,CAAC;IACrB,MAAM,GAAG,EAAE,WAAW,CAAC;IACvB,eAAe,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC;CACjC;AACD,OAAO,QAAQ,OAAO,CAAC;IACrB,MAAM,GAAG,EAAE,WAAW,CAAC;IACvB,eAAe,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC;CACjC;AACD,OAAO,QAAQ,QAAQ,CAAC;IACtB,MAAM,GAAG,EAAE,WAAW,CAAC;IACvB,eAAe,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC;CACjC;AACD,OAAO,QAAQ,QAAQ,CAAC;IACtB,MAAM,GAAG,EAAE,WAAW,CAAC;IACvB,eAAe,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC;CACjC;AAED,OAAO,QAAQ,OAAO,CAAC;IACrB,MAAM,KAAK,EAAE,WAAW,CAAC;IACzB,SAAS,KAAK,CAAC;CAChB;AACD,OAAO,QAAQ,aAAa,CAAC;IAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;IAErD,KAAK,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAExD;;OAEG;IACH,MAAM,GAAG,EAAE,YAAY,CAAC;IAExB,SAAS,GAAG,CAAC;CACd"}
1
+ {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../../src/typings/application.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,OAAO,QAAQ,OAAO,CAAC;IACrB,UAAU,WAAW;QACnB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;KAC7B;IACD,MAAM,UAAU,EAAE,WAAW,CAAC;IAC9B,SAAS,UAAU,CAAC;CACrB;AAED,OAAO,QAAQ,SAAS,CAAC;IACvB,MAAM,IAAI,EAAE,MAAM,CAAC;IACnB,SAAS,IAAI,CAAC;CACf;AAED,KAAK,WAAW,GAAG,MAAM,CAAC;AAE1B,OAAO,QAAQ,OAAO,CAAC;IACrB,MAAM,GAAG,EAAE,WAAW,CAAC;IACvB,eAAe,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC;CACjC;AACD,OAAO,QAAQ,OAAO,CAAC;IACrB,MAAM,GAAG,EAAE,WAAW,CAAC;IACvB,eAAe,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC;CACjC;AACD,OAAO,QAAQ,QAAQ,CAAC;IACtB,MAAM,GAAG,EAAE,WAAW,CAAC;IACvB,eAAe,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC;CACjC;AACD,OAAO,QAAQ,QAAQ,CAAC;IACtB,MAAM,GAAG,EAAE,WAAW,CAAC;IACvB,eAAe,GAAG,CAAC;IACnB,MAAM,CAAC,MAAM,KAAK,EAAE,WAAW,CAAC;CACjC;AAED,OAAO,QAAQ,OAAO,CAAC;IACrB,MAAM,KAAK,EAAE,WAAW,CAAC;IACzB,SAAS,KAAK,CAAC;CAChB;AACD,OAAO,QAAQ,aAAa,CAAC;IAC3B,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;IAErD,KAAK,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAExD;;OAEG;IACH,MAAM,GAAG,EAAE,YAAY,CAAC;IAExB,SAAS,GAAG,CAAC;CACd"}
@@ -3,6 +3,7 @@ export interface ImageObject {
3
3
  src: string;
4
4
  width: number;
5
5
  height: number;
6
+ blurDataURL: string;
6
7
  }
7
8
  export type SvgComponent = ComponentType<SVGProps<SVGElement>>;
8
9
  export * from './pwa/index';
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/typings/public.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAE/D,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../src/typings/public.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;AAE/D,cAAc,aAAa,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/typings/public.ts"],"names":[],"mappings":";;;AAUA,sDAA4B"}
1
+ {"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/typings/public.ts"],"names":[],"mappings":";;;AAWA,sDAA4B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tramvai/cli",
3
- "version": "3.24.1",
3
+ "version": "3.25.0",
4
4
  "description": "Cli инструмент для сборки и запуска приложений",
5
5
  "files": [
6
6
  "src",
@@ -71,7 +71,7 @@
71
71
  "@tinkoff/utils": "^2.1.3",
72
72
  "@tinkoff/webpack-dedupe-plugin": "2.0.2",
73
73
  "@tramvai/build": "4.1.0",
74
- "@tramvai/react": "3.24.1",
74
+ "@tramvai/react": "3.25.0",
75
75
  "@tramvai/tools-check-versions": "0.5.3",
76
76
  "@tramvai/tools-migrate": "0.7.3",
77
77
  "ajv": "^8.12.0",
@@ -119,6 +119,7 @@
119
119
  "less": "^3.13.1",
120
120
  "less-loader": "^8.1.1",
121
121
  "lightning-pool": "^2.4.0",
122
+ "loader-utils": "^3.2.1",
122
123
  "mdtable": "^0.3.1",
123
124
  "mini-css-extract-plugin": "2.7.6",
124
125
  "node-plop": "^0.26.0",
@@ -163,7 +164,7 @@
163
164
  "webpack-bundle-analyzer": "^4.9.0",
164
165
  "webpack-chain": "^6.5.1",
165
166
  "webpack-dev-middleware": "^6.1.1",
166
- "webpack-hot-middleware": "^2.25.4",
167
+ "webpack-hot-middleware": "^2.26.0",
167
168
  "webpack-sources": "^3.2.3",
168
169
  "webpack-stats-plugin": "^1.1.3",
169
170
  "webpackbar": "^5.0.2",
@@ -82,7 +82,10 @@ export const createDevServer = ({
82
82
  });
83
83
 
84
84
  if (configManager.hotRefresh.enabled) {
85
- app.use(getHotModulePrefix(configManager), webpackHotMiddleware(compiler, { log: false }));
85
+ app.use(
86
+ getHotModulePrefix(configManager),
87
+ webpackHotMiddleware(compiler, { log: false, statsOptions: { cached: false } })
88
+ );
86
89
  }
87
90
 
88
91
  const rootDir = di.get(CONFIG_ROOT_DIR_TOKEN);
@@ -0,0 +1,34 @@
1
+ import type Sharp from 'sharp';
2
+
3
+ const BLUR_WIDTH = 10;
4
+ const BLUR_HEIGHT = 10;
5
+
6
+ export const getImageMiniatureDataURL = async (
7
+ content: Buffer,
8
+ width: number,
9
+ height: number,
10
+ extension: string
11
+ ) => {
12
+ try {
13
+ const sharp: typeof Sharp = require('sharp');
14
+
15
+ const image = sharp(content, { sequentialRead: true });
16
+ // https://sharp.pixelplumbing.com/api-resize#resize
17
+ image.resize(BLUR_WIDTH, BLUR_HEIGHT, {
18
+ fit: 'inside',
19
+ });
20
+ if (extension === 'jpeg' || extension === 'jpg') {
21
+ image.jpeg({
22
+ progressive: true,
23
+ });
24
+ }
25
+
26
+ const optimizedBuffer = await image.toBuffer();
27
+
28
+ const dataURL = `data:image/${extension};base64,${optimizedBuffer.toString('base64')}`;
29
+
30
+ return dataURL;
31
+ } catch (e) {
32
+ console.error('image placeholder generation error: ', e);
33
+ }
34
+ };
@@ -1,15 +1,25 @@
1
1
  import sizeOf from 'image-size';
2
2
  import type { LoaderContext } from 'webpack';
3
+ import { interpolateName } from 'loader-utils';
4
+ import { getImageMiniatureDataURL } from './getImageMiniatureURL';
3
5
 
4
6
  /**
5
7
  * Reuse file-loader logic, but return a object with src and size of image
6
8
  */
7
- export default function (this: LoaderContext<{}>, content: string) {
9
+ export default async function (this: LoaderContext<{}>, content: Buffer) {
8
10
  const result = require('file-loader').call(this, content);
9
-
10
11
  const dimensions = sizeOf(this.resourcePath);
12
+ const options = this.getOptions();
13
+
14
+ const extension = interpolateName(this, '[ext]', options);
15
+
16
+ const dataURL = await getImageMiniatureDataURL(
17
+ content,
18
+ dimensions.width,
19
+ dimensions.height,
20
+ extension
21
+ );
11
22
 
12
- // @todo: image blur placeholder in Base64, sharp or imagemin or jimp?
13
23
  return result.replace(
14
24
  /^export default (__webpack_public_path__ \+ .+);$/,
15
25
  `const path = $1;
@@ -20,6 +30,7 @@ export const image = {
20
30
  src: $1,
21
31
  width: ${JSON.stringify(dimensions.width)},
22
32
  height: ${JSON.stringify(dimensions.height)},
33
+ blurDataURL: ${JSON.stringify(dataURL)},
23
34
  };`
24
35
  );
25
36
  }
@@ -2,6 +2,7 @@ interface ImageObject {
2
2
  src: string;
3
3
  width: number;
4
4
  height: number;
5
+ blurDataURL: string;
5
6
  }
6
7
 
7
8
  declare module '*.css' {
@@ -4,6 +4,7 @@ export interface ImageObject {
4
4
  src: string;
5
5
  width: number;
6
6
  height: number;
7
+ blurDataURL: string;
7
8
  }
8
9
 
9
10
  export type SvgComponent = ComponentType<SVGProps<SVGElement>>;