@dava96/osrs-wiki-bucket-builder 1.0.5 → 1.0.6

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/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './query-builder.js';
2
2
  export * from './types.js';
3
+ export * from './response-types.js';
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './query-builder.js';
2
2
  export * from './types.js';
3
+ export * from './response-types.js';
3
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC;AAC3B,cAAc,qBAAqB,CAAC"}
@@ -1,15 +1,37 @@
1
- import type { BucketName } from './generated/definitions.js';
1
+ import type { BucketName, BucketRegistry } from './generated/definitions.js';
2
+ import type { BucketMetaFields, SelectResult, ValidField } from './response-types.js';
2
3
  import { type BucketCondition, type BucketHelperCondition, type Operator, type OrderByDirection, type ScalarValue } from './types.js';
3
4
  /**
4
5
  * A type-safe query builder for OSRS Wiki Buckets.
5
6
  *
6
- * Uses recursive generics to track joined buckets and available fields.
7
+ * Uses recursive generics to track joined buckets, available fields, and the
8
+ * inferred result shape. As you chain `.select()`, `.join()`, and `.where()`,
9
+ * the builder accumulates type information so you get full autocomplete on
10
+ * field names and automatically inferred response types.
7
11
  *
8
12
  * @template TMain The name of the primary bucket.
9
- * @template TJoined A union of alias names or bucket names that have been joined.
10
- * @template TSelected The shape of the selected data so far.
13
+ * @template TJoinMap A record mapping alias/bucket names to their target bucket names.
14
+ * @template TSelected The accumulated result shape (defaults to the full bucket type).
15
+ * @template THasSelected Whether `.select()` has been called (used to switch from
16
+ * full-type default to narrowed selection).
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * import { bucket, InferBucketResult } from '@dava96/osrs-wiki-bucket-builder';
21
+ *
22
+ * const query = bucket('exchange').select('id', 'name', 'value');
23
+ * type Row = InferBucketResult<typeof query>;
24
+ * // Row = { id: number; name: string; value: number; page_name: string; page_name_sub: string }
25
+ * ```
11
26
  */
