@swoff/cli 0.3.8 → 0.3.9
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/README.md +47 -33
- package/dist/__tests__/assemble-sw.test.js +8 -38
- package/dist/__tests__/assemble-sw.test.js.map +1 -1
- package/dist/__tests__/cli-integration.test.js +119 -11
- package/dist/__tests__/cli-integration.test.js.map +1 -1
- package/dist/__tests__/config-types.test.js +32 -15
- package/dist/__tests__/config-types.test.js.map +1 -1
- package/dist/__tests__/file-generators.test.js +2 -2
- package/dist/__tests__/file-generators.test.js.map +1 -1
- package/dist/__tests__/glob-matcher.test.js +86 -0
- package/dist/__tests__/glob-matcher.test.js.map +1 -0
- package/dist/__tests__/invalidation-tags.test.js +207 -23
- package/dist/__tests__/invalidation-tags.test.js.map +1 -1
- package/dist/__tests__/loader.test.js +12 -12
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/validator.test.js +144 -97
- package/dist/__tests__/validator.test.js.map +1 -1
- package/dist/index.js +11 -10
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +0 -5
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/commands/add.js +50 -32
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/clean.js +1 -15
- package/dist/lib/commands/clean.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +2 -2
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/generate.js +7 -21
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/info.js +8 -6
- package/dist/lib/commands/info.js.map +1 -1
- package/dist/lib/commands/init.js +2 -10
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/validate.js +3 -3
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/loader.js +3 -6
- package/dist/lib/config/loader.js.map +1 -1
- package/dist/lib/config/validator.js +157 -88
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +2 -10
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector.js +50 -11
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +92 -64
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
- package/dist/lib/generators/file-generators/gql-wrapper.js +1 -14
- package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/guide-generator.js +6 -640
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
- package/dist/lib/generators/file-generators/invalidation-tags.js +206 -19
- package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
- package/dist/lib/generators/file-generators/manifest.js +2 -2
- package/dist/lib/generators/file-generators/manifest.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +29 -9
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/push.js +6 -7
- package/dist/lib/generators/file-generators/push.js.map +1 -1
- package/dist/lib/generators/file-generators/quick-readme.js +8 -125
- package/dist/lib/generators/file-generators/quick-readme.js.map +1 -1
- package/dist/lib/generators/file-generators/server-push.js +11 -1
- package/dist/lib/generators/file-generators/server-push.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-generator-build.js +8 -9
- package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +2 -1
- package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/type-definitions.js +0 -3
- package/dist/lib/generators/file-generators/type-definitions.js.map +1 -1
- package/dist/lib/generators/sw-generator.js +8 -18
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +14 -11
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-sync-handler.js +59 -17
- package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/config-header.js +2 -2
- package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +437 -136
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/message-handler.js +55 -15
- package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/sw-push.js +67 -0
- package/dist/lib/generators/sw-sections/sw-push.js.map +1 -0
- package/dist/lib/generators/sw-sections/tag-management.js +60 -20
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +5 -15
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +121 -71
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/lib/shared/glob-matcher.js +77 -0
- package/dist/lib/shared/glob-matcher.js.map +1 -0
- package/dist/lib/utils/tty-status.js +21 -0
- package/dist/lib/utils/tty-status.js.map +1 -0
- package/docs/API.md +565 -0
- package/docs/ARCHITECTURE.md +374 -0
- package/docs/CLI.md +148 -0
- package/docs/COMPARISON.md +192 -0
- package/docs/CONFIG.md +277 -0
- package/docs/ECOSYSTEM.md +33 -0
- package/package.json +2 -1
- package/templates/hooks/useAuth.jsx +2 -2
- package/templates/hooks/useAuth.tsx +2 -2
- package/templates/hooks/useCachedFetch.jsx +3 -28
- package/templates/hooks/useCachedFetch.tsx +2 -33
- package/templates/hooks/useMutation.tsx +13 -1
- package/templates/hooks/useMutationQueue.jsx +2 -1
- package/templates/hooks/useMutationQueue.tsx +2 -1
- package/templates/hooks/useMutationState.jsx +8 -22
- package/templates/hooks/useMutationState.tsx +8 -24
- package/templates/hooks/usePushSubscription.jsx +3 -3
- package/templates/hooks/usePushSubscription.tsx +3 -3
|
@@ -9,12 +9,12 @@ export function generateFetchWrapper(ctx) {
|
|
|
9
9
|
const T = (type) => (ts ? `: ${type}` : "");
|
|
10
10
|
const R = (type) => (ts ? `: ${type} ` : " ");
|
|
11
11
|
const G = (type) => (ts ? `<${type}>` : "");
|
|
12
|
-
const tagInvalidation = ctx.config.features.tagInvalidation;
|
|
12
|
+
const tagInvalidation = ctx.config.features.tagInvalidation.enabled;
|
|
13
13
|
const authEnabled = ctx.config.features.auth.enabled;
|
|
14
14
|
const mutationQueue = ctx.config.features.mutationQueue.enabled;
|
|
15
15
|
const importLines = [
|
|
16
16
|
tagInvalidation
|
|
17
|
-
? `import { generateTags } from "./invalidation-tags.${ext}";`
|
|
17
|
+
? `import { generateTags, invalidateUrl${tagInvalidation && mutationQueue ? ", expandCascading" : ""} } from "./invalidation-tags.${ext}";`
|
|
18
18
|
: "",
|
|
19
19
|
tagInvalidation ? `import { invalidateByTags } from "./cache.${ext}";` : "",
|
|
20
20
|
authEnabled
|
|
@@ -31,13 +31,7 @@ export function generateFetchWrapper(ctx) {
|
|
|
31
31
|
export interface FetchWithCacheResult${G("T")} {
|
|
32
32
|
response${T("Response & { json(): Promise<T> }")};
|
|
33
33
|
fromCache${T("boolean")};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export interface ResolvedFetchConfig {
|
|
37
|
-
staleTime${T("number")};
|
|
38
|
-
refetchOnWindowFocus${T("boolean")};
|
|
39
|
-
refetchOnReconnect${T("boolean")};
|
|
40
|
-
refetchInterval${T("number")};
|
|
34
|
+
queued${T("boolean")};
|
|
41
35
|
}
|
|
42
36
|
`
|
|
43
37
|
: "";
|
|
@@ -45,13 +39,16 @@ export interface ResolvedFetchConfig {
|
|
|
45
39
|
? `
|
|
46
40
|
export interface FetchWithCacheOptions extends RequestInit {
|
|
47
41
|
tags?: string[];
|
|
48
|
-
staleWhileRevalidate?: boolean;
|
|
49
42
|
auth?: boolean;
|
|
50
43
|
queueOffline?: boolean;
|
|
51
44
|
invalidate?: 'auto' | string[] | false;
|
|
52
45
|
type?: 'read' | 'mutation';
|
|
53
|
-
strategy?: 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'cache-only' | 'network-only';
|
|
46
|
+
strategy?: 'cache-first' | 'network-first' | 'stale-while-revalidate' | 'cache-only' | 'network-only' | 'reactive';
|
|
54
47
|
staleTime?: number;
|
|
48
|
+
/** Custom response validation for mutation success. Default: res.ok. Use this when your API returns 200 with { success: false } for logical failures. */
|
|
49
|
+
validateSuccess?: (response: Response) => boolean | Promise<boolean>;
|
|
50
|
+
/** Override the URL used for auto-invalidation. Defaults to the request URL. Useful when the mutation URL differs from the cache tag URL. */
|
|
51
|
+
invalidateUrl?: string;
|
|
55
52
|
}
|
|
56
53
|
`
|
|
57
54
|
: "";
|
|
@@ -82,45 +79,56 @@ export interface FetchWithCacheOptions extends RequestInit {
|
|
|
82
79
|
window.dispatchEvent(new CustomEvent("sw-auth-unauthorized"));
|
|
83
80
|
}`
|
|
84
81
|
: "";
|
|
85
|
-
const
|
|
86
|
-
|
|
82
|
+
const mutationTagsBlock = tagInvalidation && mutationQueue
|
|
83
|
+
? ` // Pre-compute invalidation tags for SW-side IDB storage
|
|
84
|
+
let mutationTags: string[] = [];
|
|
85
|
+
if (!isRead) {
|
|
86
|
+
const invalidateSetting = options.invalidate !== false ? (options.invalidate || 'auto') : false;
|
|
87
|
+
if (invalidateSetting !== false) {
|
|
88
|
+
if (Array.isArray(invalidateSetting)) {
|
|
89
|
+
mutationTags = invalidateSetting;
|
|
90
|
+
} else {
|
|
91
|
+
mutationTags = generateTags(url);
|
|
92
|
+
mutationTags = expandCascading(mutationTags);
|
|
93
|
+
}
|
|
94
|
+
headers.set("X-SW-Invalidate-Tags", mutationTags.join(","));
|
|
95
|
+
}
|
|
96
|
+
}`
|
|
97
|
+
: ` let mutationTags: string[] = options.tags || [];`;
|
|
98
|
+
const offlineReadCatchBlock = ` if (options.signal?.aborted) throw new DOMException("The operation was aborted", "AbortError");
|
|
87
99
|
const cached = await caches.match(input);
|
|
88
|
-
if (cached) return { response: cached, fromCache: true };
|
|
89
|
-
throw new Error("Offline: no cached data available")
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
? ` // Write offline — auto-queue
|
|
93
|
-
if (options.queueOffline !== false) {
|
|
94
|
-
const headerObj: Record<string, string> = {};
|
|
95
|
-
headers.forEach((value, key) => {
|
|
96
|
-
headerObj[key] = value;
|
|
97
|
-
});
|
|
100
|
+
if (cached) return { response: cached, fromCache: true, queued: false };
|
|
101
|
+
throw new Error("Offline: no cached data available");`;
|
|
102
|
+
const offlineWriteFallbackBlock = mutationQueue
|
|
103
|
+
? ` if (options.queueOffline !== false) {
|
|
98
104
|
await queueMutation({
|
|
99
105
|
method,
|
|
100
106
|
url,
|
|
101
107
|
body: options.body,
|
|
102
|
-
headers:
|
|
103
|
-
tags:
|
|
108
|
+
headers: {},
|
|
109
|
+
tags: mutationTags,
|
|
104
110
|
timestamp: Date.now(),
|
|
105
111
|
});
|
|
106
112
|
return {
|
|
107
|
-
response: new Response(
|
|
113
|
+
response: new Response(JSON.stringify({ queued: true }), { status: 202, headers: { "Content-Type": "application/json" } }),
|
|
108
114
|
fromCache: false,
|
|
115
|
+
queued: true,
|
|
109
116
|
};
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
: ` throw new Error("Offline: write operation failed");`;
|
|
117
|
+
}`
|
|
118
|
+
: ``;
|
|
113
119
|
const autoInvalidateBlock = tagInvalidation
|
|
114
120
|
? `
|
|
115
|
-
// Auto-invalidate after mutation success
|
|
116
|
-
|
|
121
|
+
// Auto-invalidate after mutation success (skip if SW queued it)
|
|
122
|
+
const mutationSuccess = options.validateSuccess ? await options.validateSuccess(response) : response.ok;
|
|
123
|
+
const mutationQueued = response.headers.get("X-SW-Mutation-Queued") === "true";
|
|
124
|
+
if (!isRead && mutationSuccess && !mutationQueued) {
|
|
117
125
|
const invalidateSetting = options.invalidate !== false ? (options.invalidate || 'auto') : false;
|
|
118
126
|
if (invalidateSetting !== false) {
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
await
|
|
127
|
+
const invalidateTarget = options.invalidateUrl || url;
|
|
128
|
+
if (Array.isArray(invalidateSetting)) {
|
|
129
|
+
await invalidateByTags(invalidateSetting);
|
|
130
|
+
} else {
|
|
131
|
+
await invalidateUrl(invalidateTarget);
|
|
124
132
|
}
|
|
125
133
|
}
|
|
126
134
|
}`
|
|
@@ -135,10 +143,6 @@ export interface FetchWithCacheOptions extends RequestInit {
|
|
|
135
143
|
}
|
|
136
144
|
}`
|
|
137
145
|
: "";
|
|
138
|
-
const staleTimeHeaders = ` // Pass staleTime to SW if set at per-request level
|
|
139
|
-
if (options.staleTime !== undefined) {
|
|
140
|
-
headers.set("X-SW-Stale-Time", String(options.staleTime));
|
|
141
|
-
}`;
|
|
142
146
|
const code = `/**
|
|
143
147
|
* Swoff Fetch Wrapper
|
|
144
148
|
* Unified fetch with caching, auth, offline queue, auto-invalidation, staleTime, prefetching, and
|
|
@@ -157,17 +161,28 @@ export interface FetchWithCacheOptions extends RequestInit {
|
|
|
157
161
|
* body: JSON.stringify({ title: "New task" }),
|
|
158
162
|
* });
|
|
159
163
|
*
|
|
160
|
-
* //
|
|
161
|
-
*
|
|
164
|
+
* // Skip auto-invalidation, invalidate manually later
|
|
165
|
+
* await fetchWithCache("/api/todos", {
|
|
166
|
+
* method: "POST",
|
|
167
|
+
* body: JSON.stringify({ title: "New" }),
|
|
168
|
+
* invalidate: false,
|
|
169
|
+
* });
|
|
170
|
+
*
|
|
171
|
+
* // Validate mutation success with custom logic
|
|
172
|
+
* await fetchWithCache("/api/todos", {
|
|
173
|
+
* method: "POST",
|
|
174
|
+
* body: JSON.stringify({ title: "New" }),
|
|
175
|
+
* validateSuccess: (res) => res.status === 200,
|
|
176
|
+
* });
|
|
162
177
|
*
|
|
163
|
-
* // Custom tags +
|
|
164
|
-
*
|
|
165
|
-
* tags: ["
|
|
166
|
-
*
|
|
178
|
+
* // Custom tags for caching (read) + explicit invalidate tags (mutation)
|
|
179
|
+
* await fetchWithCache("/api/todos", {
|
|
180
|
+
* tags: ["custom-tag"],
|
|
181
|
+
* invalidate: ["custom-tag"],
|
|
167
182
|
* });
|
|
168
183
|
*
|
|
169
|
-
* //
|
|
170
|
-
* await fetchWithCache("/api/
|
|
184
|
+
* // Authenticated request (works with bearer, cookie, custom)
|
|
185
|
+
* const { response: userRes } = await fetchWithCache("/api/me", { auth: true });
|
|
171
186
|
*
|
|
172
187
|
* // Prefetch (fire-and-forget warm the cache)
|
|
173
188
|
* prefetchCache("/api/todos");
|
|
@@ -197,9 +212,9 @@ ${interfaceBlock}${optionsInterface}
|
|
|
197
212
|
const inFlightRequests = new Map${G("string, Promise<Response>")}();
|
|
198
213
|
|
|
199
214
|
/** Fetch with caching, auth, offline queue, auto-invalidation, and per-request strategy override. Returns { response, fromCache }. Use { auth: true } for authenticated requests — works with bearer, cookie, and custom auth types. */
|
|
200
|
-
export async function fetchWithCache${G("T")}(input${T("RequestInfo")}, options${T("RequestInit &
|
|
215
|
+
export async function fetchWithCache${G("T")}(input${T("RequestInfo")}, options${T("RequestInit & FetchWithCacheOptions")} = {})${R("Promise<FetchWithCacheResult<T>>")}{
|
|
201
216
|
const method = (options.method || "GET").toUpperCase();
|
|
202
|
-
const isRead = options.type === "read" || (options.type !== "mutation" && (method === "GET" || method === "HEAD"));
|
|
217
|
+
const isRead = options.type === "read" || (options.type !== "mutation" && (method === "GET" || method === "HEAD" || method === "OPTIONS"));
|
|
203
218
|
const url = typeof input === "string" ? input : input.url;
|
|
204
219
|
|
|
205
220
|
const headers = new Headers(options.headers);
|
|
@@ -214,28 +229,26 @@ ${autoTagsBlock}
|
|
|
214
229
|
headers.set("X-SW-Cache-Tags", options.tags.join(","));
|
|
215
230
|
}
|
|
216
231
|
|
|
217
|
-
if (options.staleWhileRevalidate && !options.strategy) {
|
|
218
|
-
headers.set("X-SW-Strategy", "stale-while-revalidate");
|
|
219
|
-
}
|
|
220
232
|
if (options.strategy) {
|
|
221
233
|
headers.set("X-SW-Strategy", options.strategy);
|
|
222
234
|
}
|
|
223
|
-
|
|
235
|
+
if (options.staleTime !== undefined) {
|
|
236
|
+
headers.set("X-SW-Stale-Time", String(options.staleTime));
|
|
237
|
+
}
|
|
224
238
|
${authBlock}${authUrlsBlock}
|
|
239
|
+
// Forward no-queue option to SW
|
|
240
|
+
if (options.queueOffline === false) {
|
|
241
|
+
headers.set("X-SW-No-Queue", "true");
|
|
242
|
+
}
|
|
243
|
+
|
|
225
244
|
const fetchOptions${T("RequestInit")} = { ...options, headers };
|
|
226
245
|
${authCredentialsBlock}
|
|
227
246
|
|
|
228
|
-
// Offline handling
|
|
229
|
-
if (!navigator.onLine) {
|
|
230
|
-
${offlineReadBlock}
|
|
231
|
-
${offlineWriteBlock}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
247
|
// Check for abort before proceeding
|
|
235
248
|
if (options.signal?.aborted) {
|
|
236
249
|
throw new DOMException("The operation was aborted", "AbortError");
|
|
237
250
|
}
|
|
238
|
-
|
|
251
|
+
${mutationTagsBlock}
|
|
239
252
|
// Deduplicate in-flight GET requests
|
|
240
253
|
let responsePromise${T("Promise<Response>")};
|
|
241
254
|
if (isRead && inFlightRequests.has(url)) {
|
|
@@ -259,14 +272,29 @@ ${offlineWriteBlock}
|
|
|
259
272
|
}
|
|
260
273
|
}
|
|
261
274
|
|
|
262
|
-
|
|
275
|
+
let response${T("Response")};
|
|
276
|
+
try {
|
|
277
|
+
response = await responsePromise;
|
|
278
|
+
} catch (err) {
|
|
279
|
+
if (err instanceof TypeError) {
|
|
280
|
+
if (isRead) {
|
|
281
|
+
${offlineReadCatchBlock}
|
|
282
|
+
}
|
|
283
|
+
// SW not controlling — fallback to client-side queue
|
|
284
|
+
if (!navigator.serviceWorker?.controller) {
|
|
285
|
+
${offlineWriteFallbackBlock}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
throw err;
|
|
289
|
+
}
|
|
263
290
|
${autoInvalidateBlock}${auth401Block}
|
|
264
291
|
const fromCache = response.headers.get("X-SW-From-Cache") === "true";
|
|
265
|
-
|
|
292
|
+
const queued = response.headers.get("X-SW-Mutation-Queued") === "true";
|
|
293
|
+
return { response, fromCache, queued };
|
|
266
294
|
}
|
|
267
295
|
|
|
268
296
|
/** Fire-and-forget prefetch: warms the cache for a URL without blocking. Useful for route prefetching or link hover prefetching. */
|
|
269
|
-
export function prefetchCache(input${T("RequestInfo")}, options${T("RequestInit &
|
|
297
|
+
export function prefetchCache(input${T("RequestInfo")}, options${T("RequestInit & FetchWithCacheOptions")} = {})${R("void")}{
|
|
270
298
|
fetchWithCache(input, { ...options }).catch(() => {
|
|
271
299
|
// Prefetch failures are intentionally silent
|
|
272
300
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-wrapper.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/fetch-wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-wrapper.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/fetch-wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC;IACpE,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IACrD,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;IAEhE,MAAM,WAAW,GAAG;QAClB,eAAe;YACb,CAAC,CAAC,uCAAuC,eAAe,IAAI,aAAa,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,gCAAgC,GAAG,IAAI;YAC3I,CAAC,CAAC,EAAE;QACN,eAAe,CAAC,CAAC,CAAC,6CAA6C,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE;QAC3E,WAAW;YACT,CAAC,CAAC,uGAAuG,GAAG,IAAI;YAChH,CAAC,CAAC,EAAE;QACN,aAAa;YACX,CAAC,CAAC,mDAAmD,GAAG,IAAI;YAC5D,CAAC,CAAC,EAAE;KACP;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,cAAc,GAAG,EAAE;QACvB,CAAC,CAAC;uCACiC,CAAC,CAAC,GAAG,CAAC;YACjC,CAAC,CAAC,mCAAmC,CAAC;aACrC,CAAC,CAAC,SAAS,CAAC;UACf,CAAC,CAAC,SAAS,CAAC;;CAErB;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,gBAAgB,GAAG,EAAE;QACzB,CAAC,CAAC;;;;;;;;;;;;;;CAcL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,SAAS,GAAG,WAAW;QAC3B,CAAC,CAAC;;;;IAIF;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW;QAC/B,CAAC,CAAC;;;;IAIF;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,oBAAoB,GAAG,WAAW;QACtC,CAAC,CAAC;;;IAGF;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW;QAC9B,CAAC,CAAC;;;;IAIF;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,iBAAiB,GAAG,eAAe,IAAI,aAAa;QACxD,CAAC,CAAC;;;;;;;;;;;;;IAaF;QACA,CAAC,CAAC,oDAAoD,CAAC;IAEzD,MAAM,qBAAqB,GAAG;;;4DAG4B,CAAC;IAE3D,MAAM,yBAAyB,GAAG,aAAa;QAC7C,CAAC,CAAC;;;;;;;;;;;;;;MAcA;QACF,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,mBAAmB,GAAG,eAAe;QACzC,CAAC,CAAC;;;;;;;;;;;;;;IAcF;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,aAAa,GAAG,eAAe;QACnC,CAAC,CAAC;;;;;;;IAOF;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,IAAI,GAAG;;;;;;4EAM6D,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0D7E,WAAW;EACX,cAAc,GAAG,gBAAgB;kCACD,CAAC,CAAC,2BAA2B,CAAC;;;sCAG1B,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,qCAAqC,CAAC,SAAS,CAAC,CAAC,kCAAkC,CAAC;;;;;;;;;;;EAWrK,aAAa;;;;;;;;;;;;EAYb,SAAS,GAAG,aAAa;;;;;;sBAML,CAAC,CAAC,aAAa,CAAC;EACpC,oBAAoB;;;;;;EAMpB,iBAAiB;;uBAEI,CAAC,CAAC,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;gBAsB7B,CAAC,CAAC,UAAU,CAAC;;;;;;EAM3B,qBAAqB;;;;EAIrB,yBAAyB;;;;;EAKzB,mBAAmB,GAAG,YAAY;;;;;;;qCAOC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,qCAAqC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;;;;;CAK1H,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -36,7 +36,7 @@ export function generateHooks(ctx) {
|
|
|
36
36
|
if (config.features.backgroundSync) {
|
|
37
37
|
copyHook(hooksDir, "useBackgroundSync", ext);
|
|
38
38
|
}
|
|
39
|
-
if (config.features.tagInvalidation) {
|
|
39
|
+
if (config.features.tagInvalidation.enabled) {
|
|
40
40
|
copyHook(hooksDir, "useCacheInvalidation", ext);
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-hooks.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/generate-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;AAEpE,SAAS,QAAQ,CAAC,QAAgB,EAAE,IAAY,EAAE,GAAW;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IAClD,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAqB;IACjD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC;IACrD,IAAI,aAAa,KAAK,OAAO;QAAE,OAAO;IAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAE5C,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC1C,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;QAC/C,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QACnC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"generate-hooks.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/generate-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;AAEpE,SAAS,QAAQ,CAAC,QAAgB,EAAE,IAAY,EAAE,GAAW;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IAClD,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAqB;IACjD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC;IACrD,IAAI,aAAa,KAAK,OAAO;QAAE,OAAO;IAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAE5C,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC1C,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;QAC/C,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QACnC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;QAC5C,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -12,16 +12,10 @@ export function generateGqlWrapper(ctx) {
|
|
|
12
12
|
export interface GqlOptions {
|
|
13
13
|
variables?: Record<string, unknown>;
|
|
14
14
|
tags?: string[];
|
|
15
|
-
staleWhileRevalidate?: boolean;
|
|
16
15
|
auth?: boolean;
|
|
17
16
|
queueOffline?: boolean;
|
|
18
17
|
invalidate?: 'auto' | string[] | false;
|
|
19
18
|
}
|
|
20
|
-
|
|
21
|
-
export interface GqlResult${G("T")} {
|
|
22
|
-
data${T("T")};
|
|
23
|
-
fromCache${T("boolean")};
|
|
24
|
-
}
|
|
25
19
|
`
|
|
26
20
|
: "";
|
|
27
21
|
const code = `/**
|
|
@@ -51,13 +45,6 @@ export interface GqlResult${G("T")} {
|
|
|
51
45
|
* // Authenticated
|
|
52
46
|
* const { data } = await queryGql("query Me { me { name } }", {}, { auth: true });
|
|
53
47
|
*
|
|
54
|
-
* // Custom options
|
|
55
|
-
* const { data } = await queryGql(
|
|
56
|
-
* "query GetData { data { id } }",
|
|
57
|
-
* {},
|
|
58
|
-
* { staleWhileRevalidate: true, tags: ["data"] }
|
|
59
|
-
* );
|
|
60
|
-
*
|
|
61
48
|
* // Offline: mutations are auto-queued
|
|
62
49
|
* const { data } = await mutateGql(
|
|
63
50
|
* "mutation CreateTodo($title: String!) { createTodo(title: $title) { id } }",
|
|
@@ -67,6 +54,7 @@ export interface GqlResult${G("T")} {
|
|
|
67
54
|
*/
|
|
68
55
|
|
|
69
56
|
import { fetchWithCache } from "./fetch-wrapper.${ext}";
|
|
57
|
+
import type { GqlResult } from "./swoff";
|
|
70
58
|
${optionsInterface}
|
|
71
59
|
/** Extract operation name from a GraphQL document. Returns null for anonymous queries (e.g. "{ todos { id } }"). */
|
|
72
60
|
function getOperationName(query${T("string")})${T("string | null")}{
|
|
@@ -119,7 +107,6 @@ export async function fetchWithGql${G("T")}(
|
|
|
119
107
|
},
|
|
120
108
|
tags,
|
|
121
109
|
type: isRead ? "read" : "mutation",
|
|
122
|
-
staleWhileRevalidate: options.staleWhileRevalidate,
|
|
123
110
|
auth: options.auth,
|
|
124
111
|
queueOffline: options.queueOffline,
|
|
125
112
|
invalidate: options.invalidate,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gql-wrapper.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/gql-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEtD,MAAM,gBAAgB,GAAG,EAAE;QACzB,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"gql-wrapper.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/gql-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,EAAE,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;IAEtD,MAAM,gBAAgB,GAAG,EAAE;QACzB,CAAC,CAAC;;;;;;;;CAQL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,IAAI,GAAG;;;;;;;8EAO+D,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;kDA4B/B,GAAG;;EAEnD,gBAAgB;;iCAEe,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;;;;;;gCAMlC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;;;;;;;6BAO9B,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC;;;;;;;;8BAQnC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;;;;;;;;;;oCAU7B,CAAC,CAAC,GAAG,CAAC;SACjC,CAAC,CAAC,QAAQ,CAAC;WACT,CAAC,CAAC,YAAY,CAAC;GACvB,CAAC,CAAC,uBAAuB,CAAC;;;;;;;0DAO6B,QAAQ;;;;;;;;;;;;;;;8BAepC,EAAE,CAAC,GAAG,CAAC;;;;gCAIL,CAAC,CAAC,GAAG,CAAC;SAC7B,CAAC,CAAC,QAAQ,CAAC;aACP,CAAC,CAAC,qCAAqC,CAAC;WAC1C,CAAC,CAAC,YAAY,CAAC;GACvB,CAAC,CAAC,uBAAuB,CAAC;uBACN,CAAC,CAAC,GAAG,CAAC;;;;iCAII,CAAC,CAAC,GAAG,CAAC;YAC3B,CAAC,CAAC,QAAQ,CAAC;aACV,CAAC,CAAC,qCAAqC,CAAC;WAC1C,CAAC,CAAC,YAAY,CAAC;GACvB,CAAC,CAAC,uBAAuB,CAAC;uBACN,CAAC,CAAC,GAAG,CAAC;;CAE5B,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|