@proteinjs/db 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/dist/generated/index.d.ts +11 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +59 -0
- package/dist/generated/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/index.js.map +1 -0
- package/dist/src/Columns.d.ts +100 -0
- package/dist/src/Columns.d.ts.map +1 -0
- package/dist/src/Columns.js +381 -0
- package/dist/src/Columns.js.map +1 -0
- package/dist/src/Db.d.ts +46 -0
- package/dist/src/Db.d.ts.map +1 -0
- package/dist/src/Db.js +393 -0
- package/dist/src/Db.js.map +1 -0
- package/dist/src/MigrationRunner.d.ts +10 -0
- package/dist/src/MigrationRunner.d.ts.map +1 -0
- package/dist/src/MigrationRunner.js +124 -0
- package/dist/src/MigrationRunner.js.map +1 -0
- package/dist/src/QueryBuilderFactory.d.ts +8 -0
- package/dist/src/QueryBuilderFactory.d.ts.map +1 -0
- package/dist/src/QueryBuilderFactory.js +21 -0
- package/dist/src/QueryBuilderFactory.js.map +1 -0
- package/dist/src/Record.d.ts +38 -0
- package/dist/src/Record.d.ts.map +1 -0
- package/dist/src/Record.js +209 -0
- package/dist/src/Record.js.map +1 -0
- package/dist/src/RecordIterator.d.ts +13 -0
- package/dist/src/RecordIterator.d.ts.map +1 -0
- package/dist/src/RecordIterator.js +98 -0
- package/dist/src/RecordIterator.js.map +1 -0
- package/dist/src/StatementConfigFactory.d.ts +11 -0
- package/dist/src/StatementConfigFactory.d.ts.map +1 -0
- package/dist/src/StatementConfigFactory.js +31 -0
- package/dist/src/StatementConfigFactory.js.map +1 -0
- package/dist/src/Table.d.ts +98 -0
- package/dist/src/Table.d.ts.map +1 -0
- package/dist/src/Table.js +56 -0
- package/dist/src/Table.js.map +1 -0
- package/dist/src/auth/TableAuth.d.ts +29 -0
- package/dist/src/auth/TableAuth.d.ts.map +1 -0
- package/dist/src/auth/TableAuth.js +45 -0
- package/dist/src/auth/TableAuth.js.map +1 -0
- package/dist/src/auth/TableServiceAuth.d.ts +5 -0
- package/dist/src/auth/TableServiceAuth.d.ts.map +1 -0
- package/dist/src/auth/TableServiceAuth.js +37 -0
- package/dist/src/auth/TableServiceAuth.js.map +1 -0
- package/dist/src/opt/moment.d.ts +4 -0
- package/dist/src/opt/moment.d.ts.map +1 -0
- package/dist/src/opt/moment.js +9 -0
- package/dist/src/opt/moment.js.map +1 -0
- package/dist/src/reference/Reference.d.ts +26 -0
- package/dist/src/reference/Reference.d.ts.map +1 -0
- package/dist/src/reference/Reference.js +90 -0
- package/dist/src/reference/Reference.js.map +1 -0
- package/dist/src/reference/ReferenceArray.d.ts +29 -0
- package/dist/src/reference/ReferenceArray.d.ts.map +1 -0
- package/dist/src/reference/ReferenceArray.js +101 -0
- package/dist/src/reference/ReferenceArray.js.map +1 -0
- package/dist/src/schema/SchemaMetadata.d.ts +27 -0
- package/dist/src/schema/SchemaMetadata.d.ts.map +1 -0
- package/dist/src/schema/SchemaMetadata.js +227 -0
- package/dist/src/schema/SchemaMetadata.js.map +1 -0
- package/dist/src/schema/SchemaOperations.d.ts +40 -0
- package/dist/src/schema/SchemaOperations.d.ts.map +1 -0
- package/dist/src/schema/SchemaOperations.js +3 -0
- package/dist/src/schema/SchemaOperations.js.map +1 -0
- package/dist/src/schema/TableManager.d.ts +21 -0
- package/dist/src/schema/TableManager.d.ts.map +1 -0
- package/dist/src/schema/TableManager.js +254 -0
- package/dist/src/schema/TableManager.js.map +1 -0
- package/dist/src/serializers/GraphSerializer.d.ts +13 -0
- package/dist/src/serializers/GraphSerializer.d.ts.map +1 -0
- package/dist/src/serializers/GraphSerializer.js +21 -0
- package/dist/src/serializers/GraphSerializer.js.map +1 -0
- package/dist/src/serializers/QueryBuilderSerializer.d.ts +19 -0
- package/dist/src/serializers/QueryBuilderSerializer.d.ts.map +1 -0
- package/dist/src/serializers/QueryBuilderSerializer.js +32 -0
- package/dist/src/serializers/QueryBuilderSerializer.js.map +1 -0
- package/dist/src/serializers/ReferenceArraySerializer.d.ts +15 -0
- package/dist/src/serializers/ReferenceArraySerializer.d.ts.map +1 -0
- package/dist/src/serializers/ReferenceArraySerializer.js +23 -0
- package/dist/src/serializers/ReferenceArraySerializer.js.map +1 -0
- package/dist/src/serializers/ReferenceSerializer.d.ts +15 -0
- package/dist/src/serializers/ReferenceSerializer.d.ts.map +1 -0
- package/dist/src/serializers/ReferenceSerializer.js +23 -0
- package/dist/src/serializers/ReferenceSerializer.js.map +1 -0
- package/dist/src/serializers/TableSerializer.d.ts +13 -0
- package/dist/src/serializers/TableSerializer.d.ts.map +1 -0
- package/dist/src/serializers/TableSerializer.js +19 -0
- package/dist/src/serializers/TableSerializer.js.map +1 -0
- package/dist/src/services/DbService.d.ts +19 -0
- package/dist/src/services/DbService.d.ts.map +1 -0
- package/dist/src/services/DbService.js +6 -0
- package/dist/src/services/DbService.js.map +1 -0
- package/dist/src/services/MigrationRunnerService.d.ts +6 -0
- package/dist/src/services/MigrationRunnerService.d.ts.map +1 -0
- package/dist/src/services/MigrationRunnerService.js +6 -0
- package/dist/src/services/MigrationRunnerService.js.map +1 -0
- package/dist/src/source/SourceRecord.d.ts +44 -0
- package/dist/src/source/SourceRecord.d.ts.map +1 -0
- package/dist/src/source/SourceRecord.js +49 -0
- package/dist/src/source/SourceRecord.js.map +1 -0
- package/dist/src/source/SourceRecordLoader.d.ts +6 -0
- package/dist/src/source/SourceRecordLoader.d.ts.map +1 -0
- package/dist/src/source/SourceRecordLoader.js +156 -0
- package/dist/src/source/SourceRecordLoader.js.map +1 -0
- package/dist/src/source/SourceRecordRepo.d.ts +8 -0
- package/dist/src/source/SourceRecordRepo.d.ts.map +1 -0
- package/dist/src/source/SourceRecordRepo.js +20 -0
- package/dist/src/source/SourceRecordRepo.js.map +1 -0
- package/dist/src/tables/MigrationTable.d.ts +41 -0
- package/dist/src/tables/MigrationTable.d.ts.map +1 -0
- package/dist/src/tables/MigrationTable.js +86 -0
- package/dist/src/tables/MigrationTable.js.map +1 -0
- package/dist/src/tables/tables.d.ts +6 -0
- package/dist/src/tables/tables.d.ts.map +1 -0
- package/dist/src/tables/tables.js +8 -0
- package/dist/src/tables/tables.js.map +1 -0
- package/dist/test/CrudTests.d.ts +20 -0
- package/dist/test/CrudTests.d.ts.map +1 -0
- package/dist/test/CrudTests.js +251 -0
- package/dist/test/CrudTests.js.map +1 -0
- package/dist/test/TableManagerTests.d.ts +8 -0
- package/dist/test/TableManagerTests.d.ts.map +1 -0
- package/dist/test/TableManagerTests.js +687 -0
- package/dist/test/TableManagerTests.js.map +1 -0
- package/generated/index.ts +55 -0
- package/index.ts +25 -0
- package/jest.config.js +18 -0
- package/package.json +45 -0
- package/src/Columns.ts +257 -0
- package/src/Db.ts +195 -0
- package/src/MigrationRunner.ts +62 -0
- package/src/QueryBuilderFactory.ts +18 -0
- package/src/Record.ts +113 -0
- package/src/RecordIterator.ts +44 -0
- package/src/StatementConfigFactory.ts +36 -0
- package/src/Table.ts +124 -0
- package/src/auth/TableAuth.ts +60 -0
- package/src/auth/TableServiceAuth.ts +32 -0
- package/src/opt/moment.ts +4 -0
- package/src/reference/Reference.ts +45 -0
- package/src/reference/ReferenceArray.ts +56 -0
- package/src/schema/SchemaMetadata.ts +115 -0
- package/src/schema/SchemaOperations.ts +44 -0
- package/src/schema/TableManager.ts +198 -0
- package/src/serializers/GraphSerializer.ts +22 -0
- package/src/serializers/QueryBuilderSerializer.ts +39 -0
- package/src/serializers/ReferenceArraySerializer.ts +26 -0
- package/src/serializers/ReferenceSerializer.ts +26 -0
- package/src/serializers/TableSerializer.ts +20 -0
- package/src/services/DbService.ts +19 -0
- package/src/services/MigrationRunnerService.ts +7 -0
- package/src/source/SourceRecord.ts +75 -0
- package/src/source/SourceRecordLoader.ts +68 -0
- package/src/source/SourceRecordRepo.ts +17 -0
- package/src/tables/MigrationTable.ts +36 -0
- package/src/tables/tables.ts +6 -0
- package/test/CrudTests.ts +110 -0
- package/test/TableManagerTests.ts +382 -0
- package/tsconfig.json +23 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableServiceAuth.d.ts","sourceRoot":"","sources":["../../../src/auth/TableServiceAuth.ts"],"names":[],"mappings":"AAIA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAqC;IAEnD,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO;CAwBpD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TableServiceAuth = void 0;
|
|
4
|
+
var util_1 = require("@proteinjs/util");
|
|
5
|
+
var Table_1 = require("../Table");
|
|
6
|
+
var TableAuth_1 = require("./TableAuth");
|
|
7
|
+
var TableServiceAuth = /** @class */ (function () {
|
|
8
|
+
function TableServiceAuth() {
|
|
9
|
+
this.logger = new util_1.Logger(this.constructor.name);
|
|
10
|
+
}
|
|
11
|
+
TableServiceAuth.prototype.canAccess = function (methodName, args) {
|
|
12
|
+
try {
|
|
13
|
+
var table = args[0];
|
|
14
|
+
if (!(table instanceof Table_1.Table))
|
|
15
|
+
throw new Error("[DbServiceAuth] Expected first arg to be a table");
|
|
16
|
+
var tableAuth = new TableAuth_1.TableAuth();
|
|
17
|
+
if (methodName === 'get' || methodName == 'query' || methodName == 'getRowCount')
|
|
18
|
+
tableAuth.canQuery(table, 'service');
|
|
19
|
+
else if (methodName === 'insert')
|
|
20
|
+
tableAuth.canInsert(table, 'service');
|
|
21
|
+
else if (methodName === 'update')
|
|
22
|
+
tableAuth.canUpdate(table, 'service');
|
|
23
|
+
else if (methodName === 'delete')
|
|
24
|
+
tableAuth.canDelete(table, 'service');
|
|
25
|
+
else
|
|
26
|
+
throw new Error("User is not authorized to access unsupported Db service api: ".concat(methodName));
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
this.logger.error(error.stack);
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return true;
|
|
33
|
+
};
|
|
34
|
+
return TableServiceAuth;
|
|
35
|
+
}());
|
|
36
|
+
exports.TableServiceAuth = TableServiceAuth;
|
|
37
|
+
//# sourceMappingURL=TableServiceAuth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TableServiceAuth.js","sourceRoot":"","sources":["../../../src/auth/TableServiceAuth.ts"],"names":[],"mappings":";;;AAAA,wCAAyC;AACzC,kCAAiC;AACjC,yCAAwC;AAExC;IAAA;QACU,WAAM,GAAG,IAAI,aAAM,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IA0BrD,CAAC;IAxBC,oCAAS,GAAT,UAAU,UAAkB,EAAE,IAAW;QACvC,IAAI;YACF,IAAM,KAAK,GAAyB,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,CAAC,KAAK,YAAY,aAAK,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAEtE,IAAM,SAAS,GAAG,IAAI,qBAAS,EAAE,CAAC;YAClC,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,IAAI,OAAO,IAAI,UAAU,IAAI,aAAa;gBAC9E,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;iBAClC,IAAI,UAAU,KAAK,QAAQ;gBAC9B,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;iBACnC,IAAI,UAAU,KAAK,QAAQ;gBAC9B,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;iBACnC,IAAI,UAAU,KAAK,QAAQ;gBAC9B,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;;gBAEtC,MAAM,IAAI,KAAK,CAAC,uEAAgE,UAAU,CAAE,CAAC,CAAC;SACjG;QAAC,OAAO,KAAU,EAAE;YACnB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IACH,uBAAC;AAAD,CAAC,AA3BD,IA2BC;AA3BY,4CAAgB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moment.d.ts","sourceRoot":"","sources":["../../../src/opt/moment.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.moment = void 0;
|
|
7
|
+
var moment_1 = __importDefault(require("moment"));
|
|
8
|
+
exports.moment = moment_1.default;
|
|
9
|
+
//# sourceMappingURL=moment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moment.js","sourceRoot":"","sources":["../../../src/opt/moment.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA4B;AAGX,iBAHV,gBAAM,CAGU"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { CustomSerializableObject } from '@proteinjs/serializer';
|
|
2
|
+
import { Record } from '../Record';
|
|
3
|
+
/**
|
|
4
|
+
* The object returned by Db functions for each field of type ReferenceColumn in a record.
|
|
5
|
+
* The reason for this is to make loading of reference records on-demand. For theoretically
|
|
6
|
+
* infinitely-nested references, this is necessary. For everything else, this is optimal.
|
|
7
|
+
*
|
|
8
|
+
* Note: updating the reference via set does not automatically persist those changes in the db.
|
|
9
|
+
* You still need to call Db.update on the record as you would when changing any other field on the record.
|
|
10
|
+
*
|
|
11
|
+
* Note: all instance members are internal state, made public for ReferenceArraySerializer.
|
|
12
|
+
* Only get() and set() should be used.
|
|
13
|
+
*/
|
|
14
|
+
export declare class Reference<T extends Record> implements CustomSerializableObject {
|
|
15
|
+
_table: string;
|
|
16
|
+
_id?: string | undefined;
|
|
17
|
+
_object?: T | undefined;
|
|
18
|
+
__serializerId: string;
|
|
19
|
+
constructor(_table: string, _id?: string | undefined, _object?: T | undefined);
|
|
20
|
+
static fromObject<T extends Record>(table: string, object: T | (Partial<T> & {
|
|
21
|
+
id: string;
|
|
22
|
+
})): Reference<T>;
|
|
23
|
+
get(): Promise<T | undefined>;
|
|
24
|
+
set(object: T): void;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=Reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reference.d.ts","sourceRoot":"","sources":["../../../src/reference/Reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAInC;;;;;;;;;;GAUG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,wBAAwB;IAIjE,MAAM,EAAE,MAAM;IACd,GAAG,CAAC;IACJ,OAAO,CAAC;IALV,cAAc,SAAyB;gBAGrC,MAAM,EAAE,MAAM,EACd,GAAG,CAAC,oBAAQ,EACZ,OAAO,CAAC,eAAG;IAGpB,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAIpF,GAAG,IAAI,OAAO,CAAC,CAAC,GAAC,SAAS,CAAC;IAUjC,GAAG,CAAC,MAAM,EAAE,CAAC;CAId"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
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
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.Reference = void 0;
|
|
40
|
+
var Db_1 = require("../Db");
|
|
41
|
+
var Table_1 = require("../Table");
|
|
42
|
+
var ReferenceSerializer_1 = require("../serializers/ReferenceSerializer");
|
|
43
|
+
/**
|
|
44
|
+
* The object returned by Db functions for each field of type ReferenceColumn in a record.
|
|
45
|
+
* The reason for this is to make loading of reference records on-demand. For theoretically
|
|
46
|
+
* infinitely-nested references, this is necessary. For everything else, this is optimal.
|
|
47
|
+
*
|
|
48
|
+
* Note: updating the reference via set does not automatically persist those changes in the db.
|
|
49
|
+
* You still need to call Db.update on the record as you would when changing any other field on the record.
|
|
50
|
+
*
|
|
51
|
+
* Note: all instance members are internal state, made public for ReferenceArraySerializer.
|
|
52
|
+
* Only get() and set() should be used.
|
|
53
|
+
*/
|
|
54
|
+
var Reference = /** @class */ (function () {
|
|
55
|
+
function Reference(_table, _id, _object) {
|
|
56
|
+
this._table = _table;
|
|
57
|
+
this._id = _id;
|
|
58
|
+
this._object = _object;
|
|
59
|
+
this.__serializerId = ReferenceSerializer_1.ReferenceSerializerId;
|
|
60
|
+
}
|
|
61
|
+
Reference.fromObject = function (table, object) {
|
|
62
|
+
return new Reference(table, object.id, object);
|
|
63
|
+
};
|
|
64
|
+
Reference.prototype.get = function () {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
66
|
+
var table, db, _a;
|
|
67
|
+
return __generator(this, function (_b) {
|
|
68
|
+
switch (_b.label) {
|
|
69
|
+
case 0:
|
|
70
|
+
if (!(!this._object && this._id)) return [3 /*break*/, 2];
|
|
71
|
+
table = (0, Table_1.tableByName)(this._table);
|
|
72
|
+
db = (0, Db_1.getDb)();
|
|
73
|
+
_a = this;
|
|
74
|
+
return [4 /*yield*/, db.get(table, { id: this._id })];
|
|
75
|
+
case 1:
|
|
76
|
+
_a._object = _b.sent();
|
|
77
|
+
_b.label = 2;
|
|
78
|
+
case 2: return [2 /*return*/, this._object];
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
Reference.prototype.set = function (object) {
|
|
84
|
+
this._object = object;
|
|
85
|
+
this._id = object.id;
|
|
86
|
+
};
|
|
87
|
+
return Reference;
|
|
88
|
+
}());
|
|
89
|
+
exports.Reference = Reference;
|
|
90
|
+
//# sourceMappingURL=Reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Reference.js","sourceRoot":"","sources":["../../../src/reference/Reference.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4BAA8B;AAE9B,kCAAuC;AACvC,0EAA2E;AAE3E;;;;;;;;;;GAUG;AACH;IAGE,mBACS,MAAc,EACd,GAAY,EACZ,OAAW;QAFX,WAAM,GAAN,MAAM,CAAQ;QACd,QAAG,GAAH,GAAG,CAAS;QACZ,YAAO,GAAP,OAAO,CAAI;QALb,mBAAc,GAAG,2CAAqB,CAAC;IAM3C,CAAC;IAEG,oBAAU,GAAjB,UAAoC,KAAa,EAAE,MAAuC;QACxF,OAAO,IAAI,SAAS,CAAI,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,MAAW,CAAC,CAAC;IACzD,CAAC;IAEK,uBAAG,GAAT;;;;;;6BACM,CAAA,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAA,EAAzB,wBAAyB;wBACrB,KAAK,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACjC,EAAE,GAAG,IAAA,UAAK,GAAE,CAAC;wBACnB,KAAA,IAAI,CAAA;wBAAW,qBAAM,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,EAAA;;wBAApD,GAAK,OAAO,GAAG,SAAqC,CAAC;;4BAGvD,sBAAO,IAAI,CAAC,OAAO,EAAC;;;;KACrB;IAED,uBAAG,GAAH,UAAI,MAAS;QACX,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC;IACvB,CAAC;IACH,gBAAC;AAAD,CAAC,AA3BD,IA2BC;AA3BY,8BAAS"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CustomSerializableObject } from '@proteinjs/serializer';
|
|
2
|
+
import { Record } from '../Record';
|
|
3
|
+
/**
|
|
4
|
+
* The object returned by Db functions for each field of type ReferenceArrayColumn in a record.
|
|
5
|
+
* The reason for this is to make loading of reference records on-demand. For theoretically
|
|
6
|
+
* infinitely-nested references, this is necessary. For everything else, this is optimal.
|
|
7
|
+
*
|
|
8
|
+
* Note: generally only get() needs to be called. Array operations performed on the returned array will be
|
|
9
|
+
* persisted in ReferenceArray.
|
|
10
|
+
*
|
|
11
|
+
* Note: updating items in the returned array does not automatically persist those changes in the db.
|
|
12
|
+
* You still need to call Db.update on the record as you would when changing any other field on the record.
|
|
13
|
+
*
|
|
14
|
+
* Note: all instance members are internal state, made public for ReferenceArraySerializer.
|
|
15
|
+
* Only get() and set() should be used.
|
|
16
|
+
*/
|
|
17
|
+
export declare class ReferenceArray<T extends Record> implements CustomSerializableObject {
|
|
18
|
+
_table: string;
|
|
19
|
+
_ids: string[];
|
|
20
|
+
_objects?: T[] | undefined;
|
|
21
|
+
__serializerId: string;
|
|
22
|
+
constructor(_table: string, _ids: string[], _objects?: T[] | undefined);
|
|
23
|
+
static fromObjects<T extends Record>(table: string, objects: (T | (Partial<T> & {
|
|
24
|
+
id: string;
|
|
25
|
+
}))[]): ReferenceArray<T>;
|
|
26
|
+
get(): Promise<T[]>;
|
|
27
|
+
set(objects: T[]): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=ReferenceArray.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReferenceArray.d.ts","sourceRoot":"","sources":["../../../src/reference/ReferenceArray.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAKnC;;;;;;;;;;;;;GAaG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,wBAAwB;IAItE,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,MAAM,EAAE;IACd,QAAQ,CAAC;IALX,cAAc,SAA8B;gBAG1C,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,CAAC,iBAAK;IAGvB,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,GAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,EAAE;IAK1F,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAiBzB,GAAG,CAAC,OAAO,EAAE,CAAC,EAAE;CAGjB"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
18
|
+
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
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ReferenceArray = void 0;
|
|
40
|
+
var Db_1 = require("../Db");
|
|
41
|
+
var Table_1 = require("../Table");
|
|
42
|
+
var ReferenceArraySerializer_1 = require("../serializers/ReferenceArraySerializer");
|
|
43
|
+
var QueryBuilderFactory_1 = require("../QueryBuilderFactory");
|
|
44
|
+
/**
|
|
45
|
+
* The object returned by Db functions for each field of type ReferenceArrayColumn in a record.
|
|
46
|
+
* The reason for this is to make loading of reference records on-demand. For theoretically
|
|
47
|
+
* infinitely-nested references, this is necessary. For everything else, this is optimal.
|
|
48
|
+
*
|
|
49
|
+
* Note: generally only get() needs to be called. Array operations performed on the returned array will be
|
|
50
|
+
* persisted in ReferenceArray.
|
|
51
|
+
*
|
|
52
|
+
* Note: updating items in the returned array does not automatically persist those changes in the db.
|
|
53
|
+
* You still need to call Db.update on the record as you would when changing any other field on the record.
|
|
54
|
+
*
|
|
55
|
+
* Note: all instance members are internal state, made public for ReferenceArraySerializer.
|
|
56
|
+
* Only get() and set() should be used.
|
|
57
|
+
*/
|
|
58
|
+
var ReferenceArray = /** @class */ (function () {
|
|
59
|
+
function ReferenceArray(_table, _ids, _objects) {
|
|
60
|
+
this._table = _table;
|
|
61
|
+
this._ids = _ids;
|
|
62
|
+
this._objects = _objects;
|
|
63
|
+
this.__serializerId = ReferenceArraySerializer_1.ReferenceArraySerializerId;
|
|
64
|
+
}
|
|
65
|
+
ReferenceArray.fromObjects = function (table, objects) {
|
|
66
|
+
var ids = objects.map(function (object) { return object.id; });
|
|
67
|
+
return new ReferenceArray(table, ids, objects);
|
|
68
|
+
};
|
|
69
|
+
ReferenceArray.prototype.get = function () {
|
|
70
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
71
|
+
var table, db, qb, _a;
|
|
72
|
+
return __generator(this, function (_b) {
|
|
73
|
+
switch (_b.label) {
|
|
74
|
+
case 0:
|
|
75
|
+
if (!!this._objects) return [3 /*break*/, 3];
|
|
76
|
+
if (!(this._ids.length < 1)) return [3 /*break*/, 1];
|
|
77
|
+
this._objects = [];
|
|
78
|
+
return [3 /*break*/, 3];
|
|
79
|
+
case 1:
|
|
80
|
+
table = (0, Table_1.tableByName)(this._table);
|
|
81
|
+
db = (0, Db_1.getDb)();
|
|
82
|
+
qb = new QueryBuilderFactory_1.QueryBuilderFactory().getQueryBuilder(table);
|
|
83
|
+
qb.condition({ field: 'id', operator: 'IN', value: this._ids });
|
|
84
|
+
qb.sort([{ field: 'id', byValues: this._ids }]);
|
|
85
|
+
_a = this;
|
|
86
|
+
return [4 /*yield*/, db.query(table, qb)];
|
|
87
|
+
case 2:
|
|
88
|
+
_a._objects = _b.sent();
|
|
89
|
+
_b.label = 3;
|
|
90
|
+
case 3: return [2 /*return*/, this._objects];
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
};
|
|
95
|
+
ReferenceArray.prototype.set = function (objects) {
|
|
96
|
+
this._objects = objects;
|
|
97
|
+
};
|
|
98
|
+
return ReferenceArray;
|
|
99
|
+
}());
|
|
100
|
+
exports.ReferenceArray = ReferenceArray;
|
|
101
|
+
//# sourceMappingURL=ReferenceArray.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReferenceArray.js","sourceRoot":"","sources":["../../../src/reference/ReferenceArray.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4BAA8B;AAE9B,kCAAuC;AACvC,oFAAqF;AACrF,8DAA6D;AAE7D;;;;;;;;;;;;;GAaG;AACH;IAGE,wBACS,MAAc,EACd,IAAc,EACd,QAAc;QAFd,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAU;QACd,aAAQ,GAAR,QAAQ,CAAM;QALhB,mBAAc,GAAG,qDAA0B,CAAC;IAMhD,CAAC;IAEG,0BAAW,GAAlB,UAAqC,KAAa,EAAE,OAA4C;QAC9F,IAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAA,MAAM,IAAI,OAAA,MAAM,CAAC,EAAE,EAAT,CAAS,CAAC,CAAC;QAC7C,OAAO,IAAI,cAAc,CAAI,KAAK,EAAE,GAAG,EAAE,OAAc,CAAC,CAAC;IAC3D,CAAC;IAEK,4BAAG,GAAT;;;;;;6BACM,CAAC,IAAI,CAAC,QAAQ,EAAd,wBAAc;6BACZ,CAAA,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAA,EAApB,wBAAoB;wBACtB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;;;wBAEb,KAAK,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACjC,EAAE,GAAG,IAAA,UAAK,GAAE,CAAC;wBACb,EAAE,GAAG,IAAI,yCAAmB,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;wBAC5D,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;wBAChE,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;wBAChD,KAAA,IAAI,CAAA;wBAAY,qBAAM,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,EAAA;;wBAAzC,GAAK,QAAQ,GAAG,SAAyB,CAAC;;4BAI9C,sBAAO,IAAI,CAAC,QAAQ,EAAC;;;;KACtB;IAED,4BAAG,GAAH,UAAI,OAAY;QACd,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IACH,qBAAC;AAAD,CAAC,AAlCD,IAkCC;AAlCY,wCAAc"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Table } from '../Table';
|
|
2
|
+
import { DbDriver } from '../Db';
|
|
3
|
+
export declare class SchemaMetadata {
|
|
4
|
+
dbDriver: DbDriver;
|
|
5
|
+
private multiDbSupported;
|
|
6
|
+
constructor(dbDriver: DbDriver, multiDbSupported?: boolean);
|
|
7
|
+
tableExists(table: Table<any>): Promise<boolean>;
|
|
8
|
+
columnExists(columnName: string, table: Table<any>): Promise<boolean>;
|
|
9
|
+
getColumnMetadata(table: Table<any>): Promise<{
|
|
10
|
+
[columnName: string]: {
|
|
11
|
+
type: string;
|
|
12
|
+
isNullable: boolean;
|
|
13
|
+
};
|
|
14
|
+
}>;
|
|
15
|
+
getPrimaryKey(table: Table<any>): Promise<string[]>;
|
|
16
|
+
getForeignKeys(table: Table<any>): Promise<{
|
|
17
|
+
[columnName: string]: {
|
|
18
|
+
referencedTableName: string;
|
|
19
|
+
referencedColumnName: string;
|
|
20
|
+
};
|
|
21
|
+
}>;
|
|
22
|
+
getUniqueColumns(table: Table<any>): Promise<string[]>;
|
|
23
|
+
getIndexes(table: Table<any>): Promise<{
|
|
24
|
+
[keyName: string]: string[];
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=SchemaMetadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaMetadata.d.ts","sourceRoot":"","sources":["../../../src/schema/SchemaMetadata.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,qBAAa,cAAc;IAEhB,QAAQ,EAAE,QAAQ;IACzB,OAAO,CAAC,gBAAgB;gBADjB,QAAQ,EAAE,QAAQ,EACjB,gBAAgB,UAAO;IAG3B,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAOhD,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrE,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QAAC,CAAC,UAAU,EAAE,MAAM,GAAG;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,OAAO,CAAA;SAAE,CAAA;KAAC,CAAC;IAc5G,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAenD,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QAAC,CAAC,UAAU,EAAE,MAAM,GAAG;YAAE,mBAAmB,EAAE,MAAM,CAAC;YAAC,oBAAoB,EAAE,MAAM,CAAA;SAAE,CAAA;KAAC,CAAC;IAqBjI,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBtD,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;QAAC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAC,CAAC;CAkB5E"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
24
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
+
function step(op) {
|
|
27
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
+
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
+
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;
|
|
30
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
+
switch (op[0]) {
|
|
32
|
+
case 0: case 1: t = op; break;
|
|
33
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
+
default:
|
|
37
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
+
if (t[2]) _.ops.pop();
|
|
42
|
+
_.trys.pop(); continue;
|
|
43
|
+
}
|
|
44
|
+
op = body.call(thisArg, _);
|
|
45
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.SchemaMetadata = void 0;
|
|
51
|
+
var db_query_1 = require("@proteinjs/db-query");
|
|
52
|
+
var SchemaMetadata = /** @class */ (function () {
|
|
53
|
+
function SchemaMetadata(dbDriver, multiDbSupported) {
|
|
54
|
+
if (multiDbSupported === void 0) { multiDbSupported = true; }
|
|
55
|
+
this.dbDriver = dbDriver;
|
|
56
|
+
this.multiDbSupported = multiDbSupported;
|
|
57
|
+
}
|
|
58
|
+
SchemaMetadata.prototype.tableExists = function (table) {
|
|
59
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
60
|
+
var qb, generateStatement, results;
|
|
61
|
+
return __generator(this, function (_a) {
|
|
62
|
+
switch (_a.label) {
|
|
63
|
+
case 0:
|
|
64
|
+
qb = new db_query_1.QueryBuilder('TABLES').condition({ field: 'TABLE_NAME', operator: '=', value: table.name });
|
|
65
|
+
generateStatement = function (config) { return qb.toSql(__assign({ dbName: 'INFORMATION_SCHEMA' }, config)); };
|
|
66
|
+
return [4 /*yield*/, this.dbDriver.runQuery(generateStatement)];
|
|
67
|
+
case 1:
|
|
68
|
+
results = _a.sent();
|
|
69
|
+
return [2 /*return*/, results.length > 0];
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
SchemaMetadata.prototype.columnExists = function (columnName, table) {
|
|
75
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
76
|
+
var qb, generateStatement, results;
|
|
77
|
+
return __generator(this, function (_a) {
|
|
78
|
+
switch (_a.label) {
|
|
79
|
+
case 0:
|
|
80
|
+
qb = db_query_1.QueryBuilder.fromObject({
|
|
81
|
+
'TABLE_SCHEMA': this.multiDbSupported ? this.dbDriver.getDbName() : undefined,
|
|
82
|
+
'TABLE_NAME': table.name,
|
|
83
|
+
'COLUMN_NAME': columnName,
|
|
84
|
+
}, 'COLUMNS');
|
|
85
|
+
generateStatement = function (config) { return qb.toSql(__assign({ dbName: 'INFORMATION_SCHEMA' }, config)); };
|
|
86
|
+
return [4 /*yield*/, this.dbDriver.runQuery(generateStatement)];
|
|
87
|
+
case 1:
|
|
88
|
+
results = _a.sent();
|
|
89
|
+
return [2 /*return*/, results.length > 0];
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
SchemaMetadata.prototype.getColumnMetadata = function (table) {
|
|
95
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
96
|
+
var qb, generateStatement, results, columnMetadata, _i, results_1, row;
|
|
97
|
+
return __generator(this, function (_a) {
|
|
98
|
+
switch (_a.label) {
|
|
99
|
+
case 0:
|
|
100
|
+
qb = db_query_1.QueryBuilder.fromObject({
|
|
101
|
+
'TABLE_SCHEMA': this.multiDbSupported ? this.dbDriver.getDbName() : undefined,
|
|
102
|
+
'TABLE_NAME': table.name
|
|
103
|
+
}, 'COLUMNS');
|
|
104
|
+
generateStatement = function (config) { return qb.toSql(__assign({ dbName: 'INFORMATION_SCHEMA' }, config)); };
|
|
105
|
+
return [4 /*yield*/, this.dbDriver.runQuery(generateStatement)];
|
|
106
|
+
case 1:
|
|
107
|
+
results = _a.sent();
|
|
108
|
+
columnMetadata = {};
|
|
109
|
+
for (_i = 0, results_1 = results; _i < results_1.length; _i++) {
|
|
110
|
+
row = results_1[_i];
|
|
111
|
+
columnMetadata[row['COLUMN_NAME']] = { type: row['DATA_TYPE'], isNullable: row['IS_NULLABLE'] === 'YES' };
|
|
112
|
+
}
|
|
113
|
+
return [2 /*return*/, columnMetadata];
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
SchemaMetadata.prototype.getPrimaryKey = function (table) {
|
|
119
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
120
|
+
var qb, generateStatement, results, primaryKey, _i, results_2, row;
|
|
121
|
+
return __generator(this, function (_a) {
|
|
122
|
+
switch (_a.label) {
|
|
123
|
+
case 0:
|
|
124
|
+
qb = db_query_1.QueryBuilder.fromObject({
|
|
125
|
+
'TABLE_SCHEMA': this.multiDbSupported ? this.dbDriver.getDbName() : undefined,
|
|
126
|
+
'TABLE_NAME': table.name,
|
|
127
|
+
'CONSTRAINT_NAME': 'PRIMARY',
|
|
128
|
+
}, 'KEY_COLUMN_USAGE');
|
|
129
|
+
generateStatement = function (config) { return qb.toSql({ dbName: 'INFORMATION_SCHEMA' }); };
|
|
130
|
+
return [4 /*yield*/, this.dbDriver.runQuery(generateStatement)];
|
|
131
|
+
case 1:
|
|
132
|
+
results = _a.sent();
|
|
133
|
+
primaryKey = [];
|
|
134
|
+
for (_i = 0, results_2 = results; _i < results_2.length; _i++) {
|
|
135
|
+
row = results_2[_i];
|
|
136
|
+
primaryKey.push(row['COLUMN_NAME']);
|
|
137
|
+
}
|
|
138
|
+
return [2 /*return*/, primaryKey];
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
SchemaMetadata.prototype.getForeignKeys = function (table) {
|
|
144
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
145
|
+
var qb, generateStatement, results, foreignKeys, _i, results_3, row;
|
|
146
|
+
return __generator(this, function (_a) {
|
|
147
|
+
switch (_a.label) {
|
|
148
|
+
case 0:
|
|
149
|
+
qb = db_query_1.QueryBuilder.fromObject({
|
|
150
|
+
'TABLE_SCHEMA': this.multiDbSupported ? this.dbDriver.getDbName() : undefined,
|
|
151
|
+
'TABLE_NAME': table.name
|
|
152
|
+
}, 'KEY_COLUMN_USAGE');
|
|
153
|
+
generateStatement = function (config) { return qb.toSql(__assign({ dbName: 'INFORMATION_SCHEMA' }, config)); };
|
|
154
|
+
return [4 /*yield*/, this.dbDriver.runQuery(generateStatement)];
|
|
155
|
+
case 1:
|
|
156
|
+
results = _a.sent();
|
|
157
|
+
foreignKeys = {};
|
|
158
|
+
for (_i = 0, results_3 = results; _i < results_3.length; _i++) {
|
|
159
|
+
row = results_3[_i];
|
|
160
|
+
if (!row['REFERENCED_TABLE_NAME'])
|
|
161
|
+
continue;
|
|
162
|
+
foreignKeys[row['COLUMN_NAME']] = {
|
|
163
|
+
referencedTableName: row['REFERENCED_TABLE_NAME'],
|
|
164
|
+
referencedColumnName: row['REFERENCED_COLUMN_NAME'],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return [2 /*return*/, foreignKeys];
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
};
|
|
172
|
+
SchemaMetadata.prototype.getUniqueColumns = function (table) {
|
|
173
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
174
|
+
var qb, generateStatement, results, uniqueColumns, _i, results_4, row;
|
|
175
|
+
return __generator(this, function (_a) {
|
|
176
|
+
switch (_a.label) {
|
|
177
|
+
case 0:
|
|
178
|
+
qb = db_query_1.QueryBuilder.fromObject({
|
|
179
|
+
'TABLE_SCHEMA': this.multiDbSupported ? this.dbDriver.getDbName() : undefined,
|
|
180
|
+
'TABLE_NAME': table.name
|
|
181
|
+
}, 'KEY_COLUMN_USAGE');
|
|
182
|
+
generateStatement = function (config) { return qb.toSql(__assign({ dbName: 'INFORMATION_SCHEMA' }, config)); };
|
|
183
|
+
return [4 /*yield*/, this.dbDriver.runQuery(generateStatement)];
|
|
184
|
+
case 1:
|
|
185
|
+
results = _a.sent();
|
|
186
|
+
uniqueColumns = [];
|
|
187
|
+
for (_i = 0, results_4 = results; _i < results_4.length; _i++) {
|
|
188
|
+
row = results_4[_i];
|
|
189
|
+
if (!row['CONSTRAINT_NAME'].endsWith('_unique'))
|
|
190
|
+
continue;
|
|
191
|
+
uniqueColumns.push(row['COLUMN_NAME']);
|
|
192
|
+
}
|
|
193
|
+
return [2 /*return*/, uniqueColumns];
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
};
|
|
198
|
+
SchemaMetadata.prototype.getIndexes = function (table) {
|
|
199
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
200
|
+
var qb, generateStatement, results, indexes, _i, results_5, row;
|
|
201
|
+
return __generator(this, function (_a) {
|
|
202
|
+
switch (_a.label) {
|
|
203
|
+
case 0:
|
|
204
|
+
qb = new db_query_1.QueryBuilder('STATISTICS')
|
|
205
|
+
.condition({ field: 'TABLE_SCHEMA', operator: '=', value: this.dbDriver.getDbName() })
|
|
206
|
+
.condition({ field: 'TABLE_NAME', operator: '=', value: table.name })
|
|
207
|
+
.sort([{ field: 'SEQ_IN_INDEX', desc: false }]);
|
|
208
|
+
generateStatement = function (config) { return qb.toSql(__assign({ dbName: 'INFORMATION_SCHEMA' }, config)); };
|
|
209
|
+
return [4 /*yield*/, this.dbDriver.runQuery(generateStatement)];
|
|
210
|
+
case 1:
|
|
211
|
+
results = _a.sent();
|
|
212
|
+
indexes = {};
|
|
213
|
+
for (_i = 0, results_5 = results; _i < results_5.length; _i++) {
|
|
214
|
+
row = results_5[_i];
|
|
215
|
+
if (!indexes[row['INDEX_NAME']])
|
|
216
|
+
indexes[row['INDEX_NAME']] = [];
|
|
217
|
+
indexes[row['INDEX_NAME']].push(row['COLUMN_NAME']);
|
|
218
|
+
}
|
|
219
|
+
return [2 /*return*/, indexes];
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
};
|
|
224
|
+
return SchemaMetadata;
|
|
225
|
+
}());
|
|
226
|
+
exports.SchemaMetadata = SchemaMetadata;
|
|
227
|
+
//# sourceMappingURL=SchemaMetadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaMetadata.js","sourceRoot":"","sources":["../../../src/schema/SchemaMetadata.ts"],"names":[],"mappings":"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"}
|