@swoff/cli 0.3.14 → 0.4.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 (147) hide show
  1. package/dist/index.js +2 -2
  2. package/dist/index.js.map +1 -1
  3. package/dist/lib/cli/help.js +3 -3
  4. package/dist/lib/cli/help.js.map +1 -1
  5. package/dist/lib/commands/clean.js +8 -17
  6. package/dist/lib/commands/clean.js.map +1 -1
  7. package/dist/lib/commands/generate-guide.js +3 -5
  8. package/dist/lib/commands/generate-guide.js.map +1 -1
  9. package/dist/lib/commands/generate.js +9 -7
  10. package/dist/lib/commands/generate.js.map +1 -1
  11. package/dist/lib/commands/init.js +218 -184
  12. package/dist/lib/commands/init.js.map +1 -1
  13. package/dist/lib/commands/validate.js.map +1 -1
  14. package/dist/lib/config/minimal-config.js +64 -0
  15. package/dist/lib/config/minimal-config.js.map +1 -0
  16. package/dist/lib/config/validator.js +42 -19
  17. package/dist/lib/config/validator.js.map +1 -1
  18. package/dist/lib/generators/file-generators/client-injector-bundle.js +1 -1
  19. package/dist/lib/generators/file-generators/client-injector-bundle.js.map +1 -1
  20. package/dist/lib/generators/file-generators/context.js +3 -2
  21. package/dist/lib/generators/file-generators/context.js.map +1 -1
  22. package/dist/lib/generators/file-generators/generate-framework-adapters.js +1 -1
  23. package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -1
  24. package/dist/lib/generators/file-generators/sw-generator-build.js +34 -14
  25. package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
  26. package/dist/lib/generators/file-generators/sw-injector.js +1 -0
  27. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
  28. package/dist/lib/generators/sw-build-utils.js +17 -3
  29. package/dist/lib/generators/sw-build-utils.js.map +1 -1
  30. package/dist/lib/generators/sw-generator.js +5 -5
  31. package/dist/lib/generators/sw-generator.js.map +1 -1
  32. package/dist/lib/generators/sw-sections/activate-handler.js +4 -1
  33. package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
  34. package/dist/lib/generators/sw-sections/assemble-sw.js +7 -4
  35. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
  36. package/dist/lib/generators/sw-sections/background-precache.js +118 -0
  37. package/dist/lib/generators/sw-sections/background-precache.js.map +1 -0
  38. package/dist/lib/generators/sw-sections/default-template.js +11 -3
  39. package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
  40. package/dist/lib/generators/sw-sections/fetch-handler.js +2 -2
  41. package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
  42. package/dist/lib/generators/sw-sections/message-handler.js +9 -1
  43. package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
  44. package/dist/lib/generators/sw-sections/shared.js +2 -2
  45. package/dist/lib/generators/sw-sections/shared.js.map +1 -1
  46. package/dist/lib/generators/swoff-files-generator.js +2 -2
  47. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  48. package/dist/lib/shared/config-types.js +20 -18
  49. package/dist/lib/shared/config-types.js.map +1 -1
  50. package/dist/lib/utils/detect-framework.js +3 -27
  51. package/dist/lib/utils/detect-framework.js.map +1 -1
  52. package/dist/runtime/client-injector-bundle.js +16 -23
  53. package/dist/runtime/client-injector-bundle.js.map +1 -1
  54. package/dist/runtime/client-injector.js +15 -2
  55. package/dist/runtime/client-injector.js.map +1 -1
  56. package/dist/runtime/sw-injector.js +6 -19
  57. package/dist/runtime/sw-injector.js.map +1 -1
  58. package/dist/runtime/type-definitions.js +0 -5
  59. package/dist/runtime/type-definitions.js.map +1 -1
  60. package/package.json +9 -3
  61. package/templates/react/usePrecacheProgress.jsx +20 -0
  62. package/templates/react/usePrecacheProgress.tsx +20 -0
  63. package/dist/lib/commands/add.js +0 -62
  64. package/dist/lib/commands/add.js.map +0 -1
  65. package/dist/lib/commands/assets.js +0 -45
  66. package/dist/lib/commands/assets.js.map +0 -1
  67. package/dist/lib/commands/generate-assets.js +0 -44
  68. package/dist/lib/commands/generate-assets.js.map +0 -1
  69. package/dist/lib/commands/info.js +0 -183
  70. package/dist/lib/commands/info.js.map +0 -1
  71. package/dist/lib/generators/asset-generator/dependency-resolver.js +0 -85
  72. package/dist/lib/generators/asset-generator/dependency-resolver.js.map +0 -1
  73. package/dist/lib/generators/asset-generator/generate.js +0 -111
  74. package/dist/lib/generators/asset-generator/generate.js.map +0 -1
  75. package/dist/lib/generators/asset-generator/guide.js +0 -43
  76. package/dist/lib/generators/asset-generator/guide.js.map +0 -1
  77. package/dist/lib/generators/asset-generator/html-patcher.js +0 -65
  78. package/dist/lib/generators/asset-generator/html-patcher.js.map +0 -1
  79. package/dist/lib/generators/asset-generator/ico-encoder.js +0 -29
  80. package/dist/lib/generators/asset-generator/ico-encoder.js.map +0 -1
  81. package/dist/lib/generators/asset-generator/manifest-patcher.js +0 -23
  82. package/dist/lib/generators/asset-generator/manifest-patcher.js.map +0 -1
  83. package/dist/lib/generators/asset-generator/maskable.js +0 -15
  84. package/dist/lib/generators/asset-generator/maskable.js.map +0 -1
  85. package/dist/lib/generators/asset-generator/rasterize.js +0 -32
  86. package/dist/lib/generators/asset-generator/rasterize.js.map +0 -1
  87. package/dist/lib/generators/asset-generator/sizes.js +0 -25
  88. package/dist/lib/generators/asset-generator/sizes.js.map +0 -1
  89. package/dist/lib/generators/file-generators/auth-fetch.js +0 -151
  90. package/dist/lib/generators/file-generators/auth-fetch.js.map +0 -1
  91. package/dist/lib/generators/file-generators/auth-user.js +0 -13
  92. package/dist/lib/generators/file-generators/auth-user.js.map +0 -1
  93. package/dist/lib/generators/file-generators/connectivity-manager.js +0 -12
  94. package/dist/lib/generators/file-generators/connectivity-manager.js.map +0 -1
  95. package/dist/lib/generators/file-generators/fetch-state.js +0 -6
  96. package/dist/lib/generators/file-generators/fetch-state.js.map +0 -1
  97. package/dist/lib/generators/file-generators/generate-hooks.js +0 -44
  98. package/dist/lib/generators/file-generators/generate-hooks.js.map +0 -1
  99. package/dist/lib/generators/file-generators/indexeddb.js +0 -74
  100. package/dist/lib/generators/file-generators/indexeddb.js.map +0 -1
  101. package/dist/lib/generators/file-generators/manifest.js +0 -46
  102. package/dist/lib/generators/file-generators/manifest.js.map +0 -1
  103. package/dist/lib/generators/file-generators/mutation-reconcile.js +0 -57
  104. package/dist/lib/generators/file-generators/mutation-reconcile.js.map +0 -1
  105. package/dist/lib/generators/file-generators/notification-generator.js +0 -6
  106. package/dist/lib/generators/file-generators/notification-generator.js.map +0 -1
  107. package/dist/lib/generators/file-generators/quick-readme.js +0 -21
  108. package/dist/lib/generators/file-generators/quick-readme.js.map +0 -1
  109. package/dist/lib/generators/file-generators/reconcile.js +0 -50
  110. package/dist/lib/generators/file-generators/reconcile.js.map +0 -1
  111. package/dist/lib/generators/file-generators/storage-generator.js +0 -6
  112. package/dist/lib/generators/file-generators/storage-generator.js.map +0 -1
  113. package/dist/lib/generators/file-generators/storage-notify.js +0 -6
  114. package/dist/lib/generators/file-generators/storage-notify.js.map +0 -1
  115. package/dist/lib/generators/file-generators/store.js +0 -86
  116. package/dist/lib/generators/file-generators/store.js.map +0 -1
  117. package/dist/lib/generators/file-generators/sw-push.js +0 -67
  118. package/dist/lib/generators/file-generators/sw-push.js.map +0 -1
  119. package/dist/lib/generators/file-generators/sw-version-gen.js +0 -32
  120. package/dist/lib/generators/file-generators/sw-version-gen.js.map +0 -1
  121. package/dist/lib/generators/sw-sections/glob-matcher-code.js.map +0 -1
  122. package/dist/lib/generators/sw-sections/install-handler.js +0 -54
  123. package/dist/lib/generators/sw-sections/install-handler.js.map +0 -1
  124. package/dist/lib/utils/build-script.js +0 -35
  125. package/dist/lib/utils/build-script.js.map +0 -1
  126. package/dist/lib/utils/tty-status.js +0 -21
  127. package/dist/lib/utils/tty-status.js.map +0 -1
  128. package/dist/runtime/auth-user.js +0 -154
  129. package/dist/runtime/auth-user.js.map +0 -1
  130. package/dist/runtime/connectivity-manager.js +0 -83
  131. package/dist/runtime/connectivity-manager.js.map +0 -1
  132. package/dist/runtime/fetch-state.js +0 -42
  133. package/dist/runtime/fetch-state.js.map +0 -1
  134. package/dist/runtime/notification.js +0 -65
  135. package/dist/runtime/notification.js.map +0 -1
  136. package/dist/runtime/pwa-index.js +0 -11
  137. package/dist/runtime/pwa-index.js.map +0 -1
  138. package/dist/runtime/pwa-injector.js +0 -15
  139. package/dist/runtime/pwa-injector.js.map +0 -1
  140. package/dist/runtime/pwa-install.js +0 -83
  141. package/dist/runtime/pwa-install.js.map +0 -1
  142. package/dist/runtime/sw-version.js +0 -13
  143. package/dist/runtime/sw-version.js.map +0 -1
  144. package/dist/swoff-nkdhhmw8. +0 -18
  145. package/dist/swoff.js +0 -5
  146. package/templates/react/useSWUpdate.jsx +0 -31
  147. package/templates/react/useSWUpdate.tsx +0 -37
