ultimate-jekyll-manager 1.0.13 → 1.0.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.
|
@@ -46,156 +46,158 @@ sitemap:
|
|
|
46
46
|
import { initializeApp } from 'https://www.gstatic.com/firebasejs/12.11.0/firebase-app.js';
|
|
47
47
|
import { getAuth, onAuthStateChanged } from 'https://www.gstatic.com/firebasejs/12.11.0/firebase-auth.js';
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
49
|
+
(async function() {
|
|
50
|
+
const config = {{ page.resolved.web_manager.firebase.app.config | jsonify }};
|
|
51
|
+
|
|
52
|
+
document.getElementById('ua').textContent = navigator.userAgent;
|
|
53
|
+
|
|
54
|
+
// Unregister all service workers first
|
|
55
|
+
if ('serviceWorker' in navigator) {
|
|
56
|
+
const regs = await navigator.serviceWorker.getRegistrations();
|
|
57
|
+
console.log(`[Setup] Found ${regs.length} service worker(s)`);
|
|
58
|
+
for (const reg of regs) {
|
|
59
|
+
const result = await reg.unregister();
|
|
60
|
+
console.log(`[Setup] Unregistered service worker: ${reg.scope} (success: ${result})`);
|
|
61
|
+
}
|
|
62
|
+
const swMsg = regs.length > 0
|
|
63
|
+
? `Unregistered ${regs.length} service worker(s)`
|
|
64
|
+
: 'No service workers found';
|
|
65
|
+
document.getElementById('sw-status').textContent = swMsg;
|
|
66
|
+
document.getElementById('status').textContent = swMsg + '. Running tests...';
|
|
67
|
+
} else {
|
|
68
|
+
console.log('[Setup] Service workers not supported');
|
|
69
|
+
document.getElementById('sw-status').textContent = 'Service workers not supported';
|
|
70
|
+
}
|
|
52
71
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
72
|
+
function makeLogger(id) {
|
|
73
|
+
const $log = document.getElementById(id + '-log');
|
|
74
|
+
const $box = document.getElementById(id);
|
|
75
|
+
return {
|
|
76
|
+
log: (msg) => {
|
|
77
|
+
console.log(`[${id}]`, msg);
|
|
78
|
+
$log.textContent += msg + '\n';
|
|
79
|
+
$log.scrollTop = $log.scrollHeight;
|
|
80
|
+
},
|
|
81
|
+
pass: () => { $box.classList.add('success'); return 'PASS'; },
|
|
82
|
+
fail: () => { $box.classList.add('fail'); return 'FAIL'; },
|
|
83
|
+
};
|
|
60
84
|
}
|
|
61
|
-
const swMsg = regs.length > 0
|
|
62
|
-
? `Unregistered ${regs.length} service worker(s)`
|
|
63
|
-
: 'No service workers found';
|
|
64
|
-
document.getElementById('sw-status').textContent = swMsg;
|
|
65
|
-
document.getElementById('status').textContent = swMsg + '. Running tests...';
|
|
66
|
-
} else {
|
|
67
|
-
console.log('[Setup] Service workers not supported');
|
|
68
|
-
document.getElementById('sw-status').textContent = 'Service workers not supported';
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function makeLogger(id) {
|
|
72
|
-
const $log = document.getElementById(id + '-log');
|
|
73
|
-
const $box = document.getElementById(id);
|
|
74
|
-
return {
|
|
75
|
-
log: (msg) => {
|
|
76
|
-
console.log(`[${id}]`, msg);
|
|
77
|
-
$log.textContent += msg + '\n';
|
|
78
|
-
$log.scrollTop = $log.scrollHeight;
|
|
79
|
-
},
|
|
80
|
-
pass: () => { $box.classList.add('success'); return 'PASS'; },
|
|
81
|
-
fail: () => { $box.classList.add('fail'); return 'FAIL'; },
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
const results = {};
|
|
86
|
-
|
|
87
|
-
// REST baseline
|
|
88
|
-
async function testRest(uid, token) {
|
|
89
|
-
const t = makeLogger('rest');
|
|
90
|
-
try {
|
|
91
|
-
const url = `https://firestore.googleapis.com/v1/projects/${config.projectId}/databases/(default)/documents/users/${uid}`;
|
|
92
|
-
t.log('Fetching via REST...');
|
|
93
|
-
const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
94
|
-
t.log(`Status: ${res.status}`);
|
|
95
|
-
if (res.ok) {
|
|
96
|
-
const data = await res.json();
|
|
97
|
-
t.log('SUCCESS');
|
|
98
|
-
results['REST'] = t.pass();
|
|
99
|
-
} else {
|
|
100
|
-
const text = await res.text();
|
|
101
|
-
t.log('ERROR: ' + text.substring(0, 150));
|
|
102
|
-
results['REST'] = t.fail();
|
|
103
|
-
}
|
|
104
|
-
} catch (e) { t.log('ERROR: ' + e.message); results['REST'] = t.fail(); }
|
|
105
|
-
}
|
|
106
85
|
|
|
107
|
-
|
|
108
|
-
async function testVersion(id, version, uid, useLP) {
|
|
109
|
-
const t = makeLogger(id);
|
|
110
|
-
try {
|
|
111
|
-
const label = useLP ? 'initializeFirestore+forceLongPolling' : 'getFirestore';
|
|
112
|
-
t.log(`Loading Firebase ${version}...`);
|
|
86
|
+
const results = {};
|
|
113
87
|
|
|
114
|
-
|
|
115
|
-
|
|
88
|
+
// REST baseline
|
|
89
|
+
async function testRest(uid, token) {
|
|
90
|
+
const t = makeLogger('rest');
|
|
91
|
+
try {
|
|
92
|
+
const url = `https://firestore.googleapis.com/v1/projects/${config.projectId}/databases/(default)/documents/users/${uid}`;
|
|
93
|
+
t.log('Fetching via REST...');
|
|
94
|
+
const res = await fetch(url, { headers: { 'Authorization': `Bearer ${token}` } });
|
|
95
|
+
t.log(`Status: ${res.status}`);
|
|
96
|
+
if (res.ok) {
|
|
97
|
+
const data = await res.json();
|
|
98
|
+
t.log('SUCCESS');
|
|
99
|
+
results['REST'] = t.pass();
|
|
100
|
+
} else {
|
|
101
|
+
const text = await res.text();
|
|
102
|
+
t.log('ERROR: ' + text.substring(0, 150));
|
|
103
|
+
results['REST'] = t.fail();
|
|
104
|
+
}
|
|
105
|
+
} catch (e) { t.log('ERROR: ' + e.message); results['REST'] = t.fail(); }
|
|
106
|
+
}
|
|
116
107
|
|
|
117
|
-
|
|
118
|
-
|
|
108
|
+
// Generic version test using dynamic import
|
|
109
|
+
async function testVersion(id, version, uid, useLP) {
|
|
110
|
+
const t = makeLogger(id);
|
|
119
111
|
try {
|
|
120
|
-
|
|
112
|
+
const label = useLP ? 'initializeFirestore+forceLongPolling' : 'getFirestore';
|
|
113
|
+
t.log(`Loading Firebase ${version}...`);
|
|
114
|
+
|
|
115
|
+
const appMod = await import(`https://www.gstatic.com/firebasejs/${version}/firebase-app.js`);
|
|
116
|
+
const fsMod = await import(`https://www.gstatic.com/firebasejs/${version}/firebase-firestore.js`);
|
|
117
|
+
|
|
118
|
+
const appName = id;
|
|
119
|
+
let app;
|
|
120
|
+
try {
|
|
121
|
+
app = appMod.initializeApp(config, appName);
|
|
122
|
+
} catch (e) {
|
|
123
|
+
app = appMod.getApp(appName);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
let db;
|
|
127
|
+
if (useLP) {
|
|
128
|
+
t.log(`initializeFirestore + experimentalForceLongPolling...`);
|
|
129
|
+
db = fsMod.initializeFirestore(app, { experimentalForceLongPolling: true });
|
|
130
|
+
} else {
|
|
131
|
+
t.log(`getFirestore...`);
|
|
132
|
+
db = fsMod.getFirestore(app);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
t.log(`Fetching users/${uid} (10s timeout)...`);
|
|
136
|
+
|
|
137
|
+
// Race against a timeout
|
|
138
|
+
const fetchPromise = fsMod.getDoc(fsMod.doc(db, 'users', uid));
|
|
139
|
+
const timeoutPromise = new Promise((_, reject) =>
|
|
140
|
+
setTimeout(() => reject(new Error('TIMEOUT after 10s')), 10000)
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
const snap = await Promise.race([fetchPromise, timeoutPromise]);
|
|
144
|
+
|
|
145
|
+
if (snap.exists()) {
|
|
146
|
+
t.log('SUCCESS: ' + JSON.stringify(snap.data()).substring(0, 100));
|
|
147
|
+
results[id] = t.pass();
|
|
148
|
+
} else {
|
|
149
|
+
t.log('Doc not found');
|
|
150
|
+
results[id] = t.fail();
|
|
151
|
+
}
|
|
121
152
|
} catch (e) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
t.log(`getFirestore...`);
|
|
131
|
-
db = fsMod.getFirestore(app);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
t.log(`Fetching users/${uid} (10s timeout)...`);
|
|
135
|
-
|
|
136
|
-
// Race against a timeout
|
|
137
|
-
const fetchPromise = fsMod.getDoc(fsMod.doc(db, 'users', uid));
|
|
138
|
-
const timeoutPromise = new Promise((_, reject) =>
|
|
139
|
-
setTimeout(() => reject(new Error('TIMEOUT after 10s')), 10000)
|
|
140
|
-
);
|
|
141
|
-
|
|
142
|
-
const snap = await Promise.race([fetchPromise, timeoutPromise]);
|
|
143
|
-
|
|
144
|
-
if (snap.exists()) {
|
|
145
|
-
t.log('SUCCESS: ' + JSON.stringify(snap.data()).substring(0, 100));
|
|
146
|
-
results[id] = t.pass();
|
|
147
|
-
} else {
|
|
148
|
-
t.log('Doc not found');
|
|
149
|
-
results[id] = t.fail();
|
|
150
|
-
}
|
|
151
|
-
} catch (e) {
|
|
152
|
-
const code = e.code || '';
|
|
153
|
-
if (code === 'permission-denied') {
|
|
154
|
-
t.log('TRANSPORT OK (permission-denied = network works, just no auth)');
|
|
155
|
-
results[id] = t.pass();
|
|
156
|
-
} else {
|
|
157
|
-
t.log(`ERROR: ${code} ${e.message}`);
|
|
158
|
-
results[id] = t.fail();
|
|
153
|
+
const code = e.code || '';
|
|
154
|
+
if (code === 'permission-denied') {
|
|
155
|
+
t.log('TRANSPORT OK (permission-denied = network works, just no auth)');
|
|
156
|
+
results[id] = t.pass();
|
|
157
|
+
} else {
|
|
158
|
+
t.log(`ERROR: ${code} ${e.message}`);
|
|
159
|
+
results[id] = t.fail();
|
|
160
|
+
}
|
|
159
161
|
}
|
|
160
162
|
}
|
|
161
|
-
}
|
|
162
163
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
// Main
|
|
165
|
+
const defaultApp = initializeApp(config);
|
|
166
|
+
const auth = getAuth(defaultApp);
|
|
166
167
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
168
|
+
onAuthStateChanged(auth, async (user) => {
|
|
169
|
+
if (!user) {
|
|
170
|
+
document.getElementById('status').textContent = 'Not signed in. Sign in at /dashboard first.';
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
172
173
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
174
|
+
const uid = user.uid;
|
|
175
|
+
const token = await user.getIdToken();
|
|
176
|
+
document.getElementById('status').textContent = `Signed in: ${uid}. Running tests...`;
|
|
177
|
+
|
|
178
|
+
// Run REST first
|
|
179
|
+
await testRest(uid, token);
|
|
180
|
+
|
|
181
|
+
// Run version tests (sequential to avoid interference)
|
|
182
|
+
await testVersion('v10', '10.14.0', uid, false);
|
|
183
|
+
await testVersion('v10lp', '10.14.0', uid, true);
|
|
184
|
+
await testVersion('v11', '11.0.0', uid, false);
|
|
185
|
+
await testVersion('v11lp', '11.0.0', uid, true);
|
|
186
|
+
await testVersion('v12_0', '12.0.0', uid, false);
|
|
187
|
+
await testVersion('v12_0lp', '12.0.0', uid, true);
|
|
188
|
+
await testVersion('v12_11', '12.11.0', uid, false);
|
|
189
|
+
await testVersion('v12_11lp', '12.11.0', uid, true);
|
|
190
|
+
|
|
191
|
+
// Show summary
|
|
192
|
+
document.getElementById('status').textContent = 'All tests complete.';
|
|
193
|
+
const $summary = document.getElementById('summary');
|
|
194
|
+
$summary.style.display = 'block';
|
|
195
|
+
$summary.innerHTML = '<h2 style="margin-bottom:8px">Results Summary</h2>' +
|
|
196
|
+
Object.entries(results).map(([k, v]) =>
|
|
197
|
+
`<div style="color:${v === 'PASS' ? '#0f0' : '#f00'}">${v}: ${k}</div>`
|
|
198
|
+
).join('');
|
|
199
|
+
});
|
|
200
|
+
})();
|
|
199
201
|
</script>
|
|
200
202
|
</body>
|
|
201
203
|
</html>
|