- Vue 3 + TypeScript + Element Plus 前端界面 - Pinia 状态管理 - Vue Router 4 路由管理 - Axios HTTP 客户端 - MSW (Mock Service Worker) 开发环境模拟 - 账户管理界面 (列表、详情、三科目余额展示) - 交易管理界面 (列表、详情) - 对账管理界面 (三账校验) - 完善的 API 客户端封装 - Docker 容器化配置 - Nginx 配置用于生产环境
218 lines
6.0 KiB
JavaScript
218 lines
6.0 KiB
JavaScript
import {
|
|
__privateAdd,
|
|
__privateGet
|
|
} from "./chunk-Z5TSB3T6.mjs";
|
|
|
|
// src/glossary.ts
|
|
var IS_PATCHED_MODULE = Symbol("isPatchedModule");
|
|
|
|
// src/RequestController.ts
|
|
import { DeferredPromise } from "@open-draft/deferred-promise";
|
|
import { invariant } from "outvariant";
|
|
|
|
// src/InterceptorError.ts
|
|
var InterceptorError = class extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = "InterceptorError";
|
|
Object.setPrototypeOf(this, InterceptorError.prototype);
|
|
}
|
|
};
|
|
|
|
// src/RequestController.ts
|
|
var _handled, handled_get;
|
|
var _RequestController = class {
|
|
constructor(request, source) {
|
|
this.request = request;
|
|
this.source = source;
|
|
__privateAdd(this, _handled);
|
|
this.readyState = _RequestController.PENDING;
|
|
this.handled = new DeferredPromise();
|
|
}
|
|
/**
|
|
* Perform this request as-is.
|
|
*/
|
|
async passthrough() {
|
|
invariant.as(
|
|
InterceptorError,
|
|
this.readyState === _RequestController.PENDING,
|
|
'Failed to passthrough the "%s %s" request: the request has already been handled',
|
|
this.request.method,
|
|
this.request.url
|
|
);
|
|
this.readyState = _RequestController.PASSTHROUGH;
|
|
await this.source.passthrough();
|
|
__privateGet(this, _handled, handled_get).resolve();
|
|
}
|
|
/**
|
|
* Respond to this request with the given `Response` instance.
|
|
*
|
|
* @example
|
|
* controller.respondWith(new Response())
|
|
* controller.respondWith(Response.json({ id }))
|
|
* controller.respondWith(Response.error())
|
|
*/
|
|
respondWith(response) {
|
|
invariant.as(
|
|
InterceptorError,
|
|
this.readyState === _RequestController.PENDING,
|
|
'Failed to respond to the "%s %s" request with "%d %s": the request has already been handled (%d)',
|
|
this.request.method,
|
|
this.request.url,
|
|
response.status,
|
|
response.statusText || "OK",
|
|
this.readyState
|
|
);
|
|
this.readyState = _RequestController.RESPONSE;
|
|
__privateGet(this, _handled, handled_get).resolve();
|
|
this.source.respondWith(response);
|
|
}
|
|
/**
|
|
* Error this request with the given reason.
|
|
*
|
|
* @example
|
|
* controller.errorWith()
|
|
* controller.errorWith(new Error('Oops!'))
|
|
* controller.errorWith({ message: 'Oops!'})
|
|
*/
|
|
errorWith(reason) {
|
|
invariant.as(
|
|
InterceptorError,
|
|
this.readyState === _RequestController.PENDING,
|
|
'Failed to error the "%s %s" request with "%s": the request has already been handled (%d)',
|
|
this.request.method,
|
|
this.request.url,
|
|
reason == null ? void 0 : reason.toString(),
|
|
this.readyState
|
|
);
|
|
this.readyState = _RequestController.ERROR;
|
|
this.source.errorWith(reason);
|
|
__privateGet(this, _handled, handled_get).resolve();
|
|
}
|
|
};
|
|
var RequestController = _RequestController;
|
|
_handled = new WeakSet();
|
|
handled_get = function() {
|
|
return this.handled;
|
|
};
|
|
RequestController.PENDING = 0;
|
|
RequestController.PASSTHROUGH = 1;
|
|
RequestController.RESPONSE = 2;
|
|
RequestController.ERROR = 3;
|
|
|
|
// src/utils/canParseUrl.ts
|
|
function canParseUrl(url) {
|
|
try {
|
|
new URL(url);
|
|
return true;
|
|
} catch (_error) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
// src/utils/getValueBySymbol.ts
|
|
function getValueBySymbol(symbolName, source) {
|
|
const ownSymbols = Object.getOwnPropertySymbols(source);
|
|
const symbol = ownSymbols.find((symbol2) => {
|
|
return symbol2.description === symbolName;
|
|
});
|
|
if (symbol) {
|
|
return Reflect.get(source, symbol);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// src/utils/fetchUtils.ts
|
|
var _FetchResponse = class extends Response {
|
|
static isConfigurableStatusCode(status) {
|
|
return status >= 200 && status <= 599;
|
|
}
|
|
static isRedirectResponse(status) {
|
|
return _FetchResponse.STATUS_CODES_WITH_REDIRECT.includes(status);
|
|
}
|
|
/**
|
|
* Returns a boolean indicating whether the given response status
|
|
* code represents a response that can have a body.
|
|
*/
|
|
static isResponseWithBody(status) {
|
|
return !_FetchResponse.STATUS_CODES_WITHOUT_BODY.includes(status);
|
|
}
|
|
static setUrl(url, response) {
|
|
if (!url || url === "about:" || !canParseUrl(url)) {
|
|
return;
|
|
}
|
|
const state = getValueBySymbol("state", response);
|
|
if (state) {
|
|
state.urlList.push(new URL(url));
|
|
} else {
|
|
Object.defineProperty(response, "url", {
|
|
value: url,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: false
|
|
});
|
|
}
|
|
}
|
|
/**
|
|
* Parses the given raw HTTP headers into a Fetch API `Headers` instance.
|
|
*/
|
|
static parseRawHeaders(rawHeaders) {
|
|
const headers = new Headers();
|
|
for (let line = 0; line < rawHeaders.length; line += 2) {
|
|
headers.append(rawHeaders[line], rawHeaders[line + 1]);
|
|
}
|
|
return headers;
|
|
}
|
|
constructor(body, init = {}) {
|
|
var _a;
|
|
const status = (_a = init.status) != null ? _a : 200;
|
|
const safeStatus = _FetchResponse.isConfigurableStatusCode(status) ? status : 200;
|
|
const finalBody = _FetchResponse.isResponseWithBody(status) ? body : null;
|
|
super(finalBody, {
|
|
status: safeStatus,
|
|
statusText: init.statusText,
|
|
headers: init.headers
|
|
});
|
|
if (status !== safeStatus) {
|
|
const state = getValueBySymbol("state", this);
|
|
if (state) {
|
|
state.status = status;
|
|
} else {
|
|
Object.defineProperty(this, "status", {
|
|
value: status,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: false
|
|
});
|
|
}
|
|
}
|
|
_FetchResponse.setUrl(init.url, this);
|
|
}
|
|
};
|
|
var FetchResponse = _FetchResponse;
|
|
/**
|
|
* Response status codes for responses that cannot have body.
|
|
* @see https://fetch.spec.whatwg.org/#statuses
|
|
*/
|
|
FetchResponse.STATUS_CODES_WITHOUT_BODY = [101, 103, 204, 205, 304];
|
|
FetchResponse.STATUS_CODES_WITH_REDIRECT = [301, 302, 303, 307, 308];
|
|
|
|
// src/getRawRequest.ts
|
|
var kRawRequest = Symbol("kRawRequest");
|
|
function getRawRequest(request) {
|
|
return Reflect.get(request, kRawRequest);
|
|
}
|
|
function setRawRequest(request, rawRequest) {
|
|
Reflect.set(request, kRawRequest, rawRequest);
|
|
}
|
|
|
|
export {
|
|
IS_PATCHED_MODULE,
|
|
InterceptorError,
|
|
RequestController,
|
|
canParseUrl,
|
|
FetchResponse,
|
|
getRawRequest,
|
|
setRawRequest
|
|
};
|
|
//# sourceMappingURL=chunk-LIKZF2VU.mjs.map
|