Skip to content

Commit 0d104c0

Browse files
clydinvikerman
authored andcommitted
feat(@angular-devkit/architect): support accessing project metadata
1 parent ab5b190 commit 0d104c0

File tree

8 files changed

+66
-0
lines changed

8 files changed

+66
-0
lines changed

etc/api/angular_devkit/architect/src/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export interface BuilderContext {
1515
workspaceRoot: string;
1616
addTeardown(teardown: () => (Promise<void> | void)): void;
1717
getBuilderNameForTarget(target: Target): Promise<string>;
18+
getProjectMetadata(target: Target): Promise<json.JsonObject>;
19+
getProjectMetadata(projectName: string): Promise<json.JsonObject>;
1820
getTargetOptions(target: Target): Promise<json.JsonObject>;
1921
reportProgress(current: number, total?: number, status?: string): void;
2022
reportRunning(): void;

etc/api/angular_devkit/architect/testing/index.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export declare class TestingArchitectHost implements ArchitectHost {
88
getBuilderNameForTarget(target: Target): Promise<string | null>;
99
getCurrentDirectory(): Promise<string>;
1010
getOptionsForTarget(target: Target): Promise<json.JsonObject | null>;
11+
getProjectMetadata(target: Target | string): Promise<json.JsonObject | null>;
1112
getWorkspaceRoot(): Promise<string>;
1213
loadBuilder(info: BuilderInfo): Promise<Builder | null>;
1314
resolveBuilder(builderName: string): Promise<BuilderInfo | null>;

packages/angular_devkit/architect/node/node-modules-architect-host.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,29 @@ export class WorkspaceNodeModulesArchitectHost implements ArchitectHost<NodeModu
113113
};
114114
}
115115

116+
async getProjectMetadata(target: Target | string): Promise<json.JsonObject | null> {
117+
const projectName = typeof target === 'string' ? target : target.project;
118+
119+
// NOTE: Remove conditional when deprecated support for experimental workspace API is removed.
120+
if ('getProject' in this._workspace) {
121+
return this._workspace.getProject(projectName) as unknown as json.JsonObject;
122+
} else {
123+
const projectDefinition = this._workspace.projects.get(projectName);
124+
if (!projectDefinition) {
125+
throw new Error('Project does not exist.');
126+
}
127+
128+
const metadata = {
129+
root: projectDefinition.root,
130+
sourceRoot: projectDefinition.sourceRoot,
131+
prefix: projectDefinition.prefix,
132+
...projectDefinition.extensions,
133+
} as unknown as json.JsonObject;
134+
135+
return metadata;
136+
}
137+
}
138+
116139
async loadBuilder(info: NodeModulesBuilderInfo): Promise<Builder> {
117140
const builder = (await import(info.import)).default;
118141
if (builder[BuilderSymbol]) {

packages/angular_devkit/architect/src/api.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@ export interface BuilderContext {
197197
*/
198198
getTargetOptions(target: Target): Promise<json.JsonObject>;
199199

200+
getProjectMetadata(projectName: string): Promise<json.JsonObject>;
201+
getProjectMetadata(target: Target): Promise<json.JsonObject>;
202+
200203
/**
201204
* Resolves and return a builder name. The exact format of the name is up to the host,
202205
* so it should not be parsed to gather information (it's free form). This string can be

packages/angular_devkit/architect/src/architect.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,30 @@ function _getTargetOptionsFactory(host: ArchitectHost) {
277277
);
278278
}
279279

280+
function _getProjectMetadataFactory(host: ArchitectHost) {
281+
return experimental.jobs.createJobHandler<Target, json.JsonValue, json.JsonObject>(
282+
target => {
283+
return host.getProjectMetadata(target).then(options => {
284+
if (options === null) {
285+
throw new Error(`Invalid target: ${JSON.stringify(target)}.`);
286+
}
287+
288+
return options;
289+
});
290+
},
291+
{
292+
name: '..getProjectMetadata',
293+
output: { type: 'object' },
294+
argument: {
295+
oneOf: [
296+
{ type: 'string' },
297+
inputSchema.properties.target,
298+
],
299+
},
300+
},
301+
);
302+
}
303+
280304
function _getBuilderNameForTargetFactory(host: ArchitectHost) {
281305
return experimental.jobs.createJobHandler<Target, never, string>(async target => {
282306
const builderName = await host.getBuilderNameForTarget(target);
@@ -342,6 +366,7 @@ export class Architect {
342366
privateArchitectJobRegistry.register(_getTargetOptionsFactory(_host));
343367
privateArchitectJobRegistry.register(_getBuilderNameForTargetFactory(_host));
344368
privateArchitectJobRegistry.register(_validateOptionsFactory(_host, registry));
369+
privateArchitectJobRegistry.register(_getProjectMetadataFactory(_host));
345370

346371
const jobRegistry = new experimental.jobs.FallbackRegistry([
347372
new ArchitectTargetJobRegistry(_host, registry, this._jobCache, this._infoCache),

packages/angular_devkit/architect/src/create-builder.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { Builder, BuilderSymbol, BuilderVersionSymbol } from './internal';
2525
import { scheduleByName, scheduleByTarget } from './schedule-by-name';
2626

2727

28+
// tslint:disable-next-line: no-big-function
2829
export function createBuilder<
2930
OptT extends json.JsonObject,
3031
OutT extends BuilderOutput = BuilderOutput,
@@ -144,6 +145,10 @@ export function createBuilder<
144145
return scheduler.schedule<Target, json.JsonValue, json.JsonObject>(
145146
'..getTargetOptions', target).output.toPromise();
146147
},
148+
async getProjectMetadata(target: Target | string) {
149+
return scheduler.schedule<Target | string, json.JsonValue, json.JsonObject>(
150+
'..getProjectMetadata', target).output.toPromise();
151+
},
147152
async getBuilderNameForTarget(target: Target) {
148153
return scheduler.schedule<Target, json.JsonValue, string>(
149154
'..getBuilderNameForTarget',

packages/angular_devkit/architect/src/internal.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,4 +78,7 @@ export interface ArchitectHost<BuilderInfoT extends BuilderInfo = BuilderInfo> {
7878
getWorkspaceRoot(): Promise<string>;
7979

8080
getOptionsForTarget(target: Target): Promise<json.JsonObject | null>;
81+
82+
getProjectMetadata(projectName: string): Promise<json.JsonObject | null>;
83+
getProjectMetadata(target: Target): Promise<json.JsonObject | null>;
8184
}

packages/angular_devkit/architect/testing/testing-architect-host.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ export class TestingArchitectHost implements ArchitectHost {
104104
return maybeTarget.options;
105105
}
106106

107+
async getProjectMetadata(target: Target | string): Promise<json.JsonObject | null> {
108+
return this._backendHost && this._backendHost.getProjectMetadata(target as string);
109+
}
110+
107111
async loadBuilder(info: BuilderInfo): Promise<Builder | null> {
108112
return this._builderImportMap.get(info.builderName)
109113
|| (this._backendHost && this._backendHost.loadBuilder(info));

0 commit comments

Comments
 (0)