arui-scripts 23.8.0 → 23.8.2

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 (47) hide show
  1. package/.turbo/turbo-test.log +7 -7
  2. package/CHANGELOG.md +52 -0
  3. package/build/commands/archive-build/index.js +2 -67
  4. package/build/commands/build/build-wrapper.d.ts +1 -1
  5. package/build/commands/build/build-wrapper.js +2 -2
  6. package/build/commands/build/index.js +1 -1
  7. package/build/commands/build/server.js +1 -1
  8. package/build/commands/docker-build/index.js +2 -60
  9. package/build/commands/docker-build-compiled/index.js +2 -41
  10. package/build/commands/util/artifacts-config.d.ts +25 -0
  11. package/build/commands/util/artifacts-config.js +120 -0
  12. package/build/commands/util/artifacts-deprecations.d.ts +9 -0
  13. package/build/commands/util/artifacts-deprecations.js +66 -0
  14. package/build/commands/util/arui-scripts-artifacts.d.ts +16 -0
  15. package/build/commands/util/arui-scripts-artifacts.js +29 -0
  16. package/build/commands/util/docker-build.d.ts +20 -8
  17. package/build/commands/util/docker-build.js +50 -101
  18. package/build/commands/util/exec.d.ts +1 -1
  19. package/build/commands/util/exec.js +4 -16
  20. package/build/commands/util/run-artifacts-cli.d.ts +7 -0
  21. package/build/commands/util/run-artifacts-cli.js +60 -0
  22. package/build/commands/util/yarn.d.ts +7 -2
  23. package/build/commands/util/yarn.js +15 -69
  24. package/build/configs/app-configs/get-defaults.js +13 -11
  25. package/build/configs/app-configs/types.d.ts +22 -15
  26. package/build/configs/app-configs/validate-settings-keys.d.ts +4 -1
  27. package/build/configs/app-configs/validate-settings-keys.js +5 -2
  28. package/build/configs/rspack.client.js +1 -1
  29. package/build/configs/util/apply-overrides.d.ts +10 -0
  30. package/build/configs/util/apply-overrides.js +8 -0
  31. package/build/index.d.ts +13 -0
  32. package/build/index.js +25 -1
  33. package/docs/artifact.md +7 -3
  34. package/docs/overrides.md +14 -8
  35. package/docs/settings.md +10 -0
  36. package/package.json +5 -4
  37. package/tsconfig-local.tsbuildinfo +1 -1
  38. package/build/templates/base-nginx.conf.template.d.ts +0 -1
  39. package/build/templates/base-nginx.conf.template.js +0 -59
  40. package/build/templates/dockerfile-compiled.template.d.ts +0 -1
  41. package/build/templates/dockerfile-compiled.template.js +0 -56
  42. package/build/templates/dockerfile.template.d.ts +0 -1
  43. package/build/templates/dockerfile.template.js +0 -47
  44. package/build/templates/nginx.conf.template.d.ts +0 -1
  45. package/build/templates/nginx.conf.template.js +0 -50
  46. package/build/templates/start.template.d.ts +0 -1
  47. package/build/templates/start.template.js +0 -69
