@loopback/cli 4.0.0-alpha.7 → 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 +279 -0
  25. package/generators/controller/templates/src/controllers/controller-rest-template.ts.ejs +150 -0
  26. package/generators/controller/templates/src/controllers/controller-template.ts.ejs +8 -0
  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 +189 -0
  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 +746 -22
  137. package/lib/version-helper.js +299 -0
  138. package/package.json +183 -32
  139. package/CHANGELOG.md +0 -64
  140. package/bin/cli.js +0 -65
  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,260 @@
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 ast = require('ts-morph');
9
+ const path = require('path');
10
+ const tsquery = require('../../lib/ast-helper');
11
+ const utils = require('../../lib/utils');
12
+
13
+ exports.relationType = {
14
+ belongsTo: 'belongsTo',
15
+ hasMany: 'hasMany',
16
+ hasManyThrough: 'hasManyThrough',
17
+ hasOne: 'hasOne',
18
+ referencesMany: 'referencesMany',
19
+ };
20
+
21
+ class AstLoopBackProject extends ast.Project {
22
+ constructor() {
23
+ super({
24
+ manipulationSettings: {
25
+ indentationText: ast.IndentationText.TwoSpaces,
26
+ insertSpaceAfterOpeningAndBeforeClosingNonemptyBraces: false,
27
+ newLineKind: ast.NewLineKind.LineFeed,
28
+ quoteKind: ast.QuoteKind.Single,
29
+ },
30
+ });
31
+ }
32
+ }
33
+ exports.AstLoopBackProject = AstLoopBackProject;
34
+
35
+ exports.getModelPrimaryKeyProperty = async function (fs, modelDir, modelName) {
36
+ const modelFile = path.join(modelDir, utils.getModelFileName(modelName));
37
+
38
+ const fileContent = await fs.read(modelFile, {});
39
+ return tsquery.getIdFromModel(fileContent);
40
+ };
41
+
42
+ exports.getModelPropertyType = function (modelDir, modelName, propertyName) {
43
+ const project = new this.AstLoopBackProject();
44
+
45
+ const modelFile = path.join(modelDir, utils.getModelFileName(modelName));
46
+ const sf = project.addSourceFileAtPath(modelFile);
47
+ const co = this.getClassObj(sf, modelName);
48
+ return this.getPropertyType(co, propertyName);
49
+ };
50
+
51
+ exports.addFileToProject = function (project, dir, modelName) {
52
+ const fileName = path.resolve(dir, utils.getModelFileName(modelName));
53
+ return project.addSourceFileAtPath(fileName);
54
+ };
55
+
56
+ exports.getClassObj = function (fileName, modelName) {
57
+ return fileName.getClassOrThrow(modelName);
58
+ };
59
+
60
+ exports.getClassConstructor = function (classObj) {
61
+ return classObj.getConstructors()[0];
62
+ };
63
+
64
+ exports.addExportController = async function (
65
+ generator,
66
+ fileName,
67
+ controllerClassName,
68
+ controllerFileName,
69
+ ) {
70
+ const project = new this.AstLoopBackProject();
71
+ let pFile;
72
+ const exportDeclaration = {
73
+ kind: ast.StructureKind.ExportDeclaration,
74
+ moduleSpecifier: './' + controllerFileName,
75
+ };
76
+
77
+ if (generator.fs.exists(fileName)) {
78
+ pFile = project.addSourceFileAtPath(fileName);
79
+ // Exported declarations is now a `Map<string, Declaration[]>`
80
+ const exportedDeclarations = pFile.getExportedDeclarations();
81
+ for (const declarations of exportedDeclarations.values()) {
82
+ for (const declaration of declarations) {
83
+ if (
84
+ ast.TypeGuards.isClassDeclaration(declaration) &&
85
+ controllerClassName === declaration.getName()
86
+ ) {
87
+ return;
88
+ }
89
+ }
90
+ }
91
+ pFile.addExportDeclaration(exportDeclaration);
92
+ } else {
93
+ pFile = project.createSourceFile(fileName, {
94
+ statements: [exportDeclaration],
95
+ });
96
+ }
97
+
98
+ await pFile.save();
99
+ };
100
+
101
+ /**
102
+ * Validate if property exist in class.
103
+ *
104
+ * @param {classObj}
105
+ * @param {propertyName} string
106
+ *
107
+ * @returns bool true on success, false on failure.
108
+ */
109
+
110
+ exports.doesPropertyExist = function (classObj, propertyName) {
111
+ return classObj
112
+ .getProperties()
113
+ .map(x => x.getName())
114
+ .includes(propertyName);
115
+ };
116
+
117
+ exports.doesRelationExist = function (classObj, propertyName) {
118
+ if (this.doesPropertyExist(classObj, propertyName)) {
119
+ // If the property is decorated by `@property()`,
120
+ // turn it to be a relational property decorated by `@belongsTo()`
121
+ const decorators = classObj.getProperty(propertyName).getDecorators();
122
+ const hasPropertyDecorator =
123
+ decorators.length > 0 && decorators[0].getName() === 'property';
124
+ // If it's already decorated by a relational decorator,
125
+ // throw error
126
+ if (!hasPropertyDecorator) {
127
+ throw new Error(
128
+ 'relational property ' +
129
+ propertyName +
130
+ ' already exist in the model ' +
131
+ classObj.getName(),
132
+ );
133
+ }
134
+
135
+ this.deleteProperty(classObj.getProperty(propertyName));
136
+ }
137
+ };
138
+
139
+ /**
140
+ * Get property type in class.
141
+ *
142
+ * @param {classObj}
143
+ * @param {propertyName} string
144
+ *
145
+ * @returns string
146
+ */
147
+
148
+ exports.getPropertyType = function (classObj, propertyName) {
149
+ return classObj.getProperty(propertyName).getType().getText();
150
+ };
151
+
152
+ /**
153
+ * Validate if property with specific type exist in class.
154
+ *
155
+ * @param {classObj}
156
+ * @param {propertyName} string
157
+ * @param {propertyType} string
158
+ *
159
+ * @returns bool true on success, false on failure.
160
+ */
161
+
162
+ exports.isValidPropertyType = function (classObj, propertyName, propertyType) {
163
+ return this.getPropertyType(classObj, propertyName) === propertyType;
164
+ };
165
+
166
+ exports.doesParameterExist = function (classConstructor, parameterName) {
167
+ return classConstructor
168
+ .getParameters()
169
+ .map(x => x.getName())
170
+ .includes(parameterName);
171
+ };
172
+
173
+ exports.addForeignKey = function (foreignKey, sourceModelPrimaryKeyType) {
174
+ return {
175
+ decorators: [
176
+ {
177
+ name: 'property',
178
+ arguments: ["{\n type : '" + sourceModelPrimaryKeyType + "',\n}"],
179
+ },
180
+ ],
181
+ name: foreignKey + '?',
182
+ type: sourceModelPrimaryKeyType,
183
+ };
184
+ };
185
+
186
+ exports.addProperty = function (classOBj, property) {
187
+ classOBj.insertProperty(this.getPropertiesCount(classOBj), property);
188
+ classOBj.insertText(this.getPropertyStartPos(classOBj), '\n');
189
+ };
190
+
191
+ exports.deleteProperty = function (propObj) {
192
+ propObj.remove();
193
+ };
194
+
195
+ exports.getPropertiesCount = function (classObj) {
196
+ return classObj.getProperties().length;
197
+ };
198
+
199
+ exports.getPropertyStartPos = function (classObj) {
200
+ return classObj
201
+ .getChildSyntaxList()
202
+ .getChildAtIndex(this.getPropertiesCount(classObj) - 1)
203
+ .getPos();
204
+ };
205
+
206
+ exports.addRequiredImports = function (sourceFile, imports) {
207
+ for (const currentImport of imports) {
208
+ this.addCurrentImport(sourceFile, currentImport);
209
+ }
210
+ };
211
+
212
+ exports.getRequiredImports = function (targetModel, relationType) {
213
+ return [
214
+ {
215
+ name: targetModel,
216
+ module: './' + utils.toFileName(targetModel) + '.model',
217
+ },
218
+ {
219
+ name: relationType,
220
+ module: '@loopback/repository',
221
+ },
222
+ ];
223
+ };
224
+
225
+ exports.addCurrentImport = function (sourceFile, currentImport) {
226
+ if (!this.doesModuleExists(sourceFile, currentImport.module)) {
227
+ sourceFile.addImportDeclaration({
228
+ moduleSpecifier: currentImport.module,
229
+ });
230
+ }
231
+ if (!this.doesImportExistInModule(sourceFile, currentImport)) {
232
+ sourceFile
233
+ .getImportDeclarationOrThrow(currentImport.module)
234
+ .addNamedImport(currentImport.name);
235
+ }
236
+ };
237
+
238
+ exports.doesModuleExists = function (sourceFile, moduleName) {
239
+ return sourceFile.getImportDeclaration(moduleName);
240
+ };
241
+
242
+ exports.doesImportExistInModule = function (sourceFile, currentImport) {
243
+ let identicalImport;
244
+ const relevantImports = this.getNamedImportsFromModule(
245
+ sourceFile,
246
+ currentImport.module,
247
+ );
248
+ if (relevantImports.length > 0) {
249
+ identicalImport = relevantImports[0]
250
+ .getNamedImports()
251
+ .filter(imp => imp.getName() === currentImport.name);
252
+ }
253
+
254
+ return identicalImport && identicalImport.length > 0;
255
+ };
256
+
257
+ exports.getNamedImportsFromModule = function (sourceFile, moduleName) {
258
+ const allImports = sourceFile.getImportDeclarations();
259
+ return allImports.filter(imp => imp.getModuleSpecifierValue() === moduleName);
260
+ };