openvibers/openvibe.domains Commits
openvibe-shared v4.108.0 (was v4.107.4) (#77)
Changes
@@@ -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 -->@@@ -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": [@@@ -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",@@@ -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": {@@@ -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()));@@@ -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 () => {
@@ -147,5 +147,5 @@ AGPL-3.0-only. See [LICENSE](LICENSE).
@@ -147,5 +147,5 @@ AGPL-3.0-only. See [LICENSE](LICENSE).
<!-- versions:start -->
<!-- versions:start -->
- openvibe-contracts: v0.233.0
- openvibe-contracts: v0.233.0
- openvibe-sdk: v0.82.0
- openvibe-sdk: v0.82.0
-- openvibe-shared: v4.107.4
+- openvibe-shared: v4.108.0
<!-- versions:end -->
<!-- versions:end -->
@@ -10,11 +10,11 @@
@@ -10,11 +10,11 @@
"domain": "openvibe.domains",
"domain": "openvibe.domains",
"contracts": "openvibe-contracts v0.233.0",
"contracts": "openvibe-contracts v0.233.0",
"sdk": "openvibe-sdk v0.82.0",
"sdk": "openvibe-sdk v0.82.0",
- "shared": "openvibe-shared v4.107.4",
+ "shared": "openvibe-shared v4.108.0",
"packages": [
"packages": [
"openvibe-contracts v0.233.0",
"openvibe-contracts v0.233.0",
"openvibe-sdk v0.82.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.",
"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": [
"works": [
@@ -16,7 +16,7 @@
@@ -16,7 +16,7 @@
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.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-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"
"pg": "^8.23.0"
},
},
"devDependencies": {
"devDependencies": {
@@ -1120,9 +1120,9 @@
@@ -1120,9 +1120,9 @@
}
}
},
},
"node_modules/openvibe-shared": {
"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",
"license": "MIT",
"dependencies": {
"dependencies": {
"jsonwebtoken": "^9.0.0",
"jsonwebtoken": "^9.0.0",
@@ -22,7 +22,7 @@
@@ -22,7 +22,7 @@
"helmet": "^8.1.0",
"helmet": "^8.1.0",
"openvibe-contracts": "https://codeload.github.com/OpenVibers/OpenVibe.Contracts/tar.gz/refs/tags/v0.233.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-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"
"pg": "^8.23.0"
},
},
"engines": {
"engines": {
@@ -86,26 +86,29 @@ function createDiscoveryRoutes(ctx) {
@@ -86,26 +86,29 @@ function createDiscoveryRoutes(ctx) {
name: SITE_NAME,
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.',
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.',
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: [
sections: [
{ title: 'Pages', links: [
{ title: 'Pages', links: [
{ title: 'Every ending', url: abs('/'), note: 'the price catalog, popular endings first' },
{ 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 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' },
{ 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: 'API', links: [
{ title: 'Search a name (JSON)', url: abs('/api/v1/search?q=example.com') },
{ 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: 'Every ending (JSON)', url: abs('/api/v1/tlds?sort=popular') },
{ title: 'One ending (JSON)', url: abs('/api/v1/tlds/dev') },
{ title: 'One ending (JSON)', url: abs('/api/v1/tlds/dev') },
{ title: 'One domain (JSON)', url: abs('/api/v1/domains/example.com') },
{ 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) => {
r.get('/llms.txt', (_req, res) => {
res.type('text/plain').set('Cache-Control', TEXT_CACHE).send(seo.llmsTxt(llmsSite()));
res.type('text/plain').set('Cache-Control', TEXT_CACHE).send(seo.llmsTxt(llmsSite()));
@@ -254,6 +254,8 @@ function stubs() {
@@ -254,6 +254,8 @@ function stubs() {
assert.ok(r.text.startsWith('# OpenVibe.Domains'));
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.domains/api/v1/search?q=example.com'));
assert.ok(r.text.includes('https://openvibe.host/catalog/domains'));
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 () => {
await check('health is ok; readiness is ready while both upstreams answer', async () => {