12
- export declare class BucketQueryBuilder<TMain extends BucketName, TJoined extends string = never, TSelected = object> {
27
+ export declare class BucketQueryBuilder<TMain extends BucketName, TJoinMap extends Record<string, BucketName> = Record<string, never>, TSelected = BucketRegistry[TMain] & BucketMetaFields, THasSelected extends boolean = false> {
28
+ /**
29
+ * Type-level accessor for the inferred result shape.
30
+ *
31
+ * This property does not exist at runtime — it is a compile-time brand
32
+ * used by {@link InferBucketResult} to extract the result type.
33
+ */
34
+ readonly __resultType: TSelected;
13
35
  private readonly mainBucket;
14
36
  private joins;
15
37
  private selections;
@@ -20,46 +42,84 @@ export declare class BucketQueryBuilder<TMain extends BucketName, TJoined extend
20
42
  private aliasMap;
21
43
  constructor(bucket: TMain);
22
44
  /**
23
- * Selects fields to retrieve.
24
- * Supports dot notation for joined buckets (e.g. `shop.price`) and wildcards (`*`, `shop.*`).
45
+ * Selects fields to retrieve from the query results.
46
+ *
47
+ * Supports plain field names, dot notation for joined buckets
48
+ * (e.g. `'exchange.value'`), and wildcards (`'*'`, `'exchange.*'`).
49
+ *
50
+ * Multiple `.select()` calls accumulate — they merge fields rather
51
+ * than replacing previous selections.
52
+ *
53
+ * @param fields - One or more field names to include in the result.
54
+ * Your IDE will autocomplete valid field names based on the bucket
55
+ * and any active joins.
25
56
  *
26
- * @param fields The fields to select.
57
+ * @example
58
+ * ```typescript
59
+ * bucket('exchange').select('id', 'name'); // plain fields
60
+ * bucket('exchange').select('*'); // all fields
61
+ * query.join('exchange', 'ex', 'item_name', 'name')
62
+ * .select('item_name', 'ex.value', 'ex.limit'); // joined fields
63
+ * ```
27
64
  */
28
- select<F extends string>(...fields: F[]): BucketQueryBuilder<TMain, TJoined, TSelected & {
29
- [K in F]: unknown;
30
- }>;
65
+ select<F extends ValidField<TMain, TJoinMap>>(...fields: F[]): BucketQueryBuilder<TMain, TJoinMap, THasSelected extends true ? TSelected & SelectResult<TMain, TJoinMap, F> : SelectResult<TMain, TJoinMap, F> & BucketMetaFields, true>;
31
66
  /**
32
67
  * Joins another bucket to the query.
33
68
  *
34
- * @param targetBucket The name of the bucket to join.
35
- * @param sourceField The field in the current result set to join ON.
36
- * @param targetField The field in the target bucket to join ON.
69
+ * The join is a LEFT JOIN — main bucket rows always appear, but joined
70
+ * fields may be absent when there is no matching row in the target bucket
71
+ * (e.g. untradeable items have no exchange entry).
72
+ *
73
+ * After joining, dot-notation fields like `'exchange.value'` become
74
+ * available in `.select()` and `.where()`.
75
+ *
76
+ * @param targetBucket - The name of the bucket to join.
77
+ * @param sourceField - The field in the current result set to join ON.
78
+ * @param targetField - The field in the target bucket to join ON.
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * bucket('infobox_item')
83
+ * .join('exchange', 'item_name', 'name')
84
+ * .select('item_name', 'exchange.value');
85
+ * ```
37
86
  */
38
- join<TTarget extends BucketName>(targetBucket: TTarget, sourceField: string, targetField: string): BucketQueryBuilder<TMain, TJoined | TTarget, TSelected>;
87
+ join<TTarget extends BucketName>(targetBucket: TTarget, sourceField: string, targetField: string): BucketQueryBuilder<TMain, TJoinMap & Record<TTarget, TTarget>, TSelected, THasSelected>;
39
88
  /**
40
89
  * Joins another bucket with an alias.
41
90
  *
42
- * @param targetBucket The name of the bucket to join.
43
- * @param alias An alias for this bucket to use in select/where.
44
- * @param sourceField The field in the current result set to join ON.
45
- * @param targetField The field in the target bucket to join ON.
91
+ * Aliases let you give joined buckets shorter names for use in
92
+ * `.select()` and `.where()`. The alias is resolved to the real
93
+ * bucket name in the generated Lua query.
94
+ *
95
+ * @param targetBucket - The name of the bucket to join.
96
+ * @param alias - An alias for this bucket to use in select/where.
97
+ * @param sourceField - The field in the current result set to join ON.
98
+ * @param targetField - The field in the target bucket to join ON.
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * bucket('infobox_item')
103
+ * .join('exchange', 'ex', 'item_name', 'name')
104
+ * .select('item_name', 'ex.value', 'ex.limit');
105
+ * ```
46
106
  */
47
- join<TTarget extends BucketName, TAlias extends string>(targetBucket: TTarget, alias: TAlias, sourceField: string, targetField: string): BucketQueryBuilder<TMain, TJoined | TAlias, TSelected>;
107
+ join<TTarget extends BucketName, TAlias extends string>(targetBucket: TTarget, alias: TAlias, sourceField: string, targetField: string): BucketQueryBuilder<TMain, TJoinMap & Record<TAlias, TTarget>, TSelected, THasSelected>;
48
108
  /**
49
109
  * Filters results by field equality.
50
110
  *
51
- * @param field The field to filter on.
52
- * @param value The value to match (implies `=` operator).
111
+ * @param field - The field to filter on. Supports autocomplete for valid field names.
112
+ * @param value - The value to match (implies `=` operator).
53
113
  */
54
- where(field: string, value: ScalarValue | BucketHelperCondition): this;
114
+ where(field: ValidField<TMain, TJoinMap>, value: ScalarValue | BucketHelperCondition): this;
55
115
  /**
56
116
  * Filters results with an explicit operator.
57
117
  *
58
- * @param field The field to filter on.
59
- * @param op The comparison operator.
60
- * @param value The value to compare against.
118
+ * @param field - The field to filter on. Supports autocomplete for valid field names.
119
+ * @param op - The comparison operator (`=`, `!=`, `>`, `<`, `>=`, `<=`).
120
+ * @param value - The value to compare against.
61
121
  */
62
- where(field: string, op: Operator, value: ScalarValue | BucketHelperCondition): this;
122
+ where(field: ValidField<TMain, TJoinMap>, op: Operator, value: ScalarValue | BucketHelperCondition): this;
63
123
  /**
64
124
  * Adds multiple conditions (implicitly AND).
65
125
  *
@@ -68,20 +128,30 @@ export declare class BucketQueryBuilder<TMain extends BucketName, TJoined extend
68
128
  where(...conditions: BucketCondition[]): this;
69
129
  /**
70
130
  * Shorthand for `where(field, '!=', value)`.
131
+ *
132
+ * @param field - The field to exclude matches on.
133
+ * @param value - The value to exclude.
71
134
  */
72
- whereNot(field: string, value: ScalarValue): this;
135
+ whereNot(field: ValidField<TMain, TJoinMap>, value: ScalarValue): this;
73
136
  /**
74
137
  * Filters for rows where field is NULL.
138
+ *
139
+ * @param field - The field to check for NULL.
75
140
  */
76
- whereNull(field: string): this;
141
+ whereNull(field: ValidField<TMain, TJoinMap>): this;
77
142
  /**
78
143
  * Filters for rows where field is NOT NULL.
144
+ *
145
+ * @param field - The field to check for NOT NULL.
79
146
  */
80
- whereNotNull(field: string): this;
147
+ whereNotNull(field: ValidField<TMain, TJoinMap>): this;
81
148
  /**
82
149
  * Filters for rows where field is between two values (inclusive).
150
+ *
151
+ * @param field - The field to filter on.
152
+ * @param range - A tuple of `[min, max]` values (inclusive on both ends).
83
153
  */
84
- whereBetween(field: string, range: [ScalarValue, ScalarValue]): this;
154
+ whereBetween(field: ValidField<TMain, TJoinMap>, range: [ScalarValue, ScalarValue]): this;
85
155
  /**
86
156
  * Conditionally applies a callback to the query.
87
157
  *
@@ -91,9 +161,17 @@ export declare class BucketQueryBuilder<TMain extends BucketName, TJoined extend
91
161
  when(condition: boolean, callback: (query: this) => void): this;
92
162
  /**
93
163
  * Filters for rows where field matches any of the given values.
94
- * Generates `Bucket.Or({field, v1}, {field, v2}, ...)`.
164
+ * Generates `Bucket.Or({field, v1}, {field, v2}, ...)` internally.
165
+ *
166
+ * @param field - The field to match against.
167
+ * @param values - An array of values; rows matching any value are included.
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * bucket('exchange').whereIn('name', ['Bronze axe', 'Iron axe', 'Steel axe']);
172
+ * ```
95
173
  */
96
- whereIn(field: string, values: ScalarValue[]): this;
174
+ whereIn(field: ValidField<TMain, TJoinMap>, values: ScalarValue[]): this;
97
175
  /**
98
176
  * Sets the maximum number of rows to return.
99
177
  * Accepted range is 1–5000. Defaults to 500.
@@ -113,9 +191,19 @@ export declare class BucketQueryBuilder<TMain extends BucketName, TJoined extend
113
191
  */
114
192
  paginate(page: number, perPage: number): this;
115
193
  /**
116
- * Creates an independent copy of this query builder's state.
194
+ * Creates an independent deep copy of this query builder's state.
195
+ *
196
+ * Useful for building query variants from a shared base without
197
+ * mutating the original.
198
+ *
199
+ * @example
200
+ * ```typescript
201
+ * const base = bucket('exchange').select('name', 'value').where('value', '>', 0);
202
+ * const expensive = base.clone().orderBy('value', 'desc').limit(5);
203
+ * const cheap = base.clone().orderBy('value', 'asc').limit(5);
204
+ * ```
117
205
  */
118
- clone(): BucketQueryBuilder<TMain, TJoined, TSelected>;
206
+ clone(): BucketQueryBuilder<TMain, TJoinMap, TSelected, THasSelected>;
119
207
  /**
120
208
  * Orders results by a selected field.
121
209
  *
@@ -148,18 +236,54 @@ export declare class BucketQueryBuilder<TMain extends BucketName, TJoined extend
148
236
  /**
149
237
  * Executes the query and returns the Lua query string.
150
238
  *
151
- * @param options Configuration options.
152
- * @param options.encodeURI Whether to URI encode the output (default: true).
153
- * Set to `false` if you need the raw Lua string for debugging.
239
+ * @param options - Configuration options.
240
+ * @param options.encodeURI - Whether to URI encode the output (default: true).
241
+ * Set to `false` if you need the raw Lua string for debugging.
242
+ *
243
+ * @example
244
+ * ```typescript
245
+ * const encoded = bucket('exchange').select('name').run(); // URL-encoded
246
+ * const raw = bucket('exchange').select('name').run({ encodeURI: false }); // raw Lua
247
+ * ```
154
248
  */
155
249
  run(options?: {
156
250
  encodeURI?: boolean;
157
251
  }): string;
252
+ /**
253
+ * Generates the full OSRS Wiki Bucket API URL, ready for `fetch()`.
254
+ *
255
+ * This is a convenience method that calls `.run()` internally and
256
+ * wraps the result in the standard API URL template. The query is
257
+ * always URI-encoded.
258
+ *
259
+ * @returns The complete API URL as a string.
260
+ *
261
+ * @example
262
+ * ```typescript
263
+ * const query = bucket('exchange').select('name', 'value').where('name', 'Abyssal whip');
264
+ * const data = await fetch(query.toUrl()).then(r => r.json());
265
+ * ```
266
+ */
267
+ toUrl(): string;
158
268
  }
159
269
  /**
160
270
  * Creates a new query builder for the given bucket.
161
271
  *
162
- * @param bucket The name of the bucket to query.
272
+ * This is the main entry point for building queries. The returned builder
273
+ * provides autocomplete for field names and tracks the result type as you
274
+ * chain methods.
275
+ *
276
+ * @param bucket - The name of the bucket to query.
277
+ *
278
+ * @example
279
+ * ```typescript
280
+ * import { bucket } from '@dava96/osrs-wiki-bucket-builder';
281
+ *
282
+ * const query = bucket('exchange')
283
+ * .select('id', 'name', 'value')
284
+ * .where('name', 'Abyssal whip')
285
+ * .run();
286
+ * ```
163
287
  */
164
288
  export declare function bucket<K extends BucketName>(bucket: K): BucketQueryBuilder<K>;
165
289
  //# sourceMappingURL=query-builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-builder.d.ts","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,29 @@
1
1
  import { BUCKET_FIELDS } from './generated/definitions.js';
2
2
  import { Bucket, QUERY_DEFAULTS, } from './types.js';
3
+ /** Base URL for the OSRS Wiki Bucket API. */
4
+ const BUCKET_API_BASE = 'https://oldschool.runescape.wiki/api.php';
3
5
  /**
4
6
  * A type-safe query builder for OSRS Wiki Buckets.
5
7
  *
6
- * Uses recursive generics to track joined buckets and available fields.
8
+ * Uses recursive generics to track joined buckets, available fields, and the
9
+ * inferred result shape. As you chain `.select()`, `.join()`, and `.where()`,
10
+ * the builder accumulates type information so you get full autocomplete on
11
+ * field names and automatically inferred response types.
7
12
  *
8
13
  * @template TMain The name of the primary bucket.
9
- * @template TJoined A union of alias names or bucket names that have been joined.
10
- * @template TSelected The shape of the selected data so far.
14
+ * @template TJoinMap A record mapping alias/bucket names to their target bucket names.
15
+ * @template TSelected The accumulated result shape (defaults to the full bucket type).
16
+ * @template THasSelected Whether `.select()` has been called (used to switch from
17
+ * full-type default to narrowed selection).
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { bucket, InferBucketResult } from '@dava96/osrs-wiki-bucket-builder';
22
+ *
23
+ * const query = bucket('exchange').select('id', 'name', 'value');
24
+ * type Row = InferBucketResult<typeof query>;
25
+ * // Row = { id: number; name: string; value: number; page_name: string; page_name_sub: string }
26
+ * ```
11
27
  */
12
28
  export class BucketQueryBuilder {
13
29
  mainBucket;
@@ -23,37 +39,52 @@ export class BucketQueryBuilder {
23
39
  this.aliasMap[bucket] = bucket;
24
40
  }
25
41
  /**
26
- * Selects fields to retrieve.
27
- * Supports dot notation for joined buckets (e.g. `shop.price`) and wildcards (`*`, `shop.*`).
42
+ * Selects fields to retrieve from the query results.
43
+ *
44
+ * Supports plain field names, dot notation for joined buckets
45
+ * (e.g. `'exchange.value'`), and wildcards (`'*'`, `'exchange.*'`).
28
46
  *
29
- * @param fields The fields to select.
47
+ * Multiple `.select()` calls accumulate — they merge fields rather
48
+ * than replacing previous selections.
49
+ *
50
+ * @param fields - One or more field names to include in the result.
51
+ * Your IDE will autocomplete valid field names based on the bucket
52
+ * and any active joins.
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * bucket('exchange').select('id', 'name'); // plain fields
57
+ * bucket('exchange').select('*'); // all fields
58
+ * query.join('exchange', 'ex', 'item_name', 'name')
59
+ * .select('item_name', 'ex.value', 'ex.limit'); // joined fields
60
+ * ```
30
61
  */
31
62
  select(...fields) {
32
63
  this.selections.push(...fields);
33
64
  return this;
34
65
  }
35
- join(targetBucket, arg2, arg3, arg4) {
66
+ join(targetBucket, aliasOrSourceField, sourceOrTargetField, maybeTargetField) {
36
67
  let alias;
37
68
  let sourceField;
38
69
  let targetField;
39
- if (arg4) {
40
- alias = arg2;
41
- sourceField = arg3;
42
- targetField = arg4;
70
+ if (maybeTargetField) {
71
+ alias = aliasOrSourceField;
72
+ sourceField = sourceOrTargetField;
73
+ targetField = maybeTargetField;
43
74
  }
44
75
  else {
45
- sourceField = arg2;
46
- targetField = arg3;
76
+ sourceField = aliasOrSourceField;
77
+ targetField = sourceOrTargetField;
47
78
  }
48
- const joinObj = {
79
+ const joinEntry = {
49
80
  target: targetBucket,
50
81
  onSource: sourceField,
51
82
  onTarget: targetField,
52
83
  };
53
84
  if (alias) {
54
- joinObj.alias = alias;
85
+ joinEntry.alias = alias;
55
86
  }
56
- this.joins.push(joinObj);
87
+ this.joins.push(joinEntry);
57
88
  if (alias) {
58
89
  this.aliasMap[alias] = targetBucket;
59
90
  }
@@ -94,24 +125,34 @@ export class BucketQueryBuilder {
94
125
  }
95
126
  /**
96
127
  * Shorthand for `where(field, '!=', value)`.
128
+ *
129
+ * @param field - The field to exclude matches on.
130
+ * @param value - The value to exclude.
97
131
  */
98
132
  whereNot(field, value) {
99
133
  return this.where(field, '!=', value);
100
134
  }
101
135
  /**
102
136
  * Filters for rows where field is NULL.
137
+ *
138
+ * @param field - The field to check for NULL.
103
139
  */
104
140
  whereNull(field) {
105
141
  return this.where(field, Bucket.Null());
106
142
  }
107
143
  /**
108
144
  * Filters for rows where field is NOT NULL.
145
+ *
146
+ * @param field - The field to check for NOT NULL.
109
147
  */
110
148
  whereNotNull(field) {
111
149
  return this.where(field, '!=', Bucket.Null());
112
150
  }
113
151
  /**
114
152
  * Filters for rows where field is between two values (inclusive).
153
+ *
154
+ * @param field - The field to filter on.
155
+ * @param range - A tuple of `[min, max]` values (inclusive on both ends).
115
156
  */
116
157
  whereBetween(field, range) {
117
158
  return this.where(field, '>=', range[0]).where(field, '<=', range[1]);
@@ -130,7 +171,15 @@ export class BucketQueryBuilder {
130
171
  }
131
172
  /**
132
173
  * Filters for rows where field matches any of the given values.
133
- * Generates `Bucket.Or({field, v1}, {field, v2}, ...)`.
174
+ * Generates `Bucket.Or({field, v1}, {field, v2}, ...)` internally.
175
+ *
176
+ * @param field - The field to match against.
177
+ * @param values - An array of values; rows matching any value are included.
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * bucket('exchange').whereIn('name', ['Bronze axe', 'Iron axe', 'Steel axe']);
182
+ * ```
134
183
  */
135
184
  whereIn(field, values) {
136
185
  const conditions = values.map((v) => [field, v]);
@@ -175,7 +224,17 @@ export class BucketQueryBuilder {
175
224
  return this;
176
225
  }
177
226
  /**
178
- * Creates an independent copy of this query builder's state.
227
+ * Creates an independent deep copy of this query builder's state.
228
+ *
229
+ * Useful for building query variants from a shared base without
230
+ * mutating the original.
231
+ *
232
+ * @example
233
+ * ```typescript
234
+ * const base = bucket('exchange').select('name', 'value').where('value', '>', 0);
235
+ * const expensive = base.clone().orderBy('value', 'desc').limit(5);
236
+ * const cheap = base.clone().orderBy('value', 'asc').limit(5);
237
+ * ```
179
238
  */
180
239
  clone() {
181
240
  const clone = new BucketQueryBuilder(this.mainBucket);
@@ -373,20 +432,59 @@ export class BucketQueryBuilder {
373
432
  /**
374
433
  * Executes the query and returns the Lua query string.
375
434
  *
376
- * @param options Configuration options.
377
- * @param options.encodeURI Whether to URI encode the output (default: true).
378
- * Set to `false` if you need the raw Lua string for debugging.
435
+ * @param options - Configuration options.
436
+ * @param options.encodeURI - Whether to URI encode the output (default: true).
437
+ * Set to `false` if you need the raw Lua string for debugging.
438
+ *
439
+ * @example
440
+ * ```typescript
441
+ * const encoded = bucket('exchange').select('name').run(); // URL-encoded
442
+ * const raw = bucket('exchange').select('name').run({ encodeURI: false }); // raw Lua
443
+ * ```
379
444
  */
380
445
  run(options = {}) {
381
446
  const sql = this.printSQL();
382
447
  const shouldEncode = options.encodeURI ?? true;
383
448
  return shouldEncode ? encodeURIComponent(sql) : sql;
384
449
  }
450
+ /**
451
+ * Generates the full OSRS Wiki Bucket API URL, ready for `fetch()`.
452
+ *
453
+ * This is a convenience method that calls `.run()` internally and
454
+ * wraps the result in the standard API URL template. The query is
455
+ * always URI-encoded.
456
+ *
457
+ * @returns The complete API URL as a string.
458
+ *
459
+ * @example
460
+ * ```typescript
461
+ * const query = bucket('exchange').select('name', 'value').where('name', 'Abyssal whip');
462
+ * const data = await fetch(query.toUrl()).then(r => r.json());
463
+ * ```
464
+ */
465
+ toUrl() {
466
+ const encodedQuery = this.run();
467
+ return `${BUCKET_API_BASE}?action=bucket&format=json&query=${encodedQuery}`;
468
+ }
385
469
  }
386
470
  /**
387
471
  * Creates a new query builder for the given bucket.
388
472
  *
389
- * @param bucket The name of the bucket to query.
473
+ * This is the main entry point for building queries. The returned builder
474
+ * provides autocomplete for field names and tracks the result type as you
475
+ * chain methods.
476
+ *
477
+ * @param bucket - The name of the bucket to query.
478
+ *
479
+ * @example
480
+ * ```typescript
481
+ * import { bucket } from '@dava96/osrs-wiki-bucket-builder';
482
+ *
483
+ * const query = bucket('exchange')
484
+ * .select('id', 'name', 'value')
485
+ * .where('name', 'Abyssal whip')
486
+ * .run();
487
+ * ```
390
488
  */
391
489
  export function bucket(bucket) {
392
490
  return new BucketQueryBuilder(bucket);
@@ -1 +1 @@
1
- {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-builder.js","sourceRoot":"","sources":["../src/query-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Type-level utilities for inferring the shape of bucket query responses.
3
+ *
4
+ * These types work in tandem with {@link BucketQueryBuilder} to provide
5
+ * compile-time type safety for API responses. As you chain `.select()`,
6
+ * `.join()`, and other methods, the builder accumulates a result type
7
+ * that precisely describes the shape of each row returned by the API.
8
+ *
9
+ * @module response-types
10
+ */
11
+ import type { BucketRegistry, BucketName } from './generated/definitions.js';
12
+ /**
13
+ * Meta-fields that the Wiki Bucket API injects into every response row.
14
+ *
15
+ * These are not part of any bucket's schema but are always present in
16
+ * the JSON response. `page_name` identifies the source wiki page and
17
+ * `page_name_sub` identifies the subpage or version variant.
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * // Every row in the response includes these:
22
+ * // { "page_name": "Abyssal whip", "page_name_sub": "", "id": 4151, ... }
23
+ * ```
24
+ */
25
+ export interface BucketMetaFields {
26
+ /** The wiki page that sourced this row. */
27
+ page_name: string;
28
+ /** The subpage or version variant (empty string if none). */
29
+ page_name_sub: string;
30
+ }
31
+ /**
32
+ * Computes the union of all valid field names for a given bucket and join map.
33
+ *
34
+ * This powers autocomplete in `.select()` and `.where()`. It includes:
35
+ * - Direct fields from the main bucket (e.g. `'id'`, `'name'`)
36
+ * - Dot-prefixed fields from joined buckets (e.g. `'exchange.value'`)
37
+ * - The global wildcard `'*'` which selects all main bucket fields
38
+ * - Alias wildcards like `'exchange.*'` which select all fields from a join
39
+ *
40
+ * @template TMain - The main bucket being queried.
41
+ * @template TJoinMap - A record mapping alias names to their target bucket names.
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * // For bucket('infobox_item').join('exchange', 'ex', 'item_name', 'name'):
46
+ * // ValidField = 'item_name' | 'weight' | ... | 'ex.id' | 'ex.name' | ... | '*' | 'ex.*'
47
+ * ```
48
+ */
49
+ export type ValidField<TMain extends BucketName, TJoinMap extends Record<string, BucketName>> = (keyof BucketRegistry[TMain] & string) | JoinedFields<TJoinMap> | '*' | JoinedWildcards<TJoinMap>;
50
+ /**
51
+ * Generates dot-prefixed field names for all joined buckets.
52
+ * E.g. if TJoinMap = { ex: 'exchange' }, produces `'ex.id' | 'ex.name' | ...`
53
+ */
54
+ type JoinedFields<TJoinMap extends Record<string, BucketName>> = {
55
+ [A in keyof TJoinMap & string]: `${A}.${keyof BucketRegistry[TJoinMap[A]] & string}`;
56
+ }[keyof TJoinMap & string];
57
+ /**
58
+ * Generates wildcard selectors for all joined buckets.
59
+ * E.g. if TJoinMap = { ex: 'exchange' }, produces `'ex.*'`
60
+ */
61
+ type JoinedWildcards<TJoinMap extends Record<string, BucketName>> = `${keyof TJoinMap & string}.*`;
62
+ /**
63
+ * Resolves a single field string to its TypeScript type by delegating to
64
+ * specialised helpers for each field format.
65
+ *
66
+ * The resolution strategy (in order):
67
+ * 1. `'*'` → Full main bucket type via {@link ResolveWildcard}
68
+ * 2. `'alias.*'` → All aliased fields via {@link ResolveAliasWildcard}
69
+ * 3. `'alias.field'`→ Single joined field via {@link ResolveDottedField}
70
+ * 4. `'field'` → Single main bucket field via {@link ResolveMainField}
71
+ *
72
+ * Falls back to `unknown` for unrecognised fields.
73
+ */
74
+ type ResolveField<TMain extends BucketName, TJoinMap extends Record<string, BucketName>, F extends string> = F extends '*' ? ResolveWildcard<TMain> : F extends `${infer Alias}.*` ? ResolveAliasWildcard<TJoinMap, Alias> : F extends `${infer Alias}.${infer Field}` ? ResolveDottedField<TJoinMap, Alias, Field> : ResolveMainField<TMain, F>;
75
+ /** Resolves `'*'` to the full main bucket interface. */
76
+ type ResolveWildcard<TMain extends BucketName> = BucketRegistry[TMain];
77
+ /**
78
+ * Resolves `'alias.*'` to all fields from the aliased bucket,
79
+ * with each key prefixed by the alias (e.g. `'ex.id'`, `'ex.name'`).
80
+ */
81
+ type ResolveAliasWildcard<TJoinMap extends Record<string, BucketName>, Alias extends string> = Alias extends keyof TJoinMap ? {
82
+ [K in keyof BucketRegistry[TJoinMap[Alias]] & string as `${Alias}.${K}`]: BucketRegistry[TJoinMap[Alias]][K];
83
+ } : unknown;
84
+ /**
85
+ * Resolves `'alias.field'` to the field's type from the joined bucket.
86
+ * First checks if the alias is in the join map, then falls back to
87
+ * checking if it's a raw bucket name (for unaliased joins).
88
+ */
89
+ type ResolveDottedField<TJoinMap extends Record<string, BucketName>, Alias extends string, Field extends string> = Alias extends keyof TJoinMap ? LookupField<TJoinMap[Alias], Field> : Alias extends BucketName ? LookupField<Alias, Field> : unknown;
90
+ /** Resolves a plain field name to its type from the main bucket. */
91
+ type ResolveMainField<TMain extends BucketName, F extends string> = F extends keyof BucketRegistry[TMain] ? BucketRegistry[TMain][F] : unknown;
92
+ /** Looks up a field's type from a specific bucket, returning `unknown` if not found. */
93
+ type LookupField<B extends BucketName, F extends string> = F extends keyof BucketRegistry[B] ? BucketRegistry[B][F] : unknown;
94
+ /**
95
+ * Builds the result object type from a set of selected field strings.
96
+ *
97
+ * This is the core type that powers the inferred response shape. It:
98
+ * - Expands `'*'` to the full main bucket interface
99
+ * - Expands `'alias.*'` to all prefixed fields from the joined bucket
100
+ * - Maps plain and dotted fields to their resolved types
101
+ *
102
+ * @template TMain - The main bucket name.
103
+ * @template TJoinMap - Record mapping join aliases to bucket names.
104
+ * @template Fields - Union of selected field strings.
105
+ *
106
+ * @example
107
+ * ```typescript
108
+ * type R = SelectResult<'storeline', { exchange: 'exchange' }, 'sold_by' | 'exchange.value'>;
109
+ * // { sold_by: string; 'exchange.value': number }
110
+ * ```
111
+ */
112
+ export type SelectResult<TMain extends BucketName, TJoinMap extends Record<string, BucketName>, Fields extends string> = ('*' extends Fields ? BucketRegistry[TMain] : object) & ExpandAliasWildcards<TMain, TJoinMap, Fields> & {
113
+ [F in Fields as F extends '*' ? never : F extends `${string}.*` ? never : F]: ResolveField<TMain, TJoinMap, F>;
114
+ };
115
+ /**
116
+ * Expands alias wildcards (e.g. 'exchange.*') into their full prefixed field sets.
117
+ * Uses UnionToIntersection to merge multiple wildcard expansions.
118
+ */
119
+ type ExpandAliasWildcards<TMain extends BucketName, TJoinMap extends Record<string, BucketName>, Fields extends string> = UnionToIntersection<Fields extends `${infer A}.*` ? ResolveField<TMain, TJoinMap, `${A}.*`> : never>;
120
+ /** Converts a union type to an intersection type. */
121
+ type UnionToIntersection<U> = (U extends unknown ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
122
+ /**
123
+ * Extracts the inferred result type from a `BucketQueryBuilder` instance.
124
+ *
125
+ * Use this with `typeof` to get the response row shape without executing the query:
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * const query = bucket('exchange').select('id', 'name', 'value');
130
+ * type Row = InferBucketResult<typeof query>;
131
+ * // Row = { id: number; name: string; value: number; page_name: string; page_name_sub: string }
132
+ *
133
+ * const raw = await fetch(query.toUrl()).then(r => r.json());
134
+ * const response = new BucketResponse<Row>(raw);
135
+ * response.first()?.name; // ✅ autocomplete, typed as string
136
+ * ```
137
+ */
138
+ export type InferBucketResult<T> = T extends {
139
+ readonly __resultType: infer R;
140
+ } ? R : unknown;
141
+ export {};
142
+ //# sourceMappingURL=response-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-types.d.ts","sourceRoot":"","sources":["../src/response-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Type-level utilities for inferring the shape of bucket query responses.
3
+ *
4
+ * These types work in tandem with {@link BucketQueryBuilder} to provide
5
+ * compile-time type safety for API responses. As you chain `.select()`,
6
+ * `.join()`, and other methods, the builder accumulates a result type
7
+ * that precisely describes the shape of each row returned by the API.
8
+ *
9
+ * @module response-types
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=response-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-types.js","sourceRoot":"","sources":["../src/response-types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
package/dist/types.d.ts CHANGED
@@ -60,10 +60,48 @@ export interface BucketApiResponse<T = unknown> {
60
60
  error?: string;
61
61
  }
62
62
  /**
63
- * Helper class to manipulate/view the response.
63
+ * Helper class to manipulate and access bucket API response data.
64
+ *
65
+ * Can be instantiated directly with a generic type, or use the static
66
+ * {@link BucketResponse.from} factory to automatically infer the type
67
+ * from a query builder instance.
68
+ *
69
+ * @template T The expected shape of each result row.
70
+ *
71
+ * @example
72
+ * ```typescript
73
+ * // Option 1: Manual type parameter
74
+ * const response = new BucketResponse<{ id: number; name: string }>(raw);
75
+ *
76
+ * // Option 2: Automatic inference via .from()
77
+ * const query = bucket('exchange').select('id', 'name');
78
+ * const response = BucketResponse.from(query, raw);
79
+ * response.first()?.name; // ✅ typed as string
80
+ * ```
64
81
  */
65
82
  export declare class BucketResponse<T = unknown> {
66
83
  private readonly raw;
84
+ /**
85
+ * Creates a typed `BucketResponse` by inferring the result type
86
+ * from a `BucketQueryBuilder` instance.
87
+ *
88
+ * This eliminates the need to manually specify `InferBucketResult<typeof query>`
89
+ * — the type flows automatically from the builder's accumulated generics.
90
+ *
91
+ * @param _query - The query builder instance (used only for type inference, not called at runtime).
92
+ * @param raw - The raw JSON response from the Wiki API.
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * const query = bucket('exchange').select('name', 'value').where('name', 'Abyssal whip');
97
+ * const raw = await fetch(query.toUrl()).then(r => r.json());
98
+ * const response = BucketResponse.from(query, raw);
99
+ * response.first()?.value; // ✅ typed as number
100
+ * ```
101
+ */
102
+ static from<Q extends {
103
+ readonly __resultType: unknown;
104
+ }>(_query: Q, raw: BucketApiResponse<Q['__resultType']>): BucketResponse<Q['__resultType']>;
67
105
  constructor(raw: BucketApiResponse<T>);
68
106
  /**
69
107
  * The Lua query string returned by the API.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,4BAA4B,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACpD,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5D,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,CAAC;AAE9C,eAAO,MAAM,cAAc;;;;CAI1B,CAAC;AAEF,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEzE,MAAM,MAAM,eAAe,GACrB,CAAC,MAAM,EAAE,WAAW,CAAC,GACrB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,GAC/B,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAC/B,CAAC,MAAM,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,qBAAqB,GAAG;IAAE,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAEtG;;;GAGG;AACH,eAAO,MAAM,MAAM;IACf;;;OAGG;yBACkB,eAAe,EAAE,KAAG,qBAAqB;IAE9D;;;OAGG;wBACiB,eAAe,EAAE,KAAG,qBAAqB;IAE7D;;;OAGG;qBACc,eAAe,KAAG,qBAAqB;IAExD;;OAEG;gBACO,qBAAqB;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,OAAO;IACvB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEtD;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;OAGG;IACH,IAAI,OAAO,IAAI,CAAC,EAAE,CAKjB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED;;OAEG;IACH,KAAK,IAAI,CAAC,GAAG,SAAS;CAGzB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,4BAA4B,CAAC;AAE3C,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AACpD,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5D,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,MAAM,CAAC;AAE9C,eAAO,MAAM,cAAc;;;;CAI1B,CAAC;AAEF,MAAM,WAAW,WAAW;IACxB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,eAAe,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACvB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,qBAAqB,GAAG,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEzE,MAAM,MAAM,eAAe,GACrB,CAAC,MAAM,EAAE,WAAW,CAAC,GACrB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,GAC/B,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAC/B,CAAC,MAAM,EAAE,QAAQ,EAAE,qBAAqB,CAAC,CAAC;AAChD,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,qBAAqB,GAAG;IAAE,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAEtG;;;GAGG;AACH,eAAO,MAAM,MAAM;IACf;;;OAGG;yBACkB,eAAe,EAAE,KAAG,qBAAqB;IAE9D;;;OAGG;wBACiB,eAAe,EAAE,KAAG,qBAAqB;IAE7D;;;OAGG;qBACc,eAAe,KAAG,qBAAqB;IAExD;;OAEG;gBACO,qBAAqB;CAClC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,OAAO;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,OAAO;IA0BvB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAzBhC;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;KAAE,EACpD,MAAM,EAAE,CAAC,EACT,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,GAC1C,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;gBAIP,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAEtD;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;;OAGG;IACH,IAAI,OAAO,IAAI,CAAC,EAAE,CAKjB;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED;;OAEG;IACH,KAAK,IAAI,CAAC,GAAG,SAAS;CAGzB"}
package/dist/types.js CHANGED
@@ -33,10 +33,48 @@ export const Bucket = {
33
33
  Null: () => ({ _type: 'NULL' }),
34
34
  };
35
35
  /**
36
- * Helper class to manipulate/view the response.
36
+ * Helper class to manipulate and access bucket API response data.
37
+ *
38
+ * Can be instantiated directly with a generic type, or use the static
39
+ * {@link BucketResponse.from} factory to automatically infer the type
40
+ * from a query builder instance.
41
+ *
42
+ * @template T The expected shape of each result row.
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * // Option 1: Manual type parameter
47
+ * const response = new BucketResponse<{ id: number; name: string }>(raw);
48
+ *
49
+ * // Option 2: Automatic inference via .from()
50
+ * const query = bucket('exchange').select('id', 'name');
51
+ * const response = BucketResponse.from(query, raw);
52
+ * response.first()?.name; // ✅ typed as string
53
+ * ```
37
54
  */
38
55
  export class BucketResponse {
39
56
  raw;
57
+ /**
58
+ * Creates a typed `BucketResponse` by inferring the result type
59
+ * from a `BucketQueryBuilder` instance.
60
+ *
61
+ * This eliminates the need to manually specify `InferBucketResult<typeof query>`
62
+ * — the type flows automatically from the builder's accumulated generics.
63
+ *
64
+ * @param _query - The query builder instance (used only for type inference, not called at runtime).
65
+ * @param raw - The raw JSON response from the Wiki API.
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const query = bucket('exchange').select('name', 'value').where('name', 'Abyssal whip');
70
+ * const raw = await fetch(query.toUrl()).then(r => r.json());
71
+ * const response = BucketResponse.from(query, raw);
72
+ * response.first()?.value; // ✅ typed as number
73
+ * ```
74
+ */
75
+ static from(_query, raw) {
76
+ return new BucketResponse(raw);
77
+ }
40
78
  constructor(raw) {
41
79
  this.raw = raw;
42
80
  }
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,4BAA4B,CAAC;AAM3C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,CAAC;CACZ,CAAC;AAyBF;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB;;;OAGG;IACH,GAAG,EAAE,CAAC,GAAG,UAA6B,EAAyB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAEhG;;;OAGG;IACH,EAAE,EAAE,CAAC,GAAG,UAA6B,EAAyB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAE9F;;;OAGG;IACH,GAAG,EAAE,CAAC,SAA0B,EAAyB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAEzF;;OAEG;IACH,IAAI,EAAE,GAA0B,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACzD,CAAC;AAWF;;GAEG;AACH,MAAM,OAAO,cAAc;IACM;IAA7B,YAA6B,GAAyB;QAAzB,QAAG,GAAH,GAAG,CAAsB;IAAG,CAAC;IAE1D;;OAEG;IACH,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAI,OAAO;QACP,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;CACJ"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,4BAA4B,CAAC;AAM3C,MAAM,CAAC,MAAM,cAAc,GAAG;IAC1B,KAAK,EAAE,GAAG;IACV,SAAS,EAAE,IAAI;IACf,MAAM,EAAE,CAAC;CACZ,CAAC;AAyBF;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB;;;OAGG;IACH,GAAG,EAAE,CAAC,GAAG,UAA6B,EAAyB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAEhG;;;OAGG;IACH,EAAE,EAAE,CAAC,GAAG,UAA6B,EAAyB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAE9F;;;OAGG;IACH,GAAG,EAAE,CAAC,SAA0B,EAAyB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAEzF;;OAEG;IACH,IAAI,EAAE,GAA0B,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;CACzD,CAAC;AAWF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,cAAc;IA0BM;IAzB7B;;;;;;;;;;;;;;;;;OAiBG;IACH,MAAM,CAAC,IAAI,CACP,MAAS,EACT,GAAyC;QAEzC,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,YAA6B,GAAyB;QAAzB,QAAG,GAAH,GAAG,CAAsB;IAAG,CAAC;IAE1D;;OAEG;IACH,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAI,OAAO;QACP,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dava96/osrs-wiki-bucket-builder",
3
- "version": "1.0.5",
3
+ "version": "1.0.6",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
package/readme.md CHANGED
@@ -12,6 +12,7 @@ Generates valid Lua query strings that can be executed via the Wiki's `action=bu
12
12
  ## Features
13
13
 
14
14
  - **Strict Typing** — TypeScript definitions generated from `Special:AllPages` ensure only valid bucket names and fields compile.
15
+ - **Inferred Response Types** — `.select()`, `.join()`, and `.where()` constrain fields to valid names and accumulate a result type that precisely describes each row.
15
16
  - **Fluent API** — Chain `.select()`, `.join()`, `.where()`, `.orderBy()`, `.limit()`, `.offset()`.
16
17
  - **Join Aliases** — Multi-bucket joins with alias support and dot-notation (`shop.price`).
17
18
  - **Wildcard Expansion** — Client-side `*` and `alias.*` expansion to strict field lists.
@@ -26,18 +27,21 @@ npm install @dava96/osrs-wiki-bucket-builder
26
27
  ## Quick Start
27
28
 
28
29
  ```typescript
29
- import { bucket } from '@dava96/osrs-wiki-bucket-builder';
30
+ import { bucket, BucketResponse } from '@dava96/osrs-wiki-bucket-builder';
31
+ import type { InferBucketResult } from '@dava96/osrs-wiki-bucket-builder';
30
32
 
31
33
  const query = bucket('exchange')
32
34
  .select('id', 'name', 'value')
33
- .where('name', 'Abyssal whip')
34
- .run();
35
+ .where('name', 'Abyssal whip');
35
36
 
36
- // query is a URL-encoded Lua string, ready to use in a fetch call
37
- const url = `https://oldschool.runescape.wiki/api.php?action=bucket&format=json&query=${query}`;
38
- const response = await fetch(url);
39
- const data = await response.json();
40
- console.log(data.bucket); // [{ id: ..., name: 'Abyssal whip', value: ... }]
37
+ // .toUrl() generates the full API URL, ready to fetch
38
+ const raw = await fetch(query.toUrl()).then(r => r.json());
39
+
40
+ // BucketResponse.from() infers the result type from the query
41
+ const response = BucketResponse.from(query, raw);
42
+ const whip = response.first();
43
+ console.log(whip?.name); // ✅ typed as string
44
+ console.log(whip?.value); // ✅ typed as number
41
45
  ```
42
46
 
43
47
  [▶ Run this query](https://oldschool.runescape.wiki/api.php?action=bucket&query=bucket(%27exchange%27).select(%27id%27,%20%27name%27,%20%27value%27).where({%20%27name%27,%20%27Abyssal%20whip%27%20}).run())
@@ -421,11 +425,9 @@ import { bucket, BucketResponse } from '@dava96/osrs-wiki-bucket-builder';
421
425
  const query = bucket('exchange')
422
426
  .select('name', 'value')
423
427
  .where('name', 'Abyssal whip')
424
- .first()
425
- .run();
428
+ .first();
426
429
 
427
- const url = `https://oldschool.runescape.wiki/api.php?action=bucket&format=json&query=${query}`;
428
- const raw = await fetch(url).then(r => r.json());
430
+ const raw = await fetch(query.toUrl()).then(r => r.json());
429
431
  const response = new BucketResponse(raw);
430
432
 
431
433
  console.log(response.results); // Array of matching rows
@@ -434,6 +436,45 @@ console.log(response.query); // The Lua query echoed by the API
434
436
  console.log(response.error); // Error message if the query failed
435
437
  ```
436
438
 
439
+ #### `BucketResponse.from()` — typed responses from queries
440
+
441
+ Use `BucketResponse.from(query, raw)` to automatically infer the result type from the query builder. No manual type parameter required:
442
+
443
+ ```typescript
444
+ const query = bucket('exchange').select('name', 'value');
445
+ const raw = await fetch(query.toUrl()).then(r => r.json());
446
+ const response = BucketResponse.from(query, raw);
447
+
448
+ response.first()?.name; // ✅ typed as string
449
+ response.first()?.value; // ✅ typed as number
450
+ ```
451
+
452
+ ### `InferBucketResult` — extract the result type
453
+
454
+ Use `InferBucketResult<typeof query>` to extract the inferred row type without executing the query. Useful for typing variables, function parameters, or API response handlers:
455
+
456
+ ```typescript
457
+ import type { InferBucketResult } from '@dava96/osrs-wiki-bucket-builder';
458
+
459
+ const query = bucket('exchange').select('id', 'name', 'value');
460
+ type ExchangeRow = InferBucketResult<typeof query>;
461
+ // ExchangeRow = { id: number; name: string; value: number; page_name: string; page_name_sub: string }
462
+ ```
463
+
464
+ ### `.toUrl()` — generate the full API URL
465
+
466
+ Generates the complete Wiki API URL with all query parameters, ready to pass to `fetch()`:
467
+
468
+ ```typescript
469
+ const url = bucket('exchange')
470
+ .select('name', 'value')
471
+ .where('value', '>', 100000)
472
+ .limit(10)
473
+ .toUrl();
474
+
475
+ const data = await fetch(url).then(r => r.json());
476
+ ```
477
+
437
478
  ---
438
479
 
439
480
  ## Full Example
@@ -487,6 +528,7 @@ const query = bucket('infobox_item')
487
528
  | `.clone()` | Deep copies the builder |
488
529
  | `.run(options?)` | Returns the Lua query string (URI-encoded by default) |
489
530
  | `.printSQL()` | Returns the raw Lua query string |
531
+ | `.toUrl()` | Generates the full Wiki API URL, ready to `fetch()` |
490
532
 
491
533
  ### Bucket Helpers
492
534
 
@@ -505,6 +547,9 @@ const query = bucket('infobox_item')
505
547
  | `BucketRegistry` | Maps bucket names to their field interfaces |
506
548
  | `BUCKET_FIELDS` | Runtime map of field names per bucket |
507
549
  | `BucketResponse<T>` | Response wrapper class |
550
+ | `BucketResponse.from()` | Creates a typed response from a query builder |
551
+ | `InferBucketResult<T>` | Extracts the inferred row type from a query |
552
+ | `BucketMetaFields` | The `page_name` and `page_name_sub` fields present on every row |
508
553
  | `Operator` | Valid comparison operators |
509
554
  | `ScalarValue` | `string \| number \| boolean` |
510
555