genjutsu-db 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/LICENSE +21 -0
- package/README.md +360 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +370 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +38 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/migrations.d.ts +11 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +163 -0
- package/dist/migrations.js.map +1 -0
- package/dist/model.d.ts +27 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +138 -0
- package/dist/model.js.map +1 -0
- package/dist/relations.d.ts +17 -0
- package/dist/relations.d.ts.map +1 -0
- package/dist/relations.js +114 -0
- package/dist/relations.js.map +1 -0
- package/dist/transport.d.ts +32 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +232 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +104 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +14 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +57 -0
- package/dist/utils.js.map +1 -0
- package/package.json +48 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client factory for the genjutsu-db library.
|
|
3
|
+
* Creates a schema-driven client with typed repositories.
|
|
4
|
+
*/
|
|
5
|
+
import { extractSpreadsheetId, getSheetValues, updateSheet, clearRange, batchClear, batchUpdate, getSpreadsheetMetadata, structuralBatchUpdate, } from "./transport";
|
|
6
|
+
import { schemaError, permissionError, validationError } from "./errors";
|
|
7
|
+
import { validateForeignKeys, loadRelated } from "./relations";
|
|
8
|
+
const RESERVED_SHEET_NAMES = ["_genjutsu_migrations"];
|
|
9
|
+
export function createClient(config) {
|
|
10
|
+
// Validate config
|
|
11
|
+
if (!config.spreadsheetId) {
|
|
12
|
+
throw schemaError("spreadsheetId must be non-empty");
|
|
13
|
+
}
|
|
14
|
+
if (!config.auth && !config.apiKey) {
|
|
15
|
+
throw schemaError("Either auth or apiKey must be provided");
|
|
16
|
+
}
|
|
17
|
+
const schemas = config.schemas;
|
|
18
|
+
if (!schemas || Object.keys(schemas).length === 0) {
|
|
19
|
+
throw schemaError("At least one schema must be registered");
|
|
20
|
+
}
|
|
21
|
+
// Validate schemas at creation time
|
|
22
|
+
const sheetNames = new Set();
|
|
23
|
+
for (const [key, schema] of Object.entries(schemas)) {
|
|
24
|
+
if (!schema.sheetName) {
|
|
25
|
+
throw schemaError(`Schema "${key}" has empty sheetName`);
|
|
26
|
+
}
|
|
27
|
+
if (!schema.headers || schema.headers.length === 0) {
|
|
28
|
+
throw schemaError(`Schema "${key}" has empty headers`);
|
|
29
|
+
}
|
|
30
|
+
if (sheetNames.has(schema.sheetName)) {
|
|
31
|
+
throw schemaError(`Duplicate sheetName "${schema.sheetName}" in schemas`);
|
|
32
|
+
}
|
|
33
|
+
if (RESERVED_SHEET_NAMES.includes(schema.sheetName)) {
|
|
34
|
+
throw schemaError(`Schema "${key}" uses reserved sheet name "${schema.sheetName}"`);
|
|
35
|
+
}
|
|
36
|
+
sheetNames.add(schema.sheetName);
|
|
37
|
+
// Validate FK target models exist in schemas
|
|
38
|
+
if (schema.relations) {
|
|
39
|
+
for (const rel of schema.relations) {
|
|
40
|
+
if (!schemas[rel.targetModel]) {
|
|
41
|
+
throw schemaError(`Schema "${key}" references model "${rel.targetModel}" which is not registered`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const ctx = {
|
|
47
|
+
auth: config.auth,
|
|
48
|
+
apiKey: config.apiKey,
|
|
49
|
+
spreadsheetId: config.spreadsheetId,
|
|
50
|
+
};
|
|
51
|
+
const isReadOnly = !config.auth;
|
|
52
|
+
function assertWritable() {
|
|
53
|
+
if (isReadOnly) {
|
|
54
|
+
throw permissionError("Write operations require auth. This client was created with apiKey only (read-only).");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// Write mutex: serializes all write operations
|
|
58
|
+
let writeLock = Promise.resolve();
|
|
59
|
+
function withWriteLock(fn) {
|
|
60
|
+
const prev = writeLock;
|
|
61
|
+
let resolve;
|
|
62
|
+
writeLock = new Promise((r) => {
|
|
63
|
+
resolve = r;
|
|
64
|
+
});
|
|
65
|
+
return prev.then(fn).finally(() => resolve());
|
|
66
|
+
}
|
|
67
|
+
// Build a generic repository for a single schema
|
|
68
|
+
function buildRepo(schema, _allSchemas) {
|
|
69
|
+
return {
|
|
70
|
+
async create(record, options) {
|
|
71
|
+
assertWritable();
|
|
72
|
+
return withWriteLock(async () => {
|
|
73
|
+
// Apply defaults from field definitions
|
|
74
|
+
const entity = applyDefaults(schema, record);
|
|
75
|
+
// Validate
|
|
76
|
+
if (schema.validate)
|
|
77
|
+
schema.validate(entity);
|
|
78
|
+
// Check duplicate PK
|
|
79
|
+
if (schema.primaryKey) {
|
|
80
|
+
const existing = await readAllRaw(schema);
|
|
81
|
+
const pk = schema.primaryKey;
|
|
82
|
+
const pkValue = entity[pk];
|
|
83
|
+
const duplicate = existing.find((e) => e[pk] === pkValue);
|
|
84
|
+
if (duplicate) {
|
|
85
|
+
throw validationError(`Duplicate primary key: ${String(pkValue)}`, [
|
|
86
|
+
{ field: pk, message: "Duplicate primary key", value: pkValue },
|
|
87
|
+
]);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// FK validation
|
|
91
|
+
if (!options?.skipFkValidation) {
|
|
92
|
+
await validateForeignKeys(entity, schema, schemas, ctx);
|
|
93
|
+
}
|
|
94
|
+
// Ensure headers exist before first append
|
|
95
|
+
const rawRows = await getSheetValues(ctx, schema.writeRange, "FORMATTED_VALUE");
|
|
96
|
+
if (rawRows.length === 0) {
|
|
97
|
+
// Sheet is empty — write headers first
|
|
98
|
+
await updateSheet(ctx, schema.writeRange, [schema.headers], false);
|
|
99
|
+
}
|
|
100
|
+
// Append single row
|
|
101
|
+
const values = [schema.toRow(entity)];
|
|
102
|
+
await updateSheet(ctx, schema.writeRange, values, true);
|
|
103
|
+
return entity;
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
async findById(id) {
|
|
107
|
+
if (!schema.primaryKey)
|
|
108
|
+
return null;
|
|
109
|
+
const records = await readAllRaw(schema);
|
|
110
|
+
const pk = schema.primaryKey;
|
|
111
|
+
return (records.find((r) => r[pk] === id) ?? null);
|
|
112
|
+
},
|
|
113
|
+
async findMany(filter, options) {
|
|
114
|
+
let records = await readAllRaw(schema);
|
|
115
|
+
if (filter)
|
|
116
|
+
records = records.filter(filter);
|
|
117
|
+
if (options?.include) {
|
|
118
|
+
records = await loadRelated(records, schema, options.include, schemas, ctx);
|
|
119
|
+
}
|
|
120
|
+
return records;
|
|
121
|
+
},
|
|
122
|
+
async update(id, changes, options) {
|
|
123
|
+
assertWritable();
|
|
124
|
+
return withWriteLock(async () => {
|
|
125
|
+
const records = await readAllRaw(schema);
|
|
126
|
+
if (!schema.primaryKey) {
|
|
127
|
+
throw validationError("Cannot update without a primary key", []);
|
|
128
|
+
}
|
|
129
|
+
const pk = schema.primaryKey;
|
|
130
|
+
const index = records.findIndex((r) => r[pk] === id);
|
|
131
|
+
if (index === -1) {
|
|
132
|
+
throw validationError(`Record not found: ${String(id)}`, [
|
|
133
|
+
{ field: pk, message: "Record not found", value: id },
|
|
134
|
+
]);
|
|
135
|
+
}
|
|
136
|
+
const merged = { ...records[index], ...changes };
|
|
137
|
+
if (schema.validate)
|
|
138
|
+
schema.validate(merged);
|
|
139
|
+
// FK validation on changed fields
|
|
140
|
+
if (!options?.skipFkValidation) {
|
|
141
|
+
const changedFields = new Set(Object.keys(changes));
|
|
142
|
+
await validateForeignKeys(merged, schema, schemas, ctx, changedFields);
|
|
143
|
+
}
|
|
144
|
+
records[index] = merged;
|
|
145
|
+
// Rewrite all records
|
|
146
|
+
const values = [schema.headers];
|
|
147
|
+
for (const r of records)
|
|
148
|
+
values.push(schema.toRow(r));
|
|
149
|
+
await clearRange(ctx, schema.clearRange);
|
|
150
|
+
await updateSheet(ctx, schema.writeRange, values, false);
|
|
151
|
+
return merged;
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
async delete(id) {
|
|
155
|
+
assertWritable();
|
|
156
|
+
return withWriteLock(async () => {
|
|
157
|
+
if (!schema.primaryKey)
|
|
158
|
+
return;
|
|
159
|
+
const records = await readAllRaw(schema);
|
|
160
|
+
const pk = schema.primaryKey;
|
|
161
|
+
const filtered = records.filter((r) => r[pk] !== id);
|
|
162
|
+
const values = [schema.headers];
|
|
163
|
+
for (const r of filtered)
|
|
164
|
+
values.push(schema.toRow(r));
|
|
165
|
+
await clearRange(ctx, schema.clearRange);
|
|
166
|
+
await updateSheet(ctx, schema.writeRange, values, false);
|
|
167
|
+
});
|
|
168
|
+
},
|
|
169
|
+
async readAll(options) {
|
|
170
|
+
let records = await readAllRaw(schema);
|
|
171
|
+
if (options?.include) {
|
|
172
|
+
records = await loadRelated(records, schema, options.include, schemas, ctx);
|
|
173
|
+
}
|
|
174
|
+
return records;
|
|
175
|
+
},
|
|
176
|
+
writeAll(records) {
|
|
177
|
+
assertWritable();
|
|
178
|
+
return withWriteLock(async () => {
|
|
179
|
+
if (schema.validate) {
|
|
180
|
+
for (const r of records)
|
|
181
|
+
schema.validate(r);
|
|
182
|
+
}
|
|
183
|
+
const values = [schema.headers];
|
|
184
|
+
for (const r of records)
|
|
185
|
+
values.push(schema.toRow(r));
|
|
186
|
+
await clearRange(ctx, schema.clearRange);
|
|
187
|
+
if (values.length > 0) {
|
|
188
|
+
await updateSheet(ctx, schema.writeRange, values, false);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
},
|
|
192
|
+
append(records) {
|
|
193
|
+
assertWritable();
|
|
194
|
+
if (schema.appendSupported === false) {
|
|
195
|
+
return Promise.reject(schemaError(`Append not supported for "${schema.sheetName}"`));
|
|
196
|
+
}
|
|
197
|
+
return withWriteLock(async () => {
|
|
198
|
+
if (schema.validate) {
|
|
199
|
+
for (const r of records)
|
|
200
|
+
schema.validate(r);
|
|
201
|
+
}
|
|
202
|
+
// Ensure headers exist before first append
|
|
203
|
+
const rawRows = await getSheetValues(ctx, schema.writeRange, "FORMATTED_VALUE");
|
|
204
|
+
if (rawRows.length === 0) {
|
|
205
|
+
await updateSheet(ctx, schema.writeRange, [schema.headers], false);
|
|
206
|
+
}
|
|
207
|
+
const values = records.map((r) => schema.toRow(r));
|
|
208
|
+
await updateSheet(ctx, schema.writeRange, values, true);
|
|
209
|
+
});
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
async function readAllRaw(schema) {
|
|
214
|
+
const rows = await getSheetValues(ctx, schema.readRange, "UNFORMATTED_VALUE");
|
|
215
|
+
const results = [];
|
|
216
|
+
for (let i = 0; i < rows.length; i++) {
|
|
217
|
+
const entity = schema.parseRow(rows[i], i);
|
|
218
|
+
if (entity != null)
|
|
219
|
+
results.push(entity);
|
|
220
|
+
}
|
|
221
|
+
return results;
|
|
222
|
+
}
|
|
223
|
+
function applyDefaults(schema, record) {
|
|
224
|
+
if (!schema.fields)
|
|
225
|
+
return record;
|
|
226
|
+
const result = { ...record };
|
|
227
|
+
for (const field of schema.fields) {
|
|
228
|
+
if (result[field.name] === undefined && field.defaultValue !== undefined) {
|
|
229
|
+
result[field.name] = field.defaultValue;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
// Pre-build all repositories
|
|
235
|
+
const repos = {};
|
|
236
|
+
for (const [key, schema] of Object.entries(schemas)) {
|
|
237
|
+
repos[key] = buildRepo(schema, schemas);
|
|
238
|
+
}
|
|
239
|
+
return {
|
|
240
|
+
repo(key) {
|
|
241
|
+
return repos[key];
|
|
242
|
+
},
|
|
243
|
+
batchSync(payload) {
|
|
244
|
+
assertWritable();
|
|
245
|
+
return withWriteLock(async () => {
|
|
246
|
+
const clearRanges = [];
|
|
247
|
+
const data = [];
|
|
248
|
+
for (const [key, schema] of Object.entries(schemas)) {
|
|
249
|
+
clearRanges.push(schema.clearRange);
|
|
250
|
+
const records = payload[key] ?? [];
|
|
251
|
+
const values = [schema.headers];
|
|
252
|
+
for (const r of records) {
|
|
253
|
+
values.push(schema.toRow(r));
|
|
254
|
+
}
|
|
255
|
+
data.push({ range: schema.writeRange, values });
|
|
256
|
+
}
|
|
257
|
+
await batchClear(ctx, clearRanges);
|
|
258
|
+
await batchUpdate(ctx, data);
|
|
259
|
+
});
|
|
260
|
+
},
|
|
261
|
+
async ensureSchema() {
|
|
262
|
+
const metadata = await getSpreadsheetMetadata(ctx);
|
|
263
|
+
const titles = new Set(metadata.sheets.map((s) => s.title));
|
|
264
|
+
const toAdd = Object.values(schemas)
|
|
265
|
+
.map((s) => s.sheetName)
|
|
266
|
+
.filter((t) => !titles.has(t));
|
|
267
|
+
if (toAdd.length === 0)
|
|
268
|
+
return;
|
|
269
|
+
await structuralBatchUpdate(ctx, toAdd.map((title) => ({
|
|
270
|
+
addSheet: { properties: { title } },
|
|
271
|
+
})));
|
|
272
|
+
},
|
|
273
|
+
async applyFormatting() {
|
|
274
|
+
const hasAnyFormatting = Object.values(schemas).some((s) => (s.formatting && s.formatting.length > 0) || s.headerFormatting);
|
|
275
|
+
if (!hasAnyFormatting)
|
|
276
|
+
return;
|
|
277
|
+
const metadata = await getSpreadsheetMetadata(ctx);
|
|
278
|
+
const sheetIdMap = new Map();
|
|
279
|
+
for (const s of metadata.sheets) {
|
|
280
|
+
sheetIdMap.set(s.title, s.sheetId);
|
|
281
|
+
}
|
|
282
|
+
const requests = [];
|
|
283
|
+
for (const schema of Object.values(schemas)) {
|
|
284
|
+
const sheetId = sheetIdMap.get(schema.sheetName);
|
|
285
|
+
if (sheetId == null)
|
|
286
|
+
continue;
|
|
287
|
+
// Header formatting
|
|
288
|
+
if (schema.headerFormatting) {
|
|
289
|
+
const hf = schema.headerFormatting;
|
|
290
|
+
const cellFormat = {};
|
|
291
|
+
const fields = [];
|
|
292
|
+
if (hf.bold || hf.fontSize) {
|
|
293
|
+
cellFormat.textFormat = {
|
|
294
|
+
...(hf.bold != null ? { bold: hf.bold } : {}),
|
|
295
|
+
...(hf.fontSize != null ? { fontSize: hf.fontSize } : {}),
|
|
296
|
+
};
|
|
297
|
+
fields.push("userEnteredFormat.textFormat");
|
|
298
|
+
}
|
|
299
|
+
if (hf.horizontalAlignment) {
|
|
300
|
+
cellFormat.horizontalAlignment = hf.horizontalAlignment;
|
|
301
|
+
fields.push("userEnteredFormat.horizontalAlignment");
|
|
302
|
+
}
|
|
303
|
+
if (fields.length > 0) {
|
|
304
|
+
requests.push({
|
|
305
|
+
repeatCell: {
|
|
306
|
+
range: {
|
|
307
|
+
sheetId,
|
|
308
|
+
startRowIndex: 0,
|
|
309
|
+
endRowIndex: 1,
|
|
310
|
+
startColumnIndex: 0,
|
|
311
|
+
endColumnIndex: schema.headers.length,
|
|
312
|
+
},
|
|
313
|
+
cell: { userEnteredFormat: cellFormat },
|
|
314
|
+
fields: fields.join(","),
|
|
315
|
+
},
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Data formatting rules
|
|
320
|
+
if (schema.formatting) {
|
|
321
|
+
for (const rule of schema.formatting) {
|
|
322
|
+
const cellFormat = {};
|
|
323
|
+
const fields = [];
|
|
324
|
+
if (rule.bold || rule.fontSize) {
|
|
325
|
+
cellFormat.textFormat = {
|
|
326
|
+
...(rule.bold != null ? { bold: rule.bold } : {}),
|
|
327
|
+
...(rule.fontSize != null ? { fontSize: rule.fontSize } : {}),
|
|
328
|
+
};
|
|
329
|
+
fields.push("userEnteredFormat.textFormat");
|
|
330
|
+
}
|
|
331
|
+
if (rule.horizontalAlignment) {
|
|
332
|
+
cellFormat.horizontalAlignment = rule.horizontalAlignment;
|
|
333
|
+
fields.push("userEnteredFormat.horizontalAlignment");
|
|
334
|
+
}
|
|
335
|
+
if (rule.numberFormat) {
|
|
336
|
+
cellFormat.numberFormat = rule.numberFormat;
|
|
337
|
+
fields.push("userEnteredFormat.numberFormat");
|
|
338
|
+
}
|
|
339
|
+
if (fields.length > 0) {
|
|
340
|
+
requests.push({
|
|
341
|
+
repeatCell: {
|
|
342
|
+
range: {
|
|
343
|
+
sheetId,
|
|
344
|
+
startRowIndex: rule.startRow ?? 1,
|
|
345
|
+
endRowIndex: rule.endRow ?? 10000,
|
|
346
|
+
startColumnIndex: rule.startCol,
|
|
347
|
+
endColumnIndex: rule.endCol,
|
|
348
|
+
},
|
|
349
|
+
cell: { userEnteredFormat: cellFormat },
|
|
350
|
+
fields: fields.join(","),
|
|
351
|
+
},
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
if (requests.length === 0)
|
|
358
|
+
return;
|
|
359
|
+
await structuralBatchUpdate(ctx, requests);
|
|
360
|
+
},
|
|
361
|
+
async migrate(_migrations) {
|
|
362
|
+
assertWritable();
|
|
363
|
+
// Stub — full implementation in src/migrations.ts (Phase 6)
|
|
364
|
+
const { runMigrations } = await import("./migrations");
|
|
365
|
+
await runMigrations(ctx, _migrations);
|
|
366
|
+
},
|
|
367
|
+
extractSpreadsheetId,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error handling for the genjutsu-db library.
|
|
3
|
+
*/
|
|
4
|
+
export type GenjutsuErrorKind = "AUTH_ERROR" | "PERMISSION_ERROR" | "RATE_LIMIT" | "NETWORK_ERROR" | "VALIDATION_ERROR" | "SCHEMA_ERROR" | "MIGRATION_ERROR" | "API_ERROR";
|
|
5
|
+
export interface ValidationIssue {
|
|
6
|
+
field: string;
|
|
7
|
+
message: string;
|
|
8
|
+
value?: unknown;
|
|
9
|
+
}
|
|
10
|
+
export declare class GenjutsuError extends Error {
|
|
11
|
+
readonly kind: GenjutsuErrorKind;
|
|
12
|
+
readonly cause?: unknown;
|
|
13
|
+
readonly retryAfterMs?: number;
|
|
14
|
+
readonly validationIssues?: ValidationIssue[];
|
|
15
|
+
readonly migrationVersion?: number;
|
|
16
|
+
readonly migrationName?: string;
|
|
17
|
+
constructor(kind: GenjutsuErrorKind, message: string, options?: {
|
|
18
|
+
cause?: unknown;
|
|
19
|
+
retryAfterMs?: number;
|
|
20
|
+
validationIssues?: ValidationIssue[];
|
|
21
|
+
migrationVersion?: number;
|
|
22
|
+
migrationName?: string;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/** @deprecated Use GenjutsuError instead */
|
|
26
|
+
export declare const SheetsDbError: typeof GenjutsuError;
|
|
27
|
+
export declare function isGenjutsuError(err: unknown): err is GenjutsuError;
|
|
28
|
+
/** @deprecated Use isGenjutsuError instead */
|
|
29
|
+
export declare const isSheetsDbError: typeof isGenjutsuError;
|
|
30
|
+
export declare function authError(message: string, cause?: unknown): GenjutsuError;
|
|
31
|
+
export declare function permissionError(message: string, cause?: unknown): GenjutsuError;
|
|
32
|
+
export declare function rateLimitError(message: string, retryAfterMs?: number, cause?: unknown): GenjutsuError;
|
|
33
|
+
export declare function networkError(message: string, cause?: unknown): GenjutsuError;
|
|
34
|
+
export declare function validationError(message: string, issues: ValidationIssue[]): GenjutsuError;
|
|
35
|
+
export declare function schemaError(message: string, cause?: unknown): GenjutsuError;
|
|
36
|
+
export declare function migrationError(message: string, version: number, name: string, cause?: unknown): GenjutsuError;
|
|
37
|
+
export declare function apiError(message: string, cause?: unknown): GenjutsuError;
|
|
38
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,kBAAkB,GAClB,YAAY,GACZ,eAAe,GACf,kBAAkB,GAClB,cAAc,GACd,iBAAiB,GACjB,WAAW,CAAC;AAEhB,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;gBAG9B,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;QACrC,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB;CAWJ;AAED,4CAA4C;AAC5C,eAAO,MAAM,aAAa,sBAAgB,CAAC;AAE3C,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,aAAa,CAElE;AAED,8CAA8C;AAC9C,eAAO,MAAM,eAAe,wBAAkB,CAAC;AAE/C,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAEzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAE/E;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,YAAY,CAAC,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,OAAO,GACd,aAAa,CAEf;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAE5E;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,EAAE,GACxB,aAAa,CAIf;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAE3E;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,OAAO,GACd,aAAa,CAMf;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,aAAa,CAExE"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error handling for the genjutsu-db library.
|
|
3
|
+
*/
|
|
4
|
+
export class GenjutsuError extends Error {
|
|
5
|
+
kind;
|
|
6
|
+
cause;
|
|
7
|
+
retryAfterMs;
|
|
8
|
+
validationIssues;
|
|
9
|
+
migrationVersion;
|
|
10
|
+
migrationName;
|
|
11
|
+
constructor(kind, message, options) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "GenjutsuError";
|
|
14
|
+
this.kind = kind;
|
|
15
|
+
this.cause = options?.cause;
|
|
16
|
+
this.retryAfterMs = options?.retryAfterMs;
|
|
17
|
+
this.validationIssues = options?.validationIssues;
|
|
18
|
+
this.migrationVersion = options?.migrationVersion;
|
|
19
|
+
this.migrationName = options?.migrationName;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** @deprecated Use GenjutsuError instead */
|
|
23
|
+
export const SheetsDbError = GenjutsuError;
|
|
24
|
+
export function isGenjutsuError(err) {
|
|
25
|
+
return err instanceof GenjutsuError;
|
|
26
|
+
}
|
|
27
|
+
/** @deprecated Use isGenjutsuError instead */
|
|
28
|
+
export const isSheetsDbError = isGenjutsuError;
|
|
29
|
+
export function authError(message, cause) {
|
|
30
|
+
return new GenjutsuError("AUTH_ERROR", message, { cause });
|
|
31
|
+
}
|
|
32
|
+
export function permissionError(message, cause) {
|
|
33
|
+
return new GenjutsuError("PERMISSION_ERROR", message, { cause });
|
|
34
|
+
}
|
|
35
|
+
export function rateLimitError(message, retryAfterMs, cause) {
|
|
36
|
+
return new GenjutsuError("RATE_LIMIT", message, { cause, retryAfterMs });
|
|
37
|
+
}
|
|
38
|
+
export function networkError(message, cause) {
|
|
39
|
+
return new GenjutsuError("NETWORK_ERROR", message, { cause });
|
|
40
|
+
}
|
|
41
|
+
export function validationError(message, issues) {
|
|
42
|
+
return new GenjutsuError("VALIDATION_ERROR", message, {
|
|
43
|
+
validationIssues: issues,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export function schemaError(message, cause) {
|
|
47
|
+
return new GenjutsuError("SCHEMA_ERROR", message, { cause });
|
|
48
|
+
}
|
|
49
|
+
export function migrationError(message, version, name, cause) {
|
|
50
|
+
return new GenjutsuError("MIGRATION_ERROR", message, {
|
|
51
|
+
cause,
|
|
52
|
+
migrationVersion: version,
|
|
53
|
+
migrationName: name,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
export function apiError(message, cause) {
|
|
57
|
+
return new GenjutsuError("API_ERROR", message, { cause });
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAkBH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,IAAI,CAAoB;IACxB,KAAK,CAAW;IAChB,YAAY,CAAU;IACtB,gBAAgB,CAAqB;IACrC,gBAAgB,CAAU;IAC1B,aAAa,CAAU;IAEhC,YACE,IAAuB,EACvB,OAAe,EACf,OAMC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,OAAO,EAAE,KAAK,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,CAAC;QAClD,IAAI,CAAC,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,OAAO,EAAE,aAAa,CAAC;IAC9C,CAAC;CACF;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAE3C,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,OAAO,GAAG,YAAY,aAAa,CAAC;AACtC,CAAC;AAED,8CAA8C;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,KAAe;IACxD,OAAO,IAAI,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAe;IAC9D,OAAO,IAAI,aAAa,CAAC,kBAAkB,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,YAAqB,EACrB,KAAe;IAEf,OAAO,IAAI,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAe;IAC3D,OAAO,IAAI,aAAa,CAAC,eAAe,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,MAAyB;IAEzB,OAAO,IAAI,aAAa,CAAC,kBAAkB,EAAE,OAAO,EAAE;QACpD,gBAAgB,EAAE,MAAM;KACzB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,KAAe;IAC1D,OAAO,IAAI,aAAa,CAAC,cAAc,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,OAAe,EACf,IAAY,EACZ,KAAe;IAEf,OAAO,IAAI,aAAa,CAAC,iBAAiB,EAAE,OAAO,EAAE;QACnD,KAAK;QACL,gBAAgB,EAAE,OAAO;QACzB,aAAa,EAAE,IAAI;KACpB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,KAAe;IACvD,OAAO,IAAI,aAAa,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5D,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* genjutsu-db — public API barrel export.
|
|
3
|
+
* A TypeScript-first Google Sheets database library with zero runtime dependencies.
|
|
4
|
+
*/
|
|
5
|
+
export { createClient } from "./client";
|
|
6
|
+
export { extractSpreadsheetId, createSpreadsheet } from "./transport";
|
|
7
|
+
export { GenjutsuError, SheetsDbError, isGenjutsuError, isSheetsDbError, authError, permissionError, rateLimitError, networkError, validationError, schemaError, migrationError, apiError, } from "./errors";
|
|
8
|
+
export type { GenjutsuErrorKind, ValidationIssue } from "./errors";
|
|
9
|
+
export type { SheetSchema, InferEntity, FormattingRule, HeaderFormat, FieldDefinition, RelationDefinition, Repository, ClientConfig, GenjutsuClient, FindOptions, ReadOptions, WriteOptions, Migration, MigrationContext, } from "./types";
|
|
10
|
+
export { defineModel, field } from "./model";
|
|
11
|
+
export type { FieldDef } from "./model";
|
|
12
|
+
export { generateId, isValidDate, normalizeDate, looksLikeIsoDate, parseAmount, hasIdColumn, findMissingHeaders, } from "./utils";
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,EACf,cAAc,EACd,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,QAAQ,GACT,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGnE,YAAY,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,SAAS,EACT,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAC7C,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAGxC,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* genjutsu-db — public API barrel export.
|
|
3
|
+
* A TypeScript-first Google Sheets database library with zero runtime dependencies.
|
|
4
|
+
*/
|
|
5
|
+
// Client factory
|
|
6
|
+
export { createClient } from "./client";
|
|
7
|
+
// Transport
|
|
8
|
+
export { extractSpreadsheetId, createSpreadsheet } from "./transport";
|
|
9
|
+
// Error types
|
|
10
|
+
export { GenjutsuError, SheetsDbError, isGenjutsuError, isSheetsDbError, authError, permissionError, rateLimitError, networkError, validationError, schemaError, migrationError, apiError, } from "./errors";
|
|
11
|
+
// Model definition
|
|
12
|
+
export { defineModel, field } from "./model";
|
|
13
|
+
// Utilities
|
|
14
|
+
export { generateId, isValidDate, normalizeDate, looksLikeIsoDate, parseAmount, hasIdColumn, findMissingHeaders, } from "./utils";
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iBAAiB;AACjB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,YAAY;AACZ,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEtE,cAAc;AACd,OAAO,EACL,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,EACf,SAAS,EACT,eAAe,EACf,cAAc,EACd,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,QAAQ,GACT,MAAM,UAAU,CAAC;AAqBlB,mBAAmB;AACnB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAG7C,YAAY;AACZ,OAAO,EACL,UAAU,EACV,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration runner for the genjutsu-db library.
|
|
3
|
+
* Versioned up() migrations with tracking in _genjutsu_migrations sheet.
|
|
4
|
+
*/
|
|
5
|
+
import type { TransportContext } from "./transport";
|
|
6
|
+
import type { Migration } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* Run pending migrations, tracking applied ones in _genjutsu_migrations.
|
|
9
|
+
*/
|
|
10
|
+
export declare function runMigrations(ctx: TransportContext, migrations: Migration[]): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAoB,MAAM,SAAS,CAAC;AAY3D;;GAEG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,gBAAgB,EACrB,UAAU,EAAE,SAAS,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CAsEf"}
|