@swoff/cli 0.3.13 → 0.3.14

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 (224) hide show
  1. package/README.md +28 -32
  2. package/dist/index.js +2 -13
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/cli/help.js +3 -8
  5. package/dist/lib/cli/help.js.map +1 -1
  6. package/dist/lib/commands/add.js +29 -87
  7. package/dist/lib/commands/add.js.map +1 -1
  8. package/dist/lib/commands/generate-guide.js +16 -30
  9. package/dist/lib/commands/generate-guide.js.map +1 -1
  10. package/dist/lib/commands/generate.js +31 -6
  11. package/dist/lib/commands/generate.js.map +1 -1
  12. package/dist/lib/commands/init.js +188 -11
  13. package/dist/lib/commands/init.js.map +1 -1
  14. package/dist/lib/commands/validate.js +2 -4
  15. package/dist/lib/commands/validate.js.map +1 -1
  16. package/dist/lib/config/loader.js +34 -25
  17. package/dist/lib/config/loader.js.map +1 -1
  18. package/dist/lib/config/validator.js +202 -96
  19. package/dist/lib/config/validator.js.map +1 -1
  20. package/dist/lib/generators/file-generators/api-config.js +1 -1
  21. package/dist/lib/generators/file-generators/api-config.js.map +1 -1
  22. package/dist/lib/generators/file-generators/auth-adapter.js +13 -0
  23. package/dist/lib/generators/file-generators/auth-adapter.js.map +1 -0
  24. package/dist/lib/generators/file-generators/auth-check.js +40 -0
  25. package/dist/lib/generators/file-generators/auth-check.js.map +1 -0
  26. package/dist/lib/generators/file-generators/auth-store.js +2 -5
  27. package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
  28. package/dist/lib/generators/file-generators/background-sync.js +1 -1
  29. package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
  30. package/dist/lib/generators/file-generators/cache.js +2 -1
  31. package/dist/lib/generators/file-generators/cache.js.map +1 -1
  32. package/dist/lib/generators/file-generators/client-injector-bundle.js +15 -0
  33. package/dist/lib/generators/file-generators/client-injector-bundle.js.map +1 -0
  34. package/dist/lib/generators/file-generators/client-injector.js +2 -1
  35. package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
  36. package/dist/lib/generators/file-generators/connectivity-manager.js +12 -0
  37. package/dist/lib/generators/file-generators/connectivity-manager.js.map +1 -0
  38. package/dist/lib/generators/file-generators/connectivity.js +12 -0
  39. package/dist/lib/generators/file-generators/connectivity.js.map +1 -0
  40. package/dist/lib/generators/file-generators/context.js +7 -0
  41. package/dist/lib/generators/file-generators/context.js.map +1 -1
  42. package/dist/lib/generators/file-generators/fetch-wrapper.js +1 -1
  43. package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
  44. package/dist/lib/generators/file-generators/generate-framework-adapters.js +29 -20
  45. package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -1
  46. package/dist/lib/generators/file-generators/gql-wrapper.js +2 -2
  47. package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
  48. package/dist/lib/generators/file-generators/guide-generator.js +51 -1
  49. package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
  50. package/dist/lib/generators/file-generators/invalidation-tags.js +2 -3
  51. package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
  52. package/dist/lib/generators/file-generators/mutation-queue.js +2 -2
  53. package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
  54. package/dist/lib/generators/file-generators/mutation-state.js +1 -1
  55. package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
  56. package/dist/lib/generators/file-generators/notification-generator.js +6 -0
  57. package/dist/lib/generators/file-generators/notification-generator.js.map +1 -0
  58. package/dist/lib/generators/file-generators/open-db.js +6 -0
  59. package/dist/lib/generators/file-generators/open-db.js.map +1 -0
  60. package/dist/lib/generators/file-generators/push.js +1 -2
  61. package/dist/lib/generators/file-generators/push.js.map +1 -1
  62. package/dist/lib/generators/file-generators/pwa-install.js +2 -6
  63. package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
  64. package/dist/lib/generators/file-generators/server-push.js +1 -1
  65. package/dist/lib/generators/file-generators/server-push.js.map +1 -1
  66. package/dist/lib/generators/file-generators/storage-generator.js +6 -0
  67. package/dist/lib/generators/file-generators/storage-generator.js.map +1 -0
  68. package/dist/lib/generators/file-generators/storage-notify.js +6 -0
  69. package/dist/lib/generators/file-generators/storage-notify.js.map +1 -0
  70. package/dist/lib/generators/file-generators/storage.js +6 -0
  71. package/dist/lib/generators/file-generators/storage.js.map +1 -0
  72. package/dist/lib/generators/file-generators/sw-generator-build.js +96 -45
  73. package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
  74. package/dist/lib/generators/file-generators/sw-injector.js +0 -4
  75. package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
  76. package/dist/lib/generators/file-generators/sw-template.js +8 -9
  77. package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
  78. package/dist/lib/generators/file-generators/sw-version-gen.js +32 -0
  79. package/dist/lib/generators/file-generators/sw-version-gen.js.map +1 -0
  80. package/dist/lib/generators/file-generators/swoff-api-bundle.js +51 -0
  81. package/dist/lib/generators/file-generators/swoff-api-bundle.js.map +1 -0
  82. package/dist/lib/generators/sw-build-utils.js +69 -0
  83. package/dist/lib/generators/sw-build-utils.js.map +1 -0
  84. package/dist/lib/generators/sw-generator.js +23 -34
  85. package/dist/lib/generators/sw-generator.js.map +1 -1
  86. package/dist/lib/generators/sw-sections/activate-handler.js +74 -23
  87. package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
  88. package/dist/lib/generators/sw-sections/assemble-sw.js +15 -94
  89. package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
  90. package/dist/lib/generators/sw-sections/background-sync-handler.js +74 -72
  91. package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
  92. package/dist/lib/generators/sw-sections/batch-refresh-queue.js +102 -0
  93. package/dist/lib/generators/sw-sections/batch-refresh-queue.js.map +1 -0
  94. package/dist/lib/generators/sw-sections/config-header.js +2 -3
  95. package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
  96. package/dist/lib/generators/sw-sections/default-template.js +59 -6
  97. package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
  98. package/dist/lib/generators/sw-sections/fetch-handler.js +621 -495
  99. package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
  100. package/dist/lib/generators/sw-sections/install-handler.js +40 -23
  101. package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
  102. package/dist/lib/generators/sw-sections/message-handler.js +25 -8
  103. package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
  104. package/dist/lib/generators/sw-sections/server-push-handler.js +10 -14
  105. package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
  106. package/dist/lib/generators/sw-sections/shared.js +68 -0
  107. package/dist/lib/generators/sw-sections/shared.js.map +1 -0
  108. package/dist/lib/generators/sw-sections/sw-push.js +2 -6
  109. package/dist/lib/generators/sw-sections/sw-push.js.map +1 -1
  110. package/dist/lib/generators/sw-sections/tag-management.js +55 -86
  111. package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
  112. package/dist/lib/generators/swoff-files-generator.js +183 -59
  113. package/dist/lib/generators/swoff-files-generator.js.map +1 -1
  114. package/dist/lib/shared/config-types.js +67 -63
  115. package/dist/lib/shared/config-types.js.map +1 -1
  116. package/dist/lib/shared/feature-registry.js +198 -0
  117. package/dist/lib/shared/feature-registry.js.map +1 -0
  118. package/dist/lib/utils/detect-framework.js +52 -9
  119. package/dist/lib/utils/detect-framework.js.map +1 -1
  120. package/dist/runtime/api-config.js +2 -2
  121. package/dist/runtime/api-config.js.map +1 -1
  122. package/dist/runtime/auth-adapter.js +179 -0
  123. package/dist/runtime/auth-adapter.js.map +1 -0
  124. package/dist/runtime/auth-state.js +16 -6
  125. package/dist/runtime/auth-state.js.map +1 -1
  126. package/dist/runtime/auth-store.js +219 -213
  127. package/dist/runtime/auth-store.js.map +1 -1
  128. package/dist/runtime/auth-user.js +5 -19
  129. package/dist/runtime/auth-user.js.map +1 -1
  130. package/dist/runtime/background-sync.js +5 -2
  131. package/dist/runtime/background-sync.js.map +1 -1
  132. package/dist/runtime/cache.js +91 -3
  133. package/dist/runtime/cache.js.map +1 -1
  134. package/dist/runtime/client-injector-bundle.js +314 -0
  135. package/dist/runtime/client-injector-bundle.js.map +1 -0
  136. package/dist/runtime/client-injector.js +173 -30
  137. package/dist/runtime/client-injector.js.map +1 -1
  138. package/dist/runtime/connectivity-manager.js +83 -0
  139. package/dist/runtime/connectivity-manager.js.map +1 -0
  140. package/dist/runtime/connectivity.js +83 -0
  141. package/dist/runtime/connectivity.js.map +1 -0
  142. package/dist/runtime/fetch-wrapper.js +26 -59
  143. package/dist/runtime/fetch-wrapper.js.map +1 -1
  144. package/dist/runtime/gql-wrapper.js +15 -9
  145. package/dist/runtime/gql-wrapper.js.map +1 -1
  146. package/dist/runtime/invalidation-tags.js +12 -89
  147. package/dist/runtime/invalidation-tags.js.map +1 -1
  148. package/dist/runtime/mutation-queue.js +83 -31
  149. package/dist/runtime/mutation-queue.js.map +1 -1
  150. package/dist/runtime/mutation-state.js +3 -3
  151. package/dist/runtime/mutation-state.js.map +1 -1
  152. package/dist/runtime/notification.js +65 -0
  153. package/dist/runtime/notification.js.map +1 -0
  154. package/dist/runtime/open-db.js +41 -0
  155. package/dist/runtime/open-db.js.map +1 -0
  156. package/dist/runtime/push.js +15 -27
  157. package/dist/runtime/push.js.map +1 -1
  158. package/dist/runtime/pwa-injector.js +3 -32
  159. package/dist/runtime/pwa-injector.js.map +1 -1
  160. package/dist/runtime/pwa-prompt.js +35 -3
  161. package/dist/runtime/pwa-prompt.js.map +1 -1
  162. package/dist/runtime/reset.js +39 -42
  163. package/dist/runtime/reset.js.map +1 -1
  164. package/dist/runtime/server-push.js +23 -13
  165. package/dist/runtime/server-push.js.map +1 -1
  166. package/dist/runtime/storage.js +32 -0
  167. package/dist/runtime/storage.js.map +1 -0
  168. package/dist/runtime/sw-injector.js +19 -178
  169. package/dist/runtime/sw-injector.js.map +1 -1
  170. package/dist/runtime/sw-version.js +13 -0
  171. package/dist/runtime/sw-version.js.map +1 -0
  172. package/dist/runtime/swoff-api-bundle.js +1491 -0
  173. package/dist/runtime/swoff-api-bundle.js.map +1 -0
  174. package/dist/runtime/type-definitions.js +8 -7
  175. package/dist/runtime/type-definitions.js.map +1 -1
  176. package/dist/runtime/utils.js +4 -0
  177. package/dist/runtime/utils.js.map +1 -1
  178. package/dist/swoff-nkdhhmw8. +18 -0
  179. package/dist/swoff.js +5 -0
  180. package/package.json +1 -1
  181. package/templates/react/useAuth.jsx +7 -4
  182. package/templates/react/useAuth.tsx +14 -14
  183. package/templates/react/useBackgroundSync.jsx +5 -4
  184. package/templates/react/useBackgroundSync.tsx +5 -4
  185. package/templates/react/useCachedFetch.jsx +8 -0
  186. package/templates/react/useCachedFetch.tsx +8 -0
  187. package/templates/react/useMutation.jsx +60 -56
  188. package/templates/react/useMutation.tsx +65 -64
  189. package/templates/react/useMutationQueue.jsx +5 -1
  190. package/templates/react/useMutationQueue.tsx +8 -2
  191. package/templates/react/useMutationState.jsx +3 -4
  192. package/templates/react/useMutationState.tsx +4 -8
  193. package/templates/react/useNetworkStatus.jsx +57 -17
  194. package/templates/react/useNetworkStatus.tsx +42 -20
  195. package/templates/react/useOfflineAnalytics.jsx +42 -0
  196. package/templates/react/useOfflineAnalytics.tsx +50 -0
  197. package/templates/react/usePwaInstall.jsx +26 -0
  198. package/templates/react/usePwaInstall.tsx +26 -0
  199. package/templates/react/useSWUpdate.jsx +7 -52
  200. package/templates/react/useSWUpdate.tsx +12 -51
  201. package/templates/react/useStorageEstimate.jsx +56 -0
  202. package/templates/react/useStorageEstimate.tsx +67 -0
  203. package/dist/__tests__/assemble-sw.test.js +0 -145
  204. package/dist/__tests__/assemble-sw.test.js.map +0 -1
  205. package/dist/__tests__/cli-integration.test.js +0 -231
  206. package/dist/__tests__/cli-integration.test.js.map +0 -1
  207. package/dist/__tests__/config-types.test.js +0 -124
  208. package/dist/__tests__/config-types.test.js.map +0 -1
  209. package/dist/__tests__/detect-language.test.js +0 -51
  210. package/dist/__tests__/detect-language.test.js.map +0 -1
  211. package/dist/__tests__/file-generators.test.js +0 -228
  212. package/dist/__tests__/file-generators.test.js.map +0 -1
  213. package/dist/__tests__/glob-matcher.test.js +0 -86
  214. package/dist/__tests__/glob-matcher.test.js.map +0 -1
  215. package/dist/__tests__/invalidation-tags.test.js +0 -283
  216. package/dist/__tests__/invalidation-tags.test.js.map +0 -1
  217. package/dist/__tests__/loader.test.js +0 -77
  218. package/dist/__tests__/loader.test.js.map +0 -1
  219. package/dist/__tests__/validator.test.js +0 -340
  220. package/dist/__tests__/validator.test.js.map +0 -1
  221. package/templates/react/useCacheInvalidation.jsx +0 -19
  222. package/templates/react/useCacheInvalidation.tsx +0 -52
  223. package/templates/react/useIsFetching.jsx +0 -32
  224. package/templates/react/useIsFetching.tsx +0 -32
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swoff-api-bundle.js","sourceRoot":"","sources":["../../src/runtime/swoff-api-bundle.ts"],"names":[],"mappings":"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"}
@@ -38,7 +38,6 @@ declare global {
38
38
 
39
39
  interface WindowEventMap {
40
40
  beforeinstallprompt: BeforeInstallPromptEvent;
41
- "sw-update-available": CustomEvent<{ version: string }>;
42
41
  "sw-progress": CustomEvent<{ percent: number; downloaded: number; total: number }>;
43
42
  "sw-ready": CustomEvent;
44
43
  "sw-error": CustomEvent;
@@ -47,13 +46,20 @@ declare global {
47
46
  "mutation-sync-complete": CustomEvent<{ succeeded: number; failed: number }>;
48
47
  "mutation-queue-changed": CustomEvent;
49
48
  "cache-invalidated": CustomEvent<{ tags?: string[] }>;
50
- "fetch-count-changed": CustomEvent<{ count: number }>;
51
49
  "mutation-state-changed": CustomEvent<{ id: string; status: string; error?: Error; data?: unknown }>;
52
50
  "background-sync-complete": CustomEvent<{ succeeded: number; failed: number }>;
53
51
  "swoff:reset-start": CustomEvent;
54
52
  "swoff:reset-complete": CustomEvent<{ unregistered: boolean; reregistered: boolean; warnings: string[] }>;
55
53
  "push-subscription-changed": CustomEvent<{ subscribed: boolean }>;
56
54
  "push-permission-changed": CustomEvent<{ permission: NotificationPermission }>;
55
+ "swoff:notification": CustomEvent<{ level: "error" | "warn" | "info"; code: string; message: string }>;
56
+ "push-events-status": CustomEvent<{ connected: boolean }>;
57
+ "app-connectivity-change": CustomEvent<{ online: boolean }>;
58
+ "mutation-sync-progress": CustomEvent<{ succeeded: number; failed: number; total: number }>;
59
+ "swoff:cache-updated": CustomEvent<{ url: string }>;
60
+ "swoff:navigation-online": CustomEvent<{ url: string }>;
61
+ "swoff:offline-fallback": CustomEvent;
62
+ "sw-auth-unauthorized": CustomEvent;
57
63
  }
58
64
 
59
65
  interface Window {
@@ -61,14 +67,9 @@ declare global {
61
67
  pwaInstallable?: boolean;
62
68
  latestSWVersion?: string;
63
69
  currentSWVersion?: string;
64
- swRegisteredVersion?: string;
65
- swAvailableVersion?: string;
66
- swUpdateRequired?: boolean;
67
- swMinSupportedVersion?: string;
68
70
  swReady?: boolean;
69
71
  swError?: boolean;
70
72
  swAuthState?: "authenticated" | "unauthenticated" | "loading";
71
- swCurrentUser?: Record<string, unknown> | null;
72
73
  SyncManager?: { new(): SyncManager };
73
74
  }
74
75
 
@@ -1 +1 @@
1
- {"version":3,"file":"type-definitions.js","sourceRoot":"","sources":["../../src/runtime/type-definitions.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,2BAA2B;IACzC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsIR,CAAC;AACF,CAAC"}
1
+ {"version":3,"file":"type-definitions.js","sourceRoot":"","sources":["../../src/runtime/type-definitions.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,2BAA2B;IACzC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuIR,CAAC;AACF,CAAC"}
@@ -1,6 +1,9 @@
1
1
  export function T(ts, type) {
2
2
  return ts ? `: ${type}` : "";
3
3
  }
4
+ export function O(ts, type) {
5
+ return ts ? `?: ${type}` : "";
6
+ }
4
7
  export function R(ts, type) {
5
8
  return ts ? `: ${type} ` : " ";
6
9
  }
@@ -18,6 +21,7 @@ export function AS(ts, type) {
18
21
  export function genHelpers(ctx) {
19
22
  return {
20
23
  T: (type) => T(ctx.ts, type),
24
+ O: (type) => O(ctx.ts, type),
21
25
  R: (type) => R(ctx.ts, type),
22
26
  G: (type) => G(ctx.ts, type),
23
27
  PT: (type) => PT(ctx.ts, type),
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/runtime/utils.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,CAAC,CAAC,EAAW,EAAE,IAAY;IACzC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,CAAC,CAAC,EAAW,EAAE,IAAY;IACzC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,CAAC,CAAC,EAAW,EAAE,IAAY;IACzC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,EAAE,CAAC,EAAW,EAAE,IAAY;IAC1C,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,EAAE,CAAC,EAAW,EAAE,IAAY;IAC1C,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAmB;IAC5C,OAAO;QACL,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACpC,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACpC,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACpC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACtC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;KACvC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/runtime/utils.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,CAAC,CAAC,EAAW,EAAE,IAAY;IACzC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,CAAC,CAAC,EAAW,EAAE,IAAY;IACzC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,CAAC,CAAC,EAAW,EAAE,IAAY;IACzC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,CAAC,CAAC,EAAW,EAAE,IAAY;IACzC,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,EAAE,CAAC,EAAW,EAAE,IAAY;IAC1C,OAAO,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;AACrB,CAAC;AAED,qBAAqB;AACrB,MAAM,UAAU,EAAE,CAAC,EAAW,EAAE,IAAY;IAC1C,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,GAAmB;IAC5C,OAAO;QACL,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACpC,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACpC,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACpC,CAAC,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACpC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;QACtC,EAAE,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC;KACvC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { existsSync } from 'node:fs';
4
+ import { dirname, join } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ const __dirname = dirname(fileURLToPath(import.meta.url));
8
+ const entryPoint = join(__dirname, '..', 'dist', 'index.js');
9
+
10
+ if (!existsSync(entryPoint)) {
11
+ console.error('Error: CLI not built. Run: npm run build');
12
+ process.exit(1);
13
+ }
14
+
15
+ import(entryPoint).catch((err) => {
16
+ console.error('Error:', err instanceof Error ? err.message : String(err));
17
+ process.exit(1);
18
+ });
package/dist/swoff.js ADDED
@@ -0,0 +1,5 @@
1
+ // apps/cli/bin/swoff
2
+ var swoff_default = "./swoff-nkdhhmw8.";
3
+ export {
4
+ swoff_default as default
5
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swoff/cli",
3
- "version": "0.3.13",
3
+ "version": "0.3.14",
4
4
  "type": "module",
5
5
  "description": "CLI for Swoff - Offline-first web apps made easy",
6
6
  "bin": {
@@ -6,23 +6,26 @@ import { setAuth, clearAuth, ensureValidAuth } from "../auth/store.js";
6
6
  * Reactive auth state with actions: setAuth, clearAuth, ensureValid.
7
7
  *
8
8
  * Usage:
9
- * const { authenticated, user, online, isLoading, error, setAuth, clearAuth, ensureValid } = useAuth();
9
+ * const { authenticated, auth, online, isLoading, error, setAuth, clearAuth, ensureValid } = useAuth();
10
10
  *
11
11
  * // Login — call setAuth with the response from your login endpoint:
12
12
  * const res = await fetch("/api/login", { method: "POST", body });
13
13
  * const data = await res.json();
14
14
  * await setAuth({ token: data.token, user: data.user, expiresAt: data.expiresAt });
15
15
  *
16
+ * // Access user data:
17
+ * const userName = auth?.user?.name;
18
+ *
16
19
  * // Logout:
17
20
  * await clearAuth();
18
21
  *
19
22
  * // Silent session restore:
20
- * const auth = await ensureValid();
23
+ * const authData = await ensureValid();
21
24
  */
22
25
  export function useAuth() {
23
26
  const [state, setState] = useState(() => ({
24
27
  authenticated: false,
25
- user: null,
28
+ auth: null,
26
29
  online: typeof navigator !== "undefined" ? navigator.onLine : true,
27
30
  isLoading: false,
28
31
  error: null,
@@ -95,7 +98,7 @@ export function useAuth() {
95
98
 
96
99
  return {
97
100
  authenticated: state.authenticated,
98
- user: state.user,
101
+ auth: state.auth,
99
102
  online: state.online,
100
103
  isLoading: state.isLoading,
101
104
  error: state.error,
@@ -1,37 +1,37 @@
1
1
  import { useState, useEffect, useCallback } from "react";
2
2
  import { getAuthState } from "../auth/state.ts";
3
3
  import { setAuth, clearAuth, ensureValidAuth } from "../auth/store.ts";
4
- import type { AuthData } from "../auth/store.ts";
4
+ import type { AuthData } from "../auth/adapter.ts";
5
5
 
6
6
  /**
7
7
  * Reactive auth state with actions: setAuth, clearAuth, ensureValid.
8
8
  *
9
+ * Listens for sw-auth-state-change events (dispatched by clearAuth(),
10
+ * setAuth(), or the SW's AUTH_CLEARED broadcast).
11
+ *
9
12
  * Usage:
10
- * const { authenticated, user, online, isLoading, error, setAuth, clearAuth, ensureValid } = useAuth();
13
+ * const { authenticated, auth, online, isLoading, error, setAuth, clearAuth, ensureValid } = useAuth();
11
14
  *
12
- * // Login — call setAuth with the response from your login endpoint:
15
+ * // Login:
13
16
  * const res = await fetch("/api/login", { method: "POST", body });
14
17
  * const data = await res.json();
15
18
  * await setAuth({ token: data.token, user: data.user, expiresAt: data.expiresAt });
16
19
  *
20
+ * // Access user data (typed via AuthData):
21
+ * const userName = auth?.user?.name;
22
+ *
17
23
  * // Logout — clears tokens from memory and user cache from IndexedDB:
18
24
  * await clearAuth();
19
25
  *
20
- * // Silently refresh the session (page restore) — wraps ensureValidAuth():
21
- * const auth = await ensureValid();
22
- *
23
- * Auth behavior by type:
24
- * - Cookie auth: credentials ("include") sent automatically by the browser.
25
- * setAuth still caches user data for offline display.
26
- * - Bearer auth: token lives in memory only. clearAuth wipes it.
27
- * ensureValid tries a silent refresh via refreshSession() in auth/user.ts.
26
+ * // Silently refresh the session (page restore):
27
+ * const authData = await ensureValid();
28
28
  *
29
- * @returns {{ authenticated, user, online, isLoading, error, setAuth, clearAuth, ensureValid }}
29
+ * @returns {{ authenticated, auth, online, isLoading, error, setAuth, clearAuth, ensureValid }}
30
30
  */
31
31
  export function useAuth() {
32
32
  const [state, setState] = useState(() => ({
33
33
  authenticated: false,
34
- user: null as Record<string, unknown> | null,
34
+ auth: null as AuthData | null,
35
35
  online: typeof navigator !== "undefined" ? navigator.onLine : true,
36
36
  isLoading: false,
37
37
  error: null as Error | null,
@@ -107,7 +107,7 @@ export function useAuth() {
107
107
 
108
108
  return {
109
109
  authenticated: state.authenticated,
110
- user: state.user,
110
+ auth: state.auth,
111
111
  online: state.online,
112
112
  isLoading: state.isLoading,
113
113
  error: state.error,
@@ -1,11 +1,12 @@
1
1
  import { useState, useEffect, useCallback } from "react";
2
- import { retrySync } from "../offline/sync.js";
2
+ import { retrySync } from "../mutation/sync.js";
3
3
 
4
4
  export function useBackgroundSync() {
5
5
  const [state, setState] = useState(() => ({
6
- supported: typeof window !== "undefined" && typeof navigator !== "undefined"
7
- ? "serviceWorker" in navigator && "SyncManager" in window
8
- : false,
6
+ supported:
7
+ typeof window !== "undefined" && typeof navigator !== "undefined"
8
+ ? "serviceWorker" in navigator && "SyncManager" in window
9
+ : false,
9
10
  registered: false,
10
11
  lastSync: null,
11
12
  }));
@@ -1,11 +1,12 @@
1
1
  import { useState, useEffect, useCallback } from "react";
2
- import { retrySync } from "../offline/sync.ts";
2
+ import { retrySync } from "../mutation/sync.ts";
3
3
 
4
4
  export function useBackgroundSync() {
5
5
  const [state, setState] = useState(() => ({
6
- supported: typeof window !== "undefined" && typeof navigator !== "undefined"
7
- ? "serviceWorker" in navigator && "SyncManager" in window
8
- : false,
6
+ supported:
7
+ typeof window !== "undefined" && typeof navigator !== "undefined"
8
+ ? "serviceWorker" in navigator && "SyncManager" in window
9
+ : false,
9
10
  registered: false,
10
11
  lastSync: null as { succeeded: number; failed: number } | null,
11
12
  }));
@@ -79,6 +79,14 @@ export function useCachedFetch(url, options = {}) {
79
79
  if (cancelled) return;
80
80
  let selected = null;
81
81
  if (response) {
82
+ if (!response.ok) {
83
+ let errorMessage = `HTTP ${response.status}`;
84
+ try {
85
+ const errBody = await response.json();
86
+ errorMessage = errBody?.message || errBody?.error || errorMessage;
87
+ } catch {}
88
+ throw new Error(errorMessage);
89
+ }
82
90
  const raw = await response.json();
83
91
  selected = select ? select(raw) : raw;
84
92
  setData(selected);
@@ -99,6 +99,14 @@ export function useCachedFetch<T = unknown, R = T>(
99
99
  if (cancelled) return;
100
100
  let selected: R | null = null;
101
101
  if (response) {
102
+ if (!response.ok) {
103
+ let errorMessage = `HTTP ${response.status}`;
104
+ try {
105
+ const errBody = await response.json();
106
+ errorMessage = errBody?.message || errBody?.error || errorMessage;
107
+ } catch {}
108
+ throw new Error(errorMessage);
109
+ }
102
110
  const raw: T = await response.json();
103
111
  selected = select ? select(raw) : (raw as unknown as R);
104
112
  setData(selected);
@@ -4,7 +4,7 @@ import {
4
4
  trackMutation,
5
5
  resolveMutation,
6
6
  rejectMutation,
7
- } from "../offline/state.js";
7
+ } from "../mutation/state.js";
8
8
 
9
9
  /**
10
10
  * Hook for mutations (POST, PUT, PATCH, DELETE) with auto-invalidation, offline queuing,
@@ -25,19 +25,19 @@ import {
25
25
  * // Optimistic update with rollback:
26
26
  * const { mutate } = useMutation("/api/todos", {
27
27
  * method: "POST",
28
- * onMutate: () => { /* set optimistic state */ },
29
- * onError: () => { /* rollback */ },
28
+ * onMutate: () => { /* set optimistic state *\\/ },
29
+ * onError: () => { /* rollback *\\/ },
30
30
  * });
31
+ *
32
+ * // Check result status after mutate:
33
+ * const result = await mutate(body);
34
+ * if (result.status === "success") navigate(`/item/${result.data.id}`);
35
+ * if (result.status === "queued") navigate("/items");
36
+ * if (result.status === "error") setError(result.error.message);
31
37
  */
32
38
  export function useMutation(url, options = {}) {
33
- const [state, setState] = useState({
34
- data: null,
35
- error: null,
36
- isLoading: false,
37
- isError: false,
38
- isSuccess: false,
39
- });
40
-
39
+ const [lastResult, setLastResult] = useState(null);
40
+ const [isLoading, setIsLoading] = useState(false);
41
41
  const [mutationId, setMutationId] = useState(null);
42
42
  const optionsRef = useRef(options);
43
43
  const urlRef = useRef(url);
@@ -47,59 +47,60 @@ export function useMutation(url, options = {}) {
47
47
 
48
48
  const mutate = useCallback(async (body, callbacks) => {
49
49
  const key = optionsRef.current.mutationKey;
50
- if (key && inFlightKeys.current.has(key)) return null;
50
+ if (key && inFlightKeys.current.has(key)) return { status: "skipped" };
51
51
  if (key) inFlightKeys.current.add(key);
52
52
 
53
- let retriesLeft = optionsRef.current.retry === true
54
- ? Infinity
55
- : (optionsRef.current.retry ?? 0);
53
+ let retriesLeft =
54
+ optionsRef.current.retry === true
55
+ ? Infinity
56
+ : typeof optionsRef.current.retry === "number"
57
+ ? optionsRef.current.retry
58
+ : 0;
56
59
 
57
60
  const mid = "mut-" + crypto.randomUUID();
58
61
  setMutationId(mid);
59
62
  trackMutation(mid, "pending");
60
- setState({
61
- data: null,
62
- error: null,
63
- isLoading: true,
64
- isError: false,
65
- isSuccess: false,
66
- });
63
+ setIsLoading(true);
67
64
 
68
65
  optionsRef.current.onMutate?.();
69
66
 
70
67
  const attempt = async () => {
71
68
  try {
72
- const fetchOptions = { ...optionsRef.current, body };
73
- const { response, queued } = await fetchWithCache(urlRef.current, fetchOptions);
69
+ const {
70
+ mutationKey,
71
+ onMutate,
72
+ onSuccess,
73
+ onError,
74
+ onSettled,
75
+ retry,
76
+ ...fetchOnlyOptions
77
+ } = optionsRef.current;
78
+ const fetchOptions = { ...fetchOnlyOptions, body };
79
+ const { response, queued } = await fetchWithCache(
80
+ urlRef.current,
81
+ fetchOptions,
82
+ );
74
83
  if (queued) {
75
84
  resolveMutation(mid, null);
76
- setState({
77
- data: null,
78
- error: null,
79
- isLoading: false,
80
- isError: false,
81
- isSuccess: false,
82
- });
85
+ setIsLoading(false);
86
+ const r = { status: "queued" };
87
+ setLastResult(r);
83
88
  optionsRef.current.onSettled?.();
84
89
  callbacks?.onSettled?.();
85
90
  if (key) inFlightKeys.current.delete(key);
86
- return null;
91
+ return r;
87
92
  }
88
93
  const data = await response.json();
89
94
  resolveMutation(mid, data);
90
- setState({
91
- data,
92
- error: null,
93
- isLoading: false,
94
- isError: false,
95
- isSuccess: true,
96
- });
95
+ setIsLoading(false);
96
+ const r = { status: "success", data };
97
+ setLastResult(r);
97
98
  optionsRef.current.onSuccess?.(data);
98
99
  callbacks?.onSuccess?.(data);
99
100
  optionsRef.current.onSettled?.();
100
101
  callbacks?.onSettled?.();
101
102
  if (key) inFlightKeys.current.delete(key);
102
- return data;
103
+ return r;
103
104
  } catch (err) {
104
105
  if (retriesLeft > 0) {
105
106
  retriesLeft--;
@@ -108,19 +109,15 @@ export function useMutation(url, options = {}) {
108
109
  }
109
110
  const error = err instanceof Error ? err : new Error(String(err));
110
111
  rejectMutation(mid, error);
111
- setState({
112
- data: null,
113
- error,
114
- isLoading: false,
115
- isError: true,
116
- isSuccess: false,
117
- });
112
+ setIsLoading(false);
113
+ const r = { status: "error", error };
114
+ setLastResult(r);
118
115
  optionsRef.current.onError?.(error);
119
116
  callbacks?.onError?.(error);
120
117
  optionsRef.current.onSettled?.();
121
118
  callbacks?.onSettled?.();
122
119
  if (key) inFlightKeys.current.delete(key);
123
- return null;
120
+ return r;
124
121
  }
125
122
  };
126
123
 
@@ -128,14 +125,21 @@ export function useMutation(url, options = {}) {
128
125
  }, []);
129
126
 
130
127
  const reset = useCallback(() => {
131
- setState({
132
- data: null,
133
- error: null,
134
- isLoading: false,
135
- isError: false,
136
- isSuccess: false,
137
- });
128
+ setLastResult(null);
129
+ setIsLoading(false);
138
130
  }, []);
139
131
 
140
- return { ...state, mutate, reset, mutationId };
132
+ return {
133
+ mutate,
134
+ isLoading,
135
+ isIdle: lastResult === null,
136
+ isQueued: lastResult?.status === "queued",
137
+ isSuccess: lastResult?.status === "success",
138
+ isError: lastResult?.status === "error",
139
+ data: lastResult?.status === "success" ? (lastResult.data ?? null) : null,
140
+ error: lastResult?.status === "error" ? (lastResult.error ?? null) : null,
141
+ lastResult,
142
+ reset,
143
+ mutationId,
144
+ };
141
145
  }