@dereekb/dbx-cli 13.40.0 → 13.42.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 (35) hide show
  1. package/eslint/package.json +3 -3
  2. package/firebase-api-manifest/main.js +156 -18
  3. package/firebase-api-manifest/package.json +3 -3
  4. package/firestore-indexes/src/generate-firestore-indexes-cli.d.ts +12 -4
  5. package/firestore-indexes/src/model-firebase-index-analyze.d.ts +12 -2
  6. package/firestore-query-manifest/main.js +306 -12
  7. package/firestore-query-manifest/package.json +3 -3
  8. package/generate-firestore-indexes/main.js +118 -20
  9. package/generate-firestore-indexes/package.json +2 -2
  10. package/generate-mcp-manifest/main.js +5 -2
  11. package/generate-mcp-manifest/package.json +3 -3
  12. package/generate-route-manifest/main.js +1 -1
  13. package/generate-route-manifest/package.json +2 -2
  14. package/index.esm.js +1389 -933
  15. package/lint-cache/package.json +2 -2
  16. package/manifest-extract/index.esm.js +148 -2
  17. package/manifest-extract/package.json +2 -2
  18. package/manifest-extract/src/lib/extract-models.d.ts +4 -2
  19. package/manifest-extract/src/lib/types.d.ts +65 -0
  20. package/model-test/index.esm.js +4 -54
  21. package/model-test/package.json +2 -2
  22. package/package.json +6 -6
  23. package/route/package.json +7 -7
  24. package/src/lib/doctor/firestore-session.check.d.ts +23 -2
  25. package/src/lib/firestore/firestore.collection.d.ts +29 -0
  26. package/src/lib/firestore/firestore.query.d.ts +1 -1
  27. package/src/lib/firestore/index.d.ts +1 -0
  28. package/src/lib/firestore/query-info-utils.d.ts +6 -1
  29. package/src/lib/firestore/query-mode.d.ts +120 -0
  30. package/src/lib/manifest/types.d.ts +161 -2
  31. package/src/lib/mcp-scan/manifest/css-utilities-schema.d.ts +2 -2
  32. package/src/lib/mcp-scan/manifest/tokens-schema.d.ts +2 -2
  33. package/test/package.json +9 -9
  34. package/validate/index.js +12 -7
  35. package/validate/package.json +3 -3
