| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -41200,7 +41200,7 @@ module.exports = { version: packageJson.version } | |||
| 41200 | 41200 | /***/ 4012: | |
| 41201 | 41201 | /***/ ((module) => { | |
| 41202 | 41202 | ||
| 41203 | - module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"6.1.0","description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","type":"module","main":"lib/cache.js","types":"lib/cache.d.ts","exports":{".":{"types":"./lib/cache.d.ts","import":"./lib/cache.js"}},"directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc && cp src/internal/shared/package-version.cjs lib/internal/shared/"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^3.0.1","@actions/exec":"^3.0.0","@actions/glob":"^0.6.1","@actions/http-client":"^4.0.1","@actions/io":"^3.0.2","@azure/core-rest-pipeline":"^1.23.0","@azure/storage-blob":"^12.31.0","@protobuf-ts/runtime-rpc":"^2.11.1","semver":"^7.7.4"},"devDependencies":{"@protobuf-ts/plugin":"^2.11.1","@types/node":"^25.6.0","@types/semver":"^7.7.1","typescript":"^5.9.3"},"overrides":{"uri-js":"npm:uri-js-replace@^1.0.1","node-fetch":"^3.3.2"}}'); | ||
| 41203 | + module.exports = /*#__PURE__*/JSON.parse('{"name":"@actions/cache","version":"6.2.0","description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","type":"module","main":"lib/cache.js","types":"lib/cache.d.ts","exports":{".":{"types":"./lib/cache.d.ts","import":"./lib/cache.js"}},"directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc && cp src/internal/shared/package-version.cjs lib/internal/shared/"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^3.0.1","@actions/exec":"^3.0.0","@actions/glob":"^0.6.1","@actions/http-client":"^4.0.1","@actions/io":"^3.0.2","@azure/core-rest-pipeline":"^1.23.0","@azure/storage-blob":"^12.31.0","@protobuf-ts/runtime-rpc":"^2.11.1","semver":"^7.7.4"},"devDependencies":{"@protobuf-ts/plugin":"^2.11.1","@types/node":"^25.6.0","@types/semver":"^7.7.1","typescript":"^5.9.3"},"overrides":{"uri-js":"npm:uri-js-replace@^1.0.1","node-fetch":"^3.3.2"}}'); | ||
| 41204 | 41204 | ||
| 41205 | 41205 | /***/ }) | |
| 41206 | 41206 | ||
@@ -45451,6 +45451,10 @@ const SystemTarPathOnWindows = `${process.env['SYSTEMDRIVE']}\\Windows\\System32 | |||
| 45451 | 45451 | const TarFilename = 'cache.tar'; | |
| 45452 | 45452 | const ManifestFilename = 'manifest.txt'; | |
| 45453 | 45453 | const CacheFileSizeLimit = 10 * Math.pow(1024, 3); // 10GiB per repository | |
| 45454 | + // Prefix the cache backend embeds in a read-denial message (v2 twirp | ||
| 45455 | + // GetCacheEntryDownloadURL error or the GHES v1 `_apis/artifactcache` 403 body). | ||
| 45456 | + // Shared so cache.ts and cacheHttpClient.ts match the same contract value. | ||
| 45457 | + const constants_CacheReadDeniedMessagePrefix = 'cache read denied:'; | ||
| 45454 | 45458 | //# sourceMappingURL=constants.js.map | |
| 45455 | 45459 | ;// CONCATENATED MODULE: ./node_modules/@actions/cache/lib/internal/cacheUtils.js | |
| 45456 | 45460 | var cacheUtils_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) { | |
@@ -95156,6 +95160,24 @@ function config_getCacheServiceVersion() { | |||
| 95156 | 95160 | return 'v1'; | |
| 95157 | 95161 | return process.env['ACTIONS_CACHE_SERVICE_V2'] ? 'v2' : 'v1'; | |
| 95158 | 95162 | } | |
| 95163 | + // The cache-mode lattice: readable = {read, write}, writable = {write, | ||
| 95164 | + // write-only}, none = neither. | ||
| 95165 | + const KNOWN_CACHE_MODES = ['none', 'read', 'write', 'write-only']; | ||
| 95166 | + // The effective cache-mode exported by the runner, or '' when not set. | ||
| 95167 | + function config_getCacheMode() { | ||
| 95168 | + return (process.env['ACTIONS_CACHE_MODE'] || '').trim().toLowerCase(); | ||
| 95169 | + } | ||
| 95170 | + // Unset or unrecognized modes are permissive so behavior matches today. | ||
| 95171 | + function config_isCacheReadable(mode) { | ||
| 95172 | + if (!KNOWN_CACHE_MODES.includes(mode)) | ||
| 95173 | + return true; | ||
| 95174 | + return mode === 'read' || mode === 'write'; | ||
| 95175 | + } | ||
| 95176 | + function isCacheWritable(mode) { | ||
| 95177 | + if (!KNOWN_CACHE_MODES.includes(mode)) | ||
| 95178 | + return true; | ||
| 95179 | + return mode === 'write' || mode === 'write-only'; | ||
| 95180 | + } | ||
| 95159 | 95181 | function getCacheServiceURL() { | |
| 95160 | 95182 | const version = config_getCacheServiceVersion(); | |
| 95161 | 95183 | // Based on the version of the cache service, we will determine which | |
@@ -95205,6 +95227,7 @@ var cacheHttpClient_awaiter = (undefined && undefined.__awaiter) || function (th | |||
| 95205 | 95227 | ||
| 95206 | 95228 | ||
| 95207 | 95229 | ||
| 95230 | + | ||
| 95208 | 95231 | function getCacheApiUrl(resource) { | |
| 95209 | 95232 | const baseUrl = getCacheServiceURL(); | |
| 95210 | 95233 | if (!baseUrl) { | |
@@ -95232,6 +95255,7 @@ function createHttpClient() { | |||
| 95232 | 95255 | } | |
| 95233 | 95256 | function getCacheEntry(keys, paths, options) { | |
| 95234 | 95257 | return cacheHttpClient_awaiter(this, void 0, void 0, function* () { | |
| 95258 | + var _a; | ||
| 95235 | 95259 | const httpClient = createHttpClient(); | |
| 95236 | 95260 | const version = utils.getCacheVersion(paths, options === null || options === void 0 ? void 0 : options.compressionMethod, options === null || options === void 0 ? void 0 : options.enableCrossOsArchive); | |
| 95237 | 95261 | const resource = `cache?keys=${encodeURIComponent(keys.join(','))}&version=${version}`; | |
@@ -95245,6 +95269,12 @@ function getCacheEntry(keys, paths, options) { | |||
| 95245 | 95269 | return null; | |
| 95246 | 95270 | } | |
| 95247 | 95271 | if (!isSuccessStatusCode(response.statusCode)) { | |
| 95272 | + // Only surface the receiver's body for a `cache read denied:` policy denial | ||
| 95273 | + // so callers can dispatch on it; keep the generic message otherwise. | ||
| 95274 | + const errorMessage = (_a = response.error) === null || _a === void 0 ? void 0 : _a.message; | ||
| 95275 | + if (errorMessage === null || errorMessage === void 0 ? void 0 : errorMessage.includes(CacheReadDeniedMessagePrefix)) { | ||
| 95276 | + throw new Error(errorMessage); | ||
| 95277 | + } | ||
| 95248 | 95278 | throw new Error(`Cache service responded with ${response.statusCode}`); | |
| 95249 | 95279 | } | |
| 95250 | 95280 | const cacheResult = response.result; | |
@@ -96505,6 +96535,7 @@ var cache_awaiter = (undefined && undefined.__awaiter) || function (thisArg, _ar | |||
| 96505 | 96535 | ||
| 96506 | 96536 | ||
| 96507 | 96537 | ||
| 96538 | + | ||
| 96508 | 96539 | class ValidationError extends Error { | |
| 96509 | 96540 | constructor(message) { | |
| 96510 | 96541 | super(message); | |
@@ -96520,19 +96551,20 @@ class ReserveCacheError extends Error { | |||
| 96520 | 96551 | } | |
| 96521 | 96552 | } | |
| 96522 | 96553 | /** | |
| 96523 | - * Stable prefix the receiver writes into the cache reservation response when | ||
| 96524 | - * the issuer downgraded the cache token to read-only (for example, because | ||
| 96554 | + * Stable prefix the cache service writes into the cache reservation response | ||
| 96555 | + * when the issuer downgraded the cache token to read-only (for example, because | ||
| 96525 | 96556 | * the run was triggered by an untrusted event). saveCacheV1 / saveCacheV2 | |
| 96526 | - * dispatch on this prefix to re-classify the failure as a | ||
| 96527 | - * CacheWriteDeniedError so consumers (and the outer catch arm) can | ||
| 96528 | - * distinguish a policy denial from other reservation failures. | ||
| 96557 | + * dispatch on this prefix to re-classify the failure as a CacheWriteDeniedError | ||
| 96558 | + * so consumers and tests can distinguish a policy denial from other reservation | ||
| 96559 | + * failures. Internally it is logged as a non-fatal warning like other | ||
| 96560 | + * best-effort save failures. | ||
| 96529 | 96561 | */ | |
| 96530 | 96562 | const CACHE_WRITE_DENIED_PREFIX = 'cache write denied:'; | |
| 96531 | 96563 | /** | |
| 96532 | 96564 | * Raised when the cache backend refuses to reserve a writable cache entry | |
| 96533 | 96565 | * because the JWT issued for this run was scoped read-only (for example, the | |
| 96534 | 96566 | * run was triggered by an event the repository administrator classified as | |
| 96535 | - * untrusted). The receiver-supplied detail message always begins with | ||
| 96567 | + * untrusted). The service-supplied detail message always begins with | ||
| 96536 | 96568 | * `cache write denied:` (the full error message includes additional context | |
| 96537 | 96569 | * like the cache key). | |
| 96538 | 96570 | * | |
@@ -96548,6 +96580,19 @@ class CacheWriteDeniedError extends ReserveCacheError { | |||
| 96548 | 96580 | Object.setPrototypeOf(this, CacheWriteDeniedError.prototype); | |
| 96549 | 96581 | } | |
| 96550 | 96582 | } | |
| 96583 | + // Re-exported from constants so consumers keep referencing it here; the shared | ||
| 96584 | + // value also drives detection in cacheHttpClient without duplicating the string. | ||
| 96585 | + const CACHE_READ_DENIED_PREFIX = (/* unused pure expression or super */ null && (CacheReadDeniedMessagePrefix)); | ||
| 96586 | + // Raised when the cache backend denies a download URL because the run's token | ||
| 96587 | + // has no readable cache scopes. Caching is best-effort, so restoreCache logs a | ||
| 96588 | + // warning and reports a cache miss rather than rethrowing this. | ||
| 96589 | + class CacheReadDeniedError extends Error { | ||
| 96590 | + constructor(message) { | ||
| 96591 | + super(message); | ||
| 96592 | + this.name = 'CacheReadDeniedError'; | ||
| 96593 | + Object.setPrototypeOf(this, CacheReadDeniedError.prototype); | ||
| 96594 | + } | ||
| 96595 | + } | ||
| 96551 | 96596 | class FinalizeCacheError extends Error { | |
| 96552 | 96597 | constructor(message) { | |
| 96553 | 96598 | super(message); | |
@@ -96602,6 +96647,12 @@ function restoreCache(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |||
| 96602 | 96647 | const cacheServiceVersion = getCacheServiceVersion(); | |
| 96603 | 96648 | core.debug(`Cache service version: ${cacheServiceVersion}`); | |
| 96604 | 96649 | checkPaths(paths); | |
| 96650 | + const cacheMode = getCacheMode(); | ||
| 96651 | + if (!isCacheReadable(cacheMode)) { | ||
| 96652 | + core.info(`Cache restore skipped: the effective cache-mode '${cacheMode}' does not permit reads.`); | ||
| 96653 | + core.debug(`Skipped restore for paths [${paths.join(', ')}] with primary key '${primaryKey}'.`); | ||
| 96654 | + return undefined; | ||
| 96655 | + } | ||
| 96605 | 96656 | switch (cacheServiceVersion) { | |
| 96606 | 96657 | case 'v2': | |
| 96607 | 96658 | return yield restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsArchive); | |
@@ -96623,6 +96674,7 @@ function restoreCache(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |||
| 96623 | 96674 | */ | |
| 96624 | 96675 | function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |
| 96625 | 96676 | return cache_awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) { | |
| 96677 | + var _a; | ||
| 96626 | 96678 | restoreKeys = restoreKeys || []; | |
| 96627 | 96679 | const keys = [primaryKey, ...restoreKeys]; | |
| 96628 | 96680 | core.debug('Resolved Keys:'); | |
@@ -96637,10 +96689,26 @@ function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |||
| 96637 | 96689 | let archivePath = ''; | |
| 96638 | 96690 | try { | |
| 96639 | 96691 | // path are needed to compute version | |
| 96640 | - const cacheEntry = yield cacheHttpClient.getCacheEntry(keys, paths, { | ||
| 96641 | - compressionMethod, | ||
| 96642 | - enableCrossOsArchive | ||
| 96643 | - }); | ||
| 96692 | + let cacheEntry; | ||
| 96693 | + try { | ||
| 96694 | + cacheEntry = yield cacheHttpClient.getCacheEntry(keys, paths, { | ||
| 96695 | + compressionMethod, | ||
| 96696 | + enableCrossOsArchive | ||
| 96697 | + }); | ||
| 96698 | + } | ||
| 96699 | + catch (error) { | ||
| 96700 | + // The v1 artifact cache service returns HTTP 403 with a | ||
| 96701 | + // `cache read denied:` body when the run's token has no readable cache | ||
| 96702 | + // scopes. getCacheEntry lives in a dependency-free internal module and | ||
| 96703 | + // cannot import CacheReadDeniedError without a circular dependency, so it | ||
| 96704 | + // only surfaces the raw denial message; we classify it into the typed | ||
| 96705 | + // error here so the outer catch and consumers can dispatch on it. | ||
| 96706 | + const errorMessage = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : ''; | ||
| 96707 | + if (errorMessage.includes(CACHE_READ_DENIED_PREFIX)) { | ||
| 96708 | + throw new CacheReadDeniedError(errorMessage); | ||
| 96709 | + } | ||
| 96710 | + throw error; | ||
| 96711 | + } | ||
| 96644 | 96712 | if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.archiveLocation)) { | |
| 96645 | 96713 | // Cache not found | |
| 96646 | 96714 | return undefined; | |
@@ -96669,7 +96737,9 @@ function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |||
| 96669 | 96737 | } | |
| 96670 | 96738 | else { | |
| 96671 | 96739 | // warn on cache restore failure and continue build | |
| 96672 | - // Log server errors (5xx) as errors, all other errors as warnings | ||
| 96740 | + // Log server errors (5xx) as errors, all other errors as warnings. | ||
| 96741 | + // A read denied by policy (CacheReadDeniedError) is not an HttpClientError | ||
| 96742 | + // so it falls here and is warned, treated as a cache miss. | ||
| 96673 | 96743 | if (typedError instanceof HttpClientError && | |
| 96674 | 96744 | typeof typedError.statusCode === 'number' && | |
| 96675 | 96745 | typedError.statusCode >= 500) { | |
@@ -96704,6 +96774,7 @@ function restoreCacheV1(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |||
| 96704 | 96774 | */ | |
| 96705 | 96775 | function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |
| 96706 | 96776 | return cache_awaiter(this, arguments, void 0, function* (paths, primaryKey, restoreKeys, options, enableCrossOsArchive = false) { | |
| 96777 | + var _a; | ||
| 96707 | 96778 | // Override UploadOptions to force the use of Azure | |
| 96708 | 96779 | options = Object.assign(Object.assign({}, options), { useAzureSdk: true }); | |
| 96709 | 96780 | restoreKeys = restoreKeys || []; | |
@@ -96725,7 +96796,20 @@ function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |||
| 96725 | 96796 | restoreKeys, | |
| 96726 | 96797 | version: utils.getCacheVersion(paths, compressionMethod, enableCrossOsArchive) | |
| 96727 | 96798 | }; | |
| 96728 | - const response = yield twirpClient.GetCacheEntryDownloadURL(request); | ||
| 96799 | + let response; | ||
| 96800 | + try { | ||
| 96801 | + response = yield twirpClient.GetCacheEntryDownloadURL(request); | ||
| 96802 | + } | ||
| 96803 | + catch (error) { | ||
| 96804 | + // The receiver returns twirp PermissionDenied (403) when the run's token | ||
| 96805 | + // has no readable cache scopes. The client wraps that 403, so the stable | ||
| 96806 | + // prefix is embedded in the message rather than leading it. | ||
| 96807 | + const errorMessage = (_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : ''; | ||
| 96808 | + if (errorMessage.includes(CACHE_READ_DENIED_PREFIX)) { | ||
| 96809 | + throw new CacheReadDeniedError(errorMessage); | ||
| 96810 | + } | ||
| 96811 | + throw error; | ||
| 96812 | + } | ||
| 96729 | 96813 | if (!response.ok) { | |
| 96730 | 96814 | core.debug(`Cache not found for version ${request.version} of keys: ${keys.join(', ')}`); | |
| 96731 | 96815 | return undefined; | |
@@ -96760,8 +96844,10 @@ function restoreCacheV2(paths_1, primaryKey_1, restoreKeys_1, options_1) { | |||
| 96760 | 96844 | throw error; | |
| 96761 | 96845 | } | |
| 96762 | 96846 | else { | |
| 96763 | - // Supress all non-validation cache related errors because caching should be optional | ||
| 96764 | - // Log server errors (5xx) as errors, all other errors as warnings | ||
| 96847 | + // Suppress all non-validation cache related errors because caching should be optional | ||
| 96848 | + // Log server errors (5xx) as errors, all other errors as warnings. | ||
| 96849 | + // A read denied by policy (CacheReadDeniedError) is not an HttpClientError | ||
| 96850 | + // so it falls here and is warned, treated as a cache miss. | ||
| 96765 | 96851 | if (typedError instanceof HttpClientError && | |
| 96766 | 96852 | typeof typedError.statusCode === 'number' && | |
| 96767 | 96853 | typedError.statusCode >= 500) { | |
@@ -96800,6 +96886,12 @@ function cache_saveCache(paths_1, key_1, options_1) { | |||
| 96800 | 96886 | core_debug(`Cache service version: ${cacheServiceVersion}`); | |
| 96801 | 96887 | checkPaths(paths); | |
| 96802 | 96888 | checkKey(key); | |
| 96889 | + const cacheMode = config_getCacheMode(); | ||
| 96890 | + if (!isCacheWritable(cacheMode)) { | ||
| 96891 | + info(`Cache save skipped: the effective cache-mode '${cacheMode}' does not permit writes.`); | ||
| 96892 | + core_debug(`Skipped save for paths [${paths.join(', ')}] with key '${key}'.`); | ||
| 96893 | + return -1; | ||
| 96894 | + } | ||
| 96803 | 96895 | switch (cacheServiceVersion) { | |
| 96804 | 96896 | case 'v2': | |
| 96805 | 96897 | return yield saveCacheV2(paths, key, options, enableCrossOsArchive); | |
@@ -96877,17 +96969,14 @@ function saveCacheV1(paths_1, key_1, options_1) { | |||
| 96877 | 96969 | if (typedError.name === ValidationError.name) { | |
| 96878 | 96970 | throw error; | |
| 96879 | 96971 | } | |
| 96880 | - else if (typedError.name === CacheWriteDeniedError.name) { | ||
| 96881 | - // Cache write was denied by policy (read-only token). Surface to the | ||
| 96882 | - // customer at warning level so it is visible in the workflow log | ||
| 96883 | - // without failing the run. | ||
| 96884 | - warning(`Failed to save: ${typedError.message}`); | ||
| 96885 | - } | ||
| 96886 | 96972 | else if (typedError.name === ReserveCacheError.name) { | |
| 96887 | 96973 | info(`Failed to save: ${typedError.message}`); | |
| 96888 | 96974 | } | |
| 96889 | 96975 | else { | |
| 96890 | - // Log server errors (5xx) as errors, all other errors as warnings | ||
| 96976 | + // Log server errors (5xx) as errors, all other errors as warnings. | ||
| 96977 | + // A write denied by policy (CacheWriteDeniedError) is not an | ||
| 96978 | + // HttpClientError and its name does not match the ReserveCacheError arm, | ||
| 96979 | + // so it falls here and is warned without failing the run. | ||
| 96891 | 96980 | if (typedError instanceof lib_HttpClientError && | |
| 96892 | 96981 | typeof typedError.statusCode === 'number' && | |
| 96893 | 96982 | typedError.statusCode >= 500) { | |
@@ -96998,20 +97087,17 @@ function saveCacheV2(paths_1, key_1, options_1) { | |||
| 96998 | 97087 | if (typedError.name === ValidationError.name) { | |
| 96999 | 97088 | throw error; | |
| 97000 | 97089 | } | |
| 97001 | - else if (typedError.name === CacheWriteDeniedError.name) { | ||
| 97002 | - // Cache write was denied by policy (read-only token). Surface to the | ||
| 97003 | - // customer at warning level so it is visible in the workflow log | ||
| 97004 | - // without failing the run. | ||
| 97005 | - warning(`Failed to save: ${typedError.message}`); | ||
| 97006 | - } | ||
| 97007 | 97090 | else if (typedError.name === ReserveCacheError.name) { | |
| 97008 | 97091 | info(`Failed to save: ${typedError.message}`); | |
| 97009 | 97092 | } | |
| 97010 | 97093 | else if (typedError.name === FinalizeCacheError.name) { | |
| 97011 | 97094 | warning(typedError.message); | |
| 97012 | 97095 | } | |
| 97013 | 97096 | else { | |
| 97014 | - // Log server errors (5xx) as errors, all other errors as warnings | ||
| 97097 | + // Log server errors (5xx) as errors, all other errors as warnings. | ||
| 97098 | + // A write denied by policy (CacheWriteDeniedError) is not an | ||
| 97099 | + // HttpClientError and its name does not match the ReserveCacheError arm, | ||
| 97100 | + // so it falls here and is warned without failing the run. | ||
| 97015 | 97101 | if (typedError instanceof lib_HttpClientError && | |
| 97016 | 97102 | typeof typedError.statusCode === 'number' && | |
| 97017 | 97103 | typedError.statusCode >= 500) { | |
| Back | FazBrowse Home | New Git URL |
0 commit comments