@soda-gql/core 0.11.9 → 0.11.11

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.js CHANGED
@@ -726,6 +726,38 @@ const createFieldFactoriesInner = (schema, typeName) => {
726
726
  return Object.fromEntries(entries);
727
727
  };
728
728
 
729
+ //#endregion
730
+ //#region packages/core/src/utils/promise.ts
731
+ /**
732
+ * Promise detection utilities for cross-realm compatibility.
733
+ * @module
734
+ */
735
+ /**
736
+ * Check if a value is Promise-like (has .then method).
737
+ *
738
+ * This function uses duck typing instead of `instanceof Promise` to work across
739
+ * VM sandbox boundaries where Promises created in a different realm have a
740
+ * different constructor.
741
+ *
742
+ * @example
743
+ * ```typescript
744
+ * // Works with native Promises
745
+ * isPromiseLike(Promise.resolve(42)); // true
746
+ *
747
+ * // Works with VM sandbox Promises (instanceof would fail)
748
+ * const vmPromise = vm.runInContext("Promise.resolve(42)", context);
749
+ * isPromiseLike(vmPromise); // true (instanceof Promise would be false)
750
+ *
751
+ * // Rejects non-Promises
752
+ * isPromiseLike({ then: "not a function" }); // false
753
+ * isPromiseLike(null); // false
754
+ * isPromiseLike(42); // false
755
+ * ```
756
+ */
757
+ const isPromiseLike = (value) => {
758
+ return value !== null && typeof value === "object" && "then" in value && typeof value.then === "function";
759
+ };
760
+
729
761
  //#endregion
730
762
  //#region packages/core/src/types/element/lazy-evaluator.ts
731
763
  /**
@@ -747,7 +779,7 @@ const createLazyEvaluator = (define, getDeps, createDepGenerator) => {
747
779
  }
748
780
  if (getDeps) for (const dep of getDeps()) yield* createDepGenerator(dep);
749
781
  const defined = define(context);
750
- if (!(defined instanceof Promise)) return (cache = { value: defined }).value;
782
+ if (!isPromiseLike(defined)) return (cache = { value: defined }).value;
751
783
  promise = defined.then((value) => {
752
784
  cache = { value };
753
785
  promise = null;
@@ -1151,7 +1183,7 @@ const createOperationComposerFactory = (schema, adapter, transformDocument) => {
1151
1183
  return resolvedAdapter.aggregateFragmentMetadata(fragmentMetaInfos);
1152
1184
  };
1153
1185
  const fragmentMetadataResults = fragmentUsages.map((usage) => usage.metadataBuilder ? usage.metadataBuilder() : void 0);
1154
- const hasAsyncFragmentMetadata = fragmentMetadataResults.some((r) => r instanceof Promise);
1186
+ const hasAsyncFragmentMetadata = fragmentMetadataResults.some((r) => isPromiseLike(r));
1155
1187
  const buildOperationMetadata = (aggregatedFragmentMetadata) => {
1156
1188
  const schemaLevel = resolvedAdapter.schemaLevel;
1157
1189
  return options.metadata?.({
@@ -1194,7 +1226,7 @@ const createOperationComposerFactory = (schema, adapter, transformDocument) => {
1194
1226
  const aggregated = aggregateFragmentMetadata(fragmentMetadataResults);
1195
1227
  const createDefinition = makeCreateDefinition(aggregated);
1196
1228
  const operationMetadataResult = buildOperationMetadata(aggregated);
1197
- if (operationMetadataResult instanceof Promise) return operationMetadataResult.then((metadata) => createDefinition({ metadata }));
1229
+ if (isPromiseLike(operationMetadataResult)) return operationMetadataResult.then((metadata) => createDefinition({ metadata }));
1198
1230
  return createDefinition({ metadata: operationMetadataResult });
1199
1231
  });
1200
1232
  };