@loopback/cli 4.0.0-alpha.9 → 4.0.0

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.
Files changed (159) hide show
  1. package/.yo-rc.json +1697 -0
  2. package/{generators/project/templates/LICENSE → LICENSE} +2 -1
  3. package/README.md +44 -43
  4. package/bin/cli-main.js +61 -0
  5. package/generators/app/index.js +109 -15
  6. package/generators/app/templates/.dockerignore +5 -0
  7. package/generators/app/templates/Dockerfile +28 -0
  8. package/generators/app/templates/README.md.ejs +130 -0
  9. package/generators/app/templates/public/index.html.ejs +88 -0
  10. package/generators/app/templates/{test → src/__tests__}/README.md +0 -1
  11. package/generators/app/templates/src/__tests__/acceptance/home-page.acceptance.ts.ejs +31 -0
  12. package/generators/app/templates/src/__tests__/acceptance/ping.controller.acceptance.ts.ejs +21 -0
  13. package/generators/app/templates/src/__tests__/acceptance/test-helper.ts.ejs +32 -0
  14. package/generators/app/templates/src/application.ts.ejs +70 -0
  15. package/generators/app/templates/src/controllers/README.md +6 -0
  16. package/generators/app/templates/src/controllers/index.ts.ejs +1 -0
  17. package/generators/app/templates/src/controllers/ping.controller.ts.ejs +55 -0
  18. package/generators/app/templates/src/datasources/README.md +3 -0
  19. package/generators/app/templates/src/index.ts.ejs +39 -0
  20. package/generators/app/templates/src/migrate.ts.ejs +20 -0
  21. package/generators/app/templates/src/models/README.md +3 -0
  22. package/generators/app/templates/src/openapi-spec.ts.ejs +23 -0
  23. package/generators/app/templates/src/sequence.ts.ejs +3 -0
  24. package/generators/controller/index.js +240 -23
  25. package/generators/controller/templates/src/controllers/controller-rest-template.ts.ejs +150 -0
  26. package/generators/controller/templates/src/controllers/{controller-template.ts → controller-template.ts.ejs} +2 -2
  27. package/generators/copyright/fs.js +46 -0
  28. package/generators/copyright/git.js +78 -0
  29. package/generators/copyright/header.js +306 -0
  30. package/generators/copyright/index.js +230 -0
  31. package/generators/copyright/license.js +105 -0
  32. package/generators/datasource/index.js +341 -0
  33. package/generators/datasource/templates/datasource.ts.ejs +22 -0
  34. package/generators/discover/import-discovered-model.js +70 -0
  35. package/generators/discover/index.js +349 -0
  36. package/generators/example/downloader.js +16 -0
  37. package/generators/example/index.js +176 -0
  38. package/generators/extension/index.js +34 -5
  39. package/generators/extension/templates/README.md.ejs +32 -0
  40. package/generators/extension/templates/{test → src/__tests__}/acceptance/README.md +0 -0
  41. package/generators/extension/templates/{test → src/__tests__}/integration/README.md +0 -0
  42. package/generators/extension/templates/{test → src/__tests__}/unit/README.md +0 -0
  43. package/generators/extension/templates/src/component.ts.ejs +22 -0
  44. package/generators/extension/templates/src/controllers/README.md +3 -2
  45. package/generators/extension/templates/src/decorators/README.md +10 -4
  46. package/generators/extension/templates/src/index.ts.ejs +3 -0
  47. package/generators/extension/templates/src/keys.ts.ejs +11 -0
  48. package/generators/extension/templates/src/mixins/README.md +77 -21
  49. package/generators/extension/templates/src/providers/README.md +51 -25
  50. package/generators/extension/templates/src/repositories/README.md +1 -1
  51. package/generators/extension/templates/src/types.ts.ejs +15 -0
  52. package/generators/import-lb3-models/index.js +197 -0
  53. package/generators/import-lb3-models/lb3app-loader.js +31 -0
  54. package/generators/import-lb3-models/migrate-model.js +249 -0
  55. package/generators/import-lb3-models/model-names.js +32 -0
  56. package/generators/interceptor/index.js +178 -0
  57. package/generators/interceptor/templates/interceptor-template.ts.ejs +62 -0
  58. package/generators/model/index.js +536 -0
  59. package/generators/model/property-definition.js +85 -0
  60. package/generators/model/templates/model.ts.ejs +42 -0
  61. package/generators/observer/index.js +132 -0
  62. package/generators/observer/templates/observer-template.ts.ejs +40 -0
  63. package/generators/openapi/README.md +211 -0
  64. package/generators/openapi/index.js +535 -0
  65. package/generators/openapi/schema-helper.js +447 -0
  66. package/generators/openapi/spec-helper.js +484 -0
  67. package/generators/openapi/spec-loader.js +75 -0
  68. package/generators/openapi/templates/src/controllers/controller-template.ts.ejs +43 -0
  69. package/generators/openapi/templates/src/datasources/datasource.ts.ejs +42 -0
  70. package/generators/openapi/templates/src/models/model-template.ts.ejs +71 -0
  71. package/generators/openapi/templates/src/models/type-template.ts.ejs +13 -0
  72. package/generators/openapi/templates/src/services/service-proxy-template.ts.ejs +55 -0
  73. package/generators/openapi/utils.js +322 -0
  74. package/generators/project/templates/.eslintignore +4 -0
  75. package/generators/project/templates/.eslintrc.js.ejs +3 -0
  76. package/generators/project/templates/.mocharc.json +5 -0
  77. package/generators/project/templates/.prettierignore +0 -2
  78. package/generators/project/templates/.prettierrc +2 -1
  79. package/generators/project/templates/.vscode/launch.json +38 -0
  80. package/generators/project/templates/.vscode/settings.json +32 -0
  81. package/generators/project/templates/.vscode/tasks.json +29 -0
  82. package/generators/project/templates/DEVELOPING.md +36 -0
  83. package/generators/project/templates/_.gitignore +3 -5
  84. package/generators/project/templates/package.json.ejs +175 -0
  85. package/generators/project/templates/package.plain.json.ejs +176 -0
  86. package/generators/project/templates/tsconfig.json.ejs +39 -0
  87. package/generators/relation/base-relation.generator.js +220 -0
  88. package/generators/relation/belongs-to-relation.generator.js +196 -0
  89. package/generators/relation/has-many-relation.generator.js +200 -0
  90. package/generators/relation/has-many-through-relation.generator.js +331 -0
  91. package/generators/relation/has-one-relation.generator.js +200 -0
  92. package/generators/relation/index.js +795 -0
  93. package/generators/relation/references-many-relation.generator.js +142 -0
  94. package/generators/relation/templates/controller-relation-template-belongs-to.ts.ejs +38 -0
  95. package/generators/relation/templates/controller-relation-template-has-many-through.ts.ejs +110 -0
  96. package/generators/relation/templates/controller-relation-template-has-many.ts.ejs +110 -0
  97. package/generators/relation/templates/controller-relation-template-has-one.ts.ejs +110 -0
  98. package/generators/relation/utils.generator.js +260 -0
  99. package/generators/repository/index.js +576 -0
  100. package/generators/repository/templates/src/repositories/repository-crud-default-template.ts.ejs +21 -0
  101. package/generators/repository/templates/src/repositories/repository-kv-template.ts.ejs +19 -0
  102. package/generators/rest-crud/crud-rest-component.js +63 -0
  103. package/generators/rest-crud/index.js +401 -0
  104. package/generators/rest-crud/templates/src/model-endpoints/model.rest-config-template.ts.ejs +10 -0
  105. package/generators/service/index.js +351 -0
  106. package/generators/service/templates/local-service-class-template.ts.ejs +10 -0
  107. package/generators/service/templates/local-service-provider-template.ts.ejs +19 -0
  108. package/generators/service/templates/remote-service-proxy-template.ts.ejs +21 -0
  109. package/generators/update/index.js +55 -0
  110. package/intl/cs/messages.json +204 -0
  111. package/intl/de/messages.json +204 -0
  112. package/intl/en/messages.json +204 -0
  113. package/intl/es/messages.json +204 -0
  114. package/intl/fr/messages.json +204 -0
  115. package/intl/it/messages.json +204 -0
  116. package/intl/ja/messages.json +204 -0
  117. package/intl/ko/messages.json +204 -0
  118. package/intl/nl/messages.json +204 -0
  119. package/intl/pl/messages.json +204 -0
  120. package/intl/pt/messages.json +204 -0
  121. package/intl/ru/messages.json +204 -0
  122. package/intl/tr/messages.json +204 -0
  123. package/intl/zh-Hans/messages.json +204 -0
  124. package/intl/zh-Hant/messages.json +204 -0
  125. package/lib/artifact-generator.js +138 -39
  126. package/lib/ast-helper.js +214 -0
  127. package/lib/base-generator.js +509 -0
  128. package/lib/cli.js +233 -0
  129. package/lib/connectors.json +894 -0
  130. package/lib/debug.js +16 -0
  131. package/lib/globalize.js +12 -0
  132. package/lib/model-discoverer.js +118 -0
  133. package/lib/project-generator.js +154 -57
  134. package/lib/tab-completion.js +127 -0
  135. package/lib/update-index.js +44 -0
  136. package/lib/utils.js +689 -20
  137. package/lib/version-helper.js +299 -0
  138. package/package.json +183 -39
  139. package/CHANGELOG.md +0 -86
  140. package/bin/cli.js +0 -66
  141. package/generators/app/templates/index.js +0 -14
  142. package/generators/app/templates/src/application.ts +0 -27
  143. package/generators/app/templates/src/controllers/ping-controller.ts +0 -25
  144. package/generators/app/templates/src/index.ts +0 -25
  145. package/generators/app/templates/test/ping-controller.test.ts +0 -46
  146. package/generators/extension/templates/index.js +0 -8
  147. package/generators/extension/templates/src/component.ts +0 -14
  148. package/generators/extension/templates/src/index.ts +0 -6
  149. package/generators/project/templates/.npmrc +0 -1
  150. package/generators/project/templates/.yo-rc.json +0 -1
  151. package/generators/project/templates/README.md +0 -4
  152. package/generators/project/templates/index.d.ts +0 -6
  153. package/generators/project/templates/index.ts +0 -11
  154. package/generators/project/templates/package.json +0 -79
  155. package/generators/project/templates/package.plain.json +0 -82
  156. package/generators/project/templates/test/mocha.opts +0 -1
  157. package/generators/project/templates/tsconfig.json +0 -29
  158. package/generators/project/templates/tslint.build.json +0 -17
  159. package/generators/project/templates/tslint.json +0 -33
