Skip to content

Commit

Permalink
feat(snowflake)!: move snowflake to the @sequelize/snowflake package (
Browse files Browse the repository at this point in the history
  • Loading branch information
lohart13 committed Mar 27, 2024
1 parent 4025d17 commit 54f1e18
Show file tree
Hide file tree
Showing 23 changed files with 158 additions and 93 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ jobs:
run: yarn lerna run test-unit-db2 --scope=@sequelize/core
- name: Unit tests (core - ibmi)
run: yarn lerna run test-unit-ibmi --scope=@sequelize/core
- name: Unit tests (snowflake)
- name: Unit tests (core - snowflake)
run: yarn lerna run test-unit-snowflake --scope=@sequelize/core
- name: SQLite SSCCE
run: yarn sscce-sqlite
Expand Down
9 changes: 1 addition & 8 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,6 @@
"@types/semver": "7.5.8",
"@types/sinon": "17.0.3",
"@types/sinon-chai": "3.2.12",
"@types/snowflake-sdk": "1.6.20",
"@types/uuid": "9.0.8",
"chai": "4.4.1",
"chai-as-promised": "7.1.1",
Expand All @@ -99,13 +98,7 @@
"p-timeout": "4.1.0",
"rimraf": "5.0.5",
"sinon": "17.0.1",
"sinon-chai": "3.7.0",
"snowflake-sdk": "1.10.0"
},
"peerDependenciesMeta": {
"snowflake-sdk": {
"optional": true
}
"sinon-chai": "3.7.0"
},
"keywords": [
"mysql",
Expand Down
3 changes: 2 additions & 1 deletion packages/core/src/sequelize.internals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ export function importDialect(dialect: DialectName): typeof AbstractDialect {
// eslint-disable-next-line import/no-extraneous-dependencies -- legacy function, will be removed. User needs to install the dependency themselves
return require('@sequelize/db2').Db2Dialect;
case 'snowflake':
return require('./dialects/snowflake').SnowflakeDialect;
// eslint-disable-next-line import/no-extraneous-dependencies -- legacy function, will be removed. User needs to install the dependency themselves
return require('@sequelize/snowflake').SnowflakeDialect;
default:
throw new Error(
`The dialect ${dialect} is not natively supported. Native dialects: mariadb, mssql, mysql, postgres, sqlite, ibmi, db2 and snowflake.`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@ const Support = require('../../../support');

const dialect = Support.getTestDialect();
const { Op } = require('@sequelize/core');
const {
SnowflakeQueryGenerator: QueryGenerator,
} = require('@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/snowflake/query-generator.js');
const { SnowflakeQueryGenerator: QueryGenerator } = require('@sequelize/snowflake');
const { createSequelizeInstance } = require('../../../support');

if (dialect === 'snowflake') {
Expand Down
4 changes: 1 addition & 3 deletions packages/core/test/unit/dialects/snowflake/query.test.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
'use strict';

const {
SnowflakeQuery: Query,
} = require('@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/snowflake/query.js');
const { SnowflakeQuery: Query } = require('@sequelize/snowflake');

const Support = require('../../../support');
const chai = require('chai');
Expand Down
5 changes: 5 additions & 0 deletions packages/snowflake/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module.exports = {
parserOptions: {
project: [`${__dirname}/tsconfig.json`],
},
};
42 changes: 42 additions & 0 deletions packages/snowflake/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"bugs": "https://github.com/sequelize/sequelize/issues",
"description": "Snowflake Connector for Sequelize",
"exports": {
".": {
"import": {
"types": "./lib/index.d.mts",
"default": "./lib/index.mjs"
},
"require": {
"types": "./lib/index.d.ts",
"default": "./lib/index.js"
}
}
},
"main": "./lib/index.js",
"types": "./lib/index.d.ts",
"sideEffects": false,
"homepage": "https://sequelize.org",
"license": "MIT",
"name": "@sequelize/snowflake",
"repository": "https://github.com/sequelize/sequelize",
"scripts": {
"build": "../../build-packages.mjs snowflake",
"test": "concurrently \"npm:test-*\"",
"test-typings": "tsc --noEmit --project tsconfig.json",
"test-exports": "../../dev/sync-exports.mjs ./src --check-outdated",
"sync-exports": "../../dev/sync-exports.mjs ./src"
},
"type": "commonjs",
"version": "0.0.0-development",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@sequelize/core": "workspace:*",
"@sequelize/utils": "workspace:*",
"@types/snowflake-sdk": "^1.6.20",
"lodash": "^4.17.21",
"snowflake-sdk": "^1.10.0"
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { AbstractDialect } from '@sequelize/core';
import type { AcceptedDate } from '@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/abstract/data-types.js';
import * as BaseTypes from '@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/abstract/data-types.js';
import maxBy from 'lodash/maxBy.js';
import type { AcceptedDate } from '../abstract/data-types.js';
import * as BaseTypes from '../abstract/data-types.js';
import type { AbstractDialect } from '../abstract/index.js';

export class DATE extends BaseTypes.DATE {
toSql() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,39 +1,31 @@
import type {
Connection as SnowflakeSdkConnection,
ConnectionOptions as SnowflakeSdkConnectionOptions,
} from 'snowflake-sdk';
import type { Connection, ConnectionOptions } from '@sequelize/core';
import {
AbstractConnectionManager,
AccessDeniedError,
ConnectionError,
ConnectionRefusedError,
HostNotFoundError,
HostNotReachableError,
InvalidConnectionError,
} from '../../errors/index.js';
import type { ConnectionOptions } from '../../sequelize.js';
import { isErrorWithStringCode } from '../../utils/check.js';
import { logger } from '../../utils/logger';
import type { Connection } from '../abstract/connection-manager';
import { AbstractConnectionManager } from '../abstract/connection-manager';
import type { SnowflakeDialect } from './index.js';
} from '@sequelize/core';
import { isErrorWithStringCode } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/check.js';
import { logger } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/logger.js';
import * as Snowflake from 'snowflake-sdk';
import type { SnowflakeDialect } from './dialect.js';

const debug = logger.debugContext('connection:snowflake');

export interface SnowflakeConnection extends Connection, SnowflakeSdkConnection {}

// TODO: once the code has been split into packages, we won't need to lazy load this anymore
// eslint-disable-next-line @typescript-eslint/consistent-type-imports
type Lib = typeof import('snowflake-sdk');
export interface SnowflakeConnection extends Connection, Snowflake.Connection {}

export class SnowflakeConnectionManager extends AbstractConnectionManager<
SnowflakeDialect,
SnowflakeConnection
> {
private readonly lib: Lib;
readonly #lib: typeof Snowflake;

constructor(dialect: SnowflakeDialect) {
super(dialect);
this.lib = this._loadDialectModule('snowflake-sdk') as Lib;
this.#lib = Snowflake;
}

/**
Expand All @@ -46,7 +38,7 @@ export class SnowflakeConnectionManager extends AbstractConnectionManager<
* @private
*/
async connect(config: ConnectionOptions): Promise<SnowflakeConnection> {
const connectionConfig: SnowflakeSdkConnectionOptions = {
const connectionConfig: Snowflake.ConnectionOptions = {
account: config.host!,
username: config.username!,
password: config.password!,
Expand All @@ -59,7 +51,7 @@ export class SnowflakeConnectionManager extends AbstractConnectionManager<
};

try {
const connection = this.lib.createConnection(connectionConfig) as SnowflakeConnection;
const connection = this.#lib.createConnection(connectionConfig) as SnowflakeConnection;

await new Promise<void>((resolve, reject) => {
connection.connect(err => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import type { Sequelize } from '../../sequelize.js';
import { createUnspecifiedOrderedBindCollector } from '../../utils/sql';
import { AbstractDialect } from '../abstract';
import { SnowflakeConnectionManager } from './connection-manager';
import * as DataTypes from './data-types.js';
import { SnowflakeQuery } from './query';
import { SnowflakeQueryGenerator } from './query-generator';
import type { Sequelize } from '@sequelize/core';
import { AbstractDialect } from '@sequelize/core';
import { createUnspecifiedOrderedBindCollector } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/sql.js';
import * as DataTypes from './_internal/data-types-overrides.js';
import { SnowflakeConnectionManager } from './connection-manager.js';
import { SnowflakeQueryGenerator } from './query-generator.js';
import { SnowflakeQueryInterface } from './query-interface.js';
import { SnowflakeQuery } from './query.js';

export class SnowflakeDialect extends AbstractDialect {
static supports = AbstractDialect.extendSupport({
Expand Down
7 changes: 7 additions & 0 deletions packages/snowflake/src/index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import Pkg from './index.js';

export const SnowflakeConnectionManager = Pkg.SnowflakeConnectionManager;
export const SnowflakeDialect = Pkg.SnowflakeDialect;
export const SnowflakeQueryGenerator = Pkg.SnowflakeQueryGenerator;
export const SnowflakeQueryInterface = Pkg.SnowflakeQueryInterface;
export const SnowflakeQuery = Pkg.SnowflakeQuery;
7 changes: 7 additions & 0 deletions packages/snowflake/src/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
/** Generated File, do not modify directly. Run "yarn sync-exports" in the folder of the package instead */

export * from './connection-manager.js';
export * from './dialect.js';
export * from './query-generator.js';
export * from './query-interface.js';
export * from './query.js';
Original file line number Diff line number Diff line change
@@ -1,15 +1,3 @@
import { Op } from '../../operators.js';
import { rejectInvalidOptions } from '../../utils/check';
import { joinSQLFragments } from '../../utils/join-sql-fragments';
import { EMPTY_SET } from '../../utils/object.js';
import { AbstractQueryGenerator } from '../abstract/query-generator';
import {
CREATE_DATABASE_QUERY_SUPPORTABLE_OPTIONS,
LIST_DATABASES_QUERY_SUPPORTABLE_OPTIONS,
SHOW_CONSTRAINTS_QUERY_SUPPORTABLE_OPTIONS,
START_TRANSACTION_QUERY_SUPPORTABLE_OPTIONS,
TRUNCATE_TABLE_QUERY_SUPPORTABLE_OPTIONS,
} from '../abstract/query-generator-typescript';
import type {
CreateDatabaseQueryOptions,
ListDatabasesQueryOptions,
Expand All @@ -19,9 +7,20 @@ import type {
StartTransactionQueryOptions,
TableOrModel,
TruncateTableQueryOptions,
} from '../abstract/query-generator.types';
import type { SnowflakeDialect } from './index.js';
import { SnowflakeQueryGeneratorInternal } from './query-generator-internal.js';
} from '@sequelize/core';
import { AbstractQueryGenerator, Op } from '@sequelize/core';
import {
CREATE_DATABASE_QUERY_SUPPORTABLE_OPTIONS,
LIST_DATABASES_QUERY_SUPPORTABLE_OPTIONS,
SHOW_CONSTRAINTS_QUERY_SUPPORTABLE_OPTIONS,
START_TRANSACTION_QUERY_SUPPORTABLE_OPTIONS,
TRUNCATE_TABLE_QUERY_SUPPORTABLE_OPTIONS,
} from '@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/abstract/query-generator-typescript.js';
import { rejectInvalidOptions } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/check.js';
import { joinSQLFragments } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/join-sql-fragments.js';
import { EMPTY_SET } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/object.js';
import type { SnowflakeDialect } from './dialect.js';
import { SnowflakeQueryGeneratorInternal } from './query-generator.internal.js';

const SHOW_CONSTRAINTS_QUERY_SUPPORTED_OPTIONS = new Set<keyof ShowConstraintsQueryOptions>([
'constraintName',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { SnowflakeQueryGeneratorTypeScript } from './query-generator-typescript.js';
import { SnowflakeQueryGeneratorTypeScript } from './query-generator-typescript.internal.js';

export class SnowflakeQueryGenerator extends SnowflakeQueryGeneratorTypeScript {}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { AbstractQueryGeneratorInternal } from '../abstract/query-generator-internal.js';
import type { AddLimitOffsetOptions } from '../abstract/query-generator.internal-types.js';
import type { SnowflakeDialect } from './index.js';
import { AbstractQueryGeneratorInternal } from '@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/abstract/query-generator-internal.js';
import type { AddLimitOffsetOptions } from '@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/abstract/query-generator.internal-types.js';
import type { SnowflakeDialect } from './dialect.js';

const TECHNICAL_SCHEMA_NAMES = Object.freeze([
'INFORMATION_SCHEMA',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
'use strict';

import { rejectInvalidOptions } from '../../utils/check';
import { quoteIdentifier } from '../../utils/dialect.js';
import { joinSQLFragments } from '../../utils/join-sql-fragments';
import { EMPTY_SET } from '../../utils/object.js';
import { defaultValueSchemable } from '../../utils/query-builder-utils';
import {
ADD_COLUMN_QUERY_SUPPORTABLE_OPTIONS,
CREATE_TABLE_QUERY_SUPPORTABLE_OPTIONS,
} from '../abstract/query-generator';

} from '@sequelize/core/_non-semver-use-at-your-own-risk_/dialects/abstract/query-generator.js';
import { rejectInvalidOptions } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/check.js';
import { quoteIdentifier } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/dialect.js';
import { joinSQLFragments } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/join-sql-fragments.js';
import { EMPTY_SET } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/object.js';
import { defaultValueSchemable } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/query-builder-utils.js';
import each from 'lodash/each';
import isPlainObject from 'lodash/isPlainObject';

const { SnowflakeQueryGeneratorTypeScript } = require('./query-generator-typescript');
import { SnowflakeQueryGeneratorTypeScript } from './query-generator-typescript.internal.js';

/**
* list of reserved words in Snowflake
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { AbstractQueryInterface } from '../abstract/query-interface.js';
import type { SnowflakeDialect } from './index.js';
import { AbstractQueryInterface } from '@sequelize/core';
import type { SnowflakeDialect } from './dialect.js';

export class SnowflakeQueryInterface<
Dialect extends SnowflakeDialect = SnowflakeDialect,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import { AbstractQuery } from '../abstract/query.js';
import { AbstractQuery } from '@sequelize/core';

export class SnowflakeQuery extends AbstractQuery {}
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
'use strict';

import {
AbstractQuery,
DatabaseError,
ForeignKeyConstraintError,
UniqueConstraintError,
ValidationErrorItem,
} from '@sequelize/core';
import { logger } from '@sequelize/core/_non-semver-use-at-your-own-risk_/utils/logger.js';
import forOwn from 'lodash/forOwn';
import map from 'lodash/map';
import mapKeys from 'lodash/mapKeys';
import reduce from 'lodash/reduce';
import zipObject from 'lodash/zipObject';

const { AbstractQuery } = require('../abstract/query');
const sequelizeErrors = require('../../errors');
const { logger } = require('../../utils/logger');

const ER_DUP_ENTRY = 1062;
const ER_DEADLOCK = 1213;
const ER_ROW_IS_REFERENCED = 1451;
Expand Down Expand Up @@ -223,9 +227,9 @@ export class SnowflakeQuery extends AbstractQuery {
const errors = [];
forOwn(fields, (value, field) => {
errors.push(
new sequelizeErrors.ValidationErrorItem(
new ValidationErrorItem(
this.getUniqueConstraintErrorMessage(field),
'unique violation', // sequelizeErrors.ValidationErrorItem.Origins.DB,
'unique violation', // ValidationErrorItem.Origins.DB,
field,
value,
this.instance,
Expand All @@ -234,7 +238,7 @@ export class SnowflakeQuery extends AbstractQuery {
);
});

return new sequelizeErrors.UniqueConstraintError({ message, errors, cause: err, fields });
return new UniqueConstraintError({ message, errors, cause: err, fields });
}

case ER_ROW_IS_REFERENCED:
Expand All @@ -248,7 +252,7 @@ export class SnowflakeQuery extends AbstractQuery {
? match[3].split(new RegExp(`${quoteChar}, *${quoteChar}`))
: undefined;

return new sequelizeErrors.ForeignKeyConstraintError({
return new ForeignKeyConstraintError({
reltype: String(errCode) === String(ER_ROW_IS_REFERENCED) ? 'parent' : 'child',
table: match ? match[4] : undefined,
fields,
Expand All @@ -260,7 +264,7 @@ export class SnowflakeQuery extends AbstractQuery {
}

default:
return new sequelizeErrors.DatabaseError(err);
return new DatabaseError(err);
}
}

Expand Down
8 changes: 8 additions & 0 deletions packages/snowflake/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"extends": "../../tsconfig-preset.json",
"compilerOptions": {
"outDir": "./lib",
"rootDir": "./src"
},
"include": ["./src/**/*.ts"]
}
5 changes: 5 additions & 0 deletions packages/snowflake/typedoc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"extends": ["../../typedoc.base.json"],
"entryPoints": ["src/index.ts"],
"excludeExternals": true
}

0 comments on commit 54f1e18

Please sign in to comment.