@@ -1,8 +1,13 @@
1
- export declare function getBuildParamsFromArgs(): {
2
- pathToTempDir: string;
3
- imageFullName: string;
4
- tempDirName: string;
5
- };
1
+ import { type BuildParams, dockerVersionSatisfies, getBuildParams } from '@alfalab/arui-scripts-artifacts';
2
+ export { dockerVersionSatisfies };
3
+ /**
4
+ * Совместимый слой поверх @alfalab/arui-scripts-artifacts: сохраняет исторические сигнатуры, которыми
5
+ * пользуются сторонние сборки и реэкспорт из `arui-scripts`.
6
+ *
7
+ * @deprecated Используйте одноименные функции из `@alfalab/arui-scripts-artifacts` — они принимают явный
8
+ * конфиг и не зависят от глобального `configs`. В следующей мажорной версии реэкспорт будет удален.
9
+ */
10
+ export declare function getBuildParamsFromArgs(): BuildParams;
6
11
  type PrepareFilesForDockerParams = {
7
12
  dockerfileTemplate: string;
8
13
  nginxConfTemplate: string;
@@ -13,11 +18,18 @@ type PrepareFilesForDockerParams = {
13
18
  allowLocalStartScript: boolean;
14
19
  addNodeModulesToDockerIgnore: boolean;
15
20
  };
16
- export declare function prepareFilesForDocker({ dockerfileTemplate, nginxConfTemplate, nginxBaseConfTemplate, startScriptTemplate, pathToTempDir, allowLocalDockerfile, allowLocalStartScript, addNodeModulesToDockerIgnore, }: PrepareFilesForDockerParams): Promise<void>;
17
- export declare function dockerVersionSatisfies(request: string): boolean;
21
+ /**
22
+ * @deprecated Используйте `prepareFilesForDocker` из `@alfalab/arui-scripts-artifacts`. В следующей
23
+ * мажорной версии реэкспорт будет удален.
24
+ */
25
+ export declare function prepareFilesForDocker({ dockerfileTemplate, nginxConfTemplate, nginxBaseConfTemplate, startScriptTemplate, pathToTempDir, allowLocalDockerfile, allowLocalStartScript, addNodeModulesToDockerIgnore, }: PrepareFilesForDockerParams): Promise<import("@alfalab/arui-scripts-artifacts").PrepareFilesForDockerResult>;
18
26
  type DockerBuildCommandParams = {
19
27
  tempDirName: string;
20
28
  imageFullName: string;
21
29
  };
30
+ /**
31
+ * @deprecated Используйте `getDockerBuildCommand` из `@alfalab/arui-scripts-artifacts`. В следующей
32
+ * мажорной версии реэкспорт будет удален.
33
+ */
22
34
  export declare function getDockerBuildCommand({ tempDirName, imageFullName }: DockerBuildCommandParams): string;
23
- export {};
35
+ export { getBuildParams };
@@ -12,116 +12,65 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getBuildParams = exports.dockerVersionSatisfies = void 0;
15
16
  exports.getBuildParamsFromArgs = getBuildParamsFromArgs;
16
17
  exports.prepareFilesForDocker = prepareFilesForDocker;
17
- exports.dockerVersionSatisfies = dockerVersionSatisfies;
18
18
  exports.getDockerBuildCommand = getDockerBuildCommand;
19
19
  const path_1 = __importDefault(require("path"));
20
- const fs_extra_1 = __importDefault(require("fs-extra"));
21
- const satisfies_1 = __importDefault(require("semver/functions/satisfies"));
22
- const shelljs_1 = __importDefault(require("shelljs"));
23
- const app_configs_1 = require("../../configs/app-configs");
24
- const get_defaults_1 = require("../../configs/app-configs/get-defaults");
20
+ const arui_scripts_artifacts_1 = require("@alfalab/arui-scripts-artifacts");
21
+ Object.defineProperty(exports, "dockerVersionSatisfies", { enumerable: true, get: function () { return arui_scripts_artifacts_1.dockerVersionSatisfies; } });
22
+ Object.defineProperty(exports, "getBuildParams", { enumerable: true, get: function () { return arui_scripts_artifacts_1.getBuildParams; } });
23
+ const artifacts_config_1 = require("./artifacts-config");
24
+ /**
25
+ * Совместимый слой поверх @alfalab/arui-scripts-artifacts: сохраняет исторические сигнатуры, которыми
26
+ * пользуются сторонние сборки и реэкспорт из `arui-scripts`.
27
+ *
28
+ * @deprecated Используйте одноименные функции из `@alfalab/arui-scripts-artifacts` — они принимают явный
29
+ * конфиг и не зависят от глобального `configs`. В следующей мажорной версии реэкспорт будет удален.
30
+ */
25
31
  function getBuildParamsFromArgs() {
26
- let imageVersion = app_configs_1.configs.version;
27
- let imageName = app_configs_1.configs.name;
28
- let { dockerRegistry } = app_configs_1.configs;
29
- const commandLineArguments = process.argv.slice(3);
30
- commandLineArguments.forEach((arg) => {
31
- let [argName, argValue] = arg.split('=');
32
- argName = argName.toLowerCase().trim();
33
- argValue = argValue ? argValue.trim() : '';
34
- switch (argName) {
35
- case 'version':
36
- imageVersion = argValue;
37
- break;
38
- case 'name':
39
- imageName = argValue;
40
- break;
41
- case 'registry':
42
- dockerRegistry = argValue;
43
- break;
44
- default:
45
- console.warn(`Unknown argument ${argName}`);
46
- }
47
- });
48
- const tempDirName = '.docker-build';
49
- const pathToTempDir = path_1.default.join(app_configs_1.configs.cwd, tempDirName);
50
- const imageFullName = `${dockerRegistry ? `${dockerRegistry}/` : ''}${imageName}:${imageVersion}`;
51
- return {
52
- pathToTempDir,
53
- imageFullName,
54
- tempDirName,
55
- };
32
+ return (0, arui_scripts_artifacts_1.getBuildParamsFromArgs)((0, artifacts_config_1.getResolvedArtifactsConfig)(), process.argv.slice(3));
33
+ }
34
+ /**
35
+ * Разбирает `registry/name:version` обратно на имя и версию, чтобы собрать конфиг, из которого
36
+ * @alfalab/arui-scripts-artifacts соберет ровно ту же строку.
37
+ */
38
+ function splitImageFullName(imageFullName) {
39
+ const lastColon = imageFullName.lastIndexOf(':');
40
+ const lastSlash = imageFullName.lastIndexOf('/');
41
+ if (lastColon > lastSlash) {
42
+ return {
43
+ name: imageFullName.slice(0, lastColon),
44
+ version: imageFullName.slice(lastColon + 1),
45
+ };
46
+ }
47
+ return { name: imageFullName, version: '' };
56
48
  }
49
+ /**
50
+ * @deprecated Используйте `prepareFilesForDocker` из `@alfalab/arui-scripts-artifacts`. В следующей
51
+ * мажорной версии реэкспорт будет удален.
52
+ */
57
53
  function prepareFilesForDocker(_a) {
58
54
  return __awaiter(this, arguments, void 0, function* ({ dockerfileTemplate, nginxConfTemplate, nginxBaseConfTemplate, startScriptTemplate, pathToTempDir, allowLocalDockerfile, allowLocalStartScript, addNodeModulesToDockerIgnore, }) {
59
- yield fs_extra_1.default.emptyDir(pathToTempDir);
60
- let nginxBaseConf = '';
61
- if (app_configs_1.configs.nginx) {
62
- nginxBaseConf = app_configs_1.configs.localNginxBaseConf
63
- ? yield fs_extra_1.default.readFile(app_configs_1.configs.localNginxBaseConf, 'utf8')
64
- : nginxBaseConfTemplate;
65
- }
66
- const nginxConf = app_configs_1.configs.localNginxConf
67
- ? yield fs_extra_1.default.readFile(app_configs_1.configs.localNginxConf, 'utf8')
68
- : nginxConfTemplate;
69
- const dockerfile = app_configs_1.configs.localDockerfile && allowLocalDockerfile
70
- ? yield fs_extra_1.default.readFile(app_configs_1.configs.localDockerfile, 'utf8')
71
- : dockerfileTemplate;
72
- const startScript = app_configs_1.configs.localStartScript && allowLocalStartScript
73
- ? yield fs_extra_1.default.readFile(app_configs_1.configs.localStartScript, 'utf8')
74
- : startScriptTemplate;
75
- const dockerIgnoreFilePath = path_1.default.join(process.cwd(), '.dockerignore');
76
- const dockerIgnoreFileContent = addNodeModulesToDockerIgnore &&
77
- (yield getAndModifyDockerIgnoreContent(dockerIgnoreFilePath));
78
- yield Promise.all([
79
- fs_extra_1.default.writeFile(path_1.default.join(pathToTempDir, 'Dockerfile'), dockerfile, 'utf8'),
80
- fs_extra_1.default.writeFile(path_1.default.join(pathToTempDir, get_defaults_1.nginxConfigFileName), nginxConf, 'utf8'),
81
- nginxBaseConf &&
82
- fs_extra_1.default.writeFile(path_1.default.join(pathToTempDir, get_defaults_1.baseNginxConfigFileName), nginxBaseConf, 'utf8'),
83
- fs_extra_1.default.writeFile(path_1.default.join(pathToTempDir, 'start.sh'), startScript, {
84
- encoding: 'utf8',
85
- mode: 0o555,
86
- }),
87
- addNodeModulesToDockerIgnore &&
88
- dockerIgnoreFileContent &&
89
- fs_extra_1.default.writeFile(dockerIgnoreFilePath, dockerIgnoreFileContent, 'utf-8'),
90
- ].filter(Boolean));
55
+ const config = (0, artifacts_config_1.getResolvedArtifactsConfig)();
56
+ return (0, arui_scripts_artifacts_1.prepareFilesForDocker)({
57
+ config: Object.assign(Object.assign({}, config), { cwd: path_1.default.dirname(pathToTempDir), docker: Object.assign(Object.assign({}, config.docker), { tempDirName: path_1.default.basename(pathToTempDir), addNodeModulesToDockerIgnore }), localFiles: Object.assign(Object.assign({}, config.localFiles), { allowDockerfile: allowLocalDockerfile, allowStartScript: allowLocalStartScript }) }),
58
+ templates: {
59
+ dockerfile: dockerfileTemplate,
60
+ nginxConf: nginxConfTemplate,
61
+ nginxBaseConf: nginxBaseConfTemplate,
62
+ startScript: startScriptTemplate,
63
+ },
64
+ });
91
65
  });
92
66
  }
93
- function dockerVersionSatisfies(request) {
94
- const dockerServerVersion = shelljs_1.default.exec("docker version --format '{{.Server.Version}}'", {
95
- silent: true,
96
- });
97
- const dockerClientVersion = shelljs_1.default.exec("docker version --format '{{.Client.Version}}'", {
98
- silent: true,
99
- });
100
- return ((0, satisfies_1.default)(dockerServerVersion.toString(), request) &&
101
- (0, satisfies_1.default)(dockerClientVersion.toString(), request));
102
- }
67
+ /**
68
+ * @deprecated Используйте `getDockerBuildCommand` из `@alfalab/arui-scripts-artifacts`. В следующей
69
+ * мажорной версии реэкспорт будет удален.
70
+ */
103
71
  function getDockerBuildCommand({ tempDirName, imageFullName }) {
104
- // если пытаться собрать проект на маках с m1, докер будет пытаться вытянуть базовый образ под свою платформу и
105
- // упадет с ошибкой. Чтобы этого избежать - достаточно использовать флаг --platform. Но он поддерживается без экспериментальных
106
- // флагов только начиная с docker 20.10.21, а на многих серверах, используемых для сборки до сих пор живет докер 1.13.1
107
- // Соответственно они будут падать при наличии этого флага.
108
- // https://docs.docker.com/engine/release-notes/20.10/
109
- const canUsePlatformFlag = dockerVersionSatisfies('>=20.10.21');
110
- return `docker build ${canUsePlatformFlag ? '--platform linux/x86_64' : ''} \
111
- -f "./${tempDirName}/Dockerfile" \
112
- --build-arg START_SH_LOCATION="./${tempDirName}/start.sh" \
113
- --build-arg NGINX_CONF_LOCATION="./${tempDirName}/${get_defaults_1.nginxConfigFileName}" \
114
- --build-arg NGINX_BASE_CONF_LOCATION="./${tempDirName}/${get_defaults_1.baseNginxConfigFileName}" \
115
- -t ${imageFullName} .`;
116
- }
117
- function getAndModifyDockerIgnoreContent(dockerIgnoreFilePath) {
118
- return __awaiter(this, void 0, void 0, function* () {
119
- if (fs_extra_1.default.existsSync(dockerIgnoreFilePath)) {
120
- return fs_extra_1.default
121
- .readFile(dockerIgnoreFilePath, 'utf-8')
122
- .then((ignores) => `${ignores}\nnode_modules`);
123
- }
124
- yield fs_extra_1.default.createFile(dockerIgnoreFilePath);
125
- return 'node_modules';
126
- });
72
+ const config = (0, artifacts_config_1.getResolvedArtifactsConfig)();
73
+ return (0, arui_scripts_artifacts_1.getDockerBuildCommand)(Object.assign(Object.assign(Object.assign({}, config), splitImageFullName(imageFullName)), {
74
+ // имя образа уже содержит registry, второй раз подставлять его не нужно
75
+ docker: Object.assign(Object.assign({}, config.docker), { registry: '', tempDirName }) }));
127
76
  }
@@ -1 +1 @@
1
- export declare function exec(command: string): Promise<unknown>;
1
+ export { exec, ExecError } from '@alfalab/arui-scripts-artifacts';
@@ -1,18 +1,6 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.exec = exec;
7
- const shelljs_1 = __importDefault(require("shelljs"));
8
- function exec(command) {
9
- return new Promise((resolve, reject) => {
10
- console.log(`Executing command: ${command}`);
11
- shelljs_1.default.exec(command, (code) => {
12
- if (code === 0) {
13
- return resolve(code);
14
- }
15
- return reject(code);
16
- });
17
- });
18
- }
3
+ exports.ExecError = exports.exec = void 0;
4
+ var arui_scripts_artifacts_1 = require("@alfalab/arui-scripts-artifacts");
5
+ Object.defineProperty(exports, "exec", { enumerable: true, get: function () { return arui_scripts_artifacts_1.exec; } });
6
+ Object.defineProperty(exports, "ExecError", { enumerable: true, get: function () { return arui_scripts_artifacts_1.ExecError; } });
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Запускает команду CLI @alfalab/arui-scripts-artifacts с конфигом arui-scripts.
3
+ *
4
+ * Позиционные аргументы (`name=...`, `version=...`, `registry=...`) прокидываются как есть — их
5
+ * разбирает сам CLI.
6
+ */
7
+ export declare function runArtifactsCli(command: string): Promise<void>;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.runArtifactsCli = runArtifactsCli;
16
+ const path_1 = __importDefault(require("path"));
17
+ const arui_scripts_artifacts_1 = require("@alfalab/arui-scripts-artifacts");
18
+ /**
19
+ * Конфиг едет вместе с arui-scripts — см. `arui-scripts-artifacts.ts`. `require.resolve` дает абсолютный
20
+ * путь до собранного файла и не выполняет его: конфиг исполнит уже CLI, в процессе сборки.
21
+ */
22
+ const ARTIFACTS_CONFIG_PATH = require.resolve('./arui-scripts-artifacts');
23
+ /**
24
+ * Абсолютный путь до бинарника CLI @alfalab/arui-scripts-artifacts.
25
+ *
26
+ * Резолвим через package.json пакета, а не полагаемся на `node_modules/.bin` в PATH: команды
27
+ * arui-scripts запускают не только из yarn-скриптов.
28
+ */
29
+ function getArtifactsCliPath() {
30
+ const packageJsonPath = require.resolve('@alfalab/arui-scripts-artifacts/package.json');
31
+ // eslint-disable-next-line global-require, import/no-dynamic-require, @typescript-eslint/no-var-requires
32
+ const { bin } = require(packageJsonPath);
33
+ return path_1.default.join(path_1.default.dirname(packageJsonPath), typeof bin === 'string' ? bin : bin['arui-scripts-artifacts']);
34
+ }
35
+ /**
36
+ * Запускает команду CLI @alfalab/arui-scripts-artifacts с конфигом arui-scripts.
37
+ *
38
+ * Позиционные аргументы (`name=...`, `version=...`, `registry=...`) прокидываются как есть — их
39
+ * разбирает сам CLI.
40
+ */
41
+ function runArtifactsCli(command) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ const args = process.argv.slice(3);
44
+ const cliCommand = [
45
+ (0, arui_scripts_artifacts_1.shellQuote)(process.execPath),
46
+ (0, arui_scripts_artifacts_1.shellQuote)(getArtifactsCliPath()),
47
+ command,
48
+ '-c',
49
+ (0, arui_scripts_artifacts_1.shellQuote)(ARTIFACTS_CONFIG_PATH),
50
+ ...args,
51
+ ].join(' ');
52
+ try {
53
+ yield (0, arui_scripts_artifacts_1.exec)(cliCommand);
54
+ }
55
+ catch (_a) {
56
+ // CLI уже напечатал ошибку (и стек, если включен debug)
57
+ process.exit(1);
58
+ }
59
+ });
60
+ }
@@ -1,4 +1,10 @@
1
- type YarnVersion = '1' | '2+' | 'unavailable';
1
+ import { type YarnVersion } from '@alfalab/arui-scripts-artifacts';
2
+ /**
3
+ * Совместимый слой поверх @alfalab/arui-scripts-artifacts: сохраняет исторические сигнатуры без аргументов,
4
+ * подставляя значения из глобального `configs`.
5
+ *
6
+ * @deprecated Используйте одноименные функции из `@alfalab/arui-scripts-artifacts`.
7
+ */
2
8
  export declare function getYarnVersion(): YarnVersion;
