@angular-devkit/core
Version:
Angular DevKit - Core Utility Library
93 lines (92 loc) • 3.14 kB
JavaScript
"use strict";
/**
* @license
* Copyright Google LLC 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.dev/license
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.SyncDelegateHost = exports.SynchronousDelegateExpectedException = void 0;
const exception_1 = require("../../exception");
class SynchronousDelegateExpectedException extends exception_1.BaseException {
constructor() {
super(`Expected a synchronous delegate but got an asynchronous one.`);
}
}
exports.SynchronousDelegateExpectedException = SynchronousDelegateExpectedException;
/**
* Implement a synchronous-only host interface (remove the Observable parts).
*/
class SyncDelegateHost {
_delegate;
constructor(_delegate) {
this._delegate = _delegate;
if (!_delegate.capabilities.synchronous) {
throw new SynchronousDelegateExpectedException();
}
}
_doSyncCall(observable) {
let completed = false;
let result = undefined;
let errorResult = undefined;
// Perf note: this is not using an observer object to avoid a performance penalty in RxJS.
// See https://github.com/ReactiveX/rxjs/pull/5646 for details.
observable.subscribe((x) => (result = x), (err) => (errorResult = err), () => (completed = true));
if (errorResult !== undefined) {
throw errorResult;
}
if (!completed) {
throw new SynchronousDelegateExpectedException();
}
// The non-null operation is to work around `void` type. We don't allow to return undefined
// but ResultT could be void, which is undefined in JavaScript, so this doesn't change the
// behaviour.
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
return result;
}
get capabilities() {
return this._delegate.capabilities;
}
get delegate() {
return this._delegate;
}
write(path, content) {
return this._doSyncCall(this._delegate.write(path, content));
}
read(path) {
return this._doSyncCall(this._delegate.read(path));
}
delete(path) {
return this._doSyncCall(this._delegate.delete(path));
}
rename(from, to) {
return this._doSyncCall(this._delegate.rename(from, to));
}
list(path) {
return this._doSyncCall(this._delegate.list(path));
}
exists(path) {
return this._doSyncCall(this._delegate.exists(path));
}
isDirectory(path) {
return this._doSyncCall(this._delegate.isDirectory(path));
}
isFile(path) {
return this._doSyncCall(this._delegate.isFile(path));
}
// Some hosts may not support stat.
stat(path) {
const result = this._delegate.stat(path);
if (result) {
return this._doSyncCall(result);
}
else {
return null;
}
}
watch(path, options) {
return this._delegate.watch(path, options);
}
}
exports.SyncDelegateHost = SyncDelegateHost;