diff --git a/src/schematics/ng-add-ssr.ts b/src/schematics/ng-add-ssr.ts index 7f7d02471..5b9005e79 100644 --- a/src/schematics/ng-add-ssr.ts +++ b/src/schematics/ng-add-ssr.ts @@ -1,7 +1,6 @@ import { SchematicsException, Tree, SchematicContext, noop } from '@angular-devkit/schematics'; import { addDependencies, - DeployOptions, generateFirebaseRc, NgAddNormalizedOptions, overwriteIfExists, @@ -9,7 +8,6 @@ import { stringifyFormatted } from './ng-add-common'; import { FirebaseJSON, Workspace, WorkspaceProject } from './interfaces'; -import { getProject, projectTypePrompt } from './utils'; import { firebaseFunctions as firebaseFunctionsDependencies } from './versions.json'; import { dirname, join } from 'path'; import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; @@ -98,23 +96,14 @@ export function generateFirebaseJson( overwriteIfExists(tree, path, stringifyFormatted(firebaseJson)); } -export const addFirebaseFunctionsDependencies = (options: DeployOptions) => (tree: Tree, context: SchematicContext) => { - const {project} = getProject(options, tree); - projectTypePrompt(project).then(({universalProject}) => { - if (universalProject) { - (global as any).setupAsAngularUniversalApp = true; - addDependencies( - tree, - firebaseFunctionsDependencies, - context - ); - context.addTask(new NodePackageInstallTask()); - return tree; - } else { - (global as any).setupAsAngularUniversalApp = false; - return noop(); - } - }); +export const addFirebaseFunctionsDependencies = (tree: Tree, context: SchematicContext) => { + addDependencies( + tree, + firebaseFunctionsDependencies, + context + ); + context.addTask(new NodePackageInstallTask()); + return tree; }; export const setupUniversalDeployment = (config: { diff --git a/src/schematics/ng-add-static.ts b/src/schematics/ng-add-static.ts index cc341f15e..7bf4538c3 100644 --- a/src/schematics/ng-add-static.ts +++ b/src/schematics/ng-add-static.ts @@ -1,6 +1,7 @@ import { SchematicsException, Tree, SchematicContext } from '@angular-devkit/schematics'; import { addDependencies, + DeployOptions, generateFirebaseRc, NgAddNormalizedOptions, overwriteIfExists, @@ -10,7 +11,7 @@ import { import { FirebaseJSON, Workspace, WorkspaceProject } from './interfaces'; import { default as defaultDependencies } from './versions.json'; -import { NodePackageInstallTask } from '@angular-devkit/schematics/tasks'; +import { NodePackageInstallTask, RunSchematicTask } from '@angular-devkit/schematics/tasks'; function emptyFirebaseJson() { return { @@ -73,13 +74,15 @@ export function generateFirebaseJson( overwriteIfExists(tree, path, stringifyFormatted(firebaseJson)); } -export const addFirebaseHostingDependencies = () => async (tree: Tree, context: SchematicContext) => { +export const addFirebaseHostingDependencies = (options: DeployOptions) => (tree: Tree, context: SchematicContext) => { addDependencies( tree, defaultDependencies, context ); - context.addTask(new NodePackageInstallTask()); + context.addTask(new RunSchematicTask('ng-add-setup-project', options), [ + context.addTask(new NodePackageInstallTask()) + ]); return tree; }; diff --git a/src/schematics/ng-add.jasmine.ts b/src/schematics/ng-add.jasmine.ts index 0f6c66b4b..eca2b6814 100644 --- a/src/schematics/ng-add.jasmine.ts +++ b/src/schematics/ng-add.jasmine.ts @@ -370,7 +370,7 @@ describe('ng-add', () => { it('generates new files if starting from scratch', async () => { const result = await setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }); expect(result.read('firebase.json').toString()).toEqual(initialFirebaseJson); @@ -381,7 +381,7 @@ describe('ng-add', () => { it('uses default project', async () => { const result = await setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: undefined }); expect(result.read('firebase.json').toString()).toEqual(overwriteFirebaseJson); @@ -392,12 +392,12 @@ describe('ng-add', () => { it('overrides existing files', async () => { const tempTree = await setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, project: PROJECT_NAME + universalProject: false, project: PROJECT_NAME }); const result = await setupProject(tempTree, { firebaseProject: OTHER_FIREBASE_PROJECT_NAME, project: OTHER_PROJECT_NAME, - isUniversalProject: false + universalProject: false }); expect(result.read('firebase.json').toString()).toEqual(projectFirebaseJson); expect(result.read('.firebaserc').toString()).toEqual(projectFirebaserc); @@ -414,7 +414,7 @@ describe('ng-add', () => { expect(() => setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: undefined }) ).toThrowError( @@ -426,7 +426,7 @@ describe('ng-add', () => { expect(() => setupProject(Tree.empty(), { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }) ).toThrowError(/Could not find angular.json/); @@ -438,7 +438,7 @@ describe('ng-add', () => { expect(() => setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }) ).toThrowError(/Could not parse angular.json/); @@ -450,7 +450,7 @@ describe('ng-add', () => { expect(() => setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }) ).toThrowError(/The specified Angular project is not defined in this workspace/); @@ -467,7 +467,7 @@ describe('ng-add', () => { expect(() => setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }) ).toThrowError(/Deploy requires an Angular project type of "application" in angular.json/); @@ -484,7 +484,7 @@ describe('ng-add', () => { expect(() => setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }) ).toThrowError(/Cannot read the output path/); @@ -496,14 +496,14 @@ describe('ng-add', () => { tree.create('angular.json', JSON.stringify(generateAngularJson())); const tempTree = await setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }); expect(() => setupProject(tempTree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }) ).toThrowError(/already exists in firebase.json/); @@ -516,7 +516,7 @@ describe('ng-add', () => { expect(() => setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }) ).toThrowError(/firebase.json: Unexpected token/); @@ -529,7 +529,7 @@ describe('ng-add', () => { expect(() => setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }) ).toThrowError(/.firebaserc: Unexpected token/); @@ -542,14 +542,14 @@ describe('ng-add', () => { tree.create('angular.json', JSON.stringify(generateAngularJson())); const tempTree = await setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }); expect(() => setupProject(tempTree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: OTHER_PROJECT_NAME }) ).toThrowError(/ already defined in .firebaserc/); @@ -561,14 +561,14 @@ describe('ng-add', () => { const tempTree = await setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: PROJECT_NAME }); expect(() => setupProject(tempTree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: false, + universalProject: false, project: OTHER_PROJECT_NAME }) ).toThrowError(/ already defined in .firebaserc/); @@ -581,7 +581,7 @@ describe('ng-add', () => { expect(() => setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: true, + universalProject: true, project: PROJECT_NAME })).toThrowError(/\(architect.server.options.outputPath\) of the Angular project "pie-ka-chu" in angular.json/); }); @@ -592,7 +592,7 @@ describe('ng-add', () => { const result = await setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: true, + universalProject: true, project: PROJECT_NAME }); @@ -606,7 +606,7 @@ describe('ng-add', () => { const result = await setupProject(tree, { firebaseProject: FIREBASE_PROJECT, - isUniversalProject: true, + universalProject: true, project: PROJECT_NAME }); diff --git a/src/schematics/ng-add.ts b/src/schematics/ng-add.ts index ee152e4e1..53cf9c0d1 100644 --- a/src/schematics/ng-add.ts +++ b/src/schematics/ng-add.ts @@ -1,11 +1,11 @@ -import { chain, Tree } from '@angular-devkit/schematics'; -import { listProjects, projectPrompt, getWorkspace, getProject } from './utils'; +import { SchematicContext, Tree } from '@angular-devkit/schematics'; +import { listProjects, projectPrompt, getWorkspace, getProject, projectTypePrompt } from './utils'; import { DeployOptions, NgAddNormalizedOptions } from './ng-add-common'; import { addFirebaseFunctionsDependencies, setupUniversalDeployment } from './ng-add-ssr'; import { addFirebaseHostingDependencies, setupStaticDeployment } from './ng-add-static'; export const setupProject = - (host: Tree, options: DeployOptions & { firebaseProject: string, isUniversalProject: boolean }) => { + (host: Tree, options: DeployOptions & { firebaseProject: string, universalProject: boolean }) => { const { path: workspacePath, workspace } = getWorkspace(host); const {project, projectName} = getProject(options, host); @@ -15,7 +15,7 @@ export const setupProject = firebaseProject: options.firebaseProject }; - if (options.isUniversalProject) { + if (options.universalProject) { return setupUniversalDeployment({ workspace, workspacePath, @@ -36,15 +36,13 @@ export const setupProject = export const ngAddSetupProject = ( options: DeployOptions -) => async (host: Tree) => { +) => async (host: Tree, context: SchematicContext) => { const projects = await listProjects(); const { firebaseProject } = await projectPrompt(projects); - const isUniversalProject = (global as any).setupAsAngularUniversalApp; - return setupProject(host, {...options, firebaseProject, isUniversalProject }); + const { project } = getProject(options, host); + const { universalProject } = await projectTypePrompt(project); + if (universalProject) { host = addFirebaseFunctionsDependencies(host, context); } + return setupProject(host, {...options, firebaseProject, universalProject }); }; -export const ngAdd = (options: DeployOptions) => chain([ - addFirebaseHostingDependencies(), - addFirebaseFunctionsDependencies(options), - ngAddSetupProject(options), -]); +export const ngAdd = addFirebaseHostingDependencies;