3
9
  export declare function getPruningCommand(): string;
4
10
  export declare function getInstallProductionCommand(): string;
@@ -14,4 +20,3 @@ export declare function getYarnPathFromRc(): string | null;
14
20
  * Возвращает пустую строку, если symlink не нужен.
15
21
  */
16
22
  export declare function getYarnBinSymlinkCommand(): string;
17
- export {};
@@ -1,82 +1,36 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.getYarnVersion = getYarnVersion;
7
4
  exports.getPruningCommand = getPruningCommand;
8
5
  exports.getInstallProductionCommand = getInstallProductionCommand;
9
6
  exports.getYarnPathFromRc = getYarnPathFromRc;
10
7
  exports.getYarnBinSymlinkCommand = getYarnBinSymlinkCommand;
11
- const fs_1 = __importDefault(require("fs"));
12
- const path_1 = __importDefault(require("path"));
13
- const shelljs_1 = __importDefault(require("shelljs"));
8
+ const arui_scripts_artifacts_1 = require("@alfalab/arui-scripts-artifacts");
14
9
  const app_configs_1 = require("../../configs/app-configs");
10
+ /**
11
+ * Совместимый слой поверх @alfalab/arui-scripts-artifacts: сохраняет исторические сигнатуры без аргументов,
12
+ * подставляя значения из глобального `configs`.
13
+ *
14
+ * @deprecated Используйте одноименные функции из `@alfalab/arui-scripts-artifacts`.
15
+ */
15
16
  function getYarnVersion() {
16
- if (app_configs_1.configs.useYarn && shelljs_1.default.which('yarn')) {
17
- const yarnVersion = shelljs_1.default.exec('yarn -v', { silent: true });
18
- const yarnMajorVersion = Number(yarnVersion.split('.')[0]);
19
- return yarnMajorVersion > 1 ? '2+' : '1';
20
- }
21
- return 'unavailable';
17
+ return (0, arui_scripts_artifacts_1.getYarnVersion)({ useYarn: app_configs_1.configs.useYarn });
22
18
  }
