@podge/sdk-node 0.2.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,31 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ This project follows [Semantic Versioning](https://semver.org/). During the `0.x` beta period, minor version bumps may contain breaking changes.
6
+
7
+ ## [0.2.0-beta.0] - 2026-03-19
8
+
9
+ ### Added
10
+ - Dual CJS/ESM package output with proper `exports` field
11
+ - GitHub Actions CI workflow (lint, build, test on Node 18/20/22)
12
+ - GitHub Actions release workflow (publish to npm on version tags)
13
+ - CHANGELOG.md
14
+
15
+ ### Changed
16
+ - Version bump from 0.1.0 to 0.2.0-beta.0 (semver beta)
17
+ - License changed from UNLICENSED to MIT
18
+ - `prepublishOnly` now runs clean + build + test
19
+ - Updated gap documentation with resolution status
20
+
21
+ ## [0.1.0] - 2025-01-15
22
+
23
+ ### Added
24
+ - Initial SDK with environment, collection, item, search, and import job methods
25
+ - Typed error handling (`PodgeError`, `PodgeValidationError`, `PodgeNotFoundError`)
26
+ - Document delete and update operations
27
+ - Search mode support (`keyword`, `semantic`, `hybrid`)
28
+ - Collection schema management (`getCollectionSchema`, `updateCollectionSchema`)
29
+ - Batch item creation
30
+ - Dry run support for item creation
31
+ - Overloaded method signatures (implicit or explicit workspace/environment)
package/README.md ADDED
@@ -0,0 +1,304 @@
1
+ # @podge/sdk-node
2
+
3
+ TypeScript SDK for the Podge API. Provides a typed client for managing workspaces, environments, collections, and full-text search.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @podge/sdk-node
9
+ ```
10
+
11
+ ## Getting Started
12
+
13
+ ```typescript
14
+ import { PodgeSDK } from "@podge/sdk-node";
15
+
16
+ interface Product {
17
+ title: string;
18
+ category: string;
19
+ price: number;
20
+ }
21
+
22
+ const podge = new PodgeSDK({
23
+ apiKey: "your-api-key",
24
+ workspace: "my-workspace",
25
+ environment: "production",
26
+ });
27
+
28
+ // Insert a typed item
29
+ await podge.createItem<Product>("products", {
30
+ title: "Ergonomic Keyboard",
31
+ category: "Electronics",
32
+ price: 149.99,
33
+ });
34
+
35
+ // Search — results are typed as Product
36
+ const { results } = await podge.search<Product>("products", {
37
+ search: "keyboard",
38
+ });
39
+ console.log(results[0].document.title);
40
+ ```
41
+
42
+ ## Usage
43
+
44
+ ### Inserting Items
45
+
46
+ ```typescript
47
+ // Insert a single item
48
+ await podge.createItem<Product>("products", {
49
+ title: "Ergonomic Keyboard",
50
+ category: "Electronics",
51
+ price: 149.99,
52
+ });
53
+
54
+ // Dry run — validate without persisting
55
+ await podge.createItem("products", { title: "Test" }, { dryRun: true });
56
+ ```
57
+
58
+ Items are ingested asynchronously — after insertion, the document is queued for tokenization and indexing. Use `getDocument()` to check ingestion status. Typical ingestion latency is a few seconds for single items.
59
+
60
+ ### Search
61
+
62
+ ```typescript
63
+ // Simple search
64
+ const { results } = await podge.search<Product>("products", {
65
+ search: "keyboard",
66
+ });
67
+
68
+ // With filters, facets, sorting, and highlighting
69
+ const { results, facets } = await podge.search<Product>("products", {
70
+ search: "ergonomic",
71
+ filters: {
72
+ category: "Electronics",
73
+ price: { gte: 50, lte: 500 },
74
+ },
75
+ options: {
76
+ requireAllWords: true,
77
+ limit: 20,
78
+ offset: 0,
79
+ rank: true,
80
+ highlight: {
81
+ fields: ["title", "description"],
82
+ pre_tag: "<b>",
83
+ post_tag: "</b>",
84
+ },
85
+ },
86
+ facets: ["category", "brand"],
87
+ sort: [{ field: "price", order: "asc" }],
88
+ });
89
+ ```
90
+
91
+ #### Search behavior
92
+
93
+ - **Default mode**: Token matching with term count scoring. Each word in the query is matched independently. Results are ranked by how many query terms appear in the document.
94
+ - **`rank: true`**: Enables BM25 relevance scoring (k1=2.5, b=0.75). Documents are ranked by statistical relevance rather than simple term counts.
95
+ - **`requireAllWords: true`**: All query terms must appear in the document (AND logic). Default is OR logic.
96
+ - **Quoted phrases**: Use `"exact phrase"` in the search string for contiguous word matching.
97
+ - **Exclusions**: Prefix a term with `-` to exclude documents containing that word (e.g., `keyboard -wireless`).
98
+ - **Field-scoped search**: Use `field` option to restrict which fields are searched instead of searching all indexed fields.
99
+
100
+ #### Pagination
101
+
102
+ - `limit`: 1–100 (default 25)
103
+ - `offset`: 0-based offset for pagination
104
+ - Response includes `total` (total matching documents) and `count` (results in this page)
105
+
106
+ #### Facets
107
+
108
+ - Request facets by passing field names in the `facets` array
109
+ - Returns up to 100 values per faceted field, sorted by count
110
+ - Facet counts reflect all matching documents, not just the current page
111
+
112
+ #### Sorting
113
+
114
+ - Sort by any indexed field with `sort: [{ field: "price", order: "asc" }]`
115
+ - Use `_score` as a special field name to sort by relevance score
116
+
117
+ ### Filters
118
+
119
+ Filters support direct values for exact match, or operator objects for advanced filtering:
120
+
121
+ ```typescript
122
+ // Exact match
123
+ filters: { category: "Electronics" }
124
+
125
+ // Comparison operators
126
+ filters: { price: { gte: 50, lte: 500 } }
127
+
128
+ // Not equal
129
+ filters: { status: { ne: "discontinued" } }
130
+
131
+ // Match any value in a list
132
+ filters: { category: { in: ["Electronics", "Accessories"] } }
133
+
134
+ // Exclude values
135
+ filters: { category: { nin: ["Furniture"] } }
136
+
137
+ // Field existence
138
+ filters: { description: { exists: true } }
139
+
140
+ // Nested fields use dot notation
141
+ filters: { "metadata.region": "us-east" }
142
+ ```
143
+
144
+ Available operators: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `nin`, `exists`.
145
+
146
+ **Operator–type compatibility:**
147
+
148
+ | Operator | string | number | date | boolean |
149
+ |----------|--------|--------|------|---------|
150
+ | `eq`, `ne` | yes | yes | yes | yes |
151
+ | `gt`, `gte`, `lt`, `lte` | no | yes | yes | no |
152
+ | `in`, `nin` | yes | yes | yes | yes |
153
+ | `exists` | yes | yes | yes | yes |
154
+
155
+ ### Field Types and Schema
156
+
157
+ Documents are schema-on-write — field types are automatically detected when documents are ingested:
158
+
159
+ | Detected type | Examples | Storage |
160
+ |---|---|---|
161
+ | `string` | Any text value | string map (searchable) |
162
+ | `number` | Integer values | number map (filterable/sortable) |
163
+ | `date` | ISO 8601, `MM/DD/YYYY`, `DD/MM/YYYY`, RFC 2822, Unix timestamps | datetime map (filterable/sortable) |
164
+ | `boolean` | `true`, `false` | string map |
165
+
166
+ Nested objects are flattened with dot notation (e.g., `address.city`).
167
+
168
+ All fields default to `search` status (indexed and searchable). Use `updateCollectionSchema` to set fields to `ignore` if they should be excluded from search results:
169
+
170
+ ```typescript
171
+ // View discovered fields and their types
172
+ const schema = await podge.getCollectionSchema("products");
173
+ // schema.fields → [{ field: "title", fieldType: "string", status: "search", ... }]
174
+
175
+ // Exclude a field from search indexing
176
+ await podge.updateCollectionSchema("products", {
177
+ fields: [{ field: "internal_id", status: "ignore" }],
178
+ });
179
+ ```
180
+
181
+ ### Collections
182
+
183
+ ```typescript
184
+ const collection = await podge.createCollection({ name: "Products" });
185
+
186
+ const collections = await podge.listCollections();
187
+
188
+ const schema = await podge.getCollectionSchema("products");
189
+ ```
190
+
191
+ ### Batch Insert
192
+
193
+ ```typescript
194
+ await podge.createItemsBatch<Product>("products", [
195
+ { title: "Standing Desk", category: "Furniture", price: 599.99 },
196
+ { title: "Monitor Arm", category: "Accessories", price: 89.99 },
197
+ ]);
198
+ ```
199
+
200
+ ### Bulk Import
201
+
202
+ For large datasets, use import jobs with presigned S3 upload URLs.
203
+
204
+ **Supported formats:** JSON arrays (`[{...}, {...}]`) or single JSON objects (`{...}`).
205
+
206
+ **Limits:** 200 MB max per file, 10 MB JSON buffer limit.
207
+
208
+ ```typescript
209
+ // Create an import job with presigned upload URLs
210
+ const job = await podge.createImportJob("products", {
211
+ fileCount: 2,
212
+ fileNames: ["batch-1.json", "batch-2.json"],
213
+ });
214
+
215
+ // Upload files to the presigned URLs (expire after 1 hour)
216
+ for (const { url } of job.uploadUrls) {
217
+ await fetch(url, {
218
+ method: "PUT",
219
+ headers: { "Content-Type": "application/json" },
220
+ body: JSON.stringify([{ title: "Product", price: 9.99 }]),
221
+ });
222
+ }
223
+
224
+ // Poll job status
225
+ const status = await podge.getImportJob(job.jobId);
226
+ console.log(status.status);
227
+ // Job progresses: "created" → "streaming" → "ingesting" → "completed" | "failed"
228
+ // Track progress: status.ingestedItems, status.failedItems, status.totalItems
229
+ ```
230
+
231
+ ### Environments
232
+
233
+ ```typescript
234
+ const environments = await podge.listEnvironments();
235
+
236
+ const env = await podge.createEnvironment({ name: "staging" });
237
+ ```
238
+
239
+ ### Document Retrieval
240
+
241
+ ```typescript
242
+ const doc = await podge.getDocument<Product>("products", "doc-abc123");
243
+ console.log(doc.status); // "INGESTED" | "PENDING"
244
+ console.log(doc.document?.title);
245
+ ```
246
+
247
+ ### Error Handling
248
+
249
+ The SDK uses Axios under the hood. API errors are thrown as `AxiosError` instances:
250
+
251
+ ```typescript
252
+ import { AxiosError } from "axios";
253
+
254
+ try {
255
+ await podge.search("products", { search: "test" });
256
+ } catch (err) {
257
+ if (err instanceof AxiosError) {
258
+ console.error(err.response?.status); // 401, 400, 404, etc.
259
+ console.error(err.response?.data); // Error details from API
260
+ }
261
+ }
262
+ ```
263
+
264
+ Common error status codes:
265
+
266
+ | Status | Meaning |
267
+ |--------|---------|
268
+ | 400 | Validation error — check request body/parameters |
269
+ | 401 | Invalid or missing API key |
270
+ | 403 | API key does not have access to this workspace/environment |
271
+ | 404 | Workspace, environment, or collection not found |
272
+
273
+ ## Development
274
+
275
+ ```bash
276
+ # Install dependencies
277
+ pnpm install
278
+
279
+ # Build
280
+ pnpm run build
281
+
282
+ # Run tests
283
+ pnpm test
284
+
285
+ # Watch mode
286
+ pnpm run dev
287
+
288
+ # Lint
289
+ pnpm run lint
290
+ ```
291
+
292
+ ## Examples
293
+
294
+ See the [`examples/`](./examples) directory for runnable scripts:
295
+
296
+ - **`basic-usage.ts`** — End-to-end walkthrough: create environments, collections, insert items, and search
297
+ - **`bulk-import.ts`** — Import workflow with presigned uploads and job polling
298
+ - **`search-with-facets.ts`** — Advanced search with filters, facets, sorting, and highlighting
299
+
300
+ Run any example with:
301
+
302
+ ```bash
303
+ PODGE_API_KEY=your-key npx tsx examples/basic-usage.ts
304
+ ```
@@ -0,0 +1,216 @@
1
+ export interface PodgeSDKConfig {
2
+ apiKey: string;
3
+ workspace?: string;
4
+ environment?: string;
5
+ useDevService?: boolean;
6
+ /** @internal Override base URL for local development/testing. */
7
+ _debugBaseURL?: string;
8
+ }
9
+ export interface Environment {
10
+ id: string;
11
+ name: string;
12
+ key: string;
13
+ workspaceId?: string;
14
+ }
15
+ export interface Collection {
16
+ id: string;
17
+ name: string;
18
+ key: string;
19
+ description?: string;
20
+ workspaceId?: string;
21
+ environmentId?: string;
22
+ }
23
+ export type FieldStatus = "search" | "ignore";
24
+ export interface CollectionSchemaField {
25
+ field: string;
26
+ fieldType: string;
27
+ status: FieldStatus;
28
+ documentCount: number;
29
+ percentage: number;
30
+ lastIngested: string;
31
+ }
32
+ export interface CollectionSchema {
33
+ totalDocuments: number;
34
+ fields: CollectionSchemaField[];
35
+ }
36
+ export interface InsertItemResponse {
37
+ id: string;
38
+ documentId: string;
39
+ transactionId: string;
40
+ }
41
+ export interface DocumentStatus<T = Record<string, unknown>> {
42
+ documentId: string;
43
+ status: "INGESTED" | "PENDING";
44
+ document: T | null;
45
+ }
46
+ export interface ImportJob {
47
+ jobId: string;
48
+ status: string;
49
+ totalItems?: number;
50
+ processedItems: number;
51
+ ingestedItems: number;
52
+ failedItems: number;
53
+ fileNames?: string[];
54
+ createdAt: string;
55
+ updatedAt: string;
56
+ }
57
+ export interface CreateEnvironmentRequest {
58
+ name: string;
59
+ }
60
+ export interface CreateCollectionRequest {
61
+ name: string;
62
+ description?: string;
63
+ }
64
+ type FilterValue = string | number | Date | boolean;
65
+ export interface FilterOperators {
66
+ eq?: FilterValue;
67
+ ne?: FilterValue;
68
+ lt?: number | Date;
69
+ lte?: number | Date;
70
+ gt?: number | Date;
71
+ gte?: number | Date;
72
+ in?: FilterValue[];
73
+ nin?: FilterValue[];
74
+ exists?: boolean;
75
+ }
76
+ export type SearchFilters = Record<string, FilterValue | FilterOperators>;
77
+ export interface SearchRequest {
78
+ search: string;
79
+ filters?: SearchFilters;
80
+ options?: {
81
+ requireAllWords?: boolean;
82
+ field?: string | string[];
83
+ rank?: boolean;
84
+ limit?: number;
85
+ offset?: number;
86
+ mode?: "keyword" | "semantic" | "hybrid";
87
+ highlight?: {
88
+ fields?: string[];
89
+ pre_tag?: string;
90
+ post_tag?: string;
91
+ };
92
+ };
93
+ facets?: string[];
94
+ sort?: Array<{
95
+ field: string;
96
+ order: "asc" | "desc";
97
+ }>;
98
+ }
99
+ export interface CreateImportJobRequest {
100
+ fileCount?: number;
101
+ fileNames?: string[];
102
+ }
103
+ export interface UpdateCollectionSchemaRequest {
104
+ fields: Array<{
105
+ field: string;
106
+ status: FieldStatus;
107
+ }>;
108
+ }
109
+ export interface SearchResult<T = Record<string, unknown>> {
110
+ document_id: string;
111
+ document: T;
112
+ _highlights?: Record<string, string>;
113
+ bm25_score?: number;
114
+ term_count?: number;
115
+ }
116
+ export interface SearchResponse<T = Record<string, unknown>> {
117
+ results: SearchResult<T>[];
118
+ count: number;
119
+ total?: number;
120
+ query_statistics: {
121
+ elapsed?: number;
122
+ rows_read?: number;
123
+ bytes_read?: number;
124
+ };
125
+ facets?: Record<string, Array<{
126
+ value: string;
127
+ count: number;
128
+ }>>;
129
+ }
130
+ export interface CreateImportJobResponse {
131
+ jobId: string;
132
+ uploadUrls: Array<{
133
+ url: string;
134
+ fileId: string;
135
+ }>;
136
+ }
137
+ export interface DeleteDocumentResponse {
138
+ documentId: string;
139
+ status: string;
140
+ }
141
+ export interface UpdateDocumentResponse {
142
+ documentId: string;
143
+ status: string;
144
+ }
145
+ export interface ItemOptions {
146
+ dryRun?: boolean;
147
+ }
148
+ export interface SearchOptions {
149
+ noQueryCache?: boolean;
150
+ }
151
+ export declare class PodgeError extends Error {
152
+ readonly code: string;
153
+ readonly status: number;
154
+ readonly details?: unknown;
155
+ constructor(code: string, message: string, status: number, details?: unknown);
156
+ }
157
+ export declare class PodgeValidationError extends PodgeError {
158
+ constructor(message: string, details?: unknown);
159
+ }
160
+ export declare class PodgeNotFoundError extends PodgeError {
161
+ constructor(message: string);
162
+ }
163
+ export declare class PodgeSDK {
164
+ private client;
165
+ private _workspace?;
166
+ private _environment?;
167
+ constructor(config: PodgeSDKConfig);
168
+ private resolveWs;
169
+ private resolveEnv;
170
+ private wsPath;
171
+ private envPath;
172
+ private colPath;
173
+ listEnvironments(): Promise<Environment[]>;
174
+ listEnvironments(ws: string): Promise<Environment[]>;
175
+ getEnvironment(): Promise<Environment>;
176
+ getEnvironment(ws: string, env: string): Promise<Environment>;
177
+ createEnvironment(body: CreateEnvironmentRequest): Promise<Environment>;
178
+ createEnvironment(ws: string, body: CreateEnvironmentRequest): Promise<Environment>;
179
+ listCollections(): Promise<Collection[]>;
180
+ listCollections(ws: string, env: string): Promise<Collection[]>;
181
+ getCollection(col: string): Promise<Collection>;
182
+ getCollection(ws: string, env: string, col: string): Promise<Collection>;
183
+ createCollection(body: CreateCollectionRequest): Promise<Collection>;
184
+ createCollection(ws: string, env: string, body: CreateCollectionRequest): Promise<Collection>;
185
+ getCollectionSchema(col: string): Promise<CollectionSchema>;
186
+ getCollectionSchema(ws: string, env: string, col: string): Promise<CollectionSchema>;
187
+ updateCollectionSchema(col: string, body: UpdateCollectionSchemaRequest): Promise<CollectionSchema>;
188
+ updateCollectionSchema(ws: string, env: string, col: string, body: UpdateCollectionSchemaRequest): Promise<CollectionSchema>;
189
+ createItem<T extends Record<string, unknown> = Record<string, unknown>>(col: string, document: T, opts?: ItemOptions): Promise<InsertItemResponse>;
190
+ createItem<T extends Record<string, unknown> = Record<string, unknown>>(ws: string, env: string, col: string, document: T, opts?: ItemOptions): Promise<InsertItemResponse>;
191
+ createItemsBatch<T extends Record<string, unknown> = Record<string, unknown>>(col: string, items: T[], opts?: ItemOptions): Promise<InsertItemResponse[]>;
192
+ createItemsBatch<T extends Record<string, unknown> = Record<string, unknown>>(ws: string, env: string, col: string, items: T[], opts?: ItemOptions): Promise<InsertItemResponse[]>;
193
+ getDocument<T = Record<string, unknown>>(col: string, docId: string): Promise<DocumentStatus<T>>;
194
+ getDocument<T = Record<string, unknown>>(ws: string, env: string, col: string, docId: string): Promise<DocumentStatus<T>>;
195
+ deleteDocument(col: string, docId: string): Promise<DeleteDocumentResponse>;
196
+ deleteDocument(ws: string, env: string, col: string, docId: string): Promise<DeleteDocumentResponse>;
197
+ updateDocument<T extends Record<string, unknown> = Record<string, unknown>>(col: string, docId: string, document: T): Promise<UpdateDocumentResponse>;
198
+ updateDocument<T extends Record<string, unknown> = Record<string, unknown>>(ws: string, env: string, col: string, docId: string, document: T): Promise<UpdateDocumentResponse>;
199
+ search<T = Record<string, unknown>>(col: string, request: SearchRequest, opts?: SearchOptions): Promise<SearchResponse<T>>;
200
+ search<T = Record<string, unknown>>(ws: string, env: string, col: string, request: SearchRequest, opts?: SearchOptions): Promise<SearchResponse<T>>;
201
+ generateUploadUrl(col: string): Promise<{
202
+ url: string;
203
+ fileId: string;
204
+ }>;
205
+ generateUploadUrl(ws: string, env: string, col: string): Promise<{
206
+ url: string;
207
+ fileId: string;
208
+ }>;
209
+ createImportJob(col: string, body?: CreateImportJobRequest): Promise<CreateImportJobResponse>;
210
+ createImportJob(ws: string, env: string, col: string, body?: CreateImportJobRequest): Promise<CreateImportJobResponse>;
211
+ listImportJobs(col: string): Promise<ImportJob[]>;
212
+ listImportJobs(ws: string, env: string, col: string): Promise<ImportJob[]>;
213
+ getImportJob(jobId: string): Promise<ImportJob>;
214
+ }
215
+ export default PodgeSDK;
216
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}