openvibers/openvibe.domains Commits

openvibe-shared v4.108.0 (was v4.107.4) (#77)

OP OpenVibers committed 10 days ago · e4b87d7063 · 6 files, +20 −15

* openvibe-shared v4.108.0 (was v4.107.4)

Opened by scripts/pin-bump.js in OpenVibers/OpenVibe.Shared after the v4.108.0 release.

* llms.txt links each page at its Markdown twin, with an ## Optional section (AGT-5)

* llms.txt: the JSON API stays a main section (AGT-5 review)

Changes

ddiff --git a/README.md b/README.md
iindex 9caeb66..7cb4c97 100644
---- a/README.md
++++ b/README.md
@@@ -147,5 +147,5 @@ AGPL-3.0-only. See [LICENSE](LICENSE).
<!-- versions:start -->
- openvibe-contracts: v0.233.0
- openvibe-sdk: v0.82.0
--- openvibe-shared: v4.107.4
++- openvibe-shared: v4.108.0
<!-- versions:end -->
ddiff --git a/STATUS.json b/STATUS.json
iindex da1aaec..92c63a4 100644
---- a/STATUS.json
++++ b/STATUS.json
@@@ -10,11 +10,11 @@
"domain": "openvibe.domains",
"contracts": "openvibe-contracts v0.233.0",
"sdk": "openvibe-sdk v0.82.0",
-- "shared": "openvibe-shared v4.107.4",
++ "shared": "openvibe-shared v4.108.0",
"packages": [
"openvibe-contracts v0.233.0",
"openvibe-sdk v0.82.0",
-- "openvibe-shared v4.107.4"
++ "openvibe-shared v4.108.0"
],
"summary": "OpenVibe.Domains is a stateless front: no database, no sign-in, no events. It reads OpenVibe.Host's internal catalog (GET /api/v1/catalog/domains, /domains/check?name=, /domains/:tld) and OpenVibe.Tools' public history (GET /api/v1/domains, /domains/:domain) through small in-process caches, prices every registrar row into one-, three- and five-year totals with the cheap-first-year renewal trap, and serves server-rendered pages (home, name search, one ending, one domain) plus a read-only JSON API. It has the service plumbing the other OpenVibe sites have: helmet/CSP, health and truthful readiness (degraded, never 503, when either upstream is down), release.json and /release-metrics, /shared, robots/sitemap/llms, a per-IP limit on /api/v1 and /search, graceful stop, deploy files and tests.",
"works": [
ddiff --git a/package-lock.json b/package-lock.json
iindex b1854d7..08d305e 100644
---- a/package-lock.json
++++ b/package-lock.json
@@@ -16,7 +16,7 @@
"helmet": "^8.1.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.82.0",
-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",
++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0",
"pg": "^8.23.0"
},
"devDependencies": {
@@@ -1120,9 +1120,9 @@
}
},
"node_modules/openvibe-shared": {
-- "version": "4.107.4",
-- "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",
-- "integrity": "sha512-tThN0m3KMncEHVcBOvE+ysHjsZTlVIDLG1P+/i2Mulmxfc/AUpebAXhpWWrut50OChZ8o+HeePxsSrPI8mUQOQ==",
++ "version": "4.108.0",
++ "resolved": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0",
++ "integrity": "sha512-NPzwjxpzGIpFpIm4uw3+VwHfsxbJ2+cD9yuhRzSwolSwqv2kCmwaVtHJ0DA9gKO3K8PCBfIP3UpKzpuSbYEJ+g==",
"license": "MIT",
"dependencies": {
"jsonwebtoken": "^9.0.0",
ddiff --git a/package.json b/package.json
iindex 58fcef3..c8db814 100644
---- a/package.json
++++ b/package.json
@@@ -22,7 +22,7 @@
"helmet": "^8.1.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.0",
"openvibe-sdk": "https://codeload.github.com/OpenVibers/OpenVibe.SDK/tar.gz/refs/tags/v0.82.0",
-- "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.107.4",
++ "openvibe-shared": "https://codeload.github.com/OpenVibers/OpenVibe.Shared/tar.gz/refs/tags/v4.108.0",
"pg": "^8.23.0"
},
"engines": {
ddiff --git a/server/http/discovery.js b/server/http/discovery.js
iindex f2c8616..a72a034 100644
---- a/server/http/discovery.js
++++ b/server/http/discovery.js
@@@ -86,26 +86,29 @@ function createDiscoveryRoutes(ctx) {
name: SITE_NAME,
summary: 'OpenVibe.Domains is a stateless front over OpenVibe.Host\'s price catalog and OpenVibe.Tools\' public domain history: for a name, whether it is registered and every registrar\'s one-, three- and five-year totals; for an ending, every registrar\'s prices; for a domain, its public registration facts over time.',
details: 'There is no account, no database and no event stream. Every page is server-rendered and readable without JavaScript. USD is compared; other currencies are kept after it and marked. A renewal trap marks a cheap first year whose renewal is the real price.',
++ markdown: true,
++ base: config.baseUrl,
sections: [
{ title: 'Pages', links: [
{ title: 'Every ending', url: abs('/'), note: 'the price catalog, popular endings first' },
-- { title: 'Check a name', url: abs('/search?q=example.com'), note: 'registry status and registrar totals; noindex' },
++ { title: 'Check a name', url: abs('/search?q=example.com'), note: 'registry status and registrar totals; noindex', html: true },
{ title: 'One ending', url: abs('/tld/dev'), note: 'every registrar\'s first year, three years and five years' },
{ title: 'One domain', url: abs('/d/example.com'), note: 'public history from OpenVibe.Tools and its ending\'s prices' },
] },
++ // The API is a primary entry for an agent, not something to skip.
{ title: 'API', links: [
{ title: 'Search a name (JSON)', url: abs('/api/v1/search?q=example.com') },
{ title: 'Every ending (JSON)', url: abs('/api/v1/tlds?sort=popular') },
{ title: 'One ending (JSON)', url: abs('/api/v1/tlds/dev') },
{ title: 'One domain (JSON)', url: abs('/api/v1/domains/example.com') },
-- { title: 'Sitemap', url: abs('/sitemap.xml') },
-- { title: 'Release metadata', url: abs('/release.json') },
-- ] },
-- { title: 'The data it reads', links: [
-- { title: 'OpenVibe.Host domain prices', url: 'https://openvibe.host/catalog/domains', note: 'the catalog and the registry name check' },
-- { title: 'OpenVibe.Tools domain history', url: 'https://whois.openvibe.tools/', note: 'RDAP\'s public facts, kept over time' },
] },
],
++ optional: [
++ { title: 'Sitemap', url: abs('/sitemap.xml') },
++ { title: 'Release metadata', url: abs('/release.json') },
++ { title: 'OpenVibe.Host domain prices', url: 'https://openvibe.host/catalog/domains', note: 'the catalog and the registry name check' },
++ { title: 'OpenVibe.Tools domain history', url: 'https://whois.openvibe.tools/', note: 'RDAP\'s public facts, kept over time' },
++ ],
});
r.get('/llms.txt', (_req, res) => {
res.type('text/plain').set('Cache-Control', TEXT_CACHE).send(seo.llmsTxt(llmsSite()));
ddiff --git a/test/routes.test.js b/test/routes.test.js
iindex b5b2d46..e35bfb6 100644
---- a/test/routes.test.js
++++ b/test/routes.test.js
@@@ -254,6 +254,8 @@ function stubs() {
assert.ok(r.text.startsWith('# OpenVibe.Domains'));
assert.ok(r.text.includes('https://openvibe.domains/api/v1/search?q=example.com'));
assert.ok(r.text.includes('https://openvibe.host/catalog/domains'));
++ assert.ok(r.text.includes('\n## Optional\n'));
++ assert.ok(r.text.includes('(https://openvibe.domains/index.md)'));
});
await check('health is ok; readiness is ready while both upstreams answer', async () => {