UNPKG

3 kBJavaScriptView Raw
1"use strict";
2// Copyright IBM Corp. and LoopBack contributors 2019. All Rights Reserved.
3// Node module: @loopback/repository
4// This file is licensed under the MIT License.
5// License text available at https://opensource.org/licenses/MIT
6Object.defineProperty(exports, "__esModule", { value: true });
7exports.resolveReferencesManyMetadata = void 0;
8const tslib_1 = require("tslib");
9const debug_1 = tslib_1.__importDefault(require("debug"));
10const lodash_1 = require("lodash");
11const errors_1 = require("../../errors");
12const type_resolver_1 = require("../../type-resolver");
13const relation_types_1 = require("../relation.types");
14const debug = (0, debug_1.default)('loopback:repository:relations:references-many:helpers');
15/**
16 * Resolves given referencesMany metadata if target is specified to be a resolver.
17 * Mainly used to infer what the `keyTo` property should be from the target's
18 * property id metadata
19 * @param relationMeta - referencesMany metadata to resolve
20 * @internal
21 */
22function resolveReferencesManyMetadata(relationMeta) {
23 if (relationMeta.type !== relation_types_1.RelationType.referencesMany) {
24 const reason = 'relation type must be ReferencesMany';
25 throw new errors_1.InvalidRelationError(reason, relationMeta);
26 }
27 if (!(0, type_resolver_1.isTypeResolver)(relationMeta.target)) {
28 const reason = 'target must be a type resolver';
29 throw new errors_1.InvalidRelationError(reason, relationMeta);
30 }
31 const sourceModel = relationMeta.source;
32 if (!(sourceModel === null || sourceModel === void 0 ? void 0 : sourceModel.modelName)) {
33 const reason = 'source model must be defined';
34 throw new errors_1.InvalidRelationError(reason, relationMeta);
35 }
36 const targetModel = relationMeta.target();
37 const targetName = targetModel.modelName;
38 debug('Resolved model %s from given metadata: %o', targetName, targetModel);
39 let keyFrom;
40 if (relationMeta.keyFrom &&
41 relationMeta.source.definition.properties[relationMeta.keyFrom]) {
42 keyFrom = relationMeta.keyFrom;
43 }
44 else {
45 keyFrom = (0, lodash_1.camelCase)(targetName + '_ids');
46 }
47 const targetProperties = targetModel.definition.properties;
48 debug('relation metadata from %o: %o', targetName, targetProperties);
49 if (relationMeta.keyTo && targetProperties[relationMeta.keyTo]) {
50 // The explicit cast is needed because of a limitation of type inference
51 return Object.assign(relationMeta, {
52 keyFrom,
53 });
54 }
55 const targetPrimaryKey = targetModel.definition.idProperties()[0];
56 if (!targetPrimaryKey) {
57 const reason = `${targetName} does not have any primary key (id property)`;
58 throw new errors_1.InvalidRelationError(reason, relationMeta);
59 }
60 return Object.assign(relationMeta, { keyFrom, keyTo: targetPrimaryKey });
61}
62exports.resolveReferencesManyMetadata = resolveReferencesManyMetadata;
63//# sourceMappingURL=references-many.helpers.js.map
\No newline at end of file