23
19
  function getPruningCommand() {
24
- if (app_configs_1.configs.clientOnly) {
25
- return 'echo "Skipping pruning in client only mode"';
26
- }
27
- const yarnVersion = getYarnVersion();
28
- switch (yarnVersion) {
29
- case '1': {
30
- return 'yarn install --production --ignore-optional --frozen-lockfile --ignore-scripts --prefer-offline';
31
- }
32
- case '2+': {
33
- return 'yarn workspaces focus --production --all';
34
- }
35
- case 'unavailable': {
36
- return 'npm prune --production';
37
- }
38
- default: {
39
- return '';
40
- }
41
- }
20
+ return (0, arui_scripts_artifacts_1.getPruningCommand)({
21
+ yarnVersion: getYarnVersion(),
22
+ clientOnly: app_configs_1.configs.clientOnly,
23
+ });
42
24
  }
43
25
  function getInstallProductionCommand() {
44
- const yarnVersion = getYarnVersion();
45
- switch (yarnVersion) {
46
- case '1': {
47
- return 'yarn install --production --ignore-optional --frozen-lockfile --ignore-scripts --prefer-offline';
48
- }
49
- case '2+': {
50
- return 'yarn workspaces focus --production --all';
51
- }
52
- case 'unavailable': {
53
- return 'npm install --production';
54
- }
55
- default: {
56
- return '';
57
- }
58
- }
26
+ return (0, arui_scripts_artifacts_1.getInstallProductionCommand)(getYarnVersion());
59
27
  }
