@dereekb/dbx-components-mcp 13.11.12 → 13.11.14
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.
|
@@ -457,6 +457,22 @@
|
|
|
457
457
|
],
|
|
458
458
|
"notes": "A number that represents hours and rounded to the nearest minute.\n\nIt has only three decimal places max.\n\nFractional hours are safe to add together.\n\nFor example:\n\n- 10 minutes: 0.16\n- 15 minutes : 0.25"
|
|
459
459
|
},
|
|
460
|
+
{
|
|
461
|
+
"name": "HourOfDay",
|
|
462
|
+
"package": "@dereekb/util",
|
|
463
|
+
"module": "src/lib/date/hour",
|
|
464
|
+
"kind": "semantic-type",
|
|
465
|
+
"definition": "number",
|
|
466
|
+
"baseType": "number",
|
|
467
|
+
"topics": [
|
|
468
|
+
"date",
|
|
469
|
+
"numeric"
|
|
470
|
+
],
|
|
471
|
+
"guards": [
|
|
472
|
+
"isHourOfDay"
|
|
473
|
+
],
|
|
474
|
+
"notes": "The hour of the day.\n\nNumber from 0-23."
|
|
475
|
+
},
|
|
460
476
|
{
|
|
461
477
|
"name": "MinuteOfDay",
|
|
462
478
|
"package": "@dereekb/util",
|
|
@@ -229,6 +229,268 @@
|
|
|
229
229
|
}
|
|
230
230
|
]
|
|
231
231
|
},
|
|
232
|
+
{
|
|
233
|
+
"code": "MODEL_FIREBASE_INDEX_BUILD_FAILED",
|
|
234
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
235
|
+
"severity": "warning",
|
|
236
|
+
"title": "The scan could not run — missing config, missing package.json, or an invalid manifest",
|
|
237
|
+
"whatItFlags": "The scan could not run — missing config, missing package.json, or an invalid manifest.",
|
|
238
|
+
"whenItApplies": "When `buildModelFirebaseIndexManifest` returns any outcome other than `success` (no-config, invalid-scan-config, no-package, invalid-package, invalid-manifest).",
|
|
239
|
+
"whenItDoesNotApply": "Components that successfully build a manifest — their downstream warnings get specific codes.",
|
|
240
|
+
"canonicalFix": "Read the embedded message; add or fix `dbx-mcp.scan.json`, ensure the component has a `package.json`, or correct the manifest shape so extraction can complete."
|
|
241
|
+
},
|
|
242
|
+
{
|
|
243
|
+
"code": "MODEL_FIREBASE_INDEX_COMPLEX_QUERY_BODY",
|
|
244
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
245
|
+
"severity": "error",
|
|
246
|
+
"title": "A tagged query body uses `if` / `switch` / ternary / loop — not branch-free",
|
|
247
|
+
"whatItFlags": "A tagged query body uses `if` / `switch` / ternary / loop — not branch-free.",
|
|
248
|
+
"whenItApplies": "Every `@dbxModelFirebaseIndex`-tagged factory whose body contains a branching construct, except those tagged `@dbxModelFirebaseIndexDispatcher`.",
|
|
249
|
+
"whenItDoesNotApply": "Bodies that only use `??` / `&&` / `||` for argument defaulting — those are still considered branch-free.",
|
|
250
|
+
"canonicalFix": "Split the function into one tagged factory per target index (each branch-free), or — if it only routes between other tagged queries — mark it `@dbxModelFirebaseIndexDispatcher` and return per-index results from each branch.",
|
|
251
|
+
"canonicalFixTemplate": "```ts\n/**\n*",
|
|
252
|
+
"seeAlso": [
|
|
253
|
+
{
|
|
254
|
+
"kind": "tool",
|
|
255
|
+
"target": "dbx_model_firebase_index_validate_app"
|
|
256
|
+
}
|
|
257
|
+
]
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"code": "MODEL_FIREBASE_INDEX_COMPOSITE_ADDED",
|
|
261
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
262
|
+
"severity": "error",
|
|
263
|
+
"title": "A composite index required by tagged factories is missing from the committed `firestore.indexes.json`",
|
|
264
|
+
"whatItFlags": "A composite index required by tagged factories is missing from the committed `firestore.indexes.json`.",
|
|
265
|
+
"whenItApplies": "Every entry in the generated composite set that has no equal entry in the committed JSON.",
|
|
266
|
+
"whenItDoesNotApply": "Factories tagged `@dbxModelFirebaseIndexManual` — their shapes are author-managed and excluded from drift.",
|
|
267
|
+
"canonicalFix": "Run the `scan-model-firebase-indexes` / `generate-firestore-indexes` CLIs and commit the regenerated `firestore.indexes.json`."
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"code": "MODEL_FIREBASE_INDEX_COMPOSITE_REMOVED",
|
|
271
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
272
|
+
"severity": "warning",
|
|
273
|
+
"title": "A composite index in the committed `firestore.indexes.json` has no factory backing it",
|
|
274
|
+
"whatItFlags": "A composite index in the committed `firestore.indexes.json` has no factory backing it.",
|
|
275
|
+
"whenItApplies": "Every entry in the committed JSON that has no equal entry in the generated set.",
|
|
276
|
+
"whenItDoesNotApply": "Composites managed by hand — tag the corresponding factory with `@dbxModelFirebaseIndexManual` so the validator treats the deployed shape as expected.",
|
|
277
|
+
"canonicalFix": "Either delete the stale composite, or add a `@dbxModelFirebaseIndexManual` factory describing its shape so the validator treats it as expected."
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"code": "MODEL_FIREBASE_INDEX_DUPLICATE_SLUG",
|
|
281
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
282
|
+
"severity": "warning",
|
|
283
|
+
"title": "Two tagged factories resolve to the same slug — the second is dropped from the manifest",
|
|
284
|
+
"whatItFlags": "Two tagged factories resolve to the same slug — the second is dropped from the manifest.",
|
|
285
|
+
"whenItApplies": "When two `@dbxModelFirebaseIndex` exports share the same `@dbxModelFirebaseIndexSlug` (or the same auto-derived slug from their names).",
|
|
286
|
+
"whenItDoesNotApply": "Intentional aliases — they should target the same composite, in which case keep one factory.",
|
|
287
|
+
"canonicalFix": "Pick distinct slugs (or distinct function names) so each factory is addressable."
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"code": "MODEL_FIREBASE_INDEX_FIELD_OVERRIDE_ADDED",
|
|
291
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
292
|
+
"severity": "error",
|
|
293
|
+
"title": "A `fieldOverrides` entry required by tagged factories is missing from the committed `firestore.indexes.json`",
|
|
294
|
+
"whatItFlags": "A `fieldOverrides` entry required by tagged factories is missing from the committed `firestore.indexes.json`.",
|
|
295
|
+
"whenItApplies": "Every fieldOverride required by an analyzed factory and absent from the committed JSON.",
|
|
296
|
+
"whenItDoesNotApply": "fieldOverrides covered by an `@dbxModelFirebaseIndexManual` factory.",
|
|
297
|
+
"canonicalFix": "Regenerate `firestore.indexes.json` via the scan + generate CLIs and commit."
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"code": "MODEL_FIREBASE_INDEX_FIELD_OVERRIDE_REMOVED",
|
|
301
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
302
|
+
"severity": "warning",
|
|
303
|
+
"title": "A `fieldOverrides` entry exists in the committed JSON but no factory requires it",
|
|
304
|
+
"whatItFlags": "A `fieldOverrides` entry exists in the committed JSON but no factory requires it.",
|
|
305
|
+
"whenItApplies": "Every fieldOverride in the committed JSON without a matching generated entry.",
|
|
306
|
+
"whenItDoesNotApply": "fieldOverrides covered by a hand-managed `@dbxModelFirebaseIndexManual` factory.",
|
|
307
|
+
"canonicalFix": "Either delete the stale entry or add a `@dbxModelFirebaseIndexManual` factory so the validator treats it as expected."
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"code": "MODEL_FIREBASE_INDEX_INDEXES_FILE_INVALID",
|
|
311
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
312
|
+
"severity": "warning",
|
|
313
|
+
"title": "The committed `firestore.indexes.json` exists but could not be parsed",
|
|
314
|
+
"whatItFlags": "The committed `firestore.indexes.json` exists but could not be parsed.",
|
|
315
|
+
"whenItApplies": "When `readFile` succeeds but `JSON.parse` fails, or the top-level value is not an object.",
|
|
316
|
+
"whenItDoesNotApply": "Components whose indexes file is absent — that path emits the missing-file note in the header instead.",
|
|
317
|
+
"canonicalFix": "Restore the file to valid JSON with a top-level `{ \"indexes\": [...], \"fieldOverrides\": [...] }` object — re-run `firebase init firestore` or restore from git history."
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"code": "MODEL_FIREBASE_INDEX_MISSING_MODEL_TAG",
|
|
321
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
322
|
+
"severity": "warning",
|
|
323
|
+
"title": "A tagged factory is missing the required `@dbxModelFirebaseIndexModel <Type>` tag",
|
|
324
|
+
"whatItFlags": "A tagged factory is missing the required `@dbxModelFirebaseIndexModel <Type>` tag.",
|
|
325
|
+
"whenItApplies": "Every `@dbxModelFirebaseIndex`-tagged export.",
|
|
326
|
+
"whenItDoesNotApply": "Helpers that opt out of index emission via `@dbxModelFirebaseIndexSkip` and aren't tagged themselves.",
|
|
327
|
+
"canonicalFix": "Add `@dbxModelFirebaseIndexModel <TypeName>` referencing the Firestore model whose collection the query targets.",
|
|
328
|
+
"canonicalFixTemplate": "```ts\n/**\n*",
|
|
329
|
+
"seeAlso": [
|
|
330
|
+
{
|
|
331
|
+
"kind": "tool",
|
|
332
|
+
"target": "dbx_model_firebase_index_validate_app"
|
|
333
|
+
}
|
|
334
|
+
]
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
"code": "MODEL_FIREBASE_INDEX_MISSING_NAME",
|
|
338
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
339
|
+
"severity": "warning",
|
|
340
|
+
"title": "A `@dbxModelFirebaseIndex`-tagged export has no resolvable function name",
|
|
341
|
+
"whatItFlags": "A `@dbxModelFirebaseIndex`-tagged export has no resolvable function name.",
|
|
342
|
+
"whenItApplies": "When the JSDoc marker sits above a default export or an arrow assigned to a non-identifier binding.",
|
|
343
|
+
"whenItDoesNotApply": "Named `export function ...` declarations — the extractor reads the name directly.",
|
|
344
|
+
"canonicalFix": "Convert the export to `export function <name>(...) {}` so the slug + lookup table get a stable identifier.",
|
|
345
|
+
"seeAlso": [
|
|
346
|
+
{
|
|
347
|
+
"kind": "tool",
|
|
348
|
+
"target": "dbx_model_firebase_index_validate_app"
|
|
349
|
+
}
|
|
350
|
+
]
|
|
351
|
+
},
|
|
352
|
+
{
|
|
353
|
+
"code": "MODEL_FIREBASE_INDEX_MISSING_PATHS",
|
|
354
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
355
|
+
"severity": "warning",
|
|
356
|
+
"title": "A tagged body has conditional fields but no `@dbxModelFirebaseIndexPath` declarations",
|
|
357
|
+
"whatItFlags": "A tagged body has conditional fields but no `@dbxModelFirebaseIndexPath` declarations.",
|
|
358
|
+
"whenItApplies": "Legacy fallback when a tagged body somehow has conditional fields after the structural check skipped it. New code paths surface `MODEL_FIREBASE_INDEX_COMPLEX_QUERY_BODY` first.",
|
|
359
|
+
"whenItDoesNotApply": "Branch-free bodies — no path tag is necessary when every constraint executes unconditionally.",
|
|
360
|
+
"canonicalFix": "Add one `@dbxModelFirebaseIndexPath <fields>` tag per call pattern, or restructure into one branch-free factory per target index."
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
"code": "MODEL_FIREBASE_INDEX_MULTIPLE_RANGE_FIELDS",
|
|
364
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
365
|
+
"severity": "warning",
|
|
366
|
+
"title": "A constraint sequence has more than one range-filtered field",
|
|
367
|
+
"whatItFlags": "A constraint sequence has more than one range-filtered field.",
|
|
368
|
+
"whenItApplies": "Every analyzed sequence whose `where` calls put `<`, `<=`, `>`, `>=`, `!=`, or `not-in` on more than one field path.",
|
|
369
|
+
"whenItDoesNotApply": "Sequences that range-filter at most one field — Firestore's standard composite-index shape.",
|
|
370
|
+
"canonicalFix": "Restructure the query so only one field has a range filter; convert the others to equality filters or move them into a separate factory."
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
"code": "MODEL_FIREBASE_INDEX_NON_DELEGATING_DISPATCHER",
|
|
374
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
375
|
+
"severity": "error",
|
|
376
|
+
"title": "A `@dbxModelFirebaseIndexDispatcher` calls `where` / `orderBy` / a registered helper directly",
|
|
377
|
+
"whatItFlags": "A `@dbxModelFirebaseIndexDispatcher` calls `where` / `orderBy` / a registered helper directly.",
|
|
378
|
+
"whenItApplies": "Every dispatcher whose body emits its own constraints instead of delegating to other tagged query functions.",
|
|
379
|
+
"whenItDoesNotApply": "Dispatchers whose every branch is `return <perIndexQuery>(...)` — the canonical shape.",
|
|
380
|
+
"canonicalFix": "Move the constraint construction into a sibling `@dbxModelFirebaseIndex` factory and have the dispatcher `return` its result. If the function should not be a dispatcher, drop the `@dbxModelFirebaseIndexDispatcher` tag.",
|
|
381
|
+
"seeAlso": [
|
|
382
|
+
{
|
|
383
|
+
"kind": "tool",
|
|
384
|
+
"target": "dbx_model_firebase_index_validate_app"
|
|
385
|
+
}
|
|
386
|
+
]
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"code": "MODEL_FIREBASE_INDEX_ORDERBY_CONFLICT",
|
|
390
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
391
|
+
"severity": "warning",
|
|
392
|
+
"title": "Two `orderBy` calls in the same constraint sequence disagree on direction for the same field",
|
|
393
|
+
"whatItFlags": "Two `orderBy` calls in the same constraint sequence disagree on direction for the same field.",
|
|
394
|
+
"whenItApplies": "When the same field path appears in multiple `orderBy` calls with both `asc` and `desc`.",
|
|
395
|
+
"whenItDoesNotApply": "Sequences with at most one direction per field.",
|
|
396
|
+
"canonicalFix": "Pick one direction per field, or split into two factories — Firestore can only deploy one direction at a time per composite."
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
"code": "MODEL_FIREBASE_INDEX_TRANSITIVE_CYCLE",
|
|
400
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
401
|
+
"severity": "warning",
|
|
402
|
+
"title": "Transitive constraint resolution hit a cycle (`A → B → A`)",
|
|
403
|
+
"whatItFlags": "Transitive constraint resolution hit a cycle (`A → B → A`).",
|
|
404
|
+
"whenItApplies": "When a tagged factory transitively calls itself through one or more other tagged factories.",
|
|
405
|
+
"whenItDoesNotApply": "Composition graphs without back-edges — those resolve cleanly.",
|
|
406
|
+
"canonicalFix": "Break the recursion in source — split the shared constraints into a leaf factory that neither caller re-enters."
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"code": "MODEL_FIREBASE_INDEX_UNANNOTATED_QUERY_HELPER",
|
|
410
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
411
|
+
"severity": "warning",
|
|
412
|
+
"title": "A transitive callee returns `FirestoreQueryConstraint(s)` but is not `@dbxModelFirebaseIndex`-tagged",
|
|
413
|
+
"whatItFlags": "A transitive callee returns `FirestoreQueryConstraint(s)` but is not `@dbxModelFirebaseIndex`-tagged.",
|
|
414
|
+
"whenItApplies": "When a tagged factory inlines an untagged helper that returns query constraints — constraints still splice, but the helper escapes the catalog.",
|
|
415
|
+
"whenItDoesNotApply": "Helpers explicitly marked `@dbxModelFirebaseIndexSkip` — they opt out of emitting their own composite while still contributing to callers.",
|
|
416
|
+
"canonicalFix": "Tag the callee with `@dbxModelFirebaseIndex` (giving it its own composite) or mark it `@dbxModelFirebaseIndexSkip` (excluded but still spliced into callers)."
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
"code": "MODEL_FIREBASE_INDEX_UNKNOWN_HELPER",
|
|
420
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
421
|
+
"severity": "warning",
|
|
422
|
+
"title": "A constraint helper is called that the extractor does not recognise",
|
|
423
|
+
"whatItFlags": "A constraint helper is called that the extractor does not recognise.",
|
|
424
|
+
"whenItApplies": "When a tagged body invokes a function named like a helper but absent from `FIRESTORE_QUERY_HELPERS`.",
|
|
425
|
+
"whenItDoesNotApply": "Helpers that resolve via transitive resolution to another tagged factory — those go through `MODEL_FIREBASE_INDEX_UNANNOTATED_QUERY_HELPER` instead.",
|
|
426
|
+
"canonicalFix": "Either swap to a registered helper (e.g. `whereDateIsBeforeWithSort`) or extend `FIRESTORE_QUERY_HELPERS` in `dbx-components-mcp` with a descriptor."
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
"code": "MODEL_FIREBASE_INDEX_UNKNOWN_PATH_FIELD",
|
|
430
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
431
|
+
"severity": "warning",
|
|
432
|
+
"title": "`@dbxModelFirebaseIndexPath` references a field no `where` / `orderBy` / helper call in the body produces",
|
|
433
|
+
"whatItFlags": "`@dbxModelFirebaseIndexPath` references a field no `where` / `orderBy` / helper call in the body produces.",
|
|
434
|
+
"whenItApplies": "Every path tag whose field list contains an unknown identifier.",
|
|
435
|
+
"whenItDoesNotApply": "Path tags whose fields all map to body calls.",
|
|
436
|
+
"canonicalFix": "Either fix the field name in the path tag or extend the body to produce that constraint."
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"code": "MODEL_FIREBASE_INDEX_UNRESOLVABLE_TRANSITIVE_CALLEE",
|
|
440
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
441
|
+
"severity": "warning",
|
|
442
|
+
"title": "A transitive callee returns constraints but its declaration is not reachable (likely a cross-package `.d.ts` import)",
|
|
443
|
+
"whatItFlags": "A transitive callee returns constraints but its declaration is not reachable (likely a cross-package `.d.ts` import).",
|
|
444
|
+
"whenItApplies": "When the resolved callee has no body (declaration-only) and so its constraints cannot be spliced.",
|
|
445
|
+
"whenItDoesNotApply": "Callees declared in the scanned source tree — those resolve normally.",
|
|
446
|
+
"canonicalFix": "Inline the constraint sequence locally, or extend `FIRESTORE_QUERY_HELPERS` in `dbx-components-mcp` with a descriptor for the helper."
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
"code": "MODEL_FIREBASE_INDEX_UNRESOLVED_FIELD",
|
|
450
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
451
|
+
"severity": "warning",
|
|
452
|
+
"title": "A `where` / `orderBy` / helper call's field-path argument is not a string literal",
|
|
453
|
+
"whatItFlags": "A `where` / `orderBy` / helper call's field-path argument is not a string literal.",
|
|
454
|
+
"whenItApplies": "When the extractor sees an identifier, template, or computed expression in the field-path slot.",
|
|
455
|
+
"whenItDoesNotApply": "Calls whose field path is a plain `'literal'` string — those parse cleanly.",
|
|
456
|
+
"canonicalFix": "Replace the dynamic expression with a string literal. If the path varies, split the factory and use `@dbxModelFirebaseIndexPath` tags."
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
"code": "MODEL_FIREBASE_INDEX_UNRESOLVED_MODEL",
|
|
460
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
461
|
+
"severity": "warning",
|
|
462
|
+
"title": "`@dbxModelFirebaseIndexModel` references a type the identity resolver does not know about",
|
|
463
|
+
"whatItFlags": "`@dbxModelFirebaseIndexModel` references a type the identity resolver does not know about.",
|
|
464
|
+
"whenItApplies": "When the model name on the tag does not resolve to a `firestoreModelIdentity(...)` declaration in the scanned project.",
|
|
465
|
+
"whenItDoesNotApply": "Models whose identity lives in an upstream package not included in the scan globs — extend the scan config instead.",
|
|
466
|
+
"canonicalFix": "Either fix the typo or add a `firestoreModelIdentity('<short>', '<plural>')` declaration in the component.",
|
|
467
|
+
"seeAlso": [
|
|
468
|
+
{
|
|
469
|
+
"kind": "doc",
|
|
470
|
+
"target": "dbx__guide__new-model"
|
|
471
|
+
}
|
|
472
|
+
]
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
"code": "MODEL_FIREBASE_INDEX_UNSUPPORTED_ARRAY_CONTAINS_ANY",
|
|
476
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
477
|
+
"severity": "warning",
|
|
478
|
+
"title": "A field uses the `array-contains-any` operator — index support is partial",
|
|
479
|
+
"whatItFlags": "A field uses the `array-contains-any` operator — index support is partial.",
|
|
480
|
+
"whenItApplies": "Every constraint sequence with at least one `array-contains-any` `where`.",
|
|
481
|
+
"whenItDoesNotApply": "Queries using `array-contains` (singular) — those have full composite support.",
|
|
482
|
+
"canonicalFix": "Confirm the deployed composite supports `array-contains-any` for the field set, or restructure to `array-contains` with a denormalised flag."
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
"code": "MODEL_FIREBASE_INDEX_UNSUPPORTED_SCOPE",
|
|
486
|
+
"source": "dbx_model_firebase_index_validate_app",
|
|
487
|
+
"severity": "warning",
|
|
488
|
+
"title": "`@dbxModelFirebaseIndexScope` was set to an unsupported value",
|
|
489
|
+
"whatItFlags": "`@dbxModelFirebaseIndexScope` was set to an unsupported value.",
|
|
490
|
+
"whenItApplies": "Every tagged factory that declares an explicit scope tag.",
|
|
491
|
+
"whenItDoesNotApply": "Factories that omit the tag — scope falls back to COLLECTION_GROUP for nested models, COLLECTION for root models.",
|
|
492
|
+
"canonicalFix": "Set the tag value to exactly `COLLECTION` or `COLLECTION_GROUP`."
|
|
493
|
+
},
|
|
232
494
|
{
|
|
233
495
|
"code": "archetype-inconsistent",
|
|
234
496
|
"source": "dbx_model_fixture_validate_app",
|
|
@@ -459,6 +721,86 @@
|
|
|
459
721
|
}
|
|
460
722
|
]
|
|
461
723
|
},
|
|
724
|
+
{
|
|
725
|
+
"code": "MODEL_COMPOSITE_KEY_INVALID_ENCODING",
|
|
726
|
+
"source": "dbx_model_validate",
|
|
727
|
+
"severity": "error",
|
|
728
|
+
"title": "The `@dbxModelCompositeKey` tag has an invalid (or missing) `encoding=` argument. Allowed values are `two-way` (round-trips via `inferKeyFromTwoWayFlatFirestoreModelKey`) and `one-way` (slashes stripped, not recoverable)",
|
|
729
|
+
"whatItFlags": "The `@dbxModelCompositeKey` tag has an invalid (or missing) `encoding=` argument. Allowed values are `two-way` (round-trips via `inferKeyFromTwoWayFlatFirestoreModelKey`) and `one-way` (slashes stripped, not recoverable).",
|
|
730
|
+
"whenItApplies": "Every `@dbxModelCompositeKey` tag.",
|
|
731
|
+
"whenItDoesNotApply": "Models without the tag.",
|
|
732
|
+
"canonicalFix": "Set `encoding=two-way` when the source keys must be recoverable from the doc id (the common case). Use `encoding=one-way` only when the source keys are also stored as fields and the doc id only needs to be unique.",
|
|
733
|
+
"seeAlso": [
|
|
734
|
+
{
|
|
735
|
+
"kind": "artifact",
|
|
736
|
+
"target": "firestore-model"
|
|
737
|
+
}
|
|
738
|
+
]
|
|
739
|
+
},
|
|
740
|
+
{
|
|
741
|
+
"code": "MODEL_COMPOSITE_KEY_MISSING_FROM",
|
|
742
|
+
"source": "dbx_model_validate",
|
|
743
|
+
"severity": "error",
|
|
744
|
+
"title": "The `@dbxModelCompositeKey` tag is missing its `from=` argument. The tag must declare either a concrete list of source models (`from=ModelA,ModelB`) or the wildcard form (`from=*`) used by framework models that accept any source identity",
|
|
745
|
+
"whatItFlags": "The `@dbxModelCompositeKey` tag is missing its `from=` argument. The tag must declare either a concrete list of source models (`from=ModelA,ModelB`) or the wildcard form (`from=*`) used by framework models that accept any source identity.",
|
|
746
|
+
"whenItApplies": "Every `@dbxModelCompositeKey` tag.",
|
|
747
|
+
"whenItDoesNotApply": "Models without the tag.",
|
|
748
|
+
"canonicalFix": "Add `from=<ModelA>,<ModelB>` (concrete list) or `from=*` (wildcard for framework models like `NotificationBox`).",
|
|
749
|
+
"seeAlso": [
|
|
750
|
+
{
|
|
751
|
+
"kind": "artifact",
|
|
752
|
+
"target": "firestore-model"
|
|
753
|
+
}
|
|
754
|
+
]
|
|
755
|
+
},
|
|
756
|
+
{
|
|
757
|
+
"code": "MODEL_COMPOSITE_KEY_UNKNOWN_MODEL",
|
|
758
|
+
"source": "dbx_model_validate",
|
|
759
|
+
"severity": "error",
|
|
760
|
+
"title": "A `from=` entry on the `@dbxModelCompositeKey` tag does not resolve to any model in the merged manifest (`@dereekb/firebase` plus every discovered `*-firebase` component). Names are matched case-insensitively against interface name, identity const name (with `Identity` suffix dropped), and `modelType`",
|
|
761
|
+
"whatItFlags": "A `from=` entry on the `@dbxModelCompositeKey` tag does not resolve to any model in the merged manifest (`@dereekb/firebase` plus every discovered `*-firebase` component). Names are matched case-insensitively against interface name, identity const name (with `Identity` suffix dropped), and `modelType`.",
|
|
762
|
+
"whenItApplies": "Each concrete name in the `from=` list. Skipped entirely when the tag uses `from=*`.",
|
|
763
|
+
"whenItDoesNotApply": "Wildcard tags (`from=*`) since their source set is open by design.",
|
|
764
|
+
"canonicalFix": "Fix the typo, or add the missing model to a component the merged manifest scan picks up. The resolver matches interface name, identity const, and modelType.",
|
|
765
|
+
"seeAlso": [
|
|
766
|
+
{
|
|
767
|
+
"kind": "artifact",
|
|
768
|
+
"target": "firestore-model"
|
|
769
|
+
}
|
|
770
|
+
]
|
|
771
|
+
},
|
|
772
|
+
{
|
|
773
|
+
"code": "MODEL_COMPOSITE_KEY_WILDCARD_MIXED",
|
|
774
|
+
"source": "dbx_model_validate",
|
|
775
|
+
"severity": "error",
|
|
776
|
+
"title": "The `@dbxModelCompositeKey` tag mixes the `*` wildcard with concrete model names in its `from=` list (e.g. `from=*,Group`). The wildcard is exclusive — a tag is either fully open (`from=*`) or fully enumerated",
|
|
777
|
+
"whatItFlags": "The `@dbxModelCompositeKey` tag mixes the `*` wildcard with concrete model names in its `from=` list (e.g. `from=*,Group`). The wildcard is exclusive — a tag is either fully open (`from=*`) or fully enumerated.",
|
|
778
|
+
"whenItApplies": "Every `@dbxModelCompositeKey` tag whose `from=` list contains both `*` and at least one other entry.",
|
|
779
|
+
"whenItDoesNotApply": "Tags using only `from=*` or only concrete names.",
|
|
780
|
+
"canonicalFix": "Pick one: replace the list with `from=*` for framework-style models, or remove the `*` and enumerate every contributing model.",
|
|
781
|
+
"seeAlso": [
|
|
782
|
+
{
|
|
783
|
+
"kind": "artifact",
|
|
784
|
+
"target": "firestore-model"
|
|
785
|
+
}
|
|
786
|
+
]
|
|
787
|
+
},
|
|
788
|
+
{
|
|
789
|
+
"code": "MODEL_COMPOSITE_KEY_WITHOUT_ARCHETYPE",
|
|
790
|
+
"source": "dbx_model_validate",
|
|
791
|
+
"severity": "warning",
|
|
792
|
+
"title": "The model carries `@dbxModelCompositeKey` but no archetype tag that justifies the composite-flat-key shape — i.e. neither `@dbxModelArchetype composite-key-root` nor `@dbxModelArchetype denormalised-aggregate` (with `keying=composite-flat-key`) appears on the interface",
|
|
793
|
+
"whatItFlags": "The model carries `@dbxModelCompositeKey` but no archetype tag that justifies the composite-flat-key shape — i.e. neither `@dbxModelArchetype composite-key-root` nor `@dbxModelArchetype denormalised-aggregate` (with `keying=composite-flat-key`) appears on the interface.",
|
|
794
|
+
"whenItApplies": "Every `@dbxModelCompositeKey` tag on a model interface.",
|
|
795
|
+
"whenItDoesNotApply": "Interfaces tagged `composite-key-root` or `denormalised-aggregate keying=composite-flat-key`.",
|
|
796
|
+
"canonicalFix": "Either add the matching `@dbxModelArchetype` tag, or remove the composite-key tag if the model's doc id is not actually a composite-flat-key.",
|
|
797
|
+
"seeAlso": [
|
|
798
|
+
{
|
|
799
|
+
"kind": "artifact",
|
|
800
|
+
"target": "firestore-model"
|
|
801
|
+
}
|
|
802
|
+
]
|
|
803
|
+
},
|
|
462
804
|
{
|
|
463
805
|
"code": "MODEL_CONVERTER_NOT_EXPORTED",
|
|
464
806
|
"source": "dbx_model_validate",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/dbx-components-mcp",
|
|
3
|
-
"version": "13.11.
|
|
3
|
+
"version": "13.11.14",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"dbx-components-mcp": "dbx-components-mcp.js"
|
|
@@ -15,19 +15,19 @@
|
|
|
15
15
|
"@angular/core": "21.2.11",
|
|
16
16
|
"@angular/forms": "21.2.11",
|
|
17
17
|
"@angular/material": "^21.2.9",
|
|
18
|
-
"@dereekb/dbx-cli": "13.11.
|
|
19
|
-
"@dereekb/dbx-core": "13.11.
|
|
20
|
-
"@dereekb/dbx-firebase": "13.11.
|
|
21
|
-
"@dereekb/dbx-form": "13.11.
|
|
22
|
-
"@dereekb/dbx-web": "13.11.
|
|
23
|
-
"@dereekb/firebase": "13.11.
|
|
24
|
-
"@dereekb/firebase-server": "13.11.
|
|
25
|
-
"@dereekb/rxjs": "13.11.
|
|
26
|
-
"@dereekb/util": "13.11.
|
|
18
|
+
"@dereekb/dbx-cli": "13.11.14",
|
|
19
|
+
"@dereekb/dbx-core": "13.11.14",
|
|
20
|
+
"@dereekb/dbx-firebase": "13.11.14",
|
|
21
|
+
"@dereekb/dbx-form": "13.11.14",
|
|
22
|
+
"@dereekb/dbx-web": "13.11.14",
|
|
23
|
+
"@dereekb/firebase": "13.11.14",
|
|
24
|
+
"@dereekb/firebase-server": "13.11.14",
|
|
25
|
+
"@dereekb/rxjs": "13.11.14",
|
|
26
|
+
"@dereekb/util": "13.11.14",
|
|
27
27
|
"@uirouter/angular": "21.0.0",
|
|
28
28
|
"rxjs": "^7.8.2"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@dereekb/model": "13.11.
|
|
31
|
+
"@dereekb/model": "13.11.14"
|
|
32
32
|
}
|
|
33
33
|
}
|