@@ -0,0 +1,120 @@
1
+ import { type Maybe } from '@dereekb/util';
2
+ import { type CliFirestoreQueryManifestEntry, type CliFirestoreQueryMode, type CliFirestoreQueryRules, type CliFirestoreQueryRulesAccess, type CliFirestoreQueryScope } from '../manifest/types';
3
+ /**
4
+ * Input for {@link cliFirestoreQueryModeForRules}.
5
+ *
6
+ * Takes the rules facts as PLAIN values rather than a `FirestoreRulesCollectionEntry`, so the rule
7
+ * lives in the shipped package while the scanner stays in the in-repo source-only
8
+ * `@dereekb/dbx-cli/firestore-rules`. The generator is the one place that owns both.
9
+ */
10
+ export interface CliFirestoreQueryModeForRulesInput {
11
+ readonly scope: CliFirestoreQueryScope;
12
+ readonly isNested: boolean;
13
+ /**
14
+ * `FirestoreRulesCollectionEntry.collectionGroup` — whether a `/{path=**}/<collection>/{id}` block exists.
15
+ */
16
+ readonly collectionGroup: boolean;
17
+ /**
18
+ * `FirestoreRulesCollectionEntry.list` — the merged `list` posture for the collection.
19
+ */
20
+ readonly list: CliFirestoreQueryRulesAccess;
21
+ /**
22
+ * Parent-document path templates read off the collection's non-recursive rules match paths.
23
+ */
24
+ readonly parentPaths?: readonly string[];
25
+ }
26
+ /**
27
+ * The mode an entry resolves to, paired with the rules evidence behind it.
28
+ */
29
+ export interface CliFirestoreQueryModeResult {
30
+ readonly mode: CliFirestoreQueryMode;
31
+ readonly rules: CliFirestoreQueryRules;
32
+ }
33
+ /**
34
+ * Resolves how a catalog entry must be invoked, from the rules facts about its collection.
35
+ *
36
+ * The rule, in the order it is applied:
37
+ *
38
+ * 1. `list` is not `allowed` — no block anywhere grants a list, so the entry is dead at EVERY
39
+ * scope. Checked first because no amount of `--parent` scoping rescues it.
40
+ * 2. `scope: 'COLLECTION_GROUP'` with no `/{path=**}/<collection>/{id}` block — the group shape is
41
+ * dead. A NESTED model degrades to `parent-child` (the path-scoped grant that satisfied step 1
42
+ * is what `--parent` runs against); a root collection has no parent to scope to, so
43
+ * `cliFirestoreCollectionForQuery` rejects `--parent` outright and the mode is `unavailable`.
44
+ * 3. `scope: 'COLLECTION'` over a subcollection — `--parent` is required by construction, whatever
45
+ * the rules say, so the mode is `parent-child` rather than `model`. This step is why the mode is
46
+ * NOT a pure permission verdict: the rules permit the read, and it still cannot be run
47
+ * unscoped.
48
+ * 4. Otherwise `model`.
49
+ *
50
+ * `unavailable` is a deliberate UNDER-approximation. `list` is merged across every match block that
51
+ * reaches the collection, so a recursive block that denies `list` while a nested block allows it
52
+ * reads as `allowed` and the entry is not marked dead. That direction is the safe one — the scanner
53
+ * can never make this CLI refuse a query that actually works, only miss one that does not.
54
+ *
55
+ * @param input - The entry's scope/nesting and the rules facts for its collection.
56
+ * @returns The mode plus the evidence, with a reason attached whenever the mode is not `model`.
57
+ *
58
+ * @__NO_SIDE_EFFECTS__
59
+ */
60
+ export declare function cliFirestoreQueryModeForRules(input: CliFirestoreQueryModeForRulesInput): CliFirestoreQueryModeResult;
61
+ /**
62
+ * The mode an entry carries, normalized so an absent field reads as `unknown` rather than
63
+ * `undefined` — a consumer switching over {@link CliFirestoreQueryMode} stays total.
64
+ *
65
+ * @param entry - The catalog entry.
66
+ * @returns The entry's mode, or `unknown` when the manifest was generated without `--rules`.
67
+ *
68
+ * @__NO_SIDE_EFFECTS__
69
+ */
70
+ export declare function cliFirestoreQueryMode(entry: CliFirestoreQueryManifestEntry): CliFirestoreQueryMode;
71
+ /**
72
+ * True when this CLI could actually run the entry — the factory bound AND the rules do not refuse
73
+ * it outright. Backs `firestore-queries --invocable-only`.
74
+ *
75
+ * A `parent-child` entry counts as invocable: `--parent` runs it. An `unknown` one counts too;
76
+ * nothing is known against it.
77
+ *
78
+ * @param entry - The catalog entry.
79
+ * @returns Whether the entry is worth offering.
80
+ *
81
+ * @__NO_SIDE_EFFECTS__
82
+ */
83
+ export declare function isCliFirestoreQueryInvocable(entry: CliFirestoreQueryManifestEntry): boolean;
84
+ /**
85
+ * Error code used when a query is refused because `firestore.rules` can never authorize it.
86
+ */
87
+ export declare const FIRESTORE_QUERY_UNAVAILABLE_CODE = "FIRESTORE_QUERY_UNAVAILABLE";
88
+ /**
89
+ * Error code used when a `parent-child` query was run without a `--parent`.
90
+ */
91
+ export declare const FIRESTORE_QUERY_PARENT_REQUIRED_CODE = "FIRESTORE_QUERY_PARENT_REQUIRED";
92
+ /**
93
+ * Refuses a catalog entry that cannot run as invoked, BEFORE a transport is chosen.
94
+ *
95
+ * Mirrors `assertCliModelIsNotServerOnly`, one level finer: that flag is per-MODEL and cannot say
96
+ * "readable under its parent, dead as a collection group", which is exactly the shape this catches.
97
+ * Answering locally makes the reason legible and free instead of surfacing as a bare
98
+ * `Missing or insufficient permissions.` from the rules engine.
99
+ *
100
+ * An `unknown` entry passes: the manifest was generated without a `--rules` file, so nothing is
101
+ * known and a guess would be worse than a round trip.
102
+ *
103
+ * @param input - The catalog entry and the `--parent` key, when one was supplied.
104
+ * @param input.entry - The catalog entry about to run.
105
+ * @param input.parent - The `--parent` key, when supplied.
106
+ * @throws {CliError} `FIRESTORE_QUERY_UNAVAILABLE` when no client can run it, or `FIRESTORE_QUERY_PARENT_REQUIRED` when it needs a `--parent` that was not given.
107
+ */
108
+ export declare function assertCliFirestoreQueryCanRun(input: {
109
+ readonly entry: CliFirestoreQueryManifestEntry;
110
+ readonly parent?: Maybe<string>;
111
+ }): void;
112
+ /**
113
+ * Renders the `Mode:` line of the `firestore-queries <query>` detail view.
114
+ *
115
+ * @param entry - The catalog entry.
116
+ * @returns The rendered line body, without a trailing newline.
117
+ *
118
+ * @__NO_SIDE_EFFECTS__
119
+ */
120
+ export declare function describeCliFirestoreQueryMode(entry: CliFirestoreQueryManifestEntry): string;
@@ -46,8 +46,9 @@ export interface CliModelField {
46
46
  readonly description?: string;
47
47
  /**
48
48
  * Enum name referenced by either the interface property's TS type or the
49
- * converter's `firestoreEnum<Enum>()` generic argument, when an enum is
50
- * present in the same source file.
49
+ * converter's `firestoreEnum<Enum>()` generic argument, resolved against
50
+ * every enum in the scan — the declaring file does not have to be the
51
+ * converter's own.
51
52
  */
52
53
  readonly enumRef?: string;
53
54
  /**
@@ -107,6 +108,38 @@ export interface CliModelManifestEntry {
107
108
  * Parent identity const name when the model is a subcollection.
108
109
  */
109
110
  readonly parentIdentityConst?: string;
111
+ /**
112
+ * `true` when the model's collection holds exactly one document — built by
113
+ * `singleItemFirestoreCollection` (one per parent) or
114
+ * `rootSingleItemFirestoreCollection` (one, full stop). Absent for ordinary
115
+ * multi-document collections.
116
+ */
117
+ readonly singleton?: boolean;
118
+ /**
119
+ * Fixed document id of a {@link singleton} model's one document: the value passed as
120
+ * `singleItemIdentifier`, or `'0'`
121
+ * (`DEFAULT_SINGLE_ITEM_FIRESTORE_COLLECTION_DOCUMENT_IDENTIFIER`) when the collection
122
+ * factory omits it.
123
+ *
124
+ * This cannot be inferred from the rest of the entry — plenty of single-item collections
125
+ * override the default (`bgbs`, `bgsu`, …) — so a caller building a document key must read
126
+ * it here rather than assume `/0`. Absent when {@link singleton} is `true` but the id was
127
+ * declared as an expression the generator could not resolve (a build-time warning is
128
+ * printed for that case).
129
+ */
130
+ readonly singleItemIdentifier?: string;
131
+ /**
132
+ * A ready-to-use example document key for this model, with the parent chain resolved from
133
+ * the identity graph and `<…Id>` placeholders standing in for the ids a caller supplies
134
+ * (e.g. `p/<profileId>`, `bg/<billingGroupId>/bgi/<billingGroupInvoiceId>`). A
135
+ * {@link singleton} model's own segment is its literal {@link singleItemIdentifier}, so the
136
+ * key is exact past the last placeholder (e.g. `bg/<billingGroupId>/bgis/bgbs`).
137
+ *
138
+ * Key *shape* — parent chain plus fixed document id — is what consumers of the manifest
139
+ * actually get wrong, so it is published pre-assembled. Absent only when some ancestor
140
+ * identity could not be resolved.
141
+ */
142
+ readonly exampleKey?: string;
110
143
  /**
111
144
  * First paragraph of the source interface's JSDoc, when present.
112
145
  */
@@ -327,6 +360,23 @@ export interface McpManifestModelEntry {
327
360
  readonly identityConst: string;
328
361
  readonly collectionPrefix: string;
329
362
  readonly parentIdentityConst?: string;
363
+ /**
364
+ * `true` when the model's collection holds exactly one document, at the fixed
365
+ * {@link singleItemIdentifier} (mirror of {@link CliModelManifestEntry.singleton}).
366
+ */
367
+ readonly singleton?: boolean;
368
+ /**
369
+ * Fixed document id of a {@link singleton} model's one document — `'0'` by default but
370
+ * frequently overridden, so it cannot be inferred (mirror of
371
+ * {@link CliModelManifestEntry.singleItemIdentifier}).
372
+ */
373
+ readonly singleItemIdentifier?: string;
374
+ /**
375
+ * Example document key with the parent chain resolved and `<…Id>` placeholders for the ids a
376
+ * caller supplies (mirror of {@link CliModelManifestEntry.exampleKey}). Surfaced by
377
+ * `model-info` so a `model-get` caller can build a valid key without reading source.
378
+ */
379
+ readonly exampleKey?: string;
330
380
  readonly description?: string;
331
381
  readonly sourcePackage: string;
332
382
  readonly sourceFile: string;
@@ -562,6 +612,100 @@ export interface CliFirestoreQueryParam {
562
612
  * single scalar, single params object, two positionals, ...).
563
613
  */
564
614
  export type CliFirestoreQueryFactory = (...args: readonly any[]) => readonly FirestoreQueryConstraint[];
615
+ /**
616
+ * How the rules resolve one read operation on a collection, mirroring
617
+ * `FirestoreRulesAccess` from `@dereekb/dbx-cli/firestore-rules`.
618
+ *
619
+ * Restated here rather than imported: `firestore-rules` is an in-repo
620
+ * source-only package that cannot resolve to a built `.d.ts` during this
621
+ * package's declaration build, and the manifest is a SERIALIZED artifact — its
622
+ * types have to stand alone.
623
+ *
624
+ * - `allowed` — some `allow` covering the op has a condition that is not constant-`false`.
625
+ * - `denied` — the op is covered only by `allow`s whose condition is literally `false`.
626
+ * - `unmatched` — no `allow` covers the op at all, so Firestore's default-deny applies.
627
+ */
628
+ export type CliFirestoreQueryRulesAccess = 'allowed' | 'denied' | 'unmatched';
629
+ /**
630
+ * How a catalog entry must be INVOKED, resolved from `firestore.rules` at generation time.
631
+ *
632
+ * This classifies on the axis a caller acts on — "how do I run this?" — rather than on the raw
633
+ * rules verdict. The two are not the same question: a `COLLECTION`-scope entry over a
634
+ * subcollection is fully permitted by the rules and still cannot be run without `--parent`, so a
635
+ * pure permission verdict would call it runnable-as-declared and be wrong about how to run it.
636
+ *
637
+ * - `model` — run it directly against the model's collection or collection group.
638
+ * - `parent-child` — it addresses ONE parent document's subcollection, so `--parent <parentKey>`
639
+ * is required. Either the entry is `COLLECTION`-scope over a subcollection, or its
640
+ * `COLLECTION_GROUP` shape has no `/{path=**}/<collection>/{id}` block behind it while the
641
+ * path-scoped read IS granted.
642
+ * - `unavailable` — no client can run it, on any transport or scoping.
643
+ * - `unknown` — the query manifest was generated without a `--rules` file, so nothing was
644
+ * resolved. Never stored; it is what {@link CliFirestoreQueryManifestEntry.queryMode} being
645
+ * absent means, so a consumer's switch over this union stays total.
646
+ */
647
+ export type CliFirestoreQueryMode = 'model' | 'parent-child' | 'unavailable' | 'unknown';
648
+ /**
649
+ * Why an entry resolved to the {@link CliFirestoreQueryMode} it did.
650
+ *
651
+ * `denied` and `unmatched` are kept apart the way the rules scanner keeps them apart: a
652
+ * written-down `if false` is a deliberate no, an absence is an oversight, and a reviewer needs to
653
+ * know which one they are looking at.
654
+ */
655
+ export type CliFirestoreQueryModeReason =
656
+ /**
657
+ * `scope: 'COLLECTION_GROUP'` with no `/{path=**}/<collection>/{id}` block in the rules. A
658
+ * collection-group query is evaluated against that block alone — a path-scoped block does not
659
+ * authorize it, no matter how permissive. `parent-child` when the model is nested (the
660
+ * path-scoped read is the way in), `unavailable` when it is a root collection with no parent to
661
+ * scope to.
662
+ */
663
+ 'no-collection-group-rule'
664
+ /**
665
+ * `scope: 'COLLECTION'` over a subcollection: the entry addresses one parent's subcollection by
666
+ * construction, independent of what the rules say.
667
+ */
668
+ | 'nested-collection-scope'
669
+ /**
670
+ * Every `list` grant on the collection is a constant-`false`.
671
+ */
672
+ | 'list-denied'
673
+ /**
674
+ * No `list` grant covers the collection at all.
675
+ */
676
+ | 'list-unmatched';
677
+ /**
678
+ * The `firestore.rules` evidence behind an entry's {@link CliFirestoreQueryMode} — the WHY, kept
679
+ * beside the answer rather than inside it.
680
+ *
681
+ * Split from the mode deliberately: a caller (or an agent) needs only the mode to decide what to
682
+ * do, while a reviewer auditing a surprising mode needs these facts to check the reasoning without
683
+ * re-reading the rules file.
684
+ *
685
+ * Absent, like the mode, when the generator was not given a `--rules` file.
686
+ */
687
+ export interface CliFirestoreQueryRules {
688
+ /**
689
+ * The rules' `list` posture for {@link CliFirestoreQueryManifestEntry.collection}, merged across
690
+ * every match block that reaches it.
691
+ */
692
+ readonly list: CliFirestoreQueryRulesAccess;
693
+ /**
694
+ * True when the rules declare a `/{path=**}/<collection>/{id}` block — the only shape a
695
+ * collection-group query is authorized by.
696
+ */
697
+ readonly collectionGroup: boolean;
698
+ /**
699
+ * Present whenever the mode is not `model`.
700
+ */
701
+ readonly reason?: CliFirestoreQueryModeReason;
702
+ /**
703
+ * The parent-document path templates a `--parent` key must match, read off the non-recursive
704
+ * rules match paths that reach this collection (e.g. `jl/{jobLocation}/jlj/{job}`). Lets the CLI
705
+ * name the required `--parent` shape instead of saying only "pass --parent".
706
+ */
707
+ readonly parentPaths?: readonly string[];
708
+ }
565
709
  /**
566
710
  * One entry in the generated per-model Firestore query catalog.
567
711
  *
@@ -619,6 +763,21 @@ export interface CliFirestoreQueryManifestEntry {
619
763
  * constraint sequence is empty by design. See {@link relatedSlugs}.
620
764
  */
621
765
  readonly dispatcher?: boolean;
766
+ /**
767
+ * How this entry must be invoked, per `firestore.rules` — unlike the flags
768
+ * above, this one DOES affect callability.
769
+ *
770
+ * Absent when the generator ran without a `--rules` file, which reads as
771
+ * `unknown` rather than `model`: a guess here would be worse than no field.
772
+ * Present, the CLI refuses an `unavailable` entry locally rather than paying
773
+ * a round trip for the `permission-denied` the rules guarantee, and requires
774
+ * `--parent` for a `parent-child` one.
775
+ */
776
+ readonly queryMode?: CliFirestoreQueryMode;
777
+ /**
778
+ * The rules evidence behind {@link queryMode}. Set and unset together with it.
779
+ */
780
+ readonly rules?: CliFirestoreQueryRules;
622
781
  /**
623
782
  * Absent when the identifier is not exported from {@link module}'s barrel
624
783
  * chain — the entry is listed but cannot be executed.
@@ -106,7 +106,7 @@ export declare const CssUtilityEntry: import("arktype/internal/variants/object.t
106
106
  property: string;
107
107
  value: string;
108
108
  }[];
109
- role?: "text" | "state" | "size" | "layout" | "misc" | "flex" | "spacing" | "interaction" | "color" | "text-color" | "surface" | "radius" | undefined;
109
+ role?: "color" | "text" | "state" | "size" | "layout" | "misc" | "flex" | "spacing" | "interaction" | "text-color" | "surface" | "radius" | undefined;
110
110
  intent?: string | undefined;
111
111
  seeAlso?: string[] | undefined;
112
112
  antiUse?: string | undefined;
@@ -149,7 +149,7 @@ export declare const CssUtilityManifest: import("arktype/internal/variants/objec
149
149
  property: string;
150
150
  value: string;
151
151
  }[];
152
- role?: "text" | "state" | "size" | "layout" | "misc" | "flex" | "spacing" | "interaction" | "color" | "text-color" | "surface" | "radius" | undefined;
152
+ role?: "color" | "text" | "state" | "size" | "layout" | "misc" | "flex" | "spacing" | "interaction" | "text-color" | "surface" | "radius" | undefined;
153
153
  intent?: string | undefined;
154
154
  seeAlso?: string[] | undefined;
155
155
  antiUse?: string | undefined;
@@ -58,7 +58,7 @@ export type TokenDefaults = typeof TokenDefaults.infer;
58
58
  export declare const TokenEntry: import("arktype/internal/variants/object.ts").ObjectType<{
59
59
  cssVariable: string;
60
60
  source: "app" | "dbx-web" | "dbx-form" | "mat-sys" | "mdc";
61
- role: "breakpoint" | "size" | "misc" | "spacing" | "color" | "text-color" | "surface" | "radius" | "elevation" | "shadow" | "typography" | "motion" | "state-layer";
61
+ role: "color" | "breakpoint" | "size" | "misc" | "spacing" | "text-color" | "surface" | "radius" | "elevation" | "shadow" | "typography" | "motion" | "state-layer";
62
62
  intents: string[];
63
63
  description: string;
64
64
  defaults: {
@@ -96,7 +96,7 @@ export declare const TokenManifest: import("arktype/internal/variants/object.ts"
96
96
  entries: {
97
97
  cssVariable: string;
98
98
  source: "app" | "dbx-web" | "dbx-form" | "mat-sys" | "mdc";
99
- role: "breakpoint" | "size" | "misc" | "spacing" | "color" | "text-color" | "surface" | "radius" | "elevation" | "shadow" | "typography" | "motion" | "state-layer";
99
+ role: "color" | "breakpoint" | "size" | "misc" | "spacing" | "text-color" | "surface" | "radius" | "elevation" | "shadow" | "typography" | "motion" | "state-layer";
100
100
  intents: string[];
101
101
  description: string;
102
102
  defaults: {
package/test/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
2
  "name": "@dereekb/dbx-cli/test",
3
- "version": "13.40.0",
3
+ "version": "13.42.0",
4
4
  "type": "module",
5
5
  "peerDependencies": {
6
- "@dereekb/date": "13.40.0",
7
- "@dereekb/dbx-cli": "13.40.0",
8
- "@dereekb/firebase": "13.40.0",
9
- "@dereekb/firebase-server/test": "13.40.0",
10
- "@dereekb/model": "13.40.0",
11
- "@dereekb/nestjs": "13.40.0",
12
- "@dereekb/rxjs": "13.40.0",
13
- "@dereekb/util": "13.40.0",
6
+ "@dereekb/date": "13.42.0",
7
+ "@dereekb/dbx-cli": "13.42.0",
8
+ "@dereekb/firebase": "13.42.0",
9
+ "@dereekb/firebase-server/test": "13.42.0",
10
+ "@dereekb/model": "13.42.0",
11
+ "@dereekb/nestjs": "13.42.0",
12
+ "@dereekb/rxjs": "13.42.0",
13
+ "@dereekb/util": "13.42.0",
14
14
  "@nestjs/common": "^11.1.19",
15
15
  "arktype": "^2.2.0",
16
16
  "vitest": "4.1.5",
package/validate/index.js CHANGED
@@ -6334,6 +6334,11 @@ var RESERVED_MODEL_FOLDERS = [
6334
6334
  name: "storagefile",
6335
6335
  reason: "StorageFile is a canonical group from `@dereekb/firebase` with a richer layout than the base 5 files (group, upload, file, etc.); downstream projects extend rather than redeclare it.",
6336
6336
  recommendedTool: "dbx_storagefile_m_validate_folder"
6337
+ },
6338
+ {
6339
+ name: "calendar",
6340
+ reason: "Calendar is a canonical group from `@dereekb/firebase` with a richer layout than the base 5 files (type, expand, ics, processing, etc.); downstream projects extend rather than redeclare it.",
6341
+ recommendedTool: "dbx_model_validate_folder"
6337
6342
  }
6338
6343
  ];
6339
6344
 
@@ -7254,7 +7259,7 @@ function extractGroupModelNames(text) {
7254
7259
  while ((match = MODEL_NAME_RE.exec(text)) !== null) {
7255
7260
  seen.add(match[1]);
7256
7261
  }
7257
- return [...seen].sort((a, b) => a.localeCompare(b));
7262
+ return Array.from(seen).sort((a, b) => a.localeCompare(b));
7258
7263
  }
7259
7264
 
7260
7265
  // packages/dbx-cli/src/lib/mcp-scan/scan/_jsdoc-tagged-export/extract-base.ts
@@ -8355,7 +8360,7 @@ function buildSummaries(entries, issues) {
8355
8360
  const summary = byModel.get(issue.model);
8356
8361
  if (summary) summary.errorCount += 1;
8357
8362
  }
8358
- return [...byModel.entries()].map(([model, s]) => ({ model, ...s })).sort((a, b) => a.model.localeCompare(b.model));
8363
+ return Array.from(byModel.entries()).map(([model, s]) => ({ model, ...s })).sort((a, b) => a.model.localeCompare(b.model));
8359
8364
  }
8360
8365
  function compareEntries(a, b) {
8361
8366
  return a.model.localeCompare(b.model) || a.verb.localeCompare(b.verb) || (a.specifier ?? "").localeCompare(b.specifier ?? "");
@@ -8431,7 +8436,7 @@ async function readComponentDereekbDeps(componentAbs) {
8431
8436
  addScopedDependencyNames(json[field], out);
8432
8437
  }
8433
8438
  }
8434
- return [...out];
8439
+ return Array.from(out);
8435
8440
  }
8436
8441
  function addScopedDependencyNames(field, out) {
8437
8442
  if (isRecord(field)) {
@@ -9864,7 +9869,7 @@ function tryReadTemplateInfoRecord(decl, rel, index) {
9864
9869
  symbolName: decl.getName(),
9865
9870
  directInfoIdentifiers: direct,
9866
9871
  spreadAggregateIdentifiers: spreads,
9867
- resolvedInfoIdentifiers: [...resolved],
9872
+ resolvedInfoIdentifiers: Array.from(resolved),
9868
9873
  unresolvedSpreadIdentifiers: unresolved,
9869
9874
  sourceFile: rel
9870
9875
  };
@@ -11644,7 +11649,7 @@ function flagUploadServiceWiring(extracted, violations) {
11644
11649
  if (!anyWired) {
11645
11650
  pushViolation9(violations, {
11646
11651
  code: "STORAGEFILE_UPLOAD_SERVICE_NOT_WIRED",
11647
- message: `No NestJS provider with \`provide: StorageFileInitializeFromUploadService, useFactory: ${factoryNames.size > 0 ? [...factoryNames].join(" | ") : "<storage-file-upload-factory>"}\` found. Bind the factory function in a NestJS module.`,
11652
+ message: `No NestJS provider with \`provide: StorageFileInitializeFromUploadService, useFactory: ${factoryNames.size > 0 ? Array.from(factoryNames).join(" | ") : "<storage-file-upload-factory>"}\` found. Bind the factory function in a NestJS module.`,
11648
11653
  side: "api",
11649
11654
  file: void 0
11650
11655
  });
@@ -13175,7 +13180,7 @@ function collectAllModels(fixtures, instances) {
13175
13180
  const all = /* @__PURE__ */ new Set();
13176
13181
  for (const k of fixtures.keys()) all.add(k);
13177
13182
  for (const k of instances.keys()) all.add(k);
13178
- const list = [...all];
13183
+ const list = Array.from(all);
13179
13184
  list.sort((a, b) => {
13180
13185
  const aLine = (fixtures.get(a) ?? instances.get(a))?.getStartLineNumber() ?? 0;
13181
13186
  const bLine = (fixtures.get(b) ?? instances.get(b))?.getStartLineNumber() ?? 0;
@@ -13229,7 +13234,7 @@ function collectIdentityImports(sourceFile) {
13229
13234
  }
13230
13235
  }
13231
13236
  }
13232
- const list = [...out];
13237
+ const list = Array.from(out);
13233
13238
  list.sort((a, b) => a.localeCompare(b));
13234
13239
  return list;
13235
13240
  }
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@dereekb/dbx-cli/validate",
3
- "version": "13.40.0",
3
+ "version": "13.42.0",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
7
- "@dereekb/dbx-cli": "13.40.0",
8
- "@dereekb/util": "13.40.0",
7
+ "@dereekb/dbx-cli": "13.42.0",
8
+ "@dereekb/util": "13.42.0",
9
9
  "ts-morph": "^21.0.0"
10
10
  }
11
11
  }