@voxgig/apidef 2.4.1 → 3.1.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 (108) hide show
  1. package/dist/apidef.d.ts +7 -2
  2. package/dist/apidef.js +190 -114
  3. package/dist/apidef.js.map +1 -1
  4. package/dist/builder/entity/entity.d.ts +3 -0
  5. package/dist/builder/entity/{apiEntity.js → entity.js} +12 -9
  6. package/dist/builder/entity/entity.js.map +1 -0
  7. package/dist/builder/entity/info.d.ts +3 -0
  8. package/dist/builder/entity/info.js +22 -0
  9. package/dist/builder/entity/info.js.map +1 -0
  10. package/dist/builder/entity.js +7 -21
  11. package/dist/builder/entity.js.map +1 -1
  12. package/dist/builder/flow/flowHeuristic01.js +21 -11
  13. package/dist/builder/flow/flowHeuristic01.js.map +1 -1
  14. package/dist/builder/flow.d.ts +2 -1
  15. package/dist/builder/flow.js +39 -12
  16. package/dist/builder/flow.js.map +1 -1
  17. package/dist/def.d.ts +62 -0
  18. package/dist/def.js +4 -0
  19. package/dist/def.js.map +1 -0
  20. package/dist/desc.d.ts +87 -0
  21. package/dist/desc.js +4 -0
  22. package/dist/desc.js.map +1 -0
  23. package/dist/guide/guide.d.ts +2 -1
  24. package/dist/guide/guide.js +161 -30
  25. package/dist/guide/guide.js.map +1 -1
  26. package/dist/guide/heuristic01.d.ts +2 -1
  27. package/dist/guide/heuristic01.js +1122 -234
  28. package/dist/guide/heuristic01.js.map +1 -1
  29. package/dist/model.d.ts +90 -0
  30. package/dist/model.js +4 -0
  31. package/dist/model.js.map +1 -0
  32. package/dist/parse.d.ts +4 -3
  33. package/dist/parse.js +40 -46
  34. package/dist/parse.js.map +1 -1
  35. package/dist/resolver.js +2 -1
  36. package/dist/resolver.js.map +1 -1
  37. package/dist/transform/args.d.ts +3 -0
  38. package/dist/transform/args.js +54 -0
  39. package/dist/transform/args.js.map +1 -0
  40. package/dist/transform/clean.d.ts +2 -2
  41. package/dist/transform/clean.js +28 -3
  42. package/dist/transform/clean.js.map +1 -1
  43. package/dist/transform/entity.d.ts +9 -1
  44. package/dist/transform/entity.js +57 -41
  45. package/dist/transform/entity.js.map +1 -1
  46. package/dist/transform/field.d.ts +1 -1
  47. package/dist/transform/field.js +89 -65
  48. package/dist/transform/field.js.map +1 -1
  49. package/dist/transform/flow.d.ts +3 -0
  50. package/dist/transform/flow.js +26 -0
  51. package/dist/transform/flow.js.map +1 -0
  52. package/dist/transform/flowstep.d.ts +3 -0
  53. package/dist/transform/flowstep.js +145 -0
  54. package/dist/transform/flowstep.js.map +1 -0
  55. package/dist/transform/operation.d.ts +3 -3
  56. package/dist/transform/operation.js +101 -296
  57. package/dist/transform/operation.js.map +1 -1
  58. package/dist/transform/select.d.ts +3 -0
  59. package/dist/transform/select.js +65 -0
  60. package/dist/transform/select.js.map +1 -0
  61. package/dist/transform/top.js +24 -2
  62. package/dist/transform/top.js.map +1 -1
  63. package/dist/transform.d.ts +1 -1
  64. package/dist/transform.js +4 -0
  65. package/dist/transform.js.map +1 -1
  66. package/dist/tsconfig.tsbuildinfo +1 -1
  67. package/dist/types.d.ts +115 -14
  68. package/dist/types.js +4 -2
  69. package/dist/types.js.map +1 -1
  70. package/dist/utility.d.ts +34 -2
  71. package/dist/utility.js +444 -6
  72. package/dist/utility.js.map +1 -1
  73. package/model/apidef.jsonic +76 -1
  74. package/model/guide.jsonic +14 -44
  75. package/package.json +19 -16
  76. package/src/apidef.ts +258 -122
  77. package/src/builder/entity/{apiEntity.ts → entity.ts} +18 -11
  78. package/src/builder/entity/info.ts +53 -0
  79. package/src/builder/entity.ts +9 -35
  80. package/src/builder/flow/flowHeuristic01.ts +46 -12
  81. package/src/builder/flow.ts +54 -13
  82. package/src/def.ts +91 -0
  83. package/src/desc.ts +154 -0
  84. package/src/guide/guide.ts +208 -134
  85. package/src/guide/heuristic01.ts +1653 -272
  86. package/src/model.ts +143 -0
  87. package/src/parse.ts +50 -59
  88. package/src/resolver.ts +3 -1
  89. package/src/schematron.ts.off +317 -0
  90. package/src/transform/args.ts +98 -0
  91. package/src/transform/clean.ts +45 -11
  92. package/src/transform/entity.ts +96 -50
  93. package/src/transform/field.ts +136 -75
  94. package/src/transform/flow.ts +59 -0
  95. package/src/transform/flowstep.ts +242 -0
  96. package/src/transform/operation.ts +119 -419
  97. package/src/transform/select.ts +119 -0
  98. package/src/transform/top.ts +46 -4
  99. package/src/transform.ts +8 -4
  100. package/src/types.ts +181 -5
  101. package/src/utility.ts +567 -9
  102. package/dist/builder/entity/apiEntity.d.ts +0 -3
  103. package/dist/builder/entity/apiEntity.js.map +0 -1
  104. package/dist/builder/entity/def.d.ts +0 -3
  105. package/dist/builder/entity/def.js +0 -19
  106. package/dist/builder/entity/def.js.map +0 -1
  107. package/src/builder/entity/def.ts +0 -44
  108. package/src/guide.ts.off +0 -136
