@datocms/rest-client-utils
Advanced tools
Comparing version 3.0.5 to 3.1.4
@@ -17,3 +17,3 @@ "use strict"; | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
@@ -41,3 +41,3 @@ if (y = 0, t) op = [op[0] & 2, t.value]; | ||
var buildNormalizedParams_1 = require("../buildNormalizedParams"); | ||
describe('URLQueryParams', function () { | ||
describe('buildNormalizedParams', function () { | ||
it('encodes complex params', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
@@ -44,0 +44,0 @@ return __generator(this, function (_a) { |
@@ -13,29 +13,49 @@ "use strict"; | ||
exports.buildNormalizedParams = void 0; | ||
var ARRAY_INDEX = '__ARRAY_INDEX__'; | ||
function buildKey(path) { | ||
return path.reduce(function (result, chunk, index) { return (index === 0 ? chunk : "".concat(result, "[").concat(chunk, "]")); }, ''); | ||
return path.reduce(function (result, chunk, index) { | ||
return index === 0 | ||
? chunk | ||
: chunk === ARRAY_INDEX | ||
? "".concat(result, "[]") | ||
: "".concat(result, "[").concat(chunk, "]"); | ||
}, ''); | ||
} | ||
function buildNormalizedParams(input, path) { | ||
function serializeValue(value) { | ||
if (typeof value === 'number' || typeof value === 'string') { | ||
return value.toString(); | ||
} | ||
if (value === true) { | ||
return 'true'; | ||
} | ||
if (value === false) { | ||
return 'false'; | ||
} | ||
throw "Don't know how to serialize param value ".concat(JSON.stringify(value)); | ||
} | ||
function buildNormalizedParams(value, path) { | ||
if (path === void 0) { path = []; } | ||
var result = []; | ||
for (var _i = 0, _a = Object.entries(input); _i < _a.length; _i++) { | ||
var _b = _a[_i], key = _b[0], value = _b[1]; | ||
if (typeof value === 'number' || typeof value === 'string') { | ||
result.push([buildKey(__spreadArray(__spreadArray([], path, true), [key], false)), value.toString()]); | ||
} | ||
else if (value === true) { | ||
result.push([buildKey(__spreadArray(__spreadArray([], path, true), [key], false)), 'true']); | ||
} | ||
else if (value === false) { | ||
result.push([buildKey(__spreadArray(__spreadArray([], path, true), [key], false)), 'false']); | ||
} | ||
else if (typeof value === 'object') { | ||
if (Array.isArray(value)) { | ||
for (var _c = 0, value_1 = value; _c < value_1.length; _c++) { | ||
var innerValue = value_1[_c]; | ||
result.push(["".concat(buildKey(__spreadArray(__spreadArray([], path, true), [key], false)), "[]"), innerValue.toString()]); | ||
if (typeof value === 'number' || | ||
typeof value === 'string' || | ||
typeof value === 'boolean') { | ||
result.push([buildKey(path), serializeValue(value)]); | ||
} | ||
else if (typeof value === 'object') { | ||
if (Array.isArray(value)) { | ||
for (var _i = 0, _a = value; _i < _a.length; _i++) { | ||
var innerValue = _a[_i]; | ||
for (var _b = 0, _c = buildNormalizedParams(innerValue, __spreadArray(__spreadArray([], path, true), [ | ||
ARRAY_INDEX, | ||
], false)); _b < _c.length; _b++) { | ||
var param = _c[_b]; | ||
result.push(param); | ||
} | ||
} | ||
else if (value) { | ||
for (var _d = 0, _e = buildNormalizedParams(value, __spreadArray(__spreadArray([], path, true), [key], false)); _d < _e.length; _d++) { | ||
var param = _e[_d]; | ||
} | ||
else if (value) { | ||
for (var _d = 0, _e = Object.entries(value); _d < _e.length; _d++) { | ||
var _f = _e[_d], key = _f[0], innerValue = _f[1]; | ||
for (var _g = 0, _h = buildNormalizedParams(innerValue, __spreadArray(__spreadArray([], path, true), [key], false)); _g < _h.length; _g++) { | ||
var param = _h[_g]; | ||
result.push(param); | ||
@@ -42,0 +62,0 @@ } |
@@ -1,2 +0,2 @@ | ||
'use strict'; | ||
"use strict"; | ||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { | ||
@@ -3,0 +3,0 @@ if (k2 === undefined) k2 = k; |
@@ -17,3 +17,3 @@ "use strict"; | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
@@ -20,0 +20,0 @@ if (y = 0, t) op = [op[0] & 2, t.value]; |
@@ -8,3 +8,3 @@ "use strict"; | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
@@ -11,0 +11,0 @@ if (y = 0, t) op = [op[0] & 2, t.value]; |
@@ -29,3 +29,3 @@ "use strict"; | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
@@ -55,4 +55,4 @@ if (y = 0, t) op = [op[0] & 2, t.value]; | ||
var errors_1 = require("./errors"); | ||
var makeCancelablePromise_1 = require("./makeCancelablePromise"); | ||
var wait_1 = require("./wait"); | ||
var makeCancelablePromise_1 = require("./makeCancelablePromise"); | ||
var isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined'; | ||
@@ -59,0 +59,0 @@ var MAX_RETRY_COUNT_ON_TIMEOUT_ERROR = 5; |
@@ -16,3 +16,3 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
@@ -39,3 +39,3 @@ if (y = 0, t) op = [op[0] & 2, t.value]; | ||
import { buildNormalizedParams } from '../buildNormalizedParams'; | ||
describe('URLQueryParams', function () { | ||
describe('buildNormalizedParams', function () { | ||
it('encodes complex params', function () { return __awaiter(void 0, void 0, void 0, function () { | ||
@@ -42,0 +42,0 @@ return __generator(this, function (_a) { |
@@ -1,1 +0,1 @@ | ||
export declare function buildNormalizedParams(input: Record<string, unknown>, path?: string[]): [string, string][]; | ||
export declare function buildNormalizedParams(value: unknown, path?: string[]): [string, string][]; |
@@ -10,29 +10,49 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { | ||
}; | ||
var ARRAY_INDEX = '__ARRAY_INDEX__'; | ||
function buildKey(path) { | ||
return path.reduce(function (result, chunk, index) { return (index === 0 ? chunk : "".concat(result, "[").concat(chunk, "]")); }, ''); | ||
return path.reduce(function (result, chunk, index) { | ||
return index === 0 | ||
? chunk | ||
: chunk === ARRAY_INDEX | ||
? "".concat(result, "[]") | ||
: "".concat(result, "[").concat(chunk, "]"); | ||
}, ''); | ||
} | ||
export function buildNormalizedParams(input, path) { | ||
function serializeValue(value) { | ||
if (typeof value === 'number' || typeof value === 'string') { | ||
return value.toString(); | ||
} | ||
if (value === true) { | ||
return 'true'; | ||
} | ||
if (value === false) { | ||
return 'false'; | ||
} | ||
throw "Don't know how to serialize param value ".concat(JSON.stringify(value)); | ||
} | ||
export function buildNormalizedParams(value, path) { | ||
if (path === void 0) { path = []; } | ||
var result = []; | ||
for (var _i = 0, _a = Object.entries(input); _i < _a.length; _i++) { | ||
var _b = _a[_i], key = _b[0], value = _b[1]; | ||
if (typeof value === 'number' || typeof value === 'string') { | ||
result.push([buildKey(__spreadArray(__spreadArray([], path, true), [key], false)), value.toString()]); | ||
} | ||
else if (value === true) { | ||
result.push([buildKey(__spreadArray(__spreadArray([], path, true), [key], false)), 'true']); | ||
} | ||
else if (value === false) { | ||
result.push([buildKey(__spreadArray(__spreadArray([], path, true), [key], false)), 'false']); | ||
} | ||
else if (typeof value === 'object') { | ||
if (Array.isArray(value)) { | ||
for (var _c = 0, value_1 = value; _c < value_1.length; _c++) { | ||
var innerValue = value_1[_c]; | ||
result.push(["".concat(buildKey(__spreadArray(__spreadArray([], path, true), [key], false)), "[]"), innerValue.toString()]); | ||
if (typeof value === 'number' || | ||
typeof value === 'string' || | ||
typeof value === 'boolean') { | ||
result.push([buildKey(path), serializeValue(value)]); | ||
} | ||
else if (typeof value === 'object') { | ||
if (Array.isArray(value)) { | ||
for (var _i = 0, _a = value; _i < _a.length; _i++) { | ||
var innerValue = _a[_i]; | ||
for (var _b = 0, _c = buildNormalizedParams(innerValue, __spreadArray(__spreadArray([], path, true), [ | ||
ARRAY_INDEX, | ||
], false)); _b < _c.length; _b++) { | ||
var param = _c[_b]; | ||
result.push(param); | ||
} | ||
} | ||
else if (value) { | ||
for (var _d = 0, _e = buildNormalizedParams(value, __spreadArray(__spreadArray([], path, true), [key], false)); _d < _e.length; _d++) { | ||
var param = _e[_d]; | ||
} | ||
else if (value) { | ||
for (var _d = 0, _e = Object.entries(value); _d < _e.length; _d++) { | ||
var _f = _e[_d], key = _f[0], innerValue = _f[1]; | ||
for (var _g = 0, _h = buildNormalizedParams(innerValue, __spreadArray(__spreadArray([], path, true), [key], false)); _g < _h.length; _g++) { | ||
var param = _h[_g]; | ||
result.push(param); | ||
@@ -39,0 +59,0 @@ } |
@@ -1,2 +0,2 @@ | ||
declare type JsonApiEntity = { | ||
type JsonApiEntity = { | ||
id?: string; | ||
@@ -3,0 +3,0 @@ type?: string; |
@@ -1,2 +0,2 @@ | ||
export declare type ErrorEntity = { | ||
export type ErrorEntity = { | ||
id: string; | ||
@@ -9,4 +9,4 @@ type: 'api_error'; | ||
}; | ||
declare type FilterFn = (details: Record<string, unknown>) => boolean; | ||
export declare type ApiErrorRequest = { | ||
type FilterFn = (details: Record<string, unknown>) => boolean; | ||
export type ApiErrorRequest = { | ||
url: string; | ||
@@ -17,3 +17,3 @@ method: string; | ||
}; | ||
export declare type ApiErrorResponse = { | ||
export type ApiErrorResponse = { | ||
status: number; | ||
@@ -24,3 +24,3 @@ statusText: string; | ||
}; | ||
export declare type TimeoutErrorInitObject = { | ||
export type TimeoutErrorInitObject = { | ||
request: ApiErrorRequest; | ||
@@ -34,3 +34,3 @@ preCallStack?: string; | ||
} | ||
export declare type ApiErrorInitObject = { | ||
export type ApiErrorInitObject = { | ||
request: ApiErrorRequest; | ||
@@ -37,0 +37,0 @@ response: ApiErrorResponse; |
@@ -1,2 +0,1 @@ | ||
'use strict'; | ||
export * from './errors'; | ||
@@ -3,0 +2,0 @@ export * from './deserialize'; |
@@ -1,2 +0,2 @@ | ||
export declare type JobResult = { | ||
export type JobResult = { | ||
type: 'job_result'; | ||
@@ -3,0 +3,0 @@ id: string; |
@@ -16,3 +16,3 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
@@ -19,0 +19,0 @@ if (y = 0, t) op = [op[0] & 2, t.value]; |
@@ -1,10 +0,10 @@ | ||
export declare type IteratorOptions = { | ||
export type IteratorOptions = { | ||
perPage?: number; | ||
concurrency?: number; | ||
}; | ||
declare type PaginationOptions = { | ||
type PaginationOptions = { | ||
defaultLimit: number; | ||
maxLimit: number; | ||
}; | ||
declare type JsonApiPage<T> = { | ||
type JsonApiPage<T> = { | ||
data: T[]; | ||
@@ -11,0 +11,0 @@ meta: { |
@@ -7,3 +7,3 @@ var __generator = (this && this.__generator) || function (thisArg, body) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
@@ -10,0 +10,0 @@ if (y = 0, t) op = [op[0] & 2, t.value]; |
@@ -13,3 +13,3 @@ /// <reference lib="dom" /> | ||
} | ||
declare type RequestOptions = { | ||
type RequestOptions = { | ||
baseUrl: string; | ||
@@ -16,0 +16,0 @@ fetchJobResult: (jobId: string) => Promise<JobResult>; |
@@ -28,3 +28,3 @@ /// <reference lib="dom" /> | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (_) try { | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
@@ -52,4 +52,4 @@ if (y = 0, t) op = [op[0] & 2, t.value]; | ||
import { ApiError, TimeoutError, } from './errors'; | ||
import { CanceledPromiseError, makeCancelablePromise, } from './makeCancelablePromise'; | ||
import { wait } from './wait'; | ||
import { makeCancelablePromise, CanceledPromiseError, } from './makeCancelablePromise'; | ||
var isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined'; | ||
@@ -56,0 +56,0 @@ var MAX_RETRY_COUNT_ON_TIMEOUT_ERROR = 5; |
@@ -1,2 +0,2 @@ | ||
declare type Options = { | ||
type Options = { | ||
id?: string; | ||
@@ -17,3 +17,3 @@ type: string; | ||
}; | ||
export declare type Rel = { | ||
export type Rel = { | ||
id: string; | ||
@@ -20,0 +20,0 @@ type: string; |
@@ -1,1 +0,1 @@ | ||
export declare function buildNormalizedParams(input: Record<string, unknown>, path?: string[]): [string, string][]; | ||
export declare function buildNormalizedParams(value: unknown, path?: string[]): [string, string][]; |
@@ -1,2 +0,2 @@ | ||
declare type JsonApiEntity = { | ||
type JsonApiEntity = { | ||
id?: string; | ||
@@ -3,0 +3,0 @@ type?: string; |
@@ -1,2 +0,2 @@ | ||
export declare type ErrorEntity = { | ||
export type ErrorEntity = { | ||
id: string; | ||
@@ -9,4 +9,4 @@ type: 'api_error'; | ||
}; | ||
declare type FilterFn = (details: Record<string, unknown>) => boolean; | ||
export declare type ApiErrorRequest = { | ||
type FilterFn = (details: Record<string, unknown>) => boolean; | ||
export type ApiErrorRequest = { | ||
url: string; | ||
@@ -17,3 +17,3 @@ method: string; | ||
}; | ||
export declare type ApiErrorResponse = { | ||
export type ApiErrorResponse = { | ||
status: number; | ||
@@ -24,3 +24,3 @@ statusText: string; | ||
}; | ||
export declare type TimeoutErrorInitObject = { | ||
export type TimeoutErrorInitObject = { | ||
request: ApiErrorRequest; | ||
@@ -34,3 +34,3 @@ preCallStack?: string; | ||
} | ||
export declare type ApiErrorInitObject = { | ||
export type ApiErrorInitObject = { | ||
request: ApiErrorRequest; | ||
@@ -37,0 +37,0 @@ response: ApiErrorResponse; |
@@ -1,2 +0,2 @@ | ||
export declare type JobResult = { | ||
export type JobResult = { | ||
type: 'job_result'; | ||
@@ -3,0 +3,0 @@ id: string; |
@@ -1,10 +0,10 @@ | ||
export declare type IteratorOptions = { | ||
export type IteratorOptions = { | ||
perPage?: number; | ||
concurrency?: number; | ||
}; | ||
declare type PaginationOptions = { | ||
type PaginationOptions = { | ||
defaultLimit: number; | ||
maxLimit: number; | ||
}; | ||
declare type JsonApiPage<T> = { | ||
type JsonApiPage<T> = { | ||
data: T[]; | ||
@@ -11,0 +11,0 @@ meta: { |
@@ -13,3 +13,3 @@ /// <reference lib="dom" /> | ||
} | ||
declare type RequestOptions = { | ||
type RequestOptions = { | ||
baseUrl: string; | ||
@@ -16,0 +16,0 @@ fetchJobResult: (jobId: string) => Promise<JobResult>; |
@@ -1,2 +0,2 @@ | ||
declare type Options = { | ||
type Options = { | ||
id?: string; | ||
@@ -17,3 +17,3 @@ type: string; | ||
}; | ||
export declare type Rel = { | ||
export type Rel = { | ||
id: string; | ||
@@ -20,0 +20,0 @@ type: string; |
{ | ||
"name": "@datocms/rest-client-utils", | ||
"version": "3.0.5", | ||
"version": "3.1.4", | ||
"description": "Utilities for DatoCMS REST API clients", | ||
@@ -41,3 +41,3 @@ "keywords": [ | ||
}, | ||
"gitHead": "ac36c1649815c85b27d86f7a9fc87b9bb44e1596", | ||
"gitHead": "cad1c1fcae257e50798c58f430a3ff966030078b", | ||
"devDependencies": { | ||
@@ -44,0 +44,0 @@ "@types/qs": "^6.9.7" |
import { buildNormalizedParams } from '../buildNormalizedParams'; | ||
describe('URLQueryParams', () => { | ||
describe('buildNormalizedParams', () => { | ||
it('encodes complex params', async () => { | ||
@@ -5,0 +5,0 @@ expect(buildNormalizedParams({ foo: 0 })).toMatchInlineSnapshot(` |
@@ -0,4 +1,11 @@ | ||
const ARRAY_INDEX = '__ARRAY_INDEX__'; | ||
function buildKey(path: string[]) { | ||
return path.reduce( | ||
(result, chunk, index) => (index === 0 ? chunk : `${result}[${chunk}]`), | ||
(result, chunk, index) => | ||
index === 0 | ||
? chunk | ||
: chunk === ARRAY_INDEX | ||
? `${result}[]` | ||
: `${result}[${chunk}]`, | ||
'', | ||
@@ -8,4 +15,20 @@ ); | ||
function serializeValue(value: unknown) { | ||
if (typeof value === 'number' || typeof value === 'string') { | ||
return value.toString(); | ||
} | ||
if (value === true) { | ||
return 'true'; | ||
} | ||
if (value === false) { | ||
return 'false'; | ||
} | ||
throw `Don't know how to serialize param value ${JSON.stringify(value)}`; | ||
} | ||
export function buildNormalizedParams( | ||
input: Record<string, unknown>, | ||
value: unknown, | ||
path: string[] = [], | ||
@@ -15,19 +38,21 @@ ): [string, string][] { | ||
for (const [key, value] of Object.entries(input)) { | ||
if (typeof value === 'number' || typeof value === 'string') { | ||
result.push([buildKey([...path, key]), value.toString()]); | ||
} else if (value === true) { | ||
result.push([buildKey([...path, key]), 'true']); | ||
} else if (value === false) { | ||
result.push([buildKey([...path, key]), 'false']); | ||
} else if (typeof value === 'object') { | ||
if (Array.isArray(value)) { | ||
for (const innerValue of value) { | ||
result.push([`${buildKey([...path, key])}[]`, innerValue.toString()]); | ||
if ( | ||
typeof value === 'number' || | ||
typeof value === 'string' || | ||
typeof value === 'boolean' | ||
) { | ||
result.push([buildKey(path), serializeValue(value)]); | ||
} else if (typeof value === 'object') { | ||
if (Array.isArray(value)) { | ||
for (const innerValue of value as unknown[]) { | ||
for (const param of buildNormalizedParams(innerValue, [ | ||
...path, | ||
ARRAY_INDEX, | ||
])) { | ||
result.push(param); | ||
} | ||
} else if (value) { | ||
for (const param of buildNormalizedParams( | ||
value as Record<string, unknown>, | ||
[...path, key], | ||
)) { | ||
} | ||
} else if (value) { | ||
for (const [key, innerValue] of Object.entries(value)) { | ||
for (const param of buildNormalizedParams(innerValue, [...path, key])) { | ||
result.push(param); | ||
@@ -34,0 +59,0 @@ } |
@@ -197,6 +197,5 @@ export type ErrorEntity = { | ||
if (planUpgradeError) { | ||
const { limit } = planUpgradeError.attributes.details as Record< | ||
string, | ||
string | ||
>; | ||
const { limit } = planUpgradeError.attributes.details as { | ||
limit: string; | ||
}; | ||
return `${humanMessageForPlanUpgradeLimit[limit]}. Please head over to your account dashboard (https://dashboard.datocms.com/) to upgrade the plan or, if no publicly available plan suits your needs, contact our Sales team (https://www.datocms.com/contact) to get a custom quote!`; | ||
@@ -203,0 +202,0 @@ } |
@@ -1,3 +0,1 @@ | ||
'use strict'; | ||
export * from './errors'; | ||
@@ -4,0 +2,0 @@ export * from './deserialize'; |
@@ -11,7 +11,7 @@ /// <reference lib="dom" /> | ||
import { JobResult } from './internalTypes'; | ||
import { wait } from './wait'; | ||
import { | ||
CanceledPromiseError, | ||
makeCancelablePromise, | ||
CanceledPromiseError, | ||
} from './makeCancelablePromise'; | ||
import { wait } from './wait'; | ||
@@ -18,0 +18,0 @@ const isBrowser = |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
191544
3257