HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //proc/self/root/usr/local/lib/node_modules/@ionic/cli/commands/init.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.InitCommand = void 0;
const tslib_1 = require("tslib");
const cli_framework_1 = require("@ionic/cli-framework");
const string_1 = require("@ionic/cli-framework/utils/string");
const utils_terminal_1 = require("@ionic/utils-terminal");
const path = tslib_1.__importStar(require("path"));
const constants_1 = require("../constants");
const color_1 = require("../lib/color");
const command_1 = require("../lib/command");
const errors_1 = require("../lib/errors");
const project_1 = require("../lib/project");
class InitCommand extends command_1.Command {
    async getMetadata() {
        return {
            name: 'init',
            type: 'global',
            summary: 'Initialize existing projects with Ionic',
            description: `
This command will initialize an Ionic app within the current directory. Usually, this means an ${(0, color_1.input)(constants_1.PROJECT_FILE)} file is created. If used within a multi-app project, the app is initialized in the root ${(0, color_1.input)(constants_1.PROJECT_FILE)}.

${(0, color_1.input)('ionic init')} will prompt for a project name and then proceed to determine the type of your project. You can specify the ${(0, color_1.input)('name')} argument and ${(0, color_1.input)('--type')} option to provide these values via command-line.

If the ${(0, color_1.input)('--multi-app')} flag is specified, this command will initialize your project as a multi-app project, allowing for apps within monorepos and unconventional repository structures. See the multi-app docs[^multi-app-docs] for details. Once a multi-app project is initialized, you can run ${(0, color_1.input)('ionic init')} again within apps in your project to initialize them.
      `,
            exampleCommands: [
                '',
                '"My App"',
                '"My App" --type=angular',
                '--multi-app',
            ],
            inputs: [
                {
                    name: 'name',
                    summary: `The name of your project (e.g. ${(0, color_1.input)('myApp')}, ${(0, color_1.input)('"My App"')})`,
                },
            ],
            options: [
                {
                    name: 'type',
                    summary: `Type of project (e.g. ${constants_1.MODERN_PROJECT_TYPES.map(type => (0, color_1.input)(type)).join(', ')})`,
                },
                {
                    name: 'force',
                    summary: 'Initialize even if a project already exists',
                    type: Boolean,
                    aliases: ['f'],
                    default: false,
                },
                {
                    name: 'multi-app',
                    summary: 'Initialize a multi-app project',
                    type: Boolean,
                    default: false,
                },
                {
                    name: 'project-id',
                    summary: 'Specify a slug for your app',
                    groups: ["advanced" /* MetadataGroup.ADVANCED */],
                    spec: { value: 'slug' },
                    hint: (0, color_1.weak)('[multi-app]'),
                },
                {
                    name: 'default',
                    summary: 'Mark the initialized app as the default project',
                    type: Boolean,
                    groups: ["advanced" /* MetadataGroup.ADVANCED */],
                    hint: (0, color_1.weak)('[multi-app]'),
                },
            ],
            groups: ["beta" /* MetadataGroup.BETA */],
            footnotes: [
                {
                    id: 'multi-app-docs',
                    url: 'https://ionicframework.com/docs/cli/configuration#multi-app-projects',
                    shortUrl: 'https://ion.link/multi-app-docs',
                },
            ],
        };
    }
    async preRun(inputs, options) {
        const force = options['force'] ? true : false;
        if (this.project && !force) {
            // TODO: check for existing project config in multi-app
            if (this.project.details.context === 'app' || (this.project.details.context === 'multiapp' && options['multi-app'])) {
                throw new errors_1.FatalException(`Existing Ionic project file found: ${(0, color_1.strong)((0, utils_terminal_1.prettyPath)(this.project.filePath))}\n` +
                    `You can re-initialize your project using the ${(0, color_1.input)('--force')} option.`);
            }
        }
        if (!options['multi-app']) {
            if (!inputs[0]) {
                const name = await this.env.prompt({
                    type: 'input',
                    name: 'name',
                    message: 'Project name:',
                    validate: v => cli_framework_1.validators.required(v),
                });
                inputs[0] = name;
            }
            if (!options['type']) {
                const details = new project_1.ProjectDetails({ rootDirectory: this.env.ctx.execPath, e: this.env });
                options['type'] = await details.getTypeFromDetection();
            }
            if (!options['type']) {
                if (this.env.flags.interactive) {
                    this.env.log.warn(`Could not determine project type.\n` +
                        `Please choose a project type from the list.`);
                    this.env.log.nl();
                }
                const type = await this.env.prompt({
                    type: 'list',
                    name: 'type',
                    message: 'Project type:',
                    choices: constants_1.MODERN_PROJECT_TYPES.map(t => ({
                        name: `${(0, project_1.prettyProjectName)(t)} (${(0, color_1.input)(t)})`,
                        value: t,
                    })),
                });
                options['type'] = type;
            }
        }
    }
    async run(inputs, options) {
        if (options['multi-app']) {
            await this.initializeMultiProject(inputs, options);
        }
        else {
            await this.initializeApp(inputs, options);
        }
        this.env.log.ok('Your Ionic project has been initialized!');
    }
    async initializeMultiProject(inputs, options) {
        const configPath = this.getProjectFilePath();
        const config = new project_1.MultiProjectConfig(configPath);
        config.c = { projects: {} };
    }
    async initializeApp(inputs, options) {
        const name = inputs[0] ? inputs[0].trim() : '';
        const type = options['type'] ? String(options['type']) : undefined;
        const projectId = options['project-id'] ? String(options['project-id']) : (0, string_1.slugify)(name); // TODO validate --project-id
        if (!name) {
            throw new errors_1.FatalException(`Project name not specified.\n` +
                `Please specify ${(0, color_1.input)('name')}, the first argument of ${(0, color_1.input)('ionic init')}. See ${(0, color_1.input)('ionic init --help')} for details.`);
        }
        if (!type) {
            throw new errors_1.FatalException(`Could not determine project type.\n` +
                `Please specify ${(0, color_1.input)('--type')}. See ${(0, color_1.input)('ionic init --help')} for details.`);
        }
        let project;
        if (this.project && this.project.details.context === 'multiapp') {
            const configPath = path.resolve(this.project.rootDirectory, constants_1.PROJECT_FILE);
            const projectRoot = path.relative(this.project.rootDirectory, this.env.ctx.execPath);
            const config = new project_1.MultiProjectConfig(configPath);
            if (!projectRoot) {
                if (this.env.flags.interactive) {
                    this.env.log.warn(`About to initialize app in the root directory of your multi-app project.\n` +
                        `Please confirm that you want your app initialized in the root of your multi-app project. If this wasn't intended, please ${(0, color_1.input)('cd')} into the appropriate directory and run ${(0, color_1.input)('ionic init')} again.\n`);
                }
                const confirm = await this.env.prompt({
                    type: 'confirm',
                    message: 'Continue?',
                    default: false,
                });
                if (!confirm) {
                    throw new errors_1.FatalException(`Not initializing app in root directory.`);
                }
            }
            const defaultProject = config.get('defaultProject');
            if (!defaultProject && typeof options['default'] !== 'boolean') {
                const confirm = await this.env.prompt({
                    type: 'confirm',
                    message: `Would you like to make this app the default project?`,
                    default: true,
                });
                if (confirm) {
                    options['default'] = true;
                }
            }
            if (options['default']) {
                config.set('defaultProject', projectId);
            }
            project = await (0, project_1.createProjectFromDetails)({ context: 'multiapp', configPath, id: projectId, type, errors: [] }, this.env);
            project.config.set('root', projectRoot);
        }
        else {
            const configPath = this.getProjectFilePath();
            project = await (0, project_1.createProjectFromDetails)({ context: 'app', configPath, type, errors: [] }, this.env);
        }
        project.config.set('name', name);
        project.config.set('type', type);
    }
    getProjectFilePath() {
        return path.resolve(this.env.ctx.execPath, constants_1.PROJECT_FILE);
    }
}
exports.InitCommand = InitCommand;