UNPKG

ngx-scrolltop

Version:

Lightweight, Material Design inspired button for scroll-to-top of the page. No dependencies. Pure Angular!

127 lines (113 loc) 3.81 kB
/** * @license * Copyright Google Inc. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ import { JsonAstObject, JsonParseMode, parseJsonAst } from '@angular-devkit/core'; import { SchematicsException, Tree } from '@angular-devkit/schematics'; import { appendPropertyInAstObject, findPropertyInAstObject, insertPropertyInAstObjectInOrder, removePropertyInAstObject, } from './json-utils'; const pkgJsonPath = '/package.json'; export enum NodeDependencyType { Default = 'dependencies', Dev = 'devDependencies', Peer = 'peerDependencies', Optional = 'optionalDependencies', } export interface NodeDependency { type: NodeDependencyType; name: string; version: string; overwrite?: boolean; } export function addPackageJsonDependency(tree: Tree, dependency: NodeDependency): void { const packageJsonAst = _readPackageJson(tree); const depsNode = findPropertyInAstObject(packageJsonAst, dependency.type); const recorder = tree.beginUpdate(pkgJsonPath); if (!depsNode) { // Haven't found the dependencies key, add it to the root of the package.json. appendPropertyInAstObject(recorder, packageJsonAst, dependency.type, { [dependency.name]: dependency.version, }, 2); } else if (depsNode.kind === 'object') { // check if package already added const depNode = findPropertyInAstObject(depsNode, dependency.name); if (!depNode) { // Package not found, add it. insertPropertyInAstObjectInOrder( recorder, depsNode, dependency.name, dependency.version, 4, ); } else if (dependency.overwrite) { // Package found, update version if overwrite. const { end, start } = depNode; recorder.remove(start.offset, end.offset - start.offset); recorder.insertRight(start.offset, JSON.stringify(dependency.version)); } } tree.commitUpdate(recorder); } export function removePackageJsonDependency(tree: Tree, name: string): void { const packageJson = _readPackageJson(tree); const recorder = tree.beginUpdate(pkgJsonPath); [ NodeDependencyType.Default, NodeDependencyType.Dev, NodeDependencyType.Optional, NodeDependencyType.Peer, ].forEach(depType => { const depsNode = findPropertyInAstObject(packageJson, depType); if (depsNode !== null && depsNode.kind === 'object') { removePropertyInAstObject(recorder, depsNode, name); } }); tree.commitUpdate(recorder); } export function getPackageJsonDependency(tree: Tree, name: string): NodeDependency | null { const packageJson = _readPackageJson(tree); let dep: NodeDependency | null = null; [ NodeDependencyType.Default, NodeDependencyType.Dev, NodeDependencyType.Optional, NodeDependencyType.Peer, ].forEach(depType => { if (dep !== null) { return; } const depsNode = findPropertyInAstObject(packageJson, depType); if (depsNode !== null && depsNode.kind === 'object') { const depNode = findPropertyInAstObject(depsNode, name); if (depNode !== null && depNode.kind === 'string') { const version = depNode.value; dep = { type: depType, name: name, version: version, }; } } }); return dep; } function _readPackageJson(tree: Tree): JsonAstObject { const buffer = tree.read(pkgJsonPath); if (buffer === null) { throw new SchematicsException('Could not read package.json.'); } const content = buffer.toString(); const packageJson = parseJsonAst(content, JsonParseMode.Strict); if (packageJson.kind != 'object') { throw new SchematicsException('Invalid package.json. Was expecting an object'); } return packageJson; }