@uniforge/testing 0.1.0-alpha.2

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.
Files changed (85) hide show
  1. package/dist/auth/index.d.cts +177 -0
  2. package/dist/auth/index.d.ts +177 -0
  3. package/dist/auth/index.js +459 -0
  4. package/dist/auth/index.js.map +1 -0
  5. package/dist/auth/index.mjs +418 -0
  6. package/dist/auth/index.mjs.map +1 -0
  7. package/dist/billing/index.d.cts +27 -0
  8. package/dist/billing/index.d.ts +27 -0
  9. package/dist/billing/index.js +208 -0
  10. package/dist/billing/index.js.map +1 -0
  11. package/dist/billing/index.mjs +178 -0
  12. package/dist/billing/index.mjs.map +1 -0
  13. package/dist/database/index.d.cts +399 -0
  14. package/dist/database/index.d.ts +399 -0
  15. package/dist/database/index.js +19054 -0
  16. package/dist/database/index.js.map +1 -0
  17. package/dist/database/index.mjs +19046 -0
  18. package/dist/database/index.mjs.map +1 -0
  19. package/dist/graphql/index.d.cts +23 -0
  20. package/dist/graphql/index.d.ts +23 -0
  21. package/dist/graphql/index.js +18511 -0
  22. package/dist/graphql/index.js.map +1 -0
  23. package/dist/graphql/index.mjs +18505 -0
  24. package/dist/graphql/index.mjs.map +1 -0
  25. package/dist/index.d.cts +10 -0
  26. package/dist/index.d.ts +10 -0
  27. package/dist/index.js +31 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/index.mjs +6 -0
  30. package/dist/index.mjs.map +1 -0
  31. package/dist/multi-store/index.d.cts +66 -0
  32. package/dist/multi-store/index.d.ts +66 -0
  33. package/dist/multi-store/index.js +319 -0
  34. package/dist/multi-store/index.js.map +1 -0
  35. package/dist/multi-store/index.mjs +287 -0
  36. package/dist/multi-store/index.mjs.map +1 -0
  37. package/dist/multi-tenant/index.d.cts +15 -0
  38. package/dist/multi-tenant/index.d.ts +15 -0
  39. package/dist/multi-tenant/index.js +87 -0
  40. package/dist/multi-tenant/index.js.map +1 -0
  41. package/dist/multi-tenant/index.mjs +57 -0
  42. package/dist/multi-tenant/index.mjs.map +1 -0
  43. package/dist/performance/index.d.cts +60 -0
  44. package/dist/performance/index.d.ts +60 -0
  45. package/dist/performance/index.js +280 -0
  46. package/dist/performance/index.js.map +1 -0
  47. package/dist/performance/index.mjs +246 -0
  48. package/dist/performance/index.mjs.map +1 -0
  49. package/dist/platform/index.d.cts +71 -0
  50. package/dist/platform/index.d.ts +71 -0
  51. package/dist/platform/index.js +435 -0
  52. package/dist/platform/index.js.map +1 -0
  53. package/dist/platform/index.mjs +396 -0
  54. package/dist/platform/index.mjs.map +1 -0
  55. package/dist/rbac/index.d.cts +21 -0
  56. package/dist/rbac/index.d.ts +21 -0
  57. package/dist/rbac/index.js +178 -0
  58. package/dist/rbac/index.js.map +1 -0
  59. package/dist/rbac/index.mjs +150 -0
  60. package/dist/rbac/index.mjs.map +1 -0
  61. package/dist/security/index.d.cts +73 -0
  62. package/dist/security/index.d.ts +73 -0
  63. package/dist/security/index.js +246 -0
  64. package/dist/security/index.js.map +1 -0
  65. package/dist/security/index.mjs +211 -0
  66. package/dist/security/index.mjs.map +1 -0
  67. package/dist/shopify-api/index.d.cts +139 -0
  68. package/dist/shopify-api/index.d.ts +139 -0
  69. package/dist/shopify-api/index.js +469 -0
  70. package/dist/shopify-api/index.js.map +1 -0
  71. package/dist/shopify-api/index.mjs +439 -0
  72. package/dist/shopify-api/index.mjs.map +1 -0
  73. package/dist/shopify-compliance/index.d.cts +85 -0
  74. package/dist/shopify-compliance/index.d.ts +85 -0
  75. package/dist/shopify-compliance/index.js +287 -0
  76. package/dist/shopify-compliance/index.js.map +1 -0
  77. package/dist/shopify-compliance/index.mjs +259 -0
  78. package/dist/shopify-compliance/index.mjs.map +1 -0
  79. package/dist/webhooks/index.d.cts +127 -0
  80. package/dist/webhooks/index.d.ts +127 -0
  81. package/dist/webhooks/index.js +18934 -0
  82. package/dist/webhooks/index.js.map +1 -0
  83. package/dist/webhooks/index.mjs +18916 -0
  84. package/dist/webhooks/index.mjs.map +1 -0
  85. package/package.json +112 -0
