New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@contember/database

Package Overview
Dependencies
Maintainers
5
Versions
291
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@contember/database - npm Package Compare versions

Comparing version

to
1.2.0-alpha.1

dist/src/client/Pool.d.ts

28

dist/src/client/Connection.d.ts

@@ -1,12 +0,15 @@

import { PoolConfig } from 'pg';
import { EventManager } from './EventManager';
import { Client } from './Client';
import { DatabaseCredentials } from '../types';
import { Pool, PoolConfig, PoolStatus } from './Pool';
import { DatabaseConfig } from '../types';
declare class Connection implements Connection.ConnectionLike, Connection.ClientFactory, Connection.PoolStatusProvider {
readonly config: PoolConfig & DatabaseCredentials;
private readonly pool;
private readonly queryConfig;
readonly eventManager: EventManager;
private readonly pool;
constructor(config: PoolConfig & DatabaseCredentials, queryConfig: Connection.QueryConfig, eventManager?: EventManager);
constructor(pool: Pool, queryConfig: Connection.QueryConfig, eventManager?: EventManager);
static create({ pool, ...config }: DatabaseConfig & {
pool?: PoolConfig;
}, queryConfig?: Connection.QueryConfig): Connection;
createClient(schema: string, queryMeta: Record<string, any>): Client;
clearPool(): Promise<void>;
transaction<Result>(callback: (connection: Connection.TransactionLike) => Promise<Result> | Result, options?: {

@@ -17,3 +20,3 @@ eventManager?: EventManager;

query<Row extends Record<string, any>>(sql: string, parameters?: any[], meta?: Record<string, any>, { eventManager, ...config }?: Connection.QueryConfig): Promise<Connection.Result<Row>>;
getPoolStatus(): Connection.PoolStatus;
getPoolStatus(): PoolStatus;
}

@@ -34,5 +37,3 @@ declare namespace Connection {

}
type ConnectionType = Connection.ConnectionLike & Connection.ClientFactory & Connection.PoolStatusProvider & {
config: DatabaseCredentials;
};
type ConnectionType = Connection.ConnectionLike & Connection.ClientFactory & Connection.PoolStatusProvider;
interface ConnectionLike extends Transactional, Queryable {

@@ -44,3 +45,3 @@ }

interface PoolStatusProvider {
getPoolStatus(): PoolStatus;
getPoolStatus(): PoolStatus | undefined;
}

@@ -60,3 +61,2 @@ interface TransactionLike extends ConnectionLike {

}
type Credentials = Pick<PoolConfig, 'host' | 'port' | 'user' | 'password' | 'database'>;
interface Result<Row extends Record<string, any> = Record<string, any>> {

@@ -71,10 +71,4 @@ readonly rowCount: number;

const REPEATABLE_READ = "SET TRANSACTION ISOLATION LEVEL REPEATABLE READ";
type PoolStatus = {
totalCount: number;
idleCount: number;
waitingCount: number;
maxCount: number;
};
}
export { Connection };
//# sourceMappingURL=Connection.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Connection = void 0;
const pg_1 = require("pg");
const EventManager_1 = require("./EventManager");

@@ -9,8 +8,9 @@ const Client_1 = require("./Client");

const execution_1 = require("./execution");
const Pool_1 = require("./Pool");
const utils_1 = require("../utils");
class Connection {
constructor(config, queryConfig, eventManager = new EventManager_1.EventManager(null)) {
this.config = config;
constructor(pool, queryConfig, eventManager = new EventManager_1.EventManager(null)) {
this.pool = pool;
this.queryConfig = queryConfig;
this.eventManager = eventManager;
this.pool = new pg_1.Pool(config);
this.pool.on('error', err => {

@@ -22,18 +22,24 @@ // eslint-disable-next-line no-console

}
static create({ pool = {}, ...config }, queryConfig = {}) {
return new Connection(new Pool_1.Pool((0, utils_1.createPgClientFactory)(config), pool), queryConfig);
}
createClient(schema, queryMeta) {
return new Client_1.Client(this, schema, queryMeta, new EventManager_1.EventManager(this.eventManager));
}
async clearPool() {
await this.pool.closeIdle();
}
async transaction(callback, options = {}) {
var _a;
const client = await (0, execution_1.executeClientOperation)(() => this.pool.connect());
const acquired = await this.pool.acquire();
const eventManager = new EventManager_1.EventManager((_a = options.eventManager) !== null && _a !== void 0 ? _a : this.eventManager);
await (0, execution_1.executeQuery)(client, eventManager, {
await (0, execution_1.executeQuery)(acquired.client, eventManager, {
sql: 'BEGIN',
...this.queryConfig,
});
const transaction = new Transaction_1.Transaction(client, eventManager, this.queryConfig);
const transaction = new Transaction_1.Transaction(acquired.client, eventManager, this.queryConfig);
try {
const result = await callback(transaction);
await transaction.commitUnclosed();
client.release();
this.pool.release(acquired);
return result;

@@ -43,3 +49,3 @@ }

await transaction.rollbackUnclosed();
client.release(e);
this.pool.dispose(acquired);
throw e;

@@ -49,14 +55,14 @@ }

async end() {
await (0, execution_1.executeClientOperation)(() => this.pool.end());
await this.pool.end();
}
async query(sql, parameters = [], meta = {}, { eventManager, ...config } = {}) {
const client = await (0, execution_1.executeClientOperation)(() => this.pool.connect());
const client = await this.pool.acquire();
const query = { sql, parameters, meta, ...this.queryConfig, ...config };
try {
const result = await (0, execution_1.executeQuery)(client, eventManager !== null && eventManager !== void 0 ? eventManager : this.eventManager, query, {});
client.release();
const result = await (0, execution_1.executeQuery)(client.client, eventManager !== null && eventManager !== void 0 ? eventManager : this.eventManager, query, {});
this.pool.release(client);
return result;
}
catch (e) {
client.release(e);
this.pool.dispose(client);
throw e;

@@ -66,8 +72,3 @@ }

getPoolStatus() {
return {
idleCount: this.pool.idleCount,
totalCount: this.pool.totalCount,
waitingCount: this.pool.waitingCount,
maxCount: this.config.max || 10,
};
return this.pool.getPoolStatus();
}

@@ -74,0 +75,0 @@ }

@@ -5,3 +5,3 @@ export declare class DatabaseError extends Error {

readonly previous: any;
constructor(errMessage: string, previous: Error | any);
constructor(errMessage: string, previous?: Error | any);
}

@@ -8,0 +8,0 @@ export declare class ClientError extends DatabaseError {

@@ -7,7 +7,9 @@ "use strict";

super(errMessage);
const { message, stack, ...other } = previous;
const otherDefined = Object.fromEntries(Object.entries(other).filter(it => it[1] !== undefined));
this.previous = { message, ...otherDefined };
this.code = previous.code;
this.originalMessage = previous.message;
if (previous) {
const { message, stack, ...other } = previous;
const otherDefined = Object.fromEntries(Object.entries(other).filter(it => it[1] !== undefined));
this.previous = { message, ...otherDefined };
this.code = previous.code;
this.originalMessage = previous.message;
}
}

@@ -14,0 +16,0 @@ }

@@ -6,4 +6,3 @@ import { ClientBase } from 'pg';

export declare function executeQuery<Row extends Record<string, any>>(pgClient: ClientBase, eventManager: EventManager, { sql, parameters, meta, timing }: SomeOptional<Connection.Query, 'parameters' | 'meta'> & Connection.QueryConfig, context?: Connection.QueryContext): Promise<Connection.Result<Row>>;
export declare const executeClientOperation: <T>(cb: () => Promise<T>) => Promise<T>;
export {};
//# sourceMappingURL=execution.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.executeClientOperation = exports.executeQuery = void 0;
exports.executeQuery = void 0;
const EventManager_1 = require("./EventManager");

@@ -65,11 +65,2 @@ const errors_1 = require("./errors");

exports.executeQuery = executeQuery;
const executeClientOperation = async (cb) => {
try {
return await cb();
}
catch (e) {
throw new errors_1.ClientError(e);
}
};
exports.executeClientOperation = executeClientOperation;
//# sourceMappingURL=execution.js.map

@@ -6,4 +6,5 @@ export * from './Client';

export * from './EventManager';
export * from './Pool';
export * from './Transaction';
export * from './SingleConnection';
//# sourceMappingURL=index.d.ts.map

@@ -22,4 +22,5 @@ "use strict";

__exportStar(require("./EventManager"), exports);
__exportStar(require("./Pool"), exports);
__exportStar(require("./Transaction"), exports);
__exportStar(require("./SingleConnection"), exports);
//# sourceMappingURL=index.js.map

@@ -5,3 +5,3 @@ import { ClientConfig } from 'pg';

import { Connection } from './Connection';
import { DatabaseCredentials } from '../types';
import { DatabaseConfig } from '../types';
export declare class SingleConnection implements Connection.ConnectionLike, Connection.ClientFactory {

@@ -13,3 +13,3 @@ private readonly config;

private isConnected;
constructor(config: ClientConfig & DatabaseCredentials, queryConfig: Connection.QueryConfig, eventManager?: EventManager);
constructor(config: ClientConfig & DatabaseConfig, queryConfig: Connection.QueryConfig, eventManager?: EventManager);
createClient(schema: string, queryMeta: Record<string, any>): Client;

@@ -21,3 +21,4 @@ transaction<Result>(callback: (connection: Connection.TransactionLike) => Promise<Result> | Result, options?: {

query<Row extends Record<string, any>>(sql: string, parameters?: any[], meta?: Record<string, any>, config?: Connection.QueryConfig): Promise<Connection.Result<Row>>;
private maybeConnect;
}
//# sourceMappingURL=SingleConnection.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SingleConnection = void 0;
const pg_1 = require("pg");
const EventManager_1 = require("./EventManager");

@@ -9,2 +8,4 @@ const Client_1 = require("./Client");

const execution_1 = require("./execution");
const errors_1 = require("./errors");
const utils_1 = require("../utils");
class SingleConnection {

@@ -16,3 +17,3 @@ constructor(config, queryConfig, eventManager = new EventManager_1.EventManager(null)) {

this.isConnected = false;
this.pgClient = new pg_1.Client(config);
this.pgClient = (0, utils_1.createPgClientFactory)(config)();
this.pgClient.on('error', err => {

@@ -29,6 +30,3 @@ // eslint-disable-next-line no-console

var _a;
if (!this.isConnected) {
await this.pgClient.connect();
this.isConnected = true;
}
await this.maybeConnect();
const eventManager = new EventManager_1.EventManager((_a = options.eventManager) !== null && _a !== void 0 ? _a : this.eventManager);

@@ -56,6 +54,3 @@ await (0, execution_1.executeQuery)(this.pgClient, eventManager, {

var _a;
if (!this.isConnected) {
await this.pgClient.connect();
this.isConnected = true;
}
await this.maybeConnect();
const query = { sql, parameters, meta, ...this.queryConfig, ...config };

@@ -69,4 +64,15 @@ try {

}
async maybeConnect() {
if (!this.isConnected) {
try {
await this.pgClient.connect();
}
catch (e) {
throw new errors_1.ClientError(e);
}
this.isConnected = true;
}
}
}
exports.SingleConnection = SingleConnection;
//# sourceMappingURL=SingleConnection.js.map

@@ -12,3 +12,3 @@ import { With } from './builders/internal/With';

export * from './types';
export { wrapIdentifier, retryTransaction, ConstraintHelper, withDatabaseAdvisoryLock, createDatabaseIfNotExists, } from './utils';
export { wrapIdentifier, retryTransaction, ConstraintHelper, withDatabaseAdvisoryLock, createDatabaseIfNotExists, createPgClientFactory, } from './utils';
//# sourceMappingURL=index.d.ts.map

@@ -17,3 +17,3 @@ "use strict";

Object.defineProperty(exports, "__esModule", { value: true });
exports.createDatabaseIfNotExists = exports.withDatabaseAdvisoryLock = exports.ConstraintHelper = exports.retryTransaction = exports.wrapIdentifier = void 0;
exports.createPgClientFactory = exports.createDatabaseIfNotExists = exports.withDatabaseAdvisoryLock = exports.ConstraintHelper = exports.retryTransaction = exports.wrapIdentifier = void 0;
__exportStar(require("./client"), exports);

@@ -30,2 +30,3 @@ __exportStar(require("./builders"), exports);

Object.defineProperty(exports, "createDatabaseIfNotExists", { enumerable: true, get: function () { return utils_1.createDatabaseIfNotExists; } });
Object.defineProperty(exports, "createPgClientFactory", { enumerable: true, get: function () { return utils_1.createPgClientFactory; } });
//# sourceMappingURL=index.js.map

@@ -13,3 +13,3 @@ /// <reference types="node" />

}
export interface DatabaseCredentials {
export interface DatabaseConfig {
readonly host: string;

@@ -21,3 +21,6 @@ readonly port: number;

readonly ssl?: boolean;
readonly queryTimeoutMs?: number;
readonly statementTimeoutMs?: number;
readonly connectionTimeoutMs?: number;
}
//# sourceMappingURL=types.d.ts.map

@@ -1,3 +0,3 @@

import { DatabaseCredentials } from '../types';
export declare const createDatabaseIfNotExists: (db: DatabaseCredentials, log: (message: string) => void) => Promise<void>;
import { DatabaseConfig } from '../types';
export declare const createDatabaseIfNotExists: (db: DatabaseConfig, log: (message: string) => void) => Promise<void>;
//# sourceMappingURL=createDatabaseIfNotExists.d.ts.map

@@ -8,3 +8,3 @@ "use strict";

try {
const connection = new client_1.Connection(db, {});
const connection = new client_1.SingleConnection(db, {});
await connection.query('SELECT 1');

@@ -20,3 +20,3 @@ await connection.end();

log(`Database ${db.database} does not exist, attempting to create it...`);
const connection = new client_1.Connection({ ...db, database: 'postgres' }, {});
const connection = new client_1.SingleConnection({ ...db, database: 'postgres' }, {});
await connection.query(`CREATE DATABASE ${(0, sql_1.wrapIdentifier)(db.database)}`);

@@ -23,0 +23,0 @@ await connection.end();

@@ -7,2 +7,3 @@ export * from './assertNever';

export * from './withDatabaseAdvisoryLock';
export * from './pgClientFactory';
//# sourceMappingURL=index.d.ts.map

@@ -23,2 +23,3 @@ "use strict";

__exportStar(require("./withDatabaseAdvisoryLock"), exports);
__exportStar(require("./pgClientFactory"), exports);
//# sourceMappingURL=index.js.map
{
"name": "@contember/database",
"version": "1.1.0-rc.0",
"version": "1.2.0-alpha.1",
"license": "Apache-2.0",

@@ -11,6 +11,6 @@ "main": "dist/src/index.js",

"dependencies": {
"@contember/queryable": "^1.1.0-rc.0"
"@contember/queryable": "^1.2.0-alpha.1"
},
"devDependencies": {
"@contember/database-tester": "^1.1.0-rc.0",
"@contember/database-tester": "^1.2.0-alpha.1",
"@types/node": "^17.0.5",

@@ -17,0 +17,0 @@ "pg": "^8.5.0"

@@ -1,17 +0,15 @@

import { Pool, PoolConfig } from 'pg'
import { EventManager } from './EventManager'
import { Client } from './Client'
import { Transaction } from './Transaction'
import { executeClientOperation, executeQuery } from './execution'
import { DatabaseCredentials } from '../types'
import { executeQuery } from './execution'
import { Pool, PoolConfig, PoolStatus } from './Pool'
import { createPgClientFactory } from '../utils'
import { DatabaseConfig } from '../types'
class Connection implements Connection.ConnectionLike, Connection.ClientFactory, Connection.PoolStatusProvider {
private readonly pool: Pool
constructor(
public readonly config: PoolConfig & DatabaseCredentials,
private readonly pool: Pool,
private readonly queryConfig: Connection.QueryConfig,
public readonly eventManager: EventManager = new EventManager(null),
) {
this.pool = new Pool(config)
this.pool.on('error', err => {

@@ -24,2 +22,9 @@ // eslint-disable-next-line no-console

public static create(
{ pool = {}, ...config }: DatabaseConfig & { pool?: PoolConfig },
queryConfig: Connection.QueryConfig = {},
): Connection {
return new Connection(new Pool(createPgClientFactory(config), pool), queryConfig)
}
public createClient(schema: string, queryMeta: Record<string, any>): Client {

@@ -29,2 +34,6 @@ return new Client(this, schema, queryMeta, new EventManager(this.eventManager))

public async clearPool(): Promise<void> {
await this.pool.closeIdle()
}
async transaction<Result>(

@@ -34,9 +43,9 @@ callback: (connection: Connection.TransactionLike) => Promise<Result> | Result,

): Promise<Result> {
const client = await executeClientOperation(() => this.pool.connect())
const acquired = await this.pool.acquire()
const eventManager = new EventManager(options.eventManager ?? this.eventManager)
await executeQuery(client, eventManager, {
await executeQuery(acquired.client, eventManager, {
sql: 'BEGIN',
...this.queryConfig,
})
const transaction = new Transaction(client, eventManager, this.queryConfig)
const transaction = new Transaction(acquired.client, eventManager, this.queryConfig)
try {

@@ -46,3 +55,3 @@ const result = await callback(transaction)

await transaction.commitUnclosed()
client.release()
this.pool.release(acquired)

@@ -52,3 +61,3 @@ return result

await transaction.rollbackUnclosed()
client.release(e as Error)
this.pool.dispose(acquired)
throw e

@@ -59,3 +68,3 @@ }

async end(): Promise<void> {
await executeClientOperation(() => this.pool.end())
await this.pool.end()
}

@@ -69,10 +78,10 @@

): Promise<Connection.Result<Row>> {
const client = await executeClientOperation(() => this.pool.connect())
const client = await this.pool.acquire()
const query: Connection.Query = { sql, parameters, meta, ...this.queryConfig, ...config }
try {
const result = await executeQuery<Row>(client, eventManager ?? this.eventManager, query, {})
client.release()
const result = await executeQuery<Row>(client.client, eventManager ?? this.eventManager, query, {})
this.pool.release(client)
return result
} catch (e) {
client.release(e as Error)
this.pool.dispose(client)
throw e

@@ -82,9 +91,4 @@ }

getPoolStatus(): Connection.PoolStatus {
return {
idleCount: this.pool.idleCount,
totalCount: this.pool.totalCount,
waitingCount: this.pool.waitingCount,
maxCount: this.config.max || 10,
}
getPoolStatus(): PoolStatus {
return this.pool.getPoolStatus()
}

@@ -121,5 +125,2 @@ }

& Connection.PoolStatusProvider
& {
config: DatabaseCredentials
}

@@ -133,3 +134,3 @@ export interface ConnectionLike extends Transactional, Queryable {}

export interface PoolStatusProvider {
getPoolStatus(): PoolStatus
getPoolStatus(): PoolStatus | undefined
}

@@ -155,4 +156,2 @@

export type Credentials = Pick<PoolConfig, 'host' | 'port' | 'user' | 'password' | 'database'>
export interface Result<Row extends Record<string, any> = Record<string, any>> {

@@ -169,5 +168,4 @@ readonly rowCount: number

export type PoolStatus = { totalCount: number; idleCount: number; waitingCount: number; maxCount: number }
}
export { Connection }

@@ -6,9 +6,11 @@ export class DatabaseError extends Error {

constructor(errMessage: string, previous: Error | any) {
constructor(errMessage: string, previous?: Error | any) {
super(errMessage)
const { message, stack, ...other } = previous
const otherDefined = Object.fromEntries(Object.entries(other).filter(it => it[1] !== undefined))
this.previous = { message, ...otherDefined }
this.code = previous.code
this.originalMessage = previous.message
if (previous) {
const { message, stack, ...other } = previous
const otherDefined = Object.fromEntries(Object.entries(other).filter(it => it[1] !== undefined))
this.previous = { message, ...otherDefined }
this.code = previous.code
this.originalMessage = previous.message
}
}

@@ -50,1 +52,3 @@ }

export class TransactionAbortedError extends QueryError {}

@@ -12,3 +12,2 @@ import { ClientBase } from 'pg'

UniqueViolationError,
ClientError,
} from './errors'

@@ -87,9 +86,1 @@ import { ClientErrorCodes } from './errorCodes'

}
export const executeClientOperation = async <T>(cb: () => Promise<T>): Promise<T> => {
try {
return await cb()
} catch (e) {
throw new ClientError(e)
}
}

@@ -6,3 +6,4 @@ export * from './Client'

export * from './EventManager'
export * from './Pool'
export * from './Transaction'
export * from './SingleConnection'

@@ -7,3 +7,5 @@ import { Client as PgClient, ClientConfig } from 'pg'

import { Connection } from './Connection'
import { DatabaseCredentials } from '../types'
import { DatabaseConfig } from '../types'
import { ClientError } from './errors'
import { createPgClientFactory } from '../utils'

@@ -15,7 +17,7 @@ export class SingleConnection implements Connection.ConnectionLike, Connection.ClientFactory {

constructor(
private readonly config: ClientConfig & DatabaseCredentials,
private readonly config: ClientConfig & DatabaseConfig,
private readonly queryConfig: Connection.QueryConfig,
public readonly eventManager: EventManager = new EventManager(null),
) {
this.pgClient = new PgClient(config)
this.pgClient = createPgClientFactory(config)()
this.pgClient.on('error', err => {

@@ -36,6 +38,3 @@ // eslint-disable-next-line no-console

): Promise<Result> {
if (!this.isConnected) {
await this.pgClient.connect()
this.isConnected = true
}
await this.maybeConnect()
const eventManager = new EventManager(options.eventManager ?? this.eventManager)

@@ -74,6 +73,3 @@ await executeQuery(

): Promise<Connection.Result<Row>> {
if (!this.isConnected) {
await this.pgClient.connect()
this.isConnected = true
}
await this.maybeConnect()
const query: Connection.Query = { sql, parameters, meta, ...this.queryConfig, ...config }

@@ -86,2 +82,13 @@ try {

}
private async maybeConnect() {
if (!this.isConnected) {
try {
await this.pgClient.connect()
} catch (e) {
throw new ClientError(e)
}
this.isConnected = true
}
}
}

@@ -20,2 +20,3 @@ import { With } from './builders/internal/With'

createDatabaseIfNotExists,
createPgClientFactory,
} from './utils'

@@ -18,3 +18,3 @@ export type JSONPrimitive = string | number | boolean | null | undefined

export interface DatabaseCredentials {
export interface DatabaseConfig {
readonly host: string

@@ -26,2 +26,5 @@ readonly port: number

readonly ssl?: boolean
readonly queryTimeoutMs?: number
readonly statementTimeoutMs?: number
readonly connectionTimeoutMs?: number
}

@@ -1,8 +0,8 @@

import { DatabaseCredentials } from '../types'
import { ClientError, ClientErrorCodes, Connection } from '../client'
import { DatabaseConfig } from '../types'
import { ClientError, ClientErrorCodes, SingleConnection } from '../client'
import { wrapIdentifier } from './sql'
export const createDatabaseIfNotExists = async (db: DatabaseCredentials, log: (message: string) => void) => {
export const createDatabaseIfNotExists = async (db: DatabaseConfig, log: (message: string) => void) => {
try {
const connection = new Connection(db, {})
const connection = new SingleConnection(db, {})
await connection.query('SELECT 1')

@@ -18,5 +18,5 @@ await connection.end()

log(`Database ${db.database} does not exist, attempting to create it...`)
const connection = new Connection({ ...db, database: 'postgres' }, {})
const connection = new SingleConnection({ ...db, database: 'postgres' }, {})
await connection.query(`CREATE DATABASE ${wrapIdentifier(db.database)}`)
await connection.end()
}

@@ -7,1 +7,2 @@ export * from './assertNever'

export * from './withDatabaseAdvisoryLock'
export * from './pgClientFactory'

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

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