@@ -0,0 +1,119 @@
1
+
2
+
3
+ import { each } from 'jostraca'
4
+
5
+ import type { TransformResult, Transform } from '../transform'
6
+
7
+
8
+ import { KIT } from '../types'
9
+
10
+ import type {
11
+ KitModel,
12
+ Guide,
13
+ } from '../types'
14
+
15
+ import type {
16
+ PathDef,
17
+ } from '../def'
18
+
19
+ import type {
20
+ OpName,
21
+ ModelOp,
22
+ ModelEntity,
23
+ ModelAlt,
24
+ ModelArg,
25
+ } from '../model'
26
+
27
+
28
+
29
+ const selectTransform: Transform = async function(
30
+ ctx: any,
31
+ ): Promise<TransformResult> {
32
+ const { apimodel, def, guide } = ctx
33
+ const kit: KitModel = apimodel.main[KIT]
34
+
35
+ let msg = 'select '
36
+
37
+ each(kit.entity, (ment: ModelEntity, _entname: string) => {
38
+ each(ment.op, (mop: ModelOp, _opname: OpName) => {
39
+ each(mop.alts, (malt: ModelAlt) => {
40
+ const pdef: PathDef = def.paths[malt.orig]
41
+ resolveSelect(guide, ment, mop, malt, pdef)
42
+ })
43
+ if (null != mop.alts && 0 < mop.alts.length) {
44
+ sortAlts(guide, ment, mop)
45
+ }
46
+ })
47
+
48
+ msg += ment.name + ' '
49
+ })
50
+
51
+ return { ok: true, msg }
52
+ }
53
+
54
+
55
+ function resolveSelect(
56
+ guide: Guide,
57
+ ment: ModelEntity,
58
+ _mop: ModelOp,
59
+ malt: ModelAlt,
60
+ _pdef: PathDef
61
+ ) {
62
+ const select: any = malt.select
63
+ const margs: any = malt.args
64
+
65
+ const argkinds = ['param', 'query', 'header', 'cookie']
66
+
67
+ argkinds.map((kind: string) => {
68
+ each(margs[kind], (marg: ModelArg) => {
69
+ if (!select.exist.includes(marg.name)) {
70
+ select.exist.push(marg.name)
71
+ }
72
+ })
73
+ })
74
+
75
+ select.exist.sort()
76
+
77
+ const gent = guide.entity[ment.name]
78
+ const gpath = gent.path[malt.orig]
79
+
80
+ if (gpath.action) {
81
+ const actname = Object.keys(gpath.action)[0]
82
+
83
+ if (null != actname) {
84
+ select.$action = actname
85
+ }
86
+ }
87
+
88
+ }
89
+
90
+
91
+ function sortAlts(
92
+ _guide: Guide,
93
+ _ment: ModelEntity,
94
+ mop: ModelOp,
95
+ ) {
96
+ mop.alts.sort((a: ModelAlt, b: ModelAlt) => {
97
+ // longest exist len first
98
+ let order = b.select.exist.length - a.select.exist.length
99
+ if (0 === order) {
100
+ if (null != a.select.$action && null != b.select.$action) {
101
+ order = a.select.$action < b.select.$action ? -1 :
102
+ a.select.$action > b.select.$action ? 1 : 0
103
+ }
104
+
105
+ if (0 === order) {
106
+ const a_exist_str = a.select.exist.join('\t')
107
+ const b_exist_str = b.select.exist.join('\t')
108
+ order = a_exist_str < b_exist_str ? -1 :
109
+ a_exist_str > b_exist_str ? 1 : 0
110
+ }
111
+ }
112
+
113
+ return order
114
+ })
115
+ }
116
+
117
+ export {
118
+ selectTransform,
119
+ }
@@ -1,18 +1,55 @@
1
1
 
