@swoff/cli 0.3.12 → 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.
- package/README.md +32 -30
- package/dist/index.js +2 -32
- package/dist/index.js.map +1 -1
- package/dist/lib/cli/help.js +6 -16
- package/dist/lib/cli/help.js.map +1 -1
- package/dist/lib/cli/logger.js +1 -0
- package/dist/lib/cli/logger.js.map +1 -1
- package/dist/lib/commands/add.js +29 -87
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/assets.js +11 -4
- package/dist/lib/commands/assets.js.map +1 -1
- package/dist/lib/commands/clean.js +2 -10
- package/dist/lib/commands/clean.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +16 -30
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/generate.js +55 -58
- package/dist/lib/commands/generate.js.map +1 -1
- package/dist/lib/commands/init.js +187 -31
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/commands/validate.js +2 -4
- package/dist/lib/commands/validate.js.map +1 -1
- package/dist/lib/config/loader.js +34 -25
- package/dist/lib/config/loader.js.map +1 -1
- package/dist/lib/config/validator.js +210 -89
- package/dist/lib/config/validator.js.map +1 -1
- package/dist/lib/generators/file-generators/api-config.js +1 -1
- package/dist/lib/generators/file-generators/api-config.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-adapter.js +13 -0
- package/dist/lib/generators/file-generators/auth-adapter.js.map +1 -0
- package/dist/lib/generators/file-generators/auth-check.js +40 -0
- package/dist/lib/generators/file-generators/auth-check.js.map +1 -0
- package/dist/lib/generators/file-generators/auth-store.js +2 -5
- package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
- package/dist/lib/generators/file-generators/background-sync.js +1 -1
- package/dist/lib/generators/file-generators/background-sync.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +2 -1
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector-bundle.js +15 -0
- package/dist/lib/generators/file-generators/client-injector-bundle.js.map +1 -0
- package/dist/lib/generators/file-generators/client-injector.js +2 -1
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/connectivity-manager.js +12 -0
- package/dist/lib/generators/file-generators/connectivity-manager.js.map +1 -0
- package/dist/lib/generators/file-generators/connectivity.js +12 -0
- package/dist/lib/generators/file-generators/connectivity.js.map +1 -0
- package/dist/lib/generators/file-generators/context.js +7 -0
- package/dist/lib/generators/file-generators/context.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-framework-adapters.js +29 -23
- package/dist/lib/generators/file-generators/generate-framework-adapters.js.map +1 -1
- package/dist/lib/generators/file-generators/gql-wrapper.js +2 -2
- package/dist/lib/generators/file-generators/gql-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/guide-generator.js +57 -16
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
- package/dist/lib/generators/file-generators/invalidation-tags.js +2 -3
- package/dist/lib/generators/file-generators/invalidation-tags.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +2 -2
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-state.js +1 -1
- package/dist/lib/generators/file-generators/mutation-state.js.map +1 -1
- package/dist/lib/generators/file-generators/notification-generator.js +6 -0
- package/dist/lib/generators/file-generators/notification-generator.js.map +1 -0
- package/dist/lib/generators/file-generators/open-db.js +6 -0
- package/dist/lib/generators/file-generators/open-db.js.map +1 -0
- package/dist/lib/generators/file-generators/push.js +1 -2
- package/dist/lib/generators/file-generators/push.js.map +1 -1
- package/dist/lib/generators/file-generators/pwa-install.js +2 -6
- package/dist/lib/generators/file-generators/pwa-install.js.map +1 -1
- package/dist/lib/generators/file-generators/server-push.js +1 -1
- package/dist/lib/generators/file-generators/server-push.js.map +1 -1
- package/dist/lib/generators/file-generators/storage-generator.js +6 -0
- package/dist/lib/generators/file-generators/storage-generator.js.map +1 -0
- package/dist/lib/generators/file-generators/storage-notify.js +6 -0
- package/dist/lib/generators/file-generators/storage-notify.js.map +1 -0
- package/dist/lib/generators/file-generators/storage.js +6 -0
- package/dist/lib/generators/file-generators/storage.js.map +1 -0
- package/dist/lib/generators/file-generators/sw-generator-build.js +96 -45
- package/dist/lib/generators/file-generators/sw-generator-build.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +1 -4
- package/dist/lib/generators/file-generators/sw-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-template.js +8 -9
- package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-version-gen.js +32 -0
- package/dist/lib/generators/file-generators/sw-version-gen.js.map +1 -0
- package/dist/lib/generators/file-generators/swoff-api-bundle.js +51 -0
- package/dist/lib/generators/file-generators/swoff-api-bundle.js.map +1 -0
- package/dist/lib/generators/sw-build-utils.js +69 -0
- package/dist/lib/generators/sw-build-utils.js.map +1 -0
- package/dist/lib/generators/sw-generator.js +26 -45
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js +74 -23
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +15 -95
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/background-sync-handler.js +74 -72
- package/dist/lib/generators/sw-sections/background-sync-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/batch-refresh-queue.js +102 -0
- package/dist/lib/generators/sw-sections/batch-refresh-queue.js.map +1 -0
- package/dist/lib/generators/sw-sections/config-header.js +2 -3
- package/dist/lib/generators/sw-sections/config-header.js.map +1 -1
- package/dist/lib/generators/sw-sections/default-template.js +59 -6
- package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +621 -495
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/install-handler.js +40 -23
- package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/message-handler.js +25 -8
- package/dist/lib/generators/sw-sections/message-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/server-push-handler.js +10 -14
- package/dist/lib/generators/sw-sections/server-push-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/shared.js +68 -0
- package/dist/lib/generators/sw-sections/shared.js.map +1 -0
- package/dist/lib/generators/sw-sections/sw-push.js +2 -6
- package/dist/lib/generators/sw-sections/sw-push.js.map +1 -1
- package/dist/lib/generators/sw-sections/tag-management.js +55 -86
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +185 -66
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +68 -72
- package/dist/lib/shared/config-types.js.map +1 -1
- package/dist/lib/shared/feature-registry.js +198 -0
- package/dist/lib/shared/feature-registry.js.map +1 -0
- package/dist/lib/utils/detect-framework.js +52 -9
- package/dist/lib/utils/detect-framework.js.map +1 -1
- package/dist/runtime/api-config.js +2 -2
- package/dist/runtime/api-config.js.map +1 -1
- package/dist/runtime/auth-adapter.js +179 -0
- package/dist/runtime/auth-adapter.js.map +1 -0
- package/dist/runtime/auth-state.js +16 -6
- package/dist/runtime/auth-state.js.map +1 -1
- package/dist/runtime/auth-store.js +219 -213
- package/dist/runtime/auth-store.js.map +1 -1
- package/dist/runtime/auth-user.js +5 -19
- package/dist/runtime/auth-user.js.map +1 -1
- package/dist/runtime/background-sync.js +5 -2
- package/dist/runtime/background-sync.js.map +1 -1
- package/dist/runtime/cache.js +91 -3
- package/dist/runtime/cache.js.map +1 -1
- package/dist/runtime/client-injector-bundle.js +314 -0
- package/dist/runtime/client-injector-bundle.js.map +1 -0
- package/dist/runtime/client-injector.js +173 -30
- package/dist/runtime/client-injector.js.map +1 -1
- package/dist/runtime/connectivity-manager.js +83 -0
- package/dist/runtime/connectivity-manager.js.map +1 -0
- package/dist/runtime/connectivity.js +83 -0
- package/dist/runtime/connectivity.js.map +1 -0
- package/dist/runtime/fetch-wrapper.js +26 -59
- package/dist/runtime/fetch-wrapper.js.map +1 -1
- package/dist/runtime/gql-wrapper.js +15 -9
- package/dist/runtime/gql-wrapper.js.map +1 -1
- package/dist/runtime/invalidation-tags.js +12 -89
- package/dist/runtime/invalidation-tags.js.map +1 -1
- package/dist/runtime/mutation-queue.js +83 -31
- package/dist/runtime/mutation-queue.js.map +1 -1
- package/dist/runtime/mutation-state.js +3 -3
- package/dist/runtime/mutation-state.js.map +1 -1
- package/dist/runtime/notification.js +65 -0
- package/dist/runtime/notification.js.map +1 -0
- package/dist/runtime/open-db.js +41 -0
- package/dist/runtime/open-db.js.map +1 -0
- package/dist/runtime/push.js +15 -27
- package/dist/runtime/push.js.map +1 -1
- package/dist/runtime/pwa-injector.js +3 -32
- package/dist/runtime/pwa-injector.js.map +1 -1
- package/dist/runtime/pwa-prompt.js +35 -3
- package/dist/runtime/pwa-prompt.js.map +1 -1
- package/dist/runtime/reset.js +39 -42
- package/dist/runtime/reset.js.map +1 -1
- package/dist/runtime/server-push.js +23 -13
- package/dist/runtime/server-push.js.map +1 -1
- package/dist/runtime/storage.js +32 -0
- package/dist/runtime/storage.js.map +1 -0
- package/dist/runtime/sw-injector.js +19 -178
- package/dist/runtime/sw-injector.js.map +1 -1
- package/dist/runtime/sw-version.js +13 -0
- package/dist/runtime/sw-version.js.map +1 -0
- package/dist/runtime/swoff-api-bundle.js +1491 -0
- package/dist/runtime/swoff-api-bundle.js.map +1 -0
- package/dist/runtime/type-definitions.js +8 -7
- package/dist/runtime/type-definitions.js.map +1 -1
- package/dist/runtime/utils.js +4 -0
- package/dist/runtime/utils.js.map +1 -1
- package/dist/swoff-nkdhhmw8. +18 -0
- package/dist/swoff.js +5 -0
- package/package.json +1 -3
- package/templates/react/useAuth.jsx +7 -4
- package/templates/react/useAuth.tsx +14 -14
- package/templates/react/useBackgroundSync.jsx +5 -4
- package/templates/react/useBackgroundSync.tsx +5 -4
- package/templates/react/useCachedFetch.jsx +8 -0
- package/templates/react/useCachedFetch.tsx +8 -0
- package/templates/react/useMutation.jsx +60 -56
- package/templates/react/useMutation.tsx +65 -64
- package/templates/react/useMutationQueue.jsx +5 -1
- package/templates/react/useMutationQueue.tsx +8 -2
- package/templates/react/useMutationState.jsx +3 -4
- package/templates/react/useMutationState.tsx +4 -8
- package/templates/react/useNetworkStatus.jsx +57 -17
- package/templates/react/useNetworkStatus.tsx +42 -20
- package/templates/react/useOfflineAnalytics.jsx +42 -0
- package/templates/react/useOfflineAnalytics.tsx +50 -0
- package/templates/react/usePwaInstall.jsx +26 -0
- package/templates/react/usePwaInstall.tsx +26 -0
- package/templates/react/useSWUpdate.jsx +7 -52
- package/templates/react/useSWUpdate.tsx +12 -51
- package/templates/react/useStorageEstimate.jsx +56 -0
- package/templates/react/useStorageEstimate.tsx +67 -0
- package/dist/__tests__/assemble-sw.test.js +0 -145
- package/dist/__tests__/assemble-sw.test.js.map +0 -1
- package/dist/__tests__/cli-integration.test.js +0 -231
- package/dist/__tests__/cli-integration.test.js.map +0 -1
- package/dist/__tests__/config-types.test.js +0 -124
- package/dist/__tests__/config-types.test.js.map +0 -1
- package/dist/__tests__/detect-language.test.js +0 -51
- package/dist/__tests__/detect-language.test.js.map +0 -1
- package/dist/__tests__/file-generators.test.js +0 -228
- package/dist/__tests__/file-generators.test.js.map +0 -1
- package/dist/__tests__/glob-matcher.test.js +0 -86
- package/dist/__tests__/glob-matcher.test.js.map +0 -1
- package/dist/__tests__/invalidation-tags.test.js +0 -283
- package/dist/__tests__/invalidation-tags.test.js.map +0 -1
- package/dist/__tests__/loader.test.js +0 -77
- package/dist/__tests__/loader.test.js.map +0 -1
- package/dist/__tests__/validator.test.js +0 -340
- package/dist/__tests__/validator.test.js.map +0 -1
- package/templates/react/useCacheInvalidation.jsx +0 -19
- package/templates/react/useCacheInvalidation.tsx +0 -52
- package/templates/react/useIsFetching.jsx +0 -32
- package/templates/react/useIsFetching.tsx +0 -32
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-types.js","sourceRoot":"","sources":["../../../src/lib/shared/config-types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config-types.js","sourceRoot":"","sources":["../../../src/lib/shared/config-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
const AUTH_INCOMPATIBLE = ["bearer", "custom"];
|
|
2
|
+
function buildCheck(configKey, extraCondition) {
|
|
3
|
+
const keys = configKey.split(".");
|
|
4
|
+
return (config) => {
|
|
5
|
+
let obj = config;
|
|
6
|
+
for (const key of keys) {
|
|
7
|
+
if (obj == null || typeof obj !== "object")
|
|
8
|
+
return false;
|
|
9
|
+
obj = obj[key];
|
|
10
|
+
}
|
|
11
|
+
if (extraCondition)
|
|
12
|
+
return !!obj && extraCondition(config);
|
|
13
|
+
return !!obj;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export const FEATURES = {
|
|
17
|
+
"connectivity": {
|
|
18
|
+
id: "connectivity",
|
|
19
|
+
label: "Connectivity Heartbeat",
|
|
20
|
+
description: "Online/offline detection with periodic heartbeat",
|
|
21
|
+
requires: [],
|
|
22
|
+
incompatibleAuthTypes: [],
|
|
23
|
+
checkEnabled: buildCheck("features.connectivity.enabled"),
|
|
24
|
+
configUpdate: { connectivity: { enabled: true } },
|
|
25
|
+
isCore: false,
|
|
26
|
+
},
|
|
27
|
+
"tag-invalidation": {
|
|
28
|
+
id: "tag-invalidation",
|
|
29
|
+
label: "Tag Invalidation",
|
|
30
|
+
description: "Tag-based cache invalidation system with fetch wrapper",
|
|
31
|
+
requires: [],
|
|
32
|
+
incompatibleAuthTypes: [],
|
|
33
|
+
checkEnabled: buildCheck("features.tagInvalidation.enabled"),
|
|
34
|
+
configUpdate: { tagInvalidation: { enabled: true } },
|
|
35
|
+
isCore: false,
|
|
36
|
+
},
|
|
37
|
+
pwa: {
|
|
38
|
+
id: "pwa",
|
|
39
|
+
label: "PWA Install Prompt",
|
|
40
|
+
description: "PWA install prompt, update notification, and manifest generation",
|
|
41
|
+
requires: [],
|
|
42
|
+
incompatibleAuthTypes: [],
|
|
43
|
+
checkEnabled: buildCheck("features.pwa.enabled"),
|
|
44
|
+
configUpdate: { pwa: { enabled: true } },
|
|
45
|
+
isCore: false,
|
|
46
|
+
},
|
|
47
|
+
auth: {
|
|
48
|
+
id: "auth",
|
|
49
|
+
label: "Authentication",
|
|
50
|
+
description: "Auth token management, session refresh, and protected routes",
|
|
51
|
+
requires: ["connectivity"],
|
|
52
|
+
incompatibleAuthTypes: [],
|
|
53
|
+
checkEnabled: buildCheck("features.auth.enabled"),
|
|
54
|
+
configUpdate: { auth: { enabled: true, type: "cookie" } },
|
|
55
|
+
isCore: false,
|
|
56
|
+
},
|
|
57
|
+
"mutation-queue": {
|
|
58
|
+
id: "mutation-queue",
|
|
59
|
+
label: "Mutation Queue",
|
|
60
|
+
description: "Queue POST/PUT/DELETE mutations when offline and replay when online",
|
|
61
|
+
requires: ["tag-invalidation"],
|
|
62
|
+
incompatibleAuthTypes: [],
|
|
63
|
+
checkEnabled: buildCheck("features.mutationQueue.enabled"),
|
|
64
|
+
configUpdate: {
|
|
65
|
+
mutationQueue: {
|
|
66
|
+
enabled: true,
|
|
67
|
+
batchSize: 1,
|
|
68
|
+
batchDelayMs: 0,
|
|
69
|
+
backgroundSync: false,
|
|
70
|
+
retry: { maxRetries: 5, backoffMs: 1000, maxBackoffMs: 30000, jitterMs: 250 },
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
isCore: false,
|
|
74
|
+
},
|
|
75
|
+
"background-sync": {
|
|
76
|
+
id: "background-sync",
|
|
77
|
+
label: "Background Sync",
|
|
78
|
+
description: "Synchronize queued mutations using the Background Sync API when connectivity returns",
|
|
79
|
+
requires: ["mutation-queue"],
|
|
80
|
+
incompatibleAuthTypes: AUTH_INCOMPATIBLE,
|
|
81
|
+
checkEnabled: (config) => {
|
|
82
|
+
const mq = config.features.mutationQueue;
|
|
83
|
+
if (!mq || !mq.backgroundSync || !mq.enabled)
|
|
84
|
+
return false;
|
|
85
|
+
const a = config.features.auth;
|
|
86
|
+
return !a || !a.enabled || a.type === "cookie";
|
|
87
|
+
},
|
|
88
|
+
configUpdate: { mutationQueue: { enabled: true, backgroundSync: true } },
|
|
89
|
+
isCore: false,
|
|
90
|
+
},
|
|
91
|
+
graphql: {
|
|
92
|
+
id: "graphql",
|
|
93
|
+
label: "GraphQL",
|
|
94
|
+
description: "GraphQL endpoint integration with tag-based cache invalidation",
|
|
95
|
+
requires: ["tag-invalidation"],
|
|
96
|
+
incompatibleAuthTypes: [],
|
|
97
|
+
checkEnabled: buildCheck("features.graphql.enabled"),
|
|
98
|
+
configUpdate: { graphql: { enabled: true, endpoints: ["/graphql"] } },
|
|
99
|
+
isCore: false,
|
|
100
|
+
},
|
|
101
|
+
"push-notification": {
|
|
102
|
+
id: "push-notification",
|
|
103
|
+
label: "Push Notifications",
|
|
104
|
+
description: "Web Push API notifications with SW push event handling",
|
|
105
|
+
requires: [],
|
|
106
|
+
incompatibleAuthTypes: [],
|
|
107
|
+
checkEnabled: buildCheck("features.pushNotifications"),
|
|
108
|
+
configUpdate: { pushNotifications: true },
|
|
109
|
+
isCore: false,
|
|
110
|
+
},
|
|
111
|
+
"server-push": {
|
|
112
|
+
id: "server-push",
|
|
113
|
+
label: "Server Push",
|
|
114
|
+
description: "Real-time server push over SSE or WebSocket for live cache invalidation",
|
|
115
|
+
requires: [],
|
|
116
|
+
incompatibleAuthTypes: AUTH_INCOMPATIBLE,
|
|
117
|
+
checkEnabled: (config) => {
|
|
118
|
+
const sp = config.features.serverPush;
|
|
119
|
+
if (!sp || !sp.enabled)
|
|
120
|
+
return false;
|
|
121
|
+
const a = config.features.auth;
|
|
122
|
+
return !a || !a.enabled || a.type === "cookie";
|
|
123
|
+
},
|
|
124
|
+
configUpdate: {
|
|
125
|
+
serverPush: {
|
|
126
|
+
enabled: true,
|
|
127
|
+
type: "sse",
|
|
128
|
+
endpoint: "/api/events",
|
|
129
|
+
reconnectDelayMs: 5000,
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
isCore: false,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
export function getFeature(id) {
|
|
136
|
+
return FEATURES[id];
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Resolve all transitive dependencies of the given features.
|
|
140
|
+
* Returns the full set of feature IDs needed (including the inputs).
|
|
141
|
+
*/
|
|
142
|
+
export function resolveDependencies(featureIds) {
|
|
143
|
+
const resolved = new Set();
|
|
144
|
+
function walk(ids) {
|
|
145
|
+
for (const id of ids) {
|
|
146
|
+
if (resolved.has(id))
|
|
147
|
+
continue;
|
|
148
|
+
resolved.add(id);
|
|
149
|
+
const feature = FEATURES[id];
|
|
150
|
+
if (feature)
|
|
151
|
+
walk(feature.requires);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
walk(featureIds);
|
|
155
|
+
return [...resolved];
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Returns the subset of featureIds that has an auth type conflict
|
|
159
|
+
* with the given config.
|
|
160
|
+
*/
|
|
161
|
+
export function getAuthConflicts(featureIds, config) {
|
|
162
|
+
if (!config.features.auth.enabled)
|
|
163
|
+
return [];
|
|
164
|
+
const authType = config.features.auth.type;
|
|
165
|
+
return featureIds.filter((id) => {
|
|
166
|
+
const feature = FEATURES[id];
|
|
167
|
+
return feature && feature.incompatibleAuthTypes.includes(authType);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Build a config update object that enables the given features (with deps).
|
|
172
|
+
* Does NOT handle auth conflicts — caller should check those first.
|
|
173
|
+
*/
|
|
174
|
+
export function buildConfigUpdate(featureIds) {
|
|
175
|
+
const ids = resolveDependencies(featureIds);
|
|
176
|
+
const merged = {};
|
|
177
|
+
for (const id of ids) {
|
|
178
|
+
const feature = FEATURES[id];
|
|
179
|
+
if (feature) {
|
|
180
|
+
deepMergeInto(merged, feature.configUpdate);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return merged;
|
|
184
|
+
}
|
|
185
|
+
function deepMergeInto(target, source) {
|
|
186
|
+
for (const key of Object.keys(source)) {
|
|
187
|
+
const sv = source[key];
|
|
188
|
+
const tv = target[key];
|
|
189
|
+
if (sv && typeof sv === "object" && !Array.isArray(sv) &&
|
|
190
|
+
tv && typeof tv === "object" && !Array.isArray(tv)) {
|
|
191
|
+
deepMergeInto(tv, sv);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
target[key] = sv;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=feature-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feature-registry.js","sourceRoot":"","sources":["../../../src/lib/shared/feature-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,50 @@ const REACT_DEPS = [
|
|
|
4
4
|
"react",
|
|
5
5
|
"react-dom",
|
|
6
6
|
"react-router-dom",
|
|
7
|
+
"@tanstack/react-router",
|
|
7
8
|
"remix",
|
|
8
9
|
"@remix-run/react",
|
|
9
10
|
];
|
|
11
|
+
const META_FRAMEWORKS = [
|
|
12
|
+
["next", "nextjs"],
|
|
13
|
+
["@remix-run/react", "remix"],
|
|
14
|
+
["remix", "remix"],
|
|
15
|
+
["@tanstack/react-start", "tanstack-start-react"],
|
|
16
|
+
["astro", "astro"],
|
|
17
|
+
["nuxt", "nuxt"],
|
|
18
|
+
["@sveltejs/kit", "sveltekit"],
|
|
19
|
+
];
|
|
20
|
+
const BASE_FRAMEWORKS = [
|
|
21
|
+
["vue", "vue"],
|
|
22
|
+
["svelte", "svelte"],
|
|
23
|
+
];
|
|
24
|
+
function probeBackend(projectRoot) {
|
|
25
|
+
if (existsSync(join(projectRoot, "composer.json")))
|
|
26
|
+
return "laravel";
|
|
27
|
+
if (existsSync(join(projectRoot, "manage.py")))
|
|
28
|
+
return "django";
|
|
29
|
+
if (existsSync(join(projectRoot, "app.py")))
|
|
30
|
+
return "flask";
|
|
31
|
+
const reqPath = join(projectRoot, "requirements.txt");
|
|
32
|
+
if (existsSync(reqPath)) {
|
|
33
|
+
const req = readFileSync(reqPath, "utf8");
|
|
34
|
+
if (/^flask\b/im.test(req))
|
|
35
|
+
return "flask";
|
|
36
|
+
if (/^django\b/im.test(req))
|
|
37
|
+
return "django";
|
|
38
|
+
}
|
|
39
|
+
if (existsSync(join(projectRoot, "Gemfile")))
|
|
40
|
+
return "rails";
|
|
41
|
+
if (existsSync(join(projectRoot, "go.mod")))
|
|
42
|
+
return "go";
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
10
45
|
export function detectFramework(projectRoot) {
|
|
11
46
|
const pkgPath = join(projectRoot, "package.json");
|
|
12
|
-
if (!existsSync(pkgPath))
|
|
13
|
-
|
|
47
|
+
if (!existsSync(pkgPath)) {
|
|
48
|
+
const backend = probeBackend(projectRoot);
|
|
49
|
+
return backend ?? "vanilla";
|
|
50
|
+
}
|
|
14
51
|
let deps = {};
|
|
15
52
|
let devDeps = {};
|
|
16
53
|
try {
|
|
@@ -19,15 +56,21 @@ export function detectFramework(projectRoot) {
|
|
|
19
56
|
devDeps = pkg.devDependencies || {};
|
|
20
57
|
}
|
|
21
58
|
catch {
|
|
22
|
-
|
|
59
|
+
const backend = probeBackend(projectRoot);
|
|
60
|
+
return backend ?? "vanilla";
|
|
23
61
|
}
|
|
24
62
|
const allDeps = { ...deps, ...devDeps };
|
|
63
|
+
for (const [dep, name] of META_FRAMEWORKS) {
|
|
64
|
+
if (allDeps[dep])
|
|
65
|
+
return name;
|
|
66
|
+
}
|
|
67
|
+
for (const [dep, name] of BASE_FRAMEWORKS) {
|
|
68
|
+
if (allDeps[dep])
|
|
69
|
+
return name;
|
|
70
|
+
}
|
|
25
71
|
if (REACT_DEPS.some((d) => allDeps[d]))
|
|
26
|
-
return "react";
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (allDeps.svelte)
|
|
30
|
-
return "svelte";
|
|
31
|
-
return "vanilla";
|
|
72
|
+
return "react-spa";
|
|
73
|
+
const backend = probeBackend(projectRoot);
|
|
74
|
+
return backend ?? "vanilla";
|
|
32
75
|
}
|
|
33
76
|
//# sourceMappingURL=detect-framework.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detect-framework.js","sourceRoot":"","sources":["../../../src/lib/utils/detect-framework.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,UAAU,GAAG;IACjB,OAAO;IACP,WAAW;IACX,kBAAkB;IAClB,OAAO;IACP,kBAAkB;CACnB,CAAC;
|
|
1
|
+
{"version":3,"file":"detect-framework.js","sourceRoot":"","sources":["../../../src/lib/utils/detect-framework.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function generateApiConfigCode(
|
|
1
|
+
export function generateApiConfigCode() {
|
|
2
2
|
return `/**
|
|
3
3
|
* Swoff Central Config
|
|
4
4
|
*
|
|
@@ -12,7 +12,7 @@ export function generateApiConfigCode(apiBaseUrl) {
|
|
|
12
12
|
* Deno: Deno.env.get("SWOFF_API_BASE")
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
|
-
export const API_BASE = "
|
|
15
|
+
export const API_BASE = "";
|
|
16
16
|
`;
|
|
17
17
|
}
|
|
18
18
|
//# sourceMappingURL=api-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-config.js","sourceRoot":"","sources":["../../src/runtime/api-config.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB
|
|
1
|
+
{"version":3,"file":"api-config.js","sourceRoot":"","sources":["../../src/runtime/api-config.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB;IACnC,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { T, R } from "./utils.js";
|
|
2
|
+
function generateCookieAdapter(ts, ext) {
|
|
3
|
+
return `/**
|
|
4
|
+
* Auth Adapter — maps Swoff auth infrastructure to your auth provider.
|
|
5
|
+
*
|
|
6
|
+
* Cookie (session) auth: the server manages sessions via an httpOnly cookie.
|
|
7
|
+
* The browser auto-sends the cookie on every same-origin request, so
|
|
8
|
+
* no header injection is needed.
|
|
9
|
+
*
|
|
10
|
+
* Edit the URLs below if your backend uses different endpoints.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* import { adapter } from "./auth/adapter.${ext}";
|
|
14
|
+
* const headers = adapter.getHeaders(auth);
|
|
15
|
+
*/${ts ? `
|
|
16
|
+
// ─── AuthData — single source of truth for auth shapes ───────────────
|
|
17
|
+
// Edit the user type to match your backend's user object.
|
|
18
|
+
export interface AuthData {
|
|
19
|
+
token?: string;
|
|
20
|
+
user?: unknown;
|
|
21
|
+
expiresAt?: number;
|
|
22
|
+
}
|
|
23
|
+
` : ""}
|
|
24
|
+
import { isAuthFailureResponse } from "./check.${ext}";
|
|
25
|
+
|
|
26
|
+
export const adapter${T(ts, "{ type: 'cookie'; getAuth: () => Promise<AuthData | null>; getHeaders: (auth: AuthData | null) => Record<string, string>; refresh: (auth: AuthData) => Promise<AuthData | null>; fetchUser: () => Promise<AuthData | null> }")}= {
|
|
27
|
+
type: "cookie",
|
|
28
|
+
|
|
29
|
+
/** Get current auth state from your provider. Return null if not authenticated. */
|
|
30
|
+
async getAuth()${R(ts, "Promise<AuthData | null>")}{
|
|
31
|
+
return null;
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
/** Generate auth headers for fetch requests. Cookie auth returns empty — browser sends cookie. */
|
|
35
|
+
getHeaders(_auth${T(ts, "AuthData | null")})${R(ts, "Record<string, string>")}{
|
|
36
|
+
return {};
|
|
37
|
+
},
|
|
38
|
+
|
|
39
|
+
/** Refresh the session. Cookie auth: server manages session, return null to skip. */
|
|
40
|
+
async refresh(_auth${T(ts, "AuthData")})${R(ts, "Promise<AuthData | null>")}{
|
|
41
|
+
return null;
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
/** Fetch current user from the server. Uses credentials: include for cookie auth. */
|
|
45
|
+
async fetchUser()${R(ts, "Promise<AuthData | null>")}{
|
|
46
|
+
const res = await fetch("/api/me", { credentials: "include" });
|
|
47
|
+
if (await isAuthFailureResponse(res)) return null;
|
|
48
|
+
return { user: await res.json() };
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
`;
|
|
52
|
+
}
|
|
53
|
+
function generateBearerAdapter(ts, ext) {
|
|
54
|
+
return `/**
|
|
55
|
+
* Auth Adapter — maps Swoff auth infrastructure to your auth provider.
|
|
56
|
+
*
|
|
57
|
+
* Bearer token auth: the server returns a token on login. The client stores it
|
|
58
|
+
* in memory and sends it as \`Authorization: Bearer <token>\` on every request.
|
|
59
|
+
*
|
|
60
|
+
* Edit the URLs below if your backend uses different endpoints.
|
|
61
|
+
*
|
|
62
|
+
* Usage:
|
|
63
|
+
* import { adapter } from "./auth/adapter.${ext}";
|
|
64
|
+
* const headers = adapter.getHeaders(auth);
|
|
65
|
+
* const refreshed = await adapter.refresh(auth);
|
|
66
|
+
*/${ts ? `
|
|
67
|
+
// ─── AuthData — single source of truth for auth shapes ───────────────
|
|
68
|
+
// Edit the user type to match your backend's user object.
|
|
69
|
+
export interface AuthData {
|
|
70
|
+
token?: string;
|
|
71
|
+
user?: unknown;
|
|
72
|
+
expiresAt?: number;
|
|
73
|
+
}
|
|
74
|
+
` : ""}
|
|
75
|
+
import { getAuth } from "./store.${ext}";
|
|
76
|
+
import { isAuthFailureResponse } from "./check.${ext}";
|
|
77
|
+
|
|
78
|
+
export const adapter${T(ts, "{ type: 'bearer'; getAuth: () => Promise<AuthData | null>; getHeaders: (auth: AuthData | null) => Record<string, string>; refresh: (auth: AuthData) => Promise<AuthData | null>; fetchUser: () => Promise<AuthData | null> }")}= {
|
|
79
|
+
type: "bearer",
|
|
80
|
+
|
|
81
|
+
/** Get current auth state from your provider. Return null if not authenticated. */
|
|
82
|
+
async getAuth()${R(ts, "Promise<AuthData | null>")}{
|
|
83
|
+
return null;
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
/** Generate auth headers. Injects Bearer token if available. */
|
|
87
|
+
getHeaders(auth${T(ts, "AuthData | null")})${R(ts, "Record<string, string>")}{
|
|
88
|
+
return auth?.token ? { Authorization: \`Bearer \${auth.token}\` } : {};
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
/** Refresh the session. Sends the existing token to /api/refresh. */
|
|
92
|
+
async refresh(auth${T(ts, "AuthData")})${R(ts, "Promise<AuthData | null>")}{
|
|
93
|
+
try {
|
|
94
|
+
const headers${T(ts, "Record<string, string>")} = { "Content-Type": "application/json" };
|
|
95
|
+
if (auth.token) headers["Authorization"] = \`Bearer \${auth.token}\`;
|
|
96
|
+
const res = await fetch("/api/refresh", { method: "POST", headers });
|
|
97
|
+
if (await isAuthFailureResponse(res)) return null;
|
|
98
|
+
const data = await res.json();
|
|
99
|
+
return { ...auth, token: data.token, expiresAt: data.expiresAt };
|
|
100
|
+
} catch { return null; }
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
/** Fetch current user from the server. Injects Bearer token if available. */
|
|
104
|
+
async fetchUser()${R(ts, "Promise<AuthData | null>")}{
|
|
105
|
+
const auth = await getAuth();
|
|
106
|
+
const headers${T(ts, "Record<string, string>")} = {};
|
|
107
|
+
if (auth?.token) headers["Authorization"] = \`Bearer \${auth.token}\`;
|
|
108
|
+
const res = await fetch("/api/me", { headers });
|
|
109
|
+
if (await isAuthFailureResponse(res)) return null;
|
|
110
|
+
return { user: await res.json() };
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
`;
|
|
114
|
+
}
|
|
115
|
+
function generateCustomAdapter(ts, ext) {
|
|
116
|
+
return `/**
|
|
117
|
+
* Auth Adapter — maps Swoff auth infrastructure to your auth provider.
|
|
118
|
+
*
|
|
119
|
+
* EDIT THIS FILE to match your backend's auth flow.
|
|
120
|
+
*
|
|
121
|
+
* Usage:
|
|
122
|
+
* import { adapter } from "./auth/adapter.${ext}";
|
|
123
|
+
* const headers = adapter.getHeaders(auth);
|
|
124
|
+
*/${ts ? `
|
|
125
|
+
// ─── AuthData — single source of truth for auth shapes ───────────────
|
|
126
|
+
// Edit all fields to match your backend's auth shapes.
|
|
127
|
+
export interface AuthData {
|
|
128
|
+
token?: string;
|
|
129
|
+
user?: unknown;
|
|
130
|
+
expiresAt?: number;
|
|
131
|
+
}
|
|
132
|
+
` : ""}
|
|
133
|
+
import { isAuthFailureResponse } from "./check.${ext}";
|
|
134
|
+
|
|
135
|
+
export const adapter = {
|
|
136
|
+
/** Set to "cookie" if your backend uses httpOnly cookies, "bearer" if it uses tokens. */
|
|
137
|
+
type: "bearer",
|
|
138
|
+
|
|
139
|
+
/** Get current auth state. Implement if your provider has a getSession() equivalent. */
|
|
140
|
+
async getAuth() { return null; },
|
|
141
|
+
|
|
142
|
+
/** Generate auth headers for fetch requests. */
|
|
143
|
+
getHeaders(auth) {
|
|
144
|
+
// --- EDIT THIS ---
|
|
145
|
+
if (auth?.token) return { Authorization: \`Bearer \${auth.token}\` };
|
|
146
|
+
return {};
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
/** Refresh the session. Return null if refresh fails. Use isAuthFailureResponse to validate. */
|
|
150
|
+
async refresh(auth) {
|
|
151
|
+
// --- EDIT THIS ---
|
|
152
|
+
try {
|
|
153
|
+
const headers = { "Content-Type": "application/json" };
|
|
154
|
+
if (auth?.token) headers["Authorization"] = \`Bearer \${auth.token}\`;
|
|
155
|
+
const res = await fetch("/api/refresh", { method: "POST", headers });
|
|
156
|
+
if (await isAuthFailureResponse(res)) return null;
|
|
157
|
+
const data = await res.json();
|
|
158
|
+
return { ...auth, token: data.token, expiresAt: data.expiresAt };
|
|
159
|
+
} catch { return null; }
|
|
160
|
+
},
|
|
161
|
+
|
|
162
|
+
/** Fetch current user. Return AuthData | null (e.g. { user: data }). Use isAuthFailureResponse to validate. */
|
|
163
|
+
async fetchUser() {
|
|
164
|
+
// --- EDIT THIS ---
|
|
165
|
+
return null;
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
`;
|
|
169
|
+
}
|
|
170
|
+
const ADAPTER_GENERATORS = {
|
|
171
|
+
"cookie": generateCookieAdapter,
|
|
172
|
+
"bearer": generateBearerAdapter,
|
|
173
|
+
"custom": generateCustomAdapter,
|
|
174
|
+
};
|
|
175
|
+
export function generateAuthAdapterCode(ctx, authType) {
|
|
176
|
+
const generator = ADAPTER_GENERATORS[authType] || ADAPTER_GENERATORS["custom"];
|
|
177
|
+
return generator(ctx.ts, ctx.ext);
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=auth-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-adapter.js","sourceRoot":"","sources":["../../src/runtime/auth-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAElC,SAAS,qBAAqB,CAAC,EAAW,EAAE,GAAW;IACrD,OAAO;;;;;;;;;;+CAUsC,GAAG;;KAE7C,EAAE,CAAC,CAAC,CAAC;;;;;;;;CAQT,CAAC,CAAC,CAAC,EAAE;iDAC2C,GAAG;;sBAE9B,CAAC,CAAC,EAAE,EAAE,8NAA8N,CAAC;;;;mBAIxO,CAAC,CAAC,EAAE,EAAE,0BAA0B,CAAC;;;;;oBAKhC,CAAC,CAAC,EAAE,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,wBAAwB,CAAC;;;;;uBAKxD,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,0BAA0B,CAAC;;;;;qBAKxD,CAAC,CAAC,EAAE,EAAE,0BAA0B,CAAC;;;;;;CAMrD,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,EAAW,EAAE,GAAW;IACrD,OAAO;;;;;;;;;+CASsC,GAAG;;;KAG7C,EAAE,CAAC,CAAC,CAAC;;;;;;;;CAQT,CAAC,CAAC,CAAC,EAAE;mCAC6B,GAAG;iDACW,GAAG;;sBAE9B,CAAC,CAAC,EAAE,EAAE,8NAA8N,CAAC;;;;mBAIxO,CAAC,CAAC,EAAE,EAAE,0BAA0B,CAAC;;;;;mBAKjC,CAAC,CAAC,EAAE,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,wBAAwB,CAAC;;;;;sBAKxD,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,0BAA0B,CAAC;;qBAEvD,CAAC,CAAC,EAAE,EAAE,wBAAwB,CAAC;;;;;;;;;;qBAU/B,CAAC,CAAC,EAAE,EAAE,0BAA0B,CAAC;;mBAEnC,CAAC,CAAC,EAAE,EAAE,wBAAwB,CAAC;;;;;;;CAOjD,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAAC,EAAW,EAAE,GAAW;IACrD,OAAO;;;;;;+CAMsC,GAAG;;KAE7C,EAAE,CAAC,CAAC,CAAC;;;;;;;;CAQT,CAAC,CAAC,CAAC,EAAE;iDAC2C,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmCnD,CAAC;AACF,CAAC;AAED,MAAM,kBAAkB,GAAyD;IAC/E,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,qBAAqB;IAC/B,QAAQ,EAAE,qBAAqB;CAChC,CAAC;AAEF,MAAM,UAAU,uBAAuB,CACrC,GAAmB,EACnB,QAAgB;IAEhB,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,IAAI,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC/E,OAAO,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -10,24 +10,34 @@ export function generateAuthStateCode(ctx) {
|
|
|
10
10
|
* 3. Offline + Authenticated → Offline access (cached data)
|
|
11
11
|
* 4. Offline + Unauthenticated → Strict offline (public content only)
|
|
12
12
|
*
|
|
13
|
+
* getAuth() tries the adapter first, then falls back to IndexedDB user cache,
|
|
14
|
+
* so this works offline when the provider is unreachable.
|
|
15
|
+
*
|
|
16
|
+
* Public API:
|
|
17
|
+
* getAuthState — detect the 4-state matrix (online/offline × auth/unauthed)
|
|
18
|
+
*
|
|
19
|
+
* Internal imports (from ./store):
|
|
20
|
+
* getAuth, isAuthValid — used internally, not re-exported
|
|
21
|
+
*
|
|
13
22
|
* Usage:
|
|
14
23
|
* import { getAuthState } from "./auth/state.${ext}";
|
|
15
|
-
* const { authenticated,
|
|
24
|
+
* const { authenticated, auth, online } = await getAuthState();
|
|
25
|
+
* const userName = auth?.user?.name; // typed via AuthData
|
|
16
26
|
*/
|
|
17
27
|
|
|
28
|
+
import { getCurrentOnlineStatus } from "../connectivity.${ext}";
|
|
18
29
|
import { getAuth, isAuthValid } from "./store.${ext}";
|
|
19
|
-
import {
|
|
30
|
+
import type { AuthData } from "./adapter.${ext}";
|
|
20
31
|
|
|
21
32
|
/** Detect current auth state across the 4-state matrix (online/offline × authenticated/not). */
|
|
22
|
-
export async function getAuthState()${R(ts, "Promise<{ authenticated: boolean;
|
|
33
|
+
export async function getAuthState()${R(ts, "Promise<{ authenticated: boolean; auth: AuthData | null; online: boolean }>")}{
|
|
23
34
|
const auth = await getAuth();
|
|
24
35
|
const valid = isAuthValid(auth);
|
|
25
|
-
const user = valid ? await getCachedUser() : null;
|
|
26
36
|
|
|
27
37
|
return {
|
|
28
38
|
authenticated: valid,
|
|
29
|
-
|
|
30
|
-
online:
|
|
39
|
+
auth,
|
|
40
|
+
online: getCurrentOnlineStatus(),
|
|
31
41
|
};
|
|
32
42
|
}
|
|
33
43
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-state.js","sourceRoot":"","sources":["../../src/runtime/auth-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,MAAM,UAAU,qBAAqB,CAAC,GAAmB;IACvD,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IACxB,OAAO
|
|
1
|
+
{"version":3,"file":"auth-state.js","sourceRoot":"","sources":["../../src/runtime/auth-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAC;AAE/B,MAAM,UAAU,qBAAqB,CAAC,GAAmB;IACvD,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC;IACxB,OAAO;;;;;;;;;;;;;;;;;;;kDAmByC,GAAG;;;;;0DAKK,GAAG;gDACb,GAAG;2CACR,GAAG;;;sCAGR,CAAC,CAAC,EAAE,EAAE,6EAA6E,CAAC;;;;;;;;;;CAUzH,CAAC;AACF,CAAC"}
|