@@ -0,0 +1,211 @@
1
+ // src/security/factories.ts
2
+ function createTestSecurityHeadersConfig(overrides) {
3
+ const defaults = {
4
+ hsts: true,
5
+ noSniff: true,
6
+ frameOptions: "DENY",
7
+ xssProtection: true,
8
+ referrerPolicy: "strict-origin-when-cross-origin"
9
+ };
10
+ const result = { ...defaults, ...overrides };
11
+ return result;
12
+ }
13
+ function createTestCSPDirectives(overrides) {
14
+ const defaults = {
15
+ defaultSrc: ["'self'"],
16
+ scriptSrc: ["'self'"],
17
+ styleSrc: ["'self'"],
18
+ imgSrc: ["'self'"],
19
+ connectSrc: ["'self'"],
20
+ fontSrc: ["'self'"],
21
+ frameSrc: ["'self'"],
22
+ frameAncestors: ["'self'"]
23
+ };
24
+ return { ...defaults, ...overrides };
25
+ }
26
+ function createTestRateLimitConfig(overrides) {
27
+ const defaults = {
28
+ windowMs: 6e4,
29
+ maxRequests: 100
30
+ };
31
+ const result = { ...defaults };
32
+ if (overrides?.windowMs !== void 0) {
33
+ result.windowMs = overrides.windowMs;
34
+ }
35
+ if (overrides?.maxRequests !== void 0) {
36
+ result.maxRequests = overrides.maxRequests;
37
+ }
38
+ if (overrides?.keyPrefix !== void 0) {
39
+ result.keyPrefix = overrides.keyPrefix;
40
+ }
41
+ return result;
42
+ }
43
+ function createTestAuditFinding(overrides) {
44
+ const defaults = {
45
+ id: "TEST-001",
46
+ severity: "medium",
47
+ category: "test",
48
+ title: "Test finding",
49
+ description: "A test security finding for unit tests.",
50
+ recommendation: "Address this finding in a test environment."
51
+ };
52
+ return { ...defaults, ...overrides };
53
+ }
54
+ function createTestAuditResult(overrides) {
55
+ const defaults = {
56
+ passed: true,
57
+ score: 100,
58
+ findings: [],
59
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
60
+ };
61
+ return { ...defaults, ...overrides };
62
+ }
63
+ function createTestValidationRule(overrides) {
64
+ const defaults = {
65
+ field: "testField",
66
+ type: "string"
67
+ };
68
+ const result = { ...defaults };
69
+ if (overrides?.field !== void 0) {
70
+ result.field = overrides.field;
71
+ }
72
+ if (overrides?.type !== void 0) {
73
+ result.type = overrides.type;
74
+ }
75
+ if (overrides?.required !== void 0) {
76
+ result.required = overrides.required;
77
+ }
78
+ if (overrides?.maxLength !== void 0) {
79
+ result.maxLength = overrides.maxLength;
80
+ }
81
+ if (overrides?.pattern !== void 0) {
82
+ result.pattern = overrides.pattern;
83
+ }
84
+ if (overrides?.message !== void 0) {
85
+ result.message = overrides.message;
86
+ }
87
+ return result;
88
+ }
89
+ function createTestSanitizeOptions(overrides) {
90
+ const defaults = {
91
+ stripHtml: true
92
+ };
93
+ const result = { ...defaults };
94
+ if (overrides?.stripHtml !== void 0) {
95
+ result.stripHtml = overrides.stripHtml;
96
+ }
97
+ if (overrides?.maxLength !== void 0) {
98
+ result.maxLength = overrides.maxLength;
99
+ }
100
+ if (overrides?.allowedPattern !== void 0) {
101
+ result.allowedPattern = overrides.allowedPattern;
102
+ }
103
+ return result;
104
+ }
105
+
106
+ // src/security/mock-input-validator.ts
107
+ var MockInputValidator = class {
108
+ /** Recorded validate() calls for assertions. */
109
+ validateCalls = [];
110
+ /** Recorded sanitize() calls for assertions. */
111
+ sanitizeCalls = [];
112
+ /** Configurable return value for validate(). */
113
+ validateResult = {
114
+ valid: true,
115
+ errors: [],
116
+ sanitized: {}
117
+ };
118
+ /** Configurable return value for sanitize(). When set, overrides the default passthrough. */
119
+ sanitizeReturnValue;
120
+ validate(input, rules) {
121
+ this.validateCalls.push({ input, rules });
122
+ return this.validateResult;
123
+ }
124
+ sanitize(value, options) {
125
+ const callRecord = { value };
126
+ if (options) {
127
+ callRecord.options = options;
128
+ }
129
+ this.sanitizeCalls.push(callRecord);
130
+ if (this.sanitizeReturnValue !== void 0) {
131
+ return this.sanitizeReturnValue;
132
+ }
133
+ return value;
134
+ }
135
+ isValidShopDomain(domain) {
136
+ return domain.endsWith(".myshopify.com");
137
+ }
138
+ isValidEmail(email) {
139
+ return email.includes("@");
140
+ }
141
+ isValidUrl(url) {
142
+ return url.startsWith("http");
143
+ }
144
+ isValidApiKey(key) {
145
+ return key.length >= 32;
146
+ }
147
+ /** Reset all recorded calls and configurable values. */
148
+ _reset() {
149
+ this.validateCalls = [];
150
+ this.sanitizeCalls = [];
151
+ this.validateResult = { valid: true, errors: [], sanitized: {} };
152
+ this.sanitizeReturnValue = void 0;
153
+ }
154
+ };
155
+
156
+ // src/security/mock-rate-limiter.ts
157
+ var MockRateLimiter = class {
158
+ config;
159
+ /** Recorded keys passed to check(). */
160
+ checkCalls = [];
161
+ /** Recorded keys passed to reset(). */
162
+ resetCalls = [];
163
+ /** When true, all requests are allowed. When false, all are denied. */
164
+ allowAll = true;
165
+ constructor(config) {
166
+ this.config = {
167
+ windowMs: config?.windowMs ?? 6e4,
168
+ maxRequests: config?.maxRequests ?? 100
169
+ };
170
+ if (config?.keyPrefix !== void 0) {
171
+ this.config.keyPrefix = config.keyPrefix;
172
+ }
173
+ }
174
+ async check(key) {
175
+ this.checkCalls.push(key);
176
+ if (this.allowAll) {
177
+ return {
178
+ allowed: true,
179
+ remaining: 10,
180
+ resetAt: Date.now() + 6e4
181
+ };
182
+ }
183
+ return {
184
+ allowed: false,
185
+ remaining: 0,
186
+ resetAt: Date.now() + 6e4,
187
+ retryAfter: 3e4
188
+ };
189
+ }
190
+ async reset(key) {
191
+ this.resetCalls.push(key);
192
+ }
193
+ /** Reset all recorded calls and restore default behavior. */
194
+ _reset() {
195
+ this.checkCalls = [];
196
+ this.resetCalls = [];
197
+ this.allowAll = true;
198
+ }
199
+ };
200
+ export {
201
+ MockInputValidator,
202
+ MockRateLimiter,
203
+ createTestAuditFinding,
204
+ createTestAuditResult,
205
+ createTestCSPDirectives,
206
+ createTestRateLimitConfig,
207
+ createTestSanitizeOptions,
208
+ createTestSecurityHeadersConfig,
209
+ createTestValidationRule
210
+ };
211
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/security/factories.ts","../../src/security/mock-input-validator.ts","../../src/security/mock-rate-limiter.ts"],"sourcesContent":["/**\n * Test data factories for security types.\n *\n * Each factory provides sensible defaults that can be overridden.\n */\n\nimport type {\n SecurityHeadersConfig,\n CSPDirectives,\n RateLimitConfig,\n SecurityAuditFinding,\n SecurityAuditResult,\n InputValidationRule,\n SanitizeOptions,\n} from '@uniforge/platform-core/security';\n\nexport function createTestSecurityHeadersConfig(\n overrides?: Partial<SecurityHeadersConfig>,\n): SecurityHeadersConfig {\n const defaults: SecurityHeadersConfig = {\n hsts: true,\n noSniff: true,\n frameOptions: 'DENY',\n xssProtection: true,\n referrerPolicy: 'strict-origin-when-cross-origin',\n };\n\n const result: SecurityHeadersConfig = { ...defaults, ...overrides };\n return result;\n}\n\nexport function createTestCSPDirectives(\n overrides?: Partial<CSPDirectives>,\n): CSPDirectives {\n const defaults: CSPDirectives = {\n defaultSrc: [\"'self'\"],\n scriptSrc: [\"'self'\"],\n styleSrc: [\"'self'\"],\n imgSrc: [\"'self'\"],\n connectSrc: [\"'self'\"],\n fontSrc: [\"'self'\"],\n frameSrc: [\"'self'\"],\n frameAncestors: [\"'self'\"],\n };\n\n return { ...defaults, ...overrides };\n}\n\nexport function createTestRateLimitConfig(\n overrides?: Partial<RateLimitConfig>,\n): RateLimitConfig {\n const defaults: RateLimitConfig = {\n windowMs: 60000,\n maxRequests: 100,\n };\n\n const result: RateLimitConfig = { ...defaults };\n\n if (overrides?.windowMs !== undefined) {\n result.windowMs = overrides.windowMs;\n }\n if (overrides?.maxRequests !== undefined) {\n result.maxRequests = overrides.maxRequests;\n }\n if (overrides?.keyPrefix !== undefined) {\n result.keyPrefix = overrides.keyPrefix;\n }\n\n return result;\n}\n\nexport function createTestAuditFinding(\n overrides?: Partial<SecurityAuditFinding>,\n): SecurityAuditFinding {\n const defaults: SecurityAuditFinding = {\n id: 'TEST-001',\n severity: 'medium',\n category: 'test',\n title: 'Test finding',\n description: 'A test security finding for unit tests.',\n recommendation: 'Address this finding in a test environment.',\n };\n\n return { ...defaults, ...overrides };\n}\n\nexport function createTestAuditResult(\n overrides?: Partial<SecurityAuditResult>,\n): SecurityAuditResult {\n const defaults: SecurityAuditResult = {\n passed: true,\n score: 100,\n findings: [],\n timestamp: new Date().toISOString(),\n };\n\n return { ...defaults, ...overrides };\n}\n\nexport function createTestValidationRule(\n overrides?: Partial<InputValidationRule>,\n): InputValidationRule {\n const defaults: InputValidationRule = {\n field: 'testField',\n type: 'string',\n };\n\n const result: InputValidationRule = { ...defaults };\n\n if (overrides?.field !== undefined) {\n result.field = overrides.field;\n }\n if (overrides?.type !== undefined) {\n result.type = overrides.type;\n }\n if (overrides?.required !== undefined) {\n result.required = overrides.required;\n }\n if (overrides?.maxLength !== undefined) {\n result.maxLength = overrides.maxLength;\n }\n if (overrides?.pattern !== undefined) {\n result.pattern = overrides.pattern;\n }\n if (overrides?.message !== undefined) {\n result.message = overrides.message;\n }\n\n return result;\n}\n\nexport function createTestSanitizeOptions(\n overrides?: Partial<SanitizeOptions>,\n): SanitizeOptions {\n const defaults: SanitizeOptions = {\n stripHtml: true,\n };\n\n const result: SanitizeOptions = { ...defaults };\n\n if (overrides?.stripHtml !== undefined) {\n result.stripHtml = overrides.stripHtml;\n }\n if (overrides?.maxLength !== undefined) {\n result.maxLength = overrides.maxLength;\n }\n if (overrides?.allowedPattern !== undefined) {\n result.allowedPattern = overrides.allowedPattern;\n }\n\n return result;\n}\n","/**\n * Mock InputValidator for unit testing.\n *\n * Provides a configurable in-memory implementation of InputValidator\n * that tracks all calls for test assertions.\n */\n\nimport type {\n InputValidator,\n InputValidationRule,\n InputValidationResult,\n SanitizeOptions,\n} from '@uniforge/platform-core/security';\n\nexport interface ValidateCallRecord {\n input: Record<string, unknown>;\n rules: InputValidationRule[];\n}\n\nexport interface SanitizeCallRecord {\n value: string;\n options?: SanitizeOptions;\n}\n\nexport class MockInputValidator implements InputValidator {\n /** Recorded validate() calls for assertions. */\n validateCalls: ValidateCallRecord[] = [];\n\n /** Recorded sanitize() calls for assertions. */\n sanitizeCalls: SanitizeCallRecord[] = [];\n\n /** Configurable return value for validate(). */\n validateResult: InputValidationResult = {\n valid: true,\n errors: [],\n sanitized: {},\n };\n\n /** Configurable return value for sanitize(). When set, overrides the default passthrough. */\n sanitizeReturnValue: string | undefined;\n\n validate(\n input: Record<string, unknown>,\n rules: InputValidationRule[],\n ): InputValidationResult {\n this.validateCalls.push({ input, rules });\n return this.validateResult;\n }\n\n sanitize(value: string, options?: SanitizeOptions): string {\n const callRecord: SanitizeCallRecord = { value };\n if (options) {\n callRecord.options = options;\n }\n this.sanitizeCalls.push(callRecord);\n if (this.sanitizeReturnValue !== undefined) {\n return this.sanitizeReturnValue;\n }\n return value;\n }\n\n isValidShopDomain(domain: string): boolean {\n return domain.endsWith('.myshopify.com');\n }\n\n isValidEmail(email: string): boolean {\n return email.includes('@');\n }\n\n isValidUrl(url: string): boolean {\n return url.startsWith('http');\n }\n\n isValidApiKey(key: string): boolean {\n return key.length >= 32;\n }\n\n /** Reset all recorded calls and configurable values. */\n _reset(): void {\n this.validateCalls = [];\n this.sanitizeCalls = [];\n this.validateResult = { valid: true, errors: [], sanitized: {} };\n this.sanitizeReturnValue = undefined;\n }\n}\n","/**\n * Mock RequestRateLimiter for unit testing.\n *\n * Provides an in-memory rate limiter that can be configured to\n * allow or deny all requests, with call tracking for assertions.\n */\n\nimport type {\n RequestRateLimiter,\n RateLimitConfig,\n RateLimitResult,\n} from '@uniforge/platform-core/security';\n\nexport class MockRateLimiter implements RequestRateLimiter {\n readonly config: RateLimitConfig;\n\n /** Recorded keys passed to check(). */\n checkCalls: string[] = [];\n\n /** Recorded keys passed to reset(). */\n resetCalls: string[] = [];\n\n /** When true, all requests are allowed. When false, all are denied. */\n allowAll = true;\n\n constructor(config?: Partial<RateLimitConfig>) {\n this.config = {\n windowMs: config?.windowMs ?? 60000,\n maxRequests: config?.maxRequests ?? 100,\n };\n if (config?.keyPrefix !== undefined) {\n (this.config as { keyPrefix: string }).keyPrefix = config.keyPrefix;\n }\n }\n\n async check(key: string): Promise<RateLimitResult> {\n this.checkCalls.push(key);\n\n if (this.allowAll) {\n return {\n allowed: true,\n remaining: 10,\n resetAt: Date.now() + 60000,\n };\n }\n\n return {\n allowed: false,\n remaining: 0,\n resetAt: Date.now() + 60000,\n retryAfter: 30000,\n };\n }\n\n async reset(key: string): Promise<void> {\n this.resetCalls.push(key);\n }\n\n /** Reset all recorded calls and restore default behavior. */\n _reset(): void {\n this.checkCalls = [];\n this.resetCalls = [];\n this.allowAll = true;\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,139 @@
1
+ interface MockShopifyServerConfig {
2
+ port?: number;
3
+ apiVersion?: string;
4
+ defaultShop?: string;
5
+ latencyMs?: number;
6
+ }
7
+ interface MockServerRequest {
8
+ method: string;
9
+ path: string;
10
+ headers: Record<string, string>;
11
+ body: unknown;
12
+ query: Record<string, string>;
13
+ timestamp: Date;
14
+ }
15
+ interface GraphQLResponseConfig {
16
+ data?: unknown;
17
+ errors?: Array<{
18
+ message: string;
19
+ locations?: Array<{
20
+ line: number;
21
+ column: number;
22
+ }>;
23
+ path?: Array<string | number>;
24
+ }>;
25
+ extensions?: {
26
+ cost?: {
27
+ requestedQueryCost: number;
28
+ actualQueryCost: number;
29
+ throttleStatus: {
30
+ maximumAvailable: number;
31
+ currentlyAvailable: number;
32
+ restoreRate: number;
33
+ };
34
+ };
35
+ };
36
+ }
37
+ interface RESTResponseConfig {
38
+ status?: number;
39
+ body?: unknown;
40
+ headers?: Record<string, string>;
41
+ }
42
+ interface OAuthConfig {
43
+ accessToken?: string;
44
+ scope?: string;
45
+ expiresIn?: number;
46
+ associatedUser?: {
47
+ id: number;
48
+ firstName: string;
49
+ lastName: string;
50
+ email: string;
51
+ emailVerified: boolean;
52
+ accountOwner: boolean;
53
+ locale: string;
54
+ collaborator: boolean;
55
+ };
56
+ }
57
+
58
+ declare class GraphQLHandler {
59
+ private operations;
60
+ private sequences;
61
+ private queryPatterns;
62
+ private defaultResponse;
63
+ private rateLimitConfig;
64
+ onOperation(operationName: string, response: GraphQLResponseConfig): void;
65
+ onQuery(queryPattern: string | RegExp, response: GraphQLResponseConfig): void;
66
+ onOperationSequence(operationName: string, responses: GraphQLResponseConfig[]): void;
67
+ enableRateLimiting(config?: {
68
+ maxCost?: number;
69
+ restoreRate?: number;
70
+ }): void;
71
+ disableRateLimiting(): void;
72
+ setDefaultResponse(response: GraphQLResponseConfig): void;
73
+ handle(body: {
74
+ query: string;
75
+ variables?: Record<string, unknown>;
76
+ operationName?: string;
77
+ }): GraphQLResponseConfig;
78
+ reset(): void;
79
+ private extractOperationName;
80
+ private restoreBudget;
81
+ private applyRateLimiting;
82
+ }
83
+
84
+ declare class RESTHandler {
85
+ private routes;
86
+ onRequest(method: string, pathPattern: string | RegExp, response: RESTResponseConfig): void;
87
+ onGet(pathPattern: string | RegExp, response: RESTResponseConfig): void;
88
+ onPost(pathPattern: string | RegExp, response: RESTResponseConfig): void;
89
+ onPut(pathPattern: string | RegExp, response: RESTResponseConfig): void;
90
+ onDelete(pathPattern: string | RegExp, response: RESTResponseConfig): void;
91
+ handle(method: string, path: string, _body?: unknown): RESTResponseConfig;
92
+ reset(): void;
93
+ }
94
+
95
+ declare class OAuthHandler {
96
+ private config;
97
+ private generatedCodes;
98
+ constructor(config?: OAuthConfig);
99
+ configure(config: OAuthConfig): void;
100
+ handleAuthorize(query: Record<string, string>): {
101
+ redirectUrl: string;
102
+ code: string;
103
+ };
104
+ handleAccessToken(_body: Record<string, string>): {
105
+ status: number;
106
+ body: unknown;
107
+ };
108
+ handleTokenExchange(_body: Record<string, string>): {
109
+ status: number;
110
+ body: unknown;
111
+ };
112
+ reset(): void;
113
+ }
114
+
115
+ declare class MockShopifyServer {
116
+ readonly graphql: GraphQLHandler;
117
+ readonly rest: RESTHandler;
118
+ readonly oauth: OAuthHandler;
119
+ private server;
120
+ private serverPort;
121
+ private readonly config;
122
+ private requests;
123
+ constructor(config?: MockShopifyServerConfig);
124
+ start(): Promise<{
125
+ port: number;
126
+ url: string;
127
+ }>;
128
+ stop(): Promise<void>;
129
+ get url(): string;
130
+ get port(): number;
131
+ getRequests(): MockServerRequest[];
132
+ getLastRequest(): MockServerRequest | undefined;
133
+ getRequestsByPath(pathPattern: string | RegExp): MockServerRequest[];
134
+ clearRequests(): void;
135
+ reset(): void;
136
+ private handleRequest;
137
+ }
138
+
139
+ export { GraphQLHandler, type GraphQLResponseConfig, type MockServerRequest, MockShopifyServer, type MockShopifyServerConfig, type OAuthConfig, OAuthHandler, RESTHandler, type RESTResponseConfig };
@@ -0,0 +1,139 @@
1
+ interface MockShopifyServerConfig {
2
+ port?: number;
3
+ apiVersion?: string;
4
+ defaultShop?: string;
5
+ latencyMs?: number;
6
+ }
7
+ interface MockServerRequest {
8
+ method: string;
9
+ path: string;
10
+ headers: Record<string, string>;
11
+ body: unknown;
12
+ query: Record<string, string>;
13
+ timestamp: Date;
14
+ }
15
+ interface GraphQLResponseConfig {
16
+ data?: unknown;
17
+ errors?: Array<{
18
+ message: string;
19
+ locations?: Array<{
20
+ line: number;
21
+ column: number;
22
+ }>;
23
+ path?: Array<string | number>;
24
+ }>;
25
+ extensions?: {
26
+ cost?: {
27
+ requestedQueryCost: number;
28
+ actualQueryCost: number;
29
+ throttleStatus: {
30
+ maximumAvailable: number;
31
+ currentlyAvailable: number;
32
+ restoreRate: number;
33
+ };
34
+ };
35
+ };
36
+ }
37
+ interface RESTResponseConfig {
38
+ status?: number;
39
+ body?: unknown;
40
+ headers?: Record<string, string>;
41
+ }
42
+ interface OAuthConfig {
43
+ accessToken?: string;
44
+ scope?: string;
45
+ expiresIn?: number;
46
+ associatedUser?: {
47
+ id: number;
48
+ firstName: string;
49
+ lastName: string;
50
+ email: string;
51
+ emailVerified: boolean;
52
+ accountOwner: boolean;
53
+ locale: string;
54
+ collaborator: boolean;
55
+ };
56
+ }
57
+
58
+ declare class GraphQLHandler {
59
+ private operations;
60
+ private sequences;
61
+ private queryPatterns;
62
+ private defaultResponse;
63
+ private rateLimitConfig;
64
+ onOperation(operationName: string, response: GraphQLResponseConfig): void;
65
+ onQuery(queryPattern: string | RegExp, response: GraphQLResponseConfig): void;
66
+ onOperationSequence(operationName: string, responses: GraphQLResponseConfig[]): void;
67
+ enableRateLimiting(config?: {
68
+ maxCost?: number;
69
+ restoreRate?: number;
70
+ }): void;
71
+ disableRateLimiting(): void;
72
+ setDefaultResponse(response: GraphQLResponseConfig): void;
73
+ handle(body: {
74
+ query: string;
75
+ variables?: Record<string, unknown>;
76
+ operationName?: string;
77
+ }): GraphQLResponseConfig;
78
+ reset(): void;
79
+ private extractOperationName;
80
+ private restoreBudget;
81
+ private applyRateLimiting;
82
+ }
83
+
84
+ declare class RESTHandler {
85
+ private routes;
86
+ onRequest(method: string, pathPattern: string | RegExp, response: RESTResponseConfig): void;
87
+ onGet(pathPattern: string | RegExp, response: RESTResponseConfig): void;
88
+ onPost(pathPattern: string | RegExp, response: RESTResponseConfig): void;
89
+ onPut(pathPattern: string | RegExp, response: RESTResponseConfig): void;
90
+ onDelete(pathPattern: string | RegExp, response: RESTResponseConfig): void;
91
+ handle(method: string, path: string, _body?: unknown): RESTResponseConfig;
92
+ reset(): void;
93
+ }
94
+
95
+ declare class OAuthHandler {
96
+ private config;
97
+ private generatedCodes;
98
+ constructor(config?: OAuthConfig);
99
+ configure(config: OAuthConfig): void;
100
+ handleAuthorize(query: Record<string, string>): {
101
+ redirectUrl: string;
102
+ code: string;
103
+ };
104
+ handleAccessToken(_body: Record<string, string>): {
105
+ status: number;
106
+ body: unknown;
107
+ };
108
+ handleTokenExchange(_body: Record<string, string>): {
109
+ status: number;
110
+ body: unknown;
111
+ };
112
+ reset(): void;
113
+ }
114
+
115
+ declare class MockShopifyServer {
116
+ readonly graphql: GraphQLHandler;
117
+ readonly rest: RESTHandler;
118
+ readonly oauth: OAuthHandler;
119
+ private server;
120
+ private serverPort;
121
+ private readonly config;
122
+ private requests;
123
+ constructor(config?: MockShopifyServerConfig);
124
+ start(): Promise<{
125
+ port: number;
126
+ url: string;
127
+ }>;
128
+ stop(): Promise<void>;
129
+ get url(): string;
130
+ get port(): number;
131
+ getRequests(): MockServerRequest[];
132
+ getLastRequest(): MockServerRequest | undefined;
133
+ getRequestsByPath(pathPattern: string | RegExp): MockServerRequest[];
134
+ clearRequests(): void;
135
+ reset(): void;
136
+ private handleRequest;
137
+ }
138
+
139
+ export { GraphQLHandler, type GraphQLResponseConfig, type MockServerRequest, MockShopifyServer, type MockShopifyServerConfig, type OAuthConfig, OAuthHandler, RESTHandler, type RESTResponseConfig };