@c9up/eon 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 +69 -0
- package/dist/EonProvider.d.ts +51 -0
- package/dist/EonProvider.d.ts.map +1 -0
- package/dist/EonProvider.js +154 -0
- package/dist/EonProvider.js.map +1 -0
- package/dist/connection/EonConnection.d.ts +116 -0
- package/dist/connection/EonConnection.d.ts.map +1 -0
- package/dist/connection/EonConnection.js +15 -0
- package/dist/connection/EonConnection.js.map +1 -0
- package/dist/connection/config.d.ts +56 -0
- package/dist/connection/config.d.ts.map +1 -0
- package/dist/connection/config.js +14 -0
- package/dist/connection/config.js.map +1 -0
- package/dist/connection/websocket.d.ts +16 -0
- package/dist/connection/websocket.d.ts.map +1 -0
- package/dist/connection/websocket.js +383 -0
- package/dist/connection/websocket.js.map +1 -0
- package/dist/decorators/superTable.d.ts +73 -0
- package/dist/decorators/superTable.d.ts.map +1 -0
- package/dist/decorators/superTable.js +98 -0
- package/dist/decorators/superTable.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/schemaless.d.ts +22 -0
- package/dist/ingest/schemaless.d.ts.map +1 -0
- package/dist/ingest/schemaless.js +161 -0
- package/dist/ingest/schemaless.js.map +1 -0
- package/dist/ingest/sql.d.ts +23 -0
- package/dist/ingest/sql.d.ts.map +1 -0
- package/dist/ingest/sql.js +59 -0
- package/dist/ingest/sql.js.map +1 -0
- package/dist/ingest/stmt.d.ts +82 -0
- package/dist/ingest/stmt.d.ts.map +1 -0
- package/dist/ingest/stmt.js +246 -0
- package/dist/ingest/stmt.js.map +1 -0
- package/dist/metadata-keys.d.ts +17 -0
- package/dist/metadata-keys.d.ts.map +1 -0
- package/dist/metadata-keys.js +17 -0
- package/dist/metadata-keys.js.map +1 -0
- package/dist/query/TimeSeriesQuery.d.ts +121 -0
- package/dist/query/TimeSeriesQuery.d.ts.map +1 -0
- package/dist/query/TimeSeriesQuery.js +291 -0
- package/dist/query/TimeSeriesQuery.js.map +1 -0
- package/dist/query/native.d.ts +22 -0
- package/dist/query/native.d.ts.map +1 -0
- package/dist/query/native.js +135 -0
- package/dist/query/native.js.map +1 -0
- package/dist/repository/SuperTableRepository.d.ts +80 -0
- package/dist/repository/SuperTableRepository.d.ts.map +1 -0
- package/dist/repository/SuperTableRepository.js +232 -0
- package/dist/repository/SuperTableRepository.js.map +1 -0
- package/dist/schema/CreateStableSpec.d.ts +140 -0
- package/dist/schema/CreateStableSpec.d.ts.map +1 -0
- package/dist/schema/CreateStableSpec.js +41 -0
- package/dist/schema/CreateStableSpec.js.map +1 -0
- package/dist/schema/EonMigrationRunner.d.ts +71 -0
- package/dist/schema/EonMigrationRunner.d.ts.map +1 -0
- package/dist/schema/EonMigrationRunner.js +295 -0
- package/dist/schema/EonMigrationRunner.js.map +1 -0
- package/dist/schema/EonSchema.d.ts +128 -0
- package/dist/schema/EonSchema.d.ts.map +1 -0
- package/dist/schema/EonSchema.js +309 -0
- package/dist/schema/EonSchema.js.map +1 -0
- package/dist/schema/Migration.d.ts +47 -0
- package/dist/schema/Migration.d.ts.map +1 -0
- package/dist/schema/Migration.js +55 -0
- package/dist/schema/Migration.js.map +1 -0
- package/dist/schema/compile.d.ts +33 -0
- package/dist/schema/compile.d.ts.map +1 -0
- package/dist/schema/compile.js +70 -0
- package/dist/schema/compile.js.map +1 -0
- package/dist/schema/sync.d.ts +45 -0
- package/dist/schema/sync.d.ts.map +1 -0
- package/dist/schema/sync.js +102 -0
- package/dist/schema/sync.js.map +1 -0
- package/dist/services/connection.d.ts +33 -0
- package/dist/services/connection.d.ts.map +1 -0
- package/dist/services/connection.js +71 -0
- package/dist/services/connection.js.map +1 -0
- package/dist/testing/Factory.d.ts +43 -0
- package/dist/testing/Factory.d.ts.map +1 -0
- package/dist/testing/Factory.js +134 -0
- package/dist/testing/Factory.js.map +1 -0
- package/dist/testing/FakeEonConnection.d.ts +43 -0
- package/dist/testing/FakeEonConnection.d.ts.map +1 -0
- package/dist/testing/FakeEonConnection.js +315 -0
- package/dist/testing/FakeEonConnection.js.map +1 -0
- package/dist/testing/index.d.ts +34 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +67 -0
- package/dist/testing/index.js.map +1 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +65 -0
- package/scripts/copy-napi.mjs +72 -0
- package/src/EonProvider.ts +222 -0
- package/src/connection/EonConnection.ts +146 -0
- package/src/connection/config.ts +60 -0
- package/src/connection/websocket.ts +436 -0
- package/src/decorators/superTable.ts +169 -0
- package/src/index.ts +118 -0
- package/src/ingest/schemaless.ts +211 -0
- package/src/ingest/sql.ts +73 -0
- package/src/ingest/stmt.ts +335 -0
- package/src/metadata-keys.ts +20 -0
- package/src/query/TimeSeriesQuery.ts +480 -0
- package/src/query/native.ts +180 -0
- package/src/repository/SuperTableRepository.ts +347 -0
- package/src/schema/CreateStableSpec.ts +184 -0
- package/src/schema/EonMigrationRunner.ts +378 -0
- package/src/schema/EonSchema.ts +396 -0
- package/src/schema/Migration.ts +66 -0
- package/src/schema/compile.ts +109 -0
- package/src/schema/sync.ts +142 -0
- package/src/services/connection.ts +89 -0
- package/src/testing/Factory.ts +186 -0
- package/src/testing/FakeEonConnection.ts +351 -0
- package/src/testing/index.ts +81 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `EonMigrationRunner` — discovers, executes, and tracks eon (TDengine)
|
|
3
|
+
* migrations. Mirrors atlas `MigrationRunner` (`schema/MigrationRunner.ts`):
|
|
4
|
+
* sorted-file discovery, a `ream_`-prefixed tracking table, batch-based
|
|
5
|
+
* rollback, `init/status/migrate/rollback/reset/refresh/fresh/dryRun`.
|
|
6
|
+
*
|
|
7
|
+
* ── TWO named TDengine deviations from atlas (AC6) ──────────────────────────
|
|
8
|
+
*
|
|
9
|
+
* 1. **No transactions / no engine rollback.** TDengine DDL is non-transactional
|
|
10
|
+
* — a batch CANNOT be applied atomically. The runner executes statements
|
|
11
|
+
* **sequentially**; a mid-migration failure leaves earlier statements
|
|
12
|
+
* applied. The mitigation is idempotent DDL (`IF (NOT) EXISTS`, the
|
|
13
|
+
* `EonSchema` default) so a re-run converges. There is NO `runInTransaction`.
|
|
14
|
+
*
|
|
15
|
+
* 2. **No `UNIQUE`, no auto-increment.** The tracking table is a basic table
|
|
16
|
+
* `ream_eon_migrations(executed_at TIMESTAMP, name VARCHAR(255), batch INT)`;
|
|
17
|
+
* the applied-set is de-duped **by name in JS**, and each record is written
|
|
18
|
+
* with a strictly-increasing `executed_at` so rollback can delete it by that
|
|
19
|
+
* unique timestamp key (TDengine only allows a `DELETE` predicate on the
|
|
20
|
+
* primary timestamp column).
|
|
21
|
+
*
|
|
22
|
+
* Agnostic leaf: takes the connection structurally and a plain directory path —
|
|
23
|
+
* no `@c9up/ream` import, no app helper (`project_package_extraction`).
|
|
24
|
+
*/
|
|
25
|
+
import * as fsp from "node:fs/promises";
|
|
26
|
+
import * as path from "node:path";
|
|
27
|
+
import { pathToFileURL } from "node:url";
|
|
28
|
+
import { compileStatementNative } from "../query/native.js";
|
|
29
|
+
const DEFAULT_DIR = "database/eon-migrations";
|
|
30
|
+
const DEFAULT_TABLE = "ream_eon_migrations";
|
|
31
|
+
const TABLE_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
32
|
+
/** Migration filename (no extension): no path separators, no `..`. */
|
|
33
|
+
const MIGRATION_NAME_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_.-]*$/;
|
|
34
|
+
export class EonMigrationRunner {
|
|
35
|
+
#conn;
|
|
36
|
+
#dir;
|
|
37
|
+
#table;
|
|
38
|
+
constructor(conn, options = {}) {
|
|
39
|
+
this.#conn = conn;
|
|
40
|
+
this.#dir = options.migrationsDir ?? DEFAULT_DIR;
|
|
41
|
+
const table = options.tableName ?? DEFAULT_TABLE;
|
|
42
|
+
if (!TABLE_NAME_PATTERN.test(table)) {
|
|
43
|
+
throw new Error(`[E_EON_MIGRATION_INVALID] invalid tracking-table name '${table}'; must match ${TABLE_NAME_PATTERN}`);
|
|
44
|
+
}
|
|
45
|
+
this.#table = table;
|
|
46
|
+
}
|
|
47
|
+
/** Create the tracking table (`IF NOT EXISTS`) via the basic-table DDL path. */
|
|
48
|
+
async init() {
|
|
49
|
+
const { statements } = compileStatementNative({
|
|
50
|
+
kind: "createTable",
|
|
51
|
+
name: this.#table,
|
|
52
|
+
ifNotExists: true,
|
|
53
|
+
columns: [
|
|
54
|
+
{
|
|
55
|
+
name: "executed_at",
|
|
56
|
+
kind: "timestamp",
|
|
57
|
+
length: null,
|
|
58
|
+
precision: null,
|
|
59
|
+
scale: null,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
name: "name",
|
|
63
|
+
kind: "varchar",
|
|
64
|
+
length: 255,
|
|
65
|
+
precision: null,
|
|
66
|
+
scale: null,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "batch",
|
|
70
|
+
kind: "int",
|
|
71
|
+
length: null,
|
|
72
|
+
precision: null,
|
|
73
|
+
scale: null,
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
}, "tdengine");
|
|
77
|
+
for (const sql of statements)
|
|
78
|
+
await this.#conn.exec(sql);
|
|
79
|
+
}
|
|
80
|
+
/** The status of every discovered migration (applied vs pending). */
|
|
81
|
+
async status() {
|
|
82
|
+
await this.init();
|
|
83
|
+
const applied = await this.#appliedRecords();
|
|
84
|
+
const byName = new Map(applied.map((r) => [r.name, r.batch]));
|
|
85
|
+
const files = await this.#discoverFiles();
|
|
86
|
+
return files.map((name) => {
|
|
87
|
+
const batch = byName.get(name);
|
|
88
|
+
return batch === undefined
|
|
89
|
+
? { name, state: "pending" }
|
|
90
|
+
: { name, state: "applied", batch };
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
/** Run every pending migration (filename order), recording each. */
|
|
94
|
+
async migrate() {
|
|
95
|
+
await this.init();
|
|
96
|
+
const applied = await this.#appliedRecords();
|
|
97
|
+
const appliedNames = new Set(applied.map((r) => r.name));
|
|
98
|
+
const files = await this.#discoverFiles();
|
|
99
|
+
const pending = files.filter((f) => !appliedNames.has(f));
|
|
100
|
+
if (pending.length === 0)
|
|
101
|
+
return [];
|
|
102
|
+
const batch = this.#maxBatch(applied) + 1;
|
|
103
|
+
// Strictly-increasing executed_at (unique key for rollback deletes) — never
|
|
104
|
+
// below any existing record, never colliding within this run.
|
|
105
|
+
let clock = Math.max(Date.now(), this.#maxExecutedAt(applied) + 1);
|
|
106
|
+
const executed = [];
|
|
107
|
+
for (const name of pending) {
|
|
108
|
+
const migration = await this.#loadMigration(name);
|
|
109
|
+
for (const sql of await migration.getUpSQL()) {
|
|
110
|
+
await this.#conn.exec(sql);
|
|
111
|
+
}
|
|
112
|
+
await this.#writeRecord(name, batch, clock);
|
|
113
|
+
clock += 1;
|
|
114
|
+
executed.push(name);
|
|
115
|
+
}
|
|
116
|
+
return executed;
|
|
117
|
+
}
|
|
118
|
+
/** Roll back the most-recent batch (files in reverse order), running `down()`. */
|
|
119
|
+
async rollback() {
|
|
120
|
+
await this.init();
|
|
121
|
+
const applied = await this.#appliedRecords();
|
|
122
|
+
if (applied.length === 0)
|
|
123
|
+
return [];
|
|
124
|
+
const batch = this.#maxBatch(applied);
|
|
125
|
+
const inBatch = new Map(applied.filter((r) => r.batch === batch).map((r) => [r.name, r]));
|
|
126
|
+
const files = await this.#discoverFiles();
|
|
127
|
+
// Reverse of application order = reverse of filename order within the batch.
|
|
128
|
+
const ordered = files.filter((f) => inBatch.has(f)).reverse();
|
|
129
|
+
const rolled = [];
|
|
130
|
+
for (const name of ordered) {
|
|
131
|
+
const record = inBatch.get(name);
|
|
132
|
+
if (record === undefined)
|
|
133
|
+
continue;
|
|
134
|
+
const migration = await this.#loadMigration(name);
|
|
135
|
+
for (const sql of await migration.getDownSQL()) {
|
|
136
|
+
await this.#conn.exec(sql);
|
|
137
|
+
}
|
|
138
|
+
await this.#deleteRecord(record.executed_at);
|
|
139
|
+
rolled.push(name);
|
|
140
|
+
}
|
|
141
|
+
return rolled;
|
|
142
|
+
}
|
|
143
|
+
/** Roll back every applied batch (Lucid `migrate:reset`). */
|
|
144
|
+
async reset() {
|
|
145
|
+
await this.init();
|
|
146
|
+
const all = [];
|
|
147
|
+
// Guard against a stuck loop: each rollback must shrink the applied set.
|
|
148
|
+
for (;;) {
|
|
149
|
+
const rolled = await this.rollback();
|
|
150
|
+
if (rolled.length === 0)
|
|
151
|
+
break;
|
|
152
|
+
all.push(...rolled);
|
|
153
|
+
}
|
|
154
|
+
return all;
|
|
155
|
+
}
|
|
156
|
+
/** Reset then re-run every migration (Lucid `migrate:refresh`). */
|
|
157
|
+
async refresh() {
|
|
158
|
+
const rolled = await this.reset();
|
|
159
|
+
const executed = await this.migrate();
|
|
160
|
+
return { rolled, executed };
|
|
161
|
+
}
|
|
162
|
+
/** Alias of {@link refresh} (Lucid `migrate:fresh`). */
|
|
163
|
+
fresh() {
|
|
164
|
+
return this.refresh();
|
|
165
|
+
}
|
|
166
|
+
/** Compute the SQL each pending migration would emit, WITHOUT executing it. */
|
|
167
|
+
async dryRun() {
|
|
168
|
+
await this.init();
|
|
169
|
+
const applied = await this.#appliedRecords();
|
|
170
|
+
const appliedNames = new Set(applied.map((r) => r.name));
|
|
171
|
+
const pending = (await this.#discoverFiles()).filter((f) => !appliedNames.has(f));
|
|
172
|
+
const result = [];
|
|
173
|
+
for (const name of pending) {
|
|
174
|
+
const migration = await this.#loadMigration(name);
|
|
175
|
+
result.push({ name, sql: await migration.getUpSQL() });
|
|
176
|
+
}
|
|
177
|
+
return result;
|
|
178
|
+
}
|
|
179
|
+
/** Read every tracking record (name, batch, executed_at). */
|
|
180
|
+
async #appliedRecords() {
|
|
181
|
+
const { statements } = compileStatementNative({
|
|
182
|
+
kind: "select",
|
|
183
|
+
table: this.#table,
|
|
184
|
+
select: ["name", "batch", "executed_at"],
|
|
185
|
+
}, "tdengine");
|
|
186
|
+
const sql = statements[0];
|
|
187
|
+
if (sql === undefined)
|
|
188
|
+
return [];
|
|
189
|
+
const rows = await this.#conn.query(sql);
|
|
190
|
+
return rows.map((r) => ({
|
|
191
|
+
name: String(r.name),
|
|
192
|
+
batch: Number(r.batch),
|
|
193
|
+
executed_at: Number(r.executed_at),
|
|
194
|
+
}));
|
|
195
|
+
}
|
|
196
|
+
#maxBatch(records) {
|
|
197
|
+
return records.reduce((max, r) => Math.max(max, r.batch), 0);
|
|
198
|
+
}
|
|
199
|
+
#maxExecutedAt(records) {
|
|
200
|
+
return records.reduce((max, r) => Math.max(max, r.executed_at), 0);
|
|
201
|
+
}
|
|
202
|
+
/** Insert a tracking record via the literal INSERT compiler (never TS interpolation). */
|
|
203
|
+
async #writeRecord(name, batch, executedAt) {
|
|
204
|
+
const { statements } = compileStatementNative({
|
|
205
|
+
kind: "insert",
|
|
206
|
+
table: this.#table,
|
|
207
|
+
columns: ["executed_at", "name", "batch"],
|
|
208
|
+
rows: [[executedAt, name, batch]],
|
|
209
|
+
literal: true,
|
|
210
|
+
}, "tdengine");
|
|
211
|
+
for (const sql of statements)
|
|
212
|
+
await this.#conn.exec(sql);
|
|
213
|
+
}
|
|
214
|
+
/** Delete a tracking record by its unique `executed_at` key (compiled in Rust). */
|
|
215
|
+
async #deleteRecord(executedAt) {
|
|
216
|
+
const { statements } = compileStatementNative({
|
|
217
|
+
kind: "delete",
|
|
218
|
+
table: this.#table,
|
|
219
|
+
column: "executed_at",
|
|
220
|
+
value: executedAt,
|
|
221
|
+
}, "tdengine");
|
|
222
|
+
for (const sql of statements)
|
|
223
|
+
await this.#conn.exec(sql);
|
|
224
|
+
}
|
|
225
|
+
/** Discover migration files (`.ts`/`.js`), sorted, extension stripped. */
|
|
226
|
+
async #discoverFiles() {
|
|
227
|
+
try {
|
|
228
|
+
const entries = await fsp.readdir(this.#dir);
|
|
229
|
+
return entries
|
|
230
|
+
.filter((f) => f.endsWith(".ts") || f.endsWith(".js"))
|
|
231
|
+
.sort()
|
|
232
|
+
.map((f) => f.replace(/\.(ts|js)$/, ""));
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
// A missing migrations directory → no migrations. Anything else propagates.
|
|
236
|
+
if (typeof err === "object" &&
|
|
237
|
+
err !== null &&
|
|
238
|
+
Reflect.get(err, "code") === "ENOENT") {
|
|
239
|
+
return [];
|
|
240
|
+
}
|
|
241
|
+
throw err;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/** Load + instantiate a migration's default-export class. */
|
|
245
|
+
async #loadMigration(name) {
|
|
246
|
+
if (!MIGRATION_NAME_PATTERN.test(name) || name.includes("..")) {
|
|
247
|
+
throw new Error(`[E_EON_MIGRATION_INVALID] unsafe migration name '${name}'`);
|
|
248
|
+
}
|
|
249
|
+
const tsPath = path.join(this.#dir, `${name}.ts`);
|
|
250
|
+
const jsPath = path.join(this.#dir, `${name}.js`);
|
|
251
|
+
const tsExists = await pathExists(tsPath);
|
|
252
|
+
// Fail loud with the runner's own error (atlas parity) instead of letting
|
|
253
|
+
// `import` throw a raw ERR_MODULE_NOT_FOUND on a missing/renamed file.
|
|
254
|
+
if (!tsExists && !(await pathExists(jsPath))) {
|
|
255
|
+
throw new Error(`[E_EON_MIGRATION_INVALID] migration '${name}' not found (no .ts or .js file in ${this.#dir})`);
|
|
256
|
+
}
|
|
257
|
+
const filePath = tsExists ? tsPath : jsPath;
|
|
258
|
+
// ESM dynamic import needs a file:// URL (Windows rejects a bare path).
|
|
259
|
+
const mod = await import(pathToFileURL(path.resolve(filePath)).href);
|
|
260
|
+
const MigrationClass = mod.default;
|
|
261
|
+
if (!isConstructor(MigrationClass)) {
|
|
262
|
+
throw new Error(`[E_EON_MIGRATION_INVALID] migration '${name}' must export a default class`);
|
|
263
|
+
}
|
|
264
|
+
const instance = new MigrationClass();
|
|
265
|
+
if (!isMigration(instance)) {
|
|
266
|
+
throw new Error(`[E_EON_MIGRATION_INVALID] migration '${name}' default export is not a Migration (missing up/down)`);
|
|
267
|
+
}
|
|
268
|
+
return instance;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function isConstructor(value) {
|
|
272
|
+
return typeof value === "function";
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Structural Migration guard — avoids importing the class value for an
|
|
276
|
+
* `instanceof`. Reads through the prototype chain (methods live on the
|
|
277
|
+
* prototype, not as own enumerable props) via `Reflect.get`.
|
|
278
|
+
*/
|
|
279
|
+
function isMigration(value) {
|
|
280
|
+
if (typeof value !== "object" || value === null)
|
|
281
|
+
return false;
|
|
282
|
+
const up = Reflect.get(value, "getUpSQL");
|
|
283
|
+
const down = Reflect.get(value, "getDownSQL");
|
|
284
|
+
return typeof up === "function" && typeof down === "function";
|
|
285
|
+
}
|
|
286
|
+
async function pathExists(p) {
|
|
287
|
+
try {
|
|
288
|
+
await fsp.access(p);
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=EonMigrationRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EonMigrationRunner.js","sourceRoot":"","sources":["../../src/schema/EonMigrationRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `EonSchema` — the fluent DDL surface a migration's `up()`/`down()` drives.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors atlas `Schema` (`schema/Schema.ts`) in shape: each method compiles its
|
|
5
|
+
* spec through the Rust `compileStatementNative` seam and appends the resulting
|
|
6
|
+
* SQL to an internal buffer the runner flushes. The TS side NEVER string-builds
|
|
7
|
+
* SQL — every identifier, literal, and option value is quoted/validated in Rust
|
|
8
|
+
* (the injection seam stays in one place, memory `feedback_security_first`).
|
|
9
|
+
*
|
|
10
|
+
* The `StableBuilder` is intentionally THINNER than atlas `TableBuilder`:
|
|
11
|
+
* TDengine columns have no `DEFAULT`, no per-column `PRIMARY KEY` choice (the
|
|
12
|
+
* first `TIMESTAMP` is always the key), no `UNIQUE`, no foreign keys, no SQL
|
|
13
|
+
* secondary indexes — so `defaultTo`/`primary`/`unique`/`references`/`increments`
|
|
14
|
+
* have NO analogue and are deliberately absent (D — the reconciliation note).
|
|
15
|
+
*/
|
|
16
|
+
import type { AlterChange, EonAlterDatabaseOptions, EonColumnSpec, EonDatabaseOptions } from "./CreateStableSpec.js";
|
|
17
|
+
/** The type portion of an `EonColumnSpec` (everything but the name). */
|
|
18
|
+
type EonType = Omit<EonColumnSpec, "name">;
|
|
19
|
+
/**
|
|
20
|
+
* The thin column/tag surface shared by every builder: only column-type methods
|
|
21
|
+
* (+ length/precision/scale). No `defaultTo`/`primary`/`unique` — TDengine has
|
|
22
|
+
* no analogue. Each method appends a column via `#add` and returns whatever that
|
|
23
|
+
* hook returns (a tag-handle for stables, `void` for basic tables).
|
|
24
|
+
*/
|
|
25
|
+
declare abstract class ColumnMethods<R> {
|
|
26
|
+
protected abstract add(spec: EonColumnSpec): R;
|
|
27
|
+
timestamp(name: string): R;
|
|
28
|
+
int(name: string): R;
|
|
29
|
+
bigInteger(name: string): R;
|
|
30
|
+
float(name: string): R;
|
|
31
|
+
double(name: string): R;
|
|
32
|
+
bool(name: string): R;
|
|
33
|
+
varchar(name: string, length: number): R;
|
|
34
|
+
nchar(name: string, length: number): R;
|
|
35
|
+
binary(name: string, length: number): R;
|
|
36
|
+
decimal(name: string, precision: number, scale?: number): R;
|
|
37
|
+
json(name: string): R;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The no-name type surface for an `ALTER STABLE` add/modify change: the column
|
|
41
|
+
* name is already fixed (by `addColumn(name)` etc.), so these methods take ONLY
|
|
42
|
+
* the type arguments and finalize the change.
|
|
43
|
+
*/
|
|
44
|
+
declare abstract class TypeMethods<R> {
|
|
45
|
+
protected abstract emit(type: EonType): R;
|
|
46
|
+
timestamp(): R;
|
|
47
|
+
int(): R;
|
|
48
|
+
bigInteger(): R;
|
|
49
|
+
float(): R;
|
|
50
|
+
double(): R;
|
|
51
|
+
bool(): R;
|
|
52
|
+
varchar(length: number): R;
|
|
53
|
+
nchar(length: number): R;
|
|
54
|
+
binary(length: number): R;
|
|
55
|
+
decimal(precision: number, scale?: number): R;
|
|
56
|
+
json(): R;
|
|
57
|
+
}
|
|
58
|
+
/** A handle returned by a `StableBuilder` column method — `.tag()` re-homes it as a tag. */
|
|
59
|
+
export interface StableColumnHandle {
|
|
60
|
+
/** Mark the just-declared column as a `TAG` instead of a metric column. */
|
|
61
|
+
tag(): void;
|
|
62
|
+
}
|
|
63
|
+
/** Fluent builder for `CREATE STABLE` columns + tags (ts-first is enforced in Rust). */
|
|
64
|
+
export declare class StableBuilder extends ColumnMethods<StableColumnHandle> {
|
|
65
|
+
#private;
|
|
66
|
+
protected add(spec: EonColumnSpec): StableColumnHandle;
|
|
67
|
+
/** @internal */
|
|
68
|
+
columns(): EonColumnSpec[];
|
|
69
|
+
/** @internal */
|
|
70
|
+
tags(): EonColumnSpec[];
|
|
71
|
+
}
|
|
72
|
+
/** Fluent builder for a basic (non-super) table — same columns, no tags. */
|
|
73
|
+
export declare class BasicTableBuilder extends ColumnMethods<void> {
|
|
74
|
+
#private;
|
|
75
|
+
protected add(spec: EonColumnSpec): void;
|
|
76
|
+
/** @internal */
|
|
77
|
+
columns(): EonColumnSpec[];
|
|
78
|
+
}
|
|
79
|
+
/** Sets the type on a pending `ALTER STABLE` add/modify change, then records it. */
|
|
80
|
+
export interface AlterTypeSetter extends TypeMethods<void> {
|
|
81
|
+
}
|
|
82
|
+
/** Fluent builder for `ALTER STABLE` — one method per TDengine change op. */
|
|
83
|
+
export declare class AlterStableBuilder {
|
|
84
|
+
#private;
|
|
85
|
+
addColumn(name: string): AlterTypeSetter;
|
|
86
|
+
modifyColumn(name: string): AlterTypeSetter;
|
|
87
|
+
dropColumn(name: string): this;
|
|
88
|
+
addTag(name: string): AlterTypeSetter;
|
|
89
|
+
modifyTag(name: string): AlterTypeSetter;
|
|
90
|
+
dropTag(name: string): this;
|
|
91
|
+
renameTag(from: string, to: string): this;
|
|
92
|
+
/** @internal */
|
|
93
|
+
changes(): AlterChange[];
|
|
94
|
+
}
|
|
95
|
+
export declare class EonSchema {
|
|
96
|
+
#private;
|
|
97
|
+
/**
|
|
98
|
+
* `CREATE STABLE`. Defaults to `IF NOT EXISTS` (idempotent DDL — the mitigation
|
|
99
|
+
* for TDengine's non-transactional migrations, AC6). Pass `keep` for retention.
|
|
100
|
+
*/
|
|
101
|
+
createStable(name: string, callback: (table: StableBuilder) => void, options?: {
|
|
102
|
+
ifNotExists?: boolean;
|
|
103
|
+
keep?: string;
|
|
104
|
+
}): this;
|
|
105
|
+
/** `ALTER STABLE` → one statement per change. */
|
|
106
|
+
alterStable(name: string, callback: (table: AlterStableBuilder) => void): this;
|
|
107
|
+
/** `DROP STABLE IF EXISTS`. */
|
|
108
|
+
dropStable(name: string): this;
|
|
109
|
+
/** `CREATE DATABASE IF NOT EXISTS` with optional retention/storage options. */
|
|
110
|
+
createDatabase(name: string, options?: EonDatabaseOptions): this;
|
|
111
|
+
/**
|
|
112
|
+
* `ALTER DATABASE` — exactly ONE option per call (TDengine restriction).
|
|
113
|
+
* Throws if zero or more than one option key is provided.
|
|
114
|
+
*/
|
|
115
|
+
alterDatabase(name: string, options: EonAlterDatabaseOptions): this;
|
|
116
|
+
/** `CREATE TABLE IF NOT EXISTS` — a basic (non-super) table, no tags. */
|
|
117
|
+
createTable(name: string, callback: (table: BasicTableBuilder) => void): this;
|
|
118
|
+
/** `DROP TABLE IF EXISTS`. */
|
|
119
|
+
dropTable(name: string): this;
|
|
120
|
+
/** Queue a raw SQL statement verbatim (an escape hatch for options not modelled above). */
|
|
121
|
+
raw(sql: string): this;
|
|
122
|
+
/** Clear the buffer (called before each `up()`/`down()` run). */
|
|
123
|
+
reset(): void;
|
|
124
|
+
/** The compiled SQL statements queued so far. */
|
|
125
|
+
toSQL(): string[];
|
|
126
|
+
}
|
|
127
|
+
export {};
|
|
128
|
+
//# sourceMappingURL=EonSchema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EonSchema.d.ts","sourceRoot":"","sources":["../../src/schema/EonSchema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EACX,WAAW,EAKX,uBAAuB,EACvB,aAAa,EACb,kBAAkB,EAClB,MAAM,uBAAuB,CAAC;AAa/B,wEAAwE;AACxE,KAAK,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;AAY3C;;;;;GAKG;AACH,uBAAe,aAAa,CAAC,CAAC;IAC7B,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,CAAC;IAE9C,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IAG1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IAGpB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IAG3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IAGtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IAGvB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;IAGrB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC;IAGxC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC;IAGtC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC;IAGvC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC;IAK3D,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC;CAGrB;AAED;;;;GAIG;AACH,uBAAe,WAAW,CAAC,CAAC;IAC3B,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC;IAEzC,SAAS,IAAI,CAAC;IAGd,GAAG,IAAI,CAAC;IAGR,UAAU,IAAI,CAAC;IAGf,KAAK,IAAI,CAAC;IAGV,MAAM,IAAI,CAAC;IAGX,IAAI,IAAI,CAAC;IAGT,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;IAG1B,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;IAGxB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC;IAGzB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC;IAG7C,IAAI,IAAI,CAAC;CAGT;AAED,4FAA4F;AAC5F,MAAM,WAAW,kBAAkB;IAClC,2EAA2E;IAC3E,GAAG,IAAI,IAAI,CAAC;CACZ;AAED,wFAAwF;AACxF,qBAAa,aAAc,SAAQ,aAAa,CAAC,kBAAkB,CAAC;;IAInE,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,kBAAkB;IAetD,gBAAgB;IAChB,OAAO,IAAI,aAAa,EAAE;IAG1B,gBAAgB;IAChB,IAAI,IAAI,aAAa,EAAE;CAGvB;AAED,4EAA4E;AAC5E,qBAAa,iBAAkB,SAAQ,aAAa,CAAC,IAAI,CAAC;;IAGzD,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIxC,gBAAgB;IAChB,OAAO,IAAI,aAAa,EAAE;CAG1B;AAED,oFAAoF;AACpF,MAAM,WAAW,eAAgB,SAAQ,WAAW,CAAC,IAAI,CAAC;CAAG;AAY7D,6EAA6E;AAC7E,qBAAa,kBAAkB;;IAG9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAKxC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAK3C,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAKrC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe;IAKxC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI3B,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAKzC,gBAAgB;IAChB,OAAO,IAAI,WAAW,EAAE;CAGxB;AAYD,qBAAa,SAAS;;IAQrB;;;OAGG;IACH,YAAY,CACX,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,EACxC,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO,GACpD,IAAI;IAeP,iDAAiD;IACjD,WAAW,CACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAC3C,IAAI;IAYP,+BAA+B;IAC/B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK9B,+EAA+E;IAC/E,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI;IAUpE;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAgCnE,yEAAyE;IACzE,WAAW,CACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,GAC1C,IAAI;IAaP,8BAA8B;IAC9B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK7B,2FAA2F;IAC3F,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAKtB,iEAAiE;IACjE,KAAK,IAAI,IAAI;IAIb,iDAAiD;IACjD,KAAK,IAAI,MAAM,EAAE;CAGjB"}
|