@dereekb/dbx-cli 13.37.0 → 13.39.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 (106) hide show
  1. package/eslint/package.json +8 -8
  2. package/firebase-api-manifest/main.js +191 -166
  3. package/firebase-api-manifest/package.json +3 -3
  4. package/firestore-query-manifest/main.js +2063 -0
  5. package/firestore-query-manifest/package.json +13 -0
  6. package/firestore-rules/src/firestore-rules-scan.d.ts +89 -0
  7. package/firestore-rules/src/index.d.ts +1 -0
  8. package/generate-firestore-indexes/main.js +2 -2
  9. package/generate-firestore-indexes/package.json +2 -2
  10. package/generate-mcp-manifest/main.js +1 -0
  11. package/generate-mcp-manifest/package.json +3 -3
  12. package/generate-route-manifest/package.json +2 -2
  13. package/index.esm.js +12615 -6863
  14. package/lint-cache/package.json +2 -2
  15. package/manifest-extract/index.esm.js +4 -1
  16. package/manifest-extract/package.json +7 -7
  17. package/manifest-extract/src/lib/types.d.ts +6 -0
  18. package/model-test/LICENSE +21 -0
  19. package/model-test/index.d.ts +1 -0
  20. package/model-test/index.esm.js +5984 -0
  21. package/model-test/package.json +21 -0
  22. package/model-test/src/index.d.ts +41 -0
  23. package/model-test/src/lib/fixture/archetype.d.ts +33 -0
  24. package/model-test/src/lib/fixture/extract.d.ts +37 -0
  25. package/model-test/src/lib/fixture/format.json.d.ts +24 -0
  26. package/model-test/src/lib/fixture/format.markdown.d.ts +23 -0
  27. package/model-test/src/lib/fixture/forward.d.ts +48 -0
  28. package/model-test/src/lib/fixture/framework-fixtures.d.ts +70 -0
  29. package/model-test/src/lib/fixture/inspect.d.ts +22 -0
  30. package/model-test/src/lib/fixture/scaffold.d.ts +74 -0
  31. package/model-test/src/lib/fixture/types.d.ts +175 -0
  32. package/model-test/src/lib/test/discover.d.ts +81 -0
  33. package/model-test/src/lib/test/extract.d.ts +49 -0
  34. package/model-test/src/lib/test/format.hotspots.d.ts +23 -0
  35. package/model-test/src/lib/test/format.json.d.ts +25 -0
  36. package/model-test/src/lib/test/format.list-app.d.ts +30 -0
  37. package/model-test/src/lib/test/format.markdown.d.ts +25 -0
  38. package/model-test/src/lib/test/hotspots.d.ts +98 -0
  39. package/model-test/src/lib/test/inspect.d.ts +32 -0
  40. package/model-test/src/lib/test/search.d.ts +34 -0
  41. package/model-test/src/lib/test/types.d.ts +179 -0
  42. package/package.json +23 -22
  43. package/route/package.json +12 -12
  44. package/src/lib/api/firestore-session.client.d.ts +54 -0
  45. package/src/lib/api/get-args.helper.d.ts +4 -1
  46. package/src/lib/api/get-many.command.d.ts +8 -3
  47. package/src/lib/api/get.command.d.ts +13 -5
  48. package/src/lib/api/index.d.ts +1 -0
  49. package/src/lib/config/env.d.ts +106 -0
  50. package/src/lib/config/firestore-session.cache.d.ts +86 -0
  51. package/src/lib/config/index.d.ts +1 -0
  52. package/src/lib/config/paths.d.ts +3 -1
  53. package/src/lib/context/cli.context.d.ts +87 -3
  54. package/src/lib/doctor/firestore-session.check.d.ts +113 -0
  55. package/src/lib/doctor/index.d.ts +1 -0
  56. package/src/lib/firestore/firestore-get.command.d.ts +28 -0
  57. package/src/lib/firestore/firestore-queries.command.d.ts +26 -0
  58. package/src/lib/firestore/firestore-query.command.d.ts +25 -0
  59. package/src/lib/firestore/firestore.accessor.d.ts +85 -0
  60. package/src/lib/firestore/firestore.collection.d.ts +44 -0
  61. package/src/lib/firestore/firestore.error.d.ts +14 -0
  62. package/src/lib/firestore/firestore.models.d.ts +223 -0
  63. package/src/lib/firestore/firestore.query-params.d.ts +34 -0
  64. package/src/lib/firestore/firestore.query.d.ts +79 -0
  65. package/src/lib/firestore/firestore.read.d.ts +180 -0
  66. package/src/lib/firestore/firestore.session.d.ts +97 -0
  67. package/src/lib/firestore/index.d.ts +13 -0
  68. package/src/lib/firestore/query-info-utils.d.ts +48 -0
  69. package/src/lib/firestore/query-registry.d.ts +32 -0
  70. package/src/lib/index.d.ts +3 -0
  71. package/src/lib/manifest/types.d.ts +117 -0
  72. package/src/lib/mcp-scan/manifest/dbx-docs-ui-examples-schema.d.ts +2 -2
  73. package/src/lib/mcp-scan/manifest/model-snapshot-fields-schema.d.ts +2 -2
  74. package/src/lib/mcp-scan/manifest/pipes-schema.d.ts +2 -2
  75. package/src/lib/mcp-scan/manifest/ui-components-schema.d.ts +2 -2
  76. package/src/lib/mcp-scan/manifest/utils-schema.d.ts +2 -2
  77. package/src/lib/mcp-scan/scan/dbx-docs-ui-examples-extract.d.ts +1 -1
  78. package/src/lib/mcp-scan/scan/extract-models/types.d.ts +5 -0
  79. package/src/lib/mcp-scan/scan/ui-components-extract.d.ts +1 -1
  80. package/src/lib/middleware/auth.middleware.d.ts +6 -0
  81. package/src/lib/runner/run.d.ts +28 -1
  82. package/src/lib/scan-helpers/emit-generated-ts.d.ts +76 -0
  83. package/src/lib/scan-helpers/exported-from-package.d.ts +29 -0
  84. package/src/lib/util/index.d.ts +1 -0
  85. package/src/lib/util/output.d.ts +10 -0
  86. package/src/lib/util/stdin.d.ts +39 -2
  87. package/src/lib/util/table.d.ts +40 -0
  88. package/test/index.esm.js +4 -2
  89. package/test/package.json +14 -14
  90. package/test/src/lib/cli-test.d.ts +12 -2
  91. package/validate/LICENSE +21 -0
  92. package/validate/index.js +16641 -0
  93. package/validate/package.json +11 -0
  94. package/eslint/index.cjs.default.js +0 -1
  95. package/eslint/index.cjs.js +0 -1112
  96. package/eslint/index.cjs.mjs +0 -2
  97. package/index.cjs.js +0 -59813
  98. package/manifest-extract/index.cjs.default.js +0 -1
  99. package/manifest-extract/index.cjs.js +0 -1592
  100. package/manifest-extract/index.cjs.mjs +0 -2
  101. package/route/index.cjs.default.js +0 -1
  102. package/route/index.cjs.js +0 -18
  103. package/route/index.cjs.mjs +0 -2
  104. package/test/index.cjs.default.js +0 -1
  105. package/test/index.cjs.js +0 -381
  106. package/test/index.cjs.mjs +0 -2
