diff --git a/packages/cli/lib/PromptSession.ts b/packages/cli/lib/PromptSession.ts index 90d270ca2..840015f56 100644 --- a/packages/cli/lib/PromptSession.ts +++ b/packages/cli/lib/PromptSession.ts @@ -1,4 +1,7 @@ -import { BasePromptSession, GoogleAnalytics, ProjectConfig, ProjectLibrary, PromptTaskContext, Task, Util, PackageManager } from "@igniteui/cli-core"; +import { + BasePromptSession, GoogleAnalytics, PackageManager, ProjectConfig, + ProjectLibrary, PromptTaskContext, Task, Util +} from "@igniteui/cli-core"; import * as inquirer from "inquirer"; import * as path from "path"; import { default as add } from "./commands/add"; diff --git a/packages/cli/lib/commands/add.ts b/packages/cli/lib/commands/add.ts index 90c4c17fe..3e70500f6 100644 --- a/packages/cli/lib/commands/add.ts +++ b/packages/cli/lib/commands/add.ts @@ -1,4 +1,7 @@ -import { AddTemplateArgs, GoogleAnalytics, ProjectConfig, ProjectLibrary, Template, Util, PackageManager } from "@igniteui/cli-core"; +import { + AddTemplateArgs, GoogleAnalytics, PackageManager, + ProjectConfig, ProjectLibrary, Template, Util +} from "@igniteui/cli-core"; import { TemplateManager } from "../TemplateManager"; import { PromptSession } from "./../PromptSession"; @@ -40,7 +43,7 @@ command = { } }, check: argv => { - if ((!argv.name && argv.template) || (argv.name && !argv.template)) { + if ((!argv.name && argv.template) || (argv.name && !argv.template)) { return false; } return true; @@ -55,7 +58,7 @@ command = { Util.error("Add command is supported only on existing project created with igniteui-cli", "red"); return; } - const config = ProjectConfig.getConfig(); + const config = ProjectConfig.getConfig(); if (config.project.isShowcase) { Util.error("Showcases and quickstart projects don't support the add command", "red"); return; diff --git a/packages/cli/lib/commands/build.ts b/packages/cli/lib/commands/build.ts index c8266b016..56c25f90d 100644 --- a/packages/cli/lib/commands/build.ts +++ b/packages/cli/lib/commands/build.ts @@ -1,4 +1,4 @@ -import { GoogleAnalytics, ProjectConfig, Util, PackageManager } from "@igniteui/cli-core"; +import { GoogleAnalytics, PackageManager, ProjectConfig, Util } from "@igniteui/cli-core"; import * as fs from "fs-extra"; import * as path from "path"; import { TemplateManager } from "../TemplateManager"; @@ -50,7 +50,7 @@ command = { fs.mkdirSync("./themes"); const source = path.join(config.project.igniteuiSource, "/css/themes/", config.project.theme.split(".")[0]); const destination = path.join(config.project.sourceRoot, "themes"); - fs.copySync(source, destination, {recursive: true}); + fs.copySync(source, destination, { recursive: true }); } } }; diff --git a/packages/cli/lib/commands/new.ts b/packages/cli/lib/commands/new.ts index 633547ba4..2b268c209 100644 --- a/packages/cli/lib/commands/new.ts +++ b/packages/cli/lib/commands/new.ts @@ -1,4 +1,4 @@ -import { GoogleAnalytics, ProjectConfig, ProjectLibrary, Util, PackageManager } from "@igniteui/cli-core"; +import { GoogleAnalytics, PackageManager, ProjectConfig, ProjectLibrary, Util } from "@igniteui/cli-core"; import * as path from "path"; import { TemplateManager } from "../TemplateManager"; import { PromptSession } from "./../PromptSession"; @@ -132,7 +132,7 @@ command = { const config = projTemplate.generateConfig(argv.name, theme); for (const templatePath of projTemplate.templatePaths) { await Util.processTemplates(templatePath, path.join(process.cwd(), argv.name), - config, projTemplate.delimiters, false); + config, projTemplate.delimiters, false); } Util.log(Util.greenCheck() + " Project Created"); diff --git a/packages/cli/migrations/update-5_0_0/index.ts b/packages/cli/migrations/update-5_0_0/index.ts index 8b3753c8a..a190b1b8c 100644 --- a/packages/cli/migrations/update-5_0_0/index.ts +++ b/packages/cli/migrations/update-5_0_0/index.ts @@ -23,6 +23,10 @@ export class NgTreeFileSystem implements IFileSystem { public directoryExists(dirPath: string): boolean { return this.tree.exists(dirPath); } + + public glob(dirPath: string, pattern: string): string[] { + return []; + } } export function setVirtual(tree: Tree) { diff --git a/packages/core/packages/PackageManager.ts b/packages/core/packages/PackageManager.ts index a240c901a..9dc995966 100644 --- a/packages/core/packages/PackageManager.ts +++ b/packages/core/packages/PackageManager.ts @@ -36,7 +36,9 @@ export class PackageManager { if (installNow) { const ossVersion = this.getPackageJSON().dependencies[this.ossPackage]; const version = ossVersion ? `@"${ossVersion}"` : ""; - if (this.ensureRegistryUser(config) && this.addPackage(this.fullPackage + version, verbose)) { + const errorMsg = "Something went wrong, " + + "please follow the steps in this guide: https://www.igniteui.com/help/using-ignite-ui-npm-packages"; + if (this.ensureRegistryUser(config, errorMsg) && this.addPackage(this.fullPackage + version, verbose)) { if (ossVersion) { // TODO: Check if OSS package uninstalled successfully? this.removePackage(this.ossPackage, verbose); @@ -190,7 +192,7 @@ export class PackageManager { } } - public static ensureRegistryUser(config: Config): boolean { + public static ensureRegistryUser(config: Config, message: string): boolean { const fullPackageRegistry = config.igPackageRegistry; try { // tslint:disable-next-line:object-literal-sort-keys @@ -223,8 +225,7 @@ export class PackageManager { return false; } } else { - Util.log("Something went wrong, " + - "please follow the steps in this guide: https://www.igniteui.com/help/using-ignite-ui-npm-packages", "red"); + Util.log(message, "red"); return false; } } diff --git a/packages/core/util/Update.ts b/packages/core/util/Update.ts deleted file mode 100644 index ee32556b3..000000000 --- a/packages/core/util/Update.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as path from "path"; -import { PackageManager } from "../packages/PackageManager"; -import { FS_TOKEN, IFileSystem } from "../types"; -import { App } from "./App"; -import { ProjectConfig } from "./ProjectConfig"; -import { Util } from "./Util"; - -export function updateWorkspace(): Promise { - return new Promise((res, rej) => { - const fs: IFileSystem = App.container.get(FS_TOKEN); - // tslint:disable-next-line:no-implicit-dependencies - const pkgJSON = require("package.json"); - const fileString = fs.readFile("package.json"); - if (fs.directoryExists(path.join(App.workDir, "node_modules", "@infragistics"))) { - Util.log("@infragistics module already exists. Nothing to do here."); - res(true); - } - const config = ProjectConfig.localConfig(); - if (PackageManager.ensureRegistryUser(config)) { - pkgJSON.dependencies["@infragistics/igniteui-angular"] = pkgJSON.dependencies["igniteui-angular"]; - delete pkgJSON.dependencies["igniteui-angular"]; - } - // Go through all files recursively and update import from 'igniteui-angular' to '@infragistics/igniteui-angular'; - }); -} - -function rewriteFile(fs: IFileSystem, fileLocation: string, fileContent: string) { - transformImports(fileContent); - fs.writeFile(fileLocation, fileContent); -} - -function transformImports(fileContent: string) { - fileContent = fileContent.replace(/ (from ["'])igniteui-angular(["'])/g, "$1@infragistics/igniteui-angular$2"); - fileContent = fileContent.replace(/(node_modules\/)igniteui-angular\/)/g, "$1@infragistics/igniteui-angular"); - -} diff --git a/packages/igx-templates/Update.ts b/packages/igx-templates/Update.ts new file mode 100644 index 000000000..fbad08b34 --- /dev/null +++ b/packages/igx-templates/Update.ts @@ -0,0 +1,82 @@ +import { App, FS_TOKEN, IFileSystem, PackageManager, ProjectConfig, Util } from "@igniteui/cli-core"; +import * as path from "path"; +import { FEED_PACKAGE, NPM_PACKAGE, resolvePackage } from "./package-resolve"; + +const styleExtension = ["css", "scss", "sass"]; +const styleExpression = String.raw`(node_modules\/|~)${NPM_PACKAGE}(\/)`; +const logicExpression = String.raw`(from ["'])${NPM_PACKAGE}(["'])`; + +export async function updateWorkspace(): Promise { + const fs: IFileSystem = App.container.get(FS_TOKEN); + + const fileString = fs.readFile("package.json"); + if (resolvePackage() === FEED_PACKAGE) { + return false; + } + if (fs.directoryExists(path.join(App.workDir, "node_modules", "@infragistics"))) { + Util.log("@infragistics module already exists. Nothing to do here."); + return false; + } + + // check for registry user in npm + const config = ProjectConfig.localConfig(); + if (fileString) { + const pkgJSON = JSON.parse(fileString); + const errorMsg = "Something went wrong, " + + "please follow the steps in this guide: https://www.infragistics.com/products/ignite-ui-angular/angular/components/general/ignite-ui-licensing.html"; + if (PackageManager.ensureRegistryUser(config, errorMsg)) { + pkgJSON.dependencies[FEED_PACKAGE] = pkgJSON.dependencies[NPM_PACKAGE]; + delete pkgJSON.dependencies[NPM_PACKAGE]; + fs.writeFile("package.json", JSON.stringify(pkgJSON, null, 2)); + } else { + return false; + } + } else { + Util.log("Package.json not found!"); + return false; + } + + // get all workspace roots + const workspaces = []; + let workspaceConfig = null; + if (fs.fileExists("angular.json")) { + workspaceConfig = JSON.parse(fs.readFile("angular.json")); + } else { + Util.log("No angular.json file found! Aborting."); + return false; + } + for (const entry of Object.keys(workspaceConfig.projects)) { + workspaces.push(workspaceConfig.projects[entry].sourceRoot); + } + // once all workspace are gotten, get all files for all workspaces + const logicFiles = []; + const styleFiles = []; + for (const workspace of workspaces) { + logicFiles.push(...fs.glob(workspace, "**/*.component.ts")); + for (const extension of styleExtension) { + styleFiles.push(...fs.glob(workspace, `**/*.${extension}`)); + } + } + styleFiles.push("angular.json"); + + for (const file of logicFiles) { + rewriteFile(fs, file, logicExpression); + } + for (const file of styleFiles) { + rewriteFile(fs, file, styleExpression); + } + + return true; +} + +function rewriteFile(fs: IFileSystem, fileLocation: string, regexString: string) { + let fileContent = fs.readFile(fileLocation); + if (fileContent.match(new RegExp(regexString))) { + fileContent = transformFile(fileContent, regexString); + fs.writeFile(fileLocation, fileContent); + } +} +function transformFile(fileContent: string, regexString: string) { + fileContent = fileContent.replace(new RegExp(regexString, "g"), `$1${FEED_PACKAGE}$2`); + return fileContent; +} diff --git a/packages/igx-templates/igx-ts/projects/_base/index.ts b/packages/igx-templates/igx-ts/projects/_base/index.ts index 253059ba7..5a58f9023 100644 --- a/packages/igx-templates/igx-ts/projects/_base/index.ts +++ b/packages/igx-templates/igx-ts/projects/_base/index.ts @@ -1,5 +1,6 @@ import { ControlExtraConfiguration, ProjectTemplate, Util } from "@igniteui/cli-core"; import * as path from "path"; +import { updateWorkspace } from "../../../Update"; export class BaseIgxProject implements ProjectTemplate { public id: string = "base"; @@ -47,6 +48,9 @@ $app-palette: igx-palette($primary, $secondary); public upgradeIgniteUIPackage(projectPath: string, packagePath: string): void { // noop } + public async upgradeIgniteUIPackages(projectPath: string, packagePath: string): Promise { + return updateWorkspace(); + } public getExtraConfiguration(): ControlExtraConfiguration[] { return []; } diff --git a/packages/igx-templates/index.ts b/packages/igx-templates/index.ts index ce48bd14a..489171e4e 100644 --- a/packages/igx-templates/index.ts +++ b/packages/igx-templates/index.ts @@ -2,4 +2,5 @@ import * as projLib from "./igx-ts"; export * from "./package-resolve"; export * from "./IgniteUIForAngularTemplate"; +export * from "./Update"; export default projLib; diff --git a/packages/igx-templates/package-resolve.spec.ts b/packages/igx-templates/package-resolve.spec.ts index 854e1ddb0..912e8b485 100644 --- a/packages/igx-templates/package-resolve.spec.ts +++ b/packages/igx-templates/package-resolve.spec.ts @@ -14,7 +14,9 @@ class MockFileSystem implements IFileSystem { public directoryExists(dirPath: string): boolean { throw new Error("Method not implemented."); } - + public glob(dirPath: string, pattern: string): string[] { + throw new Error("Method not implemented."); + } } describe("cli-config schematic", () => { diff --git a/packages/ng-schematics/src/update/index.ts b/packages/ng-schematics/src/update/index.ts index 8c51a05c4..f58528cf5 100644 --- a/packages/ng-schematics/src/update/index.ts +++ b/packages/ng-schematics/src/update/index.ts @@ -1,13 +1,27 @@ import { Rule, SchematicContext, Tree } from "@angular-devkit/schematics"; -import { updateWorkspace } from "@igniteui/cli-core"; +import { NodePackageInstallTask } from "@angular-devkit/schematics/tasks"; +import { App, GoogleAnalytics, ProjectConfig } from "@igniteui/cli-core"; import { defer } from "rxjs"; +import { SchematicsTemplateManager } from "../SchematicsTemplateManager"; import { setVirtual } from "../utils/NgFileSystem"; export default function update(_options: any): Rule { - return (tree: Tree, _context: SchematicContext) => { + return (tree: Tree, context: SchematicContext) => { + App.initialize("angular-cli"); + GoogleAnalytics.post({ + t: "screenview", + cd: "Update" + }); + const templateManager = new SchematicsTemplateManager(); + const config = ProjectConfig.getConfig(); + const library = templateManager.getProjectLibrary(config.project.framework, config.project.projectType); + const project = library.getProject(config.project.projectTemplate); setVirtual(tree); return defer(async () => { - await updateWorkspace(); + const success = await (project as any).upgradeIgniteUIPackages(); + if (success) { + context.addTask(new NodePackageInstallTask()); + } return tree; }); }; diff --git a/packages/ng-schematics/src/utils/NgFileSystem.ts b/packages/ng-schematics/src/utils/NgFileSystem.ts index 7321bf802..b89650328 100644 --- a/packages/ng-schematics/src/utils/NgFileSystem.ts +++ b/packages/ng-schematics/src/utils/NgFileSystem.ts @@ -30,7 +30,7 @@ export class NgTreeFileSystem implements IFileSystem { const entries: string[] = []; pattern = pattern.split("**/*").pop() || pattern; - dir.visit((fullPath, entry) => { + dir.visit((_fullPath, entry) => { if (entry?.path.endsWith(pattern)) { entries.push(entry.path); }