@newmo/graphql-fake-core 0.25.0 → 0.26.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/dist/esm/code-generator.d.ts.map +1 -1
- package/dist/esm/code-generator.js +14 -3
- package/dist/esm/code-generator.js.map +1 -1
- package/dist/esm/createMock.d.ts +21 -0
- package/dist/esm/createMock.d.ts.map +1 -1
- package/dist/esm/createMock.js +47 -2
- package/dist/esm/createMock.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/code-generator.ts +14 -3
- package/src/createMock.ts +75 -5
- package/src/index.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/code-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAER,gBAAgB,EAGhB,QAAQ,EAEX,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,gBAAgB,GAAG;IAC3B,UAAU,EAAE,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;CACxD,GAAG,MAAM,CAAC;AACX,eAAO,MAAM,4BAA4B,GAAI,kBAAkB,gBAAgB,KAAG,MAQjF,CAAC;AACF,eAAO,MAAM,yBAAyB,GAAI,kBAEvC;IACC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAClB,KAAG,MAGH,CAAC;AACF,eAAO,MAAM,2BAA2B,GAAI,qCAIzC;IACC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAClB,KAAG,MAgBH,CAAC;
|
|
1
|
+
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/code-generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAER,gBAAgB,EAGhB,QAAQ,EAEX,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,gBAAgB,GAAG;IAC3B,UAAU,EAAE,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;CACxD,GAAG,MAAM,CAAC;AACX,eAAO,MAAM,4BAA4B,GAAI,kBAAkB,gBAAgB,KAAG,MAQjF,CAAC;AACF,eAAO,MAAM,yBAAyB,GAAI,kBAEvC;IACC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAClB,KAAG,MAGH,CAAC;AACF,eAAO,MAAM,2BAA2B,GAAI,qCAIzC;IACC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAClB,KAAG,MAgBH,CAAC;AAoJF,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CA2BpF"}
|
|
@@ -80,7 +80,10 @@ ${functionBodyCode}
|
|
|
80
80
|
function generateDefaultCode(config, typeInfo) {
|
|
81
81
|
const { rawName } = typeInfo;
|
|
82
82
|
if (config.outputType === "commonjs") {
|
|
83
|
-
|
|
83
|
+
// Pass depth: maxDepth to prevent recursive expansion of nested object types.
|
|
84
|
+
// This creates scalar-only instances, avoiding exponential memory growth.
|
|
85
|
+
// The server uses @graphql-tools/mock to lazily resolve nested types at query time.
|
|
86
|
+
return `const ${rawName} = create${rawName}({ depth: ${config.mock.maxDepth} });
|
|
84
87
|
exports.${rawName} = ${rawName};`;
|
|
85
88
|
}
|
|
86
89
|
return `export const ${rawName} = create${rawName}();`;
|
|
@@ -146,10 +149,18 @@ ${functionBodyCode}
|
|
|
146
149
|
}
|
|
147
150
|
`.trim();
|
|
148
151
|
}
|
|
149
|
-
|
|
152
|
+
if (config.outputType === "commonjs") {
|
|
153
|
+
return `
|
|
150
154
|
function create${rawName}({ defaultFields, depth = 0, typeVisitCount = Object.create(null) } = {}) {
|
|
151
155
|
${functionBodyCode}
|
|
152
|
-
}
|
|
156
|
+
}
|
|
157
|
+
exports.create${rawName} = create${rawName};`;
|
|
158
|
+
}
|
|
159
|
+
return `
|
|
160
|
+
export function create${rawName}({ defaultFields, depth = 0, typeVisitCount = Object.create(null) } = {}) {
|
|
161
|
+
${functionBodyCode}
|
|
162
|
+
}
|
|
163
|
+
`.trimStart();
|
|
153
164
|
}
|
|
154
165
|
export function generateCode(config, typeInfos) {
|
|
155
166
|
let code = "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code-generator.js","sourceRoot":"","sources":["../../src/code-generator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"code-generator.js","sourceRoot":"","sources":["../../src/code-generator.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/createMock.d.ts
CHANGED
|
@@ -2,6 +2,15 @@ import type { GraphQLSchema } from "graphql/index.js";
|
|
|
2
2
|
import { type RawConfig } from "./config.js";
|
|
3
3
|
import { type TypeInfo } from "./schema-scanner.js";
|
|
4
4
|
export type MockObject = Record<string, unknown>;
|
|
5
|
+
/**
|
|
6
|
+
* Factory function that creates a mock instance for a type.
|
|
7
|
+
* Each call generates a fresh instance with unique IDs.
|
|
8
|
+
* Pass `{ depth: maxDepth }` or higher to get scalar-only fields without recursive expansion.
|
|
9
|
+
*/
|
|
10
|
+
export type MockFactory = (opts?: {
|
|
11
|
+
depth?: number;
|
|
12
|
+
defaultFields?: Record<string, unknown>;
|
|
13
|
+
}) => Record<string, unknown>;
|
|
5
14
|
export type CreateMockOptions = {
|
|
6
15
|
schema: GraphQLSchema;
|
|
7
16
|
} & Partial<RawConfig>;
|
|
@@ -9,6 +18,18 @@ export type CreateMockResult = {
|
|
|
9
18
|
ok: true;
|
|
10
19
|
code: string;
|
|
11
20
|
mock: MockObject;
|
|
21
|
+
/**
|
|
22
|
+
* Factory functions keyed by type name (e.g., "Organization").
|
|
23
|
+
* Each factory creates a fresh mock instance with unique IDs.
|
|
24
|
+
* Used by the server for lazy mock resolution with @graphql-tools/mock.
|
|
25
|
+
*/
|
|
26
|
+
factories: Record<string, MockFactory>;
|
|
27
|
+
/**
|
|
28
|
+
* Fields that are intentionally empty arrays (e.g., @error directive).
|
|
29
|
+
* Map of typeName -> Set of fieldNames.
|
|
30
|
+
* The server should NOT generate list resolvers for these fields.
|
|
31
|
+
*/
|
|
32
|
+
emptyListFields: Map<string, Set<string>>;
|
|
12
33
|
} | {
|
|
13
34
|
ok: false;
|
|
14
35
|
code: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMock.d.ts","sourceRoot":"","sources":["../../src/createMock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACjD,MAAM,MAAM,iBAAiB,GAAG;IAC5B,MAAM,EAAE,aAAa,CAAC;CACzB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"createMock.d.ts","sourceRoot":"","sources":["../../src/createMock.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAElE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACjD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,EAAE;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC9B,MAAM,MAAM,iBAAiB,GAAG;IAC5B,MAAM,EAAE,aAAa,CAAC;CACzB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAmBvB,MAAM,MAAM,gBAAgB,GACtB;IACI,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACvC;;;;OAIG;IACH,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CAC7C,GACD;IACI,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;CAChB,CAAC;AACR;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAU,SAAS,iBAAiB,KAAG,OAAO,CAAC,gBAAgB,CAiErF,CAAC"}
|
package/dist/esm/createMock.js
CHANGED
|
@@ -3,7 +3,22 @@ import { generateCode } from "./code-generator.js";
|
|
|
3
3
|
import { normalizeConfig } from "./config.js";
|
|
4
4
|
import { getTypeInfos } from "./schema-scanner.js";
|
|
5
5
|
const cloneAsJSON = (obj) => {
|
|
6
|
-
|
|
6
|
+
if (obj === null || typeof obj !== "object") {
|
|
7
|
+
return obj;
|
|
8
|
+
}
|
|
9
|
+
if (Array.isArray(obj)) {
|
|
10
|
+
return obj.map((item) => cloneAsJSON(item));
|
|
11
|
+
}
|
|
12
|
+
const result = Object.create(null);
|
|
13
|
+
for (const key of Object.keys(obj)) {
|
|
14
|
+
const value = obj[key];
|
|
15
|
+
// JSON.stringify と同じ: function と undefined をスキップ
|
|
16
|
+
if (typeof value === "function" || typeof value === "undefined") {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
result[key] = cloneAsJSON(value);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
7
22
|
};
|
|
8
23
|
/**
|
|
9
24
|
* Create mock object from schema
|
|
@@ -21,12 +36,42 @@ export const createMock = async (options) => {
|
|
|
21
36
|
// execute code in vm and get all exports
|
|
22
37
|
const exports = {};
|
|
23
38
|
vm.runInNewContext(code, { exports });
|
|
24
|
-
//
|
|
39
|
+
// Separate factory functions and static instances from exports
|
|
40
|
+
const factories = {};
|
|
41
|
+
for (const [key, value] of Object.entries(exports)) {
|
|
42
|
+
if (typeof value === "function" && key.startsWith("create")) {
|
|
43
|
+
const typeName = key.slice("create".length);
|
|
44
|
+
factories[typeName] = value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Detect fields intentionally set to empty arrays (e.g., @error directive).
|
|
48
|
+
// These should not be overridden by lazy list resolvers in the server.
|
|
49
|
+
const emptyListFields = new Map();
|
|
50
|
+
for (const typeInfo of typeInfos) {
|
|
51
|
+
if (typeInfo.type !== "object")
|
|
52
|
+
continue;
|
|
53
|
+
for (const field of typeInfo.fields) {
|
|
54
|
+
if (field.example &&
|
|
55
|
+
"value" in field.example &&
|
|
56
|
+
Array.isArray(field.example.value) &&
|
|
57
|
+
field.example.value.length === 0) {
|
|
58
|
+
let fieldSet = emptyListFields.get(typeInfo.rawName);
|
|
59
|
+
if (!fieldSet) {
|
|
60
|
+
fieldSet = new Set();
|
|
61
|
+
emptyListFields.set(typeInfo.rawName, fieldSet);
|
|
62
|
+
}
|
|
63
|
+
fieldSet.add(field.name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Static instances: strip functions/undefined for backward compatibility
|
|
25
68
|
const plainObject = cloneAsJSON(exports);
|
|
26
69
|
return {
|
|
27
70
|
ok: true,
|
|
28
71
|
code,
|
|
29
72
|
mock: plainObject,
|
|
73
|
+
factories,
|
|
74
|
+
emptyListFields,
|
|
30
75
|
};
|
|
31
76
|
}
|
|
32
77
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMock.js","sourceRoot":"","sources":["../../src/createMock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAiB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"createMock.js","sourceRoot":"","sources":["../../src/createMock.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export type { ConfigWithOutput } from "./code-generator.js";
|
|
|
2
2
|
export { generateCode } from "./code-generator.js";
|
|
3
3
|
export type { Config, MockConfig, RawConfig, RawMockConfig } from "./config.js";
|
|
4
4
|
export { DefaultValues, MockDefaults, normalizeConfig, validateConfig } from "./config.js";
|
|
5
|
-
export type { CreateMockOptions, CreateMockResult, MockObject } from "./createMock.js";
|
|
5
|
+
export type { CreateMockOptions, CreateMockResult, MockFactory, MockObject } from "./createMock.js";
|
|
6
6
|
export { createMock } from "./createMock.js";
|
|
7
7
|
export { EXAMPLE_DIRECTIVE, extendSchema } from "./extend-schema.js";
|
|
8
8
|
export type { ExampleDirectionExpression, ExampleDirective, ExampleDirectiveValue, InterfaceTypeInfo, ObjectTypeInfo, TypeInfo, } from "./schema-scanner.js";
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACpG,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,YAAY,EACR,0BAA0B,EAC1B,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,QAAQ,GACX,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@newmo/graphql-fake-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "GraphQL fake core library",
|
|
6
6
|
"keywords": [
|
|
@@ -63,5 +63,5 @@
|
|
|
63
63
|
"access": "public",
|
|
64
64
|
"registry": "https://registry.npmjs.org/"
|
|
65
65
|
},
|
|
66
|
-
"gitHead": "
|
|
66
|
+
"gitHead": "1e1e1da1f5b88fe3c5355a2e68aa8ad27998dd96"
|
|
67
67
|
}
|
package/src/code-generator.ts
CHANGED
|
@@ -112,7 +112,10 @@ ${functionBodyCode}
|
|
|
112
112
|
function generateDefaultCode(config: ConfigWithOutput, typeInfo: ObjectTypeInfo): string {
|
|
113
113
|
const { rawName } = typeInfo;
|
|
114
114
|
if (config.outputType === "commonjs") {
|
|
115
|
-
|
|
115
|
+
// Pass depth: maxDepth to prevent recursive expansion of nested object types.
|
|
116
|
+
// This creates scalar-only instances, avoiding exponential memory growth.
|
|
117
|
+
// The server uses @graphql-tools/mock to lazily resolve nested types at query time.
|
|
118
|
+
return `const ${rawName} = create${rawName}({ depth: ${config.mock.maxDepth} });
|
|
116
119
|
exports.${rawName} = ${rawName};`;
|
|
117
120
|
}
|
|
118
121
|
return `export const ${rawName} = create${rawName}();`;
|
|
@@ -185,10 +188,18 @@ ${functionBodyCode}
|
|
|
185
188
|
}
|
|
186
189
|
`.trim();
|
|
187
190
|
}
|
|
188
|
-
|
|
191
|
+
if (config.outputType === "commonjs") {
|
|
192
|
+
return `
|
|
189
193
|
function create${rawName}({ defaultFields, depth = 0, typeVisitCount = Object.create(null) } = {}) {
|
|
190
194
|
${functionBodyCode}
|
|
191
|
-
}
|
|
195
|
+
}
|
|
196
|
+
exports.create${rawName} = create${rawName};`;
|
|
197
|
+
}
|
|
198
|
+
return `
|
|
199
|
+
export function create${rawName}({ defaultFields, depth = 0, typeVisitCount = Object.create(null) } = {}) {
|
|
200
|
+
${functionBodyCode}
|
|
201
|
+
}
|
|
202
|
+
`.trimStart();
|
|
192
203
|
}
|
|
193
204
|
|
|
194
205
|
export function generateCode(config: ConfigWithOutput, typeInfos: TypeInfo[]): string {
|
package/src/createMock.ts
CHANGED
|
@@ -5,17 +5,53 @@ import { normalizeConfig, type RawConfig } from "./config.js";
|
|
|
5
5
|
import { getTypeInfos, type TypeInfo } from "./schema-scanner.js";
|
|
6
6
|
|
|
7
7
|
export type MockObject = Record<string, unknown>;
|
|
8
|
+
/**
|
|
9
|
+
* Factory function that creates a mock instance for a type.
|
|
10
|
+
* Each call generates a fresh instance with unique IDs.
|
|
11
|
+
* Pass `{ depth: maxDepth }` or higher to get scalar-only fields without recursive expansion.
|
|
12
|
+
*/
|
|
13
|
+
export type MockFactory = (opts?: {
|
|
14
|
+
depth?: number;
|
|
15
|
+
defaultFields?: Record<string, unknown>;
|
|
16
|
+
}) => Record<string, unknown>;
|
|
8
17
|
export type CreateMockOptions = {
|
|
9
18
|
schema: GraphQLSchema;
|
|
10
19
|
} & Partial<RawConfig>;
|
|
11
|
-
const cloneAsJSON = (obj: unknown) => {
|
|
12
|
-
|
|
20
|
+
const cloneAsJSON = (obj: unknown): unknown => {
|
|
21
|
+
if (obj === null || typeof obj !== "object") {
|
|
22
|
+
return obj;
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(obj)) {
|
|
25
|
+
return obj.map((item) => cloneAsJSON(item));
|
|
26
|
+
}
|
|
27
|
+
const result: Record<string, unknown> = Object.create(null);
|
|
28
|
+
for (const key of Object.keys(obj)) {
|
|
29
|
+
const value = (obj as Record<string, unknown>)[key];
|
|
30
|
+
// JSON.stringify と同じ: function と undefined をスキップ
|
|
31
|
+
if (typeof value === "function" || typeof value === "undefined") {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
result[key] = cloneAsJSON(value);
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
13
37
|
};
|
|
14
38
|
export type CreateMockResult =
|
|
15
39
|
| {
|
|
16
40
|
ok: true;
|
|
17
41
|
code: string;
|
|
18
42
|
mock: MockObject;
|
|
43
|
+
/**
|
|
44
|
+
* Factory functions keyed by type name (e.g., "Organization").
|
|
45
|
+
* Each factory creates a fresh mock instance with unique IDs.
|
|
46
|
+
* Used by the server for lazy mock resolution with @graphql-tools/mock.
|
|
47
|
+
*/
|
|
48
|
+
factories: Record<string, MockFactory>;
|
|
49
|
+
/**
|
|
50
|
+
* Fields that are intentionally empty arrays (e.g., @error directive).
|
|
51
|
+
* Map of typeName -> Set of fieldNames.
|
|
52
|
+
* The server should NOT generate list resolvers for these fields.
|
|
53
|
+
*/
|
|
54
|
+
emptyListFields: Map<string, Set<string>>;
|
|
19
55
|
}
|
|
20
56
|
| {
|
|
21
57
|
ok: false;
|
|
@@ -41,14 +77,48 @@ export const createMock = async (options: CreateMockOptions): Promise<CreateMock
|
|
|
41
77
|
|
|
42
78
|
try {
|
|
43
79
|
// execute code in vm and get all exports
|
|
44
|
-
const exports = {};
|
|
80
|
+
const exports: Record<string, unknown> = {};
|
|
45
81
|
vm.runInNewContext(code, { exports });
|
|
46
|
-
|
|
47
|
-
|
|
82
|
+
|
|
83
|
+
// Separate factory functions and static instances from exports
|
|
84
|
+
const factories: Record<string, MockFactory> = {};
|
|
85
|
+
for (const [key, value] of Object.entries(exports)) {
|
|
86
|
+
if (typeof value === "function" && key.startsWith("create")) {
|
|
87
|
+
const typeName = key.slice("create".length);
|
|
88
|
+
factories[typeName] = value as MockFactory;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Detect fields intentionally set to empty arrays (e.g., @error directive).
|
|
93
|
+
// These should not be overridden by lazy list resolvers in the server.
|
|
94
|
+
const emptyListFields = new Map<string, Set<string>>();
|
|
95
|
+
for (const typeInfo of typeInfos) {
|
|
96
|
+
if (typeInfo.type !== "object") continue;
|
|
97
|
+
for (const field of typeInfo.fields) {
|
|
98
|
+
if (
|
|
99
|
+
field.example &&
|
|
100
|
+
"value" in field.example &&
|
|
101
|
+
Array.isArray(field.example.value) &&
|
|
102
|
+
field.example.value.length === 0
|
|
103
|
+
) {
|
|
104
|
+
let fieldSet = emptyListFields.get(typeInfo.rawName);
|
|
105
|
+
if (!fieldSet) {
|
|
106
|
+
fieldSet = new Set();
|
|
107
|
+
emptyListFields.set(typeInfo.rawName, fieldSet);
|
|
108
|
+
}
|
|
109
|
+
fieldSet.add(field.name);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Static instances: strip functions/undefined for backward compatibility
|
|
115
|
+
const plainObject = cloneAsJSON(exports) as MockObject;
|
|
48
116
|
return {
|
|
49
117
|
ok: true,
|
|
50
118
|
code,
|
|
51
119
|
mock: plainObject,
|
|
120
|
+
factories,
|
|
121
|
+
emptyListFields,
|
|
52
122
|
};
|
|
53
123
|
} catch (error) {
|
|
54
124
|
return {
|
package/src/index.ts
CHANGED
|
@@ -2,7 +2,7 @@ export type { ConfigWithOutput } from "./code-generator.js";
|
|
|
2
2
|
export { generateCode } from "./code-generator.js";
|
|
3
3
|
export type { Config, MockConfig, RawConfig, RawMockConfig } from "./config.js";
|
|
4
4
|
export { DefaultValues, MockDefaults, normalizeConfig, validateConfig } from "./config.js";
|
|
5
|
-
export type { CreateMockOptions, CreateMockResult, MockObject } from "./createMock.js";
|
|
5
|
+
export type { CreateMockOptions, CreateMockResult, MockFactory, MockObject } from "./createMock.js";
|
|
6
6
|
export { createMock } from "./createMock.js";
|
|
7
7
|
export { EXAMPLE_DIRECTIVE, extendSchema } from "./extend-schema.js";
|
|
8
8
|
export type {
|