@gqloom/core 0.9.6 → 0.9.7

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.cjs CHANGED
@@ -22,10 +22,11 @@ var src_exports = {};
22
22
  __export(src_exports, {
23
23
  BaseChainFactory: () => BaseChainFactory,
24
24
  ChainResolver: () => ChainResolver,
25
- EasyDataLoader: () => EasyDataLoader,
25
+ EasyDataLoader: () => LoomDataLoader,
26
26
  FieldChainFactory: () => FieldChainFactory,
27
27
  FieldFactoryWithResolve: () => FieldFactoryWithResolve,
28
28
  GraphQLSchemaLoom: () => GraphQLSchemaLoom,
29
+ LoomDataLoader: () => LoomDataLoader,
29
30
  LoomObjectType: () => LoomObjectType,
30
31
  MutationChainFactory: () => MutationChainFactory,
31
32
  MutationFactoryWithResolve: () => MutationFactoryWithResolve,
@@ -410,48 +411,46 @@ function markLocation(message, ...locations) {
410
411
  }
411
412
 
412
413
  // src/utils/loader.ts
413
- var EasyDataLoader = class _EasyDataLoader {
414
+ var LoomDataLoader = class _LoomDataLoader {
414
415
  constructor(batchLoadFn) {
415
416
  this.batchLoadFn = batchLoadFn;
416
- this.queue = [];
417
- this.cache = /* @__PURE__ */ new Map();
417
+ this.results = /* @__PURE__ */ new Map();
418
418
  this.resolvers = /* @__PURE__ */ new Map();
419
419
  }
420
- queue;
421
- cache;
420
+ results;
422
421
  resolvers;
422
+ /**
423
+ * Load data for a given key.
424
+ * @param key - The key to load data for.
425
+ * @returns A promise that resolves to the loaded data.
426
+ */
423
427
  load(key) {
424
- const existing = this.cache.get(key);
428
+ const existing = this.results.get(key);
425
429
  if (existing) return existing;
426
430
  const promise = new Promise((resolve, reject) => {
427
- this.queue.push(key);
428
431
  this.resolvers.set(key, [resolve, reject]);
429
432
  this.nextTickBatchLoad();
430
433
  });
431
- this.cache.set(key, promise);
434
+ this.results.set(key, promise);
432
435
  return promise;
433
436
  }
437
+ /**
438
+ * Clear the cache and reset the loader.
439
+ */
434
440
  clear() {
435
- this.queue = [];
436
- this.cache = /* @__PURE__ */ new Map();
441
+ this.results = /* @__PURE__ */ new Map();
437
442
  this.resolvers = /* @__PURE__ */ new Map();
438
443
  }
439
- clearByKey(key) {
440
- this.queue = this.queue.filter((k) => k !== key);
441
- this.cache.delete(key);
442
- this.resolvers.delete(key);
443
- }
444
444
  async executeBatchLoad() {
445
- if (this.queue.length === 0) return;
446
- const [keys, resolvers] = [this.queue, this.resolvers];
447
- this.queue = [];
445
+ if (this.resolvers.size === 0) return;
446
+ const resolvers = this.resolvers;
448
447
  this.resolvers = /* @__PURE__ */ new Map();
448
+ const keys = Array.from(resolvers.keys());
449
449
  try {
450
450
  const list = await this.batchLoadFn(keys);
451
451
  for (let i = 0; i < list.length; i++) {
452
452
  const data = list[i];
453
- const resolve = resolvers.get(keys[i])?.[0];
454
- const reject = resolvers.get(keys[i])?.[1];
453
+ const [resolve, reject] = resolvers.get(keys[i]) ?? [];
455
454
  if (data instanceof Error) {
456
455
  reject?.(data);
457
456
  } else {
@@ -467,7 +466,17 @@ var EasyDataLoader = class _EasyDataLoader {
467
466
  }
468
467
  nextTickPromise;
469
468
  nextTickBatchLoad() {
470
- this.nextTickPromise ??= _EasyDataLoader.nextTick().then(() => this.executeBatchLoad()).finally(() => this.nextTickPromise = void 0);
469
+ const load = async () => {
470
+ try {
471
+ while (this.resolvers.size > 0) {
472
+ await _LoomDataLoader.nextTick();
473
+ await this.executeBatchLoad();
474
+ }
475
+ } finally {
476
+ this.nextTickPromise = void 0;
477
+ }
478
+ };
479
+ this.nextTickPromise ??= load();
471
480
  return this.nextTickPromise;
472
481
  }
473
482
  static nextTick() {
@@ -902,7 +911,7 @@ var FieldChainFactory = class _FieldChainFactory extends BaseChainFactory {
902
911
  load(resolve) {
903
912
  if (!this.options?.output) throw new Error("Output is required");
904
913
  const hasInput = typeof this.options.input !== "undefined";
905
- const initLoader = () => new EasyDataLoader((args) => {
914
+ const initLoader = () => new LoomDataLoader((args) => {
906
915
  const parents = args.map(
907
916
  ([parent, input]) => hasInput ? [parent, input] : parent
908
917
  );
@@ -2041,6 +2050,7 @@ function ensureInterfaceType(gqlType, interfaceConfig) {
2041
2050
  FieldChainFactory,
2042
2051
  FieldFactoryWithResolve,
2043
2052
  GraphQLSchemaLoom,
2053
+ LoomDataLoader,
2044
2054
  LoomObjectType,
2045
2055
  MutationChainFactory,
2046
2056
  MutationFactoryWithResolve,
package/dist/index.d.cts CHANGED
@@ -271,18 +271,27 @@ declare function tryIn<T>(func: () => T, ...locations: string[]): T;
271
271
  declare function markLocation(message: string, ...locations: string[]): string;
272
272
 
273
273
  type BatchLoadFn<TKey, TData> = (keys: TKey[]) => Promise<(TData | Error)[]>;
274
- declare class EasyDataLoader<TKey, TData> {
274
+ /**
275
+ * GraphQL Loom built-in data loader.
276
+ */
277
+ declare class LoomDataLoader<TKey, TData> {
275
278
  protected readonly batchLoadFn: BatchLoadFn<TKey, TData>;
276
- protected queue: TKey[];
277
- protected cache: Map<TKey, Promise<TData>>;
279
+ protected results: Map<TKey, Promise<TData>>;
278
280
  protected resolvers: Map<TKey, [
279
281
  resolve: (value: TData | PromiseLike<TData>) => void,
280
282
  reject: (reason?: any) => void
281
283
  ]>;
282
284
  constructor(batchLoadFn: BatchLoadFn<TKey, TData>);
285
+ /**
286
+ * Load data for a given key.
287
+ * @param key - The key to load data for.
288
+ * @returns A promise that resolves to the loaded data.
289
+ */
283
290
  load(key: TKey): Promise<TData>;
291
+ /**
292
+ * Clear the cache and reset the loader.
293
+ */
284
294
  clear(): void;
285
- clearByKey(key: TKey): void;
286
295
  protected executeBatchLoad(): Promise<void>;
287
296
  protected nextTickPromise?: Promise<void>;
288
297
  protected nextTickBatchLoad(): Promise<void>;
@@ -467,4 +476,4 @@ interface GQLoomExtensionAttribute {
467
476
  directives?: string[];
468
477
  }
469
478
 
470
- export { BaseField, type BatchLoadFn, ChainResolver, type CoreSchemaWeaverConfig, type CoreSchemaWeaverConfigOptions, type DirectiveItem, type DirectiveRecord, EasyDataLoader, type Executor, Field, FieldChainFactory, FieldFactoryWithUtils, FieldOptions, FieldOrOperation, type GQLoomExtensionAttribute, type GQLoomExtensions, type GlobalWeaverContext, GraphQLFieldOptions, GraphQLSchemaLoom, GraphQLSilk, InferInputI, type ListSilk, LoomObjectType, MayPromise, Middleware, Mutation, MutationChainFactory, MutationFactoryWithChain, MutationOptions, type NonNullSilk, type NullableSilk, OPERATION_OBJECT_NAMES, ObjectChainResolver, OmitInUnion, Operation, Query, QueryChainFactory, QueryFactoryWithChain, QueryOptions, Resolver, type ResolverFactory, ResolverOptions, ResolverOptionsWithExtensions, ResolverPayload, type SchemaWeaver, StandardSchemaV1, Subscription, SubscriptionChainFactory, SubscriptionFactoryWithChain, SubscriptionOptions, type ToExecutorProps, ValueOf, type WeaverConfig, type WeaverContext, capitalize, collectName, collectNames, createField, createMutation, createQuery, createSubscription, deepMerge, defaultSubscriptionResolve, ensureInputObjectType, ensureInputType, ensureInterfaceType, field, getCacheType, getFieldOptions, getGraphQLType, getOperationOptions, getSubscriptionOptions, initWeaverContext, inputToArgs, isSchemaVendorWeaver, isSilk, listSilk, loom, mapValue, markErrorLocation, markLocation, meta, mutation, nonNullSilk, notNullish, nullableSilk, parseSilk, pascalCase, provideWeaverContext, query, resolver, screamingSnakeCase, silk, subscription, toObjMap, tryIn, weave, weaverContext };
479
+ export { BaseField, type BatchLoadFn, ChainResolver, type CoreSchemaWeaverConfig, type CoreSchemaWeaverConfigOptions, type DirectiveItem, type DirectiveRecord, LoomDataLoader as EasyDataLoader, type Executor, Field, FieldChainFactory, FieldFactoryWithUtils, FieldOptions, FieldOrOperation, type GQLoomExtensionAttribute, type GQLoomExtensions, type GlobalWeaverContext, GraphQLFieldOptions, GraphQLSchemaLoom, GraphQLSilk, InferInputI, type ListSilk, LoomDataLoader, LoomObjectType, MayPromise, Middleware, Mutation, MutationChainFactory, MutationFactoryWithChain, MutationOptions, type NonNullSilk, type NullableSilk, OPERATION_OBJECT_NAMES, ObjectChainResolver, OmitInUnion, Operation, Query, QueryChainFactory, QueryFactoryWithChain, QueryOptions, Resolver, type ResolverFactory, ResolverOptions, ResolverOptionsWithExtensions, ResolverPayload, type SchemaWeaver, StandardSchemaV1, Subscription, SubscriptionChainFactory, SubscriptionFactoryWithChain, SubscriptionOptions, type ToExecutorProps, ValueOf, type WeaverConfig, type WeaverContext, capitalize, collectName, collectNames, createField, createMutation, createQuery, createSubscription, deepMerge, defaultSubscriptionResolve, ensureInputObjectType, ensureInputType, ensureInterfaceType, field, getCacheType, getFieldOptions, getGraphQLType, getOperationOptions, getSubscriptionOptions, initWeaverContext, inputToArgs, isSchemaVendorWeaver, isSilk, listSilk, loom, mapValue, markErrorLocation, markLocation, meta, mutation, nonNullSilk, notNullish, nullableSilk, parseSilk, pascalCase, provideWeaverContext, query, resolver, screamingSnakeCase, silk, subscription, toObjMap, tryIn, weave, weaverContext };
package/dist/index.d.ts CHANGED
@@ -271,18 +271,27 @@ declare function tryIn<T>(func: () => T, ...locations: string[]): T;
271
271
  declare function markLocation(message: string, ...locations: string[]): string;
272
272
 
273
273
  type BatchLoadFn<TKey, TData> = (keys: TKey[]) => Promise<(TData | Error)[]>;
274
- declare class EasyDataLoader<TKey, TData> {
274
+ /**
275
+ * GraphQL Loom built-in data loader.
276
+ */
277
+ declare class LoomDataLoader<TKey, TData> {
275
278
  protected readonly batchLoadFn: BatchLoadFn<TKey, TData>;
276
- protected queue: TKey[];
277
- protected cache: Map<TKey, Promise<TData>>;
279
+ protected results: Map<TKey, Promise<TData>>;
278
280
  protected resolvers: Map<TKey, [
279
281
  resolve: (value: TData | PromiseLike<TData>) => void,
280
282
  reject: (reason?: any) => void
281
283
  ]>;
282
284
  constructor(batchLoadFn: BatchLoadFn<TKey, TData>);
285
+ /**
286
+ * Load data for a given key.
287
+ * @param key - The key to load data for.
288
+ * @returns A promise that resolves to the loaded data.
289
+ */
283
290
  load(key: TKey): Promise<TData>;
291
+ /**
292
+ * Clear the cache and reset the loader.
293
+ */
284
294
  clear(): void;
285
- clearByKey(key: TKey): void;
286
295
  protected executeBatchLoad(): Promise<void>;
287
296
  protected nextTickPromise?: Promise<void>;
288
297
  protected nextTickBatchLoad(): Promise<void>;
@@ -467,4 +476,4 @@ interface GQLoomExtensionAttribute {
467
476
  directives?: string[];
468
477
  }
469
478
 
470
- export { BaseField, type BatchLoadFn, ChainResolver, type CoreSchemaWeaverConfig, type CoreSchemaWeaverConfigOptions, type DirectiveItem, type DirectiveRecord, EasyDataLoader, type Executor, Field, FieldChainFactory, FieldFactoryWithUtils, FieldOptions, FieldOrOperation, type GQLoomExtensionAttribute, type GQLoomExtensions, type GlobalWeaverContext, GraphQLFieldOptions, GraphQLSchemaLoom, GraphQLSilk, InferInputI, type ListSilk, LoomObjectType, MayPromise, Middleware, Mutation, MutationChainFactory, MutationFactoryWithChain, MutationOptions, type NonNullSilk, type NullableSilk, OPERATION_OBJECT_NAMES, ObjectChainResolver, OmitInUnion, Operation, Query, QueryChainFactory, QueryFactoryWithChain, QueryOptions, Resolver, type ResolverFactory, ResolverOptions, ResolverOptionsWithExtensions, ResolverPayload, type SchemaWeaver, StandardSchemaV1, Subscription, SubscriptionChainFactory, SubscriptionFactoryWithChain, SubscriptionOptions, type ToExecutorProps, ValueOf, type WeaverConfig, type WeaverContext, capitalize, collectName, collectNames, createField, createMutation, createQuery, createSubscription, deepMerge, defaultSubscriptionResolve, ensureInputObjectType, ensureInputType, ensureInterfaceType, field, getCacheType, getFieldOptions, getGraphQLType, getOperationOptions, getSubscriptionOptions, initWeaverContext, inputToArgs, isSchemaVendorWeaver, isSilk, listSilk, loom, mapValue, markErrorLocation, markLocation, meta, mutation, nonNullSilk, notNullish, nullableSilk, parseSilk, pascalCase, provideWeaverContext, query, resolver, screamingSnakeCase, silk, subscription, toObjMap, tryIn, weave, weaverContext };
479
+ export { BaseField, type BatchLoadFn, ChainResolver, type CoreSchemaWeaverConfig, type CoreSchemaWeaverConfigOptions, type DirectiveItem, type DirectiveRecord, LoomDataLoader as EasyDataLoader, type Executor, Field, FieldChainFactory, FieldFactoryWithUtils, FieldOptions, FieldOrOperation, type GQLoomExtensionAttribute, type GQLoomExtensions, type GlobalWeaverContext, GraphQLFieldOptions, GraphQLSchemaLoom, GraphQLSilk, InferInputI, type ListSilk, LoomDataLoader, LoomObjectType, MayPromise, Middleware, Mutation, MutationChainFactory, MutationFactoryWithChain, MutationOptions, type NonNullSilk, type NullableSilk, OPERATION_OBJECT_NAMES, ObjectChainResolver, OmitInUnion, Operation, Query, QueryChainFactory, QueryFactoryWithChain, QueryOptions, Resolver, type ResolverFactory, ResolverOptions, ResolverOptionsWithExtensions, ResolverPayload, type SchemaWeaver, StandardSchemaV1, Subscription, SubscriptionChainFactory, SubscriptionFactoryWithChain, SubscriptionOptions, type ToExecutorProps, ValueOf, type WeaverConfig, type WeaverContext, capitalize, collectName, collectNames, createField, createMutation, createQuery, createSubscription, deepMerge, defaultSubscriptionResolve, ensureInputObjectType, ensureInputType, ensureInterfaceType, field, getCacheType, getFieldOptions, getGraphQLType, getOperationOptions, getSubscriptionOptions, initWeaverContext, inputToArgs, isSchemaVendorWeaver, isSilk, listSilk, loom, mapValue, markErrorLocation, markLocation, meta, mutation, nonNullSilk, notNullish, nullableSilk, parseSilk, pascalCase, provideWeaverContext, query, resolver, screamingSnakeCase, silk, subscription, toObjMap, tryIn, weave, weaverContext };
package/dist/index.js CHANGED
@@ -169,48 +169,46 @@ function markLocation(message, ...locations) {
169
169
  }
170
170
 
171
171
  // src/utils/loader.ts
172
- var EasyDataLoader = class _EasyDataLoader {
172
+ var LoomDataLoader = class _LoomDataLoader {
173
173
  constructor(batchLoadFn) {
174
174
  this.batchLoadFn = batchLoadFn;
175
- this.queue = [];
176
- this.cache = /* @__PURE__ */ new Map();
175
+ this.results = /* @__PURE__ */ new Map();
177
176
  this.resolvers = /* @__PURE__ */ new Map();
178
177
  }
179
- queue;
180
- cache;
178
+ results;
181
179
  resolvers;
180
+ /**
181
+ * Load data for a given key.
182
+ * @param key - The key to load data for.
183
+ * @returns A promise that resolves to the loaded data.
184
+ */
182
185
  load(key) {
183
- const existing = this.cache.get(key);
186
+ const existing = this.results.get(key);
184
187
  if (existing) return existing;
185
188
  const promise = new Promise((resolve, reject) => {
186
- this.queue.push(key);
187
189
  this.resolvers.set(key, [resolve, reject]);
188
190
  this.nextTickBatchLoad();
189
191
  });
190
- this.cache.set(key, promise);
192
+ this.results.set(key, promise);
191
193
  return promise;
192
194
  }
195
+ /**
196
+ * Clear the cache and reset the loader.
197
+ */
193
198
  clear() {
194
- this.queue = [];
195
- this.cache = /* @__PURE__ */ new Map();
199
+ this.results = /* @__PURE__ */ new Map();
196
200
  this.resolvers = /* @__PURE__ */ new Map();
197
201
  }
198
- clearByKey(key) {
199
- this.queue = this.queue.filter((k) => k !== key);
200
- this.cache.delete(key);
201
- this.resolvers.delete(key);
202
- }
203
202
  async executeBatchLoad() {
204
- if (this.queue.length === 0) return;
205
- const [keys, resolvers] = [this.queue, this.resolvers];
206
- this.queue = [];
203
+ if (this.resolvers.size === 0) return;
204
+ const resolvers = this.resolvers;
207
205
  this.resolvers = /* @__PURE__ */ new Map();
206
+ const keys = Array.from(resolvers.keys());
208
207
  try {
209
208
  const list = await this.batchLoadFn(keys);
210
209
  for (let i = 0; i < list.length; i++) {
211
210
  const data = list[i];
212
- const resolve = resolvers.get(keys[i])?.[0];
213
- const reject = resolvers.get(keys[i])?.[1];
211
+ const [resolve, reject] = resolvers.get(keys[i]) ?? [];
214
212
  if (data instanceof Error) {
215
213
  reject?.(data);
216
214
  } else {
@@ -226,7 +224,17 @@ var EasyDataLoader = class _EasyDataLoader {
226
224
  }
227
225
  nextTickPromise;
228
226
  nextTickBatchLoad() {
229
- this.nextTickPromise ??= _EasyDataLoader.nextTick().then(() => this.executeBatchLoad()).finally(() => this.nextTickPromise = void 0);
227
+ const load = async () => {
228
+ try {
229
+ while (this.resolvers.size > 0) {
230
+ await _LoomDataLoader.nextTick();
231
+ await this.executeBatchLoad();
232
+ }
233
+ } finally {
234
+ this.nextTickPromise = void 0;
235
+ }
236
+ };
237
+ this.nextTickPromise ??= load();
230
238
  return this.nextTickPromise;
231
239
  }
232
240
  static nextTick() {
@@ -633,7 +641,7 @@ var FieldChainFactory = class _FieldChainFactory extends BaseChainFactory {
633
641
  load(resolve) {
634
642
  if (!this.options?.output) throw new Error("Output is required");
635
643
  const hasInput = typeof this.options.input !== "undefined";
636
- const initLoader = () => new EasyDataLoader((args) => {
644
+ const initLoader = () => new LoomDataLoader((args) => {
637
645
  const parents = args.map(
638
646
  ([parent, input]) => hasInput ? [parent, input] : parent
639
647
  );
@@ -1798,10 +1806,11 @@ function ensureInterfaceType(gqlType, interfaceConfig) {
1798
1806
  export {
1799
1807
  BaseChainFactory,
1800
1808
  ChainResolver,
1801
- EasyDataLoader,
1809
+ LoomDataLoader as EasyDataLoader,
1802
1810
  FieldChainFactory,
1803
1811
  FieldFactoryWithResolve,
1804
1812
  GraphQLSchemaLoom,
1813
+ LoomDataLoader,
1805
1814
  LoomObjectType,
1806
1815
  MutationChainFactory,
1807
1816
  MutationFactoryWithResolve,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gqloom/core",
3
- "version": "0.9.6",
3
+ "version": "0.9.7",
4
4
  "description": "Create GraphQL schema and resolvers with TypeScript.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",