@this-npm-test-org/sql-driver-sdk 0.1.0
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/dist/.last_build +0 -0
- package/dist/src/driver-registry.d.ts +69 -0
- package/dist/src/driver-registry.js +192 -0
- package/dist/src/driver-registry.js.map +1 -0
- package/dist/src/errors.d.ts +44 -0
- package/dist/src/errors.js +25 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/index.d.ts +75 -0
- package/dist/src/index.js +69 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/parser-registry.d.ts +62 -0
- package/dist/src/parser-registry.js +194 -0
- package/dist/src/parser-registry.js.map +1 -0
- package/dist/src/sql-connection-parsers.d.ts +16 -0
- package/dist/src/sql-connection-parsers.js +50 -0
- package/dist/src/sql-connection-parsers.js.map +1 -0
- package/dist/src/sql-connection-schemas.d.ts +509 -0
- package/dist/src/sql-connection-schemas.js +193 -0
- package/dist/src/sql-connection-schemas.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Discovery and loading of SQL parsers published as npm packages.
|
|
8
|
+
*
|
|
9
|
+
* Parsers register independently of drivers so the MCP-SQL driver can
|
|
10
|
+
* pair with any installed parser for its dialect, and so multiple
|
|
11
|
+
* drivers can share one parser (native postgres + MCP-shaped postgres
|
|
12
|
+
* both use `@amodalai/postgres-parser`). The registry-implementation
|
|
13
|
+
* class also satisfies the `ParserRegistry` interface from
|
|
14
|
+
* `@amodalai/types`, which `SqlDriver.init(config, parsers)` receives.
|
|
15
|
+
*/
|
|
16
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
17
|
+
import path from 'node:path';
|
|
18
|
+
import { pathToFileURL } from 'node:url';
|
|
19
|
+
import { SqlRegistryError } from './errors.js';
|
|
20
|
+
/**
|
|
21
|
+
* Scan candidate packages for `amodalParser` blocks. Packages missing
|
|
22
|
+
* the block are skipped silently; malformed blocks throw
|
|
23
|
+
* `SqlRegistryError`.
|
|
24
|
+
*/
|
|
25
|
+
export function discoverParsers(opts) {
|
|
26
|
+
const descriptors = [];
|
|
27
|
+
for (const packageName of opts.candidatePackages) {
|
|
28
|
+
const descriptor = readParserDescriptor(packageName, opts.repoPath);
|
|
29
|
+
if (descriptor) {
|
|
30
|
+
descriptors.push(descriptor);
|
|
31
|
+
opts.logger.info('sql_parser_discovered', {
|
|
32
|
+
package: descriptor.packageName,
|
|
33
|
+
dialects: descriptor.dialects,
|
|
34
|
+
sdk_version: descriptor.sdkVersion,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return descriptors;
|
|
39
|
+
}
|
|
40
|
+
function readParserDescriptor(packageName, repoPath) {
|
|
41
|
+
const packageDir = path.join(repoPath, 'node_modules', ...packageName.split('/'));
|
|
42
|
+
const pkgJsonPath = path.join(packageDir, 'package.json');
|
|
43
|
+
if (!existsSync(pkgJsonPath)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const pkgJson = parsePackageJson(pkgJsonPath, packageName);
|
|
47
|
+
const block = pkgJson['amodalParser'];
|
|
48
|
+
if (block === undefined) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return validateParserDescriptor(block, packageName, packageDir);
|
|
52
|
+
}
|
|
53
|
+
function validateParserDescriptor(block, packageName, packageDir) {
|
|
54
|
+
if (typeof block !== 'object' || block === null || Array.isArray(block)) {
|
|
55
|
+
throw new SqlRegistryError('INVALID_DESCRIPTOR', `Package "${packageName}" has an amodalParser field that is not an object`, { kind: 'parser', packageName });
|
|
56
|
+
}
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- narrowed by the typeof/null/array guards above.
|
|
58
|
+
const raw = block;
|
|
59
|
+
const dialects = raw['dialects'];
|
|
60
|
+
if (!Array.isArray(dialects) ||
|
|
61
|
+
dialects.length === 0 ||
|
|
62
|
+
!dialects.every((d) => typeof d === 'string')) {
|
|
63
|
+
throw new SqlRegistryError('INVALID_DESCRIPTOR', `Package "${packageName}" amodalParser.dialects must be a non-empty string array`, { kind: 'parser', packageName });
|
|
64
|
+
}
|
|
65
|
+
const moduleRel = raw['module'];
|
|
66
|
+
if (typeof moduleRel !== 'string' || moduleRel.length === 0) {
|
|
67
|
+
throw new SqlRegistryError('INVALID_DESCRIPTOR', `Package "${packageName}" amodalParser.module must be a relative path string`, { kind: 'parser', packageName });
|
|
68
|
+
}
|
|
69
|
+
const moduleEntry = path.resolve(packageDir, moduleRel);
|
|
70
|
+
if (!moduleEntry.startsWith(path.resolve(packageDir))) {
|
|
71
|
+
throw new SqlRegistryError('INVALID_DESCRIPTOR', `Package "${packageName}" amodalParser.module escapes the package directory`, { kind: 'parser', packageName, context: { moduleRel } });
|
|
72
|
+
}
|
|
73
|
+
const exportName = raw['exportName'];
|
|
74
|
+
if (typeof exportName !== 'string' || exportName.length === 0) {
|
|
75
|
+
throw new SqlRegistryError('INVALID_DESCRIPTOR', `Package "${packageName}" amodalParser.exportName must be a non-empty string`, { kind: 'parser', packageName });
|
|
76
|
+
}
|
|
77
|
+
const sdkVersion = raw['sdkVersion'];
|
|
78
|
+
if (typeof sdkVersion !== 'string' || sdkVersion.length === 0) {
|
|
79
|
+
throw new SqlRegistryError('INVALID_DESCRIPTOR', `Package "${packageName}" amodalParser.sdkVersion must be a semver range string`, { kind: 'parser', packageName });
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
packageName,
|
|
83
|
+
dialects,
|
|
84
|
+
packageDir,
|
|
85
|
+
moduleEntry,
|
|
86
|
+
exportName,
|
|
87
|
+
sdkVersion,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function parsePackageJson(pkgJsonPath, packageName) {
|
|
91
|
+
const raw = readFileSync(pkgJsonPath, 'utf-8');
|
|
92
|
+
let parsed;
|
|
93
|
+
try {
|
|
94
|
+
parsed = JSON.parse(raw);
|
|
95
|
+
}
|
|
96
|
+
catch (cause) {
|
|
97
|
+
throw new SqlRegistryError('INVALID_DESCRIPTOR', `Package "${packageName}" has unparseable package.json`, { kind: 'parser', packageName, cause });
|
|
98
|
+
}
|
|
99
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
100
|
+
throw new SqlRegistryError('INVALID_DESCRIPTOR', `Package "${packageName}" package.json is not an object`, { kind: 'parser', packageName });
|
|
101
|
+
}
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- narrowed by the typeof/null/array guards above.
|
|
103
|
+
return parsed;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Implementation of the `ParserRegistry` shape from `@amodalai/types`,
|
|
107
|
+
* which is what `SqlDriver.init(config, parsers)` receives. Parsers
|
|
108
|
+
* are cached after first load — they're stateless and safely shared
|
|
109
|
+
* across drivers.
|
|
110
|
+
*/
|
|
111
|
+
export class ParserRegistry {
|
|
112
|
+
byName;
|
|
113
|
+
cache = new Map();
|
|
114
|
+
logger;
|
|
115
|
+
constructor(descriptors, logger) {
|
|
116
|
+
this.byName = new Map(descriptors.map((d) => [d.packageName, d]));
|
|
117
|
+
this.logger = logger;
|
|
118
|
+
}
|
|
119
|
+
list() {
|
|
120
|
+
return Array.from(this.byName.values()).map((d) => ({
|
|
121
|
+
name: d.packageName,
|
|
122
|
+
dialects: d.dialects,
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
has(packageName) {
|
|
126
|
+
return this.byName.has(packageName);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Synchronous interface required by `SqlDriver.init()` — drivers
|
|
130
|
+
* resolve parsers during the load handshake and shouldn't have to
|
|
131
|
+
* await. Parser instances must be preloaded via `prepare()` first.
|
|
132
|
+
*/
|
|
133
|
+
getParser(packageName) {
|
|
134
|
+
const cached = this.cache.get(packageName);
|
|
135
|
+
if (cached)
|
|
136
|
+
return cached;
|
|
137
|
+
throw new SqlRegistryError('PACKAGE_NOT_FOUND', `Parser "${packageName}" was requested but not preloaded. The repo loader must call ParserRegistry.prepare() for every parser referenced by a connection before driver init.`, { kind: 'parser', packageName });
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Preload a parser. Called by the repo loader for each parser name
|
|
141
|
+
* referenced by an SQL connection, before any `driver.init()` runs.
|
|
142
|
+
* Idempotent — calling twice returns the cached instance.
|
|
143
|
+
*/
|
|
144
|
+
async prepare(packageName) {
|
|
145
|
+
const existing = this.cache.get(packageName);
|
|
146
|
+
if (existing)
|
|
147
|
+
return existing;
|
|
148
|
+
const descriptor = this.byName.get(packageName);
|
|
149
|
+
if (!descriptor) {
|
|
150
|
+
throw new SqlRegistryError('PACKAGE_NOT_FOUND', `Parser "${packageName}" was referenced but not discovered. Add it to the agent's packages list and run npm install.`, { kind: 'parser', packageName });
|
|
151
|
+
}
|
|
152
|
+
const moduleUrl = pathToFileURL(descriptor.moduleEntry).href;
|
|
153
|
+
let mod;
|
|
154
|
+
try {
|
|
155
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- dynamic import yields unknown module shape; narrowed below.
|
|
156
|
+
mod = (await import(moduleUrl));
|
|
157
|
+
}
|
|
158
|
+
catch (cause) {
|
|
159
|
+
throw new SqlRegistryError('FACTORY_FAILED', `Failed to import parser "${packageName}" from ${descriptor.moduleEntry}`, { kind: 'parser', packageName, cause });
|
|
160
|
+
}
|
|
161
|
+
const factory = mod[descriptor.exportName];
|
|
162
|
+
if (typeof factory !== 'function') {
|
|
163
|
+
throw new SqlRegistryError('FACTORY_MISSING', `Parser "${packageName}" does not export "${descriptor.exportName}" as a function`, { kind: 'parser', packageName, context: { exportName: descriptor.exportName } });
|
|
164
|
+
}
|
|
165
|
+
let instance;
|
|
166
|
+
try {
|
|
167
|
+
instance = factory();
|
|
168
|
+
}
|
|
169
|
+
catch (cause) {
|
|
170
|
+
throw new SqlRegistryError('FACTORY_FAILED', `Parser "${packageName}" factory "${descriptor.exportName}" threw`, { kind: 'parser', packageName, cause });
|
|
171
|
+
}
|
|
172
|
+
if (!isParser(instance)) {
|
|
173
|
+
throw new SqlRegistryError('INVALID_INSTANCE', `Parser "${packageName}" factory returned a value that is not a Parser`, { kind: 'parser', packageName });
|
|
174
|
+
}
|
|
175
|
+
this.cache.set(packageName, instance);
|
|
176
|
+
this.logger.info('sql_parser_loaded', {
|
|
177
|
+
package: packageName,
|
|
178
|
+
dialects: instance.dialects,
|
|
179
|
+
});
|
|
180
|
+
return instance;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
function isParser(value) {
|
|
184
|
+
if (typeof value !== 'object' || value === null)
|
|
185
|
+
return false;
|
|
186
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- narrowed by the typeof/null guards above.
|
|
187
|
+
const obj = value;
|
|
188
|
+
if (typeof obj['parse'] !== 'function')
|
|
189
|
+
return false;
|
|
190
|
+
const dialects = obj['dialects'];
|
|
191
|
+
return (Array.isArray(dialects) &&
|
|
192
|
+
dialects.every((d) => typeof d === 'string'));
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=parser-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser-registry.js","sourceRoot":"","sources":["../../src/parser-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
import type { SqlConnectionConfig, SchemaJson } from './sql-connection-schemas.js';
|
|
7
|
+
/**
|
|
8
|
+
* Parse the JSON contents of a connection's `spec.json` /
|
|
9
|
+
* `connection.json` file for a SQL connection. The caller has
|
|
10
|
+
* already verified `protocol === 'sql'`.
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseSqlConnectionConfig(jsonString: string, filename: string): SqlConnectionConfig;
|
|
13
|
+
/**
|
|
14
|
+
* Parse the JSON contents of a connection's `schema.json` file.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseSchemaJson(jsonString: string, filename: string): SchemaJson;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* JSON-parse + zod-validate helpers for SQL connection files. The
|
|
8
|
+
* repo loader calls these for connections whose protocol is `sql`;
|
|
9
|
+
* REST/MCP connections still use `parseSpecJson` / `parseAccessJson`
|
|
10
|
+
* in `repo/parsers.ts`.
|
|
11
|
+
*/
|
|
12
|
+
import { ZodError } from 'zod';
|
|
13
|
+
import { RepoError } from '@amodalai/types';
|
|
14
|
+
import { SqlConnectionConfigSchema, SchemaJsonSchema, } from './sql-connection-schemas.js';
|
|
15
|
+
/**
|
|
16
|
+
* Parse the JSON contents of a connection's `spec.json` /
|
|
17
|
+
* `connection.json` file for a SQL connection. The caller has
|
|
18
|
+
* already verified `protocol === 'sql'`.
|
|
19
|
+
*/
|
|
20
|
+
export function parseSqlConnectionConfig(jsonString, filename) {
|
|
21
|
+
return parseAndValidate(jsonString, SqlConnectionConfigSchema, filename);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse the JSON contents of a connection's `schema.json` file.
|
|
25
|
+
*/
|
|
26
|
+
export function parseSchemaJson(jsonString, filename) {
|
|
27
|
+
return parseAndValidate(jsonString, SchemaJsonSchema, filename);
|
|
28
|
+
}
|
|
29
|
+
function parseAndValidate(jsonString, schema, filename) {
|
|
30
|
+
let raw;
|
|
31
|
+
try {
|
|
32
|
+
raw = JSON.parse(jsonString);
|
|
33
|
+
}
|
|
34
|
+
catch (cause) {
|
|
35
|
+
throw new RepoError('CONFIG_PARSE_FAILED', `Invalid JSON in ${filename}`, cause);
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
return schema.parse(raw);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if (err instanceof ZodError) {
|
|
42
|
+
const issues = err.issues
|
|
43
|
+
.map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`)
|
|
44
|
+
.join('; ');
|
|
45
|
+
throw new RepoError('CONFIG_VALIDATION_FAILED', `${filename} validation failed: ${issues}`, err);
|
|
46
|
+
}
|
|
47
|
+
throw new RepoError('CONFIG_VALIDATION_FAILED', `${filename} validation failed`, err);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=sql-connection-parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-connection-parsers.js","sourceRoot":"","sources":["../../src/sql-connection-parsers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;GAKG;AAEH,OAAO,EAAC,QAAQ,EAAC,MAAM,KAAK,CAAC;AAE7B,OAAO,EAAC,SAAS,EAAC,MAAM,iBAAiB,CAAC;AAG1C,OAAO,EACL,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,6BAA6B,CAAC;AAErC;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CACtC,UAAkB,EAClB,QAAgB;IAEhB,OAAO,gBAAgB,CACrB,UAAU,EACV,yBAAyB,EACzB,QAAQ,CACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAkB,EAClB,QAAgB;IAEhB,OAAO,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,gBAAgB,CACvB,UAAkB,EAClB,MAAkC,EAClC,QAAgB;IAEhB,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,SAAS,CACjB,qBAAqB,EACrB,mBAAmB,QAAQ,EAAE,EAC7B,KAAK,CACN,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,QAAQ,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM;iBACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC3D,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,IAAI,SAAS,CACjB,0BAA0B,EAC1B,GAAG,QAAQ,uBAAuB,MAAM,EAAE,EAC1C,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,SAAS,CACjB,0BAA0B,EAC1B,GAAG,QAAQ,oBAAoB,EAC/B,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC"}
|