diff --git a/packages/cli/package.json b/packages/cli/package.json index f719dc14e..fae00a256 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "igniteui-cli", - "version": "13.2.3", + "version": "13.2.4-beta.3", "description": "CLI tool for creating Ignite UI projects", "keywords": [ "CLI", @@ -78,8 +78,8 @@ "all": true }, "dependencies": { - "@igniteui/angular-templates": "~17.2.1323", - "@igniteui/cli-core": "~13.2.3", + "@igniteui/angular-templates": "~17.2.1324-beta.3", + "@igniteui/cli-core": "~13.2.4-beta.3", "chalk": "^2.3.2", "fs-extra": "^3.0.1", "glob": "^7.1.2", diff --git a/packages/core/package.json b/packages/core/package.json index 66280f038..2a913b981 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@igniteui/cli-core", - "version": "13.2.3", + "version": "13.2.4-beta.3", "description": "Base types and functionality for Ignite UI CLI", "repository": { "type": "git", diff --git a/packages/core/types/TemplateDependency.ts b/packages/core/types/TemplateDependency.ts index 8012b4150..01bd07dbf 100644 --- a/packages/core/types/TemplateDependency.ts +++ b/packages/core/types/TemplateDependency.ts @@ -9,6 +9,9 @@ export interface TemplateDependency { /** Add an identifier into `ngModule` provides metadata */ provide?: string | string[]; + /** Add an identifier into `ngModule` schema metadata */ + schema?: string | string[]; + /** The package/path(TBD) to import the dependency from */ from?: string; diff --git a/packages/core/typescript/TypeScriptFileUpdate.ts b/packages/core/typescript/TypeScriptFileUpdate.ts index 943c68e21..4fab9e3aa 100644 --- a/packages/core/typescript/TypeScriptFileUpdate.ts +++ b/packages/core/typescript/TypeScriptFileUpdate.ts @@ -25,6 +25,7 @@ export class TypeScriptFileUpdate { declarations: string[], imports: Array<{ name: string, root: boolean, standalone?: boolean }>, providers: string[], + schemas: Array<{ name: string, standalone?: boolean }>, exports: string[] }; @@ -52,8 +53,8 @@ export class TypeScriptFileUpdate { } // should we support both standalone and module-based components in the same app? - if (this.ngMetaEdits.imports.some(x => x.standalone)) { - transforms.push(this.componentMetaTransformer); + if (this.ngMetaEdits.imports.some(x => x.standalone) || (this.ngMetaEdits.schemas.some(x => x.standalone))) { + transforms.push(this.componentMetaTransformer); } else if (Object.keys(this.ngMetaEdits).filter(x => this.ngMetaEdits[x].length).length) { transforms.push(this.ngModuleTransformer); } @@ -141,13 +142,14 @@ export class TypeScriptFileUpdate { declare: this.asArray(dep.declare, variables), import: this.asArray(dep.import, variables), provide: this.asArray(dep.provide, variables), + schema: this.asArray(dep.schema, variables), // tslint:disable-next-line:object-literal-sort-keys export: this.asArray(dep.export, variables) }; if (dep.from) { // request import - const identifiers = [...copy.import, ...copy.declare, ...copy.provide]; + const identifiers = [...copy.import, ...copy.declare, ...copy.provide, ...copy.schema]; this.requestImport(identifiers, Util.applyConfigTransformation(dep.from, variables)); } const imports = copy.import @@ -163,6 +165,11 @@ export class TypeScriptFileUpdate { .filter(x => !this.ngMetaEdits.providers.find(p => p === x)); this.ngMetaEdits.providers.push(...providers); + const schemas = copy.schema + .map(x => ({ name: x, root: dep.root })) + .filter(x => !this.ngMetaEdits.schemas.find(s => s.name === x.name)); + this.ngMetaEdits.schemas.push(...schemas); + const exportsArr = copy.export .filter(x => !this.ngMetaEdits.exports.find(p => p === x)); this.ngMetaEdits.exports.push(...exportsArr); @@ -174,11 +181,12 @@ export class TypeScriptFileUpdate { public addStandaloneImport(dep: TemplateDependency, variables?: { [key: string]: string }) { const copy = { import: this.asArray(dep.import, variables), - provide: this.asArray(dep.provide, variables) + provide: this.asArray(dep.provide, variables), + schema: this.asArray(dep.schema, variables) }; if (dep.from) { // request import - const identifiers = [...copy.import, ...copy.provide]; + const identifiers = [...copy.import, ...copy.provide, ...copy.schema]; this.requestImport(identifiers, Util.applyConfigTransformation(dep.from, variables)); } @@ -186,6 +194,11 @@ export class TypeScriptFileUpdate { .map(x => ({ name: x, root: dep.root, standalone: true })) .filter(x => !this.ngMetaEdits.imports.find(i => i.name === x.name)); this.ngMetaEdits.imports.push(...imports); + + const schemas = copy.schema + .map(x => ({ name: x, root: dep.root, standalone: true})) + .filter(x => !this.ngMetaEdits.schemas.find(i => i.name === x.name)); + this.ngMetaEdits.schemas.push(...schemas); } /** @@ -249,6 +262,7 @@ export class TypeScriptFileUpdate { declarations: [], imports: [], providers: [], + schemas: [], exports: [] }; this.createdStringLiterals = []; @@ -547,23 +561,19 @@ export class TypeScriptFileUpdate { const objProperties = ts.visitNodes(obj.properties, visitor); const newProps = []; for (const prop of missingProperties) { - let arrayExpr; - switch (prop) { - case "imports": - const importDeps = this.ngMetaEdits.imports; - arrayExpr = ts.factory.createArrayLiteralExpression( - importDeps.map(x => TsUtils.createIdentifier(x.name, x.root ? "forRoot" : "")) - ); - break; - case "declarations": - case "providers": - case "exports": - arrayExpr = ts.factory.createArrayLiteralExpression( - this.ngMetaEdits[prop].map(x => ts.factory.createIdentifier(x)) - ); - break; + if (this.ngMetaEdits[prop].length) { + const expr = ts.factory.createArrayLiteralExpression( + this.ngMetaEdits[prop].map(x => { + if (typeof x === "string") { + return TsUtils.createIdentifier(x); + } + if (typeof x === "object" && "name" in x) { + return TsUtils.createIdentifier(x.name, x.root ? "forRoot" : "") + } + }) + ); + newProps.push(ts.factory.createPropertyAssignment(prop, expr)); } - newProps.push(ts.factory.createPropertyAssignment(prop, arrayExpr)); } return ts.factory.updateObjectLiteralExpression(obj, [ @@ -585,6 +595,11 @@ export class TypeScriptFileUpdate { .filter(x => alreadyImported.indexOf(x.name) === -1) .map(x => TsUtils.createIdentifier(x.name, x.root ? "forRoot" : "")); break; + case "schemas": + identifiers = this.ngMetaEdits.schemas + .filter(x => alreadyImported.indexOf(x.name) === -1) + .map(x => TsUtils.createIdentifier(x.name)); + break; case "declarations": case "providers": case "exports": @@ -618,19 +633,22 @@ export class TypeScriptFileUpdate { protected componentMetaTransformer: ts.TransformerFactory = (context: ts.TransformationContext) => (rootNode: T) => { const visitComponent: ts.Visitor = (node: ts.Node): ts.Node => { - let importsExpr = null; - const prop = "imports"; + const properties = Object.keys(this.ngMetaEdits); if (node.kind === ts.SyntaxKind.ObjectLiteralExpression && node.parent && node.parent.kind === ts.SyntaxKind.CallExpression) { const obj = (node as ts.ObjectLiteralExpression); const objProperties = ts.visitNodes(obj.properties, visitor); const newProps = []; - const importDeps = this.ngMetaEdits.imports; - importsExpr = ts.factory.createArrayLiteralExpression( - importDeps.map(x => TsUtils.createIdentifier(x.name)) - ); - newProps.push(ts.factory.createPropertyAssignment(prop, importsExpr)); + const missingProperties = properties.filter(x => !obj.properties.find(o => o.name.getText() === x)); + for (const prop of missingProperties) { + if (this.ngMetaEdits[prop].length) { + const expr = ts.factory.createArrayLiteralExpression( + this.ngMetaEdits[prop].map(x => TsUtils.createIdentifier(x.name)) + ); + newProps.push(ts.factory.createPropertyAssignment(prop, expr)); + } + } return context.factory.updateObjectLiteralExpression(obj, [ ...objProperties, ...newProps diff --git a/packages/igx-templates/package.json b/packages/igx-templates/package.json index f5f6ce028..96a5509d0 100644 --- a/packages/igx-templates/package.json +++ b/packages/igx-templates/package.json @@ -1,6 +1,6 @@ { "name": "@igniteui/angular-templates", - "version": "17.2.1323", + "version": "17.2.1324-beta.3", "description": "Templates for Ignite UI for Angular projects and components", "repository": { "type": "git", @@ -12,7 +12,7 @@ "author": "Infragistics", "license": "MIT", "dependencies": { - "@igniteui/cli-core": "~13.2.3", + "@igniteui/cli-core": "~13.2.4-beta.3", "typescript": "~5.4.3" } } diff --git a/packages/ng-schematics/package.json b/packages/ng-schematics/package.json index 93b982265..ea82c59a2 100644 --- a/packages/ng-schematics/package.json +++ b/packages/ng-schematics/package.json @@ -1,6 +1,6 @@ { "name": "@igniteui/angular-schematics", - "version": "17.2.1323", + "version": "17.2.1324-beta.3", "description": "Ignite UI for Angular Schematics for ng new and ng generate", "repository": { "type": "git", @@ -20,8 +20,8 @@ "dependencies": { "@angular-devkit/core": "~14.0.0", "@angular-devkit/schematics": "~14.0.0", - "@igniteui/angular-templates": "~17.2.1323", - "@igniteui/cli-core": "~13.2.3", + "@igniteui/angular-templates": "~17.2.1324-beta.3", + "@igniteui/cli-core": "~13.2.4-beta.3", "@schematics/angular": "~14.0.0", "rxjs": "^6.6.3" },