Refactor site generation into a modular content pipeline
Deploy website / deploy (push) Successful in 24s
Deploy website / deploy (push) Successful in 24s
This commit is contained in:
1 parent
0f69028d4a
commit
146d516f24
20 files changed
+826
-427
No files matched your search
@@ -0,0 +1,53 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import { test } from 'node:test'
|
||||
import { createRegenerationQueue } from '../dev-reload.js'
|
||||
|
||||
const waitFor = async (predicate) => {
|
||||
for (let attempt = 0; attempt < 100; attempt += 1) {
|
||||
if (predicate()) return
|
||||
await new Promise((resolve) => setTimeout(resolve, 5))
|
||||
}
|
||||
assert.fail('timed out waiting for generation')
|
||||
}
|
||||
|
||||
test('rapid edits coalesce and only the latest generation reloads', async () => {
|
||||
const pending = []
|
||||
const events = []
|
||||
const queue = createRegenerationQueue({
|
||||
generate: () => new Promise((resolve) => pending.push(resolve)),
|
||||
onSuccess: () => events.push('reload'),
|
||||
onError: () => events.push('error'),
|
||||
delay: 1,
|
||||
})
|
||||
try {
|
||||
queue.request()
|
||||
queue.request()
|
||||
await waitFor(() => pending.length === 1)
|
||||
queue.request()
|
||||
pending[0]()
|
||||
await waitFor(() => pending.length === 2)
|
||||
assert.deepEqual(events, [])
|
||||
pending[1]()
|
||||
await waitFor(() => events.length === 1)
|
||||
assert.deepEqual(events, ['reload'])
|
||||
} finally {
|
||||
queue.close()
|
||||
}
|
||||
})
|
||||
|
||||
test('failed latest generation reports an error without reloading', async () => {
|
||||
const events = []
|
||||
const queue = createRegenerationQueue({
|
||||
generate: () => Promise.reject(new Error('broken content')),
|
||||
onSuccess: () => events.push('reload'),
|
||||
onError: (error) => events.push(error.message),
|
||||
delay: 1,
|
||||
})
|
||||
try {
|
||||
queue.request()
|
||||
await waitFor(() => events.length === 1)
|
||||
assert.deepEqual(events, ['broken content'])
|
||||
} finally {
|
||||
queue.close()
|
||||
}
|
||||
})
|
||||
Reference in new issue
Block a user