@semics-tech/mongolite 1.1.0 → 1.3.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 (54) hide show
  1. package/README.md +54 -3
  2. package/dist/adapters/node-sqlite.d.ts +4 -0
  3. package/dist/adapters/node-sqlite.js +80 -35
  4. package/dist/adapters/node-sqlite.js.map +1 -1
  5. package/dist/bin/mongolite-debug.d.ts +6 -1
  6. package/dist/bin/mongolite-debug.js +6 -113
  7. package/dist/bin/mongolite-debug.js.map +1 -1
  8. package/dist/bin/mongolite.d.ts +13 -0
  9. package/dist/bin/mongolite.js +172 -0
  10. package/dist/bin/mongolite.js.map +1 -0
  11. package/dist/cjs/adapters/node-sqlite.js +84 -35
  12. package/dist/cjs/bin/mongolite-debug.js +6 -149
  13. package/dist/cjs/bin/mongolite.js +207 -0
  14. package/dist/cjs/cli/discover.js +156 -0
  15. package/dist/cjs/cli/explorer.js +929 -0
  16. package/dist/cjs/cli/filter-builder.js +276 -0
  17. package/dist/cjs/cli/format.js +161 -0
  18. package/dist/cjs/cli/schema.js +211 -0
  19. package/dist/cjs/cli/ui.js +431 -0
  20. package/dist/cjs/collection.js +53 -14
  21. package/dist/cjs/cursors/findCursor.js +108 -19
  22. package/dist/cjs/db.js +87 -40
  23. package/dist/cjs/utils/connection-registry.js +122 -0
  24. package/dist/cli/discover.d.ts +40 -0
  25. package/dist/cli/discover.js +146 -0
  26. package/dist/cli/discover.js.map +1 -0
  27. package/dist/cli/explorer.d.ts +59 -0
  28. package/dist/cli/explorer.js +923 -0
  29. package/dist/cli/explorer.js.map +1 -0
  30. package/dist/cli/filter-builder.d.ts +52 -0
  31. package/dist/cli/filter-builder.js +268 -0
  32. package/dist/cli/filter-builder.js.map +1 -0
  33. package/dist/cli/format.d.ts +29 -0
  34. package/dist/cli/format.js +153 -0
  35. package/dist/cli/format.js.map +1 -0
  36. package/dist/cli/schema.d.ts +58 -0
  37. package/dist/cli/schema.js +205 -0
  38. package/dist/cli/schema.js.map +1 -0
  39. package/dist/cli/ui.d.ts +71 -0
  40. package/dist/cli/ui.js +379 -0
  41. package/dist/cli/ui.js.map +1 -0
  42. package/dist/collection.d.ts +25 -0
  43. package/dist/collection.js +53 -14
  44. package/dist/collection.js.map +1 -1
  45. package/dist/cursors/findCursor.d.ts +70 -0
  46. package/dist/cursors/findCursor.js +108 -19
  47. package/dist/cursors/findCursor.js.map +1 -1
  48. package/dist/db.d.ts +23 -0
  49. package/dist/db.js +85 -39
  50. package/dist/db.js.map +1 -1
  51. package/dist/utils/connection-registry.d.ts +74 -0
  52. package/dist/utils/connection-registry.js +117 -0
  53. package/dist/utils/connection-registry.js.map +1 -0
  54. package/package.json +2 -1
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Schema inference for the guided CLI.
3
+ *
4
+ * MongoLite stores documents as JSON, so there is no declared schema to read.
5
+ * We sample documents and derive the field paths, their types, how often they
6
+ * appear and a handful of example values. That is enough to offer the user a
7
+ * list of "columns" to filter and sort on without them knowing anything about
8
+ * the shape of the data up front.
9
+ */
10
+ export type FieldType = 'string' | 'number' | 'boolean' | 'date' | 'array' | 'object' | 'null';
11
+ export interface InferredField {
12
+ /** Dotted path, e.g. `address.city`. */
13
+ path: string;
14
+ /** Every type observed at this path, most frequent first. */
15
+ types: FieldType[];
16
+ /** The most frequently observed type - what the UI builds prompts around. */
17
+ primaryType: FieldType;
18
+ /** Number of sampled documents that contain this path. */
19
+ count: number;
20
+ /** Fraction of sampled documents containing this path (0-1). */
21
+ presence: number;
22
+ /** Up to `MAX_SAMPLES` distinct example values, in first-seen order. */
23
+ examples: unknown[];
24
+ /** For arrays: the types seen inside the array. */
25
+ elementTypes?: FieldType[];
26
+ /** For arrays of objects: the field paths found on the elements. */
27
+ elementFields?: string[];
28
+ /** True when every observed value at this path was one of a small set. */
29
+ lowCardinality: boolean;
30
+ /** Distinct values seen, when there were few enough to be worth offering. */
31
+ distinctValues?: unknown[];
32
+ }
33
+ export interface InferredSchema {
34
+ /** Number of documents inspected. */
35
+ sampled: number;
36
+ fields: InferredField[];
37
+ }
38
+ /** Classify a single JSON value into one of our display types. */
39
+ export declare function valueType(value: unknown): FieldType;
40
+ export interface InferOptions {
41
+ /** How deep to descend into nested objects. Default 3. */
42
+ maxDepth?: number;
43
+ }
44
+ /**
45
+ * Infer a schema from a sample of documents.
46
+ * Fields are ordered by how commonly they appear, then alphabetically, with
47
+ * `_id` pinned first so result tables always lead with the identifier.
48
+ */
49
+ export declare function inferSchema(docs: Record<string, unknown>[], options?: InferOptions): InferredSchema;
50
+ /**
51
+ * Pick a sensible default set of columns for a results table: shallow, common,
52
+ * scalar-ish fields, leading with `_id`.
53
+ */
54
+ export declare function defaultColumns(schema: InferredSchema, max?: number): string[];
55
+ /** Read a dotted path out of a document, descending through objects. */
56
+ export declare function getPath(doc: unknown, path: string): unknown;
57
+ /** Human-readable one-line summary of a field, used as a menu hint. */
58
+ export declare function describeField(field: InferredField): string;
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Schema inference for the guided CLI.
3
+ *
4
+ * MongoLite stores documents as JSON, so there is no declared schema to read.
5
+ * We sample documents and derive the field paths, their types, how often they
6
+ * appear and a handful of example values. That is enough to offer the user a
7
+ * list of "columns" to filter and sort on without them knowing anything about
8
+ * the shape of the data up front.
9
+ */
10
+ const MAX_SAMPLES = 5;
11
+ const MAX_DISTINCT = 25;
12
+ const ISO_DATE = /^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-]\d{2}:\d{2})?)?$/;
13
+ /** Classify a single JSON value into one of our display types. */
14
+ export function valueType(value) {
15
+ if (value === null || value === undefined)
16
+ return 'null';
17
+ if (value instanceof Date)
18
+ return 'date';
19
+ if (Array.isArray(value))
20
+ return 'array';
21
+ if (typeof value === 'string')
22
+ return ISO_DATE.test(value) ? 'date' : 'string';
23
+ if (typeof value === 'number')
24
+ return 'number';
25
+ if (typeof value === 'boolean')
26
+ return 'boolean';
27
+ if (typeof value === 'object')
28
+ return 'object';
29
+ return 'string';
30
+ }
31
+ function accumulator(path) {
32
+ return {
33
+ path,
34
+ typeCounts: new Map(),
35
+ count: 0,
36
+ examples: [],
37
+ distinct: new Map(),
38
+ distinctOverflow: false,
39
+ elementTypes: new Set(),
40
+ elementFields: new Set(),
41
+ };
42
+ }
43
+ function isPlainObject(value) {
44
+ return (typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date));
45
+ }
46
+ function recordValue(acc, value) {
47
+ const type = valueType(value);
48
+ acc.count += 1;
49
+ acc.typeCounts.set(type, (acc.typeCounts.get(type) ?? 0) + 1);
50
+ if (acc.examples.length < MAX_SAMPLES && value !== null && value !== undefined) {
51
+ const alreadySeen = acc.examples.some((existing) => stableKey(existing) === stableKey(value));
52
+ if (!alreadySeen)
53
+ acc.examples.push(value);
54
+ }
55
+ // Track distinct values for scalars only - object/array equality is not worth
56
+ // the noise, and a "pick a value" prompt only makes sense for scalars.
57
+ if (type === 'string' || type === 'number' || type === 'boolean' || type === 'date') {
58
+ if (!acc.distinctOverflow) {
59
+ const key = stableKey(value);
60
+ if (!acc.distinct.has(key)) {
61
+ if (acc.distinct.size >= MAX_DISTINCT) {
62
+ acc.distinctOverflow = true;
63
+ acc.distinct.clear();
64
+ }
65
+ else {
66
+ acc.distinct.set(key, value);
67
+ }
68
+ }
69
+ }
70
+ }
71
+ if (Array.isArray(value)) {
72
+ for (const element of value) {
73
+ acc.elementTypes.add(valueType(element));
74
+ if (isPlainObject(element)) {
75
+ for (const key of Object.keys(element))
76
+ acc.elementFields.add(key);
77
+ }
78
+ }
79
+ }
80
+ }
81
+ function stableKey(value) {
82
+ if (value instanceof Date)
83
+ return `date:${value.toISOString()}`;
84
+ if (typeof value === 'object' && value !== null)
85
+ return `json:${JSON.stringify(value)}`;
86
+ return `${typeof value}:${String(value)}`;
87
+ }
88
+ function walk(doc, prefix, depth, maxDepth, fields) {
89
+ for (const [key, value] of Object.entries(doc)) {
90
+ const path = prefix ? `${prefix}.${key}` : key;
91
+ let acc = fields.get(path);
92
+ if (!acc) {
93
+ acc = accumulator(path);
94
+ fields.set(path, acc);
95
+ }
96
+ recordValue(acc, value);
97
+ if (isPlainObject(value) && depth < maxDepth) {
98
+ walk(value, path, depth + 1, maxDepth, fields);
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * Infer a schema from a sample of documents.
104
+ * Fields are ordered by how commonly they appear, then alphabetically, with
105
+ * `_id` pinned first so result tables always lead with the identifier.
106
+ */
107
+ export function inferSchema(docs, options = {}) {
108
+ const maxDepth = options.maxDepth ?? 3;
109
+ const fields = new Map();
110
+ for (const doc of docs) {
111
+ if (!isPlainObject(doc))
112
+ continue;
113
+ walk(doc, '', 1, maxDepth, fields);
114
+ }
115
+ const total = docs.length || 1;
116
+ const inferred = [...fields.values()].map((acc) => {
117
+ const types = [...acc.typeCounts.entries()].sort((a, b) => b[1] - a[1]).map(([type]) => type);
118
+ // Prefer a concrete type over `null` when a field is sometimes empty.
119
+ const primaryType = types.find((t) => t !== 'null') ?? types[0] ?? 'null';
120
+ const distinctValues = acc.distinctOverflow ? undefined : [...acc.distinct.values()];
121
+ return {
122
+ path: acc.path,
123
+ types,
124
+ primaryType,
125
+ count: acc.count,
126
+ presence: acc.count / total,
127
+ examples: acc.examples,
128
+ elementTypes: acc.elementTypes.size ? [...acc.elementTypes] : undefined,
129
+ elementFields: acc.elementFields.size ? [...acc.elementFields].sort() : undefined,
130
+ lowCardinality: Boolean(distinctValues && distinctValues.length > 0 && distinctValues.length <= 12),
131
+ distinctValues,
132
+ };
133
+ });
134
+ inferred.sort((a, b) => {
135
+ if (a.path === '_id')
136
+ return -1;
137
+ if (b.path === '_id')
138
+ return 1;
139
+ const depthDiff = a.path.split('.').length - b.path.split('.').length;
140
+ if (depthDiff !== 0)
141
+ return depthDiff;
142
+ if (b.count !== a.count)
143
+ return b.count - a.count;
144
+ return a.path.localeCompare(b.path);
145
+ });
146
+ return { sampled: docs.length, fields: inferred };
147
+ }
148
+ /**
149
+ * Pick a sensible default set of columns for a results table: shallow, common,
150
+ * scalar-ish fields, leading with `_id`.
151
+ */
152
+ export function defaultColumns(schema, max = 6) {
153
+ const scalarish = ['string', 'number', 'boolean', 'date'];
154
+ const candidates = schema.fields.filter((field) => field.path !== '_id' &&
155
+ !field.path.includes('.') &&
156
+ field.presence >= 0.5 &&
157
+ scalarish.includes(field.primaryType));
158
+ const columns = candidates.slice(0, max - 1).map((field) => field.path);
159
+ const hasId = schema.fields.some((field) => field.path === '_id');
160
+ if (columns.length === 0) {
161
+ // Nothing scalar and shallow - fall back to whatever we do have.
162
+ const fallback = schema.fields
163
+ .filter((field) => field.path !== '_id' && !field.path.includes('.'))
164
+ .slice(0, max - 1)
165
+ .map((field) => field.path);
166
+ return hasId ? ['_id', ...fallback] : fallback;
167
+ }
168
+ return hasId ? ['_id', ...columns] : columns;
169
+ }
170
+ /** Read a dotted path out of a document, descending through objects. */
171
+ export function getPath(doc, path) {
172
+ return path.split('.').reduce((current, segment) => {
173
+ if (current === null || current === undefined)
174
+ return undefined;
175
+ if (Array.isArray(current)) {
176
+ const index = Number.parseInt(segment, 10);
177
+ return Number.isInteger(index) ? current[index] : undefined;
178
+ }
179
+ if (typeof current === 'object')
180
+ return current[segment];
181
+ return undefined;
182
+ }, doc);
183
+ }
184
+ /** Human-readable one-line summary of a field, used as a menu hint. */
185
+ export function describeField(field) {
186
+ const parts = [];
187
+ const type = field.primaryType === 'array' && field.elementTypes?.length
188
+ ? `array of ${field.elementTypes.filter((t) => t !== 'null').join('/') || 'values'}`
189
+ : field.primaryType;
190
+ parts.push(type);
191
+ if (field.presence < 0.999) {
192
+ parts.push(`in ${Math.round(field.presence * 100)}% of docs`);
193
+ }
194
+ if (field.examples.length > 0) {
195
+ const example = field.examples[0];
196
+ const rendered = example instanceof Date
197
+ ? example.toISOString()
198
+ : typeof example === 'object'
199
+ ? JSON.stringify(example)
200
+ : String(example);
201
+ parts.push(`e.g. ${rendered.length > 30 ? `${rendered.slice(0, 29)}…` : rendered}`);
202
+ }
203
+ return `— ${parts.join(', ')}`;
204
+ }
205
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/cli/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export declare const isInteractive: () => boolean;
2
+ export declare const style: {
3
+ bold: (text: string) => string;
4
+ dim: (text: string) => string;
5
+ italic: (text: string) => string;
6
+ underline: (text: string) => string;
7
+ red: (text: string) => string;
8
+ green: (text: string) => string;
9
+ yellow: (text: string) => string;
10
+ blue: (text: string) => string;
11
+ magenta: (text: string) => string;
12
+ cyan: (text: string) => string;
13
+ grey: (text: string) => string;
14
+ };
15
+ /** Visible width of a string, ignoring ANSI escape sequences. */
16
+ export declare function displayWidth(text: string): number;
17
+ /** Truncate to `max` visible characters, appending an ellipsis when cut. */
18
+ export declare function truncate(text: string, max: number): string;
19
+ export declare function terminalWidth(): number;
20
+ export interface Choice<T> {
21
+ /** Text shown in the list. */
22
+ label: string;
23
+ /** Value returned when the choice is picked. */
24
+ value: T;
25
+ /** Dimmed text shown to the right of the label. */
26
+ hint?: string;
27
+ /** Renders as a non-selectable heading. */
28
+ separator?: boolean;
29
+ }
30
+ export interface SelectOptions<T> {
31
+ message: string;
32
+ choices: Choice<T>[];
33
+ pageSize?: number;
34
+ initialIndex?: number;
35
+ /** Extra guidance rendered under the question. */
36
+ hint?: string;
37
+ }
38
+ /** Thrown when the user aborts a prompt with Esc or Ctrl+C. */
39
+ export declare class PromptCancelledError extends Error {
40
+ constructor();
41
+ }
42
+ /**
43
+ * Ask the user to pick one of `choices`.
44
+ * Interactive terminals get an arrow-key menu with type-to-filter; everything
45
+ * else gets a numbered list.
46
+ */
47
+ export declare function select<T>(options: SelectOptions<T>): Promise<T>;
48
+ /** Release the shared interface so the process can exit. */
49
+ export declare function closePrompts(): void;
50
+ /** Read a single line from stdin. */
51
+ export declare function question(prompt: string): Promise<string>;
52
+ export interface TextOptions {
53
+ message: string;
54
+ defaultValue?: string;
55
+ /** Return an error string to re-prompt, or undefined when the value is fine. */
56
+ validate?: (value: string) => string | undefined;
57
+ allowEmpty?: boolean;
58
+ hint?: string;
59
+ }
60
+ /** Ask for free-text input, re-prompting until `validate` is happy. */
61
+ export declare function text(options: TextOptions): Promise<string>;
62
+ /** Ask for multi-line input; a blank line ends the entry. */
63
+ export declare function multilineText(message: string): Promise<string>;
64
+ export declare function confirm(message: string, defaultValue?: boolean): Promise<boolean>;
65
+ /** Wait for the user before scrolling more output past them. */
66
+ export declare function pause(message?: string): Promise<void>;
67
+ export declare function heading(text: string): void;
68
+ export declare function info(text: string): void;
69
+ export declare function warn(text: string): void;
70
+ export declare function error(text: string): void;
71
+ export declare function success(text: string): void;