@plumbus/ui 0.1.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.
Files changed (49) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/generators/__tests__/auth-generator.test.d.ts +2 -0
  3. package/dist/generators/__tests__/auth-generator.test.d.ts.map +1 -0
  4. package/dist/generators/__tests__/auth-generator.test.js +222 -0
  5. package/dist/generators/__tests__/auth-generator.test.js.map +1 -0
  6. package/dist/generators/__tests__/client-generator.test.d.ts +2 -0
  7. package/dist/generators/__tests__/client-generator.test.d.ts.map +1 -0
  8. package/dist/generators/__tests__/client-generator.test.js +224 -0
  9. package/dist/generators/__tests__/client-generator.test.js.map +1 -0
  10. package/dist/generators/__tests__/form-generator.test.d.ts +2 -0
  11. package/dist/generators/__tests__/form-generator.test.d.ts.map +1 -0
  12. package/dist/generators/__tests__/form-generator.test.js +192 -0
  13. package/dist/generators/__tests__/form-generator.test.js.map +1 -0
  14. package/dist/generators/__tests__/nextjs-template.test.d.ts +2 -0
  15. package/dist/generators/__tests__/nextjs-template.test.d.ts.map +1 -0
  16. package/dist/generators/__tests__/nextjs-template.test.js +214 -0
  17. package/dist/generators/__tests__/nextjs-template.test.js.map +1 -0
  18. package/dist/generators/auth-generator.d.ts +31 -0
  19. package/dist/generators/auth-generator.d.ts.map +1 -0
  20. package/dist/generators/auth-generator.js +292 -0
  21. package/dist/generators/auth-generator.js.map +1 -0
  22. package/dist/generators/client-generator.d.ts +31 -0
  23. package/dist/generators/client-generator.d.ts.map +1 -0
  24. package/dist/generators/client-generator.js +336 -0
  25. package/dist/generators/client-generator.js.map +1 -0
  26. package/dist/generators/form-generator.d.ts +47 -0
  27. package/dist/generators/form-generator.d.ts.map +1 -0
  28. package/dist/generators/form-generator.js +189 -0
  29. package/dist/generators/form-generator.js.map +1 -0
  30. package/dist/generators/index.d.ts +9 -0
  31. package/dist/generators/index.d.ts.map +1 -0
  32. package/dist/generators/index.js +6 -0
  33. package/dist/generators/index.js.map +1 -0
  34. package/dist/generators/nextjs-template.d.ts +44 -0
  35. package/dist/generators/nextjs-template.d.ts.map +1 -0
  36. package/dist/generators/nextjs-template.js +444 -0
  37. package/dist/generators/nextjs-template.js.map +1 -0
  38. package/dist/index.d.ts +9 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +11 -0
  41. package/dist/index.js.map +1 -0
  42. package/instructions/auth-generator.md +154 -0
  43. package/instructions/client-generator.md +149 -0
  44. package/instructions/form-generator.md +157 -0
  45. package/instructions/framework.md +108 -0
  46. package/instructions/nextjs-template.md +160 -0
  47. package/instructions/patterns.md +109 -0
  48. package/instructions/testing.md +211 -0
  49. package/package.json +52 -0
