create-arui-scripts-app 1.0.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 (50) hide show
  1. package/README.md +58 -0
  2. package/assets/.yarn/releases/yarn-4.9.1.cjs +948 -0
  3. package/bin/create-arui-scripts-app.js +3 -0
  4. package/build/build-context.d.ts +2 -0
  5. package/build/build-context.js +83 -0
  6. package/build/build-file-map.d.ts +3 -0
  7. package/build/build-file-map.js +49 -0
  8. package/build/cli.d.ts +1 -0
  9. package/build/cli.js +15 -0
  10. package/build/create-program.d.ts +5 -0
  11. package/build/create-program.js +103 -0
  12. package/build/defaults.d.ts +21 -0
  13. package/build/defaults.js +48 -0
  14. package/build/install-dependencies.d.ts +3 -0
  15. package/build/install-dependencies.js +39 -0
  16. package/build/questions.d.ts +3 -0
  17. package/build/questions.js +126 -0
  18. package/build/run.d.ts +9 -0
  19. package/build/run.js +191 -0
  20. package/build/templates/app-component.template.d.ts +2 -0
  21. package/build/templates/app-component.template.js +73 -0
  22. package/build/templates/app-styles.template.d.ts +3 -0
  23. package/build/templates/app-styles.template.js +31 -0
  24. package/build/templates/app-test.template.d.ts +2 -0
  25. package/build/templates/app-test.template.js +14 -0
  26. package/build/templates/arui-scripts-config.template.d.ts +2 -0
  27. package/build/templates/arui-scripts-config.template.js +46 -0
  28. package/build/templates/client-entry.template.d.ts +2 -0
  29. package/build/templates/client-entry.template.js +105 -0
  30. package/build/templates/misc.template.d.ts +6 -0
  31. package/build/templates/misc.template.js +74 -0
  32. package/build/templates/package-json.template.d.ts +2 -0
  33. package/build/templates/package-json.template.js +36 -0
  34. package/build/templates/server-entry.template.d.ts +2 -0
  35. package/build/templates/server-entry.template.js +115 -0
  36. package/build/templates/store.template.d.ts +3 -0
  37. package/build/templates/store.template.js +63 -0
  38. package/build/templates/tsconfig.template.d.ts +2 -0
  39. package/build/templates/tsconfig.template.js +14 -0
  40. package/build/templates/vitest-config.template.d.ts +1 -0
  41. package/build/templates/vitest-config.template.js +18 -0
  42. package/build/types.d.ts +34 -0
  43. package/build/types.js +2 -0
  44. package/build/validate-project-name.d.ts +1 -0
  45. package/build/validate-project-name.js +20 -0
  46. package/build/versions.d.ts +4 -0
  47. package/build/versions.js +7 -0
  48. package/build/write-files.d.ts +4 -0
  49. package/build/write-files.js +59 -0
  50. package/package.json +56 -0
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ require('../build/cli.js');
@@ -0,0 +1,2 @@
1
+ import { type InitAnswers, type TemplateContext } from './types';
2
+ export declare function buildContext(answers: InitAnswers, aruiScriptsVersion: string): TemplateContext;
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildContext = buildContext;
4
+ const VERSIONS = {
5
+ react: '^19.0.0',
6
+ reactDom: '^19.0.0',
7
+ typescript: '^6.0.0',
8
+ typesReact: '^19.0.0',
9
+ typesReactDom: '^19.0.0',
10
+ typesNode: '^24.0.0',
11
+ typesWebpackEnv: '^1.18.0',
12
+ hapi: '^21.3.2',
13
+ inert: '^7.1.0',
14
+ coreComponents: '^50.24.0',
15
+ coreComponentsConfig: '^1.1.0',
16
+ coreComponentsStackContext: '^1.0.1',
17
+ scriptsServer: '^1.3.1',
18
+ reduxToolkit: '^2.5.0',
19
+ reactRedux: '^9.2.0',
20
+ coreJs: '^3.32.0',
21
+ reactCompilerRuntime: '^1.0.0',
22
+ jest: '^29.7.0',
23
+ tsJest: '^29.1.0',
24
+ typesJest: '^29.5.0',
25
+ vitest: '^4.1.5',
26
+ };
27
+ function buildContext(answers, aruiScriptsVersion) {
28
+ const dependencies = {
29
+ react: VERSIONS.react,
30
+ 'react-dom': VERSIONS.reactDom,
31
+ '@alfalab/core-components': VERSIONS.coreComponents,
32
+ '@alfalab/core-components-config': VERSIONS.coreComponentsConfig,
33
+ '@alfalab/core-components-stack-context': VERSIONS.coreComponentsStackContext,
34
+ };
35
+ const devDependencies = {
36
+ 'arui-scripts': `^${aruiScriptsVersion}`,
37
+ typescript: VERSIONS.typescript,
38
+ '@types/react': VERSIONS.typesReact,
39
+ '@types/react-dom': VERSIONS.typesReactDom,
40
+ '@types/node': VERSIONS.typesNode,
41
+ '@types/webpack-env': VERSIONS.typesWebpackEnv,
42
+ };
43
+ if (!answers.clientOnly) {
44
+ dependencies['@alfalab/scripts-server'] = VERSIONS.scriptsServer;
45
+ dependencies['@hapi/hapi'] = VERSIONS.hapi;
46
+ dependencies['@hapi/inert'] = VERSIONS.inert;
47
+ }
48
+ if (answers.useRtk) {
49
+ dependencies['@reduxjs/toolkit'] = VERSIONS.reduxToolkit;
50
+ dependencies['react-redux'] = VERSIONS.reactRedux;
51
+ }
52
+ if (answers.polyfills) {
53
+ dependencies['core-js'] = VERSIONS.coreJs;
54
+ }
55
+ if (answers.reactCompiler) {
56
+ dependencies['react-compiler-runtime'] = VERSIONS.reactCompilerRuntime;
57
+ }
58
+ if (answers.testRunner === 'jest') {
59
+ devDependencies.jest = VERSIONS.jest;
60
+ devDependencies['ts-jest'] = VERSIONS.tsJest;
61
+ devDependencies['@types/jest'] = VERSIONS.typesJest;
62
+ }
63
+ else {
64
+ devDependencies.vitest = VERSIONS.vitest;
65
+ }
66
+ return {
67
+ name: answers.name,
68
+ useRtk: answers.useRtk,
69
+ clientOnly: answers.clientOnly,
70
+ codeLoader: answers.codeLoader,
71
+ testRunner: answers.testRunner,
72
+ cssModules: answers.cssModules,
73
+ clientServerPort: answers.clientServerPort,
74
+ serverPort: answers.serverPort,
75
+ dockerRegistry: answers.dockerRegistry.trim(),
76
+ presets: answers.presets.trim(),
77
+ polyfills: answers.polyfills,
78
+ reactCompiler: answers.reactCompiler,
79
+ aruiScriptsVersion,
80
+ dependencies,
81
+ devDependencies,
82
+ };
83
+ }
@@ -0,0 +1,3 @@
1
+ import { type TemplateContext } from './types';
2
+ export declare function clientBaseDir(ctx: TemplateContext): string;
3
+ export declare function buildFileMap(ctx: TemplateContext): Record<string, string>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clientBaseDir = clientBaseDir;
4
+ exports.buildFileMap = buildFileMap;
5
+ const app_component_template_1 = require("./templates/app-component.template");
6
+ const app_styles_template_1 = require("./templates/app-styles.template");
7
+ const app_test_template_1 = require("./templates/app-test.template");
8
+ const arui_scripts_config_template_1 = require("./templates/arui-scripts-config.template");
9
+ const client_entry_template_1 = require("./templates/client-entry.template");
10
+ const misc_template_1 = require("./templates/misc.template");
11
+ const package_json_template_1 = require("./templates/package-json.template");
12
+ const server_entry_template_1 = require("./templates/server-entry.template");
13
+ const store_template_1 = require("./templates/store.template");
14
+ const tsconfig_template_1 = require("./templates/tsconfig.template");
15
+ const vitest_config_template_1 = require("./templates/vitest-config.template");
16
+ function clientBaseDir(ctx) {
17
+ return ctx.clientOnly ? 'src' : 'src/client';
18
+ }
19
+ function buildFileMap(ctx) {
20
+ const client = clientBaseDir(ctx);
21
+ const files = {
22
+ 'package.json': (0, package_json_template_1.packageJsonTemplate)(ctx),
23
+ 'arui-scripts.config.ts': (0, arui_scripts_config_template_1.aruiScriptsConfigTemplate)(ctx),
24
+ 'tsconfig.json': (0, tsconfig_template_1.tsconfigTemplate)(ctx),
25
+ '.gitignore': (0, misc_template_1.gitignoreTemplate)(),
26
+ '.yarnrc.yml': (0, misc_template_1.yarnrcTemplate)(),
27
+ 'global-definitions.d.ts': (0, misc_template_1.globalDefinitionsTemplate)(),
28
+ 'README.md': (0, misc_template_1.readmeTemplate)(ctx),
29
+ [`${client}/index.tsx`]: (0, client_entry_template_1.clientEntryTemplate)(ctx),
30
+ [`${client}/components/app.tsx`]: (0, app_component_template_1.appComponentTemplate)(ctx),
31
+ [`${client}/components/${(0, app_styles_template_1.appStylesFileName)(ctx)}`]: (0, app_styles_template_1.appStylesTemplate)(ctx),
32
+ [`${client}/components/__tests__/app.test.tsx`]: (0, app_test_template_1.appTestTemplate)(ctx),
33
+ };
34
+ if (!ctx.clientOnly) {
35
+ files['src/server/index.tsx'] = (0, server_entry_template_1.serverEntryTemplate)(ctx);
36
+ }
37
+ if (ctx.testRunner === 'vitest') {
38
+ files['vitest.config.ts'] = (0, vitest_config_template_1.vitestConfigTemplate)();
39
+ }
40
+ if (ctx.polyfills) {
41
+ files[`${client}/polyfills.ts`] = (0, misc_template_1.polyfillsTemplate)();
42
+ }
43
+ if (ctx.useRtk) {
44
+ files[`${client}/store/index.ts`] = (0, store_template_1.storeIndexTemplate)();
45
+ files[`${client}/store/hooks.ts`] = (0, store_template_1.storeHooksTemplate)();
46
+ files[`${client}/store/counter-slice.ts`] = (0, store_template_1.counterSliceTemplate)();
47
+ }
48
+ return files;
49
+ }
package/build/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/build/cli.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ /* eslint-disable no-console */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const create_program_1 = require("./create-program");
9
+ (0, create_program_1.createProgram)()
10
+ .parseAsync(process.argv)
11
+ .catch((error) => {
12
+ const message = error instanceof Error ? error.message : String(error);
13
+ console.error(`${chalk_1.default.red('x')} ${message}`);
14
+ process.exit(1);
15
+ });
@@ -0,0 +1,5 @@
1
+ import { Command } from 'commander';
2
+ import { type CliFlags } from './defaults';
3
+ export type InitHandler = (dir: string | undefined, flags: CliFlags) => Promise<void>;
4
+ export declare function createProgram(onInit?: InitHandler): Command;
5
+ export declare function mapOptsToFlags(opts: Record<string, unknown>): CliFlags;
@@ -0,0 +1,103 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createProgram = createProgram;
13
+ exports.mapOptsToFlags = mapOptsToFlags;
14
+ const commander_1 = require("commander");
15
+ const run_1 = require("./run");
16
+ // eslint-disable-next-line global-require, @typescript-eslint/no-var-requires
17
+ const { version } = require('../package.json');
18
+ const defaultInitHandler = (dir, flags) => (0, run_1.runInit)({ targetDirArg: dir, flags });
19
+ function createProgram(onInit = defaultInitHandler) {
20
+ const program = new commander_1.Command('create-arui-scripts-app');
21
+ program
22
+ .description('Создает шаблонный проект arui-scripts')
23
+ .argument('[dir]', 'Директория проекта (по умолчанию - текущая)')
24
+ .version(version, '-v, --version', 'Показать версию')
25
+ .option('-y, --yes', 'Без вопросов, значения по умолчанию')
26
+ .option('--force', 'Перезаписать существующие файлы шаблона')
27
+ .option('--name <name>', 'Имя проекта (npm package name)')
28
+ .option('--rtk', 'React + Redux Toolkit')
29
+ .option('--no-rtk', 'Только React, без RTK')
30
+ .addOption(new commander_1.Option('--client-only', 'Только клиент').conflicts('ssr'))
31
+ .addOption(new commander_1.Option('--ssr', 'Клиент + сервер').conflicts('clientOnly'))
32
+ .addOption(new commander_1.Option('--code-loader <loader>', 'Транспилятор').choices(['swc', 'babel', 'tsc']))
33
+ .addOption(new commander_1.Option('--test-runner <runner>', 'Тест-раннер').choices(['jest', 'vitest']))
34
+ .option('--css-modules', 'CSS-модули')
35
+ .option('--no-css-modules', 'Обычный css')
36
+ .option('--client-port <port>', 'Порт dev-сервера', (value) => Number(value))
37
+ .option('--server-port <port>', 'Порт node-сервера', (value) => Number(value))
38
+ .option('--docker-registry <registry>', 'Docker registry')
39
+ .option('--presets <package>', 'Preset-пакет')
40
+ .option('--polyfills', 'Добавить core-js')
41
+ .option('--no-polyfills', 'Без полифилов')
42
+ .option('--react-compiler', 'Включить experimentalReactCompiler')
43
+ .option('--no-react-compiler', 'Выключить experimentalReactCompiler')
44
+ .option('--install', 'Установить зависимости после генерации')
45
+ .option('--no-install', 'Не устанавливать зависимости')
46
+ .showHelpAfterError('(используйте --help для справки)')
47
+ .action((dir, opts) => __awaiter(this, void 0, void 0, function* () {
48
+ yield onInit(dir, mapOptsToFlags(opts));
49
+ }));
50
+ return program;
51
+ }
52
+ function mapOptsToFlags(opts) {
53
+ const flags = {};
54
+ if (opts.yes === true) {
55
+ flags.yes = true;
56
+ }
57
+ if (opts.force === true) {
58
+ flags.force = true;
59
+ }
60
+ if (typeof opts.name === 'string') {
61
+ flags.name = opts.name;
62
+ }
63
+ if (typeof opts.rtk === 'boolean') {
64
+ flags.useRtk = opts.rtk;
65
+ }
66
+ if (opts.clientOnly === true) {
67
+ flags.clientOnly = true;
68
+ }
69
+ if (opts.ssr === true) {
70
+ flags.clientOnly = false;
71
+ }
72
+ if (typeof opts.codeLoader === 'string') {
73
+ flags.codeLoader = opts.codeLoader;
74
+ }
75
+ if (typeof opts.testRunner === 'string') {
76
+ flags.testRunner = opts.testRunner;
77
+ }
78
+ if (typeof opts.cssModules === 'boolean') {
79
+ flags.cssModules = opts.cssModules;
80
+ }
81
+ if (typeof opts.clientPort === 'number' && !Number.isNaN(opts.clientPort)) {
82
+ flags.clientServerPort = opts.clientPort;
83
+ }
84
+ if (typeof opts.serverPort === 'number' && !Number.isNaN(opts.serverPort)) {
85
+ flags.serverPort = opts.serverPort;
86
+ }
87
+ if (typeof opts.dockerRegistry === 'string') {
88
+ flags.dockerRegistry = opts.dockerRegistry;
89
+ }
90
+ if (typeof opts.presets === 'string') {
91
+ flags.presets = opts.presets;
92
+ }
93
+ if (typeof opts.polyfills === 'boolean') {
94
+ flags.polyfills = opts.polyfills;
95
+ }
96
+ if (typeof opts.reactCompiler === 'boolean') {
97
+ flags.reactCompiler = opts.reactCompiler;
98
+ }
99
+ if (typeof opts.install === 'boolean') {
100
+ flags.install = opts.install;
101
+ }
102
+ return flags;
103
+ }
@@ -0,0 +1,21 @@
1
+ import { type CodeLoader, type InitAnswers, type TestRunner } from './types';
2
+ export type CliFlags = {
3
+ yes?: boolean;
4
+ force?: boolean;
5
+ name?: string;
6
+ useRtk?: boolean;
7
+ clientOnly?: boolean;
8
+ codeLoader?: CodeLoader;
9
+ testRunner?: TestRunner;
10
+ cssModules?: boolean;
11
+ clientServerPort?: number;
12
+ serverPort?: number;
13
+ dockerRegistry?: string;
14
+ presets?: string;
15
+ polyfills?: boolean;
16
+ reactCompiler?: boolean;
17
+ install?: boolean;
18
+ };
19
+ export declare function defaultAnswers(name: string): InitAnswers;
20
+ export declare function hasAnswerFlags(flags: CliFlags): boolean;
21
+ export declare function answersFromFlags(defaultName: string, flags: CliFlags): InitAnswers;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultAnswers = defaultAnswers;
4
+ exports.hasAnswerFlags = hasAnswerFlags;
5
+ exports.answersFromFlags = answersFromFlags;
6
+ function defaultAnswers(name) {
7
+ return {
8
+ name,
9
+ useRtk: false,
10
+ clientOnly: false,
11
+ codeLoader: 'swc',
12
+ testRunner: 'jest',
13
+ cssModules: true,
14
+ clientServerPort: 8080,
15
+ serverPort: 3000,
16
+ dockerRegistry: '',
17
+ presets: '',
18
+ polyfills: false,
19
+ reactCompiler: false,
20
+ install: false,
21
+ };
22
+ }
23
+ const ANSWER_FLAG_KEYS = [
24
+ 'name',
25
+ 'useRtk',
26
+ 'clientOnly',
27
+ 'codeLoader',
28
+ 'testRunner',
29
+ 'cssModules',
30
+ 'clientServerPort',
31
+ 'serverPort',
32
+ 'dockerRegistry',
33
+ 'presets',
34
+ 'polyfills',
35
+ 'reactCompiler',
36
+ 'install',
37
+ ];
38
+ function hasAnswerFlags(flags) {
39
+ return ANSWER_FLAG_KEYS.some((key) => flags[key] !== undefined);
40
+ }
41
+ // cобираем все ответы из флагов CLI
42
+ function answersFromFlags(defaultName, flags) {
43
+ var _a, _b;
44
+ const base = defaultAnswers(((_a = flags.name) === null || _a === void 0 ? void 0 : _a.trim()) || defaultName);
45
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, base), (flags.useRtk === undefined ? {} : { useRtk: flags.useRtk })), (flags.clientOnly === undefined ? {} : { clientOnly: flags.clientOnly })), (flags.codeLoader === undefined ? {} : { codeLoader: flags.codeLoader })), (flags.testRunner === undefined ? {} : { testRunner: flags.testRunner })), (flags.cssModules === undefined ? {} : { cssModules: flags.cssModules })), (flags.clientServerPort === undefined
46
+ ? {}
47
+ : { clientServerPort: flags.clientServerPort })), (flags.serverPort === undefined ? {} : { serverPort: flags.serverPort })), (flags.dockerRegistry === undefined ? {} : { dockerRegistry: flags.dockerRegistry })), (flags.presets === undefined ? {} : { presets: flags.presets })), (flags.polyfills === undefined ? {} : { polyfills: flags.polyfills })), (flags.reactCompiler === undefined ? {} : { reactCompiler: flags.reactCompiler })), (flags.install === undefined ? {} : { install: flags.install })), { name: (((_b = flags.name) === null || _b === void 0 ? void 0 : _b.trim()) || defaultName).trim() });
48
+ }
@@ -0,0 +1,3 @@
1
+ export type PackageManager = 'yarn' | 'npm';
2
+ export declare function detectPackageManager(): PackageManager;
3
+ export declare function installDependencies(targetDir: string, packageManager?: PackageManager): Promise<void>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.detectPackageManager = detectPackageManager;
7
+ exports.installDependencies = installDependencies;
8
+ const child_process_1 = require("child_process");
9
+ const shelljs_1 = __importDefault(require("shelljs"));
10
+ function detectPackageManager() {
11
+ return shelljs_1.default.which('yarn') ? 'yarn' : 'npm';
12
+ }
13
+ function installDependencies(targetDir, packageManager = detectPackageManager()) {
14
+ const args = packageManager === 'yarn' ? [] : ['install'];
15
+ return new Promise((resolve, reject) => {
16
+ var _a, _b;
17
+ const child = (0, child_process_1.spawn)(packageManager, args, {
18
+ cwd: targetDir,
19
+ stdio: ['ignore', 'pipe', 'pipe'],
20
+ // для windows
21
+ shell: process.platform === 'win32',
22
+ });
23
+ let output = '';
24
+ const collect = (chunk) => {
25
+ output += chunk.toString();
26
+ };
27
+ (_a = child.stdout) === null || _a === void 0 ? void 0 : _a.on('data', collect);
28
+ (_b = child.stderr) === null || _b === void 0 ? void 0 : _b.on('data', collect);
29
+ child.on('error', reject);
30
+ child.on('close', (code) => {
31
+ if (code === 0) {
32
+ resolve();
33
+ }
34
+ else {
35
+ reject(new Error(`${packageManager} ${args.join(' ')} завершился с кодом ${code}\n${output.trim()}`));
36
+ }
37
+ });
38
+ });
39
+ }
@@ -0,0 +1,3 @@
1
+ import type prompts from 'prompts';
2
+ import { type CliFlags } from './defaults';
3
+ export declare function getQuestions(defaultName: string, prefill?: CliFlags): prompts.PromptObject[];
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getQuestions = getQuestions;
4
+ const validate_project_name_1 = require("./validate-project-name");
5
+ function getQuestions(defaultName, prefill = {}) {
6
+ const unlessAnswered = (key, type) => prefill[key] === undefined ? type : null;
7
+ return [
8
+ {
9
+ type: unlessAnswered('name', 'text'),
10
+ name: 'name',
11
+ message: 'Имя проекта',
12
+ initial: defaultName,
13
+ validate: (value) => (0, validate_project_name_1.validateProjectName)(value),
14
+ },
15
+ {
16
+ type: unlessAnswered('useRtk', 'select'),
17
+ name: 'useRtk',
18
+ message: 'Стек проекта',
19
+ initial: 0,
20
+ choices: [
21
+ { title: 'React', value: false, description: 'Только React и хуки' },
22
+ {
23
+ title: 'React + RTK',
24
+ value: true,
25
+ description: 'Redux Toolkit для управления состоянием',
26
+ },
27
+ ],
28
+ },
29
+ {
30
+ type: unlessAnswered('clientOnly', 'select'),
31
+ name: 'clientOnly',
32
+ message: 'Тип приложения',
33
+ initial: 0,
34
+ choices: [
35
+ { title: 'SSR', value: false, description: 'Клиент + Node-сервер' },
36
+ { title: 'clientOnly', value: true, description: 'Статика, без сервера' },
37
+ ],
38
+ },
39
+ {
40
+ type: unlessAnswered('codeLoader', 'select'),
41
+ name: 'codeLoader',
42
+ message: 'Транспилятор кода',
43
+ initial: 0,
44
+ choices: [
45
+ { title: 'swc', value: 'swc', description: 'Самый быстрый' },
46
+ { title: 'babel', value: 'babel', description: 'Максимальная совместимость' },
47
+ { title: 'tsc', value: 'tsc', description: 'Через TypeScript-компилятор' },
48
+ ],
49
+ },
50
+ {
51
+ type: unlessAnswered('testRunner', 'select'),
52
+ name: 'testRunner',
53
+ message: 'На чем писать тесты',
54
+ initial: 0,
55
+ choices: [
56
+ { title: 'Jest', value: 'jest', description: 'Классика' },
57
+ { title: 'Vitest', value: 'vitest', description: 'Быстрее, на базе Vite' },
58
+ ],
59
+ },
60
+ {
61
+ type: unlessAnswered('cssModules', 'toggle'),
62
+ name: 'cssModules',
63
+ message: 'Использовать CSS-модули',
64
+ initial: true,
65
+ active: 'да',
66
+ inactive: 'нет',
67
+ },
68
+ {
69
+ type: unlessAnswered('clientServerPort', 'number'),
70
+ name: 'clientServerPort',
71
+ message: 'Порт dev-сервера (клиент)',
72
+ initial: 8080,
73
+ },
74
+ {
75
+ // Пропускаем порт сервера для clientOnly приложений
76
+ // и когда он уже задан флагом.
77
+ type: (_prev, values) => {
78
+ var _a;
79
+ const clientOnly = (_a = prefill.clientOnly) !== null && _a !== void 0 ? _a : values.clientOnly;
80
+ if (clientOnly || prefill.serverPort !== undefined) {
81
+ return null;
82
+ }
83
+ return 'number';
84
+ },
85
+ name: 'serverPort',
86
+ message: 'Порт node-сервера',
87
+ initial: 3000,
88
+ },
89
+ {
90
+ type: unlessAnswered('dockerRegistry', 'text'),
91
+ name: 'dockerRegistry',
92
+ message: 'Docker registry (Enter - пропустить)',
93
+ initial: '',
94
+ },
95
+ {
96
+ type: unlessAnswered('presets', 'text'),
97
+ name: 'presets',
98
+ message: 'Preset-пакет (Enter - пропустить)',
99
+ initial: '',
100
+ },
101
+ {
102
+ type: unlessAnswered('polyfills', 'toggle'),
103
+ name: 'polyfills',
104
+ message: 'Добавить полифилы (core-js)',
105
+ initial: false,
106
+ active: 'да',
107
+ inactive: 'нет',
108
+ },
109
+ {
110
+ type: unlessAnswered('reactCompiler', 'toggle'),
111
+ name: 'reactCompiler',
112
+ message: 'Включить experimentalReactCompiler',
113
+ initial: false,
114
+ active: 'да',
115
+ inactive: 'нет',
116
+ },
117
+ {
118
+ type: unlessAnswered('install', 'toggle'),
119
+ name: 'install',
120
+ message: 'Установить зависимости сейчас',
121
+ initial: false,
122
+ active: 'да',
123
+ inactive: 'нет',
124
+ },
125
+ ];
126
+ }
package/build/run.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { type CliFlags } from './defaults';
2
+ export type RunInitOptions = {
3
+ targetDirArg?: string;
4
+ cwd?: string;
5
+ aruiScriptsVersion?: string;
6
+ flags?: CliFlags;
7
+ };
8
+ export declare function runInit(options?: RunInitOptions): Promise<void>;
9
+ export declare function resolveCdPath(baseCwd: string, targetDir: string): string | null;