angular-cli/packages/@angular/cli/tasks/schematic-get-options.ts
Hans Larsen 9b3f2cd97f fix(@angular/cli): do not limit arguments of schematics
The schema of a Schematic can be any valid schema. The CLI was erroring if
it included anything else than strings or booleans.
2017-10-16 18:37:25 +01:00

69 lines
1.8 KiB
TypeScript

const Task = require('../ember-cli/lib/models/task');
const stringUtils = require('ember-cli-string-utils');
import { CliConfig } from '../models/config';
import { getCollection, getSchematic } from '../utilities/schematics';
export interface SchematicGetOptions {
collectionName: string;
schematicName: string;
}
export interface SchematicAvailableOptions {
name: string;
description: string;
aliases: string[];
type: any;
}
export default Task.extend({
run: function (options: SchematicGetOptions): Promise<SchematicAvailableOptions[]> {
const collectionName = options.collectionName ||
CliConfig.getValue('defaults.schematics.collection');
const collection = getCollection(collectionName);
const schematic = getSchematic(collection, options.schematicName);
const properties = schematic.description.schemaJson.properties;
const keys = Object.keys(properties);
const availableOptions = keys
.map(key => ({...properties[key], ...{name: stringUtils.dasherize(key)}}))
.map(opt => {
let type;
switch (opt.type) {
case 'string':
type = String;
break;
case 'boolean':
type = Boolean;
break;
case 'integer':
case 'number':
type = Number;
break;
// Ignore arrays / objects.
default:
return null;
}
let aliases: string[] = [];
if (opt.alias) {
aliases = [...aliases, opt.alias];
}
if (opt.aliases) {
aliases = [...aliases, ...opt.aliases];
}
return {
...opt,
aliases,
type,
default: undefined // do not carry over schematics defaults
};
})
.filter(x => x);
return Promise.resolve(availableOptions);
}
});