Skip to content

Commit 54bd629

Browse files
committed
breeze-sequelize 0.4.1: Separate entityQueryFromUrl function from EntityQuery; change to using peerDependencies; add some comments
1 parent f2bda31 commit 54bd629

File tree

10 files changed

+53
-28
lines changed

10 files changed

+53
-28
lines changed

breeze-sequelize/src/MetadataMapper.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,17 @@ import * as utils from "./utils";
55

66
let log = utils.log;
77

8+
/** Map name to Sequelize Model type */
89
export interface NameModelMap { [modelName: string]: { new(): Model } & typeof Model };
910

1011
// TODO: still need to handle inherited entity types - TPT
1112
/** Maps Breeze metadata to Sequelize Models */
1213
export class MetadataMapper {
13-
sequelize: Sequelize
14-
metadataStore: MetadataStore;
14+
readonly sequelize: Sequelize
15+
readonly metadataStore: MetadataStore;
16+
/** Maps entity type name to Sequelize Model */
1517
entityTypeSqModelMap: NameModelMap;
18+
/** Maps resource name to Sequelize Model */
1619
resourceNameSqModelMap: NameModelMap;
1720

1821
constructor(breezeMetadata: MetadataStore | string | Object, sequelize: Sequelize) {

breeze-sequelize/src/SQVisitor.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { FindOptions, IncludeOptions, LogicType, Op, Sequelize, WhereOptions } f
55
import { Where } from "sequelize/types/lib/utils";
66
import { SqVisitContext } from "./SequelizeQuery";
77

8+
/** Result of processing a query expression into Sequelize */
89
export interface ExprResult {
910
include: IncludeOptions[],
1011
lastInclude: IncludeOptions,

breeze-sequelize/src/SequelizeManager.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@ export class SequelizeManager {
1717
sequelizeOptions: Options;
1818
dbConfig: DbConfig;
1919
sequelize: Sequelize;
20+
/** Same as resourceNameSqModelMap */
2021
models: NameModelMap;
22+
/** Maps resource name to Sequelize Model */
2123
resourceNameSqModelMap: NameModelMap;
24+
/** Maps entity type name to Sequelize Model */
2225
entityTypeSqModelMap: NameModelMap;
2326
metadataStore: MetadataStore;
27+
/** Generates keys for entity types where autoGeneratedKeyType = "KeyGenerator" */
2428
keyGenerator: KeyGenerator;
2529

2630
constructor(dbConfig: DbConfig, sequelizeOptions: Options) {

breeze-sequelize/src/SequelizeQuery.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import { SequelizeManager } from "./SequelizeManager";
55
import * as urlUtils from "url";
66
import { toSQVisitor } from "./SQVisitor";
77

8-
// patch Breeze EntityQuery for server-side use
9-
// TODO make this a method on SequelizeQuery, so we don't have to patch Breeze?
10-
EntityQuery['fromUrl'] = function (url: string, resourceName: string) {
8+
/** Create an EntityQuery from a JSON-format breeze query string
9+
* @param url - url containing query, e.g. `/orders?{freight:{">":100}}`
10+
* @param resourceName - Name of the resource/entity. If omitted, resourceName is derived from the pathname of the url.
11+
*/
12+
export function entityQueryFromUrl(url: string, resourceName?: string): EntityQuery {
1113
let parsedUrl = urlUtils.parse(url, true);
1214
resourceName = resourceName || parsedUrl.pathname;
1315
// this is because everything after the '?' is turned into a query object with a single key
@@ -23,14 +25,19 @@ EntityQuery['fromUrl'] = function (url: string, resourceName: string) {
2325
// for debugging
2426
entityQuery['jsonQuery'] = jsonQuery;
2527
return entityQuery;
26-
}
28+
}
29+
30+
// patch Breeze EntityQuery for server-side use
31+
// TODO make this a method on SequelizeQuery, so we don't have to patch Breeze?
32+
EntityQuery['fromUrl'] = entityQueryFromUrl;
2733

2834
export interface SequelizeQueryOptions {
2935
useTransaction: boolean;
3036
beforeQueryEntities: (sq: SequelizeQuery) => void;
3137
}
3238

33-
interface CountModel {
39+
/** Object returned from a query with inlineCountEnabled */
40+
export interface CountModel {
3441
rows: Model[];
3542
count: number;
3643
}

breeze-sequelize/src/SequelizeSaveHandler.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import { Model, Transaction } from "sequelize";
66
import { KeyGenerator, SequelizeManager } from "./SequelizeManager";
77
let toposort = require("toposort") as (ar: any[]) => any[];
88

9-
9+
/** Save bundle from breeze client */
1010
export interface SaveRequest {
11-
body: { entities: Entity[], saveOptions: SaveOptions }
11+
body: { entities: Entity[], saveOptions?: SaveOptions }
1212
}
1313

1414
interface EntityGroup {
@@ -18,15 +18,18 @@ interface EntityGroup {
1818

1919
/** Handles saving entities from Breeze SaveChanges requests */
2020
export class SequelizeSaveHandler {
21-
sequelizeManager: SequelizeManager;
22-
metadataStore: MetadataStore;
23-
entitiesFromClient: Entity[];
21+
readonly sequelizeManager: SequelizeManager;
22+
readonly metadataStore: MetadataStore;
23+
readonly entitiesFromClient: Entity[];
2424
saveOptions: SaveOptions;
2525
private _keyMappings: KeyMapping[];
2626
private _fkFixupMap: { [entityKeyName: string]: any };
2727
private _savedEntities: Entity[];
28+
/** Generates keys for entity types where autoGeneratedKeyType = "KeyGenerator" */
2829
keyGenerator: KeyGenerator;
29-
beforeSaveEntity: (ei: EntityInfo) => EntityInfo;
30+
/** Process an entity before save. If false is returned, entity is not saved. */
31+
beforeSaveEntity: (ei: EntityInfo) => boolean;
32+
/** Process all entities before save. The entities in the returned SaveMap are saved. */
3033
beforeSaveEntities: (sm: SaveMap, trx?: Transaction) => SaveMap;
3134

3235
/** Create an instance for the given save request */
@@ -44,7 +47,7 @@ export class SequelizeSaveHandler {
4447

4548
}
4649

47-
/** Save the entities in the save request */
50+
/** Save the entities in the save request, returning either the saved entities or an error collection */
4851
save(): Promise<{ errors: ServerEntityError[], message: string }> | Promise<Entity[]> {
4952
let beforeSaveEntity = (this.beforeSaveEntity || noopBeforeSaveEntity).bind(this);
5053
let entityTypeMap = {};

breeze-sequelize/src/dbUtils.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ let log = utils.log;
66
exports.connect = connect;
77
exports.createDb = createDb;
88

9+
/** Config for connecting to a database */
910
export interface DbConfig {
1011
dbName: string;
1112
user: string;
1213
password: string;
1314
}
1415

15-
/** @returns Promise<"success"> or throws an error */
16+
/** Connect to existing database.
17+
* @returns Promise<"success"> or throws an error */
1618
export function connect(dbConfig: DbConfig, sequelizeOptions: Options): Promise<string> {
1719

1820
let sequelize = new Sequelize(dbConfig.dbName, dbConfig.user, dbConfig.password, sequelizeOptions);
@@ -26,7 +28,8 @@ export function connect(dbConfig: DbConfig, sequelizeOptions: Options): Promise<
2628
});
2729
};
2830

29-
/** @returns Promise<void> or throws an error */
31+
/** Create new database.
32+
* @returns Promise<void> or throws an error */
3033
export function createDb(dbConfig: DbConfig, sequelizeOptions: Options): Promise<void> {
3134
let sequelize = new Sequelize(null, dbConfig.user, dbConfig.password, sequelizeOptions);
3235
let statement = 'CREATE DATABASE ' + dbConfig.dbName;

breeze-sequelize/src/main.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import { SequelizeQuery } from "./SequelizeQuery";
1+
import { SequelizeQuery, entityQueryFromUrl } from "./SequelizeQuery";
22
import { SequelizeManager } from "./SequelizeManager";
33
import { SequelizeSaveHandler } from "./SequelizeSaveHandler";
44
import * as utils from "./utils";
55
import * as dbUtils from "./dbUtils";
66
import { breeze } from "breeze-client";
77

88
const Sequelize = SequelizeManager.Sequelize;
9-
export { SequelizeQuery, SequelizeManager, Sequelize, SequelizeSaveHandler, utils, dbUtils, breeze }
9+
export { SequelizeQuery, entityQueryFromUrl, SequelizeManager, Sequelize, SequelizeSaveHandler, utils, dbUtils, breeze }

breeze-sequelize/src/package.json

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "breeze-sequelize",
3-
"version": "0.4.0",
3+
"version": "0.4.1",
44
"description": "Breeze Sequelize server implementation",
55
"keywords": [
66
"breeze",
@@ -19,21 +19,23 @@
1919
],
2020
"directories": {},
2121
"dependencies": {
22+
"toposort": "^2.0.2"
23+
},
24+
"peerDependencies": {
2225
"bluebird": "^3.7.2",
23-
"breeze-client": ">=2.0.3",
26+
"breeze-client": ">=2.0.4",
2427
"lodash": "^4.17.15",
25-
"sequelize": "^5.21.3",
26-
"toposort": "^2.0.2"
28+
"sequelize": "^5.21.3"
2729
},
2830
"devDependencies": {
2931
"@types/bluebird": "^3.5.29",
3032
"@types/lodash": "^4.14.137",
31-
"@types/node": "^12.12.25",
33+
"@types/node": "^12.12.26",
3234
"@types/validator": "^12.0.1",
3335
"chai": "^4.2.0",
3436
"mocha": "^6.2.0",
35-
"rimraf": "^3.0.0",
36-
"typescript": "~3.4.5"
37+
"rimraf": "^3.0.1",
38+
"typescript": "^3.7.5"
3739
},
3840
"scripts": {
3941
"test": "mocha",

breeze-sequelize/src/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
1+
/** Wrapper around console.log. Use `log.enabled` to enable/disable */
22
export function log(s: any, ...args: any[]) {
33
if (!log['enabled']) return;
44
console.log('[Breeze] ' + s + '\n', args);

breeze-sequelize/test/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66
"directories": {},
77
"dependencies": {
88
"bluebird": "^3.7.2",
9-
"breeze-client": ">=2.0.3",
10-
"breeze-sequelize": ">=0.4.0",
9+
"breeze-client": ">=2.0.4",
10+
"breeze-sequelize": "^0.4.1",
1111
"lodash": "^4.17.15",
1212
"mysql": "^2.18.0",
1313
"mysql2": "^1.7.0",
14+
"sequelize": "^5.21.3",
1415
"uuid": "^3.4.0"
1516
},
1617
"devDependencies": {
@@ -21,6 +22,7 @@
2122
"scripts": {
2223
"test": "mocha",
2324
"debug": "node --inspect-brk node_modules/mocha/bin/mocha -b",
25+
"install-lib": "npm install ../src/breeze-sequelize-0.4.1.tgz",
2426
"gen-model": "sequelize-auto -o \"./models\" -d northwindib -h localhost -u mysql -p 3306 -x mysql -e mysql"
2527
},
2628
"repository": {

0 commit comments

Comments
 (0)