@dereekb/dbx-cli 13.11.1 → 13.11.3

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 (32) hide show
  1. package/firebase-api-manifest/main.js +142 -25
  2. package/firebase-api-manifest/package.json +1 -1
  3. package/index.cjs.js +202 -26
  4. package/index.esm.js +201 -27
  5. package/manifest-extract/LICENSE +21 -0
  6. package/manifest-extract/index.cjs.default.js +1 -0
  7. package/manifest-extract/index.cjs.js +459 -0
  8. package/manifest-extract/index.cjs.mjs +2 -0
  9. package/manifest-extract/index.d.ts +1 -0
  10. package/manifest-extract/index.esm.js +457 -0
  11. package/manifest-extract/package.json +20 -0
  12. package/manifest-extract/src/index.d.ts +2 -0
  13. package/manifest-extract/src/lib/extract-crud.d.ts +36 -0
  14. package/manifest-extract/src/lib/types.d.ts +86 -0
  15. package/package.json +10 -4
  16. package/src/lib/api/call-model.command.factory.d.ts +1 -0
  17. package/src/lib/auth/auth.command.factory.d.ts +1 -0
  18. package/src/lib/auth/oidc.flow.d.ts +1 -0
  19. package/src/lib/config/env.d.ts +1 -1
  20. package/src/lib/config/paths.d.ts +1 -0
  21. package/src/lib/config/token.cache.d.ts +1 -0
  22. package/src/lib/context/cli.context.d.ts +1 -0
  23. package/src/lib/doctor/doctor.command.factory.d.ts +1 -0
  24. package/src/lib/env/env.command.factory.d.ts +1 -0
  25. package/src/lib/manifest/build-manifest-commands.d.ts +39 -0
  26. package/src/lib/manifest/types.d.ts +20 -0
  27. package/src/lib/middleware/auth.middleware.d.ts +1 -0
  28. package/src/lib/middleware/output.middleware.d.ts +1 -0
  29. package/src/lib/output/output.command.factory.d.ts +1 -0
  30. package/src/lib/runner/run.d.ts +1 -0
  31. package/src/lib/util/context.slot.d.ts +1 -0
  32. package/src/lib/util/output.d.ts +2 -0
