[6a3a178] | 1 | "use strict";
|
---|
| 2 | /**
|
---|
| 3 | * @license
|
---|
| 4 | * Copyright Google LLC All Rights Reserved.
|
---|
| 5 | *
|
---|
| 6 | * Use of this source code is governed by an MIT-style license that can be
|
---|
| 7 | * found in the LICENSE file at https://angular.io/license
|
---|
| 8 | */
|
---|
| 9 | Object.defineProperty(exports, "__esModule", { value: true });
|
---|
| 10 | exports.ScopedTree = void 0;
|
---|
| 11 | const core_1 = require("@angular-devkit/core");
|
---|
| 12 | const delegate_1 = require("./delegate");
|
---|
| 13 | const interface_1 = require("./interface");
|
---|
| 14 | class ScopedFileEntry {
|
---|
| 15 | constructor(_base, scope) {
|
---|
| 16 | this._base = _base;
|
---|
| 17 | this.scope = scope;
|
---|
| 18 | }
|
---|
| 19 | get path() {
|
---|
| 20 | return core_1.join(core_1.NormalizedRoot, core_1.relative(this.scope, this._base.path));
|
---|
| 21 | }
|
---|
| 22 | get content() {
|
---|
| 23 | return this._base.content;
|
---|
| 24 | }
|
---|
| 25 | }
|
---|
| 26 | class ScopedDirEntry {
|
---|
| 27 | constructor(_base, scope) {
|
---|
| 28 | this._base = _base;
|
---|
| 29 | this.scope = scope;
|
---|
| 30 | }
|
---|
| 31 | get parent() {
|
---|
| 32 | if (!this._base.parent || this._base.path == this.scope) {
|
---|
| 33 | return null;
|
---|
| 34 | }
|
---|
| 35 | return new ScopedDirEntry(this._base.parent, this.scope);
|
---|
| 36 | }
|
---|
| 37 | get path() {
|
---|
| 38 | return core_1.join(core_1.NormalizedRoot, core_1.relative(this.scope, this._base.path));
|
---|
| 39 | }
|
---|
| 40 | get subdirs() {
|
---|
| 41 | return this._base.subdirs;
|
---|
| 42 | }
|
---|
| 43 | get subfiles() {
|
---|
| 44 | return this._base.subfiles;
|
---|
| 45 | }
|
---|
| 46 | dir(name) {
|
---|
| 47 | const entry = this._base.dir(name);
|
---|
| 48 | return entry && new ScopedDirEntry(entry, this.scope);
|
---|
| 49 | }
|
---|
| 50 | file(name) {
|
---|
| 51 | const entry = this._base.file(name);
|
---|
| 52 | return entry && new ScopedFileEntry(entry, this.scope);
|
---|
| 53 | }
|
---|
| 54 | visit(visitor) {
|
---|
| 55 | return this._base.visit((path, entry) => {
|
---|
| 56 | visitor(core_1.join(core_1.NormalizedRoot, core_1.relative(this.scope, path)), entry && new ScopedFileEntry(entry, this.scope));
|
---|
| 57 | });
|
---|
| 58 | }
|
---|
| 59 | }
|
---|
| 60 | class ScopedTree {
|
---|
| 61 | constructor(_base, scope) {
|
---|
| 62 | this._base = _base;
|
---|
| 63 | const normalizedScope = core_1.normalize('/' + scope);
|
---|
| 64 | this._root = new ScopedDirEntry(this._base.getDir(normalizedScope), normalizedScope);
|
---|
| 65 | }
|
---|
| 66 | get root() {
|
---|
| 67 | return this._root;
|
---|
| 68 | }
|
---|
| 69 | branch() {
|
---|
| 70 | return new ScopedTree(this._base.branch(), this._root.scope);
|
---|
| 71 | }
|
---|
| 72 | merge(other, strategy) {
|
---|
| 73 | // eslint-disable-next-line @typescript-eslint/no-this-alias
|
---|
| 74 | const self = this;
|
---|
| 75 | const delegate = new (class extends delegate_1.DelegateTree {
|
---|
| 76 | get actions() {
|
---|
| 77 | return other.actions.map((action) => self._fullPathAction(action));
|
---|
| 78 | }
|
---|
| 79 | })(other);
|
---|
| 80 | this._base.merge(delegate, strategy);
|
---|
| 81 | }
|
---|
| 82 | // Readonly.
|
---|
| 83 | read(path) {
|
---|
| 84 | return this._base.read(this._fullPath(path));
|
---|
| 85 | }
|
---|
| 86 | exists(path) {
|
---|
| 87 | return this._base.exists(this._fullPath(path));
|
---|
| 88 | }
|
---|
| 89 | get(path) {
|
---|
| 90 | const entry = this._base.get(this._fullPath(path));
|
---|
| 91 | return entry && new ScopedFileEntry(entry, this._root.scope);
|
---|
| 92 | }
|
---|
| 93 | getDir(path) {
|
---|
| 94 | const entry = this._base.getDir(this._fullPath(path));
|
---|
| 95 | return entry && new ScopedDirEntry(entry, this._root.scope);
|
---|
| 96 | }
|
---|
| 97 | visit(visitor) {
|
---|
| 98 | return this._root.visit(visitor);
|
---|
| 99 | }
|
---|
| 100 | // Change content of host files.
|
---|
| 101 | overwrite(path, content) {
|
---|
| 102 | return this._base.overwrite(this._fullPath(path), content);
|
---|
| 103 | }
|
---|
| 104 | beginUpdate(path) {
|
---|
| 105 | return this._base.beginUpdate(this._fullPath(path));
|
---|
| 106 | }
|
---|
| 107 | commitUpdate(record) {
|
---|
| 108 | return this._base.commitUpdate(record);
|
---|
| 109 | }
|
---|
| 110 | // Structural methods.
|
---|
| 111 | create(path, content) {
|
---|
| 112 | return this._base.create(this._fullPath(path), content);
|
---|
| 113 | }
|
---|
| 114 | delete(path) {
|
---|
| 115 | return this._base.delete(this._fullPath(path));
|
---|
| 116 | }
|
---|
| 117 | rename(from, to) {
|
---|
| 118 | return this._base.rename(this._fullPath(from), this._fullPath(to));
|
---|
| 119 | }
|
---|
| 120 | apply(action, strategy) {
|
---|
| 121 | return this._base.apply(this._fullPathAction(action), strategy);
|
---|
| 122 | }
|
---|
| 123 | get actions() {
|
---|
| 124 | const scopedActions = [];
|
---|
| 125 | for (const action of this._base.actions) {
|
---|
| 126 | if (!action.path.startsWith(this._root.scope + '/')) {
|
---|
| 127 | continue;
|
---|
| 128 | }
|
---|
| 129 | if (action.kind !== 'r') {
|
---|
| 130 | scopedActions.push({
|
---|
| 131 | ...action,
|
---|
| 132 | path: core_1.join(core_1.NormalizedRoot, core_1.relative(this._root.scope, action.path)),
|
---|
| 133 | });
|
---|
| 134 | }
|
---|
| 135 | else if (action.to.startsWith(this._root.scope + '/')) {
|
---|
| 136 | scopedActions.push({
|
---|
| 137 | ...action,
|
---|
| 138 | path: core_1.join(core_1.NormalizedRoot, core_1.relative(this._root.scope, action.path)),
|
---|
| 139 | to: core_1.join(core_1.NormalizedRoot, core_1.relative(this._root.scope, action.to)),
|
---|
| 140 | });
|
---|
| 141 | }
|
---|
| 142 | }
|
---|
| 143 | return scopedActions;
|
---|
| 144 | }
|
---|
| 145 | [interface_1.TreeSymbol]() {
|
---|
| 146 | return this;
|
---|
| 147 | }
|
---|
| 148 | _fullPath(path) {
|
---|
| 149 | return core_1.join(this._root.scope, core_1.normalize('/' + path));
|
---|
| 150 | }
|
---|
| 151 | _fullPathAction(action) {
|
---|
| 152 | let fullPathAction;
|
---|
| 153 | if (action.kind === 'r') {
|
---|
| 154 | fullPathAction = {
|
---|
| 155 | ...action,
|
---|
| 156 | path: this._fullPath(action.path),
|
---|
| 157 | to: this._fullPath(action.to),
|
---|
| 158 | };
|
---|
| 159 | }
|
---|
| 160 | else {
|
---|
| 161 | fullPathAction = {
|
---|
| 162 | ...action,
|
---|
| 163 | path: this._fullPath(action.path),
|
---|
| 164 | };
|
---|
| 165 | }
|
---|
| 166 | return fullPathAction;
|
---|
| 167 | }
|
---|
| 168 | }
|
---|
| 169 | exports.ScopedTree = ScopedTree;
|
---|