@@ -1,1592 +0,0 @@
1
- 'use strict';
2
-
3
- var tsMorph = require('ts-morph');
4
- var dbxCli = require('@dereekb/dbx-cli');
5
-
6
- function _define_property$1(obj, key, value) {
7
- if (key in obj) {
8
- Object.defineProperty(obj, key, {
9
- value: value,
10
- enumerable: true,
11
- configurable: true,
12
- writable: true
13
- });
14
- } else {
15
- obj[key] = value;
16
- }
17
- return obj;
18
- }
19
- function _object_spread$1(target) {
20
- for(var i = 1; i < arguments.length; i++){
21
- var source = arguments[i] != null ? arguments[i] : {};
22
- var ownKeys = Object.keys(source);
23
- if (typeof Object.getOwnPropertySymbols === "function") {
24
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
25
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
26
- }));
27
- }
28
- ownKeys.forEach(function(key) {
29
- _define_property$1(target, key, source[key]);
30
- });
31
- }
32
- return target;
33
- }
34
- function ownKeys$1(object, enumerableOnly) {
35
- var keys = Object.keys(object);
36
- if (Object.getOwnPropertySymbols) {
37
- var symbols = Object.getOwnPropertySymbols(object);
38
- keys.push.apply(keys, symbols);
39
- }
40
- return keys;
41
- }
42
- function _object_spread_props$1(target, source) {
43
- source = source != null ? source : {};
44
- if (Object.getOwnPropertyDescriptors) {
45
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
46
- } else {
47
- ownKeys$1(Object(source)).forEach(function(key) {
48
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
49
- });
50
- }
51
- return target;
52
- }
53
- var SUPPORTED_VERBS = new Set([
54
- 'create',
55
- 'read',
56
- 'update',
57
- 'delete',
58
- 'query',
59
- 'invoke'
60
- ]);
61
- /**
62
- * JSDoc tag (without leading `@`) on a CRUD leaf naming the interface that a handler's
63
- * `mapSuccessfulResult` produces for MCP. When present, the MCP manifest output schema is
64
- * synthesized from this type instead of the raw result type.
65
- */ var DBX_MODEL_API_MCP_RESULT_MARKER = 'dbxModelApiMcpResult';
66
- /**
67
- * Walks a `<model>.api.ts` source and returns one {@link CrudEntry} per
68
- * callable leaf (CRUD or standalone). Best-effort: malformed configs return
69
- * fewer entries rather than throwing.
70
- *
71
- * @param source - In-memory source name + text pair to extract.
72
- * @returns The CRUD extraction with group name, model keys, entries, and
73
- * `*Functions` class name (when present).
74
- */ // eslint-disable-next-line sonarjs/cognitive-complexity
75
- function extractCrudEntries(source) {
76
- var project = new tsMorph.Project({
77
- useInMemoryFileSystem: true,
78
- skipAddingFilesFromTsConfig: true
79
- });
80
- var sourceFile = project.createSourceFile(source.name, source.text, {
81
- overwrite: true
82
- });
83
- var entries = [];
84
- var modelKeys = [];
85
- var crudConfigType = findTypeAliasByEnding(sourceFile, 'ModelCrudFunctionsConfig');
86
- var groupName = inferGroupName(sourceFile);
87
- var functionsClassName = findFunctionsClassName(sourceFile);
88
- var typeDocsCache = new Map();
89
- var resolveTypeDocs = function resolveTypeDocs(typeName) {
90
- var result;
91
- if (typeName) {
92
- if (typeDocsCache.has(typeName)) {
93
- result = typeDocsCache.get(typeName);
94
- } else {
95
- result = readTypeDocs(sourceFile, typeName);
96
- if (result) {
97
- typeDocsCache.set(typeName, result);
98
- }
99
- }
100
- }
101
- return result;
102
- };
103
- if (crudConfigType) {
104
- var literal = crudConfigType.getTypeNode();
105
- if (literal && tsMorph.Node.isTypeLiteral(literal)) {
106
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
107
- try {
108
- for(var _iterator = literal.getMembers()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
109
- var member = _step.value;
110
- if (!tsMorph.Node.isPropertySignature(member)) {
111
- continue;
112
- }
113
- var modelName = member.getName();
114
- modelKeys.push(modelName);
115
- var valueNode = member.getTypeNode();
116
- if (!valueNode) {
117
- continue;
118
- }
119
- if (isNullLiteralType(valueNode)) {
120
- continue;
121
- }
122
- if (tsMorph.Node.isTypeLiteral(valueNode)) {
123
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
124
- try {
125
- for(var _iterator1 = valueNode.getMembers()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
126
- var verbMember = _step1.value;
127
- if (!tsMorph.Node.isPropertySignature(verbMember)) {
128
- continue;
129
- }
130
- var verbName = verbMember.getName();
131
- if (!SUPPORTED_VERBS.has(verbName)) {
132
- continue;
133
- }
134
- var verb = verbName;
135
- var verbValueNode = verbMember.getTypeNode();
136
- if (!verbValueNode) {
137
- continue;
138
- }
139
- collectVerbEntries({
140
- modelName: modelName,
141
- verb: verb,
142
- valueNode: verbValueNode,
143
- entries: entries,
144
- fallbackDescription: readJsDocSummary(verbMember),
145
- fallbackMcpResultTypeName: readJsDocTagValue(verbMember, DBX_MODEL_API_MCP_RESULT_MARKER),
146
- resolveTypeDocs: resolveTypeDocs
147
- });
148
- }
149
- } catch (err) {
150
- _didIteratorError1 = true;
151
- _iteratorError1 = err;
152
- } finally{
153
- try {
154
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
155
- _iterator1.return();
156
- }
157
- } finally{
158
- if (_didIteratorError1) {
159
- throw _iteratorError1;
160
- }
161
- }
162
- }
163
- }
164
- }
165
- } catch (err) {
166
- _didIteratorError = true;
167
- _iteratorError = err;
168
- } finally{
169
- try {
170
- if (!_iteratorNormalCompletion && _iterator.return != null) {
171
- _iterator.return();
172
- }
173
- } finally{
174
- if (_didIteratorError) {
175
- throw _iteratorError;
176
- }
177
- }
178
- }
179
- }
180
- }
181
- var functionTypeMap = findTypeAliasByEnding(sourceFile, 'FunctionTypeMap');
182
- if (functionTypeMap) {
183
- var literal1 = functionTypeMap.getTypeNode();
184
- if (literal1 && tsMorph.Node.isTypeLiteral(literal1)) {
185
- var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
186
- try {
187
- for(var _iterator2 = literal1.getMembers()[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
188
- var member1 = _step2.value;
189
- if (!tsMorph.Node.isPropertySignature(member1)) {
190
- continue;
191
- }
192
- var key = member1.getName();
193
- var valueNode1 = member1.getTypeNode();
194
- var tuple = valueNode1 ? readTupleParamsResult(valueNode1) : undefined;
195
- var paramsDocs = resolveTypeDocs(tuple === null || tuple === void 0 ? void 0 : tuple.params);
196
- var resultDocs = resolveTypeDocs(tuple === null || tuple === void 0 ? void 0 : tuple.result);
197
- var mcpResultTypeName = readJsDocTagValue(member1, DBX_MODEL_API_MCP_RESULT_MARKER);
198
- var mcpResultDocs = resolveTypeDocs(mcpResultTypeName);
199
- entries.push({
200
- model: key,
201
- verb: 'standalone',
202
- specifier: undefined,
203
- paramsTypeName: tuple === null || tuple === void 0 ? void 0 : tuple.params,
204
- resultTypeName: tuple === null || tuple === void 0 ? void 0 : tuple.result,
205
- line: member1.getStartLineNumber(),
206
- description: readJsDocSummary(member1),
207
- paramsTypeDescription: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.typeDescription,
208
- paramsFields: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.fields,
209
- paramsHasApiParamsTag: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.hasApiParamsTag,
210
- resultTypeDescription: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.typeDescription,
211
- resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields,
212
- mcpResultTypeName: mcpResultTypeName,
213
- mcpResultTypeDescription: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.typeDescription,
214
- mcpResultFields: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.fields
215
- });
216
- }
217
- } catch (err) {
218
- _didIteratorError2 = true;
219
- _iteratorError2 = err;
220
- } finally{
221
- try {
222
- if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
223
- _iterator2.return();
224
- }
225
- } finally{
226
- if (_didIteratorError2) {
227
- throw _iteratorError2;
228
- }
229
- }
230
- }
231
- }
232
- }
233
- return {
234
- groupName: groupName,
235
- modelKeys: modelKeys,
236
- entries: entries,
237
- functionsClassName: functionsClassName
238
- };
239
- }
240
- function findTypeAliasByEnding(sourceFile, ending) {
241
- var result;
242
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
243
- try {
244
- for(var _iterator = sourceFile.getTypeAliases()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
245
- var alias = _step.value;
246
- if (alias.getName().endsWith(ending) && alias.getTypeNode()) {
247
- result = alias;
248
- break;
249
- }
250
- }
251
- } catch (err) {
252
- _didIteratorError = true;
253
- _iteratorError = err;
254
- } finally{
255
- try {
256
- if (!_iteratorNormalCompletion && _iterator.return != null) {
257
- _iterator.return();
258
- }
259
- } finally{
260
- if (_didIteratorError) {
261
- throw _iteratorError;
262
- }
263
- }
264
- }
265
- return result;
266
- }
267
- function findFunctionsClassName(sourceFile) {
268
- var result;
269
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
270
- try {
271
- for(var _iterator = sourceFile.getClasses()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
272
- var cls = _step.value;
273
- if (!cls.isAbstract()) {
274
- continue;
275
- }
276
- var name = cls.getName();
277
- if (name === null || name === void 0 ? void 0 : name.endsWith('Functions')) {
278
- result = name;
279
- break;
280
- }
281
- }
282
- } catch (err) {
283
- _didIteratorError = true;
284
- _iteratorError = err;
285
- } finally{
286
- try {
287
- if (!_iteratorNormalCompletion && _iterator.return != null) {
288
- _iterator.return();
289
- }
290
- } finally{
291
- if (_didIteratorError) {
292
- throw _iteratorError;
293
- }
294
- }
295
- }
296
- return result;
297
- }
298
- function inferGroupName(sourceFile) {
299
- var _findTypeAliasStem;
300
- return (_findTypeAliasStem = findTypeAliasStem(sourceFile, 'ModelCrudFunctionsConfig')) !== null && _findTypeAliasStem !== void 0 ? _findTypeAliasStem : findTypeAliasStem(sourceFile, 'FunctionTypeMap');
301
- }
302
- /**
303
- * Finds the first type alias whose name ends with `ending` and returns the
304
- * non-empty stem (the name with `ending` stripped).
305
- *
306
- * @param sourceFile - The parsed `<model>.api.ts` source.
307
- * @param ending - The type-alias name suffix to match.
308
- * @returns The stem preceding `ending`, or `undefined` when no alias matches with a non-empty stem.
309
- */ function findTypeAliasStem(sourceFile, ending) {
310
- var result;
311
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
312
- try {
313
- for(var _iterator = sourceFile.getTypeAliases()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
314
- var alias = _step.value;
315
- var name = alias.getName();
316
- if (name.endsWith(ending)) {
317
- var stem = name.slice(0, -ending.length);
318
- if (stem.length > 0) {
319
- result = stem;
320
- break;
321
- }
322
- }
323
- }
324
- } catch (err) {
325
- _didIteratorError = true;
326
- _iteratorError = err;
327
- } finally{
328
- try {
329
- if (!_iteratorNormalCompletion && _iterator.return != null) {
330
- _iterator.return();
331
- }
332
- } finally{
333
- if (_didIteratorError) {
334
- throw _iteratorError;
335
- }
336
- }
337
- }
338
- return result;
339
- }
340
- function isNullLiteralType(node) {
341
- var result = false;
342
- if (tsMorph.Node.isLiteralTypeNode(node)) {
343
- var literal = node.getLiteral();
344
- if (tsMorph.Node.isNullLiteral(literal)) {
345
- result = true;
346
- }
347
- }
348
- return result;
349
- }
350
- function collectVerbEntries(input) {
351
- var _readTupleParamsResult;
352
- var modelName = input.modelName, verb = input.verb, valueNode = input.valueNode, entries = input.entries, fallbackDescription = input.fallbackDescription, fallbackMcpResultTypeName = input.fallbackMcpResultTypeName, resolveTypeDocs = input.resolveTypeDocs;
353
- if (tsMorph.Node.isTypeLiteral(valueNode)) {
354
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
355
- try {
356
- for(var _iterator = valueNode.getMembers()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
357
- var specMember = _step.value;
358
- var _readTupleParamsResult1;
359
- if (!tsMorph.Node.isPropertySignature(specMember)) {
360
- continue;
361
- }
362
- var specifier = specMember.getName();
363
- var leafNode = specMember.getTypeNode();
364
- var leaf = leafNode ? (_readTupleParamsResult1 = readTupleParamsResult(leafNode)) !== null && _readTupleParamsResult1 !== void 0 ? _readTupleParamsResult1 : readBareParams(leafNode) : undefined;
365
- var paramsDocs = resolveTypeDocs(leaf === null || leaf === void 0 ? void 0 : leaf.params);
366
- var resultDocs = resolveTypeDocs(leaf === null || leaf === void 0 ? void 0 : leaf.result);
367
- var mcpResultTypeName = readJsDocTagValue(specMember, DBX_MODEL_API_MCP_RESULT_MARKER);
368
- var mcpResultDocs = resolveTypeDocs(mcpResultTypeName);
369
- entries.push({
370
- model: modelName,
371
- verb: verb,
372
- specifier: specifier,
373
- paramsTypeName: leaf === null || leaf === void 0 ? void 0 : leaf.params,
374
- resultTypeName: leaf === null || leaf === void 0 ? void 0 : leaf.result,
375
- line: specMember.getStartLineNumber(),
376
- description: readJsDocSummary(specMember),
377
- paramsTypeDescription: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.typeDescription,
378
- paramsFields: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.fields,
379
- paramsHasApiParamsTag: paramsDocs === null || paramsDocs === void 0 ? void 0 : paramsDocs.hasApiParamsTag,
380
- resultTypeDescription: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.typeDescription,
381
- resultFields: resultDocs === null || resultDocs === void 0 ? void 0 : resultDocs.fields,
382
- mcpResultTypeName: mcpResultTypeName,
383
- mcpResultTypeDescription: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.typeDescription,
384
- mcpResultFields: mcpResultDocs === null || mcpResultDocs === void 0 ? void 0 : mcpResultDocs.fields
385
- });
386
- }
387
- } catch (err) {
388
- _didIteratorError = true;
389
- _iteratorError = err;
390
- } finally{
391
- try {
392
- if (!_iteratorNormalCompletion && _iterator.return != null) {
393
- _iterator.return();
394
- }
395
- } finally{
396
- if (_didIteratorError) {
397
- throw _iteratorError;
398
- }
399
- }
400
- }
401
- return;
402
- }
403
- var leaf1 = (_readTupleParamsResult = readTupleParamsResult(valueNode)) !== null && _readTupleParamsResult !== void 0 ? _readTupleParamsResult : readBareParams(valueNode);
404
- var paramsDocs1 = resolveTypeDocs(leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.params);
405
- var resultDocs1 = resolveTypeDocs(leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.result);
406
- var mcpResultDocs1 = resolveTypeDocs(fallbackMcpResultTypeName);
407
- entries.push({
408
- model: modelName,
409
- verb: verb,
410
- specifier: undefined,
411
- paramsTypeName: leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.params,
412
- resultTypeName: leaf1 === null || leaf1 === void 0 ? void 0 : leaf1.result,
413
- line: valueNode.getStartLineNumber(),
414
- description: fallbackDescription,
415
- paramsTypeDescription: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.typeDescription,
416
- paramsFields: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.fields,
417
- paramsHasApiParamsTag: paramsDocs1 === null || paramsDocs1 === void 0 ? void 0 : paramsDocs1.hasApiParamsTag,
418
- resultTypeDescription: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.typeDescription,
419
- resultFields: resultDocs1 === null || resultDocs1 === void 0 ? void 0 : resultDocs1.fields,
420
- mcpResultTypeName: fallbackMcpResultTypeName,
421
- mcpResultTypeDescription: mcpResultDocs1 === null || mcpResultDocs1 === void 0 ? void 0 : mcpResultDocs1.typeDescription,
422
- mcpResultFields: mcpResultDocs1 === null || mcpResultDocs1 === void 0 ? void 0 : mcpResultDocs1.fields
423
- });
424
- }
425
- function readTupleParamsResult(node) {
426
- var pair;
427
- if (tsMorph.Node.isTupleTypeNode(node)) {
428
- var elements = node.getElements();
429
- if (elements.length > 0) {
430
- var params = elements[0] ? typeNodeName(elements[0]) : undefined;
431
- var result = elements[1] ? typeNodeName(elements[1]) : undefined;
432
- pair = {
433
- params: params,
434
- result: result
435
- };
436
- }
437
- }
438
- return pair;
439
- }
440
- function readBareParams(node) {
441
- var params = typeNodeName(node);
442
- return params ? {
443
- params: params,
444
- result: undefined
445
- } : undefined;
446
- }
447
- function typeNodeName(node) {
448
- var result;
449
- if (tsMorph.Node.isTypeReference(node)) {
450
- result = node.getTypeName().getText();
451
- } else {
452
- // Fall back to the raw text for primitive / inline types like `boolean`.
453
- var text = node.getText().trim();
454
- result = text.length > 0 ? text : undefined;
455
- }
456
- return result;
457
- }
458
- function readTypeDocs(sourceFile, typeName) {
459
- var interfaceDecl = sourceFile.getInterface(typeName);
460
- var result;
461
- if (interfaceDecl) {
462
- result = readInterfaceTypeDocs(interfaceDecl);
463
- } else {
464
- var typeAlias = sourceFile.getTypeAlias(typeName);
465
- result = typeAlias ? readTypeAliasDocs(typeAlias) : undefined;
466
- }
467
- return result;
468
- }
469
- /**
470
- * Reads the type-level JSDoc (summary, fields, `@dbxModelApiParams` flag) of a
471
- * resolved interface declaration.
472
- *
473
- * @param interfaceDecl - The interface naming a params/result type.
474
- * @returns The collected docs, or `undefined` when the interface has no description, fields, or marker.
475
- */ function readInterfaceTypeDocs(interfaceDecl) {
476
- var typeDescription = readJsDocSummary(interfaceDecl);
477
- var hasApiParamsTag = hasJsDocFlag(interfaceDecl, 'dbxModelApiParams');
478
- var fields = interfaceDecl.getProperties().map(function(property) {
479
- return readInterfaceField(property);
480
- });
481
- var result;
482
- if (typeDescription || fields.length > 0 || hasApiParamsTag) {
483
- result = _object_spread_props$1(_object_spread$1({}, typeDescription ? {
484
- typeDescription: typeDescription
485
- } : {}, fields.length > 0 ? {
486
- fields: fields
487
- } : {}), {
488
- hasApiParamsTag: hasApiParamsTag
489
- });
490
- }
491
- return result;
492
- }
493
- /**
494
- * Reads one interface property into a {@link CrudEntryDocField}, capturing its
495
- * type text, JSDoc summary, and `@dbxModelApiAdminOnly` access level.
496
- *
497
- * @param property - The interface property signature.
498
- * @returns The doc field for the property.
499
- */ function readInterfaceField(property) {
500
- var _ref;
501
- var _property_getTypeNode;
502
- var description = readJsDocSummary(property);
503
- var adminOnly = hasJsDocFlag(property, 'dbxModelApiAdminOnly');
504
- return _object_spread$1({
505
- name: property.getName(),
506
- typeText: (_ref = (_property_getTypeNode = property.getTypeNode()) === null || _property_getTypeNode === void 0 ? void 0 : _property_getTypeNode.getText().trim()) !== null && _ref !== void 0 ? _ref : ''
507
- }, description ? {
508
- description: description
509
- } : {}, adminOnly ? {
510
- accessLevel: 'adminOnly'
511
- } : {});
512
- }
513
- /**
514
- * Reads the type-level JSDoc summary of a resolved type alias.
515
- *
516
- * @param typeAlias - The type alias naming a params/result type.
517
- * @returns The collected docs, or `undefined` when the alias has no description.
518
- */ function readTypeAliasDocs(typeAlias) {
519
- var typeDescription = readJsDocSummary(typeAlias);
520
- return typeDescription ? {
521
- typeDescription: typeDescription
522
- } : undefined;
523
- }
524
- /**
525
- * Returns `true` when any JSDoc block on `node` carries the bare `@<tagName>` flag.
526
- *
527
- * Used for boolean marker tags like `@dbxModelApiParams` and `@dbxModelApiAdminOnly`
528
- * where the presence of the tag is the entire signal (no value parsing needed).
529
- *
530
- * @param node - Any JSDocable ts-morph node (interface, property, etc.).
531
- * @param tagName - Tag name without the leading `@` (e.g. `'dbxModelApiAdminOnly'`).
532
- * @returns `true` when at least one JSDoc tag with `tagName` is present.
533
- */ function hasJsDocFlag(node, tagName) {
534
- var result = false;
535
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
536
- try {
537
- for(var _iterator = node.getJsDocs()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
538
- var doc = _step.value;
539
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
540
- try {
541
- for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
542
- var tag = _step1.value;
543
- if (tag.getTagName() === tagName) {
544
- result = true;
545
- }
546
- }
547
- } catch (err) {
548
- _didIteratorError1 = true;
549
- _iteratorError1 = err;
550
- } finally{
551
- try {
552
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
553
- _iterator1.return();
554
- }
555
- } finally{
556
- if (_didIteratorError1) {
557
- throw _iteratorError1;
558
- }
559
- }
560
- }
561
- }
562
- } catch (err) {
563
- _didIteratorError = true;
564
- _iteratorError = err;
565
- } finally{
566
- try {
567
- if (!_iteratorNormalCompletion && _iterator.return != null) {
568
- _iterator.return();
569
- }
570
- } finally{
571
- if (_didIteratorError) {
572
- throw _iteratorError;
573
- }
574
- }
575
- }
576
- return result;
577
- }
578
- /**
579
- * Reads the value token of a JSDoc tag (e.g. the `Foo` in `@dbxModelApiMcpResult Foo`).
580
- *
581
- * Used for value-carrying tags like `@dbxModelApiMcpResult` where the first token after the tag
582
- * name names a type. Returns the first whitespace-delimited token of the tag's comment text.
583
- *
584
- * @param node - Any JSDocable ts-morph node (property signature, etc.).
585
- * @param tagName - Tag name without the leading `@` (e.g. `'dbxModelApiMcpResult'`).
586
- * @returns The first token of the tag's value, or `undefined` when the tag is absent or empty.
587
- */ function readJsDocTagValue(node, tagName) {
588
- var result;
589
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
590
- try {
591
- for(var _iterator = node.getJsDocs()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
592
- var doc = _step.value;
593
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
594
- try {
595
- for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
596
- var tag = _step1.value;
597
- if (tag.getTagName() === tagName) {
598
- var _tag_getCommentText;
599
- var token = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim().split(/\s+/)[0];
600
- if (token) {
601
- result = token;
602
- }
603
- }
604
- }
605
- } catch (err) {
606
- _didIteratorError1 = true;
607
- _iteratorError1 = err;
608
- } finally{
609
- try {
610
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
611
- _iterator1.return();
612
- }
613
- } finally{
614
- if (_didIteratorError1) {
615
- throw _iteratorError1;
616
- }
617
- }
618
- }
619
- }
620
- } catch (err) {
621
- _didIteratorError = true;
622
- _iteratorError = err;
623
- } finally{
624
- try {
625
- if (!_iteratorNormalCompletion && _iterator.return != null) {
626
- _iterator.return();
627
- }
628
- } finally{
629
- if (_didIteratorError) {
630
- throw _iteratorError;
631
- }
632
- }
633
- }
634
- return result;
635
- }
636
- function readJsDocSummary(node) {
637
- var result;
638
- var docs = node.getJsDocs();
639
- var last = docs.at(-1);
640
- if (last) {
641
- var description = last.getDescription().trim();
642
- if (description.length > 0) {
643
- result = description;
644
- }
645
- }
646
- return result;
647
- }
648
-
649
- function _define_property(obj, key, value) {
650
- if (key in obj) {
651
- Object.defineProperty(obj, key, {
652
- value: value,
653
- enumerable: true,
654
- configurable: true,
655
- writable: true
656
- });
657
- } else {
658
- obj[key] = value;
659
- }
660
- return obj;
661
- }
662
- function _object_spread(target) {
663
- for(var i = 1; i < arguments.length; i++){
664
- var source = arguments[i] != null ? arguments[i] : {};
665
- var ownKeys = Object.keys(source);
666
- if (typeof Object.getOwnPropertySymbols === "function") {
667
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
668
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
669
- }));
670
- }
671
- ownKeys.forEach(function(key) {
672
- _define_property(target, key, source[key]);
673
- });
674
- }
675
- return target;
676
- }
677
- function ownKeys(object, enumerableOnly) {
678
- var keys = Object.keys(object);
679
- if (Object.getOwnPropertySymbols) {
680
- var symbols = Object.getOwnPropertySymbols(object);
681
- keys.push.apply(keys, symbols);
682
- }
683
- return keys;
684
- }
685
- function _object_spread_props(target, source) {
686
- source = source != null ? source : {};
687
- if (Object.getOwnPropertyDescriptors) {
688
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
689
- } else {
690
- ownKeys(Object(source)).forEach(function(key) {
691
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
692
- });
693
- }
694
- return target;
695
- }
696
- var READ_LEVEL_VALUES = new Set([
697
- 'system',
698
- 'owner',
699
- 'admin-only',
700
- 'permissions'
701
- ]);
702
- var SERVICE_FACTORY_TAG = 'dbxModelServiceFactory';
703
- var MCP_TOOL_NAME_SEGMENT_TAG = 'dbxModelMcpToolNameSegment';
704
- var MODEL_TYPE_VALUE_PATTERN = /^[a-z][A-Za-z0-9_$]*$/;
705
- var TOOL_NAME_SEGMENT_PATTERN = /^[A-Za-z][A-Za-z0-9_$]*$/;
706
- var IDENTITY_FN = 'firestoreModelIdentity';
707
- var CONVERTER_FN_NAMES = [
708
- 'snapshotConverterFunctions',
709
- 'firestoreSubObject',
710
- 'firestoreObjectArray'
711
- ];
712
- var SUB_OBJECT_FN = 'firestoreSubObject';
713
- var OBJECT_ARRAY_FN = 'firestoreObjectArray';
714
- var SNAPSHOT_FN = 'snapshotConverterFunctions';
715
- var FIELDS_LITERAL_KEY = 'fields';
716
- var OBJECT_FIELD_KEY = 'objectField';
717
- var FIRESTORE_FIELD_KEY = 'firestoreField';
718
- /**
719
- * Walks a single source file and reports raw model-extraction artifacts.
720
- * Best-effort: a malformed call shape leaves the corresponding entry out
721
- * rather than throwing.
722
- *
723
- * @param input - In-memory `{ name, text }` source pair.
724
- * @returns The per-file extraction. Aggregation across files happens in the
725
- * firebase-api-manifest orchestrator so cross-file converter consts can be
726
- * resolved against a global registry.
727
- */ function extractModelsFromSource(input) {
728
- var project = new tsMorph.Project({
729
- useInMemoryFileSystem: true,
730
- skipAddingFilesFromTsConfig: true
731
- });
732
- var sourceFile = project.createSourceFile(input.name, input.text, {
733
- overwrite: true
734
- });
735
- var identities = readIdentities(sourceFile);
736
- var interfaces = readInterfaces(sourceFile);
737
- var converters = readConverters(sourceFile);
738
- var enums = readEnums(sourceFile);
739
- var modelGroups = readModelGroups(sourceFile);
740
- var serviceFactories = readServiceFactories(sourceFile);
741
- return {
742
- identities: identities,
743
- interfaces: interfaces,
744
- converters: converters,
745
- enums: enums,
746
- modelGroups: modelGroups,
747
- serviceFactories: serviceFactories
748
- };
749
- }
750
- function readIdentities(sourceFile) {
751
- var out = [];
752
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
753
- try {
754
- for(var _iterator = sourceFile.getVariableStatements()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
755
- var statement = _step.value;
756
- if (!statement.isExported()) continue;
757
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
758
- try {
759
- for(var _iterator1 = statement.getDeclarations()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
760
- var decl = _step1.value;
761
- var initializer = decl.getInitializer();
762
- if (!initializer || !tsMorph.Node.isCallExpression(initializer)) continue;
763
- if (initializer.getExpression().getText() !== IDENTITY_FN) continue;
764
- var parsed = dbxCli.parseFirestoreModelIdentityArgs(initializer.getArguments());
765
- if (parsed) {
766
- out.push(_object_spread({
767
- identityConst: decl.getName()
768
- }, parsed));
769
- }
770
- }
771
- } catch (err) {
772
- _didIteratorError1 = true;
773
- _iteratorError1 = err;
774
- } finally{
775
- try {
776
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
777
- _iterator1.return();
778
- }
779
- } finally{
780
- if (_didIteratorError1) {
781
- throw _iteratorError1;
782
- }
783
- }
784
- }
785
- }
786
- } catch (err) {
787
- _didIteratorError = true;
788
- _iteratorError = err;
789
- } finally{
790
- try {
791
- if (!_iteratorNormalCompletion && _iterator.return != null) {
792
- _iterator.return();
793
- }
794
- } finally{
795
- if (_didIteratorError) {
796
- throw _iteratorError;
797
- }
798
- }
799
- }
800
- return out;
801
- }
802
- function readInterfaces(sourceFile) {
803
- var out = [];
804
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
805
- try {
806
- for(var _iterator = sourceFile.getInterfaces()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
807
- var decl = _step.value;
808
- if (!decl.isExported()) continue;
809
- out.push(buildInterface(decl));
810
- }
811
- } catch (err) {
812
- _didIteratorError = true;
813
- _iteratorError = err;
814
- } finally{
815
- try {
816
- if (!_iteratorNormalCompletion && _iterator.return != null) {
817
- _iterator.return();
818
- }
819
- } finally{
820
- if (_didIteratorError) {
821
- throw _iteratorError;
822
- }
823
- }
824
- }
825
- return out;
826
- }
827
- function buildInterface(decl) {
828
- var jsDocs = decl.getJsDocs();
829
- var hasDbxModelTag = jsDocsHaveTag(jsDocs, 'dbxModel');
830
- var dbxModelRead = readDbxModelReadTag(jsDocs);
831
- var mcpToolNameSegment = readMcpToolNameSegmentTag(jsDocs);
832
- var extendsNames = decl.getExtends().map(dbxCli.resolveExtendsName);
833
- var props = [];
834
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
835
- try {
836
- for(var _iterator = decl.getProperties()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
837
- var prop = _step.value;
838
- var _ref;
839
- var _prop_getTypeNode;
840
- var propJsDocs = prop.getJsDocs();
841
- var longName = readJsDocTagText(propJsDocs, 'dbxModelVariable');
842
- var syncFlag = readJsDocTagText(propJsDocs, 'dbxModelVariableSyncFlag');
843
- var tsType = ((_ref = (_prop_getTypeNode = prop.getTypeNode()) === null || _prop_getTypeNode === void 0 ? void 0 : _prop_getTypeNode.getText()) !== null && _ref !== void 0 ? _ref : '').replaceAll(/\s+/g, ' ').trim();
844
- var optional = prop.hasQuestionToken() || tsType.startsWith('Maybe<');
845
- props.push({
846
- name: prop.getName(),
847
- tsType: tsType,
848
- optional: optional,
849
- description: readJsDocDescription(propJsDocs),
850
- longName: longName,
851
- syncFlag: syncFlag
852
- });
853
- }
854
- } catch (err) {
855
- _didIteratorError = true;
856
- _iteratorError = err;
857
- } finally{
858
- try {
859
- if (!_iteratorNormalCompletion && _iterator.return != null) {
860
- _iterator.return();
861
- }
862
- } finally{
863
- if (_didIteratorError) {
864
- throw _iteratorError;
865
- }
866
- }
867
- }
868
- return _object_spread({
869
- name: decl.getName(),
870
- description: readJsDocDescription(jsDocs),
871
- hasDbxModelTag: hasDbxModelTag,
872
- extendsNames: extendsNames,
873
- props: props
874
- }, dbxModelRead === undefined ? {} : {
875
- dbxModelRead: dbxModelRead
876
- }, mcpToolNameSegment === undefined ? {} : {
877
- mcpToolNameSegment: mcpToolNameSegment
878
- });
879
- }
880
- function readMcpToolNameSegmentTag(jsDocs) {
881
- var result;
882
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
883
- try {
884
- for(var _iterator = jsDocs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
885
- var doc = _step.value;
886
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
887
- try {
888
- for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
889
- var tag = _step1.value;
890
- var _tag_getCommentText;
891
- if (tag.getTagName() !== MCP_TOOL_NAME_SEGMENT_TAG) continue;
892
- if (result !== undefined) continue;
893
- var raw = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim();
894
- if (raw === undefined || raw.length === 0) continue;
895
- var firstToken = raw.split(/\s+/)[0];
896
- if (TOOL_NAME_SEGMENT_PATTERN.test(firstToken)) {
897
- result = firstToken;
898
- }
899
- }
900
- } catch (err) {
901
- _didIteratorError1 = true;
902
- _iteratorError1 = err;
903
- } finally{
904
- try {
905
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
906
- _iterator1.return();
907
- }
908
- } finally{
909
- if (_didIteratorError1) {
910
- throw _iteratorError1;
911
- }
912
- }
913
- }
914
- }
915
- } catch (err) {
916
- _didIteratorError = true;
917
- _iteratorError = err;
918
- } finally{
919
- try {
920
- if (!_iteratorNormalCompletion && _iterator.return != null) {
921
- _iterator.return();
922
- }
923
- } finally{
924
- if (_didIteratorError) {
925
- throw _iteratorError;
926
- }
927
- }
928
- }
929
- return result;
930
- }
931
- function readDbxModelReadTag(jsDocs) {
932
- var result;
933
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
934
- try {
935
- for(var _iterator = jsDocs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
936
- var doc = _step.value;
937
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
938
- try {
939
- for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
940
- var tag = _step1.value;
941
- var _tag_getCommentText;
942
- if (tag.getTagName() !== 'dbxModelRead') continue;
943
- if (result !== undefined) continue;
944
- var raw = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim();
945
- if (raw === undefined || raw.length === 0) continue;
946
- var firstToken = raw.split(/\s+/)[0];
947
- if (READ_LEVEL_VALUES.has(firstToken)) {
948
- result = firstToken;
949
- }
950
- }
951
- } catch (err) {
952
- _didIteratorError1 = true;
953
- _iteratorError1 = err;
954
- } finally{
955
- try {
956
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
957
- _iterator1.return();
958
- }
959
- } finally{
960
- if (_didIteratorError1) {
961
- throw _iteratorError1;
962
- }
963
- }
964
- }
965
- }
966
- } catch (err) {
967
- _didIteratorError = true;
968
- _iteratorError = err;
969
- } finally{
970
- try {
971
- if (!_iteratorNormalCompletion && _iterator.return != null) {
972
- _iterator.return();
973
- }
974
- } finally{
975
- if (_didIteratorError) {
976
- throw _iteratorError;
977
- }
978
- }
979
- }
980
- return result;
981
- }
982
- function readServiceFactories(sourceFile) {
983
- var out = [];
984
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
985
- try {
986
- for(var _iterator = sourceFile.getVariableStatements()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
987
- var statement = _step.value;
988
- if (!statement.isExported()) continue;
989
- var modelType = readServiceFactoryModelType(statement.getJsDocs());
990
- if (modelType === undefined) continue;
991
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
992
- try {
993
- for(var _iterator1 = statement.getDeclarations()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
994
- var decl = _step1.value;
995
- out.push({
996
- modelType: modelType,
997
- exportName: decl.getName()
998
- });
999
- }
1000
- } catch (err) {
1001
- _didIteratorError1 = true;
1002
- _iteratorError1 = err;
1003
- } finally{
1004
- try {
1005
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1006
- _iterator1.return();
1007
- }
1008
- } finally{
1009
- if (_didIteratorError1) {
1010
- throw _iteratorError1;
1011
- }
1012
- }
1013
- }
1014
- }
1015
- } catch (err) {
1016
- _didIteratorError = true;
1017
- _iteratorError = err;
1018
- } finally{
1019
- try {
1020
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1021
- _iterator.return();
1022
- }
1023
- } finally{
1024
- if (_didIteratorError) {
1025
- throw _iteratorError;
1026
- }
1027
- }
1028
- }
1029
- return out;
1030
- }
1031
- function readServiceFactoryModelType(jsDocs) {
1032
- var result;
1033
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1034
- try {
1035
- for(var _iterator = jsDocs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1036
- var doc = _step.value;
1037
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1038
- try {
1039
- for(var _iterator1 = doc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1040
- var tag = _step1.value;
1041
- var _tag_getCommentText;
1042
- if (tag.getTagName() !== SERVICE_FACTORY_TAG) continue;
1043
- if (result !== undefined) continue;
1044
- var raw = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim();
1045
- if (raw === undefined || raw.length === 0) continue;
1046
- var firstToken = raw.split(/\s+/)[0];
1047
- if (MODEL_TYPE_VALUE_PATTERN.test(firstToken)) {
1048
- result = firstToken;
1049
- }
1050
- }
1051
- } catch (err) {
1052
- _didIteratorError1 = true;
1053
- _iteratorError1 = err;
1054
- } finally{
1055
- try {
1056
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1057
- _iterator1.return();
1058
- }
1059
- } finally{
1060
- if (_didIteratorError1) {
1061
- throw _iteratorError1;
1062
- }
1063
- }
1064
- }
1065
- }
1066
- } catch (err) {
1067
- _didIteratorError = true;
1068
- _iteratorError = err;
1069
- } finally{
1070
- try {
1071
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1072
- _iterator.return();
1073
- }
1074
- } finally{
1075
- if (_didIteratorError) {
1076
- throw _iteratorError;
1077
- }
1078
- }
1079
- }
1080
- return result;
1081
- }
1082
- function readConverters(sourceFile) {
1083
- var out = [];
1084
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1085
- try {
1086
- for(var _iterator = sourceFile.getVariableStatements()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1087
- var statement = _step.value;
1088
- if (!statement.isExported()) continue;
1089
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1090
- try {
1091
- for(var _iterator1 = statement.getDeclarations()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1092
- var decl = _step1.value;
1093
- var initializer = decl.getInitializer();
1094
- if (!initializer || !tsMorph.Node.isCallExpression(initializer)) continue;
1095
- var factory = initializer.getExpression().getText();
1096
- if (!isConverterFactoryName(factory)) continue;
1097
- var interfaceName = readGenericInterfaceName(initializer);
1098
- var fields = readConverterFields(initializer);
1099
- if (!fields) continue;
1100
- out.push({
1101
- converterConst: decl.getName(),
1102
- factory: factory,
1103
- interfaceName: interfaceName,
1104
- fields: fields,
1105
- line: decl.getStartLineNumber()
1106
- });
1107
- }
1108
- } catch (err) {
1109
- _didIteratorError1 = true;
1110
- _iteratorError1 = err;
1111
- } finally{
1112
- try {
1113
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1114
- _iterator1.return();
1115
- }
1116
- } finally{
1117
- if (_didIteratorError1) {
1118
- throw _iteratorError1;
1119
- }
1120
- }
1121
- }
1122
- }
1123
- } catch (err) {
1124
- _didIteratorError = true;
1125
- _iteratorError = err;
1126
- } finally{
1127
- try {
1128
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1129
- _iterator.return();
1130
- }
1131
- } finally{
1132
- if (_didIteratorError) {
1133
- throw _iteratorError;
1134
- }
1135
- }
1136
- }
1137
- return out;
1138
- }
1139
- function isConverterFactoryName(name) {
1140
- return CONVERTER_FN_NAMES.includes(name);
1141
- }
1142
- function readGenericInterfaceName(call) {
1143
- var typeArgs = call.getTypeArguments();
1144
- var result;
1145
- if (typeArgs.length > 0) {
1146
- result = typeArgs[0].getText().replaceAll(/<[^>]*>/g, '').trim();
1147
- }
1148
- return result;
1149
- }
1150
- function readConverterFields(call) {
1151
- var fnName = call.getExpression().getText();
1152
- var args = call.getArguments();
1153
- var result;
1154
- if (args.length > 0) {
1155
- var config = args[0];
1156
- if (tsMorph.Node.isObjectLiteralExpression(config)) {
1157
- var fieldsLiteral;
1158
- if (fnName === SNAPSHOT_FN) {
1159
- fieldsLiteral = readObjectProperty(config, FIELDS_LITERAL_KEY);
1160
- } else {
1161
- var objectField = readPropertyValue(config, OBJECT_FIELD_KEY);
1162
- if (objectField && tsMorph.Node.isObjectLiteralExpression(objectField)) {
1163
- fieldsLiteral = readObjectProperty(objectField, FIELDS_LITERAL_KEY);
1164
- }
1165
- }
1166
- if (fieldsLiteral) {
1167
- result = readFieldEntries(fieldsLiteral);
1168
- }
1169
- }
1170
- }
1171
- return result;
1172
- }
1173
- function readFieldEntries(fields) {
1174
- var out = [];
1175
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1176
- try {
1177
- for(var _iterator = fields.getProperties()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1178
- var property = _step.value;
1179
- if (tsMorph.Node.isPropertyAssignment(property)) {
1180
- var initializer = property.getInitializer();
1181
- var converterText = initializer ? initializer.getText().replaceAll(/\s+/g, ' ').trim() : '';
1182
- var nested = initializer ? readNestedFromExpression(initializer) : undefined;
1183
- out.push({
1184
- key: property.getName(),
1185
- converter: converterText,
1186
- nestedConverterRef: nested === null || nested === void 0 ? void 0 : nested.ref,
1187
- nestedConverterInline: nested === null || nested === void 0 ? void 0 : nested.inline,
1188
- nestedIsArray: nested === null || nested === void 0 ? void 0 : nested.isArray
1189
- });
1190
- } else if (tsMorph.Node.isShorthandPropertyAssignment(property)) {
1191
- var name = property.getName();
1192
- out.push({
1193
- key: name,
1194
- converter: name
1195
- });
1196
- }
1197
- }
1198
- } catch (err) {
1199
- _didIteratorError = true;
1200
- _iteratorError = err;
1201
- } finally{
1202
- try {
1203
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1204
- _iterator.return();
1205
- }
1206
- } finally{
1207
- if (_didIteratorError) {
1208
- throw _iteratorError;
1209
- }
1210
- }
1211
- }
1212
- return out;
1213
- }
1214
- function readNestedFromExpression(expr) {
1215
- var result;
1216
- if (tsMorph.Node.isCallExpression(expr)) {
1217
- var fnName = expr.getExpression().getText();
1218
- if (fnName === SUB_OBJECT_FN || fnName === OBJECT_ARRAY_FN) {
1219
- result = readNestedConverterCall(expr, fnName);
1220
- }
1221
- }
1222
- return result;
1223
- }
1224
- /**
1225
- * Reads the `objectField` (or `firestoreField`) argument of a
1226
- * `firestoreSubObject` / `firestoreObjectArray` call into a
1227
- * {@link NestedConverterMatch}.
1228
- *
1229
- * `firestoreObjectArray`'s config is a union: `{ objectField }` describes the
1230
- * element shape directly, while `{ firestoreField }` points the element decode
1231
- * at another field converter (a sub-object const or an inline
1232
- * `firestoreSubObject(...)`). Both carriers resolve through the same nested path
1233
- * — the `firestoreField` variant is what the timesheet day-level form uses.
1234
- *
1235
- * @param call - The nested-converter call expression.
1236
- * @param fnName - The resolved factory name (`firestoreSubObject` or `firestoreObjectArray`).
1237
- * @returns The nested-converter match, or `undefined` when the call shape is malformed.
1238
- */ function readNestedConverterCall(call, fnName) {
1239
- var result;
1240
- var args = call.getArguments();
1241
- if (args.length > 0) {
1242
- var config = args[0];
1243
- if (tsMorph.Node.isObjectLiteralExpression(config)) {
1244
- var _readPropertyValue;
1245
- var valueNode = (_readPropertyValue = readPropertyValue(config, OBJECT_FIELD_KEY)) !== null && _readPropertyValue !== void 0 ? _readPropertyValue : readPropertyValue(config, FIRESTORE_FIELD_KEY);
1246
- if (valueNode) {
1247
- result = buildNestedConverterMatch({
1248
- objectField: valueNode,
1249
- call: call,
1250
- fnName: fnName
1251
- });
1252
- }
1253
- }
1254
- }
1255
- return result;
1256
- }
1257
- /**
1258
- * Builds a {@link NestedConverterMatch} from a resolved value node:
1259
- * an identifier yields a converter `ref`, an object literal yields an `inline`
1260
- * converter parsed from its `fields`, and a nested
1261
- * `firestoreSubObject(...)` / `firestoreObjectArray(...)` call (the inline
1262
- * `firestoreField: firestoreSubObject<T>({...})` form) is resolved recursively —
1263
- * the outer factory still decides array-ness.
1264
- *
1265
- * @param input - The resolved value node, owning call expression, and factory name.
1266
- * @returns The nested-converter match, or `undefined` when no shape applies.
1267
- */ function buildNestedConverterMatch(input) {
1268
- var objectField = input.objectField, call = input.call, fnName = input.fnName;
1269
- var isArray = fnName === OBJECT_ARRAY_FN;
1270
- var result;
1271
- if (tsMorph.Node.isIdentifier(objectField)) {
1272
- result = {
1273
- ref: objectField.getText(),
1274
- isArray: isArray
1275
- };
1276
- } else if (tsMorph.Node.isObjectLiteralExpression(objectField)) {
1277
- var fieldsLiteral = readObjectProperty(objectField, FIELDS_LITERAL_KEY);
1278
- if (fieldsLiteral) {
1279
- result = {
1280
- inline: {
1281
- converterConst: undefined,
1282
- factory: fnName,
1283
- interfaceName: readGenericInterfaceName(call),
1284
- fields: readFieldEntries(fieldsLiteral),
1285
- line: call.getStartLineNumber()
1286
- },
1287
- isArray: isArray
1288
- };
1289
- }
1290
- } else if (tsMorph.Node.isCallExpression(objectField)) {
1291
- var nested = readNestedFromExpression(objectField);
1292
- if (nested) {
1293
- result = _object_spread_props(_object_spread({}, nested), {
1294
- isArray: isArray
1295
- });
1296
- }
1297
- }
1298
- return result;
1299
- }
1300
- function readPropertyValue(literal, key) {
1301
- var property = literal.getProperty(key);
1302
- var result;
1303
- if (property && tsMorph.Node.isPropertyAssignment(property)) {
1304
- result = property.getInitializer();
1305
- } else if (property && tsMorph.Node.isShorthandPropertyAssignment(property)) {
1306
- result = property.getNameNode();
1307
- }
1308
- return result;
1309
- }
1310
- function readObjectProperty(literal, key) {
1311
- var value = readPropertyValue(literal, key);
1312
- return value && tsMorph.Node.isObjectLiteralExpression(value) ? value : undefined;
1313
- }
1314
- function readEnums(sourceFile) {
1315
- var out = [];
1316
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1317
- try {
1318
- for(var _iterator = sourceFile.getEnums()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1319
- var decl = _step.value;
1320
- if (!decl.isExported()) continue;
1321
- var values = [];
1322
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1323
- try {
1324
- for(var _iterator1 = decl.getMembers()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1325
- var member = _step1.value;
1326
- var value = member.getValue();
1327
- var description = readJsDocDescription(member.getJsDocs());
1328
- if (typeof value === 'string' || typeof value === 'number') {
1329
- values.push({
1330
- name: member.getName(),
1331
- value: value,
1332
- description: description
1333
- });
1334
- }
1335
- }
1336
- } catch (err) {
1337
- _didIteratorError1 = true;
1338
- _iteratorError1 = err;
1339
- } finally{
1340
- try {
1341
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1342
- _iterator1.return();
1343
- }
1344
- } finally{
1345
- if (_didIteratorError1) {
1346
- throw _iteratorError1;
1347
- }
1348
- }
1349
- }
1350
- out.push({
1351
- name: decl.getName(),
1352
- values: values,
1353
- description: readJsDocDescription(decl.getJsDocs())
1354
- });
1355
- }
1356
- } catch (err) {
1357
- _didIteratorError = true;
1358
- _iteratorError = err;
1359
- } finally{
1360
- try {
1361
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1362
- _iterator.return();
1363
- }
1364
- } finally{
1365
- if (_didIteratorError) {
1366
- throw _iteratorError;
1367
- }
1368
- }
1369
- }
1370
- return out;
1371
- }
1372
- function readModelGroups(sourceFile) {
1373
- var out = [];
1374
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1375
- try {
1376
- for(var _iterator = sourceFile.getInterfaces()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1377
- var iface = _step.value;
1378
- if (!iface.isExported()) continue;
1379
- var groupTag = readJsDocTagText(iface.getJsDocs(), 'dbxModelGroup');
1380
- if (!groupTag) continue;
1381
- var containerName = iface.getName();
1382
- if (!containerName.endsWith('FirestoreCollections')) continue;
1383
- var modelNames = [];
1384
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1385
- try {
1386
- for(var _iterator1 = iface.getProperties()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1387
- var prop = _step1.value;
1388
- var _ref;
1389
- var _prop_getTypeNode;
1390
- var tsType = (_ref = (_prop_getTypeNode = prop.getTypeNode()) === null || _prop_getTypeNode === void 0 ? void 0 : _prop_getTypeNode.getText()) !== null && _ref !== void 0 ? _ref : '';
1391
- var match = /([A-Z]\w*)FirestoreCollection(?:Factory)?(?:\b|<)/.exec(tsType);
1392
- if (match) modelNames.push(match[1]);
1393
- }
1394
- } catch (err) {
1395
- _didIteratorError1 = true;
1396
- _iteratorError1 = err;
1397
- } finally{
1398
- try {
1399
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1400
- _iterator1.return();
1401
- }
1402
- } finally{
1403
- if (_didIteratorError1) {
1404
- throw _iteratorError1;
1405
- }
1406
- }
1407
- }
1408
- out.push({
1409
- name: groupTag,
1410
- containerName: containerName,
1411
- description: readJsDocDescription(iface.getJsDocs()),
1412
- modelNames: modelNames
1413
- });
1414
- }
1415
- } catch (err) {
1416
- _didIteratorError = true;
1417
- _iteratorError = err;
1418
- } finally{
1419
- try {
1420
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1421
- _iterator.return();
1422
- }
1423
- } finally{
1424
- if (_didIteratorError) {
1425
- throw _iteratorError;
1426
- }
1427
- }
1428
- }
1429
- return out;
1430
- }
1431
- function jsDocsHaveTag(jsDocs, tagName) {
1432
- var found = false;
1433
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1434
- try {
1435
- for(var _iterator = jsDocs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1436
- var jsDoc = _step.value;
1437
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1438
- try {
1439
- for(var _iterator1 = jsDoc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1440
- var tag = _step1.value;
1441
- if (tag.getTagName() === tagName) {
1442
- found = true;
1443
- break;
1444
- }
1445
- }
1446
- } catch (err) {
1447
- _didIteratorError1 = true;
1448
- _iteratorError1 = err;
1449
- } finally{
1450
- try {
1451
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1452
- _iterator1.return();
1453
- }
1454
- } finally{
1455
- if (_didIteratorError1) {
1456
- throw _iteratorError1;
1457
- }
1458
- }
1459
- }
1460
- if (found) break;
1461
- }
1462
- } catch (err) {
1463
- _didIteratorError = true;
1464
- _iteratorError = err;
1465
- } finally{
1466
- try {
1467
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1468
- _iterator.return();
1469
- }
1470
- } finally{
1471
- if (_didIteratorError) {
1472
- throw _iteratorError;
1473
- }
1474
- }
1475
- }
1476
- return found;
1477
- }
1478
- function readJsDocTagText(jsDocs, tagName) {
1479
- var result;
1480
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1481
- try {
1482
- for(var _iterator = jsDocs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1483
- var jsDoc = _step.value;
1484
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1485
- try {
1486
- for(var _iterator1 = jsDoc.getTags()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1487
- var tag = _step1.value;
1488
- var _tag_getCommentText;
1489
- if (tag.getTagName() !== tagName) continue;
1490
- var text = (_tag_getCommentText = tag.getCommentText()) === null || _tag_getCommentText === void 0 ? void 0 : _tag_getCommentText.trim();
1491
- if (text !== undefined && text.length > 0) {
1492
- result = text;
1493
- break;
1494
- }
1495
- }
1496
- } catch (err) {
1497
- _didIteratorError1 = true;
1498
- _iteratorError1 = err;
1499
- } finally{
1500
- try {
1501
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1502
- _iterator1.return();
1503
- }
1504
- } finally{
1505
- if (_didIteratorError1) {
1506
- throw _iteratorError1;
1507
- }
1508
- }
1509
- }
1510
- if (result !== undefined) break;
1511
- }
1512
- } catch (err) {
1513
- _didIteratorError = true;
1514
- _iteratorError = err;
1515
- } finally{
1516
- try {
1517
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1518
- _iterator.return();
1519
- }
1520
- } finally{
1521
- if (_didIteratorError) {
1522
- throw _iteratorError;
1523
- }
1524
- }
1525
- }
1526
- return result;
1527
- }
1528
- function readJsDocDescription(jsDocs) {
1529
- var result;
1530
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1531
- try {
1532
- for(var _iterator = jsDocs[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1533
- var jsDoc = _step.value;
1534
- var description = jsDoc.getDescription().trim();
1535
- if (description.length === 0) continue;
1536
- var paragraph = firstParagraph(description);
1537
- if (paragraph.length > 0) {
1538
- result = paragraph;
1539
- break;
1540
- }
1541
- }
1542
- } catch (err) {
1543
- _didIteratorError = true;
1544
- _iteratorError = err;
1545
- } finally{
1546
- try {
1547
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1548
- _iterator.return();
1549
- }
1550
- } finally{
1551
- if (_didIteratorError) {
1552
- throw _iteratorError;
1553
- }
1554
- }
1555
- }
1556
- return result;
1557
- }
1558
- function firstParagraph(text) {
1559
- var lines = text.split('\n').map(function(line) {
1560
- return line.trim();
1561
- });
1562
- var collected = [];
1563
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
1564
- try {
1565
- for(var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
1566
- var line = _step.value;
1567
- if (line.startsWith('@')) break;
1568
- if (line.length === 0) {
1569
- if (collected.length > 0) break;
1570
- continue;
1571
- }
1572
- collected.push(line);
1573
- }
1574
- } catch (err) {
1575
- _didIteratorError = true;
1576
- _iteratorError = err;
1577
- } finally{
1578
- try {
1579
- if (!_iteratorNormalCompletion && _iterator.return != null) {
1580
- _iterator.return();
1581
- }
1582
- } finally{
1583
- if (_didIteratorError) {
1584
- throw _iteratorError;
1585
- }
1586
- }
1587
- }
1588
- return collected.join(' ').trim();
1589
- }
1590
-
1591
- exports.extractCrudEntries = extractCrudEntries;
1592
- exports.extractModelsFromSource = extractModelsFromSource;