@an5/adapters 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/README.md +263 -0
- package/dotnet/An5Adapter.cs +275 -0
- package/dotnet/Base/Core.cs +82 -0
- package/dotnet/Mssql/MssqlEngine.cs +144 -0
- package/dotnet/Postgres/PostgresEngine.cs +121 -0
- package/package.json +46 -0
- package/python/an5_adapter.py +97 -0
- package/python/base/__init__.py +3 -0
- package/python/base/dialects.py +8 -0
- package/python/base/metadata.py +9 -0
- package/python/base/sql.py +121 -0
- package/python/mssql/__init__.py +1 -0
- package/python/mssql/provider.py +62 -0
- package/python/postgres/__init__.py +1 -0
- package/python/postgres/provider.py +15 -0
- package/python/table_client.py +209 -0
- package/typescript/an5Adapter.d.ts +117 -0
- package/typescript/an5Adapter.js +447 -0
- package/typescript/an5Adapter.ts +474 -0
- package/typescript/base/index.d.ts +3 -0
- package/typescript/base/index.js +19 -0
- package/typescript/base/index.ts +3 -0
- package/typescript/base/metadata.d.ts +14 -0
- package/typescript/base/metadata.js +17 -0
- package/typescript/base/metadata.ts +28 -0
- package/typescript/base/sql.d.ts +4 -0
- package/typescript/base/sql.js +143 -0
- package/typescript/base/sql.ts +98 -0
- package/typescript/base/types.d.ts +21 -0
- package/typescript/base/types.js +2 -0
- package/typescript/base/types.ts +24 -0
- package/typescript/config.d.ts +17 -0
- package/typescript/config.js +92 -0
- package/typescript/config.ts +95 -0
- package/typescript/googlesheets/adapter.d.ts +31 -0
- package/typescript/googlesheets/adapter.js +138 -0
- package/typescript/googlesheets/adapter.ts +167 -0
- package/typescript/googlesheets/an5SheetsAdapter.d.ts +3 -0
- package/typescript/googlesheets/an5SheetsAdapter.js +8 -0
- package/typescript/googlesheets/an5SheetsAdapter.ts +3 -0
- package/typescript/googlesheets/config.d.ts +17 -0
- package/typescript/googlesheets/config.js +29 -0
- package/typescript/googlesheets/config.ts +33 -0
- package/typescript/googlesheets/helpers.d.ts +9 -0
- package/typescript/googlesheets/helpers.js +155 -0
- package/typescript/googlesheets/helpers.ts +124 -0
- package/typescript/googlesheets/index.d.ts +2 -0
- package/typescript/googlesheets/index.js +9 -0
- package/typescript/googlesheets/index.ts +2 -0
- package/typescript/googlesheets/parseConnectionString.d.ts +11 -0
- package/typescript/googlesheets/parseConnectionString.js +44 -0
- package/typescript/googlesheets/parseConnectionString.ts +44 -0
- package/typescript/googlesheets/retry.d.ts +3 -0
- package/typescript/googlesheets/retry.js +26 -0
- package/typescript/googlesheets/retry.ts +23 -0
- package/typescript/googlesheets/sqlExecutor.d.ts +12 -0
- package/typescript/googlesheets/sqlExecutor.js +306 -0
- package/typescript/googlesheets/sqlExecutor.ts +301 -0
- package/typescript/googlesheets/tableClient.d.ts +78 -0
- package/typescript/googlesheets/tableClient.js +394 -0
- package/typescript/googlesheets/tableClient.ts +434 -0
- package/typescript/googlesheets/types.d.ts +4 -0
- package/typescript/googlesheets/types.js +3 -0
- package/typescript/googlesheets/types.ts +6 -0
- package/typescript/index.d.ts +2 -0
- package/typescript/index.js +14 -0
- package/typescript/index.ts +15 -0
- package/typescript/mssql/engine.d.ts +16 -0
- package/typescript/mssql/engine.js +138 -0
- package/typescript/mssql/engine.ts +132 -0
- package/typescript/mssql/index.d.ts +1 -0
- package/typescript/mssql/index.js +17 -0
- package/typescript/mssql/index.ts +1 -0
- package/typescript/mysql/engine.d.ts +13 -0
- package/typescript/mysql/engine.js +77 -0
- package/typescript/mysql/engine.ts +80 -0
- package/typescript/mysql/index.d.ts +1 -0
- package/typescript/mysql/index.js +17 -0
- package/typescript/mysql/index.ts +1 -0
- package/typescript/postgres/engine.d.ts +13 -0
- package/typescript/postgres/engine.js +86 -0
- package/typescript/postgres/engine.ts +87 -0
- package/typescript/postgres/index.d.ts +1 -0
- package/typescript/postgres/index.js +17 -0
- package/typescript/postgres/index.ts +1 -0
- package/typescript/sqlite/engine.d.ts +13 -0
- package/typescript/sqlite/engine.js +58 -0
- package/typescript/sqlite/engine.ts +55 -0
- package/typescript/sqlite/index.d.ts +1 -0
- package/typescript/sqlite/index.js +17 -0
- package/typescript/sqlite/index.ts +1 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import json
|
|
2
|
+
import uuid
|
|
3
|
+
from typing import Dict, List, Optional
|
|
4
|
+
from .base import DIALECT_MSSQL, DIALECT_POSTGRES, model_fields, _build_order_by, _parse_where, _quote, _quote_table, _resolve_table
|
|
5
|
+
|
|
6
|
+
# ─── Table Client ───────────────────────────────────────────────────────────────────
|
|
7
|
+
|
|
8
|
+
class AdapterTableClient:
|
|
9
|
+
def __init__(self, adapter: An5Adapter, model_name: str):
|
|
10
|
+
self._adapter = adapter
|
|
11
|
+
self._model = model_name
|
|
12
|
+
self._dialect = adapter._dialect
|
|
13
|
+
|
|
14
|
+
@property
|
|
15
|
+
def _table(self) -> str:
|
|
16
|
+
return _resolve_table(self._model)
|
|
17
|
+
|
|
18
|
+
@property
|
|
19
|
+
def _table_sql(self) -> str:
|
|
20
|
+
return _quote_table(self._table, self._dialect)
|
|
21
|
+
|
|
22
|
+
@property
|
|
23
|
+
def _nolock(self) -> str:
|
|
24
|
+
return "" if self._dialect == DIALECT_POSTGRES else " WITH (NOLOCK)"
|
|
25
|
+
|
|
26
|
+
def _pagination(self, take: Optional[int], skip: int, order_sql: str) -> str:
|
|
27
|
+
if take is None:
|
|
28
|
+
return ""
|
|
29
|
+
if self._dialect == DIALECT_POSTGRES:
|
|
30
|
+
return f" LIMIT {take} OFFSET {skip}"
|
|
31
|
+
o = order_sql or " ORDER BY (SELECT NULL)"
|
|
32
|
+
return f"{o} OFFSET {skip} ROWS FETCH NEXT {take} ROWS ONLY"
|
|
33
|
+
|
|
34
|
+
def find_many(self, where=None, order_by=None, skip: int = 0, take: Optional[int] = None, select=None) -> List[Dict]:
|
|
35
|
+
params: Dict = {}
|
|
36
|
+
where_sql = _parse_where(self._model, where, params, self._dialect)
|
|
37
|
+
order_sql = _build_order_by(order_by, self._dialect)
|
|
38
|
+
|
|
39
|
+
query = f"SELECT * FROM {self._table_sql}{self._nolock}"
|
|
40
|
+
if where_sql:
|
|
41
|
+
query += f" WHERE {where_sql}"
|
|
42
|
+
if take is not None and self._dialect == DIALECT_POSTGRES:
|
|
43
|
+
query += self._pagination(take, skip, order_sql)
|
|
44
|
+
else:
|
|
45
|
+
if order_sql:
|
|
46
|
+
query += f" {order_sql}"
|
|
47
|
+
query += self._pagination(take, skip, order_sql)
|
|
48
|
+
return self._adapter.exec(query, list(params.values()))
|
|
49
|
+
|
|
50
|
+
def find_first(self, where=None, order_by=None, select=None) -> Optional[Dict]:
|
|
51
|
+
rows = self.find_many(where=where, order_by=order_by, take=1, select=select)
|
|
52
|
+
return rows[0] if rows else None
|
|
53
|
+
|
|
54
|
+
def find_unique(self, where: Dict) -> Optional[Dict]:
|
|
55
|
+
return self.find_first(where=where)
|
|
56
|
+
|
|
57
|
+
def count(self, where=None) -> int:
|
|
58
|
+
params: Dict = {}
|
|
59
|
+
where_sql = _parse_where(self._model, where, params, self._dialect)
|
|
60
|
+
query = f"SELECT COUNT(*) AS cnt FROM {self._table_sql}{self._nolock}"
|
|
61
|
+
if where_sql:
|
|
62
|
+
query += f" WHERE {where_sql}"
|
|
63
|
+
rows = self._adapter.exec(query, list(params.values()))
|
|
64
|
+
return int(rows[0]["cnt"]) if rows else 0
|
|
65
|
+
|
|
66
|
+
def create(self, data: Dict) -> Dict:
|
|
67
|
+
fields = model_fields.get(self._model, [])
|
|
68
|
+
id_field = next((f for f in fields if f.get("isId")), None)
|
|
69
|
+
if id_field and id_field["name"] not in data:
|
|
70
|
+
data = {**data, id_field["name"]: str(uuid.uuid4())}
|
|
71
|
+
|
|
72
|
+
cols = [k for k, v in data.items() if v is not None]
|
|
73
|
+
values = [data[c] for c in cols]
|
|
74
|
+
placeholders = ", ".join(["?" if self._dialect == DIALECT_MSSQL else "%s"] * len(cols))
|
|
75
|
+
col_list = ", ".join(_quote(c, self._dialect) for c in cols)
|
|
76
|
+
query = f"INSERT INTO {self._table_sql} ({col_list}) VALUES ({placeholders})"
|
|
77
|
+
self._adapter.execute(query, values)
|
|
78
|
+
|
|
79
|
+
if id_field:
|
|
80
|
+
return self.find_first(where={id_field["name"]: data[id_field["name"]]}) or data
|
|
81
|
+
return data
|
|
82
|
+
|
|
83
|
+
def create_many(self, data: List[Dict], skip_duplicates: bool = False) -> Dict:
|
|
84
|
+
count = 0
|
|
85
|
+
for row in data:
|
|
86
|
+
try:
|
|
87
|
+
self.create(row)
|
|
88
|
+
count += 1
|
|
89
|
+
except Exception:
|
|
90
|
+
if not skip_duplicates:
|
|
91
|
+
raise
|
|
92
|
+
return {"count": count}
|
|
93
|
+
|
|
94
|
+
def update(self, where: Dict, data: Dict) -> Optional[Dict]:
|
|
95
|
+
params: Dict = {}
|
|
96
|
+
where_sql = _parse_where(self._model, where, params, self._dialect, "w_")
|
|
97
|
+
set_parts: List[str] = []
|
|
98
|
+
set_values: List = []
|
|
99
|
+
placeholder = "?" if self._dialect == DIALECT_MSSQL else "%s"
|
|
100
|
+
for col, val in data.items():
|
|
101
|
+
if val is not None:
|
|
102
|
+
set_parts.append(f"{_quote(col, self._dialect)} = {placeholder}")
|
|
103
|
+
set_values.append(val)
|
|
104
|
+
|
|
105
|
+
all_values = set_values + list(params.values())
|
|
106
|
+
query = f"UPDATE {self._table_sql} SET {', '.join(set_parts)}"
|
|
107
|
+
if where_sql:
|
|
108
|
+
query += f" WHERE {where_sql}"
|
|
109
|
+
self._adapter.execute(query, all_values)
|
|
110
|
+
return self.find_first(where=where)
|
|
111
|
+
|
|
112
|
+
def update_many(self, where: Optional[Dict], data: Dict) -> Dict:
|
|
113
|
+
params: Dict = {}
|
|
114
|
+
where_sql = _parse_where(self._model, where, params, self._dialect, "w_")
|
|
115
|
+
set_parts: List[str] = []
|
|
116
|
+
set_values: List = []
|
|
117
|
+
placeholder = "?" if self._dialect == DIALECT_MSSQL else "%s"
|
|
118
|
+
for col, val in data.items():
|
|
119
|
+
set_parts.append(f"{_quote(col, self._dialect)} = {placeholder}")
|
|
120
|
+
set_values.append(val)
|
|
121
|
+
all_values = set_values + list(params.values())
|
|
122
|
+
query = f"UPDATE {self._table_sql} SET {', '.join(set_parts)}"
|
|
123
|
+
if where_sql:
|
|
124
|
+
query += f" WHERE {where_sql}"
|
|
125
|
+
count = self._adapter.execute(query, all_values)
|
|
126
|
+
return {"count": count}
|
|
127
|
+
|
|
128
|
+
def delete(self, where: Dict) -> Optional[Dict]:
|
|
129
|
+
existing = self.find_first(where=where)
|
|
130
|
+
params: Dict = {}
|
|
131
|
+
where_sql = _parse_where(self._model, where, params, self._dialect)
|
|
132
|
+
query = f"DELETE FROM {self._table_sql} WHERE {where_sql}"
|
|
133
|
+
self._adapter.execute(query, list(params.values()))
|
|
134
|
+
return existing
|
|
135
|
+
|
|
136
|
+
def delete_many(self, where: Optional[Dict] = None) -> Dict:
|
|
137
|
+
params: Dict = {}
|
|
138
|
+
where_sql = _parse_where(self._model, where, params, self._dialect)
|
|
139
|
+
query = f"DELETE FROM {self._table_sql}"
|
|
140
|
+
if where_sql:
|
|
141
|
+
query += f" WHERE {where_sql}"
|
|
142
|
+
count = self._adapter.execute(query, list(params.values()))
|
|
143
|
+
return {"count": count}
|
|
144
|
+
|
|
145
|
+
def upsert(self, where: Dict, create: Dict, update: Dict) -> Dict:
|
|
146
|
+
existing = self.find_first(where=where)
|
|
147
|
+
if existing:
|
|
148
|
+
return self.update(where=where, data=update) or existing
|
|
149
|
+
return self.create(data=create)
|
|
150
|
+
|
|
151
|
+
def aggregate(self, where=None, _count=None, _sum=None, _avg=None, _min=None, _max=None) -> Dict:
|
|
152
|
+
params: Dict = {}
|
|
153
|
+
where_sql = _parse_where(self._model, where, params, self._dialect)
|
|
154
|
+
aggs: List[str] = []
|
|
155
|
+
if _count:
|
|
156
|
+
aggs.append("COUNT(*) AS _count")
|
|
157
|
+
if _sum:
|
|
158
|
+
for f in (_sum if isinstance(_sum, list) else [_sum]):
|
|
159
|
+
aggs.append(f"SUM({_quote(f, self._dialect)}) AS _sum_{f}")
|
|
160
|
+
if _avg:
|
|
161
|
+
for f in (_avg if isinstance(_avg, list) else [_avg]):
|
|
162
|
+
aggs.append(f"AVG({_quote(f, self._dialect)}) AS _avg_{f}")
|
|
163
|
+
if _min:
|
|
164
|
+
for f in (_min if isinstance(_min, list) else [_min]):
|
|
165
|
+
aggs.append(f"MIN({_quote(f, self._dialect)}) AS _min_{f}")
|
|
166
|
+
if _max:
|
|
167
|
+
for f in (_max if isinstance(_max, list) else [_max]):
|
|
168
|
+
aggs.append(f"MAX({_quote(f, self._dialect)}) AS _max_{f}")
|
|
169
|
+
if not aggs:
|
|
170
|
+
aggs = ["COUNT(*) AS _count"]
|
|
171
|
+
|
|
172
|
+
query = f"SELECT {', '.join(aggs)} FROM {self._table_sql}"
|
|
173
|
+
if where_sql:
|
|
174
|
+
query += f" WHERE {where_sql}"
|
|
175
|
+
rows = self._adapter.exec(query, list(params.values()))
|
|
176
|
+
return rows[0] if rows else {}
|
|
177
|
+
|
|
178
|
+
def vector_search(self, vector: List[float], take: int = 10, where=None, vector_field: str = "embedding", distance_metric: str = "cosine") -> List[Dict]:
|
|
179
|
+
rows = self.find_many(where=where)
|
|
180
|
+
scored = []
|
|
181
|
+
for row in rows:
|
|
182
|
+
raw = row.get(vector_field)
|
|
183
|
+
if raw is None:
|
|
184
|
+
continue
|
|
185
|
+
try:
|
|
186
|
+
vec = json.loads(raw) if isinstance(raw, str) else list(raw)
|
|
187
|
+
except Exception:
|
|
188
|
+
continue
|
|
189
|
+
if not vec or len(vec) != len(vector):
|
|
190
|
+
continue
|
|
191
|
+
|
|
192
|
+
dot = sum(a * b for a, b in zip(vector, vec))
|
|
193
|
+
m1 = sum(a ** 2 for a in vector) ** 0.5
|
|
194
|
+
m2 = sum(b ** 2 for b in vec) ** 0.5
|
|
195
|
+
cosine = dot / (m1 * m2) if m1 and m2 else 0.0
|
|
196
|
+
|
|
197
|
+
if distance_metric == "cosine":
|
|
198
|
+
dist = 1.0 - cosine
|
|
199
|
+
elif distance_metric == "dot":
|
|
200
|
+
dist = -dot
|
|
201
|
+
else:
|
|
202
|
+
dist = sum((a - b) ** 2 for a, b in zip(vector, vec)) ** 0.5
|
|
203
|
+
|
|
204
|
+
scored.append((row, dist))
|
|
205
|
+
|
|
206
|
+
scored.sort(key=lambda x: x[1])
|
|
207
|
+
return [{**row, "distance": dist} for row, dist in scored[:take]]
|
|
208
|
+
|
|
209
|
+
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { An5SheetsAdapter, An5SheetsAdapterConfig, SheetsTableClient } from './googlesheets';
|
|
2
|
+
import type { An5AdapterConfig, Dialect, TransactionHandle } from './base/types';
|
|
3
|
+
export type { An5AdapterConfig, Dialect, QueryEngine, TransactionHandle } from './base/types';
|
|
4
|
+
export { setAdapterMetadata, type AdapterMetadata } from './base/metadata';
|
|
5
|
+
export type AnyAdapter = An5Adapter | An5SheetsAdapter;
|
|
6
|
+
export type AnyAdapterConfig = An5AdapterConfig | An5SheetsAdapterConfig | {
|
|
7
|
+
connectionString: string;
|
|
8
|
+
};
|
|
9
|
+
export declare class An5Adapter {
|
|
10
|
+
private engine;
|
|
11
|
+
private sheetsAdapter;
|
|
12
|
+
get dialect(): Dialect;
|
|
13
|
+
constructor(adapterConfig: An5AdapterConfig | An5SheetsAdapterConfig);
|
|
14
|
+
private requireEngine;
|
|
15
|
+
private requireSheetsAdapter;
|
|
16
|
+
exec<T = any>(query: string, params?: Record<string, any>): Promise<T[]>;
|
|
17
|
+
/** INTERNAL: used by AdapterTableClient for DML statements needing row count */
|
|
18
|
+
_executeRaw(query: string, params?: Record<string, any>): Promise<number>;
|
|
19
|
+
/** Execute a raw query with positional values → @p_0, @p_1, ... per dialect */
|
|
20
|
+
$queryRawUnsafe<T = any>(query: string, ...values: any[]): Promise<T[]>;
|
|
21
|
+
$executeRaw(query: string, ...values: any[]): Promise<number>;
|
|
22
|
+
$executeRawUnsafe(query: string, ...values: any[]): Promise<number>;
|
|
23
|
+
$connect(): Promise<void>;
|
|
24
|
+
$disconnect(): Promise<void>;
|
|
25
|
+
/** Real transaction with BEGIN / COMMIT / ROLLBACK */
|
|
26
|
+
$transaction<R>(fn: (tx: An5AdapterTx) => Promise<R>, options?: {
|
|
27
|
+
timeout?: number;
|
|
28
|
+
}): Promise<R>;
|
|
29
|
+
$transaction<R>(list: Promise<R>[]): Promise<R[]>;
|
|
30
|
+
table<T = any>(modelName: string): AdapterTableClient<T> | SheetsTableClient<T>;
|
|
31
|
+
readRange<T = any>(range: string): Promise<T[][]>;
|
|
32
|
+
writeRange(range: string, values: any[][]): Promise<void>;
|
|
33
|
+
appendRange(range: string, values: any[][]): Promise<void>;
|
|
34
|
+
listSheets(): Promise<string[]>;
|
|
35
|
+
deleteSheet(name: string): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export declare class An5AdapterTx {
|
|
38
|
+
private readonly handle;
|
|
39
|
+
readonly dialect: Dialect;
|
|
40
|
+
constructor(handle: TransactionHandle, dialect: Dialect);
|
|
41
|
+
exec<T = any>(query: string, params?: Record<string, any>): Promise<T[]>;
|
|
42
|
+
_executeRaw(query: string, params?: Record<string, any>): Promise<number>;
|
|
43
|
+
table<T = any>(modelName: string): AdapterTableClient<T>;
|
|
44
|
+
}
|
|
45
|
+
export declare class AdapterTableClient<T = any> {
|
|
46
|
+
private readonly adapter;
|
|
47
|
+
private readonly modelName;
|
|
48
|
+
constructor(adapter: An5Adapter | An5AdapterTx, modelName: string);
|
|
49
|
+
private get dialect();
|
|
50
|
+
private get tableName();
|
|
51
|
+
private get nolock();
|
|
52
|
+
private doExec;
|
|
53
|
+
private doExecuteRaw;
|
|
54
|
+
findMany(args?: {
|
|
55
|
+
where?: any;
|
|
56
|
+
orderBy?: any;
|
|
57
|
+
skip?: number;
|
|
58
|
+
take?: number;
|
|
59
|
+
select?: any;
|
|
60
|
+
}): Promise<T[]>;
|
|
61
|
+
findFirst(args?: {
|
|
62
|
+
where?: any;
|
|
63
|
+
orderBy?: any;
|
|
64
|
+
select?: any;
|
|
65
|
+
}): Promise<T | null>;
|
|
66
|
+
findUnique(args: {
|
|
67
|
+
where: any;
|
|
68
|
+
}): Promise<T | null>;
|
|
69
|
+
count(args?: {
|
|
70
|
+
where?: any;
|
|
71
|
+
}): Promise<number>;
|
|
72
|
+
create(args: {
|
|
73
|
+
data: Partial<T>;
|
|
74
|
+
}): Promise<T>;
|
|
75
|
+
createMany(args: {
|
|
76
|
+
data: Partial<T>[];
|
|
77
|
+
skipDuplicates?: boolean;
|
|
78
|
+
}): Promise<{
|
|
79
|
+
count: number;
|
|
80
|
+
}>;
|
|
81
|
+
update(args: {
|
|
82
|
+
where: any;
|
|
83
|
+
data: Partial<T>;
|
|
84
|
+
}): Promise<T>;
|
|
85
|
+
updateMany(args: {
|
|
86
|
+
where?: any;
|
|
87
|
+
data: Partial<T>;
|
|
88
|
+
}): Promise<{
|
|
89
|
+
count: number;
|
|
90
|
+
}>;
|
|
91
|
+
delete(args: {
|
|
92
|
+
where: any;
|
|
93
|
+
}): Promise<T>;
|
|
94
|
+
deleteMany(args?: {
|
|
95
|
+
where?: any;
|
|
96
|
+
}): Promise<{
|
|
97
|
+
count: number;
|
|
98
|
+
}>;
|
|
99
|
+
upsert(args: {
|
|
100
|
+
where: any;
|
|
101
|
+
create: Partial<T>;
|
|
102
|
+
update: Partial<T>;
|
|
103
|
+
}): Promise<T>;
|
|
104
|
+
aggregate(args: any): Promise<any>;
|
|
105
|
+
groupBy(args: any): Promise<any[]>;
|
|
106
|
+
vectorSearch(args: {
|
|
107
|
+
vector: number[];
|
|
108
|
+
take?: number;
|
|
109
|
+
where?: any;
|
|
110
|
+
vectorField?: string;
|
|
111
|
+
distanceMetric?: 'cosine' | 'euclidean' | 'dot';
|
|
112
|
+
}): Promise<(T & {
|
|
113
|
+
distance: number;
|
|
114
|
+
})[]>;
|
|
115
|
+
}
|
|
116
|
+
export declare function createAn5Adapter(config: AnyAdapterConfig): AnyAdapter;
|
|
117
|
+
export declare const createAdapter: typeof createAn5Adapter;
|