feat(core): add @choojs/core — ESM port of choo with consolidated nano* internals

Same public API as choo 7.1.0 (use/route/start/mount/toString/emit; choo()
callable with or without new, Choo exported). nanobus, nanorouter+wayfarer,
nanolru+component cache, nanoraf, nanohref, nanotiming, document-ready and
scroll-to-anchor are ported into lib/ with per-file attribution; nanoquery
is replaced by URLSearchParams. The v7 node test suite is ported from tape
to node:test and passes unchanged in behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014NgfSjHE11oFpoSnLVKLXd
This commit is contained in:
Bendik Aagaard Lynghaug
2026-09-08 15:59:26 +02:00
co-authored by Claude Fable 5
parent 90cca611c9
commit 4ad3d02207
12 changed files with 1322 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
// Ported from nanotiming 7.3.1 (MIT) — https://github.com/choojs/nanotiming
// Unified browser/Node implementation on the global `performance` object.
import { equal } from './assert.js'
const perf = typeof performance !== 'undefined' && typeof performance.mark === 'function'
? performance
: null
function checkDisabled () {
if (!perf) return true
if (typeof process !== 'undefined' && process.env && process.env.DISABLE_NANOTIMING) return true
if (typeof window !== 'undefined') {
try {
return window.localStorage.DISABLE_NANOTIMING === 'true'
} catch (e) {
return false
}
}
return false
}
nanotiming.disabled = checkDisabled()
export default function nanotiming (name) {
equal(typeof name, 'string', 'nanotiming: name should be type string')
if (nanotiming.disabled) return noop
const uuid = (perf.now() * 10000).toFixed() % Number.MAX_SAFE_INTEGER
const startName = 'start-' + uuid + '-' + name
perf.mark(startName)
function end (cb) {
const endName = 'end-' + uuid + '-' + name
perf.mark(endName)
let err = null
try {
const measureName = name + ' [' + uuid + ']'
perf.measure(measureName, startName, endName)
perf.clearMarks(startName)
perf.clearMarks(endName)
} catch (e) { err = e }
if (cb) cb(err, name)
}
end.uuid = uuid
return end
}
function noop (cb) {
if (cb) {
cb(new Error('nanotiming: performance API unavailable or disabled'))
}
}