Skip to content

Commit f83dc5b

Browse files
committed
feat(multi-app): determine active project via cwd path match
1 parent 3291b11 commit f83dc5b

File tree

3 files changed

+62
-31
lines changed

3 files changed

+62
-31
lines changed

packages/ionic/src/commands/start.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ ${chalk.cyan('[1]')}: ${chalk.bold('https://ionicframework.com/docs/cli/starters
449449
this.namespace.root.project = project;
450450

451451
if (!this.project) {
452-
throw new FatalException('Error while loading new project. Please report this error!');
452+
throw new FatalException('Error while loading project.');
453453
}
454454

455455
this.env.shell.alterPath = p => prependNodeModulesBinToPath(projectDir, p);

packages/ionic/src/lib/index.ts

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import * as path from 'path';
88

99
import { ERROR_VERSION_TOO_OLD } from '../bootstrap';
1010
import { PROJECT_FILE } from '../constants';
11-
import { IProject, InfoItem, IonicContext, IonicEnvironment, IonicEnvironmentFlags, ProjectType } from '../definitions';
11+
import { IProject, InfoItem, IonicContext, IonicEnvironment, IonicEnvironmentFlags } from '../definitions';
1212

1313
import { CONFIG_FILE, Config, DEFAULT_CONFIG_DIRECTORY, parseGlobalOptions } from './config';
1414
import { Environment } from './environment';
1515
import { Client } from './http';
16-
import { ProjectDeps, createProjectFromType, determineProjectType } from './project';
16+
import { ProjectDeps, ProjectDetails, createProjectFromType, determineProjectDetails } from './project';
1717
import { createOnFallback } from './prompts';
1818
import { ProSession } from './session';
1919
import { Shell, prependNodeModulesBinToPath } from './shell';
@@ -30,7 +30,7 @@ export async function getProject(projectDir: string | undefined, projectName: st
3030
const { log } = deps;
3131
const projectFilePath = path.resolve(projectDir, PROJECT_FILE);
3232
let projectFile: { [key: string]: any; } | undefined;
33-
let type: ProjectType | undefined;
33+
let projectDetails: ProjectDetails | undefined;
3434

3535
try {
3636
projectFile = await readJsonFile(projectFilePath);
@@ -40,20 +40,25 @@ export async function getProject(projectDir: string | undefined, projectName: st
4040
`Attempted to load project config ${chalk.bold(prettyPath(projectFilePath))} but got error:\n\n` +
4141
chalk.red(e.toString())
4242
);
43+
log.nl();
4344
}
4445

4546
if (projectFile) {
46-
projectName = projectName || projectFile.defaultProject;
47-
type = await determineProjectType(projectDir, projectName, projectFile, deps);
48-
49-
debug(`Project name: ${chalk.bold(String(projectName))}`);
47+
try {
48+
projectDetails = await determineProjectDetails(projectDir, projectName, projectFile, deps);
49+
} catch (e) {
50+
log.warn(e.toString());
51+
log.nl();
52+
}
5053
}
5154

52-
if (!type) {
55+
if (!projectDetails) {
5356
return;
5457
}
5558

56-
return createProjectFromType(projectFilePath, projectName, deps, type);
59+
const { name, type } = projectDetails;
60+
61+
return createProjectFromType(projectFilePath, name, deps, type);
5762
}
5863

5964
export async function generateIonicEnvironment(ctx: IonicContext, pargv: string[]): Promise<{ env: IonicEnvironment; project?: IProject; }> {
@@ -129,14 +134,7 @@ export async function generateIonicEnvironment(ctx: IonicContext, pargv: string[
129134
log.warn(`${chalk.green('--yarn')} / ${chalk.green('--no-yarn')} has been removed. Use ${chalk.green(`ionic config set -g npmClient ${argv['yarn'] ? 'yarn' : 'npm'}`)}.`);
130135
}
131136

132-
let project: IProject | undefined;
133-
134-
try {
135-
project = await getProject(projectDir, projectName, deps);
136-
} catch (e) {
137-
log.warn(e.toString());
138-
log.nl();
139-
}
137+
const project = await getProject(projectDir, projectName, deps);
140138

141139
return { env, project };
142140
}

packages/ionic/src/lib/project/index.ts

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,43 @@ import * as ζserve from '../serve';
1818

1919
const debug = Debug('ionic:lib:project');
2020

21-
export async function determineProjectType(projectDir: string, projectName: string | undefined, projectConfig: { [key: string]: any; } | undefined, deps: ProjectDeps): Promise<ProjectType | undefined> {
21+
export interface ProjectDetails {
22+
name?: string;
23+
type: ProjectType;
24+
}
25+
26+
export async function determineProjectDetails(rootProjectDir: string, projectName: string | undefined, projectConfig: { [key: string]: any; } | undefined, deps: ProjectDeps): Promise<ProjectDetails | undefined> {
27+
let name: string | undefined;
2228
let type: ProjectType | undefined;
2329

30+
if (projectName) {
31+
name = projectName;
32+
debug(`Project name from projectName: ${chalk.bold(name)}`);
33+
}
34+
2435
if (isProjectConfig(projectConfig)) {
2536
type = projectConfig.type;
2637
} else if (isMultiProjectConfig(projectConfig)) {
27-
const name = projectName ? projectName : projectConfig.defaultProject;
38+
if (!name) {
39+
const { ctx } = deps;
40+
41+
for (const [ key, value ] of lodash.entries(projectConfig.projects)) {
42+
if (value && value.root) {
43+
const projectDir = path.resolve(rootProjectDir, value.root);
44+
45+
if (ctx.execPath.includes(projectDir)) {
46+
name = key;
47+
debug(`Project name from path match: ${chalk.bold(name)}`);
48+
break;
49+
}
50+
}
51+
}
52+
}
53+
54+
if (!name && projectConfig.defaultProject) {
55+
name = projectConfig.defaultProject;
56+
debug(`Project name from defaultProject: ${chalk.bold(name)}`);
57+
}
2858

2959
if (!name) {
3060
throw new Error(
@@ -37,6 +67,7 @@ export async function determineProjectType(projectDir: string, projectName: stri
3767

3868
if (config) {
3969
type = config.type;
70+
debug(`Project type from config: ${chalk.bold(prettyProjectName(type))} ${type ? chalk.bold(`(${type})`) : ''}`);
4071
} else {
4172
throw new Error(
4273
`Multi-app workspace detected, but project was not found in configuration.\n` +
@@ -52,26 +83,28 @@ export async function determineProjectType(projectDir: string, projectName: stri
5283
}
5384
}
5485

55-
if (type && PROJECT_TYPES.includes(type)) {
56-
debug(`Project type from config: ${chalk.bold(prettyProjectName(type))} ${type ? chalk.bold(`(${type})`) : ''}`);
57-
return type;
58-
}
59-
60-
for (const projectType of PROJECT_TYPES) {
61-
const p = await createProjectFromType(path.resolve(projectDir, PROJECT_FILE), projectName, deps, projectType);
86+
if (!type) {
87+
for (const projectType of PROJECT_TYPES) {
88+
const p = await createProjectFromType(path.resolve(rootProjectDir, PROJECT_FILE), projectName, deps, projectType);
6289

63-
if (await p.detected()) {
64-
debug(`Project type detected: ${chalk.bold(prettyProjectName(p.type))} ${p.type ? chalk.bold(`(${p.type})`) : ''}`);
65-
return p.type;
90+
if (await p.detected()) {
91+
debug(`Project type from detection: ${chalk.bold(prettyProjectName(p.type))} ${p.type ? chalk.bold(`(${p.type})`) : ''}`);
92+
type = p.type;
93+
break;
94+
}
6695
}
6796
}
6897

98+
if (type && PROJECT_TYPES.includes(type)) {
99+
return { name, type };
100+
}
101+
69102
const listWrapOptions = { width: TTY_WIDTH - 8 - 3, indentation: 1 };
70103

71104
// TODO: move some of this to the CLI docs
72105

73106
throw new Error(
74-
`Could not determine project type (project config: ${chalk.bold(prettyPath(path.resolve(projectDir, PROJECT_FILE)))}).\n` +
107+
`Could not determine project type (project config: ${chalk.bold(prettyPath(path.resolve(rootProjectDir, PROJECT_FILE)))}).\n` +
75108
`- ${wordWrap(`For ${chalk.bold(prettyProjectName('angular'))} projects, make sure ${chalk.green('@ionic/angular')} is listed as a dependency in ${chalk.bold('package.json')}.`, listWrapOptions)}\n` +
76109
`- ${wordWrap(`For ${chalk.bold(prettyProjectName('ionic-angular'))} projects, make sure ${chalk.green('ionic-angular')} is listed as a dependency in ${chalk.bold('package.json')}.`, listWrapOptions)}\n` +
77110
`- ${wordWrap(`For ${chalk.bold(prettyProjectName('ionic1'))} projects, make sure ${chalk.green('ionic')} is listed as a dependency in ${chalk.bold('bower.json')}.`, listWrapOptions)}\n\n` +

0 commit comments

Comments
 (0)