@buildvision/nest-sdk-generator 1.2.2 → 2.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.
@@ -2,11 +2,11 @@
2
2
  * @file Generate SDK modules
3
3
  */
4
4
 
5
- import * as path from 'path'
5
+ import { SdkController } from '../analyzer/controller'
6
6
  import { SdkModules } from '../analyzer/controllers'
7
7
  import { SdkHttpMethod, SdkMethod } from '../analyzer/methods'
8
- import { SdkMethodParams } from '../analyzer/params'
9
- import { resolveRouteWith, unparseRoute } from '../analyzer/route'
8
+ import { SdkMethodParam, getParamResolvedTypes, isParamResolvedType } from '../analyzer/params'
9
+ import { paramsFromRoute, resolveRouteWith, unparseRoute } from '../analyzer/route'
10
10
  import { ResolvedTypeDeps, normalizeExternalFilePath } from '../analyzer/typedeps'
11
11
  import { panic } from '../logging'
12
12
 
@@ -19,163 +19,160 @@ export function generateSdkModules(modules: SdkModules): Map<string, string> {
19
19
  /** Generated module files */
20
20
  const genFiles = new Map<string, string>()
21
21
 
22
+ /** Index file content: Exports all controllers */
23
+ const indexContent: string[] = []
24
+
22
25
  // Iterate over each module
23
26
  for (const [moduleName, controllers] of modules) {
24
27
  // Iterate over each of the module's controllers
25
28
  for (const [controllerName, controller] of controllers) {
26
- /** Generated controller's content */
27
- const out: string[] = []
29
+ genFiles.set(controller.camelClassName + '.ts', generateController(moduleName, controller))
30
+ indexContent.push(`export { default as ${controller.camelClassName} } from "./${controller.camelClassName}";`)
31
+ }
32
+ }
28
33
 
29
- out.push('/// Parent module: ' + moduleName)
30
- out.push(`/// Controller: "${controllerName}" registered as "${controller.registrationName}" (${controller.methods.length} routes)`)
31
- out.push('')
32
- out.push('import { request } from "../central";')
34
+ genFiles.set('index.ts', indexContent.join('\n'))
33
35
 
34
- const imports = new Map<string, string[]>()
36
+ return genFiles
37
+ }
35
38
 
