@dereekb/dbx-cli 13.15.0 → 13.16.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.
- package/firebase-api-manifest/main.js +147 -132
- package/firebase-api-manifest/package.json +3 -3
- package/generate-firestore-indexes/main.js +37 -24
- package/generate-firestore-indexes/package.json +2 -2
- package/generate-mcp-manifest/main.js +49 -37
- package/generate-mcp-manifest/package.json +3 -3
- package/index.cjs.js +527 -321
- package/index.esm.js +527 -321
- package/lint-cache/package.json +2 -2
- package/manifest-extract/index.cjs.js +131 -118
- package/manifest-extract/index.esm.js +131 -118
- package/manifest-extract/package.json +2 -2
- package/package.json +6 -6
- package/test/index.cjs.js +1 -1
- package/test/index.esm.js +1 -1
- package/test/package.json +9 -9
package/lint-cache/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/dbx-cli-lint-cache",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.16.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"devDependencies": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"eslint": "10.4.0"
|
|
9
9
|
},
|
|
10
10
|
"peerDependencies": {
|
|
11
|
-
"@dereekb/util": "13.
|
|
11
|
+
"@dereekb/util": "13.16.0",
|
|
12
12
|
"yargs": "^18.0.0"
|
|
13
13
|
}
|
|
14
14
|
}
|
|
@@ -295,14 +295,25 @@ function findFunctionsClassName(sourceFile) {
|
|
|
295
295
|
return result;
|
|
296
296
|
}
|
|
297
297
|
function inferGroupName(sourceFile) {
|
|
298
|
+
var _findTypeAliasStem;
|
|
299
|
+
return (_findTypeAliasStem = findTypeAliasStem(sourceFile, 'ModelCrudFunctionsConfig')) !== null && _findTypeAliasStem !== void 0 ? _findTypeAliasStem : findTypeAliasStem(sourceFile, 'FunctionTypeMap');
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Finds the first type alias whose name ends with `ending` and returns the
|
|
303
|
+
* non-empty stem (the name with `ending` stripped).
|
|
304
|
+
*
|
|
305
|
+
* @param sourceFile - The parsed `<model>.api.ts` source.
|
|
306
|
+
* @param ending - The type-alias name suffix to match.
|
|
307
|
+
* @returns The stem preceding `ending`, or `undefined` when no alias matches with a non-empty stem.
|
|
308
|
+
*/ function findTypeAliasStem(sourceFile, ending) {
|
|
298
309
|
var result;
|
|
299
310
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
300
311
|
try {
|
|
301
312
|
for(var _iterator = sourceFile.getTypeAliases()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
302
313
|
var alias = _step.value;
|
|
303
314
|
var name = alias.getName();
|
|
304
|
-
if (name.endsWith(
|
|
305
|
-
var stem = name.slice(0, -
|
|
315
|
+
if (name.endsWith(ending)) {
|
|
316
|
+
var stem = name.slice(0, -ending.length);
|
|
306
317
|
if (stem.length > 0) {
|
|
307
318
|
result = stem;
|
|
308
319
|
break;
|
|
@@ -323,35 +334,6 @@ function inferGroupName(sourceFile) {
|
|
|
323
334
|
}
|
|
324
335
|
}
|
|
325
336
|
}
|
|
326
|
-
if (result === undefined) {
|
|
327
|
-
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
328
|
-
try {
|
|
329
|
-
for(var _iterator1 = sourceFile.getTypeAliases()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
330
|
-
var alias1 = _step1.value;
|
|
331
|
-
var name1 = alias1.getName();
|
|
332
|
-
if (name1.endsWith('FunctionTypeMap')) {
|
|
333
|
-
var stem1 = name1.slice(0, -'FunctionTypeMap'.length);
|
|
334
|
-
if (stem1.length > 0) {
|
|
335
|
-
result = stem1;
|
|
336
|
-
break;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
} catch (err) {
|
|
341
|
-
_didIteratorError1 = true;
|
|
342
|
-
_iteratorError1 = err;
|
|
343
|
-
} finally{
|
|
344
|
-
try {
|
|
345
|
-
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
346
|
-
_iterator1.return();
|
|
347
|
-
}
|
|
348
|
-
} finally{
|
|
349
|
-
if (_didIteratorError1) {
|
|
350
|
-
throw _iteratorError1;
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
337
|
return result;
|
|
356
338
|
}
|
|
357
339
|
function isNullLiteralType(node) {
|
|
@@ -473,68 +455,71 @@ function typeNodeName(node) {
|
|
|
473
455
|
return result;
|
|
474
456
|
}
|
|
475
457
|
function readTypeDocs(sourceFile, typeName) {
|
|
476
|
-
var result;
|
|
477
458
|
var interfaceDecl = sourceFile.getInterface(typeName);
|
|
459
|
+
var result;
|
|
478
460
|
if (interfaceDecl) {
|
|
479
|
-
|
|
480
|
-
var hasApiParamsTag = hasJsDocFlag(interfaceDecl, 'dbxModelApiParams');
|
|
481
|
-
var fields = [];
|
|
482
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
483
|
-
try {
|
|
484
|
-
for(var _iterator = interfaceDecl.getProperties()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
485
|
-
var property = _step.value;
|
|
486
|
-
var _ref;
|
|
487
|
-
var fieldName = property.getName();
|
|
488
|
-
var description = readJsDocSummary(property);
|
|
489
|
-
var typeNode = property.getTypeNode();
|
|
490
|
-
var typeText = (_ref = typeNode === null || typeNode === void 0 ? void 0 : typeNode.getText().trim()) !== null && _ref !== void 0 ? _ref : '';
|
|
491
|
-
var adminOnly = hasJsDocFlag(property, 'dbxModelApiAdminOnly');
|
|
492
|
-
var field = _object_spread$1({
|
|
493
|
-
name: fieldName,
|
|
494
|
-
typeText: typeText
|
|
495
|
-
}, description ? {
|
|
496
|
-
description: description
|
|
497
|
-
} : {}, adminOnly ? {
|
|
498
|
-
accessLevel: 'adminOnly'
|
|
499
|
-
} : {});
|
|
500
|
-
fields.push(field);
|
|
501
|
-
}
|
|
502
|
-
} catch (err) {
|
|
503
|
-
_didIteratorError = true;
|
|
504
|
-
_iteratorError = err;
|
|
505
|
-
} finally{
|
|
506
|
-
try {
|
|
507
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
508
|
-
_iterator.return();
|
|
509
|
-
}
|
|
510
|
-
} finally{
|
|
511
|
-
if (_didIteratorError) {
|
|
512
|
-
throw _iteratorError;
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
}
|
|
516
|
-
if (typeDescription || fields.length > 0 || hasApiParamsTag) {
|
|
517
|
-
result = _object_spread_props(_object_spread$1({}, typeDescription ? {
|
|
518
|
-
typeDescription: typeDescription
|
|
519
|
-
} : {}, fields.length > 0 ? {
|
|
520
|
-
fields: fields
|
|
521
|
-
} : {}), {
|
|
522
|
-
hasApiParamsTag: hasApiParamsTag
|
|
523
|
-
});
|
|
524
|
-
}
|
|
461
|
+
result = readInterfaceTypeDocs(interfaceDecl);
|
|
525
462
|
} else {
|
|
526
463
|
var typeAlias = sourceFile.getTypeAlias(typeName);
|
|
527
|
-
|
|
528
|
-
var typeDescription1 = readJsDocSummary(typeAlias);
|
|
529
|
-
if (typeDescription1) {
|
|
530
|
-
result = {
|
|
531
|
-
typeDescription: typeDescription1
|
|
532
|
-
};
|
|
533
|
-
}
|
|
534
|
-
}
|
|
464
|
+
result = typeAlias ? readTypeAliasDocs(typeAlias) : undefined;
|
|
535
465
|
}
|
|
536
466
|
return result;
|
|
537
467
|
}
|
|
468
|
+
/**
|
|
469
|
+
* Reads the type-level JSDoc (summary, fields, `@dbxModelApiParams` flag) of a
|
|
470
|
+
* resolved interface declaration.
|
|
471
|
+
*
|
|
472
|
+
* @param interfaceDecl - The interface naming a params/result type.
|
|
473
|
+
* @returns The collected docs, or `undefined` when the interface has no description, fields, or marker.
|
|
474
|
+
*/ function readInterfaceTypeDocs(interfaceDecl) {
|
|
475
|
+
var typeDescription = readJsDocSummary(interfaceDecl);
|
|
476
|
+
var hasApiParamsTag = hasJsDocFlag(interfaceDecl, 'dbxModelApiParams');
|
|
477
|
+
var fields = interfaceDecl.getProperties().map(function(property) {
|
|
478
|
+
return readInterfaceField(property);
|
|
479
|
+
});
|
|
480
|
+
var result;
|
|
481
|
+
if (typeDescription || fields.length > 0 || hasApiParamsTag) {
|
|
482
|
+
result = _object_spread_props(_object_spread$1({}, typeDescription ? {
|
|
483
|
+
typeDescription: typeDescription
|
|
484
|
+
} : {}, fields.length > 0 ? {
|
|
485
|
+
fields: fields
|
|
486
|
+
} : {}), {
|
|
487
|
+
hasApiParamsTag: hasApiParamsTag
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
return result;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Reads one interface property into a {@link CrudEntryDocField}, capturing its
|
|
494
|
+
* type text, JSDoc summary, and `@dbxModelApiAdminOnly` access level.
|
|
495
|
+
*
|
|
496
|
+
* @param property - The interface property signature.
|
|
497
|
+
* @returns The doc field for the property.
|
|
498
|
+
*/ function readInterfaceField(property) {
|
|
499
|
+
var _ref;
|
|
500
|
+
var _property_getTypeNode;
|
|
501
|
+
var description = readJsDocSummary(property);
|
|
502
|
+
var adminOnly = hasJsDocFlag(property, 'dbxModelApiAdminOnly');
|
|
503
|
+
return _object_spread$1({
|
|
504
|
+
name: property.getName(),
|
|
505
|
+
typeText: (_ref = (_property_getTypeNode = property.getTypeNode()) === null || _property_getTypeNode === void 0 ? void 0 : _property_getTypeNode.getText().trim()) !== null && _ref !== void 0 ? _ref : ''
|
|
506
|
+
}, description ? {
|
|
507
|
+
description: description
|
|
508
|
+
} : {}, adminOnly ? {
|
|
509
|
+
accessLevel: 'adminOnly'
|
|
510
|
+
} : {});
|
|
511
|
+
}
|
|
512
|
+
/**
|
|
513
|
+
* Reads the type-level JSDoc summary of a resolved type alias.
|
|
514
|
+
*
|
|
515
|
+
* @param typeAlias - The type alias naming a params/result type.
|
|
516
|
+
* @returns The collected docs, or `undefined` when the alias has no description.
|
|
517
|
+
*/ function readTypeAliasDocs(typeAlias) {
|
|
518
|
+
var typeDescription = readJsDocSummary(typeAlias);
|
|
519
|
+
return typeDescription ? {
|
|
520
|
+
typeDescription: typeDescription
|
|
521
|
+
} : undefined;
|
|
522
|
+
}
|
|
538
523
|
/**
|
|
539
524
|
* Returns `true` when any JSDoc block on `node` carries the bare `@<tagName>` flag.
|
|
540
525
|
*
|
|
@@ -650,8 +635,8 @@ function readTypeDocs(sourceFile, typeName) {
|
|
|
650
635
|
function readJsDocSummary(node) {
|
|
651
636
|
var result;
|
|
652
637
|
var docs = node.getJsDocs();
|
|
653
|
-
|
|
654
|
-
|
|
638
|
+
var last = docs.at(-1);
|
|
639
|
+
if (last) {
|
|
655
640
|
var description = last.getDescription().trim();
|
|
656
641
|
if (description.length > 0) {
|
|
657
642
|
result = description;
|
|
@@ -1313,41 +1298,69 @@ function readNestedFromExpression(expr) {
|
|
|
1313
1298
|
if (tsMorph.Node.isCallExpression(expr)) {
|
|
1314
1299
|
var fnName = expr.getExpression().getText();
|
|
1315
1300
|
if (fnName === SUB_OBJECT_FN || fnName === OBJECT_ARRAY_FN) {
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
};
|
|
1342
|
-
}
|
|
1343
|
-
}
|
|
1344
|
-
}
|
|
1345
|
-
}
|
|
1301
|
+
result = readNestedConverterCall(expr, fnName);
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
return result;
|
|
1305
|
+
}
|
|
1306
|
+
/**
|
|
1307
|
+
* Reads the `objectField` argument of a `firestoreSubObject` /
|
|
1308
|
+
* `firestoreObjectArray` call into a {@link NestedConverterMatch}.
|
|
1309
|
+
*
|
|
1310
|
+
* @param call - The nested-converter call expression.
|
|
1311
|
+
* @param fnName - The resolved factory name (`firestoreSubObject` or `firestoreObjectArray`).
|
|
1312
|
+
* @returns The nested-converter match, or `undefined` when the call shape is malformed.
|
|
1313
|
+
*/ function readNestedConverterCall(call, fnName) {
|
|
1314
|
+
var result;
|
|
1315
|
+
var args = call.getArguments();
|
|
1316
|
+
if (args.length > 0) {
|
|
1317
|
+
var config = args[0];
|
|
1318
|
+
if (tsMorph.Node.isObjectLiteralExpression(config)) {
|
|
1319
|
+
var objectField = readPropertyValue(config, OBJECT_FIELD_KEY);
|
|
1320
|
+
if (objectField) {
|
|
1321
|
+
result = buildNestedConverterMatch({
|
|
1322
|
+
objectField: objectField,
|
|
1323
|
+
call: call,
|
|
1324
|
+
fnName: fnName
|
|
1325
|
+
});
|
|
1346
1326
|
}
|
|
1347
1327
|
}
|
|
1348
1328
|
}
|
|
1349
1329
|
return result;
|
|
1350
1330
|
}
|
|
1331
|
+
/**
|
|
1332
|
+
* Builds a {@link NestedConverterMatch} from a resolved `objectField` node:
|
|
1333
|
+
* an identifier yields a converter `ref`, an object literal yields an `inline`
|
|
1334
|
+
* converter parsed from its `fields`.
|
|
1335
|
+
*
|
|
1336
|
+
* @param input - The `objectField` node, owning call expression, and factory name.
|
|
1337
|
+
* @returns The nested-converter match, or `undefined` when neither shape applies.
|
|
1338
|
+
*/ function buildNestedConverterMatch(input) {
|
|
1339
|
+
var objectField = input.objectField, call = input.call, fnName = input.fnName;
|
|
1340
|
+
var isArray = fnName === OBJECT_ARRAY_FN;
|
|
1341
|
+
var result;
|
|
1342
|
+
if (tsMorph.Node.isIdentifier(objectField)) {
|
|
1343
|
+
result = {
|
|
1344
|
+
ref: objectField.getText(),
|
|
1345
|
+
isArray: isArray
|
|
1346
|
+
};
|
|
1347
|
+
} else if (tsMorph.Node.isObjectLiteralExpression(objectField)) {
|
|
1348
|
+
var fieldsLiteral = readObjectProperty(objectField, FIELDS_LITERAL_KEY);
|
|
1349
|
+
if (fieldsLiteral) {
|
|
1350
|
+
result = {
|
|
1351
|
+
inline: {
|
|
1352
|
+
converterConst: undefined,
|
|
1353
|
+
factory: fnName,
|
|
1354
|
+
interfaceName: readGenericInterfaceName(call),
|
|
1355
|
+
fields: readFieldEntries(fieldsLiteral),
|
|
1356
|
+
line: call.getStartLineNumber()
|
|
1357
|
+
},
|
|
1358
|
+
isArray: isArray
|
|
1359
|
+
};
|
|
1360
|
+
}
|
|
1361
|
+
}
|
|
1362
|
+
return result;
|
|
1363
|
+
}
|
|
1351
1364
|
function readPropertyValue(literal, key) {
|
|
1352
1365
|
var property = literal.getProperty(key);
|
|
1353
1366
|
var result;
|
|
@@ -293,14 +293,25 @@ function findFunctionsClassName(sourceFile) {
|
|
|
293
293
|
return result;
|
|
294
294
|
}
|
|
295
295
|
function inferGroupName(sourceFile) {
|
|
296
|
+
var _findTypeAliasStem;
|
|
297
|
+
return (_findTypeAliasStem = findTypeAliasStem(sourceFile, 'ModelCrudFunctionsConfig')) !== null && _findTypeAliasStem !== void 0 ? _findTypeAliasStem : findTypeAliasStem(sourceFile, 'FunctionTypeMap');
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Finds the first type alias whose name ends with `ending` and returns the
|
|
301
|
+
* non-empty stem (the name with `ending` stripped).
|
|
302
|
+
*
|
|
303
|
+
* @param sourceFile - The parsed `<model>.api.ts` source.
|
|
304
|
+
* @param ending - The type-alias name suffix to match.
|
|
305
|
+
* @returns The stem preceding `ending`, or `undefined` when no alias matches with a non-empty stem.
|
|
306
|
+
*/ function findTypeAliasStem(sourceFile, ending) {
|
|
296
307
|
var result;
|
|
297
308
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
298
309
|
try {
|
|
299
310
|
for(var _iterator = sourceFile.getTypeAliases()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
300
311
|
var alias = _step.value;
|
|
301
312
|
var name = alias.getName();
|
|
302
|
-
if (name.endsWith(
|
|
303
|
-
var stem = name.slice(0, -
|
|
313
|
+
if (name.endsWith(ending)) {
|
|
314
|
+
var stem = name.slice(0, -ending.length);
|
|
304
315
|
if (stem.length > 0) {
|
|
305
316
|
result = stem;
|
|
306
317
|
break;
|
|
@@ -321,35 +332,6 @@ function inferGroupName(sourceFile) {
|
|
|
321
332
|
}
|
|
322
333
|
}
|
|
323
334
|
}
|
|
324
|
-
if (result === undefined) {
|
|
325
|
-
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
326
|
-
try {
|
|
327
|
-
for(var _iterator1 = sourceFile.getTypeAliases()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
328
|
-
var alias1 = _step1.value;
|
|
329
|
-
var name1 = alias1.getName();
|
|
330
|
-
if (name1.endsWith('FunctionTypeMap')) {
|
|
331
|
-
var stem1 = name1.slice(0, -'FunctionTypeMap'.length);
|
|
332
|
-
if (stem1.length > 0) {
|
|
333
|
-
result = stem1;
|
|
334
|
-
break;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
} catch (err) {
|
|
339
|
-
_didIteratorError1 = true;
|
|
340
|
-
_iteratorError1 = err;
|
|
341
|
-
} finally{
|
|
342
|
-
try {
|
|
343
|
-
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
344
|
-
_iterator1.return();
|
|
345
|
-
}
|
|
346
|
-
} finally{
|
|
347
|
-
if (_didIteratorError1) {
|
|
348
|
-
throw _iteratorError1;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
335
|
return result;
|
|
354
336
|
}
|
|
355
337
|
function isNullLiteralType(node) {
|
|
@@ -471,68 +453,71 @@ function typeNodeName(node) {
|
|
|
471
453
|
return result;
|
|
472
454
|
}
|
|
473
455
|
function readTypeDocs(sourceFile, typeName) {
|
|
474
|
-
var result;
|
|
475
456
|
var interfaceDecl = sourceFile.getInterface(typeName);
|
|
457
|
+
var result;
|
|
476
458
|
if (interfaceDecl) {
|
|
477
|
-
|
|
478
|
-
var hasApiParamsTag = hasJsDocFlag(interfaceDecl, 'dbxModelApiParams');
|
|
479
|
-
var fields = [];
|
|
480
|
-
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
481
|
-
try {
|
|
482
|
-
for(var _iterator = interfaceDecl.getProperties()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
483
|
-
var property = _step.value;
|
|
484
|
-
var _ref;
|
|
485
|
-
var fieldName = property.getName();
|
|
486
|
-
var description = readJsDocSummary(property);
|
|
487
|
-
var typeNode = property.getTypeNode();
|
|
488
|
-
var typeText = (_ref = typeNode === null || typeNode === void 0 ? void 0 : typeNode.getText().trim()) !== null && _ref !== void 0 ? _ref : '';
|
|
489
|
-
var adminOnly = hasJsDocFlag(property, 'dbxModelApiAdminOnly');
|
|
490
|
-
var field = _object_spread$1({
|
|
491
|
-
name: fieldName,
|
|
492
|
-
typeText: typeText
|
|
493
|
-
}, description ? {
|
|
494
|
-
description: description
|
|
495
|
-
} : {}, adminOnly ? {
|
|
496
|
-
accessLevel: 'adminOnly'
|
|
497
|
-
} : {});
|
|
498
|
-
fields.push(field);
|
|
499
|
-
}
|
|
500
|
-
} catch (err) {
|
|
501
|
-
_didIteratorError = true;
|
|
502
|
-
_iteratorError = err;
|
|
503
|
-
} finally{
|
|
504
|
-
try {
|
|
505
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
506
|
-
_iterator.return();
|
|
507
|
-
}
|
|
508
|
-
} finally{
|
|
509
|
-
if (_didIteratorError) {
|
|
510
|
-
throw _iteratorError;
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
if (typeDescription || fields.length > 0 || hasApiParamsTag) {
|
|
515
|
-
result = _object_spread_props(_object_spread$1({}, typeDescription ? {
|
|
516
|
-
typeDescription: typeDescription
|
|
517
|
-
} : {}, fields.length > 0 ? {
|
|
518
|
-
fields: fields
|
|
519
|
-
} : {}), {
|
|
520
|
-
hasApiParamsTag: hasApiParamsTag
|
|
521
|
-
});
|
|
522
|
-
}
|
|
459
|
+
result = readInterfaceTypeDocs(interfaceDecl);
|
|
523
460
|
} else {
|
|
524
461
|
var typeAlias = sourceFile.getTypeAlias(typeName);
|
|
525
|
-
|
|
526
|
-
var typeDescription1 = readJsDocSummary(typeAlias);
|
|
527
|
-
if (typeDescription1) {
|
|
528
|
-
result = {
|
|
529
|
-
typeDescription: typeDescription1
|
|
530
|
-
};
|
|
531
|
-
}
|
|
532
|
-
}
|
|
462
|
+
result = typeAlias ? readTypeAliasDocs(typeAlias) : undefined;
|
|
533
463
|
}
|
|
534
464
|
return result;
|
|
535
465
|
}
|
|
466
|
+
/**
|
|
467
|
+
* Reads the type-level JSDoc (summary, fields, `@dbxModelApiParams` flag) of a
|
|
468
|
+
* resolved interface declaration.
|
|
469
|
+
*
|
|
470
|
+
* @param interfaceDecl - The interface naming a params/result type.
|
|
471
|
+
* @returns The collected docs, or `undefined` when the interface has no description, fields, or marker.
|
|
472
|
+
*/ function readInterfaceTypeDocs(interfaceDecl) {
|
|
473
|
+
var typeDescription = readJsDocSummary(interfaceDecl);
|
|
474
|
+
var hasApiParamsTag = hasJsDocFlag(interfaceDecl, 'dbxModelApiParams');
|
|
475
|
+
var fields = interfaceDecl.getProperties().map(function(property) {
|
|
476
|
+
return readInterfaceField(property);
|
|
477
|
+
});
|
|
478
|
+
var result;
|
|
479
|
+
if (typeDescription || fields.length > 0 || hasApiParamsTag) {
|
|
480
|
+
result = _object_spread_props(_object_spread$1({}, typeDescription ? {
|
|
481
|
+
typeDescription: typeDescription
|
|
482
|
+
} : {}, fields.length > 0 ? {
|
|
483
|
+
fields: fields
|
|
484
|
+
} : {}), {
|
|
485
|
+
hasApiParamsTag: hasApiParamsTag
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
return result;
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* Reads one interface property into a {@link CrudEntryDocField}, capturing its
|
|
492
|
+
* type text, JSDoc summary, and `@dbxModelApiAdminOnly` access level.
|
|
493
|
+
*
|
|
494
|
+
* @param property - The interface property signature.
|
|
495
|
+
* @returns The doc field for the property.
|
|
496
|
+
*/ function readInterfaceField(property) {
|
|
497
|
+
var _ref;
|
|
498
|
+
var _property_getTypeNode;
|
|
499
|
+
var description = readJsDocSummary(property);
|
|
500
|
+
var adminOnly = hasJsDocFlag(property, 'dbxModelApiAdminOnly');
|
|
501
|
+
return _object_spread$1({
|
|
502
|
+
name: property.getName(),
|
|
503
|
+
typeText: (_ref = (_property_getTypeNode = property.getTypeNode()) === null || _property_getTypeNode === void 0 ? void 0 : _property_getTypeNode.getText().trim()) !== null && _ref !== void 0 ? _ref : ''
|
|
504
|
+
}, description ? {
|
|
505
|
+
description: description
|
|
506
|
+
} : {}, adminOnly ? {
|
|
507
|
+
accessLevel: 'adminOnly'
|
|
508
|
+
} : {});
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Reads the type-level JSDoc summary of a resolved type alias.
|
|
512
|
+
*
|
|
513
|
+
* @param typeAlias - The type alias naming a params/result type.
|
|
514
|
+
* @returns The collected docs, or `undefined` when the alias has no description.
|
|
515
|
+
*/ function readTypeAliasDocs(typeAlias) {
|
|
516
|
+
var typeDescription = readJsDocSummary(typeAlias);
|
|
517
|
+
return typeDescription ? {
|
|
518
|
+
typeDescription: typeDescription
|
|
519
|
+
} : undefined;
|
|
520
|
+
}
|
|
536
521
|
/**
|
|
537
522
|
* Returns `true` when any JSDoc block on `node` carries the bare `@<tagName>` flag.
|
|
538
523
|
*
|
|
@@ -648,8 +633,8 @@ function readTypeDocs(sourceFile, typeName) {
|
|
|
648
633
|
function readJsDocSummary(node) {
|
|
649
634
|
var result;
|
|
650
635
|
var docs = node.getJsDocs();
|
|
651
|
-
|
|
652
|
-
|
|
636
|
+
var last = docs.at(-1);
|
|
637
|
+
if (last) {
|
|
653
638
|
var description = last.getDescription().trim();
|
|
654
639
|
if (description.length > 0) {
|
|
655
640
|
result = description;
|
|
@@ -1311,41 +1296,69 @@ function readNestedFromExpression(expr) {
|
|
|
1311
1296
|
if (Node.isCallExpression(expr)) {
|
|
1312
1297
|
var fnName = expr.getExpression().getText();
|
|
1313
1298
|
if (fnName === SUB_OBJECT_FN || fnName === OBJECT_ARRAY_FN) {
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
};
|
|
1340
|
-
}
|
|
1341
|
-
}
|
|
1342
|
-
}
|
|
1343
|
-
}
|
|
1299
|
+
result = readNestedConverterCall(expr, fnName);
|
|
1300
|
+
}
|
|
1301
|
+
}
|
|
1302
|
+
return result;
|
|
1303
|
+
}
|
|
1304
|
+
/**
|
|
1305
|
+
* Reads the `objectField` argument of a `firestoreSubObject` /
|
|
1306
|
+
* `firestoreObjectArray` call into a {@link NestedConverterMatch}.
|
|
1307
|
+
*
|
|
1308
|
+
* @param call - The nested-converter call expression.
|
|
1309
|
+
* @param fnName - The resolved factory name (`firestoreSubObject` or `firestoreObjectArray`).
|
|
1310
|
+
* @returns The nested-converter match, or `undefined` when the call shape is malformed.
|
|
1311
|
+
*/ function readNestedConverterCall(call, fnName) {
|
|
1312
|
+
var result;
|
|
1313
|
+
var args = call.getArguments();
|
|
1314
|
+
if (args.length > 0) {
|
|
1315
|
+
var config = args[0];
|
|
1316
|
+
if (Node.isObjectLiteralExpression(config)) {
|
|
1317
|
+
var objectField = readPropertyValue(config, OBJECT_FIELD_KEY);
|
|
1318
|
+
if (objectField) {
|
|
1319
|
+
result = buildNestedConverterMatch({
|
|
1320
|
+
objectField: objectField,
|
|
1321
|
+
call: call,
|
|
1322
|
+
fnName: fnName
|
|
1323
|
+
});
|
|
1344
1324
|
}
|
|
1345
1325
|
}
|
|
1346
1326
|
}
|
|
1347
1327
|
return result;
|
|
1348
1328
|
}
|
|
1329
|
+
/**
|
|
1330
|
+
* Builds a {@link NestedConverterMatch} from a resolved `objectField` node:
|
|
1331
|
+
* an identifier yields a converter `ref`, an object literal yields an `inline`
|
|
1332
|
+
* converter parsed from its `fields`.
|
|
1333
|
+
*
|
|
1334
|
+
* @param input - The `objectField` node, owning call expression, and factory name.
|
|
1335
|
+
* @returns The nested-converter match, or `undefined` when neither shape applies.
|
|
1336
|
+
*/ function buildNestedConverterMatch(input) {
|
|
1337
|
+
var objectField = input.objectField, call = input.call, fnName = input.fnName;
|
|
1338
|
+
var isArray = fnName === OBJECT_ARRAY_FN;
|
|
1339
|
+
var result;
|
|
1340
|
+
if (Node.isIdentifier(objectField)) {
|
|
1341
|
+
result = {
|
|
1342
|
+
ref: objectField.getText(),
|
|
1343
|
+
isArray: isArray
|
|
1344
|
+
};
|
|
1345
|
+
} else if (Node.isObjectLiteralExpression(objectField)) {
|
|
1346
|
+
var fieldsLiteral = readObjectProperty(objectField, FIELDS_LITERAL_KEY);
|
|
1347
|
+
if (fieldsLiteral) {
|
|
1348
|
+
result = {
|
|
1349
|
+
inline: {
|
|
1350
|
+
converterConst: undefined,
|
|
1351
|
+
factory: fnName,
|
|
1352
|
+
interfaceName: readGenericInterfaceName(call),
|
|
1353
|
+
fields: readFieldEntries(fieldsLiteral),
|
|
1354
|
+
line: call.getStartLineNumber()
|
|
1355
|
+
},
|
|
1356
|
+
isArray: isArray
|
|
1357
|
+
};
|
|
1358
|
+
}
|
|
1359
|
+
}
|
|
1360
|
+
return result;
|
|
1361
|
+
}
|
|
1349
1362
|
function readPropertyValue(literal, key) {
|
|
1350
1363
|
var property = literal.getProperty(key);
|
|
1351
1364
|
var result;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/dbx-cli/manifest-extract",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.16.0",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"ts-morph": "^21.0.0"
|
|
7
7
|
},
|
|
8
8
|
"devDependencies": {
|
|
9
|
-
"@dereekb/firebase": "13.
|
|
9
|
+
"@dereekb/firebase": "13.16.0"
|
|
10
10
|
},
|
|
11
11
|
"exports": {
|
|
12
12
|
"./package.json": "./package.json",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/dbx-cli",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.16.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"bin": {
|
|
@@ -50,11 +50,11 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
|
-
"@dereekb/date": "13.
|
|
54
|
-
"@dereekb/firebase": "13.
|
|
55
|
-
"@dereekb/model": "13.
|
|
56
|
-
"@dereekb/nestjs": "13.
|
|
57
|
-
"@dereekb/util": "13.
|
|
53
|
+
"@dereekb/date": "13.16.0",
|
|
54
|
+
"@dereekb/firebase": "13.16.0",
|
|
55
|
+
"@dereekb/model": "13.16.0",
|
|
56
|
+
"@dereekb/nestjs": "13.16.0",
|
|
57
|
+
"@dereekb/util": "13.16.0",
|
|
58
58
|
"@nestjs/common": "^11.1.19",
|
|
59
59
|
"arktype": "^2.2.0",
|
|
60
60
|
"jiti": "2.6.1",
|
package/test/index.cjs.js
CHANGED
|
@@ -335,7 +335,7 @@ function _ts_generator(thisArg, body) {
|
|
|
335
335
|
case 2:
|
|
336
336
|
address = server.address();
|
|
337
337
|
port = (typeof address === "undefined" ? "undefined" : _type_of(address)) === 'object' && address ? address.port : 0;
|
|
338
|
-
trimmedPrefix = prefix.
|
|
338
|
+
trimmedPrefix = prefix.replaceAll(/^\/+|\/+$/g, '');
|
|
339
339
|
apiBaseUrl = trimmedPrefix.length > 0 ? "http://".concat(host, ":").concat(port, "/").concat(trimmedPrefix) : "http://".concat(host, ":").concat(port);
|
|
340
340
|
return [
|
|
341
341
|
2,
|