@@ -1,151 +0,0 @@
1
- /**
2
- * Generates auth-fetch.ts/js — thin auth wrapper around fetchWithCache.
3
- */
4
- import { writeFile } from "./context.js";
5
- export function generateAuthFetch(ctx) {
6
- const ext = ctx.ext;
7
- const ts = ext === "ts";
8
- const T = (type) => (ts ? `: ${type}` : "");
9
- const R = (type) => (ts ? `: ${type} ` : " ");
10
- const authConfig = ctx.config.features.auth;
11
- const { refreshPath, userEndpoint, type } = authConfig;
12
- function generateWithAuthHeaders() {
13
- const a = T("AuthData | null");
14
- const h = T("Headers");
15
- const hd = T("Headers");
16
- switch (type) {
17
- case "cookie":
18
- return `function withAuthHeaders(headers${hd}, _auth${a})${h}{
19
- return headers;
20
- }`;
21
- case "bearer":
22
- return `function withAuthHeaders(headers${hd}, auth${a})${h}{
23
- if (auth?.token) {
24
- headers.set("Authorization", \`Bearer \${auth.token}\`);
25
- }
26
- return headers;
27
- }`;
28
- case "custom":
29
- return `function withAuthHeaders(headers${hd}, auth${a})${h}{
30
- // --- EDIT THIS BLOCK FOR YOUR BACKEND ---
31
- // if (auth?.token) {
32
- // headers.set("X-Auth-Token", auth.token);
33
- // }
34
- // --- END OF EDITABLE BLOCK ---
35
- return headers;
36
- }`;
37
- default:
38
- return `function withAuthHeaders(headers${hd}, auth${a})${h}{
39
- if (auth?.token) {
40
- headers.set("Authorization", \`Bearer \${auth.token}\`);
41
- }
42
- return headers;
43
- }`;
44
- }
45
- }
46
- const credentialsLine = type === "cookie"
47
- ? `const fetchOptions = { ...options, headers, credentials: "include" as RequestCredentials };`
48
- : ` const fetchOptions = { ...options, headers };`;
49
- const code = `/**
50
- * Auth-Fetch — attaches auth headers, excludes auth endpoints from cache,
51
- * and handles 401 responses. Thin wrapper around fetchWithCache.
52
- *
53
- * Usage:
54
- * import { authenticatedFetch } from "./auth/fetch.${ext}";
55
- * const data = await authenticatedFetch("/api/data").then((r) => r.json());
56
- *
57
- * Or use fetchWithCache directly:
58
- * import { fetchWithCache } from "../fetch-wrapper.${ext}";
59
- * const data = await fetchWithCache("/api/me", { auth: true });
60
- */
61
-
62
- import { fetchWithCache } from "../fetch-wrapper.${ext}";
63
- import { getAuth, setAuth, clearAuth${ts ? ", type AuthData" : ""} } from "./store.${ext}";
64
-
65
- ${generateWithAuthHeaders()}
66
-
67
- /**
68
- * Auth endpoints that should never be cached by the SW.
69
- * Edit this list to match your backend's auth routes.
70
- */
71
- function isAuthUrl(url${T("string")})${R("boolean")}{
72
- const authPaths = [
73
- "/login",
74
- "/logout",
75
- "/register",
76
- "/api/login",
77
- "/api/logout",
78
- "/api/register",
79
- "${refreshPath}",
80
- "${userEndpoint}",
81
- ];
82
- return authPaths.some((path) => url.includes(path));
83
- }
84
-
85
- /** Auth-aware fetch. Delegates to fetchWithCache with auth headers, cache bypass for auth endpoints, and 401 handling. Options may include \`type: 'read' | 'mutation'\` to override method-based caching. */
86
- export async function authenticatedFetch(input${T("RequestInfo")}, options${T("RequestInit & { type?: 'read' | 'mutation' }")} = {})${R("Promise<Response>")}{
87
- const auth = await getAuth();
88
- const headers = new Headers(options.headers);
89
-
90
- withAuthHeaders(headers, auth);
91
-
92
- const url = typeof input === "string" ? input : input.url;
93
-
94
- // Mark auth endpoints as mutation to bypass SW cache
95
- if (isAuthUrl(url) && !headers.has("X-SW-Cache-Strategy")) {
96
- headers.set("X-SW-Cache-Strategy", "mutation");
97
- }
98
-
99
- ${credentialsLine}
100
- const { response } = await fetchWithCache(input, fetchOptions);
101
-
102
- // Handle 401 — auth expired or invalidated server-side
103
- if (response.status === 401) {
104
- await clearAuth();
105
- window.dispatchEvent(new CustomEvent("sw-auth-unauthorized"));
106
- }
107
-
108
- return response;
109
- }
110
-
111
- /**
112
- * Token refresh helper — called before requests when token may be expired.
113
- * Uses refreshPath from config.
114
- */
115
- let refreshPromise${T("Promise<AuthData | null> | null")} = null;
116
-
117
- export async function ensureValidAuth()${R("Promise<AuthData | null>")}{
118
- const auth = await getAuth();
119
- if (!auth) return null;
120
- if (!auth.expiresAt || Date.now() < auth.expiresAt) return auth;
121
-
122
- if (!refreshPromise) {
123
- refreshPromise = (async () => {
124
- const response = await authenticatedFetch("${refreshPath}", {
125
- method: "POST",
126
- headers: { "X-SW-Cache-Strategy": "mutation" },
127
- });
128
-
129
- if (!response.ok) {
130
- await clearAuth();
131
- window.dispatchEvent(new CustomEvent("sw-auth-unauthorized"));
132
- return null;
133
- }
134
-
135
- const data = await response.json();
136
- const updated = { ...auth, token: data.token, expiresAt: data.expiresAt };
137
- await setAuth(updated);
138
- return updated;
139
- })();
140
- }
141
-
142
- try {
143
- return await refreshPromise;
144
- } finally {
145
- refreshPromise = null;
146
- }
147
- }
148
- `;
149
- writeFile(ctx, `auth/fetch.${ext}`, code);
150
- }
151
- //# sourceMappingURL=auth-fetch.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-fetch.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-fetch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,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;IAEtD,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5C,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;IAEvD,SAAS,uBAAuB;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;QACxB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,QAAQ;gBACX,OAAO,mCAAmC,EAAE,UAAU,CAAC,IAAI,CAAC;;EAElE,CAAC;YACG,KAAK,QAAQ;gBACX,OAAO,mCAAmC,EAAE,SAAS,CAAC,IAAI,CAAC;;;;;EAKjE,CAAC;YACG,KAAK,QAAQ;gBACX,OAAO,mCAAmC,EAAE,SAAS,CAAC,IAAI,CAAC;;;;;;;EAOjE,CAAC;YACG;gBACE,OAAO,mCAAmC,EAAE,SAAS,CAAC,IAAI,CAAC;;;;;EAKjE,CAAC;QACC,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GACnB,IAAI,KAAK,QAAQ;QACf,CAAC,CAAC,6FAA6F;QAC/F,CAAC,CAAC,iDAAiD,CAAC;IAExD,MAAM,IAAI,GAAG;;;;;wDAKyC,GAAG;;;;wDAIH,GAAG;;;;mDAIR,GAAG;sCAChB,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,oBAAoB,GAAG;;EAEtF,uBAAuB,EAAE;;;;;;wBAMH,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC;;;;;;;;OAQ5C,WAAW;OACX,YAAY;;;;;;gDAM6B,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,8CAA8C,CAAC,SAAS,CAAC,CAAC,mBAAmB,CAAC;;;;;;;;;;;;;IAaxJ,eAAe;;;;;;;;;;;;;;;;oBAgBC,CAAC,CAAC,iCAAiC,CAAC;;yCAEf,CAAC,CAAC,0BAA0B,CAAC;;;;;;;mDAOnB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;CAwB7D,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Generates auth-user.ts/js — fetch, cache, and invalidate current user.
3
- */
4
- import { writeFile } from "./context.js";
5
- import { generateAuthUserCode } from "../../../runtime/auth-user.js";
6
- export function generateAuthUser(ctx) {
7
- const ext = ctx.ext;
8
- const ts = ext === "ts";
9
- const authConfig = ctx.config.features.auth;
10
- const code = generateAuthUserCode({ ts, ext }, authConfig.refreshPath, authConfig.userEndpoint, authConfig.type);
11
- writeFile(ctx, `auth/user.${ext}`, code);
12
- }
13
- //# sourceMappingURL=auth-user.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-user.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/auth-user.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,UAAU,gBAAgB,CAAC,GAAqB;IACpD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,GAAG,KAAK,IAAI,CAAC;IACxB,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;IAE5C,MAAM,IAAI,GAAG,oBAAoB,CAC/B,EAAE,EAAE,EAAE,GAAG,EAAE,EACX,UAAU,CAAC,WAAW,EACtB,UAAU,CAAC,YAAY,EACvB,UAAU,CAAC,IAAI,CAChB,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,12 +0,0 @@
1
- /**
2
- * Generates connectivity-manager.{js|ts} - core connectivity manager logic only.
3
- */
4
- import { writeFile } from "./context.js";
5
- import { generateConnectivityManagerCode } from "../../../runtime/connectivity-manager.js";
6
- export function generateConnectivityManager(ctx) {
7
- writeFile(ctx, `connectivity-manager.${ctx.ext}`, generateConnectivityManagerCode({
8
- ts: ctx.ext === "ts",
9
- ext: ctx.ext,
10
- }));
11
- }
12
- //# sourceMappingURL=connectivity-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"connectivity-manager.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/connectivity-manager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,+BAA+B,EAAE,MAAM,0CAA0C,CAAC;AAE3F,MAAM,UAAU,2BAA2B,CAAC,GAAqB;IAC/D,SAAS,CACP,GAAG,EACH,wBAAwB,GAAG,CAAC,GAAG,EAAE,EACjC,+BAA+B,CAAC;QAC9B,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI;QACpB,GAAG,EAAE,GAAG,CAAC,GAAG;KACb,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -1,6 +0,0 @@
1
- import { writeFile } from "./context.js";
2
- import { generateFetchStateCode } from "../../../runtime/fetch-state.js";
3
- export function generateFetchState(ctx) {
4
- writeFile(ctx, `fetch/state.${ctx.ext}`, generateFetchStateCode({ ts: ctx.ext === "ts", ext: ctx.ext }));
5
- }
6
- //# sourceMappingURL=fetch-state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-state.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/fetch-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,GAAqB;IACtD,SAAS,CAAC,GAAG,EAAE,eAAe,GAAG,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC3G,CAAC"}
@@ -1,44 +0,0 @@
1
- import { copyFileSync, existsSync, mkdirSync } from "fs";
2
- import { join, dirname } from "path";
3
- import { fileURLToPath } from "url";
4
- const __dirname = dirname(fileURLToPath(import.meta.url));
5
- const templatesDir = join(__dirname, "../../../../templates/hooks");
6
- function copyHook(hooksDir, name, ext) {
7
- const src = join(templatesDir, `${name}.${ext}x`);
8
- copyFileSync(src, join(hooksDir, `${name}.${ext}x`));
9
- }
10
- export function generateHooks(ctx) {
11
- const { config, swoffDir, ext, frameworkName } = ctx;
12
- if (frameworkName !== "react")
13
- return;
14
- const hooksDir = join(swoffDir, "hooks");
15
- if (!existsSync(hooksDir)) {
16
- mkdirSync(hooksDir, { recursive: true });
17
- }
18
- // Always generated hooks
19
- copyHook(hooksDir, "useNetworkStatus", ext);
20
- copyHook(hooksDir, "useCachedFetch", ext);
21
- copyHook(hooksDir, "useMutation", ext);
22
- copyHook(hooksDir, "usePrefetch", ext);
23
- copyHook(hooksDir, "useMutationState", ext);
24
- if (config.features.pwa.enabled) {
25
- copyHook(hooksDir, "useSWUpdate", ext);
26
- }
27
- if (config.features.auth.enabled) {
28
- copyHook(hooksDir, "useAuth", ext);
29
- }
30
- if (config.features.mutationQueue.enabled) {
31
- copyHook(hooksDir, "useMutationQueue", ext);
32
- }
33
- if (config.features.pushNotifications?.enabled) {
34
- copyHook(hooksDir, "usePushSubscription", ext);
35
- }
36
- if (config.features.backgroundSync) {
37
- copyHook(hooksDir, "useBackgroundSync", ext);
38
- }
39
- copyHook(hooksDir, "useCacheInvalidation", ext);
40
- // Phase 2 — always generated
41
- copyHook(hooksDir, "useSwoffReset", ext);
42
- copyHook(hooksDir, "useIsFetching", ext);
43
- }
44
- //# sourceMappingURL=generate-hooks.js.map
@@ -1 +0,0 @@
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,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAEhD,6BAA6B;IAC7B,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,74 +0,0 @@
1
- /**
2
- * Generates indexeddb.js - DB initialization with schema migrations.
3
- */
4
- import { writeFile } from "./context.js";
5
- export function generateIndexedDB(ctx) {
6
- const ext = ctx.ext;
7
- const dbName = ctx.config.features.indexeddb?.name || "app-db";
8
- const stores = ctx.config.features.indexeddb?.stores || [];
9
- const storesCode = stores.length > 0
10
- ? stores
11
- .map((store, i) => ` if (oldVersion < ${i + 1}) {\n db.createObjectStore("${store}", { keyPath: "id" });\n }`)
12
- .join("\n\n")
13
- : ` // Create your object stores here:
14
- // if (oldVersion < 1) {
15
- // const todos = db.createObjectStore("todos", { keyPath: "id" });
16
- // todos.createIndex("by-date", "date");
17
- // }`;
18
- const code = `/**
19
- * Swoff IndexedDB Setup
20
- * Database initialization with schema migrations.
21
- *
22
- * Usage:
23
- * import { openDB } from './swoff/indexeddb.${ext}';
24
- *
25
- * const db = await openDB();
26
- */
27
-
28
- const DB_NAME = "${dbName}";
29
- const DB_VERSION = 1;
30
-
31
- export function openDB() {
32
- return new Promise((resolve, reject) => {
33
- const request = indexedDB.open(DB_NAME, DB_VERSION);
34
-
35
- request.onupgradeneeded = (e) => {
36
- const db = e.target.result;
37
- const oldVersion = e.oldVersion;
38
-
39
- ${storesCode}
40
- };
41
-
42
- request.onsuccess = (e) => resolve(e.target.result);
43
- request.onerror = (e) => reject(e.target.error);
44
- });
45
- }
46
-
47
- export async function requestPersistentStorage() {
48
- if (!navigator.storage?.persist) return false;
49
-
50
- const isPersisted = await navigator.storage.persisted();
51
- if (isPersisted) return true;
52
-
53
- try {
54
- return await navigator.storage.persist();
55
- } catch {
56
- return false;
57
- }
58
- }
59
-
60
- export async function monitorStorage() {
61
- const estimate = await navigator.storage.estimate();
62
- const ratio = estimate.usage / estimate.quota;
63
-
64
- return {
65
- usage: estimate.usage,
66
- quota: estimate.quota,
67
- ratio,
68
- status: ratio >= 0.95 ? "critical" : ratio >= 0.8 ? "warning" : "ok",
69
- };
70
- }
71
- `;
72
- writeFile(ctx, `indexeddb.${ext}`, code);
73
- }
74
- //# sourceMappingURL=indexeddb.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"indexeddb.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/indexeddb.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,IAAI,QAAQ,CAAC;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC;IAE3D,MAAM,UAAU,GACd,MAAM,CAAC,MAAM,GAAG,CAAC;QACf,CAAC,CAAC,MAAM;aACH,GAAG,CACF,CAAC,KAAa,EAAE,CAAS,EAAE,EAAE,CAC3B,0BAA0B,CAAC,GAAG,CAAC,sCAAsC,KAAK,iCAAiC,CAC9G;aACA,IAAI,CAAC,MAAM,CAAC;QACjB,CAAC,CAAC;;;;WAIG,CAAC;IAEV,MAAM,IAAI,GAAG;;;;;iDAKkC,GAAG;;;;;mBAKjC,MAAM;;;;;;;;;;;EAWvB,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCX,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,46 +0,0 @@
1
- /**
2
- * Generates manifest.json - PWA web app manifest.
3
- * Reads icon paths from config if assets were generated, otherwise uses defaults.
4
- */
5
- import { ensureDir } from "./context.js";
6
- import { existsSync, writeFileSync } from "fs";
7
- import { join } from "path";
8
- export function generateManifest(ctx) {
9
- const outputDir = join(ctx.projectRoot, "public");
10
- ensureDir(outputDir);
11
- const manifestPath = join(outputDir, "manifest.json");
12
- if (existsSync(manifestPath))
13
- return;
14
- const pwaAssets = ctx.config.features.pwa.assets;
15
- const hasGeneratedSplash = pwaAssets.source && pwaAssets.generated;
16
- const manifest = {
17
- name: "Swoff App",
18
- short_name: "Swoff",
19
- description: "Offline-first web application",
20
- start_url: "/",
21
- display: "standalone",
22
- background_color: pwaAssets.bgColor || "#ffffff",
23
- theme_color: pwaAssets.themeColor || "#000000",
24
- orientation: "portrait-primary",
25
- scope: "/",
26
- lang: "en-US",
27
- categories: ["utilities", "web"],
28
- prefer_related_applications: false,
29
- display_override: ["window-controls-overlay", "standalone", "browser"],
30
- icons: [
31
- { src: "/icon-64.png", sizes: "64x64", type: "image/png", purpose: "any" },
32
- { src: "/icon-192.png", sizes: "192x192", type: "image/png", purpose: "any" },
33
- { src: "/icon-512.png", sizes: "512x512", type: "image/png", purpose: "any" },
34
- { src: "/maskable-icon-512.png", sizes: "512x512", type: "image/png", purpose: "maskable" },
35
- ],
36
- screenshots: [],
37
- };
38
- if (hasGeneratedSplash) {
39
- manifest.screenshots = [
40
- { src: "/og-image.png", sizes: "1200x630", type: "image/png", form_factor: "narrow", label: "App screenshot" },
41
- ];
42
- }
43
- writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
44
- ctx.generatedFiles.push("public/manifest.json");
45
- }
46
- //# sourceMappingURL=manifest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/manifest.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,gBAAgB,CAAC,GAAqB;IACpD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClD,SAAS,CAAC,SAAS,CAAC,CAAC;IAErB,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO;IAErC,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;IACjD,MAAM,kBAAkB,GAAG,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,SAAS,CAAC;IAEnE,MAAM,QAAQ,GAA4B;QACxC,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,OAAO;QACnB,WAAW,EAAE,+BAA+B;QAC5C,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,YAAY;QACrB,gBAAgB,EAAE,SAAS,CAAC,OAAO,IAAI,SAAS;QAChD,WAAW,EAAE,SAAS,CAAC,UAAU,IAAI,SAAS;QAC9C,WAAW,EAAE,kBAAkB;QAC/B,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC;QAChC,2BAA2B,EAAE,KAAK;QAClC,gBAAgB,EAAE,CAAC,yBAAyB,EAAE,YAAY,EAAE,SAAS,CAAC;QACtE,KAAK,EAAE;YACL,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;YAC1E,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;YAC7E,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE;YAC7E,EAAE,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE;SAC5F;QACD,WAAW,EAAE,EAAE;KAChB,CAAC;IAEF,IAAI,kBAAkB,EAAE,CAAC;QACvB,QAAQ,CAAC,WAAW,GAAG;YACrB,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,gBAAgB,EAAE;SAC/G,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;AAClD,CAAC"}
@@ -1,57 +0,0 @@
1
- /**
2
- * Generates mutation-reconcile.js - ID reconciliation after mutation sync.
3
- */
4
- import { writeFile } from "./context.js";
5
- export function generateMutationReconcile(ctx) {
6
- const ext = ctx.ext;
7
- const ts = ext === "ts";
8
- const T = (type) => (ts ? `: ${type}` : "");
9
- const R = (type) => (ts ? `: ${type} ` : " ");
10
- const AS = (type) => (ts ? ` as ${type}` : "");
11
- const code = `/**
12
- * Swoff Mutation Reconciliation
13
- * Reconciles local optimistic records with server response after a queued
14
- * mutation is processed by the service worker.
15
- *
16
- * Usage:
17
- * import { reconcileRecord } from './swoff/mutation-reconcile.${ext}';
18
- *
19
- * // Called automatically by mutation-queue after a successful sync
20
- * await reconcileRecord('todos', 'temp_abc123', serverData);
21
- *
22
- * // Only override this if your data has foreign key references:
23
- * // export async function reconcileReferences(...) { ... }
24
- */
25
-
26
- import { getRecord, putRecord, deleteRecord } from './store.${ext}';
27
-
28
- /** Replace a temporary optimistic ID with the server-assigned ID after mutation sync. Called automatically by mutation-queue. */
29
- export async function reconcileRecord(storeName${T("string")}, tempId${T("string")}, serverData${T("Record<string, unknown>")})${R("Promise<void>")}{
30
- const existing = await getRecord(storeName, tempId);
31
- if (!existing) return;
32
-
33
- const reconciled = {
34
- ...existing,
35
- ...serverData,
36
- id: serverData.id,
37
- $synced: true,
38
- $syncedAt: Date.now(),
39
- };
40
-
41
- await putRecord(storeName, reconciled);
42
-
43
- if (String(tempId) !== String(serverData.id)) {
44
- await deleteRecord(storeName, tempId);
45
- }
46
-
47
- await reconcileReferences(storeName, tempId, serverData.id${AS("string | number")});
48
- }
49
-
50
- /** Update foreign key references in other records that pointed to the old temp ID. Override this for your app's schema relationships. */
51
- export async function reconcileReferences(_storeName${T("string")}, _oldId${T("string")}, _newId${T("string | number")})${R("Promise<void>")}{
52
- // Override this for your app's schema.
53
- }
54
- `;
55
- writeFile(ctx, `mutation-reconcile.${ext}`, code);
56
- }
57
- //# sourceMappingURL=mutation-reconcile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mutation-reconcile.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/mutation-reconcile.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,yBAAyB,CAAC,GAAqB;IAC7D,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,EAAE,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG;;;;;;mEAMoD,GAAG;;;;;;;;;8DASR,GAAG;;;iDAGhB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;8DAkBrF,EAAE,CAAC,iBAAiB,CAAC;;;;sDAI7B,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;;;CAG3I,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,sBAAsB,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC"}
@@ -1,6 +0,0 @@
1
- import { writeFile } from "./context.js";
2
- import { generateNotificationCode } from "../../../runtime/notification.js";
3
- export function generateNotification(ctx) {
4
- writeFile(ctx, `notification.${ctx.ext}`, generateNotificationCode({ ts: ctx.ext === "ts", ext: ctx.ext }));
5
- }
6
- //# sourceMappingURL=notification-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"notification-generator.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/notification-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAC9G,CAAC"}
@@ -1,21 +0,0 @@
1
- /**
2
- * Generates README.md — quick reference that points to the static docs.
3
- */
4
- import { writeFile } from "./context.js";
5
- export function generateReadme(ctx) {
6
- const lines = [];
7
- const w = (s) => lines.push(s);
8
- w("# Swoff — Quick Reference");
9
- w("");
10
- w("For the complete API reference, see:");
11
- w("");
12
- w("- `node_modules/@swoff/cli/docs/API.md` — every generated function");
13
- w("- `node_modules/@swoff/cli/docs/ARCHITECTURE.md` — design & rationale");
14
- w("- `node_modules/@swoff/cli/docs/CLI.md` — CLI commands");
15
- w("- `node_modules/@swoff/cli/docs/CONFIG.md` — config schema");
16
- w("- `node_modules/@swoff/cli/docs/COMPARISON.md` — library comparison");
17
- w("");
18
- w("Or run `swoff info <feature>` for targeted help.");
19
- writeFile(ctx, "README.md", lines.join("\n"));
20
- }
21
- //# sourceMappingURL=quick-readme.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"quick-readme.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/quick-readme.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,cAAc,CAAC,GAAqB;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAEvC,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC/B,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,sCAAsC,CAAC,CAAC;IAC1C,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,oEAAoE,CAAC,CAAC;IACxE,CAAC,CAAC,uEAAuE,CAAC,CAAC;IAC3E,CAAC,CAAC,wDAAwD,CAAC,CAAC;IAC5D,CAAC,CAAC,4DAA4D,CAAC,CAAC;IAChE,CAAC,CAAC,qEAAqE,CAAC,CAAC;IACzE,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,kDAAkD,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC"}
@@ -1,50 +0,0 @@
1
- /**
2
- * Generates reconcile.js - ID reconciliation after mutation sync.
3
- */
4
- import { writeFile } from "./context.js";
5
- export function generateReconcile(ctx) {
6
- const ext = ctx.ext;
7
- const ts = ext === "ts";
8
- const T = (type) => (ts ? `: ${type}` : "");
9
- const R = (type) => (ts ? `: ${type} ` : " ");
10
- const AS = (type) => (ts ? ` as ${type}` : "");
11
- const code = `/**
12
- * Swoff ID Reconciliation
13
- * Update local records with server data after mutation sync.
14
- *
15
- * Usage:
16
- * import { reconcileRecord } from './swoff/reconcile.${ext}';
17
- *
18
- * await reconcileRecord('todos', 'temp_abc123', serverData);
19
- */
20
-
21
- import { getRecord, putRecord, deleteRecord } from './store.${ext}';
22
-
23
- export async function reconcileRecord(storeName${T("string")}, tempId${T("string")}, serverData${T("Record<string, unknown>")})${R("Promise<void>")}{
24
- const existing = await getRecord(storeName, tempId);
25
- if (!existing) return;
26
-
27
- const reconciled = {
28
- ...existing,
29
- ...serverData,
30
- id: serverData.id,
31
- $synced: true,
32
- $syncedAt: Date.now(),
33
- };
34
-
35
- await putRecord(storeName, reconciled);
36
-
37
- if (String(tempId) !== String(serverData.id)) {
38
- await deleteRecord(storeName, tempId);
39
- }
40
-
41
- await reconcileReferences(storeName, tempId, serverData.id${AS("string | number")});
42
- }
43
-
44
- export async function reconcileReferences(storeName${T("string")}, oldId${T("string")}, newId${T("string | number")})${R("Promise<void>")}{
45
- // Override this for your app's schema.
46
- }
47
- `;
48
- writeFile(ctx, `reconcile.${ext}`, code);
49
- }
50
- //# sourceMappingURL=reconcile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/reconcile.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,iBAAiB,CAAC,GAAqB;IACrD,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,EAAE,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAEvD,MAAM,IAAI,GAAG;;;;;0DAK2C,GAAG;;;;;8DAKC,GAAG;;iDAEhB,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;;;;;;;;;;;;;;;;;;8DAkBrF,EAAE,CAAC,iBAAiB,CAAC;;;qDAG9B,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;;;CAGxI,CAAC;IAEA,SAAS,CAAC,GAAG,EAAE,aAAa,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,6 +0,0 @@
1
- import { writeFile } from "./context.js";
2
- import { generateNotificationCode } from "../../../runtime/notification.js";
3
- export function generateStorage(ctx) {
4
- writeFile(ctx, `storage.${ctx.ext}`, generateNotificationCode({ ts: ctx.ext === "ts", ext: ctx.ext }));
5
- }
6
- //# sourceMappingURL=storage-generator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage-generator.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/storage-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,UAAU,eAAe,CAAC,GAAqB;IACnD,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AACzG,CAAC"}
@@ -1,6 +0,0 @@
1
- import { writeFile } from "./context.js";
2
- import { generateNotificationCode } from "../../../runtime/notification.js";
3
- export function generateStorageNotify(ctx) {
4
- writeFile(ctx, `storage-notify.${ctx.ext}`, generateNotificationCode({ ts: ctx.ext === "ts", ext: ctx.ext }));
5
- }
6
- //# sourceMappingURL=storage-notify.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage-notify.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/storage-notify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,MAAM,UAAU,qBAAqB,CAAC,GAAqB;IACzD,SAAS,CAAC,GAAG,EAAE,kBAAkB,GAAG,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAChH,CAAC"}