36
- const depsToImport = new Array<ResolvedTypeDeps>()
39
+ export function generateController(moduleName: string, controller: SdkController): string {
40
+ const controllerName = controller.camelClassName
41
+ /** Generated controller's content */
42
+ const out: string[] = []
37
43
 
38
- // Iterate over each controller
39
- for (const method of controller.methods.values()) {
40
- const { parameters: args, query, body } = method.params
44
+ out.push('/// Parent module: ' + moduleName)
45
+ out.push(`/// Controller: "${controllerName}" registered as "${controller.registrationName}" (${controller.methods.length} routes)`)
46
+ out.push(`/// File Path: ${controller.path}`)
47
+ out.push('')
48
+ out.push('import { request } from "./central";')
41
49
 
42
- depsToImport.push(method.returnType)
50
+ const imports = new Map<string, string[]>()
43
51
 
44
- if (args) {
45
- depsToImport.push(...args.values())
46
- }
52
+ const depsToImport = new Array<ResolvedTypeDeps>()
47
53
 
48
- if (query) {
49
- depsToImport.push(...query.values())
50
- }
54
+ // Iterate over each controller
55
+ for (const method of controller.methods.values()) {
56
+ const { routeParams, queryParams, bodyParams } = method.params
51
57
 
52
- if (body) {
53
- if (body.full) {
54
- depsToImport.push(body.type)
55
- } else {
56
- depsToImport.push(...body.fields.values())
57
- }
58
- }
59
- }
58
+ depsToImport.push(method.returnType)
59
+ depsToImport.push(...getParamResolvedTypes(routeParams))
60
+ depsToImport.push(...getParamResolvedTypes(queryParams))
61
+ depsToImport.push(...getParamResolvedTypes(bodyParams))
62
+ }
60
63
 
61
- // Build the imports list
62
- for (const dep of depsToImport) {
63
- for (const [file, types] of dep.dependencies) {
64
- let imported = imports.get(file)
65
-
66
- if (!imported) {
67
- imported = []
68
- imports.set(file, imported)
69
- }
70
-
71
- for (const typ of types) {
72
- if (!imported.includes(typ)) {
73
- imported.push(typ)
74
- }
75
- }
76
- }
77
- }
64
+ // Build the imports list
65
+ for (const dep of depsToImport) {
66
+ for (const [file, types] of dep.dependencies) {
67
+ let imported = imports.get(file)
78
68
 
79
- for (const [file, types] of imports) {
80
- out.push(
81
- `import type { ${types.join(', ')} } from "../_types/${normalizeExternalFilePath(file.replace(/\\/g, '/')).replace(/\\/g, '/')}";`
82
- )
69
+ if (!imported) {
70
+ imported = []
71
+ imports.set(file, imported)
83
72
  }
84
73
 
85
- out.push('')
86
- out.push(`export default {`)
87
-
88
- const { mutations, queries } = controller.methods.reduce(
89
- (acc, method) => {
90
- if (method.httpMethod === SdkHttpMethod.Get) {
91
- acc.queries.push(method)
92
- } else {
93
- acc.mutations.push(method)
94
- }
95
-
96
- return acc
97
- },
98
- { mutations: [] as SdkMethod[], queries: [] as SdkMethod[] }
99
- );
100
-
101
- out.push(` queries: {`)
102
-
103
- for (const method of queries) {
104
- out.push(generateSdkMethod(method))
74
+ for (const typ of types) {
75
+ if (!imported.includes(typ)) {
76
+ imported.push(typ)
77
+ }
105
78
  }
79
+ }
80
+ }
106
81
 
107
- out.push(' },')
82
+ for (const [file, types] of imports) {
83
+ out.push(
84
+ `import type { ${types.join(', ')} } from "../_types/${normalizeExternalFilePath(file.replace(/\\/g, '/')).replace(/\\/g, '/')}";`
85
+ )
86
+ }
108
87
 
109
- out.push(` mutations: {`)
110
-
111
- for (const method of mutations) {
112
- out.push(generateSdkMethod(method))
88
+ out.push('')
89
+ out.push(`export default {`)
90
+
91
+ const { mutations, queries } = controller.methods.reduce(
92
+ (acc, method) => {
93
+ if (method.httpMethod === SdkHttpMethod.Get) {
94
+ acc.queries.push(method)
95
+ } else {
96
+ acc.mutations.push(method)
113
97
  }
114
98
 
115
- out.push(' },')
99
+ return acc
100
+ },
101
+ { mutations: [] as SdkMethod[], queries: [] as SdkMethod[] }
102
+ );
116
103
 
117
- out.push('')
118
- out.push('};')
119
-
120
- genFiles.set(path.join(moduleName, controller.camelClassName + '.ts'), out.join('\n'))
121
- }
122
-
123
- /** Generated module's content */
124
- const moduleContent: string[] = []
125
-
126
- moduleContent.push('/// Module name: ' + moduleName)
127
- moduleContent.push('')
104
+ out.push(` queries: {`)
105
+
106
+ for (const method of queries) {
107
+ out.push(generateSdkMethod(method, controller))
108
+ }
128
109
 
129
- for (const controller of controllers.keys()) {
130
- moduleContent.push(`export { default as ${controller} } from "./${controller}";`)
131
- }
110
+ out.push(' },')
132
111
 
133
- // Generate the SDK module file
134
- genFiles.set(path.join(moduleName, 'index.ts'), moduleContent.join('\n'))
112
+ out.push(` mutations: {`)
113
+
114
+ for (const method of mutations) {
115
+ out.push(generateSdkMethod(method, controller))
135
116
  }
136
117
 
137
- return genFiles
118
+ out.push(' },')
119
+
120
+ out.push('')
121
+ out.push('};')
122
+ return out.join('\n');
138
123
  }
139
124
 
140
- export function generateSdkMethod(method: SdkMethod): string {
125
+ export function generateSdkMethod(method: SdkMethod, controller: SdkController): string {
141
126
  const out = [];
142
127
  const ret = method.returnType.resolvedType
143
128
  const promised = ret.startsWith('Promise<') ? ret : `Promise<${ret}>`
129
+ const paramsType = generateSdkMethodParams(method)
144
130
 
145
131
  out.push('')
132
+ out.push(` // ${controller.camelClassName}.${method.name}`)
146
133
  out.push(` // ${method.httpMethod} @ ${unparseRoute(method.route)}`)
147
- out.push(` ${method.name}(${generateSdkMethodParams(method.params)}): ${promised} {`)
148
- out.push(generateCentralRequest(method).replace(/^/gm, ' '))
134
+ out.push(` // ${controller.path}`)
135
+ out.push(`${generateSdkMethodSignature(method)} {`)
136
+ out.push(generateSdkMethodBody(method))
149
137
  out.push(' },')
150
138
  return out.join('\n')
151
139
  }
152
140
 
153
- /**
154
- * Generate the method parameters for a given SDK method
155
- * @param params
156
- * @returns
157
- */
158
- export function generateSdkMethodParams(params: SdkMethodParams): string {
159
- // List of parameters (e.g. `id` in `/get/:id`, analyzed from the usages of the `@Param` decorator)
160
- const parameters = params.parameters ? [...params.parameters].map(([name, type]) => `${name}: ${type.resolvedType}`) : []
161
-
162
- // List of query values (e.g. `id` in `?id=xxx`, analyzed from the usages of the `@Query` decorator)
163
- const query = params.query ? [...params.query].map(([name, type]) => `${name}: ${type.resolvedType}`) : []
164
-
165
- // Body's content (type used with the `@Body` decorator)
166
- const body = params.body
167
- ? params.body.full
168
- ? params.body.type.resolvedType
169
- : '{ ' + [...params.body.fields].map(([name, type]) => `${name}: ${type.resolvedType}`).join(', ') + ' }'
170
- : null
171
-
172
- // The ternary conditions below are made to eclipse useless parameters
173
- // For instance, if we're not expecting any query nor body, these two parameters can be omitted when calling the method
174
- return [
175
- `params: {${' ' + parameters.join(', ') + ' '}}${parameters.length === 0 && !body && query.length === 0 ? ' = {}' : ''}`,
176
- `body: ${body ?? '{}'}${!body && query.length === 0 ? ' = {}' : ''}`,
177
- `query: {${' ' + query.join(', ') + ' '}}${query.length === 0 ? ' = {}' : ''}`,
178
- ].join(', ')
141
+ export function generateSdkMethodSignature(method: SdkMethod, prefix = ' '): string {
142
+ const ret = method.returnType.resolvedType
143
+ const promised = ret.startsWith('Promise<') ? ret : `Promise<${ret}>`
144
+ const paramsType = generateSdkMethodParams(method)
145
+
146
+ return `${prefix}${method.name}(${paramsType}): ${promised}`
147
+ }
148
+
149
+ export function generateSdkMethodParams(method: SdkMethod): string {
150
+ const { params, httpMethod, name } = method;
151
+
152
+ if (httpMethod === SdkHttpMethod.Get && params.bodyParams) {
153
+ panic(`${httpMethod} ${name} should not have Body params`)
154
+ }
155
+ if (httpMethod !== SdkHttpMethod.Get && params.queryParams) {
156
+ panic(`${httpMethod} ${name} should not have Query params`)
157
+ }
158
+
159
+ const inputTypes = [];
160
+
161
+ if (params.routeParams) {
162
+ inputTypes.push(methodParamsToString(params.routeParams))
163
+ }
164
+
165
+ if (params.queryParams) {
166
+ inputTypes.push(methodParamsToString(params.queryParams))
167
+ }
168
+
169
+ if (params.bodyParams) {
170
+ inputTypes.push(methodParamsToString(params.bodyParams))
171
+ }
172
+
173
+ const mergedInputType = inputTypes.join(' &\n')
174
+
175
+ return mergedInputType ? `params: ${mergedInputType}` : ''
179
176
  }
180
177
 
181
178
  /**
@@ -183,12 +180,45 @@ export function generateSdkMethodParams(params: SdkMethodParams): string {
183
180
  * @param method
184
181
  * @returns
185
182
  */
186
- export function generateCentralRequest(method: SdkMethod): string {
187
- const resolvedRoute = resolveRouteWith(method.route, (param) => '${params.' + param + '}')
183
+ export function generateSdkMethodBody(method: SdkMethod, prefix = ' '): string {
184
+ const output = []
185
+ const { route, httpMethod } = method
186
+ const routeParams = paramsFromRoute(route)
187
+ const resolvedRoute = resolveRouteWith(route, (param) => '${' + param + '}')
188
+ const hasAnyParams = method.params.routeParams || method.params.queryParams || method.params.bodyParams
188
189
 
189
190
  if (resolvedRoute instanceof Error) {
190
191
  panic('Internal error: failed to resolve route: ' + resolvedRoute.message)
191
192
  }
193
+ const routeParamsSpread = routeParams.length > 0 ? `${routeParams.join(', ')},` : ''
194
+
195
+ // Destructure parameters if they exist
196
+ if (hasAnyParams) {
197
+ output.push(`const { ${routeParamsSpread} ...rest } = params`)
198
+ }
199
+
200
+ const isGet = httpMethod === SdkHttpMethod.Get
201
+ const body = isGet || !hasAnyParams ? "null" : "rest"
202
+ const query = isGet && hasAnyParams ? "rest" : "{}"
203
+
204
+
205
+ output.push(`return request('${httpMethod}', \`${resolvedRoute}\`, ${body}, ${query})`)
206
+ return output.join('\n')
207
+ }
208
+
209
+ export function methodParamsToString(params: SdkMethodParam): string {
210
+ if (params === null) {
211
+ return ''
212
+ }
192
213
 
193
- return `return request('${method.httpMethod}', \`${resolvedRoute}\`, body, query)`
214
+ if (isParamResolvedType(params)) {
215
+ return params.resolvedType
216
+ }
217
+
218
+ const output = ["{"]
219
+ for (const [name, type] of Object.entries(params)) {
220
+ output.push(`${name}: ${type.resolvedType},`)
221
+ }
222
+ output.push("}")
223
+ return output.join("\n")
194
224
  }
@@ -26,11 +26,7 @@ export default async function generatorCli(config: Config, sdkContent: SdkConten
26
26
  if (config.overwriteOldOutputDir === false) {
27
27
  panic("Please provide an output directory that doesn't exist yet")
28
28
  } else {
29
- if (!fs.existsSync(path.join(output, 'central.ts'))) {
30
- panic("Provided output path exists but doesn't seem to contain an SDK output. Please check the output directory.")
31
- } else {
32
- fs.rmSync(output, { recursive: true })
33
- }
29
+ fs.rmSync(output, { recursive: true })
34
30
  }
35
31
  }
36
32
 
package/src/logging.ts CHANGED
@@ -21,7 +21,9 @@ export function unreachable(message: string, ...params: Array<number | string>):
21
21
  }
22
22
 
23
23
  export function warn(message: string, ...params: Array<number | string>) {
24
+ if (config.verbose) {
24
25
  console.warn(chalk.yellow(format(message, ...params)))
26
+ }
25
27
  }
26
28
 
27
29
  export function println(message: string, ...params: Array<number | string>) {
@@ -0,0 +1 @@
1
+ {"program":{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.es2021.d.ts","./node_modules/typescript/lib/lib.es2022.d.ts","./node_modules/typescript/lib/lib.esnext.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.es2021.promise.d.ts","./node_modules/typescript/lib/lib.es2021.string.d.ts","./node_modules/typescript/lib/lib.es2021.weakref.d.ts","./node_modules/typescript/lib/lib.es2021.intl.d.ts","./node_modules/typescript/lib/lib.es2022.array.d.ts","./node_modules/typescript/lib/lib.es2022.error.d.ts","./node_modules/typescript/lib/lib.es2022.intl.d.ts","./node_modules/typescript/lib/lib.es2022.object.d.ts","./node_modules/typescript/lib/lib.es2022.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2022.string.d.ts","./node_modules/typescript/lib/lib.esnext.intl.d.ts","./node_modules/@ts-morph/common/lib/typescript.d.ts","./node_modules/@ts-morph/common/lib/ts-morph-common.d.ts","./node_modules/ts-morph/lib/ts-morph.d.ts","./node_modules/chalk/index.d.ts","./src/config.ts","./src/logging.ts","./src/analyzer/builtin.ts","./src/utils.ts","./src/analyzer/route.ts","./src/analyzer/typedeps.ts","./src/analyzer/params.ts","./src/analyzer/methods.ts","./src/analyzer/controller.ts","./src/analyzer/module.ts","./src/analyzer/controllers.ts","./src/analyzer/classdeps.ts","./src/analyzer/extractor.ts","./src/analyzer/index.ts","./src/generator/genmodules.ts","./src/generator/gentypes.ts","./node_modules/@types/prettier/index.d.ts","./src/generator/prettier.ts","./src/generator/sdk-interface.ts","./src/generator/index.ts","./src/bin.ts","./node_modules/@types/minimist/index.d.ts","./node_modules/@types/node/ts4.8/assert.d.ts","./node_modules/@types/node/ts4.8/assert/strict.d.ts","./node_modules/@types/node/ts4.8/globals.d.ts","./node_modules/@types/node/ts4.8/async_hooks.d.ts","./node_modules/@types/node/ts4.8/buffer.d.ts","./node_modules/@types/node/ts4.8/child_process.d.ts","./node_modules/@types/node/ts4.8/cluster.d.ts","./node_modules/@types/node/ts4.8/console.d.ts","./node_modules/@types/node/ts4.8/constants.d.ts","./node_modules/@types/node/ts4.8/crypto.d.ts","./node_modules/@types/node/ts4.8/dgram.d.ts","./node_modules/@types/node/ts4.8/diagnostics_channel.d.ts","./node_modules/@types/node/ts4.8/dns.d.ts","./node_modules/@types/node/ts4.8/dns/promises.d.ts","./node_modules/@types/node/ts4.8/domain.d.ts","./node_modules/@types/node/ts4.8/dom-events.d.ts","./node_modules/@types/node/ts4.8/events.d.ts","./node_modules/@types/node/ts4.8/fs.d.ts","./node_modules/@types/node/ts4.8/fs/promises.d.ts","./node_modules/@types/node/ts4.8/http.d.ts","./node_modules/@types/node/ts4.8/http2.d.ts","./node_modules/@types/node/ts4.8/https.d.ts","./node_modules/@types/node/ts4.8/inspector.d.ts","./node_modules/@types/node/ts4.8/module.d.ts","./node_modules/@types/node/ts4.8/net.d.ts","./node_modules/@types/node/ts4.8/os.d.ts","./node_modules/@types/node/ts4.8/path.d.ts","./node_modules/@types/node/ts4.8/perf_hooks.d.ts","./node_modules/@types/node/ts4.8/process.d.ts","./node_modules/@types/node/ts4.8/punycode.d.ts","./node_modules/@types/node/ts4.8/querystring.d.ts","./node_modules/@types/node/ts4.8/readline.d.ts","./node_modules/@types/node/ts4.8/readline/promises.d.ts","./node_modules/@types/node/ts4.8/repl.d.ts","./node_modules/@types/node/ts4.8/stream.d.ts","./node_modules/@types/node/ts4.8/stream/promises.d.ts","./node_modules/@types/node/ts4.8/stream/consumers.d.ts","./node_modules/@types/node/ts4.8/stream/web.d.ts","./node_modules/@types/node/ts4.8/string_decoder.d.ts","./node_modules/@types/node/ts4.8/test.d.ts","./node_modules/@types/node/ts4.8/timers.d.ts","./node_modules/@types/node/ts4.8/timers/promises.d.ts","./node_modules/@types/node/ts4.8/tls.d.ts","./node_modules/@types/node/ts4.8/trace_events.d.ts","./node_modules/@types/node/ts4.8/tty.d.ts","./node_modules/@types/node/ts4.8/url.d.ts","./node_modules/@types/node/ts4.8/util.d.ts","./node_modules/@types/node/ts4.8/v8.d.ts","./node_modules/@types/node/ts4.8/vm.d.ts","./node_modules/@types/node/ts4.8/wasi.d.ts","./node_modules/@types/node/ts4.8/worker_threads.d.ts","./node_modules/@types/node/ts4.8/zlib.d.ts","./node_modules/@types/node/ts4.8/globals.global.d.ts","./node_modules/@types/node/ts4.8/index.d.ts"],"fileInfos":[{"version":"f20c05dbfe50a208301d2a1da37b9931bce0466eb5a1f4fe240971b4ecc82b67","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","e6b724280c694a9f588847f754198fb96c43d805f065c3a5b28bbc9594541c84","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9","746d62152361558ea6d6115cf0da4dd10ede041d14882ede3568bce5dc4b4f1f","d11a03592451da2d1065e09e61f4e2a9bf68f780f4f6623c18b57816a9679d17","aea179452def8a6152f98f63b191b84e7cbd69b0e248c91e61fb2e52328abe8c",{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"8cc8c5a3bac513368b0157f3d8b31cfdcfe78b56d3724f30f80ed9715e404af8","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"0d5f52b3174bee6edb81260ebcd792692c32c81fd55499d69531496f3f2b25e7","affectsGlobalScope":true},{"version":"55f400eec64d17e888e278f4def2f254b41b89515d3b88ad75d5e05f019daddd","affectsGlobalScope":true},{"version":"181f1784c6c10b751631b24ce60c7f78b20665db4550b335be179217bacc0d5f","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"75ec0bdd727d887f1b79ed6619412ea72ba3c81d92d0787ccb64bab18d261f14","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"81cac4cbc92c0c839c70f8ffb94eb61e2d32dc1c3cf6d95844ca099463cf37ea","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"775d9c9fd150d5de79e0450f35bc8b8f94ae64e3eb5da12725ff2a649dccc777","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"6c55633c733c8378db65ac3da7a767c3cf2cf3057f0565a9124a16a3a2019e87","affectsGlobalScope":true},{"version":"fb4416144c1bf0323ccbc9afb0ab289c07312214e8820ad17d709498c865a3fe","affectsGlobalScope":true},{"version":"5b0ca94ec819d68d33da516306c15297acec88efeb0ae9e2b39f71dbd9685ef7","affectsGlobalScope":true},{"version":"34c839eaaa6d78c8674ae2c37af2236dee6831b13db7b4ef4df3ec889a04d4f2","affectsGlobalScope":true},{"version":"34478567f8a80171f88f2f30808beb7da15eac0538ae91282dd33dce928d98ed","affectsGlobalScope":true},{"version":"ab7d58e6161a550ff92e5aff755dc37fe896245348332cd5f1e1203479fe0ed1","affectsGlobalScope":true},{"version":"6bda95ea27a59a276e46043b7065b55bd4b316c25e70e29b572958fa77565d43","affectsGlobalScope":true},{"version":"aedb8de1abb2ff1095c153854a6df7deae4a5709c37297f9d6e9948b6806fa66","affectsGlobalScope":true},{"version":"a4da0551fd39b90ca7ce5f68fb55d4dc0c1396d589b612e1902f68ee090aaada","affectsGlobalScope":true},{"version":"11ffe3c281f375fff9ffdde8bbec7669b4dd671905509079f866f2354a788064","affectsGlobalScope":true},{"version":"52d1bb7ab7a3306fd0375c8bff560feed26ed676a5b0457fa8027b563aecb9a4","affectsGlobalScope":true},"f84c28802d5c44429c86180eed9bb73826f2efd559205632ecb23d904b0a1a8c","5b62cb32ae66c8d1d420f2a807cd81dd1e5e68547eeacd738d41c39b64b6687c","01d183dc38180ca94b2751133213800c337e78d759498bc150adcda54271265e","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c57015012f9720cebf36a538c82d990d793c2c70a30116fe29f9c286abcff7c3","ccb918ecabee2ac8d6c7067e89cb8bc6c40cf62ff19e08570bfa8a1f8583f27a","8157e1133662959c7ddbcc92699c54e4fae658ef1110502f9b9a2b8153d768a9","1dd6493cd596960db56a1f49a51dbd11a5de9b3c10094e87358fc11126b671f7",{"version":"19049e66949f92e28f549138d20a9cdfea3beb508f36bb6acdde1bed20193ddf","signature":"0bf5fc1706602d94de1ca8efcbfebae49a2f0b3703466b7c5d01fd25bbf35d8e"},"8abd878edf3529a6ba9c4332d0574ef9eb4f7e024982c402aff517c9e8eb3377",{"version":"71ff574edfced1d02d31f69ab0377b84aa83206533f4e2d9cc4ebe2d47d3184a","signature":"1ac49289ea925e904b854ef1d9b5123f5afaea5d14388fbfea49c9a065221993"},{"version":"1c9513e492bcc5b7eb67b62e18bb30d8e10ed7468ec7df27b01326473be7c897","signature":"6b04076217e270b79065e1e1254dd6a36aed91477a89c33ec1e910d2366ccc64"},"412b29eac99c4fb5b9cdde05fbf313da9d78854f724b5039353c0478bdde3c4a","a9a78b115d1a534d608af164588eeac9e0eb9c33f18559d10ea9e81624a4993a","7b66c986f643701116b78a36293fb09bd68de76bfb96246d4e8791d9af8ae20e","b81692ed3cf6ea0d72b8783799a23da975abd7b0420a157dd1ffd9c11d4c00ce","e54b2b753293a60930aebff05690eed98435d5e37de543a7d48fe0fd6d0dbb6a","65f1347c65f686439265e15fd964e5bd3ab37b709392056fffb5503e78aa7a76",{"version":"b834e590413c8dd9cb9a39b879232a8b0366f87b52b20b5c70549a7521bb5ef4","signature":"d27664542e7a0075ec7c810e049d696f4e254901cb45792bee129980e61e6395"},"46f72b19c34a476fc472d965fe3f6a714e1c111bd048e55c666ad44b41ed0a6a","d88a5e779faf033be3d52142a04fbe1cb96009868e3bbdd296b2bc6c59e06c0e","e7c44a15049b101c892b8a0c37ec3d4295f2cc0afe196fe0d9a8e90bb0d607a9","6b3ae16e022e27554be5262b22915d1ffd452fc97499276a909ba9e5bf009095",{"version":"b1cbc1160425edf8789aa2ec28198bb9f418ac49d3b94b75b0defeb83df5bf9f","signature":"fc42ade730e2ce07d81d0581eb49139f1d236aabce2a7cfc6441e7685a314599"},{"version":"ed03ccc8b8e87e538f0c71a0a73ebabfc0e2035df3c166f274a3628433f4879a","signature":"43e818adf60173644896298637f47b01d5819b17eda46eaa32d0c7d64724d012"},"fbca5ffaebf282ec3cdac47b0d1d4a138a8b0bb32105251a38acb235087d3318","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"02873d070f9cb79f50833fbf4a9a27ac578a2edf8ddb8421eba1b37faba83bfb","affectsGlobalScope":true},"21a167fec8f933752fb8157f06d28fab6817af3ad9b0bdb1908a10762391eab9",{"version":"c0db280fa6b09d7b8d6720a19a47f485956a41ee0e6914f1b704033eb69c6058","affectsGlobalScope":true},"374ca798f244e464346f14301dc2a8b4b111af1a83b49fffef5906c338a1f922","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","dab86d9604fe40854ef3c0a6f9e8948873dc3509213418e5e457f410fd11200f","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","489532ff54b714f0e0939947a1c560e516d3ae93d51d639ab02e907a0e950114","f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"816ad2e607a96de5bcac7d437f843f5afd8957f1fa5eefa6bba8e4ed7ca8fd84","affectsGlobalScope":true},"cec36af22f514322f870e81d30675c78df82ae8bf4863f5fd4e4424c040c678d","d903fafe96674bc0b2ac38a5be4a8fc07b14c2548d1cdb165a80ea24c44c0c54","5eec82ac21f84d83586c59a16b9b8502d34505d1393393556682fe7e7fde9ef2","04eb6578a588d6a46f50299b55f30e3a04ef27d0c5a46c57d8fcc211cd530faa","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"d4ac44f01d42f541631c5fc88d0ed8efac29a3a3ad9a745d9fd58f8b61ed132e","7c013aa892414a7fdcfd861ae524a668eaa3ede8c7c0acafaf611948122c8d93","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","3163f47436da41706c6e2b3c1511f3b7cce9f9f3905b2f3e01246c48b4ba7d14","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","223c37f62ce09a3d99e77498acdee7b2705a4ae14552fbdb4093600cd9164f3f",{"version":"970a90f76d4d219ad60819d61f5994514087ba94c985647a3474a5a3d12714ed","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","4c8525f256873c7ba3135338c647eaf0ca7115a1a2805ae2d0056629461186ce","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"f0900cd5d00fe1263ff41201fb8073dbeb984397e4af3b8002a5c207a30bdc33","affectsGlobalScope":true},{"version":"4c50342e1b65d3bee2ed4ab18f84842d5724ad11083bd666d8705dc7a6079d80","affectsGlobalScope":true},"06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3","ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"da26af7362f53d122283bc69fed862b9a9fe27e01bc6a69d1d682e0e5a4df3e6","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"652ee9c5103e89102d87bc20d167a02a0e3e5e53665674466c8cfea8a9e418c7"],"options":{"declaration":true,"downlevelIteration":true,"experimentalDecorators":true,"inlineSourceMap":true,"module":1,"noFallthroughCasesInSwitch":true,"noImplicitAny":true,"noImplicitOverride":true,"noImplicitReturns":true,"noImplicitThis":true,"noPropertyAccessFromIndexSignature":true,"strict":true,"target":2,"useUnknownInCatchVariables":true},"fileIdsList":[[54,126],[126],[80,126],[83,126],[84,89,117,126],[85,96,97,104,114,125,126],[85,86,96,104,126],[87,126],[88,89,97,105,126],[89,114,122,126],[90,92,96,104,126],[91,126],[92,93,126],[96,126],[94,96,126],[96,97,98,114,125,126],[96,97,98,111,114,117,126],[126,130],[92,99,104,114,125,126],[96,97,99,100,104,114,122,125,126],[99,101,114,122,125,126],[80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132],[96,102,126],[103,125,126],[92,96,104,114,126],[105,126],[106,126],[83,107,126],[108,124,126,130],[109,126],[110,126],[96,111,112,126],[111,113,126,128],[84,96,114,115,116,117,126],[84,114,116,126],[114,115,126],[117,126],[118,126],[96,120,121,126],[120,121,126],[89,104,114,122,126],[123,126],[104,124,126],[84,99,110,125,126],[89,126],[114,126,127],[126,128],[126,129],[84,89,96,98,107,114,125,126,128,130],[114,126,131],[55,126],[58,126],[56,59,63,106,126],[56,59,65,106,126],[56,59,61,66,67,105,106,126],[56,58,59,63,64,68,69,106,126],[56,58,59,60,68,70,97,106,126],[56,57,59,62,63,64,126],[56,59,106,126],[56,59,62,63,65,126],[58,59,71,77,106,126],[57,97,106,126],[59,62,63,64,65,66,68,126],[63,70,106,126],[58,59,63,71,72,73,75,76,97,106,126],[58,59,61,74,97,126],[57,58,126],[97,106,126],[56,62,63,64],[56,62,63,65],[64,65,66,68],[58,71]],"referencedMap":[[55,1],[54,2],[79,2],[80,3],[81,3],[83,4],[84,5],[85,6],[86,7],[87,8],[88,9],[89,10],[90,11],[91,12],[92,13],[93,13],[95,14],[94,15],[96,14],[97,16],[98,17],[82,18],[132,2],[99,19],[100,20],[101,21],[133,22],[102,23],[103,24],[104,25],[105,26],[106,27],[107,28],[108,29],[109,30],[110,31],[111,32],[112,32],[113,33],[114,34],[116,35],[115,36],[117,37],[118,38],[119,2],[120,39],[121,40],[122,41],[123,42],[124,43],[125,44],[126,45],[127,46],[128,47],[129,48],[130,49],[131,50],[74,2],[57,2],[56,51],[12,2],[11,2],[2,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[3,2],[4,2],[24,2],[21,2],[22,2],[23,2],[25,2],[26,2],[27,2],[5,2],[28,2],[29,2],[30,2],[31,2],[6,2],[32,2],[33,2],[34,2],[35,2],[7,2],[36,2],[41,2],[42,2],[37,2],[38,2],[39,2],[40,2],[8,2],[46,2],[43,2],[44,2],[45,2],[47,2],[9,2],[48,2],[49,2],[50,2],[51,2],[52,2],[1,2],[10,2],[53,2],[60,52],[69,53],[66,54],[68,55],[70,56],[71,57],[65,58],[67,59],[64,60],[62,2],[63,59],[78,61],[58,62],[72,63],[73,64],[77,65],[75,66],[76,2],[59,67],[61,68]],"exportedModulesMap":[[55,1],[54,2],[79,2],[80,3],[81,3],[83,4],[84,5],[85,6],[86,7],[87,8],[88,9],[89,10],[90,11],[91,12],[92,13],[93,13],[95,14],[94,15],[96,14],[97,16],[98,17],[82,18],[132,2],[99,19],[100,20],[101,21],[133,22],[102,23],[103,24],[104,25],[105,26],[106,27],[107,28],[108,29],[109,30],[110,31],[111,32],[112,32],[113,33],[114,34],[116,35],[115,36],[117,37],[118,38],[119,2],[120,39],[121,40],[122,41],[123,42],[124,43],[125,44],[126,45],[127,46],[128,47],[129,48],[130,49],[131,50],[74,2],[57,2],[56,51],[12,2],[11,2],[2,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[20,2],[3,2],[4,2],[24,2],[21,2],[22,2],[23,2],[25,2],[26,2],[27,2],[5,2],[28,2],[29,2],[30,2],[31,2],[6,2],[32,2],[33,2],[34,2],[35,2],[7,2],[36,2],[41,2],[42,2],[37,2],[38,2],[39,2],[40,2],[8,2],[46,2],[43,2],[44,2],[45,2],[47,2],[9,2],[48,2],[49,2],[50,2],[51,2],[52,2],[1,2],[10,2],[53,2],[60,52],[69,53],[66,54],[68,55],[70,56],[71,57],[65,69],[67,59],[64,70],[63,59],[58,62],[72,71],[73,64],[77,72],[75,66],[76,2],[59,67],[61,68]],"semanticDiagnosticsPerFile":[55,54,79,80,81,83,84,85,86,87,88,89,90,91,92,93,95,94,96,97,98,82,132,99,100,101,133,102,103,104,105,106,107,108,109,110,111,112,113,114,116,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,74,57,56,12,11,2,13,14,15,16,17,18,19,20,3,4,24,21,22,23,25,26,27,5,28,29,30,31,6,32,33,34,35,7,36,41,42,37,38,39,40,8,46,43,44,45,47,9,48,49,50,51,52,1,10,53,60,69,66,68,70,71,65,67,64,62,63,78,58,72,73,77,75,76,59,61],"affectedFilesPendingEmit":[[55,1],[54,1],[79,1],[80,1],[81,1],[83,1],[84,1],[85,1],[86,1],[87,1],[88,1],[89,1],[90,1],[91,1],[92,1],[93,1],[95,1],[94,1],[96,1],[97,1],[98,1],[82,1],[132,1],[99,1],[100,1],[101,1],[133,1],[102,1],[103,1],[104,1],[105,1],[106,1],[107,1],[108,1],[109,1],[110,1],[111,1],[112,1],[113,1],[114,1],[116,1],[115,1],[117,1],[118,1],[119,1],[120,1],[121,1],[122,1],[123,1],[124,1],[125,1],[126,1],[127,1],[128,1],[129,1],[130,1],[131,1],[74,1],[57,1],[56,1],[2,1],[3,1],[4,1],[5,1],[6,1],[7,1],[8,1],[9,1],[10,1],[60,1],[69,1],[66,1],[68,1],[70,1],[71,1],[65,1],[67,1],[64,1],[62,1],[63,1],[78,1],[58,1],[72,1],[73,1],[77,1],[75,1],[76,1],[59,1],[61,1]]},"version":"4.8.4"}
@@ -1,29 +0,0 @@
1
- /**
2
- * @file Utilities for analyzing the source API's decorators
3
- */
4
-
5
- import { Decorator, Node } from 'ts-morph'
6
- import { format } from '../logging'
7
-
8
- /**
9
- * Expect a decorator to have a single, string literal argument
10
- * @param dec The decorator
11
- * @returns Nothing if the decorator has no argument, a { lit: string } if the decorator has a string literal, an Error else
12
- */
13
- export function expectSingleStrLitDecorator(dec: Decorator): string | null | Error {
14
- const args = dec.getArguments()
15
-
16
- if (args.length > 1) {
17
- return new Error(`Multiple (${args.length}) arguments were provided to the decorator`)
18
- } else if (args.length === 0) {
19
- return null
20
- }
21
-
22
- const [arg] = args
23
-
24
- if (!Node.isStringLiteral(arg)) {
25
- return new Error(format('The argument provided to the decorator is not a string literal:\n>>> {cyan}', arg.getText()))
26
- }
27
-
28
- return arg.getLiteralText()
29
- }