hostdb 0.30.0 → 0.31.1
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.
- package/README.md +38 -6
- package/databases.json +220 -27
- package/dist/checksums.d.ts +16 -0
- package/dist/checksums.d.ts.map +1 -0
- package/dist/checksums.js +74 -0
- package/dist/checksums.js.map +1 -0
- package/dist/databases.d.ts +125 -0
- package/dist/databases.d.ts.map +1 -0
- package/dist/databases.js +217 -0
- package/dist/databases.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/r2.d.ts +60 -0
- package/dist/r2.d.ts.map +1 -0
- package/dist/r2.js +127 -0
- package/dist/r2.js.map +1 -0
- package/dist/registry.d.ts +10 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +15 -0
- package/dist/registry.js.map +1 -0
- package/dist/resolver.d.ts +142 -0
- package/dist/resolver.d.ts.map +1 -0
- package/dist/resolver.js +306 -0
- package/dist/resolver.js.map +1 -0
- package/package.json +21 -7
- package/releases.json +581 -8
- package/lib/checksums.ts +0 -98
- package/lib/databases.ts +0 -341
- package/lib/r2.ts +0 -208
- package/lib/registry.ts +0 -17
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
export type Platform = 'linux-x64' | 'linux-arm64' | 'darwin-x64' | 'darwin-arm64' | 'win32-x64';
|
|
2
|
+
export declare const ALL_PLATFORMS: Platform[];
|
|
3
|
+
export type Dependency = {
|
|
4
|
+
database: string;
|
|
5
|
+
cascadeDelete: boolean;
|
|
6
|
+
note?: string;
|
|
7
|
+
};
|
|
8
|
+
export type CliTools = {
|
|
9
|
+
server: string | null;
|
|
10
|
+
client: string | null;
|
|
11
|
+
utilities: string[];
|
|
12
|
+
enhanced: string[];
|
|
13
|
+
note?: string;
|
|
14
|
+
};
|
|
15
|
+
export type PlatformConfig = {
|
|
16
|
+
dependencies?: Dependency[];
|
|
17
|
+
cliTools?: CliTools;
|
|
18
|
+
};
|
|
19
|
+
export type PlatformEntry = true | PlatformConfig;
|
|
20
|
+
export type VersionConfig = {
|
|
21
|
+
enabled?: boolean;
|
|
22
|
+
deprecated?: boolean;
|
|
23
|
+
note?: string;
|
|
24
|
+
dependencies?: Dependency[];
|
|
25
|
+
platforms?: Platform[] | Record<string, PlatformEntry>;
|
|
26
|
+
cliTools?: CliTools;
|
|
27
|
+
};
|
|
28
|
+
export type VersionEntry = boolean | VersionConfig;
|
|
29
|
+
export type DatabaseEntry = {
|
|
30
|
+
displayName: string;
|
|
31
|
+
description: string;
|
|
32
|
+
type: string;
|
|
33
|
+
sourceRepo: string;
|
|
34
|
+
license: string;
|
|
35
|
+
commercialUse: boolean;
|
|
36
|
+
hostedServiceAllowed: boolean;
|
|
37
|
+
protocol: string | null;
|
|
38
|
+
note?: string;
|
|
39
|
+
dependencies?: Dependency[];
|
|
40
|
+
spindbStatus: 'completed' | 'in-progress';
|
|
41
|
+
/**
|
|
42
|
+
* Major-version → full-version policy (e.g., '8' → '8.0.23' for MongoDB).
|
|
43
|
+
* Resolves ambiguous user input to the intended LTS or latest pick.
|
|
44
|
+
* Optional: engines with single-track majors don't need it; multi-track engines must declare it.
|
|
45
|
+
*/
|
|
46
|
+
defaults?: Record<string, string>;
|
|
47
|
+
versions: Record<string, VersionEntry>;
|
|
48
|
+
platforms: Platform[];
|
|
49
|
+
cliTools: CliTools;
|
|
50
|
+
connection: {
|
|
51
|
+
runtime: 'server' | 'embedded';
|
|
52
|
+
defaultPort: number | null;
|
|
53
|
+
scheme: string | null;
|
|
54
|
+
defaultDatabase: string | null;
|
|
55
|
+
defaultUser: string | null;
|
|
56
|
+
queryLanguage: string;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
export type DatabasesJson = {
|
|
60
|
+
$schema?: string;
|
|
61
|
+
_generated?: string;
|
|
62
|
+
databases: Record<string, DatabaseEntry>;
|
|
63
|
+
};
|
|
64
|
+
export type PlatformAsset = {
|
|
65
|
+
url: string;
|
|
66
|
+
sha256: string;
|
|
67
|
+
size: number;
|
|
68
|
+
};
|
|
69
|
+
export type VersionRelease = {
|
|
70
|
+
version: string;
|
|
71
|
+
releaseTag: string;
|
|
72
|
+
releasedAt: string;
|
|
73
|
+
deprecated?: boolean;
|
|
74
|
+
platforms: Partial<Record<Platform, PlatformAsset>>;
|
|
75
|
+
};
|
|
76
|
+
export type ReleasesJson = {
|
|
77
|
+
$schema?: string;
|
|
78
|
+
repository: string;
|
|
79
|
+
databases: Record<string, Record<string, VersionRelease>>;
|
|
80
|
+
};
|
|
81
|
+
export declare function loadDatabasesJson(): DatabasesJson;
|
|
82
|
+
export declare function loadReleasesJson(): ReleasesJson;
|
|
83
|
+
export declare function loadDownloadsJson(): unknown;
|
|
84
|
+
/** Drop loader caches. Tests only — not part of the public API. */
|
|
85
|
+
export declare function _resetLoaderCachesForTests(): void;
|
|
86
|
+
/** Check if a version entry is enabled */
|
|
87
|
+
export declare function isVersionEnabled(entry: VersionEntry): boolean;
|
|
88
|
+
/** Check if a version entry is deprecated */
|
|
89
|
+
export declare function isVersionDeprecated(entry: VersionEntry): boolean;
|
|
90
|
+
/** Get set of enabled version strings for a database */
|
|
91
|
+
export declare function getEnabledVersions(database: string): Set<string>;
|
|
92
|
+
/** Get effective platforms for a version (version overrides or engine defaults) */
|
|
93
|
+
export declare function getVersionPlatforms(engine: DatabaseEntry, version: string): Platform[];
|
|
94
|
+
/**
|
|
95
|
+
* Get effective dependencies for a version+platform.
|
|
96
|
+
*
|
|
97
|
+
* Resolution order (each level fully replaces):
|
|
98
|
+
* 1. Engine-level dependencies
|
|
99
|
+
* 2. Version-level dependencies (if specified)
|
|
100
|
+
* 3. Platform-level dependencies within version (if platforms is object form and platform entry has dependencies)
|
|
101
|
+
*/
|
|
102
|
+
export declare function getVersionDependencies(engine: DatabaseEntry, version: string, platform?: Platform): Dependency[];
|
|
103
|
+
/**
|
|
104
|
+
* Get effective CLI tools for a version+platform.
|
|
105
|
+
*
|
|
106
|
+
* Resolution order (each level fully replaces):
|
|
107
|
+
* 1. Engine-level cliTools
|
|
108
|
+
* 2. Version-level cliTools (if specified)
|
|
109
|
+
* 3. Platform-level cliTools within version (if platforms is object form and platform entry has cliTools)
|
|
110
|
+
*/
|
|
111
|
+
export declare function getVersionCliTools(engine: DatabaseEntry, version: string, platform?: Platform): CliTools;
|
|
112
|
+
/**
|
|
113
|
+
* Generate databases.json from databases.yml.
|
|
114
|
+
*
|
|
115
|
+
* Build-time helper. Uses `yaml` (devDependency) via dynamic import so that
|
|
116
|
+
* npm consumers of this package (who only call the resolver) don't need
|
|
117
|
+
* `yaml` in their tree.
|
|
118
|
+
*
|
|
119
|
+
* @returns true if the file was changed/created (or needs updating in check mode), false if already up-to-date
|
|
120
|
+
*/
|
|
121
|
+
export declare function generateDatabasesJson(options?: {
|
|
122
|
+
checkOnly?: boolean;
|
|
123
|
+
rootDir?: string;
|
|
124
|
+
}): Promise<boolean>;
|
|
125
|
+
//# sourceMappingURL=databases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databases.d.ts","sourceRoot":"","sources":["../lib/databases.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
// `yaml` is intentionally NOT statically imported — it's a devDependency only.
|
|
5
|
+
// `generateDatabasesJson` lazy-imports it so npm consumers (who only call the
|
|
6
|
+
// resolver) don't need yaml in their tree.
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const ROOT = join(__dirname, '..');
|
|
9
|
+
// All supported platforms
|
|
10
|
+
export const ALL_PLATFORMS = [
|
|
11
|
+
'linux-x64',
|
|
12
|
+
'linux-arm64',
|
|
13
|
+
'darwin-x64',
|
|
14
|
+
'darwin-arm64',
|
|
15
|
+
'win32-x64',
|
|
16
|
+
];
|
|
17
|
+
// Loader caches. The bundled JSON files are immutable for the lifetime of a
|
|
18
|
+
// process (they ship inside the npm tarball), so we memoize the parse result
|
|
19
|
+
// to avoid re-reading + re-parsing on every call. Tests that need a clean
|
|
20
|
+
// slate can call `_resetLoaderCachesForTests`.
|
|
21
|
+
let _databasesJsonCache = null;
|
|
22
|
+
let _releasesJsonCache = null;
|
|
23
|
+
let _downloadsJsonCache = null;
|
|
24
|
+
export function loadDatabasesJson() {
|
|
25
|
+
if (_databasesJsonCache !== null)
|
|
26
|
+
return _databasesJsonCache;
|
|
27
|
+
const filePath = join(ROOT, 'databases.json');
|
|
28
|
+
_databasesJsonCache = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
29
|
+
return _databasesJsonCache;
|
|
30
|
+
}
|
|
31
|
+
export function loadReleasesJson() {
|
|
32
|
+
if (_releasesJsonCache !== null)
|
|
33
|
+
return _releasesJsonCache;
|
|
34
|
+
const filePath = join(ROOT, 'releases.json');
|
|
35
|
+
_releasesJsonCache = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
36
|
+
return _releasesJsonCache;
|
|
37
|
+
}
|
|
38
|
+
export function loadDownloadsJson() {
|
|
39
|
+
if (_downloadsJsonCache !== null)
|
|
40
|
+
return _downloadsJsonCache;
|
|
41
|
+
const filePath = join(ROOT, 'downloads.json');
|
|
42
|
+
_downloadsJsonCache = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
43
|
+
return _downloadsJsonCache;
|
|
44
|
+
}
|
|
45
|
+
/** Drop loader caches. Tests only — not part of the public API. */
|
|
46
|
+
export function _resetLoaderCachesForTests() {
|
|
47
|
+
_databasesJsonCache = null;
|
|
48
|
+
_releasesJsonCache = null;
|
|
49
|
+
_downloadsJsonCache = null;
|
|
50
|
+
}
|
|
51
|
+
// --- Internal helpers ---
|
|
52
|
+
/** Get the version's platforms field, handling both array and object forms */
|
|
53
|
+
function getVersionPlatformsRaw(versionEntry) {
|
|
54
|
+
if (!versionEntry.platforms) {
|
|
55
|
+
return { list: [], map: null };
|
|
56
|
+
}
|
|
57
|
+
if (Array.isArray(versionEntry.platforms)) {
|
|
58
|
+
return { list: versionEntry.platforms, map: null };
|
|
59
|
+
}
|
|
60
|
+
// Object form: keys are platforms
|
|
61
|
+
const map = versionEntry.platforms;
|
|
62
|
+
return { list: Object.keys(map), map };
|
|
63
|
+
}
|
|
64
|
+
// --- Resolver helpers ---
|
|
65
|
+
/** Check if a version entry is enabled */
|
|
66
|
+
export function isVersionEnabled(entry) {
|
|
67
|
+
if (typeof entry === 'boolean')
|
|
68
|
+
return entry;
|
|
69
|
+
return entry.enabled !== false;
|
|
70
|
+
}
|
|
71
|
+
/** Check if a version entry is deprecated */
|
|
72
|
+
export function isVersionDeprecated(entry) {
|
|
73
|
+
if (typeof entry === 'boolean')
|
|
74
|
+
return false;
|
|
75
|
+
return entry.deprecated === true;
|
|
76
|
+
}
|
|
77
|
+
/** Get set of enabled version strings for a database */
|
|
78
|
+
export function getEnabledVersions(database) {
|
|
79
|
+
try {
|
|
80
|
+
const data = loadDatabasesJson();
|
|
81
|
+
const dbEntry = data.databases[database];
|
|
82
|
+
if (!dbEntry)
|
|
83
|
+
return new Set();
|
|
84
|
+
return new Set(Object.entries(dbEntry.versions)
|
|
85
|
+
.filter(([, entry]) => isVersionEnabled(entry))
|
|
86
|
+
.map(([version]) => version));
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return new Set();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Get effective platforms for a version (version overrides or engine defaults) */
|
|
93
|
+
export function getVersionPlatforms(engine, version) {
|
|
94
|
+
const versionEntry = engine.versions[version];
|
|
95
|
+
if (!versionEntry || typeof versionEntry === 'boolean') {
|
|
96
|
+
return [...engine.platforms];
|
|
97
|
+
}
|
|
98
|
+
const { list } = getVersionPlatformsRaw(versionEntry);
|
|
99
|
+
return list.length > 0 ? [...list] : [...engine.platforms];
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get effective dependencies for a version+platform.
|
|
103
|
+
*
|
|
104
|
+
* Resolution order (each level fully replaces):
|
|
105
|
+
* 1. Engine-level dependencies
|
|
106
|
+
* 2. Version-level dependencies (if specified)
|
|
107
|
+
* 3. Platform-level dependencies within version (if platforms is object form and platform entry has dependencies)
|
|
108
|
+
*/
|
|
109
|
+
export function getVersionDependencies(engine, version, platform) {
|
|
110
|
+
const versionEntry = engine.versions[version];
|
|
111
|
+
if (!versionEntry || typeof versionEntry === 'boolean') {
|
|
112
|
+
return engine.dependencies ?? [];
|
|
113
|
+
}
|
|
114
|
+
// Version-level replaces engine-level
|
|
115
|
+
let resolved = versionEntry.dependencies ?? engine.dependencies ?? [];
|
|
116
|
+
// Platform-level replaces version-level
|
|
117
|
+
if (platform) {
|
|
118
|
+
const { map } = getVersionPlatformsRaw(versionEntry);
|
|
119
|
+
if (map) {
|
|
120
|
+
const platformEntry = map[platform];
|
|
121
|
+
if (platformEntry &&
|
|
122
|
+
typeof platformEntry === 'object' &&
|
|
123
|
+
platformEntry.dependencies) {
|
|
124
|
+
resolved = platformEntry.dependencies;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return resolved;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Get effective CLI tools for a version+platform.
|
|
132
|
+
*
|
|
133
|
+
* Resolution order (each level fully replaces):
|
|
134
|
+
* 1. Engine-level cliTools
|
|
135
|
+
* 2. Version-level cliTools (if specified)
|
|
136
|
+
* 3. Platform-level cliTools within version (if platforms is object form and platform entry has cliTools)
|
|
137
|
+
*/
|
|
138
|
+
export function getVersionCliTools(engine, version, platform) {
|
|
139
|
+
const versionEntry = engine.versions[version];
|
|
140
|
+
if (!versionEntry || typeof versionEntry === 'boolean') {
|
|
141
|
+
return engine.cliTools;
|
|
142
|
+
}
|
|
143
|
+
// Version-level replaces engine-level
|
|
144
|
+
let resolved = versionEntry.cliTools ?? engine.cliTools;
|
|
145
|
+
// Platform-level replaces version-level
|
|
146
|
+
if (platform) {
|
|
147
|
+
const { map } = getVersionPlatformsRaw(versionEntry);
|
|
148
|
+
if (map) {
|
|
149
|
+
const platformEntry = map[platform];
|
|
150
|
+
if (platformEntry &&
|
|
151
|
+
typeof platformEntry === 'object' &&
|
|
152
|
+
platformEntry.cliTools) {
|
|
153
|
+
resolved = platformEntry.cliTools;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return resolved;
|
|
158
|
+
}
|
|
159
|
+
// --- databases.json generation from databases.yml ---
|
|
160
|
+
/** Convert a snake_case string to camelCase */
|
|
161
|
+
function snakeToCamel(str) {
|
|
162
|
+
return str.replace(/_([a-z0-9])/g, (_, char) => char.toUpperCase());
|
|
163
|
+
}
|
|
164
|
+
/** Recursively convert all object keys from snake_case to camelCase */
|
|
165
|
+
function transformKeys(obj) {
|
|
166
|
+
if (Array.isArray(obj)) {
|
|
167
|
+
return obj.map(transformKeys);
|
|
168
|
+
}
|
|
169
|
+
if (obj !== null && typeof obj === 'object') {
|
|
170
|
+
const result = {};
|
|
171
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
172
|
+
result[snakeToCamel(key)] = transformKeys(value);
|
|
173
|
+
}
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
return obj;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Generate databases.json from databases.yml.
|
|
180
|
+
*
|
|
181
|
+
* Build-time helper. Uses `yaml` (devDependency) via dynamic import so that
|
|
182
|
+
* npm consumers of this package (who only call the resolver) don't need
|
|
183
|
+
* `yaml` in their tree.
|
|
184
|
+
*
|
|
185
|
+
* @returns true if the file was changed/created (or needs updating in check mode), false if already up-to-date
|
|
186
|
+
*/
|
|
187
|
+
export async function generateDatabasesJson(options) {
|
|
188
|
+
const { checkOnly = false, rootDir = ROOT } = options ?? {};
|
|
189
|
+
const yamlPath = join(rootDir, 'databases.yml');
|
|
190
|
+
const jsonPath = join(rootDir, 'databases.json');
|
|
191
|
+
if (!existsSync(yamlPath)) {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
const { parse: parseYaml } = await import('yaml');
|
|
195
|
+
const yamlContent = readFileSync(yamlPath, 'utf-8');
|
|
196
|
+
const parsed = parseYaml(yamlContent);
|
|
197
|
+
const transformed = transformKeys(parsed);
|
|
198
|
+
const output = {
|
|
199
|
+
_generated: 'DO NOT EDIT. Generated from databases.yml by pnpm prep. Edit databases.yml instead.',
|
|
200
|
+
$schema: './schemas/databases.schema.json',
|
|
201
|
+
...transformed,
|
|
202
|
+
};
|
|
203
|
+
const newJson = JSON.stringify(output, null, 2) + '\n';
|
|
204
|
+
let currentJson = '';
|
|
205
|
+
if (existsSync(jsonPath)) {
|
|
206
|
+
currentJson = readFileSync(jsonPath, 'utf-8');
|
|
207
|
+
}
|
|
208
|
+
if (currentJson === newJson) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
if (checkOnly) {
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
writeFileSync(jsonPath, newJson);
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=databases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"databases.js","sourceRoot":"","sources":["../lib/databases.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hostdb — public npm package surface
|
|
3
|
+
*
|
|
4
|
+
* Consumers (spindb, layerbase-cloud, third parties) install this package
|
|
5
|
+
* and import from it. The package bundles `databases.json` and `releases.json`
|
|
6
|
+
* snapshotted at publish time, so the resolver works offline with no network
|
|
7
|
+
* dependency on registry.layerbase.host.
|
|
8
|
+
*
|
|
9
|
+
* Quick start:
|
|
10
|
+
* import { resolveVersion, getReleaseInfo } from 'hostdb'
|
|
11
|
+
*
|
|
12
|
+
* const full = resolveVersion('postgresql', '17') // '17.10.0'
|
|
13
|
+
* const info = getReleaseInfo('postgresql', full, 'linux-x64')
|
|
14
|
+
* // { url: 'https://registry.layerbase.host/...', sha256: '...', size: ... }
|
|
15
|
+
*
|
|
16
|
+
* Anything outside this index is internal and may change without notice.
|
|
17
|
+
*/
|
|
18
|
+
export { resolveVersion, normalizeVersion, listVersions, listEngines, getSupportedMajorVersions, getMajorDefault, getEngineDefaults, getReleaseInfo, getAvailablePlatforms, isVersionDeprecated, getCliTools, getDatabaseEntry, compareVersions, type ListVersionsOptions, } from './resolver.js';
|
|
19
|
+
export { loadDatabasesJson, loadReleasesJson, loadDownloadsJson, isVersionEnabled, getEnabledVersions, } from './databases.js';
|
|
20
|
+
export type { Platform, PlatformEntry, PlatformConfig, PlatformAsset, Dependency, CliTools, VersionConfig, VersionEntry, VersionRelease, DatabaseEntry, DatabasesJson, ReleasesJson, } from './databases.js';
|
|
21
|
+
export { ALL_PLATFORMS } from './databases.js';
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAA;AAGtB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AAGvB,YAAY,EACV,QAAQ,EACR,aAAa,EACb,cAAc,EACd,aAAa,EACb,UAAU,EACV,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,cAAc,EACd,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hostdb — public npm package surface
|
|
3
|
+
*
|
|
4
|
+
* Consumers (spindb, layerbase-cloud, third parties) install this package
|
|
5
|
+
* and import from it. The package bundles `databases.json` and `releases.json`
|
|
6
|
+
* snapshotted at publish time, so the resolver works offline with no network
|
|
7
|
+
* dependency on registry.layerbase.host.
|
|
8
|
+
*
|
|
9
|
+
* Quick start:
|
|
10
|
+
* import { resolveVersion, getReleaseInfo } from 'hostdb'
|
|
11
|
+
*
|
|
12
|
+
* const full = resolveVersion('postgresql', '17') // '17.10.0'
|
|
13
|
+
* const info = getReleaseInfo('postgresql', full, 'linux-x64')
|
|
14
|
+
* // { url: 'https://registry.layerbase.host/...', sha256: '...', size: ... }
|
|
15
|
+
*
|
|
16
|
+
* Anything outside this index is internal and may change without notice.
|
|
17
|
+
*/
|
|
18
|
+
// ─── Resolver (the headline API) ────────────────────────────────────────────
|
|
19
|
+
export { resolveVersion, normalizeVersion, listVersions, listEngines, getSupportedMajorVersions, getMajorDefault, getEngineDefaults, getReleaseInfo, getAvailablePlatforms, isVersionDeprecated, getCliTools, getDatabaseEntry, compareVersions, } from './resolver.js';
|
|
20
|
+
// ─── Data-access primitives (lower-level, for power users) ──────────────────
|
|
21
|
+
export { loadDatabasesJson, loadReleasesJson, loadDownloadsJson, isVersionEnabled, getEnabledVersions, } from './databases.js';
|
|
22
|
+
export { ALL_PLATFORMS } from './databases.js';
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,+EAA+E;AAC/E,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,WAAW,EACX,gBAAgB,EAChB,eAAe,GAEhB,MAAM,eAAe,CAAA;AAEtB,+EAA+E;AAC/E,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,gBAAgB,CAAA;AAkBvB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA"}
|
package/dist/r2.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cloudflare R2 client utilities.
|
|
3
|
+
*
|
|
4
|
+
* R2 is S3-compatible, so we use the AWS SDK with a custom endpoint.
|
|
5
|
+
*/
|
|
6
|
+
import { S3Client } from '@aws-sdk/client-s3';
|
|
7
|
+
export type R2Config = {
|
|
8
|
+
accountId: string;
|
|
9
|
+
accessKeyId: string;
|
|
10
|
+
secretAccessKey: string;
|
|
11
|
+
bucket: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function loadR2Config(): R2Config;
|
|
14
|
+
export declare function createR2Client(config: R2Config): S3Client;
|
|
15
|
+
export declare function uploadToR2(options: {
|
|
16
|
+
client: S3Client;
|
|
17
|
+
bucket: string;
|
|
18
|
+
key: string;
|
|
19
|
+
body: Buffer | Uint8Array | ReadableStream;
|
|
20
|
+
contentType?: string;
|
|
21
|
+
cacheControl?: string;
|
|
22
|
+
}): Promise<void>;
|
|
23
|
+
export declare function objectExists(options: {
|
|
24
|
+
client: S3Client;
|
|
25
|
+
bucket: string;
|
|
26
|
+
key: string;
|
|
27
|
+
}): Promise<boolean>;
|
|
28
|
+
export declare function deleteFromR2(options: {
|
|
29
|
+
client: S3Client;
|
|
30
|
+
bucket: string;
|
|
31
|
+
key: string;
|
|
32
|
+
}): Promise<void>;
|
|
33
|
+
export declare function listR2Objects(options: {
|
|
34
|
+
client: S3Client;
|
|
35
|
+
bucket: string;
|
|
36
|
+
prefix: string;
|
|
37
|
+
}): Promise<string[]>;
|
|
38
|
+
export declare function publishJsonToR2(options: {
|
|
39
|
+
client: S3Client;
|
|
40
|
+
bucket: string;
|
|
41
|
+
rootDir: string;
|
|
42
|
+
filename: string;
|
|
43
|
+
cacheControl?: string;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
export declare function publishReleasesJson(options: {
|
|
46
|
+
client: S3Client;
|
|
47
|
+
bucket: string;
|
|
48
|
+
rootDir: string;
|
|
49
|
+
}): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Purge Cloudflare CDN cache for specific URLs.
|
|
52
|
+
*
|
|
53
|
+
* Required env vars: CLOUDFLARE_API_TOKEN, CLOUDFLARE_ZONE_ID
|
|
54
|
+
* If not set, logs a warning and returns (no-op).
|
|
55
|
+
*/
|
|
56
|
+
export declare function purgeCloudflareCache(urls: string[]): Promise<{
|
|
57
|
+
purged: boolean;
|
|
58
|
+
count: number;
|
|
59
|
+
}>;
|
|
60
|
+
//# sourceMappingURL=r2.d.ts.map
|
package/dist/r2.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../lib/r2.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,QAAQ,EAKT,MAAM,oBAAoB,CAAA;AAI3B,MAAM,MAAM,QAAQ,GAAG;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,YAAY,IAAI,QAAQ,CAiBvC;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,GAAG,QAAQ,CASzD;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,cAAc,CAAA;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBnB;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAC1C,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;CACZ,GAAG,OAAO,CAAC,IAAI,CAAC,CAShB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAC3C,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAapB;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB;AAED,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EAAE,GACb,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAsC7C"}
|
package/dist/r2.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cloudflare R2 client utilities.
|
|
3
|
+
*
|
|
4
|
+
* R2 is S3-compatible, so we use the AWS SDK with a custom endpoint.
|
|
5
|
+
*/
|
|
6
|
+
import { S3Client, PutObjectCommand, HeadObjectCommand, DeleteObjectCommand, ListObjectsV2Command, } from '@aws-sdk/client-s3';
|
|
7
|
+
import { readFileSync } from 'node:fs';
|
|
8
|
+
import { resolve } from 'node:path';
|
|
9
|
+
export function loadR2Config() {
|
|
10
|
+
const accountId = process.env.R2_ACCOUNT_ID;
|
|
11
|
+
const accessKeyId = process.env.R2_ACCESS_KEY_ID;
|
|
12
|
+
const secretAccessKey = process.env.R2_SECRET_ACCESS_KEY;
|
|
13
|
+
const bucket = process.env.R2_BUCKET_NAME;
|
|
14
|
+
if (!accountId || !accessKeyId || !secretAccessKey || !bucket) {
|
|
15
|
+
const missing = [
|
|
16
|
+
!accountId && 'R2_ACCOUNT_ID',
|
|
17
|
+
!accessKeyId && 'R2_ACCESS_KEY_ID',
|
|
18
|
+
!secretAccessKey && 'R2_SECRET_ACCESS_KEY',
|
|
19
|
+
!bucket && 'R2_BUCKET_NAME',
|
|
20
|
+
].filter(Boolean);
|
|
21
|
+
throw new Error(`Missing required R2 env vars: ${missing.join(', ')}`);
|
|
22
|
+
}
|
|
23
|
+
return { accountId, accessKeyId, secretAccessKey, bucket };
|
|
24
|
+
}
|
|
25
|
+
export function createR2Client(config) {
|
|
26
|
+
return new S3Client({
|
|
27
|
+
region: 'auto',
|
|
28
|
+
endpoint: `https://${config.accountId}.r2.cloudflarestorage.com`,
|
|
29
|
+
credentials: {
|
|
30
|
+
accessKeyId: config.accessKeyId,
|
|
31
|
+
secretAccessKey: config.secretAccessKey,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export async function uploadToR2(options) {
|
|
36
|
+
const { client, bucket, key, body, contentType, cacheControl } = options;
|
|
37
|
+
await client.send(new PutObjectCommand({
|
|
38
|
+
Bucket: bucket,
|
|
39
|
+
Key: key,
|
|
40
|
+
Body: body,
|
|
41
|
+
ContentType: contentType ?? 'application/octet-stream',
|
|
42
|
+
CacheControl: cacheControl ?? 'public, max-age=31536000, immutable',
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
export async function objectExists(options) {
|
|
46
|
+
const { client, bucket, key } = options;
|
|
47
|
+
try {
|
|
48
|
+
await client.send(new HeadObjectCommand({
|
|
49
|
+
Bucket: bucket,
|
|
50
|
+
Key: key,
|
|
51
|
+
}));
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
const code = error instanceof Error && 'name' in error ? error.name : undefined;
|
|
56
|
+
if (code === 'NotFound' || code === '404') {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
throw error;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function deleteFromR2(options) {
|
|
63
|
+
const { client, bucket, key } = options;
|
|
64
|
+
await client.send(new DeleteObjectCommand({
|
|
65
|
+
Bucket: bucket,
|
|
66
|
+
Key: key,
|
|
67
|
+
}));
|
|
68
|
+
}
|
|
69
|
+
export async function listR2Objects(options) {
|
|
70
|
+
const { client, bucket, prefix } = options;
|
|
71
|
+
const result = await client.send(new ListObjectsV2Command({
|
|
72
|
+
Bucket: bucket,
|
|
73
|
+
Prefix: prefix,
|
|
74
|
+
}));
|
|
75
|
+
return (result.Contents ?? [])
|
|
76
|
+
.map((obj) => obj.Key)
|
|
77
|
+
.filter((key) => key !== undefined);
|
|
78
|
+
}
|
|
79
|
+
export async function publishJsonToR2(options) {
|
|
80
|
+
const { client, bucket, rootDir, filename, cacheControl } = options;
|
|
81
|
+
const body = readFileSync(resolve(rootDir, filename));
|
|
82
|
+
await uploadToR2({
|
|
83
|
+
client,
|
|
84
|
+
bucket,
|
|
85
|
+
key: filename,
|
|
86
|
+
body,
|
|
87
|
+
contentType: 'application/json',
|
|
88
|
+
cacheControl: cacheControl ?? 'public, max-age=60',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export async function publishReleasesJson(options) {
|
|
92
|
+
await publishJsonToR2({ ...options, filename: 'releases.json' });
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Purge Cloudflare CDN cache for specific URLs.
|
|
96
|
+
*
|
|
97
|
+
* Required env vars: CLOUDFLARE_API_TOKEN, CLOUDFLARE_ZONE_ID
|
|
98
|
+
* If not set, logs a warning and returns (no-op).
|
|
99
|
+
*/
|
|
100
|
+
export async function purgeCloudflareCache(urls) {
|
|
101
|
+
const apiToken = process.env.CLOUDFLARE_API_TOKEN;
|
|
102
|
+
const zoneId = process.env.CLOUDFLARE_ZONE_ID;
|
|
103
|
+
if (!apiToken || !zoneId) {
|
|
104
|
+
return { purged: false, count: 0 };
|
|
105
|
+
}
|
|
106
|
+
// Cloudflare allows max 30 URLs per purge request
|
|
107
|
+
const BATCH_SIZE = 30;
|
|
108
|
+
let totalPurged = 0;
|
|
109
|
+
for (let i = 0; i < urls.length; i += BATCH_SIZE) {
|
|
110
|
+
const batch = urls.slice(i, i + BATCH_SIZE);
|
|
111
|
+
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/purge_cache`, {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
headers: {
|
|
114
|
+
Authorization: `Bearer ${apiToken}`,
|
|
115
|
+
'Content-Type': 'application/json',
|
|
116
|
+
},
|
|
117
|
+
body: JSON.stringify({ files: batch }),
|
|
118
|
+
});
|
|
119
|
+
if (!response.ok) {
|
|
120
|
+
const body = await response.text();
|
|
121
|
+
throw new Error(`Cloudflare cache purge failed: ${response.status} ${body}`);
|
|
122
|
+
}
|
|
123
|
+
totalPurged += batch.length;
|
|
124
|
+
}
|
|
125
|
+
return { purged: true, count: totalPurged };
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=r2.js.map
|
package/dist/r2.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"r2.js","sourceRoot":"","sources":["../lib/r2.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configurable registry base URL for binary downloads.
|
|
3
|
+
*
|
|
4
|
+
* Switch between providers by changing REGISTRY_BASE_URL:
|
|
5
|
+
* R2: https://registry.layerbase.host
|
|
6
|
+
* GitHub: https://github.com/robertjbass/hostdb/releases/download
|
|
7
|
+
*/
|
|
8
|
+
export declare function getDownloadUrl(tag: string, filename: string): string;
|
|
9
|
+
export declare function getRegistryBaseUrl(): string;
|
|
10
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../lib/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configurable registry base URL for binary downloads.
|
|
3
|
+
*
|
|
4
|
+
* Switch between providers by changing REGISTRY_BASE_URL:
|
|
5
|
+
* R2: https://registry.layerbase.host
|
|
6
|
+
* GitHub: https://github.com/robertjbass/hostdb/releases/download
|
|
7
|
+
*/
|
|
8
|
+
const REGISTRY_BASE_URL = 'https://registry.layerbase.host';
|
|
9
|
+
export function getDownloadUrl(tag, filename) {
|
|
10
|
+
return `${REGISTRY_BASE_URL}/${tag}/${filename}`;
|
|
11
|
+
}
|
|
12
|
+
export function getRegistryBaseUrl() {
|
|
13
|
+
return REGISTRY_BASE_URL;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../lib/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,iBAAiB,GAAG,iCAAiC,CAAA;AAE3D,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,QAAgB;IAC1D,OAAO,GAAG,iBAAiB,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,iBAAiB,CAAA;AAC1B,CAAC"}
|