2
- import { each, getx } from 'jostraca'
2
+ import { joinurl } from '@voxgig/struct'
3
+
4
+ import { KIT } from '../types'
3
5
 
4
6
  import type { TransformResult } from '../transform'
5
7
 
6
- import { fixName } from '../transform'
8
+ import type {
9
+ KitModel,
10
+ } from '../types'
11
+
12
+ import type {
13
+ // GuidePath,
14
+ PathDesc,
15
+ OpDesc,
16
+ } from '../desc'
17
+
18
+ import type {
19
+ OpName,
20
+ } from '../model'
21
+
22
+
23
+ // Guide* => from guide model
24
+ // *Desc => internal working descriptiuon
25
+ // *Def => API spec definition
26
+ // Model* => Generated SDK Model
27
+
28
+
29
+ // type GuideEntity = {
30
+ // name: string,
31
+ // path: Record<string, GuidePath>
32
+
33
+ // paths$: PathDesc[]
34
+ // opm$: Record<OpName, OpDesc>
35
+ // }
7
36
 
8
37
 
9
38
  const topTransform = async function(
10
39
  ctx: any,
11
40
  ): Promise<TransformResult> {
12
41
  const { apimodel, def } = ctx
42
+ const kit: KitModel = apimodel.main[KIT]
43
+
44
+ kit.info = def.info
45
+ kit.info.servers = def.servers ?? []
13
46
 
14
- apimodel.main.def.info = def.info
15
- apimodel.main.def.servers = def.servers
47
+ // Swagger 2.0
48
+ if (def.host) {
49
+ kit.info.servers.push({
50
+ url: (def.schemes?.[0] ?? 'https') + '://' + joinurl([def.host, def.basePath])
51
+ })
52
+ }
16
53
 
17
54
  return { ok: true, msg: 'top' }
18
55
  }
