universo-platform-2d

Форк
0
47 строк · 1.6 Кб
1
import { readFile } from 'node:fs/promises';
2
import { join } from 'node:path';
3

4
import type { PutObjectCommandInput } from '@aws-sdk/client-s3';
5
import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3';
6
import { lookup } from 'mime-types';
7
import type { Compiler, WebpackPluginInstance } from 'webpack';
8

9
export const R2_BUCKET =
10
  process.env.R2_BUCKET ??
11
  (process.env.BUILD_TYPE === 'canary' ? 'assets-dev' : 'assets-prod');
12

13
export class WebpackS3Plugin implements WebpackPluginInstance {
14
  private readonly s3 = new S3Client({
15
    region: 'auto',
16
    endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
17
    credentials: {
18
      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
19
      accessKeyId: process.env.R2_ACCESS_KEY_ID!,
20
      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
21
      secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
22
    },
23
  });
24

25
  apply(compiler: Compiler) {
26
    compiler.hooks.assetEmitted.tapPromise(
27
      'WebpackS3Plugin',
28
      async (asset, { outputPath }) => {
29
        if (asset.endsWith('.html')) {
30
          return;
31
        }
32
        const assetPath = join(outputPath, asset);
33
        const assetSource = await readFile(assetPath);
34
        const putObjectCommandOptions: PutObjectCommandInput = {
35
          Body: assetSource,
36
          Bucket: R2_BUCKET,
37
          Key: asset,
38
        };
39
        const contentType = lookup(asset);
40
        if (contentType) {
41
          putObjectCommandOptions.ContentType = contentType;
42
        }
43
        await this.s3.send(new PutObjectCommand(putObjectCommandOptions));
44
      }
45
    );
46
  }
47
}
48

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.