60
28
  /**
61
29
  * Читает значение yarnPath из .yarnrc.yml.
62
30
  * Возвращает путь к бинарнику yarn (например .yarn/releases/yarn-4.18.0.cjs) или null.
63
31
  */
64
32
  function getYarnPathFromRc() {
65
- const rcPath = path_1.default.join(app_configs_1.configs.cwd, '.yarnrc.yml');
66
- if (!shelljs_1.default.test('-f', rcPath)) {
67
- return null;
68
- }
69
- let content;
70
- try {
71
- content = fs_1.default.readFileSync(rcPath, 'utf8');
72
- }
73
- catch (_a) {
74
- return null;
75
- }
76
- // Ищем строку вида: yarnPath: .yarn/releases/yarn-4.18.0.cjs
77
- // Значение может быть в кавычках или без
78
- const match = content.match(/^\s*yarnPath:\s*['"]?([^'"\s]+)['"]?\s*$/m);
79
- return match ? match[1] : null;
33
+ return (0, arui_scripts_artifacts_1.getYarnPathFromRc)(app_configs_1.configs.cwd);
80
34
  }
81
35
  /**
82
36
  * Возвращает команду для создания symlink на yarn бинарник в Docker-образе.
@@ -85,13 +39,5 @@ function getYarnPathFromRc() {
85
39
  * Возвращает пустую строку, если symlink не нужен.
86
40
  */