@@ -21,3 +58,8 @@ const topTransform = async function(
21
58
  export {
22
59
  topTransform
23
60
  }
61
+
62
+
63
+ // export type {
64
+ // GuideEntity,
65
+ // }
package/src/transform.ts CHANGED
@@ -10,6 +10,8 @@ import { Gubu, Child, Exact } from 'gubu'
10
10
  import { topTransform } from './transform/top'
11
11
  import { entityTransform } from './transform/entity'
12
12
  import { operationTransform } from './transform/operation'
13
+ import { argsTransform } from './transform/args'
14
+ import { selectTransform } from './transform/select'
13
15
  import { fieldTransform } from './transform/field'
14
16
  // import { manualTransform } from './transform/manual'
15
17
 
@@ -37,10 +39,10 @@ type TransformResult = {
37
39
 
38
40
  type Transform = (
39
41
  ctx: TransformCtx,
40
- guide: Guide,
41
- tspec: TransformSpec,
42
- apimodel: any,
43
- def: any,
42
+ // guide: Guide,
43
+ // tspec: TransformSpec,
44
+ // apimodel: any,
45
+ // def: any,
44
46
  ) => Promise<TransformResult>
45
47
 
46
48
  type ProcessResult = {
@@ -54,6 +56,8 @@ const TRANSFORM: Record<string, Transform> = {
54
56
  top: topTransform,
55
57
  entity: entityTransform,
56
58
  operation: operationTransform,
59
+ args: argsTransform,
60
+ select: selectTransform,
57
61
  field: fieldTransform,
58
62
  // manual: manualTransform,
59
63
  }
package/src/types.ts CHANGED
@@ -6,10 +6,24 @@ import { Pino, prettyPino } from '@voxgig/util'
6
6
  import { Gubu, Open, Any } from 'gubu'
7
7
 
8
8
 
9
+ const KIT = 'kit'
10
+
11
+
9
12
  type FsUtil = typeof Fs
10
13
  type Log = ReturnType<typeof prettyPino>
11
14
 
12
15
 
16
+ type TypeName =
17
+ 'String' |
18
+ 'Number' |
19
+ 'Integer' |
20
+ 'Boolean' |
21
+ 'Null' |
22
+ 'Array' |
23
+ 'Object' |
24
+ 'Any'
25
+
26
+
13
27
  type ApiDefOptions = {
14
28
  def?: string
15
29
  fs?: any
@@ -19,6 +33,9 @@ type ApiDefOptions = {
19
33
  meta?: Record<string, any>
20
34
  outprefix?: string
21
35
  strategy?: string
36
+ why?: {
37
+ show?: boolean
38
+ }
22
39
  }
23
40
 
24
41
  const ControlShape = Gubu({
@@ -40,7 +57,7 @@ const ModelShape = Gubu({
40
57
  name: String,
41
58
  def: String,
42
59
  main: {
43
- sdk: {},
60
+ [KIT]: {},
44
61
  def: {},
45
62
  api: {
46
63
  guide: {},
@@ -80,21 +97,31 @@ type Build = ReturnType<typeof BuildShape>
80
97
 
81
98
  type ApiModel = {
82
99
  main: {
83
- api: {
100
+ kit: {
101
+ info: Record<string, any>
84
102
  entity: Record<string, any>
103
+ flow: Record<string, any>
85
104
  }
86
- def: Record<string, any>
87
105
  }
88
106
  }
89
107
 
90
108
 
109
+ type KitModel = {
110
+ info: Record<string, any>
111
+ entity: Record<string, any>
112
+ flow: Record<string, any>
113
+ }
114
+
115
+
116
+
117
+
91
118
  type ApiDefResult = {
92
119
  ok: boolean
93
120
  start: number
94
121
  end: number
95
122
  steps: string[]
96
- ctrl: Control
97
-
123
+ err?: any
124
+ ctrl?: Control
98
125
  guide?: any
99
126
  apimodel?: any
100
127
  ctx?: any
@@ -102,7 +129,118 @@ type ApiDefResult = {
102
129
  }
103
130
 
104
131
 
132
+ type Metrics = {
133
+ count: {
134
+ path: number
135
+ method: number
136
+ origcmprefs: Record<string, number>,
137
+ cmp: number
138
+ tag: number
139
+ entity: number
140
+ }
141
+ found: {
142
+ cmp: Record<string, any>,
143
+ tag: Record<string, any>,
144
+ }
145
+ }
146
+
147
+
148
+
149
+ type ApiDefContext = {
150
+ fs: any,
151
+ log: any,
152
+ spec: any,
153
+ opts: any,
154
+ util: any,
155
+ defpath: string,
156
+ model: any,
157
+ apimodel: any,
158
+ guide: any,
159
+ def: any,
160
+ note: any,
161
+ warn: any,
162
+ metrics: Metrics,
163
+ work: Record<string, any>
164
+ }
165
+
166
+
167
+ type Warner = {
168
+ history: ({ point: string, when: number } & Record<string, any>)[],
169
+ point: string,
170
+ } & ((details: Record<string, any>) => void)
171
+
172
+
173
+ import type {
174
+ CmpDesc,
175
+ BasicMethodDesc,
176
+ } from './desc'
177
+
178
+ type MethodName = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | ''
179
+
180
+
181
+
182
+ type Guide = {
183
+ metrics: GuideMetrics
184
+ entity: Record<string, GuideEntity>
185
+ control: GuideControl
186
+ }
187
+
188
+ type GuideControl = {}
189
+
190
+ type GuideMetrics = {
191
+ count: {
192
+ path: number
193
+ method: number
194
+ entity: number
195
+ tag: number
196
+ cmp: number
197
+ origcmprefs: Record<string, number>
198
+ },
199
+ found: {
200
+ tag: Record<string, string>
201
+ cmp: Record<string, string>
202
+ }
203
+ }
204
+
205
+
206
+ type GuideEntity = {
207
+ name: string
208
+ orig: string
209
+ path: Record<string, GuidePath>
210
+ }
211
+
212
+ type GuidePath = {
213
+ why_path: string[]
214
+ action: Record<string, GuidePathAction>
215
+ rename: {
216
+ param: Record<string, GuideRenameParam>
217
+ }
218
+ op: Record<string, GuidePathOp>
219
+ }
220
+
221
+ type GuidePathAction = {
222
+ kind: string
223
+ why_action: string[]
224
+ }
225
+
226
+ type GuideRenameParam = {
227
+ target: string
228
+ why_rename: string[]
229
+ }
230
+
231
+ type GuidePathOp = {
232
+ method: string
233
+ why_op: string[]
234
+ transform: {
235
+ req: any
236
+ res: any
237
+ }
238
+ }
239
+
240
+
105
241
  export {
242
+ KIT,
243
+
106
244
  OpenControlShape,
107
245
  OpenModelShape,
108
246
  OpenBuildShape,
@@ -110,6 +248,18 @@ export {
110
248
 
111
249
 
112
250
  export type {
251
+ Guide,
252
+ GuideMetrics,
253
+ GuideEntity,
254
+ GuidePath,
255
+ GuidePathAction,
256
+ GuideRenameParam,
257
+ GuidePathOp,
258
+
259
+ KitModel,
260
+
261
+ MethodName,
262
+ TypeName,
113
263
  Log,
114
264
  FsUtil,
115
265
  ApiDefOptions,
@@ -118,5 +268,31 @@ export type {
118
268
  Model,
119
269
  Build,
120
270
  ApiModel,
271
+ ApiDefContext,
272
+ Warner,
273
+ Metrics,
121
274
  }
122
275
 
276
+ export type {
277
+ CmpDesc,
278
+ BasicMethodDesc,
279
+ MethodDesc,
280
+ MethodEntityDesc,
281
+ EntityDesc,
282
+ EntityPathDesc,
283
+ PathDesc,
284
+ OpDesc,
285
+ } from './desc'
286
+
287
+ export type {
288
+ OpName,
289
+ ModelEntityRelations,
290
+ ModelOpMap,
291
+ ModelFieldOp,
292
+ ModelField,
293
+ ModelArg,
294
+ ModelAlt,
295
+ ModelOp,
296
+ ModelEntity,
297
+ } from './model'
298
+