@@ -0,0 +1,459 @@
1
+ 'use strict';
2
+
3
+ var tsMorph = require('ts-morph');
4
+
5
+ // 'query' is accepted today even though `<Group>ModelCrudFunctionsConfig` in @dereekb/firebase does not yet permit `query:` keys (deferred follow-up). Once query support lands upstream, every query entry flows through here with no change.
6
+ var SUPPORTED_VERBS = new Set([
7
+ 'create',
8
+ 'read',
9
+ 'update',
10
+ 'delete',
11
+ 'query'
12
+ ]);
13
+ /**
14
+ * Walks a `<model>.api.ts` source and returns one {@link CrudEntry} per
15
+ * callable leaf (CRUD or standalone). Best-effort: malformed configs return
16
+ * fewer entries rather than throwing.
17
+ *
18
+ * @param source - in-memory source name + text pair to extract
19
+ * @returns the CRUD extraction with group name, model keys, entries, and
20
+ * `*Functions` class name (when present).
21
+ */ // eslint-disable-next-line sonarjs/cognitive-complexity
22
+ function extractCrudEntries(source) {
23
+ var project = new tsMorph.Project({
24
+ useInMemoryFileSystem: true,
25
+ skipAddingFilesFromTsConfig: true
26
+ });
27
+ var sourceFile = project.createSourceFile(source.name, source.text, {
28
+ overwrite: true
29
+ });
30
+ var entries = [];
31
+ var modelKeys = [];
32
+ var crudConfigType = findTypeAliasByEnding(sourceFile, 'ModelCrudFunctionsConfig');
33
+ var groupName = inferGroupName(sourceFile);
34
+ var functionsClassName = findFunctionsClassName(sourceFile);
35
+ var typeDocsCache = new Map();
36
+ var resolveTypeDocs = function resolveTypeDocs(typeName) {
37
+ if (!typeName) {
38
+ return undefined;
39
+ }
40
+ if (typeDocsCache.has(typeName)) {
41
+ return typeDocsCache.get(typeName);
42
+ }
43
+ var docs = readTypeDocs(sourceFile, typeName);
44
+ if (docs) {
45
+ typeDocsCache.set(typeName, docs);
46
+ }
47
+ return docs;
48
+ };
49
+ if (crudConfigType) {
50
+ var literal = crudConfigType.getTypeNode();
51
+ if (literal && tsMorph.Node.isTypeLiteral(literal)) {
52
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
53
+ try {
54
+ for(var _iterator = literal.getMembers()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
55
+ var member = _step.value;
56
+ if (!tsMorph.Node.isPropertySignature(member)) {
57
+ continue;
58
+ }
59
+ var modelName = member.getName();
60
+ modelKeys.push(modelName);
61
+ var valueNode = member.getTypeNode();
62
+ if (!valueNode) {
63
+ continue;
64
+ }
65
+ if (isNullLiteralType(valueNode)) {
66
+ continue;
67
+ }
68
+ if (tsMorph.Node.isTypeLiteral(valueNode)) {
69
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
70
+ try {
71
+ for(var _iterator1 = valueNode.getMembers()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
72
+ var verbMember = _step1.value;
73
+ if (!tsMorph.Node.isPropertySignature(verbMember)) {
74
+ continue;
75
+ }
76
+ var verbName = verbMember.getName();
77
+ if (!SUPPORTED_VERBS.has(verbName)) {
78
+ continue;
79
+ }
80
+ var verb = verbName;
81
+ var verbValueNode = verbMember.getTypeNode();
82
+ if (!verbValueNode) {
83
+ continue;
84
+ }
85
+ collectVerbEntries({
86
+ modelName: modelName,
87
+ verb: verb,
88
+ valueNode: verbValueNode,
89
+ entries: entries,
90
+ fallbackDescription: readJsDocSummary(verbMember),
91
+ resolveTypeDocs: resolveTypeDocs
92
+ });
93
+ }
94
+ } catch (err) {
95
+ _didIteratorError1 = true;
96
+ _iteratorError1 = err;
97
+ } finally{
98
+ try {
99
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
100
+ _iterator1.return();
101
+ }
102
+ } finally{
103
+ if (_didIteratorError1) {
104
+ throw _iteratorError1;
105
+ }
106
+ }
107
+ }
108
+ }
109
+ }
110
+ } catch (err) {
111
+ _didIteratorError = true;
112
+ _iteratorError = err;
113
+ } finally{
114
+ try {
115
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
116
+ _iterator.return();
117
+ }
118
+ } finally{
119
+ if (_didIteratorError) {
120
+ throw _iteratorError;
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+ var functionTypeMap = findTypeAliasByEnding(sourceFile, 'FunctionTypeMap');
127
+ if (functionTypeMap) {
128
+ var literal1 = functionTypeMap.getTypeNode();
129
+ if (literal1 && tsMorph.Node.isTypeLiteral(literal1)) {
130
+ var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
131
+ try {
132
+ for(var _iterator2 = literal1.getMembers()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
133
+ var member1 = _step2.value;
134
+ if (!tsMorph.Node.isPropertySignature(member1)) {
135
+ continue;
136
+ }
137
+ var key = member1.getName();
138
+ var valueNode1 = member1.getTypeNode();
139
+ var tuple = valueNode1 ? readTupleParamsResult(valueNode1) : undefined;
140
+ var paramsDocs = resolveTypeDocs(tuple === null || tuple === void 0 ? void 0 : tuple.params);
141
+ var resultDocs = resolveTypeDocs(tuple === null || tuple === void 0 ? void 0 : tuple.result);
142
+ entries.push({
143
+ model: key,
144
+ verb: 'standalone',
145
+ specifier: undefined,
146
+ paramsTypeName: tuple === null || tuple === void 0 ? void 0 : tuple.params,
147
+ resultTypeName: tuple === null || tuple === void 0 ? void 0 : tuple.result,
148
+ line: member1.getStartLineNumber(),
149
+ description: readJsDocSummary(member1),
150
+ paramsTypeDescription: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.typeDescription,
151
+ paramsFields: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.fields,
152
+ resultTypeDescription: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.typeDescription,
153
+ resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields
154
+ });
155
+ }
156
+ } catch (err) {
157
+ _didIteratorError2 = true;
158
+ _iteratorError2 = err;
159
+ } finally{
160
+ try {
161
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
162
+ _iterator2.return();
163
+ }
164
+ } finally{
165
+ if (_didIteratorError2) {
166
+ throw _iteratorError2;
167
+ }
168
+ }
169
+ }
170
+ }
171
+ }
172
+ return {
173
+ groupName: groupName,
174
+ modelKeys: modelKeys,
175
+ entries: entries,
176
+ functionsClassName: functionsClassName
177
+ };
178
+ }
179
+ function findTypeAliasByEnding(sourceFile, ending) {
180
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
181
+ try {
182
+ for(var _iterator = sourceFile.getTypeAliases()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
183
+ var alias = _step.value;
184
+ if (alias.getName().endsWith(ending) && alias.getTypeNode()) {
185
+ return alias;
186
+ }
187
+ }
188
+ } catch (err) {
189
+ _didIteratorError = true;
190
+ _iteratorError = err;
191
+ } finally{
192
+ try {
193
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
194
+ _iterator.return();
195
+ }
196
+ } finally{
197
+ if (_didIteratorError) {
198
+ throw _iteratorError;
199
+ }
200
+ }
201
+ }
202
+ return undefined;
203
+ }
204
+ function findFunctionsClassName(sourceFile) {
205
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
206
+ try {
207
+ for(var _iterator = sourceFile.getClasses()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
208
+ var cls = _step.value;
209
+ if (!cls.isAbstract()) {
210
+ continue;
211
+ }
212
+ var name = cls.getName();
213
+ if (name === null || name === void 0 ? void 0 : name.endsWith('Functions')) {
214
+ return name;
215
+ }
216
+ }
217
+ } catch (err) {
218
+ _didIteratorError = true;
219
+ _iteratorError = err;
220
+ } finally{
221
+ try {
222
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
223
+ _iterator.return();
224
+ }
225
+ } finally{
226
+ if (_didIteratorError) {
227
+ throw _iteratorError;
228
+ }
229
+ }
230
+ }
231
+ return undefined;
232
+ }
233
+ function inferGroupName(sourceFile) {
234
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
235
+ try {
236
+ for(var _iterator = sourceFile.getTypeAliases()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
237
+ var alias = _step.value;
238
+ var name = alias.getName();
239
+ if (name.endsWith('ModelCrudFunctionsConfig')) {
240
+ var stem = name.slice(0, -'ModelCrudFunctionsConfig'.length);
241
+ if (stem.length > 0) {
242
+ return stem;
243
+ }
244
+ }
245
+ }
246
+ } catch (err) {
247
+ _didIteratorError = true;
248
+ _iteratorError = err;
249
+ } finally{
250
+ try {
251
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
252
+ _iterator.return();
253
+ }
254
+ } finally{
255
+ if (_didIteratorError) {
256
+ throw _iteratorError;
257
+ }
258
+ }
259
+ }
260
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
261
+ try {
262
+ for(var _iterator1 = sourceFile.getTypeAliases()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
263
+ var alias1 = _step1.value;
264
+ var name1 = alias1.getName();
265
+ if (name1.endsWith('FunctionTypeMap')) {
266
+ var stem1 = name1.slice(0, -'FunctionTypeMap'.length);
267
+ if (stem1.length > 0) {
268
+ return stem1;
269
+ }
270
+ }
271
+ }
272
+ } catch (err) {
273
+ _didIteratorError1 = true;
274
+ _iteratorError1 = err;
275
+ } finally{
276
+ try {
277
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
278
+ _iterator1.return();
279
+ }
280
+ } finally{
281
+ if (_didIteratorError1) {
282
+ throw _iteratorError1;
283
+ }
284
+ }
285
+ }
286
+ return undefined;
287
+ }
288
+ function isNullLiteralType(node) {
289
+ if (tsMorph.Node.isLiteralTypeNode(node)) {
290
+ var literal = node.getLiteral();
291
+ if (tsMorph.Node.isNullLiteral(literal)) {
292
+ return true;
293
+ }
294
+ }
295
+ return false;
296
+ }
297
+ function collectVerbEntries(input) {
298
+ var _readTupleParamsResult;
299
+ var modelName = input.modelName, verb = input.verb, valueNode = input.valueNode, entries = input.entries, fallbackDescription = input.fallbackDescription, resolveTypeDocs = input.resolveTypeDocs;
300
+ if (tsMorph.Node.isTypeLiteral(valueNode)) {
301
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
302
+ try {
303
+ for(var _iterator = valueNode.getMembers()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
304
+ var specMember = _step.value;
305
+ var _readTupleParamsResult1;
306
+ if (!tsMorph.Node.isPropertySignature(specMember)) {
307
+ continue;
308
+ }
309
+ var specifier = specMember.getName();
310
+ var leafNode = specMember.getTypeNode();
311
+ var leaf = leafNode ? (_readTupleParamsResult1 = readTupleParamsResult(leafNode)) !== null && _readTupleParamsResult1 !== void 0 ? _readTupleParamsResult1 : readBareParams(leafNode) : undefined;
312
+ var paramsDocs = resolveTypeDocs(leaf === null || leaf === void 0 ? void 0 : leaf.params);
313
+ var resultDocs = resolveTypeDocs(leaf === null || leaf === void 0 ? void 0 : leaf.result);
314
+ entries.push({
315
+ model: modelName,
316
+ verb: verb,
317
+ specifier: specifier,
318
+ paramsTypeName: leaf === null || leaf === void 0 ? void 0 : leaf.params,
319
+ resultTypeName: leaf === null || leaf === void 0 ? void 0 : leaf.result,
320
+ line: specMember.getStartLineNumber(),
321
+ description: readJsDocSummary(specMember),
322
+ paramsTypeDescription: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.typeDescription,
323
+ paramsFields: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.fields,
324
+ resultTypeDescription: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.typeDescription,
325
+ resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields
326
+ });
327
+ }
328
+ } catch (err) {
329
+ _didIteratorError = true;
330
+ _iteratorError = err;
331
+ } finally{
332
+ try {
333
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
334
+ _iterator.return();
335
+ }
336
+ } finally{
337
+ if (_didIteratorError) {
338
+ throw _iteratorError;
339
+ }
340
+ }
341
+ }
342
+ return;
343
+ }
344
+ var leaf1 = (_readTupleParamsResult = readTupleParamsResult(valueNode)) !== null && _readTupleParamsResult !== void 0 ? _readTupleParamsResult : readBareParams(valueNode);
345
+ var paramsDocs1 = resolveTypeDocs(leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.params);
346
+ var resultDocs1 = resolveTypeDocs(leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.result);
347
+ entries.push({
348
+ model: modelName,
349
+ verb: verb,
350
+ specifier: undefined,
351
+ paramsTypeName: leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.params,
352
+ resultTypeName: leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.result,
353
+ line: valueNode.getStartLineNumber(),
354
+ description: fallbackDescription,
355
+ paramsTypeDescription: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.typeDescription,
356
+ paramsFields: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.fields,
357
+ resultTypeDescription: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.typeDescription,
358
+ resultFields: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.fields
359
+ });
360
+ }
361
+ function readTupleParamsResult(node) {
362
+ if (!tsMorph.Node.isTupleTypeNode(node)) {
363
+ return undefined;
364
+ }
365
+ var elements = node.getElements();
366
+ if (elements.length === 0) {
367
+ return undefined;
368
+ }
369
+ var params = elements[0] ? typeNodeName(elements[0]) : undefined;
370
+ var result = elements[1] ? typeNodeName(elements[1]) : undefined;
371
+ return {
372
+ params: params,
373
+ result: result
374
+ };
375
+ }
376
+ function readBareParams(node) {
377
+ var params = typeNodeName(node);
378
+ if (!params) {
379
+ return undefined;
380
+ }
381
+ return {
382
+ params: params,
383
+ result: undefined
384
+ };
385
+ }
386
+ function typeNodeName(node) {
387
+ if (tsMorph.Node.isTypeReference(node)) {
388
+ return node.getTypeName().getText();
389
+ }
390
+ // Fall back to the raw text for primitive / inline types like `boolean`.
391
+ var text = node.getText().trim();
392
+ return text.length > 0 ? text : undefined;
393
+ }
394
+ function readTypeDocs(sourceFile, typeName) {
395
+ var interfaceDecl = sourceFile.getInterface(typeName);
396
+ if (interfaceDecl) {
397
+ var typeDescription = readJsDocSummary(interfaceDecl);
398
+ var fields = [];
399
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
400
+ try {
401
+ for(var _iterator = interfaceDecl.getProperties()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
402
+ var property = _step.value;
403
+ var _ref;
404
+ var fieldName = property.getName();
405
+ var description = readJsDocSummary(property);
406
+ var typeNode = property.getTypeNode();
407
+ var typeText = (_ref = typeNode === null || typeNode === void 0 ? void 0 : typeNode.getText().trim()) !== null && _ref !== void 0 ? _ref : '';
408
+ var field = description ? {
409
+ name: fieldName,
410
+ typeText: typeText,
411
+ description: description
412
+ } : {
413
+ name: fieldName,
414
+ typeText: typeText
415
+ };
416
+ fields.push(field);
417
+ }
418
+ } catch (err) {
419
+ _didIteratorError = true;
420
+ _iteratorError = err;
421
+ } finally{
422
+ try {
423
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
424
+ _iterator.return();
425
+ }
426
+ } finally{
427
+ if (_didIteratorError) {
428
+ throw _iteratorError;
429
+ }
430
+ }
431
+ }
432
+ if (!typeDescription && fields.length === 0) {
433
+ return undefined;
434
+ }
435
+ return {
436
+ typeDescription: typeDescription,
437
+ fields: fields.length > 0 ? fields : undefined
438
+ };
439
+ }
440
+ var typeAlias = sourceFile.getTypeAlias(typeName);
441
+ if (typeAlias) {
442
+ var typeDescription1 = readJsDocSummary(typeAlias);
443
+ return typeDescription1 ? {
444
+ typeDescription: typeDescription1
445
+ } : undefined;
446
+ }
447
+ return undefined;
448
+ }
449
+ function readJsDocSummary(node) {
450
+ var docs = node.getJsDocs();
451
+ if (docs.length === 0) {
452
+ return undefined;
453
+ }
454
+ var last = docs[docs.length - 1];
455
+ var description = last.getDescription().trim();
456
+ return description.length > 0 ? description : undefined;
457
+ }
458
+
459
+ exports.extractCrudEntries = extractCrudEntries;
@@ -0,0 +1,2 @@
1
+ export * from './index.cjs.js';
2
+ export { _default as default } from './index.cjs.default.js';
@@ -0,0 +1 @@
1
+ export * from "./src/index";