@@ -0,0 +1,196 @@
1
+ // Copyright IBM Corp. 2019,2020. All Rights Reserved.
2
+ // Node module: @loopback/cli
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ 'use strict';
7
+
8
+ const path = require('path');
9
+ const BaseRelationGenerator = require('./base-relation.generator');
10
+ const utils = require('../../lib/utils');
11
+ const relationUtils = require('./utils.generator');
12
+
13
+ const CONTROLLER_TEMPLATE_PATH_BELONGS_TO =
14
+ 'controller-relation-template-belongs-to.ts.ejs';
15
+
16
+ module.exports = class BelongsToRelationGenerator extends (
17
+ BaseRelationGenerator
18
+ ) {
19
+ constructor(args, opts) {
20
+ super(args, opts);
21
+ }
22
+
23
+ async generateControllers(options) {
24
+ this.artifactInfo.sourceModelPrimaryKey = options.sourceModelPrimaryKey;
25
+ this.artifactInfo.sourceModelPrimaryKeyType =
26
+ options.sourceModelPrimaryKeyType;
27
+ this.artifactInfo.sourceModelClassName = options.sourceModel;
28
+ this.artifactInfo.targetModelClassName = options.destinationModel;
29
+ this.artifactInfo.paramTargetModel = utils.camelCase(
30
+ options.destinationModel,
31
+ );
32
+ this.artifactInfo.sourceRepositoryClassName =
33
+ this.artifactInfo.sourceModelClassName + 'Repository';
34
+ this.artifactInfo.controllerClassName =
35
+ this.artifactInfo.sourceModelClassName +
36
+ this.artifactInfo.targetModelClassName +
37
+ 'Controller';
38
+
39
+ this.artifactInfo.paramSourceRepository = utils.camelCase(
40
+ this.artifactInfo.sourceModelClassName + 'Repository',
41
+ );
42
+
43
+ this.artifactInfo.sourceModelName = utils.toFileName(options.sourceModel);
44
+ this.artifactInfo.sourceModelPath = utils.pluralize(
45
+ this.artifactInfo.sourceModelName,
46
+ );
47
+ this.artifactInfo.targetModelName = utils.toFileName(
48
+ options.destinationModel,
49
+ );
50
+
51
+ this.artifactInfo.relationPropertyName = options.relationName;
52
+ this.artifactInfo.targetModelPrimaryKey =
53
+ options.destinationModelPrimaryKey;
54
+ this.artifactInfo.targetModelPrimaryKeyType =
55
+ options.destinationModelPrimaryKeyType;
56
+
57
+ const source = this.templatePath(CONTROLLER_TEMPLATE_PATH_BELONGS_TO);
58
+
59
+ this.artifactInfo.name =
60
+ options.sourceModel + '-' + options.destinationModel;
61
+ this.artifactInfo.outFile =
62
+ utils.toFileName(this.artifactInfo.name) + '.controller.ts';
63
+
64
+ const dest = this.destinationPath(
65
+ path.join(this.artifactInfo.outDir, this.artifactInfo.outFile),
66
+ );
67
+
68
+ this.copyTemplatedFiles(source, dest, this.artifactInfo);
69
+ await relationUtils.addExportController(
70
+ this,
71
+ path.resolve(this.artifactInfo.outDir, 'index.ts'),
72
+ this.artifactInfo.controllerClassName,
73
+ utils.toFileName(this.artifactInfo.name) + '.controller',
74
+ );
75
+ }
76
+
77
+ async generateModels(options) {
78
+ // for repo to generate relation name
79
+ this.artifactInfo.relationName = options.relationName;
80
+ const modelDir = this.artifactInfo.modelDir;
81
+ const sourceModel = options.sourceModel;
82
+
83
+ const targetModel = options.destinationModel;
84
+ const relationType = options.relationType;
85
+ const relationName = options.relationName;
86
+ const defaultRelationName = options.defaultRelationName;
87
+ const foreignKeyName = options.foreignKeyName;
88
+ const fktype = options.destinationModelPrimaryKeyType;
89
+
90
+ const project = new relationUtils.AstLoopBackProject();
91
+ const sourceFile = relationUtils.addFileToProject(
92
+ project,
93
+ modelDir,
94
+ sourceModel,
95
+ );
96
+ const sourceClass = relationUtils.getClassObj(sourceFile, sourceModel);
97
+ // this checks if the foreign key already exists, so the 2nd param should be foreignKeyName
98
+ relationUtils.doesRelationExist(sourceClass, foreignKeyName);
99
+
100
+ const modelProperty = this.getBelongsTo(
101
+ targetModel,
102
+ relationName,
103
+ defaultRelationName,
104
+ foreignKeyName,
105
+ fktype,
106
+ );
107
+
108
+ relationUtils.addProperty(sourceClass, modelProperty);
109
+ const imports = relationUtils.getRequiredImports(targetModel, relationType);
110
+ relationUtils.addRequiredImports(sourceFile, imports);
111
+
112
+ sourceClass.formatText();
113
+ await sourceFile.save();
114
+ }
115
+
116
+ getBelongsTo(
117
+ className,
118
+ relationName,
119
+ defaultRelationName,
120
+ foreignKeyName,
121
+ fktype,
122
+ ) {
123
+ // checks if relation name is customized
124
+ let relationDecorator = [
125
+ {
126
+ name: 'belongsTo',
127
+ arguments: [`() => ${className}`],
128
+ },
129
+ ];
130
+ // already checked if the relation name is the same as the source key before
131
+ if (defaultRelationName !== relationName) {
132
+ relationDecorator = [
133
+ {
134
+ name: 'belongsTo',
135
+ arguments: [`() => ${className}, {name: '${relationName}'}`],
136
+ },
137
+ ];
138
+ }
139
+ return {
140
+ decorators: relationDecorator,
141
+ name: foreignKeyName,
142
+ type: fktype,
143
+ };
144
+ }
145
+
146
+ _getRepositoryRequiredImports(dstModelClassName, dstRepositoryClassName) {
147
+ const importsArray = super._getRepositoryRequiredImports(
148
+ dstModelClassName,
149
+ dstRepositoryClassName,
150
+ );
151
+ importsArray.push({
152
+ name: 'BelongsToAccessor',
153
+ module: '@loopback/repository',
154
+ });
155
+ return importsArray;
156
+ }
157
+
158
+ _getRepositoryRelationPropertyName() {
159
+ return this.artifactInfo.relationName;
160
+ }
161
+
162
+ _initializeProperties(options) {
163
+ super._initializeProperties(options);
164
+ this.artifactInfo.dstModelPrimaryKey = options.destinationModelPrimaryKey;
165
+ }
166
+
167
+ _getRepositoryRelationPropertyType() {
168
+ return (
169
+ `BelongsToAccessor<` +
170
+ `${utils.toClassName(this.artifactInfo.dstModelClass)}` +
171
+ `, typeof ${utils.toClassName(this.artifactInfo.srcModelClass)}` +
172
+ `.prototype.${this.artifactInfo.srcModelPrimaryKey}>`
173
+ );
174
+ }
175
+
176
+ _addCreatorToRepositoryConstructor(classConstructor) {
177
+ const relationName = this.artifactInfo.relationName;
178
+ const statement =
179
+ `this.${relationName} = ` +
180
+ `this.createBelongsToAccessorFor('` +
181
+ `${relationName}',` +
182
+ ` ${utils.camelCase(this.artifactInfo.dstRepositoryClassName)}` +
183
+ `Getter,);`;
184
+ classConstructor.insertStatements(1, statement);
185
+ }
186
+
187
+ _registerInclusionResolverForRelation(classConstructor, options) {
188
+ const relationName = this.artifactInfo.relationName;
189
+ if (options.registerInclusionResolver) {
190
+ const statement =
191
+ `this.registerInclusionResolver(` +
192
+ `'${relationName}', this.${relationName}.inclusionResolver);`;
193
+ classConstructor.insertStatements(2, statement);
194
+ }
195
+ }
196
+ };
@@ -0,0 +1,200 @@
1
+ // Copyright IBM Corp. 2019,2020. All Rights Reserved.
2
+ // Node module: @loopback/cli
3
+ // This file is licensed under the MIT License.
4
+ // License text available at https://opensource.org/licenses/MIT
5
+
6
+ 'use strict';
7
+
8
+ const path = require('path');
9
+ const BaseRelationGenerator = require('./base-relation.generator');
10
+ const relationUtils = require('./utils.generator');
11
+ const utils = require('../../lib/utils');
12
+
13
+ const CONTROLLER_TEMPLATE_PATH_HAS_MANY =
14
+ 'controller-relation-template-has-many.ts.ejs';
15
+
16
+ module.exports = class HasManyRelationGenerator extends BaseRelationGenerator {
17
+ constructor(args, opts) {
18
+ super(args, opts);
19
+ }
20
+
21
+ async generateControllers(options) {
22
+ this.artifactInfo.sourceModelClassName = options.sourceModel;
23
+ this.artifactInfo.targetModelClassName = options.destinationModel;
24
+ this.artifactInfo.sourceRepositoryClassName =
25
+ this.artifactInfo.sourceModelClassName + 'Repository';
26
+ this.artifactInfo.controllerClassName =
27
+ this.artifactInfo.sourceModelClassName +
28
+ this.artifactInfo.targetModelClassName +
29
+ 'Controller';
30
+ this.artifactInfo.paramSourceRepository = utils.camelCase(
31
+ this.artifactInfo.sourceModelClassName + 'Repository',
32
+ );
33
+
34
+ this.artifactInfo.sourceModelName = utils.toFileName(options.sourceModel);
35
+ this.artifactInfo.sourceModelPath = utils.pluralize(
36
+ this.artifactInfo.sourceModelName,
37
+ );
38
+ this.artifactInfo.targetModelName = utils.toFileName(
39
+ options.destinationModel,
40
+ );
41
+ this.artifactInfo.targetModelPath = utils.pluralize(
42
+ this.artifactInfo.targetModelName,
43
+ );
44
+ this.artifactInfo.targetModelRequestBody = utils.camelCase(
45
+ this.artifactInfo.targetModelName,
46
+ );
47
+ this.artifactInfo.relationPropertyName = options.relationName;
48
+
49
+ this.artifactInfo.sourceModelPrimaryKey = options.sourceModelPrimaryKey;
50
+ this.artifactInfo.sourceModelPrimaryKeyType =
51
+ options.sourceModelPrimaryKeyType;
52
+ this.artifactInfo.targetModelPrimaryKey =
53
+ options.destinationModelPrimaryKey;
54
+ this.artifactInfo.foreignKeyName = options.foreignKeyName;
55
+
56
+ const source = this.templatePath(CONTROLLER_TEMPLATE_PATH_HAS_MANY);
57
+
58
+ this.artifactInfo.name =
59
+ options.sourceModel + '-' + options.destinationModel;
60
+ this.artifactInfo.outFile =
61
+ utils.toFileName(this.artifactInfo.name) + '.controller.ts';
62
+
63
+ const dest = this.destinationPath(
64
+ path.join(this.artifactInfo.outDir, this.artifactInfo.outFile),
65
+ );
66
+
67
+ this.copyTemplatedFiles(source, dest, this.artifactInfo);
68
+ await relationUtils.addExportController(
69
+ this,
70
+ path.resolve(this.artifactInfo.outDir, 'index.ts'),
71
+ this.artifactInfo.controllerClassName,
72
+ utils.toFileName(this.artifactInfo.name) + '.controller',
73
+ );
74
+ }
75
+
76
+ async generateModels(options) {
77
+ // for repo to generate relation name
78
+ this.artifactInfo.relationName = options.relationName;
79
+ const modelDir = this.artifactInfo.modelDir;
80
+ const sourceModel = options.sourceModel;
81
+
82
+ const targetModel = options.destinationModel;
83
+
84
+ const relationType = options.relationType;
85
+ const relationName = options.relationName;
86
+ const fktype = options.sourceModelPrimaryKeyType;
87
+ const isForeignKeyExist = options.doesForeignKeyExist;
88
+ const foreignKeyName = options.foreignKeyName;
89
+
90
+ const isDefaultForeignKey =
91
+ foreignKeyName === utils.camelCase(options.sourceModel) + 'Id';
92
+
93
+ let modelProperty;
94
+ const project = new relationUtils.AstLoopBackProject();
95
+
96
+ const sourceFile = relationUtils.addFileToProject(
97
+ project,
98
+ modelDir,
99
+ sourceModel,
100
+ );
101
+ const sourceClass = relationUtils.getClassObj(sourceFile, sourceModel);
102
+ relationUtils.doesRelationExist(sourceClass, relationName);
103
+
104
+ modelProperty = this.getHasMany(
105
+ targetModel,
106
+ relationName,
107
+ isDefaultForeignKey,
108
+ foreignKeyName,
109
+ );
110
+
111
+ relationUtils.addProperty(sourceClass, modelProperty);
112
+ const imports = relationUtils.getRequiredImports(targetModel, relationType);
113
+
114
+ relationUtils.addRequiredImports(sourceFile, imports);
115
+ await sourceFile.save();
116
+
117
+ const targetFile = relationUtils.addFileToProject(
118
+ project,
119
+ modelDir,
120
+ targetModel,
121
+ );
122
+ const targetClass = relationUtils.getClassObj(targetFile, targetModel);
123
+
124
+ if (isForeignKeyExist) {
125
+ if (
126
+ !relationUtils.isValidPropertyType(targetClass, foreignKeyName, fktype)
127
+ ) {
128
+ throw new Error('foreignKey Type Error');
129
+ }
130
+ } else {
131
+ modelProperty = relationUtils.addForeignKey(foreignKeyName, fktype);
132
+ relationUtils.addProperty(targetClass, modelProperty);
133
+ targetClass.formatText();
134
+ await targetFile.save();
135
+ }
136
+ }
137
+
138
+ getHasMany(className, relationName, isDefaultForeignKey, foreignKeyName) {
139
+ let relationDecorator = [
140
+ {
141
+ name: 'hasMany',
142
+ arguments: [`() => ${className}, {keyTo: '${foreignKeyName}'}`],
143
+ },
144
+ ];
145
+ if (isDefaultForeignKey) {
146
+ relationDecorator = [
147
+ {name: 'hasMany', arguments: [`() => ${className}`]},
148
+ ];
149
+ }
150
+
151
+ return {
152
+ decorators: relationDecorator,
153
+ name: relationName,
154
+ type: className + '[]',
155
+ };
156
+ }
157
+
158
+ _getRepositoryRequiredImports(dstModelClassName, dstRepositoryClassName) {
159
+ const importsArray = super._getRepositoryRequiredImports(
160
+ dstModelClassName,
161
+ dstRepositoryClassName,
162
+ );
163
+ importsArray.push({
164
+ name: 'HasManyRepositoryFactory',
165
+ module: '@loopback/repository',
166
+ });
167
+ return importsArray;
168
+ }
169
+
170
+ _getRepositoryRelationPropertyName() {
171
+ return this.artifactInfo.relationName;
172
+ }
173
+
174
+ _getRepositoryRelationPropertyType() {
175
+ return `HasManyRepositoryFactory<${utils.toClassName(
176
+ this.artifactInfo.dstModelClass,
177
+ )}, typeof ${utils.toClassName(
178
+ this.artifactInfo.srcModelClass,
179
+ )}.prototype.${this.artifactInfo.srcModelPrimaryKey}>`;
180
+ }
181
+
182
+ _addCreatorToRepositoryConstructor(classConstructor) {
183
+ const relationPropertyName = this._getRepositoryRelationPropertyName();
184
+ const statement =
185
+ `this.${relationPropertyName} = ` +
186
+ `this.createHasManyRepositoryFactoryFor('${relationPropertyName}', ` +
187
+ `${utils.camelCase(this.artifactInfo.dstRepositoryClassName)}Getter,);`;
188
+ classConstructor.insertStatements(1, statement);
189
+ }
190
+
191
+ _registerInclusionResolverForRelation(classConstructor, options) {
192
+ const relationPropertyName = this._getRepositoryRelationPropertyName();
193
+ if (options.registerInclusionResolver) {
194
+ const statement =
195
+ `this.registerInclusionResolver(` +
196
+ `'${relationPropertyName}', this.${relationPropertyName}.inclusionResolver);`;
197
+ classConstructor.insertStatements(2, statement);
198
+ }
199
+ }
200
+ };