@@ -0,0 +1 @@
1
+ {"root":["../src/index.ts","../src/generators/auth-generator.ts","../src/generators/client-generator.ts","../src/generators/form-generator.ts","../src/generators/index.ts","../src/generators/nextjs-template.ts","../src/generators/__tests__/auth-generator.test.ts","../src/generators/__tests__/client-generator.test.ts","../src/generators/__tests__/form-generator.test.ts","../src/generators/__tests__/nextjs-template.test.ts"],"version":"5.9.3"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth-generator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-generator.test.d.ts","sourceRoot":"","sources":["../../../src/generators/__tests__/auth-generator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,222 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { generateAuthFunctions, generateAuthModule, generateAuthTypes, generateRouteGuard, generateTenantContext, generateTokenUtils, generateUseAuthHook, generateUseCurrentUserHook, } from '../auth-generator.js';
3
+ // ── generateAuthTypes ──
4
+ describe('generateAuthTypes', () => {
5
+ it('generates AuthUser interface', () => {
6
+ const code = generateAuthTypes();
7
+ expect(code).toContain('export interface AuthUser');
8
+ expect(code).toContain('userId: string');
9
+ expect(code).toContain('roles: string[]');
10
+ expect(code).toContain('scopes: string[]');
11
+ expect(code).toContain('tenantId?: string');
12
+ expect(code).toContain('provider: string');
13
+ });
14
+ it('generates AuthState interface', () => {
15
+ const code = generateAuthTypes();
16
+ expect(code).toContain('export interface AuthState');
17
+ expect(code).toContain('user: AuthUser | null');
18
+ expect(code).toContain('isAuthenticated: boolean');
19
+ expect(code).toContain('isLoading: boolean');
20
+ expect(code).toContain('error: Error | null');
21
+ });
22
+ it('generates LoginCredentials interface', () => {
23
+ const code = generateAuthTypes();
24
+ expect(code).toContain('export interface LoginCredentials');
25
+ expect(code).toContain('email?: string');
26
+ expect(code).toContain('password?: string');
27
+ });
28
+ it('generates AuthActions interface', () => {
29
+ const code = generateAuthTypes();
30
+ expect(code).toContain('export interface AuthActions');
31
+ expect(code).toContain('login(credentials: LoginCredentials): Promise<void>');
32
+ expect(code).toContain('logout(): Promise<void>');
33
+ expect(code).toContain('refreshSession(): Promise<void>');
34
+ expect(code).toContain('getToken(): string | null');
35
+ });
36
+ });
37
+ // ── generateTokenUtils ──
38
+ describe('generateTokenUtils', () => {
39
+ it('generates token storage functions', () => {
40
+ const code = generateTokenUtils();
41
+ expect(code).toContain('export function getStoredToken');
42
+ expect(code).toContain('export function setStoredToken');
43
+ expect(code).toContain('export function clearStoredToken');
44
+ expect(code).toContain('localStorage');
45
+ });
46
+ it('uses default token key', () => {
47
+ const code = generateTokenUtils();
48
+ expect(code).toContain('TOKEN_KEY = "plumbus_auth_token"');
49
+ });
50
+ it('uses custom token key from config', () => {
51
+ const code = generateTokenUtils({ provider: 'jwt', tokenKey: 'my_app_token' });
52
+ expect(code).toContain('TOKEN_KEY = "my_app_token"');
53
+ });
54
+ it('generates JWT parsing utility', () => {
55
+ const code = generateTokenUtils();
56
+ expect(code).toContain('export function parseJwtPayload');
57
+ expect(code).toContain('atob');
58
+ });
59
+ it('generates token expiration check', () => {
60
+ const code = generateTokenUtils();
61
+ expect(code).toContain('export function isTokenExpired');
62
+ expect(code).toContain('payload.exp');
63
+ expect(code).toContain('Date.now()');
64
+ });
65
+ });
66
+ // ── generateAuthFunctions ──
67
+ describe('generateAuthFunctions', () => {
68
+ it('generates login function', () => {
69
+ const code = generateAuthFunctions();
70
+ expect(code).toContain('export async function login');
71
+ expect(code).toContain('LoginCredentials');
72
+ expect(code).toContain('Promise<AuthUser>');
73
+ expect(code).toContain('/api/auth/login');
74
+ });
75
+ it('generates logout function', () => {
76
+ const code = generateAuthFunctions();
77
+ expect(code).toContain('export async function logout');
78
+ expect(code).toContain('/api/auth/logout');
79
+ expect(code).toContain('clearStoredToken');
80
+ });
81
+ it('generates refresh function', () => {
82
+ const code = generateAuthFunctions();
83
+ expect(code).toContain('export async function refreshSession');
84
+ expect(code).toContain('/api/auth/refresh');
85
+ expect(code).toContain('AuthUser | null');
86
+ });
87
+ it('generates getAuthHeaders function', () => {
88
+ const code = generateAuthFunctions();
89
+ expect(code).toContain('export function getAuthHeaders');
90
+ expect(code).toContain('Authorization');
91
+ expect(code).toContain('Bearer');
92
+ });
93
+ it('uses custom endpoints from config', () => {
94
+ const config = {
95
+ provider: 'jwt',
96
+ loginEndpoint: '/auth/signin',
97
+ logoutEndpoint: '/auth/signout',
98
+ refreshEndpoint: '/auth/renew',
99
+ };
100
+ const code = generateAuthFunctions(config);
101
+ expect(code).toContain('/auth/signin');
102
+ expect(code).toContain('/auth/signout');
103
+ expect(code).toContain('/auth/renew');
104
+ });
105
+ });
106
+ // ── generateUseAuthHook ──
107
+ describe('generateUseAuthHook', () => {
108
+ it('generates useAuth hook', () => {
109
+ const code = generateUseAuthHook();
110
+ expect(code).toContain('export function useAuth(): AuthState & AuthActions');
111
+ expect(code).toContain('useState');
112
+ expect(code).toContain('useEffect');
113
+ });
114
+ it('initializes with loading state', () => {
115
+ const code = generateUseAuthHook();
116
+ expect(code).toContain('isLoading: true');
117
+ });
118
+ it('checks token on mount', () => {
119
+ const code = generateUseAuthHook();
120
+ expect(code).toContain('getStoredToken');
121
+ expect(code).toContain('isTokenExpired');
122
+ expect(code).toContain('refreshSession');
123
+ });
124
+ it('returns auth actions', () => {
125
+ const code = generateUseAuthHook();
126
+ expect(code).toContain('login:');
127
+ expect(code).toContain('logout:');
128
+ expect(code).toContain('refreshSession:');
129
+ expect(code).toContain('getToken: getStoredToken');
130
+ });
131
+ });
132
+ // ── generateUseCurrentUserHook ──
133
+ describe('generateUseCurrentUserHook', () => {
134
+ it('generates useCurrentUser hook', () => {
135
+ const code = generateUseCurrentUserHook();
136
+ expect(code).toContain('export function useCurrentUser');
137
+ expect(code).toContain('useAuth');
138
+ expect(code).toContain('user, isAuthenticated, isLoading');
139
+ });
140
+ });
141
+ // ── generateRouteGuard ──
142
+ describe('generateRouteGuard', () => {
143
+ it('generates RouteGuard component', () => {
144
+ const code = generateRouteGuard();
145
+ expect(code).toContain('export function RouteGuard');
146
+ expect(code).toContain('RouteGuardProps');
147
+ expect(code).toContain('children');
148
+ });
149
+ it('supports role-based access', () => {
150
+ const code = generateRouteGuard();
151
+ expect(code).toContain('roles?: string[]');
152
+ expect(code).toContain('user.roles.includes(r)');
153
+ });
154
+ it('supports scope-based access', () => {
155
+ const code = generateRouteGuard();
156
+ expect(code).toContain('scopes?: string[]');
157
+ expect(code).toContain('user.scopes.includes(s)');
158
+ });
159
+ it('supports redirect', () => {
160
+ const code = generateRouteGuard();
161
+ expect(code).toContain('redirectTo?: string');
162
+ expect(code).toContain('window.location.href = redirectTo');
163
+ });
164
+ it('supports fallback', () => {
165
+ const code = generateRouteGuard();
166
+ expect(code).toContain('fallback?: React.ReactNode');
167
+ expect(code).toContain('fallback ?? null');
168
+ });
169
+ });
170
+ // ── generateTenantContext ──
171
+ describe('generateTenantContext', () => {
172
+ it('generates useTenant hook', () => {
173
+ const code = generateTenantContext();
174
+ expect(code).toContain('export function useTenant');
175
+ expect(code).toContain('TenantContextValue');
176
+ expect(code).toContain('tenantId');
177
+ expect(code).toContain('setTenantId');
178
+ });
179
+ it('integrates with useAuth for initial tenant', () => {
180
+ const code = generateTenantContext();
181
+ expect(code).toContain('useAuth');
182
+ expect(code).toContain('user?.tenantId');
183
+ });
184
+ });
185
+ // ── generateAuthModule ──
186
+ describe('generateAuthModule', () => {
187
+ it('generates a complete auth module', () => {
188
+ const code = generateAuthModule();
189
+ expect(code).toContain('Auto-generated by @plumbus/ui');
190
+ expect(code).toContain('import React');
191
+ expect(code).toContain('interface AuthUser');
192
+ expect(code).toContain('function getStoredToken');
193
+ expect(code).toContain('function login');
194
+ expect(code).toContain('function useAuth');
195
+ expect(code).toContain('function useCurrentUser');
196
+ expect(code).toContain('function RouteGuard');
197
+ });
198
+ it('excludes tenant context by default', () => {
199
+ const code = generateAuthModule();
200
+ expect(code).not.toContain('function useTenant');
201
+ });
202
+ it('includes tenant context when multiTenant is true', () => {
203
+ const code = generateAuthModule({ provider: 'jwt', multiTenant: true });
204
+ expect(code).toContain('function useTenant');
205
+ expect(code).toContain('TenantContextValue');
206
+ });
207
+ it('respects custom config', () => {
208
+ const config = {
209
+ provider: 'jwt',
210
+ tokenKey: 'custom_token',
211
+ loginEndpoint: '/custom/login',
212
+ logoutEndpoint: '/custom/logout',
213
+ refreshEndpoint: '/custom/refresh',
214
+ };
215
+ const code = generateAuthModule(config);
216
+ expect(code).toContain('TOKEN_KEY = "custom_token"');
217
+ expect(code).toContain('/custom/login');
218
+ expect(code).toContain('/custom/logout');
219
+ expect(code).toContain('/custom/refresh');
220
+ });
221
+ });
222
+ //# sourceMappingURL=auth-generator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-generator.test.js","sourceRoot":"","sources":["../../../src/generators/__tests__/auth-generator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=client-generator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-generator.test.d.ts","sourceRoot":"","sources":["../../../src/generators/__tests__/client-generator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,224 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { z } from 'zod';
3
+ import { generateCapabilityTypes, generateClientModule, generateErrorTypes, generateFlowTrigger, generateHooksModule, generateMutationHook, generateQueryHook, generateReactHook, generateTypedClient, } from '../client-generator.js';
4
+ // ── Test Fixtures ──
5
+ function makeCap(overrides = {}) {
6
+ return {
7
+ name: 'getInvoice',
8
+ kind: 'query',
9
+ domain: 'billing',
10
+ description: 'Retrieve an invoice',
11
+ input: z.object({ invoiceId: z.string() }),
12
+ output: z.object({ amount: z.number() }),
13
+ effects: { data: [], events: [], external: [], ai: false },
14
+ handler: async () => ({ amount: 0 }),
15
+ ...overrides,
16
+ };
17
+ }
18
+ function makeActionCap() {
19
+ return makeCap({
20
+ name: 'approveRefund',
21
+ kind: 'action',
22
+ domain: 'billing',
23
+ description: 'Approve a refund request',
24
+ });
25
+ }
26
+ // ── generateCapabilityTypes ──
27
+ describe('generateCapabilityTypes', () => {
28
+ it('generates Input and Output type aliases from Zod schemas', () => {
29
+ const code = generateCapabilityTypes(makeCap());
30
+ expect(code).toContain('export type GetInvoiceInput');
31
+ expect(code).toContain('export type GetInvoiceOutput');
32
+ expect(code).toContain('invoiceId: string');
33
+ expect(code).toContain('amount: number');
34
+ });
35
+ it('generates Record<string, unknown> when schema has no fields', () => {
36
+ const code = generateCapabilityTypes(makeCap({ input: z.object({}) }));
37
+ expect(code).toContain('Record<string, unknown>');
38
+ });
39
+ it('handles optional and enum fields', () => {
40
+ const cap = makeCap({
41
+ input: z.object({
42
+ name: z.string(),
43
+ role: z.enum(['admin', 'user']),
44
+ bio: z.string().optional(),
45
+ }),
46
+ });
47
+ const code = generateCapabilityTypes(cap);
48
+ expect(code).toContain('name: string');
49
+ expect(code).toContain('role: "admin" | "user"');
50
+ expect(code).toContain('bio?: string');
51
+ });
52
+ it('converts name to PascalCase', () => {
53
+ const code = generateCapabilityTypes(makeCap({ name: 'list-all-orders' }));
54
+ expect(code).toContain('ListAllOrdersInput');
55
+ expect(code).toContain('ListAllOrdersOutput');
56
+ });
57
+ it('handles array and nullable fields', () => {
58
+ const cap = makeCap({
59
+ input: z.object({
60
+ tags: z.array(z.string()),
61
+ note: z.string().nullable(),
62
+ }),
63
+ });
64
+ const code = generateCapabilityTypes(cap);
65
+ expect(code).toContain('tags: string[]');
66
+ expect(code).toContain('note: string | null');
67
+ });
68
+ });
69
+ // ── generateTypedClient ──
70
+ describe('generateTypedClient', () => {
71
+ it('generates a GET client for query capabilities', () => {
72
+ const code = generateTypedClient(makeCap());
73
+ expect(code).toContain('export async function getInvoice');
74
+ expect(code).toContain('method: "GET"');
75
+ expect(code).toContain('URLSearchParams');
76
+ expect(code).toContain('/api/billing/get-invoice');
77
+ });
78
+ it('generates a POST client for action capabilities', () => {
79
+ const code = generateTypedClient(makeActionCap());
80
+ expect(code).toContain('export async function approveRefund');
81
+ expect(code).toContain('method: "POST"');
82
+ expect(code).toContain('body: JSON.stringify(input)');
83
+ });
84
+ it('uses baseUrl config', () => {
85
+ const code = generateTypedClient(makeCap(), { baseUrl: 'https://api.example.com' });
86
+ expect(code).toContain('https://api.example.com/api/billing/get-invoice');
87
+ });
88
+ it('includes JSDoc when configured', () => {
89
+ const code = generateTypedClient(makeCap(), { includeJsDoc: true });
90
+ expect(code).toContain('/** Retrieve an invoice */');
91
+ });
92
+ it('generates proper error handling', () => {
93
+ const code = generateTypedClient(makeCap());
94
+ expect(code).toContain('if (!response.ok)');
95
+ expect(code).toContain('throw Object.assign');
96
+ expect(code).toContain('body.code');
97
+ expect(code).toContain('body.metadata');
98
+ });
99
+ it('supports AbortSignal', () => {
100
+ const code = generateTypedClient(makeCap());
101
+ expect(code).toContain('signal?: AbortSignal');
102
+ expect(code).toContain('signal: options?.signal');
103
+ });
104
+ });
105
+ // ── generateQueryHook ──
106
+ describe('generateQueryHook', () => {
107
+ it('generates a React query hook', () => {
108
+ const code = generateQueryHook(makeCap());
109
+ expect(code).toContain('export function useGetInvoice');
110
+ expect(code).toContain('GetInvoiceInput');
111
+ expect(code).toContain('GetInvoiceOutput');
112
+ expect(code).toContain('useState');
113
+ expect(code).toContain('useEffect');
114
+ });
115
+ it('includes cancellation logic', () => {
116
+ const code = generateQueryHook(makeCap());
117
+ expect(code).toContain('let cancelled = false');
118
+ expect(code).toContain('return () => { cancelled = true; }');
119
+ });
120
+ it('returns data, loading, error', () => {
121
+ const code = generateQueryHook(makeCap());
122
+ expect(code).toContain('return { data, loading, error }');
123
+ });
124
+ });
125
+ // ── generateMutationHook ──
126
+ describe('generateMutationHook', () => {
127
+ it('generates a mutation hook for action capabilities', () => {
128
+ const code = generateMutationHook(makeActionCap());
129
+ expect(code).toContain('export function useApproveRefund');
130
+ expect(code).toContain('ApproveRefundInput');
131
+ expect(code).toContain('mutate');
132
+ expect(code).toContain('reset');
133
+ });
134
+ it('returns mutate, data, loading, error, reset', () => {
135
+ const code = generateMutationHook(makeActionCap());
136
+ expect(code).toContain('return { mutate, data, loading, error, reset }');
137
+ });
138
+ });
139
+ // ── generateReactHook ──
140
+ describe('generateReactHook', () => {
141
+ it('dispatches query hook for query capabilities', () => {
142
+ const code = generateReactHook(makeCap());
143
+ expect(code).toContain('useGetInvoice');
144
+ expect(code).toContain('useEffect');
145
+ });
146
+ it('dispatches mutation hook for action capabilities', () => {
147
+ const code = generateReactHook(makeActionCap());
148
+ expect(code).toContain('useApproveRefund');
149
+ expect(code).toContain('mutate');
150
+ });
151
+ });
152
+ // ── generateFlowTrigger ──
153
+ describe('generateFlowTrigger', () => {
154
+ const flow = {
155
+ name: 'refundApproval',
156
+ domain: 'billing',
157
+ description: 'Start refund approval flow',
158
+ };
159
+ it('generates a flow trigger function', () => {
160
+ const code = generateFlowTrigger(flow);
161
+ expect(code).toContain('export async function startRefundApproval');
162
+ expect(code).toContain('RefundApprovalFlowInput');
163
+ expect(code).toContain('/api/billing/refund-approval/start');
164
+ expect(code).toContain('method: "POST"');
165
+ });
166
+ it('returns executionId and status', () => {
167
+ const code = generateFlowTrigger(flow);
168
+ expect(code).toContain('executionId: string');
169
+ expect(code).toContain('status: string');
170
+ });
171
+ it('defaults domain to flows', () => {
172
+ const code = generateFlowTrigger({ name: 'onboarding' });
173
+ expect(code).toContain('/api/flows/onboarding/start');
174
+ });
175
+ it('includes JSDoc when configured', () => {
176
+ const code = generateFlowTrigger(flow, { includeJsDoc: true });
177
+ expect(code).toContain('/** Start flow: Start refund approval flow */');
178
+ });
179
+ });
180
+ // ── generateErrorTypes ──
181
+ describe('generateErrorTypes', () => {
182
+ it('generates PlumbusApiError interface', () => {
183
+ const code = generateErrorTypes();
184
+ expect(code).toContain('export interface PlumbusApiError');
185
+ expect(code).toContain('status: number');
186
+ expect(code).toContain('code?: string');
187
+ expect(code).toContain('message: string');
188
+ });
189
+ it('generates type guard', () => {
190
+ const code = generateErrorTypes();
191
+ expect(code).toContain('export function isPlumbusApiError');
192
+ expect(code).toContain('error is PlumbusApiError');
193
+ });
194
+ });
195
+ // ── generateClientModule ──
196
+ describe('generateClientModule', () => {
197
+ it('generates a complete client module', () => {
198
+ const caps = [makeCap(), makeActionCap()];
199
+ const flows = [{ name: 'refundFlow', domain: 'billing' }];
200
+ const code = generateClientModule(caps, flows);
201
+ expect(code).toContain('Auto-generated by @plumbus/ui');
202
+ expect(code).toContain('GetInvoiceInput');
203
+ expect(code).toContain('ApproveRefundInput');
204
+ expect(code).toContain('RefundFlowFlowInput');
205
+ expect(code).toContain('getInvoice');
206
+ expect(code).toContain('approveRefund');
207
+ expect(code).toContain('startRefundFlow');
208
+ expect(code).toContain('PlumbusApiError');
209
+ });
210
+ });
211
+ // ── generateHooksModule ──
212
+ describe('generateHooksModule', () => {
213
+ it('generates a hooks module with imports', () => {
214
+ const caps = [makeCap(), makeActionCap()];
215
+ const code = generateHooksModule(caps);
216
+ expect(code).toContain('Auto-generated by @plumbus/ui');
217
+ expect(code).toContain('import { useState, useEffect } from "react"');
218
+ expect(code).toContain('import type { GetInvoiceInput, GetInvoiceOutput } from "./client"');
219
+ expect(code).toContain('import { getInvoice } from "./client"');
220
+ expect(code).toContain('useGetInvoice');
221
+ expect(code).toContain('useApproveRefund');
222
+ });
223
+ });
224
+ //# sourceMappingURL=client-generator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-generator.test.js","sourceRoot":"","sources":["../../../src/generators/__tests__/client-generator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=form-generator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-generator.test.d.ts","sourceRoot":"","sources":["../../../src/generators/__tests__/form-generator.test.ts"],"names":[],"mappings":""}