@loopback/cli 4.0.0-alpha.9 → 4.1.1

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 +1719 -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 +411 -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 +49 -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 +423 -0
  104. package/generators/rest-crud/templates/src/model-endpoints/model.rest-config-template.ts.ejs +11 -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,175 @@
1
+ {
2
+ "name": "<%= project.name -%>",
3
+ "version": "0.0.1",
4
+ "description": "<%= project.description -%>",
5
+ "keywords": [
6
+ "loopback-<%= project.projectType -%>",
7
+ "loopback"
8
+ ],
9
+ <% if (project.private) { -%>
10
+ "private": true,
11
+ <% } -%>
12
+ "main": "dist/index.js",
13
+ "types": "dist/index.d.ts",
14
+ "engines": {
15
+ "node": "14 || 16 || 17 || 18"
16
+ },
17
+ "scripts": {
18
+ "build": "lb-tsc",
19
+ "build:watch": "lb-tsc --watch",
20
+ <% if (project.prettier && project.eslint) { -%>
21
+ <% if (packageManager === 'yarn') { -%>
22
+ "lint": "yarn run eslint && yarn run prettier:check",
23
+ "lint:fix": "yarn run eslint:fix && yarn run prettier:fix",
24
+ <% } else { -%>
25
+ "lint": "npm run eslint && npm run prettier:check",
26
+ "lint:fix": "npm run eslint:fix && npm run prettier:fix",
27
+ <% } -%>
28
+ <% } else if (project.prettier) { -%>
29
+ <% if (packageManager === 'yarn') { -%>
30
+ "lint": "yarn run prettier:check",
31
+ "lint:fix": "yarn run prettier:fix",
32
+ <% } else { -%>
33
+ "lint": "npm run prettier:check",
34
+ "lint:fix": "npm run prettier:fix",
35
+ <% } -%>
36
+ <% } else if (project.eslint) { -%>
37
+ <% if (packageManager === 'yarn') { -%>
38
+ "lint": "yarn run eslint",
39
+ "lint:fix": "yarn run eslint:fix",
40
+ <% } else { -%>
41
+ "lint": "npm run eslint",
42
+ "lint:fix": "npm run eslint:fix",
43
+ <% } -%>
44
+ <% } -%>
45
+ <% if (project.prettier) { -%>
46
+ "prettier:cli": "lb-prettier \"**/*.ts\" \"**/*.js\"",
47
+ <% if (packageManager === 'yarn') { -%>
48
+ "prettier:check": "yarn run prettier:cli -l",
49
+ "prettier:fix": "yarn run prettier:cli --write",
50
+ <% } else { -%>
51
+ "prettier:check": "npm run prettier:cli -- -l",
52
+ "prettier:fix": "npm run prettier:cli -- --write",
53
+ <% } -%>
54
+ <% } -%>
55
+ <% if (project.eslint) { -%>
56
+ "eslint": "lb-eslint --report-unused-disable-directives .",
57
+ <% if (packageManager === 'yarn') { -%>
58
+ "eslint:fix": "yarn run eslint --fix",
59
+ <% } else { -%>
60
+ "eslint:fix": "npm run eslint -- --fix",
61
+ <% } -%>
62
+ <% } -%>
63
+ <% if (packageManager === 'yarn') { -%>
64
+ "pretest": "yarn run rebuild",
65
+ <% } else { -%>
66
+ "pretest": "npm run rebuild",
67
+ <% } -%>
68
+ <% if (project.mocha) { -%>
69
+ "test": "lb-mocha --allow-console-logs \"dist/__tests__\"",
70
+ <% } -%>
71
+ <% if (project.prettier || project.eslint) { -%>
72
+ <% if (packageManager === 'yarn') { -%>
73
+ "posttest": "yarn run lint",
74
+ <% } else { -%>
75
+ "posttest": "npm run lint",
76
+ <% } -%>
77
+ <% } -%>
78
+ <% if (project.mocha && (project.prettier || project.eslint)) { -%>
79
+ <% if (packageManager === 'yarn') { -%>
80
+ "test:dev": "lb-mocha --allow-console-logs dist/__tests__/**/*.js && yarn run posttest",
81
+ <% } else { -%>
82
+ "test:dev": "lb-mocha --allow-console-logs dist/__tests__/**/*.js && npm run posttest",
83
+ <% } -%>
84
+ <% } else if (project.mocha) { -%>
85
+ "test:dev": "lb-mocha --allow-console-logs dist/__tests__/**/*.js",
86
+ <% } -%>
87
+ <% if (project.projectType === 'application') { -%>
88
+ <% if (project.docker) { -%>
89
+ "docker:build": "docker build -t <%= project.name -%> .",
90
+ "docker:run": "docker run -p 3000:3000 -d <%= project.name -%>",
91
+ <% } -%>
92
+ <% if (project.repositories && packageManager === 'yarn') { -%>
93
+ "premigrate": "yarn run build",
94
+ <% } else if (project.repositories) { -%>
95
+ "premigrate": "npm run build",
96
+ <% } -%>
97
+ <% if (project.repositories) { -%>
98
+ "migrate": "node ./dist/migrate",
99
+ <% } -%>
100
+ <% if (packageManager === 'yarn') { -%>
101
+ "preopenapi-spec": "yarn run build",
102
+ <% } else { -%>
103
+ "preopenapi-spec": "npm run build",
104
+ <% } -%>
105
+ "openapi-spec": "node ./dist/openapi-spec",
106
+ <% if (packageManager === 'yarn') { -%>
107
+ "prestart": "yarn run rebuild",
108
+ <% } else { -%>
109
+ "prestart": "npm run rebuild",
110
+ <% } -%>
111
+ "start": "node -r source-map-support/register .",
112
+ <% } -%>
113
+ "clean": "lb-clean dist *.tsbuildinfo .eslintcache",
114
+ <% if (packageManager === 'yarn') { -%>
115
+ "rebuild": "yarn run clean && yarn run build"
116
+ <% } else { -%>
117
+ "rebuild": "npm run clean && npm run build"
118
+ <% } -%>
119
+ },
120
+ "repository": {
121
+ "type": "git",
122
+ "url": ""
123
+ },
124
+ <% if (author) { -%>
125
+ "author": "<%= author.name %> <<%= author.email %>>",
126
+ <% } else { -%>
127
+ "author": "",
128
+ <% } -%>
129
+ "license": "",
130
+ "files": [
131
+ "README.md",
132
+ "dist",
133
+ "src",
134
+ "!*/__tests__"
135
+ ],
136
+ <% if (project.projectType === 'extension') { -%>
137
+ "peerDependencies": {
138
+ "@loopback/core": "<%= project.dependencies['@loopback/core'] -%>"
139
+ },
140
+ <% } -%>
141
+ "dependencies": {
142
+ <% if (project.projectType === 'application') { -%>
143
+ "@loopback/boot": "<%= project.dependencies['@loopback/boot'] -%>",
144
+ "@loopback/core": "<%= project.dependencies['@loopback/core'] -%>",
145
+ <% if (project.repositories) { -%>
146
+ "@loopback/repository": "<%= project.dependencies['@loopback/repository'] -%>",
147
+ <% } -%>
148
+ <% if (project.apiconnect) { -%>
149
+ "@loopback/apiconnect": "<%= project.dependencies['@loopback/apiconnect'] -%>",
150
+ <% } -%>
151
+ "@loopback/rest": "<%= project.dependencies['@loopback/rest'] -%>",
152
+ <% if (project.services) { -%>
153
+ "@loopback/rest-explorer": "<%= project.dependencies['@loopback/rest-explorer'] -%>",
154
+ "@loopback/service-proxy": "<%= project.dependencies['@loopback/service-proxy'] -%>",
155
+ <% } else { -%>
156
+ "@loopback/rest-explorer": "<%= project.dependencies['@loopback/rest-explorer'] -%>",
157
+ <% } -%>
158
+ <% } -%>
159
+ "tslib": "<%= project.dependencies['tslib'] -%>"
160
+ },
161
+ "devDependencies": {
162
+ "@loopback/build": "<%= project.dependencies['@loopback/build'] -%>",
163
+ "source-map-support": "<%= project.dependencies['source-map-support'] -%>",
164
+ <% if (project.projectType === 'extension') { -%>
165
+ "@loopback/core": "<%= project.dependencies['@loopback/core'] -%>",
166
+ <% } -%>
167
+ "@loopback/testlab": "<%= project.dependencies['@loopback/testlab'] -%>",
168
+ "@types/node": "<%= project.dependencies['@types/node'] -%>",
169
+ <% if (project.eslint) { -%>
170
+ "@loopback/eslint-config": "<%= project.dependencies['@loopback/eslint-config'] -%>",
171
+ "eslint": "<%= project.dependencies['eslint'] -%>",
172
+ <% } -%>
173
+ "typescript": "<%= project.dependencies['typescript'] -%>"
174
+ }
175
+ }
@@ -0,0 +1,176 @@
1
+ {
2
+ "name": "<%= project.name -%>",
3
+ "version": "0.0.1",
4
+ "description": "<%= project.description -%>",
5
+ "keywords": [
6
+ "loopback-<%= project.projectType -%>",
7
+ "loopback"
8
+ ],
9
+ <% if (project.private) { -%>
10
+ "private": true,
11
+ <% } -%>
12
+ "main": "dist/index.js",
13
+ "types": "dist/index.d.ts",
14
+ "engines": {
15
+ "node": "14 || 16 || 17 || 18"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "build:watch": "tsc --watch",
20
+ "clean": "rimraf dist *.tsbuildinfo .eslintcache",
21
+ <% if (project.prettier && project.eslint) { -%>
22
+ <% if (packageManager === 'yarn') { -%>
23
+ "lint": "yarn run prettier:check && yarn run eslint",
24
+ "lint:fix": "yarn run eslint:fix && yarn run prettier:fix",
25
+ <% } else { -%>
26
+ "lint": "npm run prettier:check && npm run eslint",
27
+ "lint:fix": "npm run eslint:fix && npm run prettier:fix",
28
+ <% } -%>
29
+ <% } else if (project.prettier) { -%>
30
+ <% if (packageManager === 'yarn') { -%>
31
+ "lint": "yarn run prettier:check",
32
+ "lint:fix": "yarn run prettier:fix",
33
+ <% } else { -%>
34
+ "lint": "npm run prettier:check",
35
+ "lint:fix": "npm run prettier:fix",
36
+ <% } -%>
37
+ <% } else if (project.eslint) { -%>
38
+ <% if (packageManager === 'yarn') { -%>
39
+ "lint": "yarn run eslint",
40
+ "lint:fix": "yarn run eslint:fix",
41
+ <% } else { -%>
42
+ "lint": "npm run eslint",
43
+ "lint:fix": "npm run eslint:fix",
44
+ <% } -%>
45
+ <% } -%>
46
+ <% if (project.prettier) { -%>
47
+ "prettier:cli": "prettier \"**/*.ts\" \"**/*.js\"",
48
+ <% if (packageManager === 'yarn') { -%>
49
+ "prettier:check": "yarn run prettier:cli -l",
50
+ "prettier:fix": "yarn run prettier:cli --write",
51
+ <% } else { -%>
52
+ "prettier:check": "npm run prettier:cli -- -l",
53
+ "prettier:fix": "npm run prettier:cli -- --write",
54
+ <% } -%>
55
+ <% } -%>
56
+ <% if (project.eslint) { -%>
57
+ "eslint": "eslint .",
58
+ <% if (packageManager === 'yarn') { -%>
59
+ "eslint:fix": "yarn run eslint --fix",
60
+ <% } else { -%>
61
+ "eslint:fix": "npm run eslint -- --fix",
62
+ <% } -%>
63
+ <% } -%>
64
+ <% if (packageManager === 'yarn') { -%>
65
+ "pretest": "yarn run rebuild",
66
+ <% } else { -%>
67
+ "pretest": "npm run rebuild",
68
+ <% } -%>
69
+ <% if (project.mocha) { -%>
70
+ "test": "mocha dist/__tests__",
71
+ <% } -%>
72
+ <% if (project.prettier || project.eslint) { -%>
73
+ <% if (packageManager === 'yarn') { -%>
74
+ "posttest": "yarn run lint",
75
+ <% } else { -%>
76
+ "posttest": "npm run lint",
77
+ <% } -%>
78
+ <% } -%>
79
+ <% if (project.mocha && (project.prettier || project.eslint)) { -%>
80
+ <% if (packageManager === 'yarn') { -%>
81
+ "test:dev": "mocha dist/__tests__/**/*.js && yarn run posttest",
82
+ <% } else { -%>
83
+ "test:dev": "mocha dist/__tests__/**/*.js && npm run posttest",
84
+ <% } -%>
85
+ <% } else if (project.mocha) { -%>
86
+ "test:dev": "mocha dist/__tests__/**/*.js",
87
+ <% } -%>
88
+ <% if (project.projectType === 'application') { -%>
89
+ <% if (project.docker) { -%>
90
+ "docker:build": "docker build -t <%= project.name -%> .",
91
+ "docker:run": "docker run -p 3000:3000 -d <%= project.name -%>",
92
+ <% } -%>
93
+ <% if (project.repositories) { -%>
94
+ "migrate": "node ./dist/migrate",
95
+ <% } -%>
96
+ "openapi-spec": "node ./dist/openapi-spec",
97
+ <% if (packageManager === 'yarn') { -%>
98
+ "prestart": "yarn run rebuild",
99
+ <% } else { -%>
100
+ "prestart": "npm run rebuild",
101
+ <% } -%>
102
+ "start": "node -r source-map-support/register .",
103
+ <% } -%>
104
+ <% if (packageManager === 'yarn') { -%>
105
+ "prepare": "yarn run build",
106
+ <% } else { -%>
107
+ "prepare": "npm run build",
108
+ <% } -%>
109
+ <% if (packageManager === 'yarn') { -%>
110
+ "rebuild": "yarn run clean && yarn run build"
111
+ <% } else { -%>
112
+ "rebuild": "npm run clean && npm run build"
113
+ <% } -%>
114
+ },
115
+ "repository": {
116
+ "type": "git"
117
+ },
118
+ <% if (author) { -%>
119
+ "author": "<%= author.name %> <<%= author.email %>>",
120
+ <% } else { -%>
121
+ "author": "",
122
+ <% } -%>
123
+ "license": "",
124
+ "files": [
125
+ "README.md",
126
+ "dist",
127
+ "src",
128
+ "!*/__tests__"
129
+ ],
130
+ <% if (project.projectType === 'extension') { -%>
131
+ "peerDependencies": {
132
+ "@loopback/core": "<%= project.dependencies['@loopback/core'] -%>"
133
+ },
134
+ <% } -%>
135
+ "dependencies": {
136
+ <% if (project.projectType === 'application') { -%>
137
+ "@loopback/boot": "<%= project.dependencies['@loopback/boot'] -%>",
138
+ "@loopback/core": "<%= project.dependencies['@loopback/core'] -%>",
139
+ <% if (project.repositories) { -%>
140
+ "@loopback/repository": "<%= project.dependencies['@loopback/repository'] -%>",
141
+ <% } -%>
142
+ <% if (project.apiconnect) { -%>
143
+ "@loopback/apiconnect": "<%= project.dependencies['@loopback/apiconnect'] -%>",
144
+ <% } -%>
145
+ "@loopback/rest": "<%= project.dependencies['@loopback/rest'] -%>",
146
+ "@loopback/rest-explorer": "<%= project.dependencies['@loopback/rest-explorer'] -%>",
147
+ <% } -%>
148
+ <% if (project.services) { -%>
149
+ "@loopback/service-proxy": "<%= project.dependencies['@loopback/service-proxy'] -%>",
150
+ <% } -%>
151
+ "tslib": "<%= project.dependencies['tslib'] -%>"
152
+ },
153
+ "devDependencies": {
154
+ "rimraf": "<%= project.dependencies['rimraf'] -%>",
155
+ "source-map-support": "<%= project.dependencies['source-map-support'] -%>",
156
+ <% if (project.projectType === 'extension') { -%>
157
+ "@loopback/core": "<%= project.dependencies['@loopback/core'] -%>",
158
+ <% } -%>
159
+ "@loopback/testlab": "<%= project.dependencies['@loopback/testlab'] -%>",
160
+ <% if (project.mocha) { -%>
161
+ "@types/mocha": "<%= project.dependencies['@types/mocha'] -%>",
162
+ <% } -%>
163
+ "@types/node": "<%= project.dependencies['@types/node'] -%>",
164
+ <% if (project.mocha) { -%>
165
+ "mocha": "<%= project.dependencies['mocha'] -%>",
166
+ <% } -%>
167
+ <% if (project.prettier) { -%>
168
+ "prettier": "<%= project.dependencies['prettier'] -%>",
169
+ <% } -%>
170
+ <% if (project.eslint) { -%>
171
+ "@loopback/eslint-config": "<%= project.dependencies['@loopback/eslint-config'] -%>",
172
+ "eslint": "<%= project.dependencies['eslint'] -%>",
173
+ <% } -%>
174
+ "typescript": "<%= project.dependencies['typescript'] -%>"
175
+ }
176
+ }
@@ -0,0 +1,39 @@
1
+ {
2
+ "$schema": "http://json.schemastore.org/tsconfig",
3
+ <% if (project.loopbackBuild) { -%>
4
+ "extends": "@loopback/build/config/tsconfig.common.json",
5
+ "compilerOptions": {
6
+ "outDir": "dist",
7
+ "rootDir": "src"
8
+ },
9
+ "include": ["src"]
10
+ <% } else { -%>
11
+ "compilerOptions": {
12
+ "outDir": "dist",
13
+ "rootDir": "src",
14
+
15
+ "emitDecoratorMetadata": true,
16
+ "experimentalDecorators": true,
17
+ "noImplicitAny": true,
18
+ "strictNullChecks": true,
19
+ "resolveJsonModule": true,
20
+ "skipLibCheck": true,
21
+
22
+ "incremental": true,
23
+
24
+ "lib": ["es2018", "esnext.asynciterable"],
25
+ "module": "commonjs",
26
+ "esModuleInterop": true,
27
+ "moduleResolution": "node",
28
+ "target": "es2017",
29
+ "sourceMap": true,
30
+ "declaration": true
31
+ },
32
+ "include": ["src"],
33
+ "exclude": [
34
+ "**/node_modules/**",
35
+ "**/dist/**",
36
+ "**/*.d.ts"
37
+ ]
38
+ <% } -%>
39
+ }
@@ -0,0 +1,220 @@
1
+ // Copyright IBM Corp. and LoopBack contributors 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 ArtifactGenerator = require('../../lib/artifact-generator');
10
+ const path = require('path');
11
+ const relationUtils = require('./utils.generator');
12
+ const utils = require('../../lib/utils');
13
+
14
+ module.exports = class BaseRelationGenerator extends ArtifactGenerator {
15
+ constructor(args, opts) {
16
+ super(args, opts);
17
+ }
18
+
19
+ _setupGenerator() {
20
+ this.artifactInfo = {
21
+ type: 'relation',
22
+ rootDir: utils.sourceRootDir,
23
+ };
24
+
25
+ this.artifactInfo.outDir = path.resolve(
26
+ this.artifactInfo.rootDir,
27
+ 'controllers',
28
+ );
29
+ this.artifactInfo.modelDir = path.resolve(
30
+ this.artifactInfo.rootDir,
31
+ 'models',
32
+ );
33
+ this.artifactInfo.repositoryDir = path.resolve(
34
+ this.artifactInfo.rootDir,
35
+ 'repositories',
36
+ );
37
+
38
+ super._setupGenerator();
39
+ }
40
+
41
+ async generateAll(options) {
42
+ this._setupGenerator();
43
+ await this.generateModels(options);
44
+ this._setupGenerator();
45
+ await this.generateRepositories(options);
46
+ this._setupGenerator();
47
+ await this.generateControllers(options);
48
+ }
49
+
50
+ async generateControllers(options) {
51
+ /* istanbul ignore next */
52
+ throw new Error('Not implemented');
53
+ }
54
+
55
+ async generateModels(options) {
56
+ /* istanbul ignore next */
57
+ throw new Error('Not implemented');
58
+ }
59
+
60
+ async generateRepositories(options) {
61
+ this._initializeProperties(options);
62
+ this._addImportsToRepository(options);
63
+ this._addPropertyToRepository(options);
64
+ const classDeclaration = relationUtils.getClassObj(
65
+ this.artifactInfo.srcRepositoryFileObj,
66
+ this.artifactInfo.srcRepositoryClassName,
67
+ );
68
+ const classConstructor =
69
+ relationUtils.getClassConstructor(classDeclaration);
70
+ this._addParametersToRepositoryConstructor(classConstructor);
71
+ this._addCreatorToRepositoryConstructor(classConstructor);
72
+ this._registerInclusionResolverForRelation(classConstructor, options);
73
+ await this.artifactInfo.srcRepositoryFileObj.save();
74
+ }
75
+
76
+ _addImportsToRepository(options) {
77
+ const imports = this._getRepositoryRequiredImports(
78
+ options.destinationModel,
79
+ this.artifactInfo.dstRepositoryClassName,
80
+ );
81
+
82
+ relationUtils.addRequiredImports(
83
+ this.artifactInfo.srcRepositoryFileObj,
84
+ imports,
85
+ );
86
+ }
87
+
88
+ _addPropertyToRepository(options) {
89
+ const classDeclaration =
90
+ this.artifactInfo.srcRepositoryFileObj.getClassOrThrow(
91
+ this.artifactInfo.srcRepositoryClassName,
92
+ );
93
+
94
+ const property = {
95
+ scope: ast.Scope.Public,
96
+ isReadonly: true,
97
+ name: this._getRepositoryRelationPropertyName(),
98
+ type: this._getRepositoryRelationPropertyType(),
99
+ };
100
+
101
+ // already checked the existence of property before
102
+ relationUtils.addProperty(classDeclaration, property);
103
+ }
104
+
105
+ _addParametersToRepositoryConstructor(classConstructor) {
106
+ if (this._addThroughRepoToRepositoryConstructor) {
107
+ this._addThroughRepoToRepositoryConstructor(classConstructor);
108
+ }
109
+ const parameterName =
110
+ utils.camelCase(this.artifactInfo.dstRepositoryClassName) + 'Getter';
111
+
112
+ if (relationUtils.doesParameterExist(classConstructor, parameterName)) {
113
+ // no need to check if the getter already exists
114
+ return;
115
+ }
116
+
117
+ classConstructor.addParameter({
118
+ decorators: [
119
+ {
120
+ name: 'repository.getter',
121
+ arguments: ["'" + this.artifactInfo.dstRepositoryClassName + "'"],
122
+ },
123
+ ],
124
+ name: parameterName,
125
+ type: 'Getter<' + this.artifactInfo.dstRepositoryClassName + '>,',
126
+ scope: ast.Scope.Protected,
127
+ });
128
+ }
129
+
130
+ _addCreatorToRepositoryConstructor(classConstructor) {
131
+ /* istanbul ignore next */
132
+ throw new Error('Not implemented');
133
+ }
134
+
135
+ _registerInclusionResolverForRelation(classConstructor, options) {
136
+ /* istanbul ignore next */
137
+ throw new Error('Not implemented');
138
+ }
139
+
140
+ _initializeProperties(options) {
141
+ // src configuration.
142
+ this.artifactInfo.srcModelPrimaryKey = options.sourceModelPrimaryKey;
143
+ this.artifactInfo.srcModelFile = path.resolve(
144
+ this.artifactInfo.modelDir,
145
+ utils.getModelFileName(options.sourceModel),
146
+ );
147
+
148
+ this.artifactInfo.srcModelClass = options.sourceModel;
149
+
150
+ this.artifactInfo.srcRepositoryFile = path.resolve(
151
+ this.artifactInfo.repositoryDir,
152
+ utils.getRepositoryFileName(options.sourceModel),
153
+ );
154
+
155
+ this.artifactInfo.srcRepositoryClassName =
156
+ utils.toClassName(options.sourceModel) + 'Repository';
157
+
158
+ this.artifactInfo.srcRepositoryFileObj =
159
+ new relationUtils.AstLoopBackProject().addSourceFileAtPath(
160
+ this.artifactInfo.srcRepositoryFile,
161
+ );
162
+
163
+ // dst configuration
164
+ this.artifactInfo.dstModelFile = path.resolve(
165
+ this.artifactInfo.modelDir,
166
+ utils.getModelFileName(options.destinationModel),
167
+ );
168
+
169
+ this.artifactInfo.dstModelClass = options.destinationModel;
170
+
171
+ this.artifactInfo.dstRepositoryFile = path.resolve(
172
+ this.artifactInfo.repositoryDir,
173
+ utils.getRepositoryFileName(options.destinationModel),
174
+ );
175
+
176
+ this.artifactInfo.dstRepositoryClassName =
177
+ utils.toClassName(options.destinationModel) + 'Repository';
178
+ this.artifactInfo.dstModelPrimaryKey = options.destinationModelPrimaryKey;
179
+ if (options.throughModel) {
180
+ this.artifactInfo.throughModelClass = options.throughModel;
181
+ this.artifactInfo.throughRepoClassName = utils.toClassName(
182
+ options.throughModel + 'Repository',
183
+ );
184
+ }
185
+
186
+ // relation configuration
187
+ this.artifactInfo.relationName = options.relationName;
188
+ }
189
+
190
+ _getRepositoryRequiredImports(dstModelClassName, dstRepositoryClassName) {
191
+ return [
192
+ {
193
+ name: dstModelClassName,
194
+ module: '../models',
195
+ },
196
+ {
197
+ name: 'repository',
198
+ module: '@loopback/repository',
199
+ },
200
+ {
201
+ name: 'Getter',
202
+ module: '@loopback/core',
203
+ },
204
+ {
205
+ name: dstRepositoryClassName,
206
+ module: `./${utils.toFileName(dstModelClassName)}.repository`,
207
+ },
208
+ ];
209
+ }
210
+
211
+ _getRepositoryRelationPropertyName() {
212
+ /* istanbul ignore next */
213
+ throw new Error('Not implemented');
214
+ }
215
+
216
+ _getRepositoryRelationPropertyType() {
217
+ /* istanbul ignore next */
218
+ throw new Error('Not implemented');
219
+ }
220
+ };