flatsql 0.2.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/LICENSE +190 -0
- package/README.md +489 -0
- package/dist/btree/btree.d.ts +34 -0
- package/dist/btree/btree.d.ts.map +1 -0
- package/dist/btree/btree.js +235 -0
- package/dist/btree/btree.js.map +1 -0
- package/dist/btree/index.d.ts +3 -0
- package/dist/btree/index.d.ts.map +1 -0
- package/dist/btree/index.js +3 -0
- package/dist/btree/index.js.map +1 -0
- package/dist/btree/types.d.ts +36 -0
- package/dist/btree/types.d.ts.map +1 -0
- package/dist/btree/types.js +55 -0
- package/dist/btree/types.js.map +1 -0
- package/dist/core/database.d.ts +45 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +248 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +3 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/table-store.d.ts +28 -0
- package/dist/core/table-store.d.ts.map +1 -0
- package/dist/core/table-store.js +153 -0
- package/dist/core/table-store.js.map +1 -0
- package/dist/flatbuffer-accessor.d.ts +35 -0
- package/dist/flatbuffer-accessor.d.ts.map +1 -0
- package/dist/flatbuffer-accessor.js +114 -0
- package/dist/flatbuffer-accessor.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/schema/index.d.ts +3 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +3 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/parser.d.ts +25 -0
- package/dist/schema/parser.d.ts.map +1 -0
- package/dist/schema/parser.js +394 -0
- package/dist/schema/parser.js.map +1 -0
- package/dist/schema/types.d.ts +33 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +29 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/stacked-flatbuffers.d.ts +38 -0
- package/dist/storage/stacked-flatbuffers.d.ts.map +1 -0
- package/dist/storage/stacked-flatbuffers.js +253 -0
- package/dist/storage/stacked-flatbuffers.js.map +1 -0
- package/dist/storage/types.d.ts +23 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +27 -0
- package/dist/storage/types.js.map +1 -0
- package/package.json +79 -0
- package/wasm/flatsql-client.js +280 -0
- package/wasm/flatsql.js +2 -0
- package/wasm/flatsql.wasm +0 -0
- package/wasm/flatsql.worker.js +209 -0
- package/wasm/index.d.ts +234 -0
- package/wasm/index.js +463 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// FlatBuffers-SQLite: SQL query interface over FlatBuffer storage
|
|
2
|
+
// Files are stacked FlatBuffers readable by standard FlatBuffer tools
|
|
3
|
+
export * from './btree/index.js';
|
|
4
|
+
export * from './storage/index.js';
|
|
5
|
+
export * from './schema/index.js';
|
|
6
|
+
export * from './core/index.js';
|
|
7
|
+
export * from './flatbuffer-accessor.js';
|
|
8
|
+
// Re-export main types for convenience
|
|
9
|
+
export { FlatSQLDatabase } from './core/database.js';
|
|
10
|
+
export { TableStore } from './core/table-store.js';
|
|
11
|
+
export { BTree } from './btree/btree.js';
|
|
12
|
+
export { StackedFlatBufferStore } from './storage/stacked-flatbuffers.js';
|
|
13
|
+
export { parseSchema } from './schema/index.js';
|
|
14
|
+
export { FlatcAccessor, DirectAccessor } from './flatbuffer-accessor.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,sEAAsE;AAEtE,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,0BAA0B,CAAC;AAEzC,uCAAuC;AACvC,OAAO,EAAE,eAAe,EAAmC,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,UAAU,EAAe,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAuC,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DatabaseSchema } from './types.js';
|
|
2
|
+
interface FBField {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
isVector: boolean;
|
|
6
|
+
defaultValue?: any;
|
|
7
|
+
attributes?: string[];
|
|
8
|
+
}
|
|
9
|
+
interface FBTable {
|
|
10
|
+
name: string;
|
|
11
|
+
namespace: string;
|
|
12
|
+
fields: FBField[];
|
|
13
|
+
isStruct: boolean;
|
|
14
|
+
}
|
|
15
|
+
interface ParsedSchema {
|
|
16
|
+
tables: FBTable[];
|
|
17
|
+
enums: Map<string, string[]>;
|
|
18
|
+
rootType?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function parseFlatBufferIDL(source: string): ParsedSchema;
|
|
21
|
+
export declare function parseJSONSchema(source: string): ParsedSchema;
|
|
22
|
+
export declare function toDBSchema(parsed: ParsedSchema, schemaName: string, source: string): DatabaseSchema;
|
|
23
|
+
export declare function parseSchema(source: string, name?: string): DatabaseSchema;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/schema/parser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuB,cAAc,EAA8B,MAAM,YAAY,CAAC;AAqH7F,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,UAAU,OAAO;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,YAAY;IACpB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CA0G/D;AAGD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAuI5D;AAaD,wBAAgB,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,CAuEnG;AAGD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,cAAc,CAiBpF"}
|
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
// Schema parser for FlatBuffers IDL and JSON Schema
|
|
2
|
+
// Converts to internal table definitions
|
|
3
|
+
import { SQLColumnType, fbTypeToSQL } from './types.js';
|
|
4
|
+
// Security: Maximum schema source size to prevent DoS
|
|
5
|
+
const MAX_SCHEMA_SIZE = 1024 * 1024; // 1MB
|
|
6
|
+
// Security: Forbidden keys that could enable prototype pollution
|
|
7
|
+
const FORBIDDEN_KEYS = ['__proto__', 'constructor', 'prototype'];
|
|
8
|
+
/**
|
|
9
|
+
* Safe JSON parse that prevents prototype pollution attacks.
|
|
10
|
+
* Throws if the input contains dangerous keys or is too large.
|
|
11
|
+
*/
|
|
12
|
+
function safeJSONParse(source) {
|
|
13
|
+
if (source.length > MAX_SCHEMA_SIZE) {
|
|
14
|
+
throw new Error(`Schema source exceeds maximum size of ${MAX_SCHEMA_SIZE} bytes`);
|
|
15
|
+
}
|
|
16
|
+
// Check for prototype pollution attempts in the raw string
|
|
17
|
+
for (const key of FORBIDDEN_KEYS) {
|
|
18
|
+
if (source.includes(`"${key}"`)) {
|
|
19
|
+
throw new Error(`Schema contains forbidden key: ${key}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const parsed = JSON.parse(source);
|
|
23
|
+
// Recursively validate the parsed object
|
|
24
|
+
validateObject(parsed, 0);
|
|
25
|
+
return parsed;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Recursively validate an object for dangerous patterns.
|
|
29
|
+
* Limits nesting depth to prevent stack overflow.
|
|
30
|
+
*/
|
|
31
|
+
function validateObject(obj, depth) {
|
|
32
|
+
const MAX_DEPTH = 50;
|
|
33
|
+
if (depth > MAX_DEPTH) {
|
|
34
|
+
throw new Error(`Schema nesting depth exceeds maximum of ${MAX_DEPTH}`);
|
|
35
|
+
}
|
|
36
|
+
if (obj === null || typeof obj !== 'object') {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (Array.isArray(obj)) {
|
|
40
|
+
for (const item of obj) {
|
|
41
|
+
validateObject(item, depth + 1);
|
|
42
|
+
}
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
for (const key of Object.keys(obj)) {
|
|
46
|
+
if (FORBIDDEN_KEYS.includes(key)) {
|
|
47
|
+
throw new Error(`Schema contains forbidden key: ${key}`);
|
|
48
|
+
}
|
|
49
|
+
validateObject(obj[key], depth + 1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Type guard to check if a value is a valid JSON Schema object.
|
|
54
|
+
*/
|
|
55
|
+
function isValidJSONSchema(value) {
|
|
56
|
+
if (value === null || typeof value !== 'object') {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
const obj = value;
|
|
60
|
+
// If type is present, it must be a string
|
|
61
|
+
if (obj.type !== undefined && typeof obj.type !== 'string') {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
// If title is present, it must be a string
|
|
65
|
+
if (obj.title !== undefined && typeof obj.title !== 'string') {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
// If properties is present, it must be an object
|
|
69
|
+
if (obj.properties !== undefined && (typeof obj.properties !== 'object' || obj.properties === null)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Type guard to check if a value is a valid property definition.
|
|
76
|
+
*/
|
|
77
|
+
function isValidPropertyDef(value) {
|
|
78
|
+
if (value === null || typeof value !== 'object') {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
const obj = value;
|
|
82
|
+
if (obj.type !== undefined && typeof obj.type !== 'string') {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return true;
|
|
86
|
+
}
|
|
87
|
+
// Parse FlatBuffer IDL schema
|
|
88
|
+
export function parseFlatBufferIDL(source) {
|
|
89
|
+
const result = {
|
|
90
|
+
tables: [],
|
|
91
|
+
enums: new Map(),
|
|
92
|
+
};
|
|
93
|
+
let currentNamespace = '';
|
|
94
|
+
const lines = source.split('\n');
|
|
95
|
+
let i = 0;
|
|
96
|
+
while (i < lines.length) {
|
|
97
|
+
const line = lines[i].trim();
|
|
98
|
+
// Skip empty lines and comments
|
|
99
|
+
if (!line || line.startsWith('//')) {
|
|
100
|
+
i++;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
// Namespace
|
|
104
|
+
const nsMatch = line.match(/^namespace\s+([\w.]+)\s*;/);
|
|
105
|
+
if (nsMatch) {
|
|
106
|
+
currentNamespace = nsMatch[1];
|
|
107
|
+
i++;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
// Root type
|
|
111
|
+
const rootMatch = line.match(/^root_type\s+(\w+)\s*;/);
|
|
112
|
+
if (rootMatch) {
|
|
113
|
+
result.rootType = rootMatch[1];
|
|
114
|
+
i++;
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
// Enum
|
|
118
|
+
const enumMatch = line.match(/^enum\s+(\w+)\s*:\s*\w+\s*\{/);
|
|
119
|
+
if (enumMatch) {
|
|
120
|
+
const enumName = enumMatch[1];
|
|
121
|
+
const values = [];
|
|
122
|
+
i++;
|
|
123
|
+
while (i < lines.length) {
|
|
124
|
+
const enumLine = lines[i].trim();
|
|
125
|
+
if (enumLine === '}') {
|
|
126
|
+
i++;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
const valueMatch = enumLine.match(/^(\w+)/);
|
|
130
|
+
if (valueMatch) {
|
|
131
|
+
values.push(valueMatch[1]);
|
|
132
|
+
}
|
|
133
|
+
i++;
|
|
134
|
+
}
|
|
135
|
+
result.enums.set(enumName, values);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
// Table or Struct
|
|
139
|
+
const tableMatch = line.match(/^(table|struct)\s+(\w+)\s*\{/);
|
|
140
|
+
if (tableMatch) {
|
|
141
|
+
const isStruct = tableMatch[1] === 'struct';
|
|
142
|
+
const tableName = tableMatch[2];
|
|
143
|
+
const fields = [];
|
|
144
|
+
i++;
|
|
145
|
+
while (i < lines.length) {
|
|
146
|
+
const fieldLine = lines[i].trim();
|
|
147
|
+
if (fieldLine === '}') {
|
|
148
|
+
i++;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
// Parse field: name: type (attributes) = default;
|
|
152
|
+
const fieldMatch = fieldLine.match(/^(\w+)\s*:\s*(\[?\w+\]?)\s*(?:\((.*?)\))?\s*(?:=\s*(.+?))?\s*;/);
|
|
153
|
+
if (fieldMatch) {
|
|
154
|
+
const isVector = fieldMatch[2].startsWith('[');
|
|
155
|
+
const typeName = isVector ? fieldMatch[2].slice(1, -1) : fieldMatch[2];
|
|
156
|
+
const attrs = fieldMatch[3] ? fieldMatch[3].split(',').map(a => a.trim()) : [];
|
|
157
|
+
const defaultVal = fieldMatch[4];
|
|
158
|
+
fields.push({
|
|
159
|
+
name: fieldMatch[1],
|
|
160
|
+
type: typeName,
|
|
161
|
+
isVector,
|
|
162
|
+
defaultValue: defaultVal,
|
|
163
|
+
attributes: attrs,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
i++;
|
|
167
|
+
}
|
|
168
|
+
result.tables.push({
|
|
169
|
+
name: tableName,
|
|
170
|
+
namespace: currentNamespace,
|
|
171
|
+
fields,
|
|
172
|
+
isStruct,
|
|
173
|
+
});
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
i++;
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
// Parse JSON Schema with security validation
|
|
181
|
+
export function parseJSONSchema(source) {
|
|
182
|
+
// Security: Use safe JSON parse to prevent prototype pollution
|
|
183
|
+
const rawSchema = safeJSONParse(source);
|
|
184
|
+
// Security: Validate schema structure
|
|
185
|
+
if (!isValidJSONSchema(rawSchema)) {
|
|
186
|
+
throw new Error('Invalid JSON Schema: expected an object with valid structure');
|
|
187
|
+
}
|
|
188
|
+
const schema = rawSchema;
|
|
189
|
+
const result = {
|
|
190
|
+
tables: [],
|
|
191
|
+
enums: new Map(),
|
|
192
|
+
};
|
|
193
|
+
// Handle top-level object as a table
|
|
194
|
+
if (schema.type === 'object' && schema.properties) {
|
|
195
|
+
const tableName = schema.title || 'Root';
|
|
196
|
+
const fields = [];
|
|
197
|
+
// Security: Use Object.keys instead of Object.entries to avoid prototype chain
|
|
198
|
+
const propNames = Object.keys(schema.properties);
|
|
199
|
+
for (const propName of propNames) {
|
|
200
|
+
// Security: Skip any forbidden keys that might have slipped through
|
|
201
|
+
if (FORBIDDEN_KEYS.includes(propName)) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const propDef = schema.properties[propName];
|
|
205
|
+
if (!isValidPropertyDef(propDef)) {
|
|
206
|
+
continue; // Skip invalid property definitions
|
|
207
|
+
}
|
|
208
|
+
const prop = propDef;
|
|
209
|
+
let type = 'string';
|
|
210
|
+
let isVector = false;
|
|
211
|
+
if (prop.type === 'integer') {
|
|
212
|
+
type = 'int64';
|
|
213
|
+
}
|
|
214
|
+
else if (prop.type === 'number') {
|
|
215
|
+
type = 'float64';
|
|
216
|
+
}
|
|
217
|
+
else if (prop.type === 'boolean') {
|
|
218
|
+
type = 'bool';
|
|
219
|
+
}
|
|
220
|
+
else if (prop.type === 'string') {
|
|
221
|
+
type = 'string';
|
|
222
|
+
}
|
|
223
|
+
else if (prop.type === 'array') {
|
|
224
|
+
isVector = true;
|
|
225
|
+
type = jsonTypeToFB(prop.items?.type || 'string');
|
|
226
|
+
}
|
|
227
|
+
else if (prop.type === 'object') {
|
|
228
|
+
// Nested object - will be stored as BLOB (serialized FlatBuffer)
|
|
229
|
+
type = propName;
|
|
230
|
+
}
|
|
231
|
+
// Handle enums
|
|
232
|
+
if (prop.enum && Array.isArray(prop.enum)) {
|
|
233
|
+
const enumValues = prop.enum.filter((v) => typeof v === 'string');
|
|
234
|
+
result.enums.set(propName + 'Enum', enumValues);
|
|
235
|
+
type = propName + 'Enum';
|
|
236
|
+
}
|
|
237
|
+
fields.push({
|
|
238
|
+
name: propName,
|
|
239
|
+
type,
|
|
240
|
+
isVector,
|
|
241
|
+
defaultValue: prop.default,
|
|
242
|
+
attributes: prop.required ? ['required'] : [],
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
result.tables.push({
|
|
246
|
+
name: tableName,
|
|
247
|
+
namespace: '',
|
|
248
|
+
fields,
|
|
249
|
+
isStruct: false,
|
|
250
|
+
});
|
|
251
|
+
result.rootType = tableName;
|
|
252
|
+
}
|
|
253
|
+
// Handle definitions (sub-schemas)
|
|
254
|
+
const defs = schema.definitions || schema.$defs;
|
|
255
|
+
if (defs && typeof defs === 'object') {
|
|
256
|
+
const defNames = Object.keys(defs);
|
|
257
|
+
for (const defName of defNames) {
|
|
258
|
+
// Security: Skip forbidden keys
|
|
259
|
+
if (FORBIDDEN_KEYS.includes(defName)) {
|
|
260
|
+
continue;
|
|
261
|
+
}
|
|
262
|
+
const defSchema = defs[defName];
|
|
263
|
+
if (!isValidJSONSchema(defSchema)) {
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
const def = defSchema;
|
|
267
|
+
if (def.type === 'object' && def.properties) {
|
|
268
|
+
const fields = [];
|
|
269
|
+
const defPropNames = Object.keys(def.properties);
|
|
270
|
+
for (const propName of defPropNames) {
|
|
271
|
+
if (FORBIDDEN_KEYS.includes(propName)) {
|
|
272
|
+
continue;
|
|
273
|
+
}
|
|
274
|
+
const propDef = def.properties[propName];
|
|
275
|
+
if (!isValidPropertyDef(propDef)) {
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
const prop = propDef;
|
|
279
|
+
let type = jsonTypeToFB(prop.type || 'string');
|
|
280
|
+
const isVector = prop.type === 'array';
|
|
281
|
+
if (isVector) {
|
|
282
|
+
type = jsonTypeToFB(prop.items?.type || 'string');
|
|
283
|
+
}
|
|
284
|
+
fields.push({
|
|
285
|
+
name: propName,
|
|
286
|
+
type,
|
|
287
|
+
isVector,
|
|
288
|
+
defaultValue: prop.default,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
result.tables.push({
|
|
292
|
+
name: defName,
|
|
293
|
+
namespace: '',
|
|
294
|
+
fields,
|
|
295
|
+
isStruct: false,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return result;
|
|
301
|
+
}
|
|
302
|
+
function jsonTypeToFB(jsonType) {
|
|
303
|
+
switch (jsonType) {
|
|
304
|
+
case 'integer': return 'int64';
|
|
305
|
+
case 'number': return 'float64';
|
|
306
|
+
case 'boolean': return 'bool';
|
|
307
|
+
case 'string': return 'string';
|
|
308
|
+
default: return 'string';
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
// Convert parsed schema to database schema
|
|
312
|
+
export function toDBSchema(parsed, schemaName, source) {
|
|
313
|
+
const tables = [];
|
|
314
|
+
for (const table of parsed.tables) {
|
|
315
|
+
const columns = [];
|
|
316
|
+
// Add implicit rowid/sequence column
|
|
317
|
+
columns.push({
|
|
318
|
+
name: '_rowid',
|
|
319
|
+
sqlType: SQLColumnType.INTEGER,
|
|
320
|
+
flatbufferPath: [],
|
|
321
|
+
fbTypeName: 'uint64',
|
|
322
|
+
nullable: false,
|
|
323
|
+
isPrimaryKey: true,
|
|
324
|
+
isIndexed: true,
|
|
325
|
+
});
|
|
326
|
+
// Add _offset column for FlatBuffer lookup
|
|
327
|
+
columns.push({
|
|
328
|
+
name: '_offset',
|
|
329
|
+
sqlType: SQLColumnType.INTEGER,
|
|
330
|
+
flatbufferPath: [],
|
|
331
|
+
fbTypeName: 'uint64',
|
|
332
|
+
nullable: false,
|
|
333
|
+
isPrimaryKey: false,
|
|
334
|
+
isIndexed: false,
|
|
335
|
+
});
|
|
336
|
+
for (const field of table.fields) {
|
|
337
|
+
const isRequired = field.attributes?.includes('required') ?? false;
|
|
338
|
+
const isKey = field.attributes?.includes('key') ?? false;
|
|
339
|
+
const isIndexed = field.attributes?.includes('indexed') ?? isKey;
|
|
340
|
+
// Determine SQL type
|
|
341
|
+
let sqlType;
|
|
342
|
+
if (field.isVector) {
|
|
343
|
+
sqlType = SQLColumnType.BLOB;
|
|
344
|
+
}
|
|
345
|
+
else if (parsed.enums.has(field.type)) {
|
|
346
|
+
sqlType = SQLColumnType.INTEGER; // Enums stored as integers
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
sqlType = fbTypeToSQL(field.type);
|
|
350
|
+
}
|
|
351
|
+
columns.push({
|
|
352
|
+
name: field.name,
|
|
353
|
+
sqlType,
|
|
354
|
+
flatbufferPath: [field.name],
|
|
355
|
+
fbTypeName: field.type,
|
|
356
|
+
nullable: !isRequired && !table.isStruct,
|
|
357
|
+
defaultValue: field.defaultValue,
|
|
358
|
+
isPrimaryKey: isKey,
|
|
359
|
+
isIndexed,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
tables.push({
|
|
363
|
+
name: table.name,
|
|
364
|
+
fbTableName: table.name,
|
|
365
|
+
fbNamespace: table.namespace,
|
|
366
|
+
columns,
|
|
367
|
+
primaryKey: ['_rowid'],
|
|
368
|
+
indexes: columns.filter(c => c.isIndexed && c.name !== '_rowid').map(c => c.name),
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
return {
|
|
372
|
+
name: schemaName,
|
|
373
|
+
tables,
|
|
374
|
+
fbSchemaSource: source,
|
|
375
|
+
version: 1,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
// Auto-detect and parse schema
|
|
379
|
+
export function parseSchema(source, name = 'default') {
|
|
380
|
+
// Security: Check size limit for all schema types
|
|
381
|
+
if (source.length > MAX_SCHEMA_SIZE) {
|
|
382
|
+
throw new Error(`Schema source exceeds maximum size of ${MAX_SCHEMA_SIZE} bytes`);
|
|
383
|
+
}
|
|
384
|
+
const trimmed = source.trim();
|
|
385
|
+
// Try to detect if it's JSON
|
|
386
|
+
if (trimmed.startsWith('{')) {
|
|
387
|
+
const parsed = parseJSONSchema(source);
|
|
388
|
+
return toDBSchema(parsed, name, source);
|
|
389
|
+
}
|
|
390
|
+
// Assume FlatBuffer IDL
|
|
391
|
+
const parsed = parseFlatBufferIDL(source);
|
|
392
|
+
return toDBSchema(parsed, name, source);
|
|
393
|
+
}
|
|
394
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/schema/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export declare enum SQLColumnType {
|
|
2
|
+
NULL = "NULL",
|
|
3
|
+
INTEGER = "INTEGER",
|
|
4
|
+
REAL = "REAL",
|
|
5
|
+
TEXT = "TEXT",
|
|
6
|
+
BLOB = "BLOB"
|
|
7
|
+
}
|
|
8
|
+
export interface ColumnDef {
|
|
9
|
+
name: string;
|
|
10
|
+
sqlType: SQLColumnType;
|
|
11
|
+
flatbufferPath: string[];
|
|
12
|
+
fbTypeName: string;
|
|
13
|
+
nullable: boolean;
|
|
14
|
+
defaultValue?: string | number | boolean | null;
|
|
15
|
+
isPrimaryKey: boolean;
|
|
16
|
+
isIndexed: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface TableDef {
|
|
19
|
+
name: string;
|
|
20
|
+
fbTableName: string;
|
|
21
|
+
fbNamespace: string;
|
|
22
|
+
columns: ColumnDef[];
|
|
23
|
+
primaryKey: string[];
|
|
24
|
+
indexes: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface DatabaseSchema {
|
|
27
|
+
name: string;
|
|
28
|
+
tables: TableDef[];
|
|
29
|
+
fbSchemaSource: string;
|
|
30
|
+
version: number;
|
|
31
|
+
}
|
|
32
|
+
export declare function fbTypeToSQL(fbType: string): SQLColumnType;
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"AAEA,oBAAY,aAAa;IACvB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,IAAI,SAAS;IACb,IAAI,SAAS;CACd;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,aAAa,CAAC;IACvB,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;IAChD,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAqBzD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// Schema types for FlatBuffers-SQLite
|
|
2
|
+
export var SQLColumnType;
|
|
3
|
+
(function (SQLColumnType) {
|
|
4
|
+
SQLColumnType["NULL"] = "NULL";
|
|
5
|
+
SQLColumnType["INTEGER"] = "INTEGER";
|
|
6
|
+
SQLColumnType["REAL"] = "REAL";
|
|
7
|
+
SQLColumnType["TEXT"] = "TEXT";
|
|
8
|
+
SQLColumnType["BLOB"] = "BLOB";
|
|
9
|
+
})(SQLColumnType || (SQLColumnType = {}));
|
|
10
|
+
// FlatBuffer type to SQL type mapping
|
|
11
|
+
export function fbTypeToSQL(fbType) {
|
|
12
|
+
const type = fbType.toLowerCase();
|
|
13
|
+
// Integer types
|
|
14
|
+
if (['bool', 'byte', 'ubyte', 'int8', 'uint8', 'short', 'ushort', 'int16', 'uint16',
|
|
15
|
+
'int', 'uint', 'int32', 'uint32', 'long', 'ulong', 'int64', 'uint64'].includes(type)) {
|
|
16
|
+
return SQLColumnType.INTEGER;
|
|
17
|
+
}
|
|
18
|
+
// Float types
|
|
19
|
+
if (['float', 'float32', 'double', 'float64'].includes(type)) {
|
|
20
|
+
return SQLColumnType.REAL;
|
|
21
|
+
}
|
|
22
|
+
// String type
|
|
23
|
+
if (type === 'string') {
|
|
24
|
+
return SQLColumnType.TEXT;
|
|
25
|
+
}
|
|
26
|
+
// Default to BLOB for complex types
|
|
27
|
+
return SQLColumnType.BLOB;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,8BAAa,CAAA;IACb,oCAAmB,CAAA;IACnB,8BAAa,CAAA;IACb,8BAAa,CAAA;IACb,8BAAa,CAAA;AACf,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB;AA6BD,sCAAsC;AACtC,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAElC,gBAAgB;IAChB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;QAC9E,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,OAAO,aAAa,CAAC,OAAO,CAAC;IAC/B,CAAC;IAED,cAAc;IACd,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,OAAO,aAAa,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,cAAc;IACd,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,aAAa,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,oCAAoC;IACpC,OAAO,aAAa,CAAC,IAAI,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { StoredRecord } from './types.js';
|
|
2
|
+
export interface StorageOptions {
|
|
3
|
+
/** Initial storage capacity in bytes (default: 1MB) */
|
|
4
|
+
initialCapacity?: number;
|
|
5
|
+
/** Maximum storage size in bytes (default: 1GB, 0 = unlimited) */
|
|
6
|
+
maxSize?: number;
|
|
7
|
+
/** Callback when storage reaches warning threshold (80% of max) */
|
|
8
|
+
onStorageWarning?: (currentSize: number, maxSize: number) => void;
|
|
9
|
+
}
|
|
10
|
+
export declare class StackedFlatBufferStore {
|
|
11
|
+
private data;
|
|
12
|
+
private dataView;
|
|
13
|
+
private writeOffset;
|
|
14
|
+
private recordCount;
|
|
15
|
+
private sequence;
|
|
16
|
+
private schemaName;
|
|
17
|
+
private recordIndex;
|
|
18
|
+
private maxSize;
|
|
19
|
+
private warningEmitted;
|
|
20
|
+
private onStorageWarning?;
|
|
21
|
+
constructor(schemaName: string, options?: StorageOptions | number);
|
|
22
|
+
private writeFileHeader;
|
|
23
|
+
private updateFileHeader;
|
|
24
|
+
private ensureCapacity;
|
|
25
|
+
append(tableName: string, flatbufferData: Uint8Array): bigint;
|
|
26
|
+
readRecord(offset: bigint): StoredRecord;
|
|
27
|
+
iterateRecords(): Generator<StoredRecord>;
|
|
28
|
+
iterateTableRecords(tableName: string): Generator<StoredRecord>;
|
|
29
|
+
getData(): Uint8Array;
|
|
30
|
+
static fromData(data: Uint8Array, options?: StorageOptions): StackedFlatBufferStore;
|
|
31
|
+
getRecordCount(): bigint;
|
|
32
|
+
getSchemaName(): string;
|
|
33
|
+
getCurrentSize(): number;
|
|
34
|
+
getMaxSize(): number;
|
|
35
|
+
getUsagePercent(): number;
|
|
36
|
+
isNearCapacity(): boolean;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=stacked-flatbuffers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacked-flatbuffers.d.ts","sourceRoot":"","sources":["../../src/storage/stacked-flatbuffers.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgC,YAAY,EAAyB,MAAM,YAAY,CAAC;AAY/F,MAAM,WAAW,cAAc;IAC7B,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnE;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,UAAU,CAAS;IAG3B,OAAO,CAAC,WAAW,CAAwC;IAG3D,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,gBAAgB,CAAC,CAAiD;gBAE9D,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,cAAc,GAAG,MAAW;IAkBrE,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,cAAc;IA0CtB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,GAAG,MAAM;IA6C7D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY;IAsCvC,cAAc,IAAI,SAAS,CAAC,YAAY,CAAC;IAYzC,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC;IAShE,OAAO,IAAI,UAAU;IAKrB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,cAAmB,GAAG,sBAAsB;IAsDvF,cAAc,IAAI,MAAM;IAIxB,aAAa,IAAI,MAAM;IAKvB,cAAc,IAAI,MAAM;IAKxB,UAAU,IAAI,MAAM;IAKpB,eAAe,IAAI,MAAM;IAMzB,cAAc,IAAI,OAAO;CAI1B"}
|