87
41
  function getYarnBinSymlinkCommand() {
88
- if (getYarnVersion() !== '2+') {
89
- return '';
90
- }
91
- const yarnPath = getYarnPathFromRc();
92
- if (!yarnPath) {
93
- return '';
94
- }
95
- // WORKDIR в Dockerfile = /src
96
- return `ln -sf /src/${yarnPath} /usr/local/bin/yarn && \\\n `;
42
+ return (0, arui_scripts_artifacts_1.getYarnBinSymlinkCommand)({ yarnVersion: getYarnVersion(), cwd: app_configs_1.configs.cwd });
97
43
  }
@@ -32,22 +32,24 @@ function getDefaultAppConfig() {
32
32
  // paths
33
33
  buildPath: '.build',
34
34
  assetsPath: 'assets',
35
- additionalBuildPath: ['config'],
36
35
  statsOutputFilename: 'stats.json',
37
36
  serverEntry: path_1.default.resolve(absoluteSrcPath, 'server/index'),
38
37
  serverOutput: 'server.js',
39
38
  clientPolyfillsEntry: null,
40
39
  clientEntry: path_1.default.resolve(absoluteSrcPath, 'index'),
41
- // docker compilation configs
42
- dockerRegistry: '',
43
- baseDockerImage: 'alfabankui/arui-scripts:24.10.0-slim',
44
- nginxRootPath: '/src',
45
- nginx: null,
46
- runFromNonRootUser: true,
47
- removeDevDependenciesDuringDockerBuild: true,
48
- deleteNpm: false,
49
- // archive compilation configs
50
- archiveName: 'build.tar',
40
+ // docker/archive compilation configs
41
+ // Дефолты этих настроек живут в @alfalab/arui-scripts-artifacts (resolveArtifactsConfig).
42
+ // Здесь ключи объявлены без значений, чтобы настройка из package.json/конфига не считалась
43
+ // неизвестной, а `undefined` доехал до scripts-artifacts и был заполнен там.
44
+ dockerRegistry: undefined,
45
+ baseDockerImage: undefined,
46
+ nginxRootPath: undefined,
47
+ nginx: undefined,
48
+ runFromNonRootUser: undefined,
49
+ removeDevDependenciesDuringDockerBuild: undefined,
50
+ deleteNpm: undefined,
51
+ archiveName: undefined,
52
+ additionalBuildPath: undefined,
51
53
  dictionaryCompression: {
52
54
  dictionaryPath: [],
53
55
  enablePreviousVersionHeaders: false,
@@ -2,6 +2,7 @@ import { type DevTool, type Shared } from '@rspack/core';
2
2
  import { type Configuration as DevServerConfiguration } from '@rspack/dev-server';
3
3
  import { type PluginOptions as ReactCompilerOptions } from 'babel-plugin-react-compiler';
4
4
  import type webpackNodeExternals from 'webpack-node-externals';
5
+ import { type NginxBaseConfOptions } from '@alfalab/arui-scripts-artifacts';
5
6
  /**
6
7
  * Конфигурация arui-scripts, которая может быть переопределена приложением
7
8
  */
@@ -17,26 +18,32 @@ export type AppConfigs = {
17
18
  clientOnly: boolean;
18
19
  buildPath: string;
19
20
  assetsPath: string;
20
- additionalBuildPath: string[];
21
21
  statsOutputFilename: string;
22
22
  serverEntry: string | string[] | Record<string, string | string[]>;
23
23
  serverOutput: string;
24
24
  clientPolyfillsEntry: null | string | string[];
25
25
  clientEntry: string | string[] | Record<string, string | string[]>;
26
- dockerRegistry: string;
27
- baseDockerImage: string;
28
- nginxRootPath: string;
29
- nginx: {
30
- workerProcesses?: number;
31
- workerRlimitNoFile?: number;
32
- workerConnections?: number;
33
- eventsUse?: string;
34
- daemon?: string;
35
- } | null;
36
- runFromNonRootUser: boolean;
37
- removeDevDependenciesDuringDockerBuild: boolean;
38
- deleteNpm: boolean;
39
- archiveName: string;
26
+ /** @deprecated Используйте `docker.registry` в конфиге @alfalab/arui-scripts-artifacts. */
27
+ dockerRegistry?: string;
28
+ /** @deprecated Используйте `docker.baseImage` в конфиге @alfalab/arui-scripts-artifacts. */
29
+ baseDockerImage?: string;
30
+ /** @deprecated Используйте `nginx.rootPath` в конфиге @alfalab/arui-scripts-artifacts. */
31
+ nginxRootPath?: string;
32
+ /** @deprecated Используйте `nginx.baseConf` в конфиге @alfalab/arui-scripts-artifacts. */
33
+ nginx?: NginxBaseConfOptions | null;
34
+ /** @deprecated Используйте `docker.runFromNonRootUser` в конфиге @alfalab/arui-scripts-artifacts. */
35
+ runFromNonRootUser?: boolean;
36
+ /** @deprecated Используйте `build.removeDevDependencies` в конфиге @alfalab/arui-scripts-artifacts. */
37
+ removeDevDependenciesDuringDockerBuild?: boolean;
38
+ /** @deprecated Используйте `docker.deleteNpm` в конфиге @alfalab/arui-scripts-artifacts. */
39
+ deleteNpm?: boolean;
40
+ /** @deprecated Используйте `archive.name` в конфиге @alfalab/arui-scripts-artifacts. */
41
+ archiveName?: string;
42
+ /**
43
+ * Директории проекта, которые кладутся в tar-архив рядом со сборкой.
44
+ * @deprecated Используйте `archive.additionalPaths` в конфиге @alfalab/arui-scripts-artifacts.
45
+ */
46
+ additionalBuildPath?: string[];
40
47
  dictionaryCompression: {
41
48
  dictionaryPath: string[];
42
49
  enablePreviousVersionHeaders?: boolean;
@@ -1,4 +1,7 @@
1
1
  /**
2
- * Функция проверяет что все ключи объекта settingsObject есть в уже существующей конфигурации
2
+ * Функция проверяет что все ключи объекта settingsObject есть в уже существующей конфигурации.
3
+ *
4
+ * Проверяется именно наличие ключа, а не значения: у части настроек (например, docker-специфичных)
5
+ * дефолт живет в @alfalab/arui-scripts-artifacts, поэтому в конфиге они лежат со значением `undefined`.
3
6
  */
4
7
  export declare function validateSettingsKeys(existingConfig: Record<string, unknown>, settingsObject: Record<string, unknown>, source?: string): void;
@@ -2,11 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.validateSettingsKeys = validateSettingsKeys;
4
4
  /**
5
- * Функция проверяет что все ключи объекта settingsObject есть в уже существующей конфигурации
5
+ * Функция проверяет что все ключи объекта settingsObject есть в уже существующей конфигурации.
6
+ *
7
+ * Проверяется именно наличие ключа, а не значения: у части настроек (например, docker-специфичных)
8
+ * дефолт живет в @alfalab/arui-scripts-artifacts, поэтому в конфиге они лежат со значением `undefined`.
6
9
  */
7
10
  function validateSettingsKeys(existingConfig, settingsObject, source) {
8
11
  Object.keys(settingsObject).forEach((setting) => {
9
- if (typeof existingConfig[setting] === 'undefined') {
12
+ if (!Object.prototype.hasOwnProperty.call(existingConfig, setting)) {
10
13
  console.warn(`Неизвестная настройка "${setting}" в ${source || 'конфигурации'}`);
11
14
  }
12
15
  });
@@ -472,7 +472,7 @@ function getTsLoaderIfEnabled(mode) {
472
472
  {
473
473
  loader: require.resolve('babel-loader'),
474
474
  options: Object.assign(Object.assign({}, babel_client_1.babelClientConfig), { cacheDirectory: mode === 'dev', cacheCompression: false, plugins: mode === 'dev'
475
- ? [require.resolve('react-refresh/babel'), { skipEnvCheck: true }]
475
+ ? [[require.resolve('react-refresh/babel'), { skipEnvCheck: true }]]
476
476
  : undefined }),
477
477
  },
478
478
  {
@@ -29,10 +29,15 @@ type Overrides = {
29
29
  browsers: string[];
30
30
  supportingBrowsers: string[];
31
31
  supportingNode: string[];
32
+ /** @deprecated Используйте `overrides.dockerfile` в конфиге @alfalab/arui-scripts-artifacts. */
32
33
  Dockerfile: string;
34
+ /** @deprecated Используйте `overrides.dockerfileCompiled` в конфиге @alfalab/arui-scripts-artifacts. */
33
35
  DockerfileCompiled: string;
36
+ /** @deprecated Используйте `overrides.nginxConf` в конфиге @alfalab/arui-scripts-artifacts. */
34
37
  nginx: string;
38
+ /** @deprecated Используйте `overrides.baseNginxConf` в конфиге @alfalab/arui-scripts-artifacts. */
35
39
  nginxConf: string;
40
+ /** @deprecated Используйте `overrides.startScript` в конфиге @alfalab/arui-scripts-artifacts. */
36
41
  'start.sh': string;
37
42
  serverExternalsExemptions: Array<string | RegExp>;
38
43
  html: string;
@@ -96,6 +101,11 @@ type OverrideFunction<K extends keyof Overrides> = (config: Overrides[K], appCon
96
101
  export type OverrideFile = {
97
102
  [K in keyof Overrides]?: OverrideFunction<K>;
98
103
  } & Partial<Record<DeprecatedOverrideKey, OverrideFunction<'rspack'>>>;
104
+ /**
105
+ * Объявлен ли оверрайд с таким ключом хоть в одном файле оверрайдов. Нужно, чтобы предупреждать об
106
+ * устаревших ключах только тем, кто ими действительно пользуется.
107
+ */
108
+ export declare function hasOverride(overridesKey: keyof Overrides): boolean;
99
109
  /**
100
110
  *
101
111
  * @param {String|String[]} overridesKey Ключи оверрайда
@@ -1,5 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasOverride = hasOverride;
3
4
  exports.applyOverrides = applyOverrides;
4
5
  const app_configs_1 = require("../app-configs");
5
6
  // Маппинг устаревших webpack-ключей оверрайдов на актуальные ключи для rspack
@@ -54,6 +55,13 @@ overrides = app_configs_1.configs.overridesPath.map((path) => {
54
55
  return {};
55
56
  }
56
57
  });
58
+ /**
59
+ * Объявлен ли оверрайд с таким ключом хоть в одном файле оверрайдов. Нужно, чтобы предупреждать об
60
+ * устаревших ключах только тем, кто ими действительно пользуется.
61
+ */
62
+ function hasOverride(overridesKey) {
63
+ return overrides.some((override) => Object.prototype.hasOwnProperty.call(override, overridesKey));
64
+ }
57
65
  /**
58
66
  *
59
67
  * @param {String|String[]} overridesKey Ключи оверрайда