@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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dereekb/dbx-cli-lint-cache",
3
- "version": "13.15.0",
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.15.0",
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('ModelCrudFunctionsConfig')) {
305
- var stem = name.slice(0, -'ModelCrudFunctionsConfig'.length);
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
- var typeDescription = readJsDocSummary(interfaceDecl);
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
- if (typeAlias) {
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
- if (docs.length > 0) {
654
- var last = docs[docs.length - 1];
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
- var args = expr.getArguments();
1317
- if (args.length > 0) {
1318
- var config = args[0];
1319
- if (tsMorph.Node.isObjectLiteralExpression(config)) {
1320
- var objectField = readPropertyValue(config, OBJECT_FIELD_KEY);
1321
- if (objectField) {
1322
- var isArray = fnName === OBJECT_ARRAY_FN;
1323
- if (tsMorph.Node.isIdentifier(objectField)) {
1324
- result = {
1325
- ref: objectField.getText(),
1326
- isArray: isArray
1327
- };
1328
- } else if (tsMorph.Node.isObjectLiteralExpression(objectField)) {
1329
- var fieldsLiteral = readObjectProperty(objectField, FIELDS_LITERAL_KEY);
1330
- if (fieldsLiteral) {
1331
- var inlineFields = readFieldEntries(fieldsLiteral);
1332
- result = {
1333
- inline: {
1334
- converterConst: undefined,
1335
- factory: fnName,
1336
- interfaceName: readGenericInterfaceName(expr),
1337
- fields: inlineFields,
1338
- line: expr.getStartLineNumber()
1339
- },
1340
- isArray: isArray
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('ModelCrudFunctionsConfig')) {
303
- var stem = name.slice(0, -'ModelCrudFunctionsConfig'.length);
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
- var typeDescription = readJsDocSummary(interfaceDecl);
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
- if (typeAlias) {
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
- if (docs.length > 0) {
652
- var last = docs[docs.length - 1];
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
- var args = expr.getArguments();
1315
- if (args.length > 0) {
1316
- var config = args[0];
1317
- if (Node.isObjectLiteralExpression(config)) {
1318
- var objectField = readPropertyValue(config, OBJECT_FIELD_KEY);
1319
- if (objectField) {
1320
- var isArray = fnName === OBJECT_ARRAY_FN;
1321
- if (Node.isIdentifier(objectField)) {
1322
- result = {
1323
- ref: objectField.getText(),
1324
- isArray: isArray
1325
- };
1326
- } else if (Node.isObjectLiteralExpression(objectField)) {
1327
- var fieldsLiteral = readObjectProperty(objectField, FIELDS_LITERAL_KEY);
1328
- if (fieldsLiteral) {
1329
- var inlineFields = readFieldEntries(fieldsLiteral);
1330
- result = {
1331
- inline: {
1332
- converterConst: undefined,
1333
- factory: fnName,
1334
- interfaceName: readGenericInterfaceName(expr),
1335
- fields: inlineFields,
1336
- line: expr.getStartLineNumber()
1337
- },
1338
- isArray: isArray
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.15.0",
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.15.0"
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.15.0",
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.15.0",
54
- "@dereekb/firebase": "13.15.0",
55
- "@dereekb/model": "13.15.0",
56
- "@dereekb/nestjs": "13.15.0",
57
- "@dereekb/util": "13.15.0",
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.replace(/^\/+|\/+$/g, '');
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,