function createFile(remoteFiles: Tree, { path, file }: { path: string, file: FileEntry }) { if (!file) { console.log(`missing: ${path}`) } remoteFiles.create(path, file.content); }
export function hasNgModuleImport(tree: Tree, modulePath: string, className: string): boolean { const moduleFileContent = tree.read(modulePath); if (!moduleFileContent) { throw new SchematicsException(`Could not read Angular module file: ${modulePath}`); } const parsedFile = ts.createSourceFile(modulePath, moduleFileContent.toString(), ts.ScriptTarget.Latest, true); const ngModuleMetadata = findNgModuleMetadata(parsedFile); if (!ngModuleMetadata) { throw new SchematicsException(`Could not find NgModule declaration inside: "${modulePath}"`); } for (let property of ngModuleMetadata!.properties) { if (!ts.isPropertyAssignment(property) || property.name.getText() !== 'imports' || !ts.isArrayLiteralExpression(property.initializer)) { continue; } if (property.initializer.elements.some(element => element.getText() === className)) { return true; } } return false; }
export function createAppModuleWithEffects( tree: Tree, path: string, effects?: string ): Tree { tree.create( path || '/src/app/app.module.ts', ` import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { EffectsModule } from '@ngrx/effects'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, ${effects} ], providers: [], bootstrap: [AppComponent] }) export class AppModule { } ` ); return tree; }
export function createReducers(tree: Tree, path?: string) { tree.create( path || '/src/app/reducers/index.ts', ` import { ActionReducer, ActionReducerMap, createFeatureSelector, createSelector, MetaReducer } from '@ngrx/store'; import { environment } from '../../environments/environment'; export interface State { } export const reducers: ActionReducerMap<State> = { }; export const metaReducers: MetaReducer<State>[] = !environment.production ? [] : []; ` ); return tree; }
it('works', () => { const runner = new SchematicTestRunner('schematics', collectionPath); const tree = runner.runSchematic('my-full-schematic', { name: 'str' }, Tree.empty()); // Listing files expect(tree.files.sort()).toEqual(['/allo', '/hola', '/test1', '/test2']); });
return new Observable<Tree>(obs => { const input = new Readable({ encoding: 'utf8', read(): void { this.push(buffer); this.push(null); }, }); const chunks: Array<Buffer> = []; const output = new Writable({ write(chunk: string | Buffer, encoding: string, callback: Function): void { chunks.push(typeof chunk === 'string' ? Buffer.from(chunk, encoding) : chunk); callback(); }, final(callback: (error?: Error) => void): void { const full = Buffer.concat(chunks); host.overwrite(path, full.toString()); callback(); obs.next(host); obs.complete(); }, }); input.pipe(rewriter).pipe(output); });
it('should import the state path if provided', () => { const options = { ...defaultOptions, state: 'reducers' }; appTree.create('/src/app/reducers', ''); const tree = schematicRunner.runSchematic('container', options, appTree); const content = getFileContent(tree, '/src/app/foo/foo.component.ts'); expect(content).toMatch(/import \* as fromStore from '..\/reducers';/); });
it('should not overwrite existing custom theme files', () => { appTree.create('/projects/material/custom-theme.scss', 'custom-theme'); const tree = runner.runSchematic('ng-add-setup-project', {theme: 'custom'}, appTree); expect(tree.readContent('/projects/material/custom-theme.scss')).toBe('custom-theme', 'Expected the old custom theme content to be unchanged.'); });
return (tree: Tree, _context: SchematicContext) => { const localFiles = url("./files")(_context) as Tree; const updateFiles = getUpdateFiles(localFiles); const createFiles = getCreateFiles(localFiles); if (updateFiles.length > 0) { updateFiles.forEach(f => updateFile(tree, f)); } if (createFiles.length > 0) { createFiles.forEach(f => createFile(tree, f)); } const config = tree.read(".angular-cli.json"); if (config) { const asJson = JSON.parse(config.toString()); asJson.apps[0].assets.push("config.json"); tree.overwrite(".angular-cli.json", JSON.stringify(asJson, null, 2)); } // angular 6 const configA6 = tree.read("angular.json"); if (configA6) { const asJson = JSON.parse(configA6.toString()); Object.entries(asJson.projects).forEach(([,value] : any) => { const options = value.architect && value.architect.build && value.architect.build.options; const assets = options && options.assets; if (assets) { assets.push("src/config.json"); } const styles = options && options.styles; if (styles) { styles.push("src/theme.css"); } }); tree.overwrite("angular.json", JSON.stringify(asJson, null, 2)); } return tree; };
export function addPackageToPackageJson(host: Tree, type: string, pkg: string, version: string) { if (host.exists('package.json')) { const sourceText = host.read('package.json')!.toString('utf-8'); const json = JSON.parse(sourceText); if (!json[type]) { json[type] = {}; } if (!json[type][pkg]) { json[type][pkg] = version; } host.overwrite('package.json', JSON.stringify(json, null, 2)); } return host; }