@xixixao/convex-migrations 0.3.1-alpha.1
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 +201 -0
- package/README.md +523 -0
- package/dist/client/index.d.ts +390 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +528 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/log.d.ts +8 -0
- package/dist/client/log.d.ts.map +1 -0
- package/dist/client/log.js +74 -0
- package/dist/client/log.js.map +1 -0
- package/dist/component/_generated/api.d.ts +34 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/dist/component/_generated/api.js +31 -0
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +95 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/dist/component/_generated/server.d.ts +121 -0
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/component/_generated/server.js +78 -0
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/convex.config.d.ts +3 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js +3 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/lib.d.ts +74 -0
- package/dist/component/lib.d.ts.map +1 -0
- package/dist/component/lib.js +290 -0
- package/dist/component/lib.js.map +1 -0
- package/dist/component/schema.d.ts +28 -0
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js +20 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/shared.d.ts +40 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +22 -0
- package/dist/shared.js.map +1 -0
- package/package.json +95 -0
- package/src/client/index.test.ts +16 -0
- package/src/client/index.ts +765 -0
- package/src/client/log.ts +76 -0
- package/src/component/_generated/api.ts +50 -0
- package/src/component/_generated/component.ts +116 -0
- package/src/component/_generated/dataModel.ts +60 -0
- package/src/component/_generated/server.ts +161 -0
- package/src/component/convex.config.ts +3 -0
- package/src/component/lib.test.ts +110 -0
- package/src/component/lib.ts +356 -0
- package/src/component/schema.ts +20 -0
- package/src/component/setup.test.ts +5 -0
- package/src/shared.ts +37 -0
- package/src/test.ts +18 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { ConvexError, v } from "convex/values";
|
|
2
|
+
import { migrationStatus, } from "../shared.js";
|
|
3
|
+
import { api } from "./_generated/api.js";
|
|
4
|
+
import { mutation, query, } from "./_generated/server.js";
|
|
5
|
+
const runMigrationArgs = {
|
|
6
|
+
name: v.string(),
|
|
7
|
+
fnHandle: v.string(),
|
|
8
|
+
cursor: v.optional(v.union(v.string(), v.null())),
|
|
9
|
+
batchSize: v.optional(v.number()),
|
|
10
|
+
oneBatchOnly: v.optional(v.boolean()),
|
|
11
|
+
next: v.optional(v.array(v.object({
|
|
12
|
+
name: v.string(),
|
|
13
|
+
fnHandle: v.string(),
|
|
14
|
+
}))),
|
|
15
|
+
dryRun: v.boolean(),
|
|
16
|
+
args: v.optional(v.any()),
|
|
17
|
+
};
|
|
18
|
+
export const migrate = mutation({
|
|
19
|
+
args: runMigrationArgs,
|
|
20
|
+
returns: migrationStatus,
|
|
21
|
+
handler: async (ctx, args) => {
|
|
22
|
+
// Step 1: Get or create the state.
|
|
23
|
+
const { fnHandle, batchSize, next: next_, dryRun, name } = args;
|
|
24
|
+
if (batchSize !== undefined && batchSize <= 0) {
|
|
25
|
+
throw new Error("Batch size must be greater than 0");
|
|
26
|
+
}
|
|
27
|
+
if (!fnHandle.startsWith("function://")) {
|
|
28
|
+
throw new Error("Invalid fnHandle.\n" +
|
|
29
|
+
"Do not call this from the CLI or dashboard directly.\n" +
|
|
30
|
+
"Instead use the `migrations.runner` function to run migrations." +
|
|
31
|
+
"See https://www.convex.dev/components/migrations");
|
|
32
|
+
}
|
|
33
|
+
const state = (await ctx.db
|
|
34
|
+
.query("migrations")
|
|
35
|
+
.withIndex("name", (q) => q.eq("name", name))
|
|
36
|
+
.unique()) ??
|
|
37
|
+
(await ctx.db.get(await ctx.db.insert("migrations", {
|
|
38
|
+
name,
|
|
39
|
+
cursor: args.cursor ?? null,
|
|
40
|
+
isDone: false,
|
|
41
|
+
processed: 0,
|
|
42
|
+
latestStart: Date.now(),
|
|
43
|
+
args: args.args,
|
|
44
|
+
})));
|
|
45
|
+
// Update the state if the cursor arg differs.
|
|
46
|
+
if (state.cursor !== args.cursor) {
|
|
47
|
+
// This happens if:
|
|
48
|
+
// 1. The migration is being started/resumed (args.cursor unset).
|
|
49
|
+
// 2. The migration is being resumed at a different cursor.
|
|
50
|
+
// 3. There are two instances of the same migration racing.
|
|
51
|
+
const worker = state.workerId && (await ctx.db.system.get(state.workerId));
|
|
52
|
+
if (worker &&
|
|
53
|
+
(worker.state.kind === "pending" || worker.state.kind === "inProgress")) {
|
|
54
|
+
// Case 3. The migration is already in progress.
|
|
55
|
+
console.debug({ state, worker });
|
|
56
|
+
return getMigrationState(ctx, state);
|
|
57
|
+
}
|
|
58
|
+
// Case 2. Update the cursor.
|
|
59
|
+
if (args.cursor !== undefined) {
|
|
60
|
+
state.cursor = args.cursor;
|
|
61
|
+
state.isDone = false;
|
|
62
|
+
state.latestStart = Date.now();
|
|
63
|
+
state.latestEnd = undefined;
|
|
64
|
+
state.processed = 0;
|
|
65
|
+
}
|
|
66
|
+
// For Case 1, Step 2 will take the right action.
|
|
67
|
+
}
|
|
68
|
+
function updateState(result) {
|
|
69
|
+
state.cursor = result.continueCursor;
|
|
70
|
+
state.isDone = result.isDone;
|
|
71
|
+
state.processed += result.processed;
|
|
72
|
+
if (result.isDone && state.latestEnd === undefined) {
|
|
73
|
+
state.latestEnd = Date.now();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
// Step 2: Run the migration.
|
|
78
|
+
if (!state.isDone) {
|
|
79
|
+
const result = await ctx.runMutation(fnHandle, {
|
|
80
|
+
cursor: state.cursor,
|
|
81
|
+
batchSize,
|
|
82
|
+
dryRun,
|
|
83
|
+
args: args.args,
|
|
84
|
+
});
|
|
85
|
+
updateState(result);
|
|
86
|
+
state.error = undefined;
|
|
87
|
+
}
|
|
88
|
+
// Step 3: Schedule the next batch or next migration.
|
|
89
|
+
if (args.oneBatchOnly) {
|
|
90
|
+
state.workerId = undefined;
|
|
91
|
+
}
|
|
92
|
+
else if (!state.isDone) {
|
|
93
|
+
// Recursively schedule the next batch.
|
|
94
|
+
state.workerId = await ctx.scheduler.runAfter(0, api.lib.migrate, {
|
|
95
|
+
...args,
|
|
96
|
+
cursor: state.cursor,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
state.workerId = undefined;
|
|
101
|
+
// Schedule the next migration in the series.
|
|
102
|
+
const next = next_ ?? [];
|
|
103
|
+
// Find the next migration that hasn't been done.
|
|
104
|
+
let i = 0;
|
|
105
|
+
for (; i < next.length; i++) {
|
|
106
|
+
const doc = await ctx.db
|
|
107
|
+
.query("migrations")
|
|
108
|
+
.withIndex("name", (q) => q.eq("name", next[i].name))
|
|
109
|
+
.unique();
|
|
110
|
+
if (!doc || !doc.isDone) {
|
|
111
|
+
const [nextFn, ...rest] = next.slice(i);
|
|
112
|
+
if (nextFn) {
|
|
113
|
+
await ctx.scheduler.runAfter(0, api.lib.migrate, {
|
|
114
|
+
name: nextFn.name,
|
|
115
|
+
fnHandle: nextFn.fnHandle,
|
|
116
|
+
next: rest,
|
|
117
|
+
batchSize,
|
|
118
|
+
dryRun,
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (args.cursor === undefined) {
|
|
125
|
+
if (next.length && i === next.length) {
|
|
126
|
+
console.info(`Migration${i > 0 ? "s" : ""} up next already done.`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.info(`Migration ${name} is done.` +
|
|
131
|
+
(i < next.length ? ` Next: ${next[i].name}` : ""));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
state.workerId = undefined;
|
|
137
|
+
if (dryRun && e instanceof ConvexError && e.data.kind === "DRY RUN") {
|
|
138
|
+
// Add the state to the error to bubble up.
|
|
139
|
+
updateState(e.data.result);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
state.error = e instanceof Error ? e.message : String(e);
|
|
143
|
+
console.error(`Migration ${name} failed: ${state.error}`);
|
|
144
|
+
}
|
|
145
|
+
if (dryRun) {
|
|
146
|
+
const status = await getMigrationState(ctx, state);
|
|
147
|
+
status.batchSize = batchSize;
|
|
148
|
+
status.next = next_?.map((n) => n.name);
|
|
149
|
+
throw new ConvexError({
|
|
150
|
+
kind: "DRY RUN",
|
|
151
|
+
status,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Step 4: Update the state
|
|
156
|
+
await ctx.db.patch(state._id, state);
|
|
157
|
+
if (args.dryRun) {
|
|
158
|
+
// By throwing an error, the transaction will be rolled back and nothing
|
|
159
|
+
// will be scheduled.
|
|
160
|
+
console.debug({ args, state });
|
|
161
|
+
throw new Error("Error: Dry run attempted to update state - rolling back transaction.");
|
|
162
|
+
}
|
|
163
|
+
return getMigrationState(ctx, state);
|
|
164
|
+
},
|
|
165
|
+
});
|
|
166
|
+
export const getStatus = query({
|
|
167
|
+
args: {
|
|
168
|
+
names: v.optional(v.array(v.string())),
|
|
169
|
+
limit: v.optional(v.number()),
|
|
170
|
+
},
|
|
171
|
+
returns: v.array(migrationStatus),
|
|
172
|
+
handler: async (ctx, args) => {
|
|
173
|
+
const docs = args.names
|
|
174
|
+
? await Promise.all(args.names.map(async (m) => (await ctx.db
|
|
175
|
+
.query("migrations")
|
|
176
|
+
.withIndex("name", (q) => q.eq("name", m))
|
|
177
|
+
.unique()) ?? {
|
|
178
|
+
name: m,
|
|
179
|
+
processed: 0,
|
|
180
|
+
cursor: null,
|
|
181
|
+
latestStart: 0,
|
|
182
|
+
workerId: undefined,
|
|
183
|
+
isDone: false,
|
|
184
|
+
}))
|
|
185
|
+
: await ctx.db
|
|
186
|
+
.query("migrations")
|
|
187
|
+
.order("desc")
|
|
188
|
+
.take(args.limit ?? 10);
|
|
189
|
+
return Promise.all(docs
|
|
190
|
+
.reverse()
|
|
191
|
+
.map(async (migration) => getMigrationState(ctx, migration)));
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
async function getMigrationState(ctx, migration) {
|
|
195
|
+
const worker = migration.workerId && (await ctx.db.system.get(migration.workerId));
|
|
196
|
+
const args = worker?.args[0];
|
|
197
|
+
const state = migration.isDone
|
|
198
|
+
? "success"
|
|
199
|
+
: migration.error || worker?.state.kind === "failed"
|
|
200
|
+
? "failed"
|
|
201
|
+
: worker?.state.kind === "canceled"
|
|
202
|
+
? "canceled"
|
|
203
|
+
: worker?.state.kind === "inProgress" ||
|
|
204
|
+
worker?.state.kind === "pending"
|
|
205
|
+
? "inProgress"
|
|
206
|
+
: "unknown";
|
|
207
|
+
return {
|
|
208
|
+
name: migration.name,
|
|
209
|
+
cursor: migration.cursor,
|
|
210
|
+
processed: migration.processed,
|
|
211
|
+
isDone: migration.isDone,
|
|
212
|
+
latestStart: migration.latestStart,
|
|
213
|
+
latestEnd: migration.latestEnd,
|
|
214
|
+
error: migration.error,
|
|
215
|
+
state,
|
|
216
|
+
batchSize: args?.batchSize,
|
|
217
|
+
next: args?.next?.map((n) => n.name),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
export const cancel = mutation({
|
|
221
|
+
args: { name: v.string() },
|
|
222
|
+
returns: migrationStatus,
|
|
223
|
+
handler: async (ctx, args) => {
|
|
224
|
+
const migration = await ctx.db
|
|
225
|
+
.query("migrations")
|
|
226
|
+
.withIndex("name", (q) => q.eq("name", args.name))
|
|
227
|
+
.unique();
|
|
228
|
+
if (!migration) {
|
|
229
|
+
throw new Error(`Migration ${args.name} not found`);
|
|
230
|
+
}
|
|
231
|
+
const state = await cancelMigration(ctx, migration);
|
|
232
|
+
if (state.state !== "canceled") {
|
|
233
|
+
console.log(`Did not cancel migration ${migration.name}. Status was ${state.state}`);
|
|
234
|
+
}
|
|
235
|
+
return state;
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
async function cancelMigration(ctx, migration) {
|
|
239
|
+
const state = await getMigrationState(ctx, migration);
|
|
240
|
+
if (state.isDone) {
|
|
241
|
+
return state;
|
|
242
|
+
}
|
|
243
|
+
if (state.state === "inProgress") {
|
|
244
|
+
if (!migration.workerId) {
|
|
245
|
+
await ctx.scheduler.cancel(migration.workerId);
|
|
246
|
+
}
|
|
247
|
+
console.log(`Canceled migration ${migration.name}`);
|
|
248
|
+
return { ...state, state: "canceled" };
|
|
249
|
+
}
|
|
250
|
+
return state;
|
|
251
|
+
}
|
|
252
|
+
export const cancelAll = mutation({
|
|
253
|
+
// Paginating with creation time for now
|
|
254
|
+
args: { sinceTs: v.optional(v.number()) },
|
|
255
|
+
returns: v.array(migrationStatus),
|
|
256
|
+
handler: async (ctx, args) => {
|
|
257
|
+
const results = await ctx.db
|
|
258
|
+
.query("migrations")
|
|
259
|
+
.withIndex("isDone", (q) => args.sinceTs
|
|
260
|
+
? q.eq("isDone", false).gte("_creationTime", args.sinceTs)
|
|
261
|
+
: q.eq("isDone", false))
|
|
262
|
+
.take(100);
|
|
263
|
+
if (results.length === 100) {
|
|
264
|
+
await ctx.scheduler.runAfter(0, api.lib.cancelAll, {
|
|
265
|
+
sinceTs: results[results.length - 1]._creationTime,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return Promise.all(results.map((m) => cancelMigration(ctx, m)));
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
export const clearAll = mutation({
|
|
272
|
+
args: { before: v.optional(v.number()) },
|
|
273
|
+
returns: v.null(),
|
|
274
|
+
handler: async (ctx, args) => {
|
|
275
|
+
const results = await ctx.db
|
|
276
|
+
.query("migrations")
|
|
277
|
+
.withIndex("by_creation_time", (q) => q.lte("_creationTime", args.before ?? Date.now()))
|
|
278
|
+
.order("desc")
|
|
279
|
+
.take(100);
|
|
280
|
+
for (const m of results) {
|
|
281
|
+
await ctx.db.delete(m._id);
|
|
282
|
+
}
|
|
283
|
+
if (results.length === 100) {
|
|
284
|
+
await ctx.scheduler.runAfter(0, api.lib.clearAll, {
|
|
285
|
+
before: results[99]._creationTime,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
});
|
|
290
|
+
//# sourceMappingURL=lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
declare const _default: import("convex/server").SchemaDefinition<{
|
|
2
|
+
migrations: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
3
|
+
workerId?: import("convex/values").GenericId<"_scheduled_functions"> | undefined;
|
|
4
|
+
error?: string | undefined;
|
|
5
|
+
latestEnd?: number | undefined;
|
|
6
|
+
args?: any;
|
|
7
|
+
name: string;
|
|
8
|
+
cursor: string | null;
|
|
9
|
+
isDone: boolean;
|
|
10
|
+
processed: number;
|
|
11
|
+
latestStart: number;
|
|
12
|
+
}, {
|
|
13
|
+
name: import("convex/values").VString<string, "required">;
|
|
14
|
+
cursor: import("convex/values").VUnion<string | null, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "required", never>;
|
|
15
|
+
isDone: import("convex/values").VBoolean<boolean, "required">;
|
|
16
|
+
workerId: import("convex/values").VId<import("convex/values").GenericId<"_scheduled_functions"> | undefined, "optional">;
|
|
17
|
+
error: import("convex/values").VString<string | undefined, "optional">;
|
|
18
|
+
processed: import("convex/values").VFloat64<number, "required">;
|
|
19
|
+
latestStart: import("convex/values").VFloat64<number, "required">;
|
|
20
|
+
latestEnd: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
21
|
+
args: import("convex/values").VAny<any, "optional", string>;
|
|
22
|
+
}, "required", "name" | "cursor" | "isDone" | "workerId" | "error" | "processed" | "latestStart" | "latestEnd" | "args" | `args.${string}`>, {
|
|
23
|
+
name: ["name", "_creationTime"];
|
|
24
|
+
isDone: ["isDone", "_creationTime"];
|
|
25
|
+
}, {}, {}>;
|
|
26
|
+
}, true>;
|
|
27
|
+
export default _default;
|
|
28
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,wBAgBG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { defineSchema, defineTable } from "convex/server";
|
|
2
|
+
import { v } from "convex/values";
|
|
3
|
+
export default defineSchema({
|
|
4
|
+
migrations: defineTable({
|
|
5
|
+
name: v.string(), // Defaults to the function name.
|
|
6
|
+
cursor: v.union(v.string(), v.null()),
|
|
7
|
+
isDone: v.boolean(),
|
|
8
|
+
workerId: v.optional(v.id("_scheduled_functions")),
|
|
9
|
+
error: v.optional(v.string()),
|
|
10
|
+
// The number of documents processed so far.
|
|
11
|
+
processed: v.number(),
|
|
12
|
+
latestStart: v.number(),
|
|
13
|
+
latestEnd: v.optional(v.number()),
|
|
14
|
+
// Runtime args passed to the migration.
|
|
15
|
+
args: v.optional(v.any()),
|
|
16
|
+
})
|
|
17
|
+
.index("name", ["name"])
|
|
18
|
+
.index("isDone", ["isDone"]),
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC,eAAe,YAAY,CAAC;IAC1B,UAAU,EAAE,WAAW,CAAC;QACtB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,iCAAiC;QACnD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;QACnB,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC;QAClD,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QAC7B,4CAA4C;QAC5C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;QACvB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;QACjC,wCAAwC;QACxC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;KAC1B,CAAC;SACC,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;SACvB,KAAK,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC;CAC/B,CAAC,CAAC"}
|
package/dist/shared.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type Infer, type ObjectType } from "convex/values";
|
|
2
|
+
export declare const migrationArgs: {
|
|
3
|
+
fn: import("convex/values").VString<string | undefined, "optional">;
|
|
4
|
+
cursor: import("convex/values").VUnion<string | null | undefined, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "optional", never>;
|
|
5
|
+
batchSize: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
6
|
+
dryRun: import("convex/values").VBoolean<boolean | undefined, "optional">;
|
|
7
|
+
next: import("convex/values").VArray<string[] | undefined, import("convex/values").VString<string, "required">, "optional">;
|
|
8
|
+
args: import("convex/values").VAny<any, "optional", string>;
|
|
9
|
+
};
|
|
10
|
+
export type MigrationArgs = ObjectType<typeof migrationArgs>;
|
|
11
|
+
export type MigrationResult = {
|
|
12
|
+
continueCursor: string;
|
|
13
|
+
isDone: boolean;
|
|
14
|
+
processed: number;
|
|
15
|
+
};
|
|
16
|
+
export declare const migrationStatus: import("convex/values").VObject<{
|
|
17
|
+
cursor?: string | null | undefined;
|
|
18
|
+
batchSize?: number | undefined;
|
|
19
|
+
next?: string[] | undefined;
|
|
20
|
+
error?: string | undefined;
|
|
21
|
+
latestEnd?: number | undefined;
|
|
22
|
+
name: string;
|
|
23
|
+
processed: number;
|
|
24
|
+
isDone: boolean;
|
|
25
|
+
state: "inProgress" | "success" | "failed" | "canceled" | "unknown";
|
|
26
|
+
latestStart: number;
|
|
27
|
+
}, {
|
|
28
|
+
name: import("convex/values").VString<string, "required">;
|
|
29
|
+
cursor: import("convex/values").VUnion<string | null | undefined, [import("convex/values").VString<string, "required">, import("convex/values").VNull<null, "required">], "optional", never>;
|
|
30
|
+
processed: import("convex/values").VFloat64<number, "required">;
|
|
31
|
+
isDone: import("convex/values").VBoolean<boolean, "required">;
|
|
32
|
+
error: import("convex/values").VString<string | undefined, "optional">;
|
|
33
|
+
state: import("convex/values").VUnion<"inProgress" | "success" | "failed" | "canceled" | "unknown", [import("convex/values").VLiteral<"inProgress", "required">, import("convex/values").VLiteral<"success", "required">, import("convex/values").VLiteral<"failed", "required">, import("convex/values").VLiteral<"canceled", "required">, import("convex/values").VLiteral<"unknown", "required">], "required", never>;
|
|
34
|
+
latestStart: import("convex/values").VFloat64<number, "required">;
|
|
35
|
+
latestEnd: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
36
|
+
batchSize: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
37
|
+
next: import("convex/values").VArray<string[] | undefined, import("convex/values").VString<string, "required">, "optional">;
|
|
38
|
+
}, "required", "cursor" | "batchSize" | "next" | "name" | "processed" | "isDone" | "error" | "state" | "latestStart" | "latestEnd">;
|
|
39
|
+
export type MigrationStatus = Infer<typeof migrationStatus>;
|
|
40
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAK,MAAM,eAAe,CAAC;AAE/D,eAAO,MAAM,aAAa;;;;;;;CAOzB,CAAC;AACF,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;mIAiB1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC"}
|
package/dist/shared.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { v } from "convex/values";
|
|
2
|
+
export const migrationArgs = {
|
|
3
|
+
fn: v.optional(v.string()),
|
|
4
|
+
cursor: v.optional(v.union(v.string(), v.null())),
|
|
5
|
+
batchSize: v.optional(v.number()),
|
|
6
|
+
dryRun: v.optional(v.boolean()),
|
|
7
|
+
next: v.optional(v.array(v.string())),
|
|
8
|
+
args: v.optional(v.any()),
|
|
9
|
+
};
|
|
10
|
+
export const migrationStatus = v.object({
|
|
11
|
+
name: v.string(),
|
|
12
|
+
cursor: v.optional(v.union(v.string(), v.null())),
|
|
13
|
+
processed: v.number(),
|
|
14
|
+
isDone: v.boolean(),
|
|
15
|
+
error: v.optional(v.string()),
|
|
16
|
+
state: v.union(v.literal("inProgress"), v.literal("success"), v.literal("failed"), v.literal("canceled"), v.literal("unknown")),
|
|
17
|
+
latestStart: v.number(),
|
|
18
|
+
latestEnd: v.optional(v.number()),
|
|
19
|
+
batchSize: v.optional(v.number()),
|
|
20
|
+
next: v.optional(v.array(v.string())),
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../src/shared.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,CAAC,EAAE,MAAM,eAAe,CAAC;AAE/D,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;CAC1B,CAAC;AASF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EACvB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,EACrB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CACrB;IACD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;CACtC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xixixao/convex-migrations",
|
|
3
|
+
"description": "A migrations component for Convex. Define, run, and track your database migrations. Run from a CLI or Convex server function.",
|
|
4
|
+
"repository": "github:get-convex/migrations",
|
|
5
|
+
"homepage": "https://github.com/get-convex/migrations#readme",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"email": "support@convex.dev",
|
|
8
|
+
"url": "https://github.com/get-convex/migrations/issues"
|
|
9
|
+
},
|
|
10
|
+
"version": "0.3.1-alpha.1",
|
|
11
|
+
"license": "Apache-2.0",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"convex",
|
|
14
|
+
"component"
|
|
15
|
+
],
|
|
16
|
+
"type": "module",
|
|
17
|
+
"scripts": {
|
|
18
|
+
"dev": "run-p -r 'dev:*'",
|
|
19
|
+
"dev:backend": "convex dev --typecheck-components",
|
|
20
|
+
"dev:frontend": "cd example && vite --clearScreen false",
|
|
21
|
+
"dev:build": "chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial",
|
|
22
|
+
"predev": "path-exists .env.local dist || (npm run build && convex dev --once)",
|
|
23
|
+
"build": "tsc --project ./tsconfig.build.json",
|
|
24
|
+
"build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
|
|
25
|
+
"build:clean": "rm -rf dist *.tsbuildinfo && npm run build:codegen",
|
|
26
|
+
"typecheck": "tsc --noEmit && tsc -p example && tsc -p example/convex",
|
|
27
|
+
"lint": "eslint .",
|
|
28
|
+
"all": "run-p -r 'dev:*' 'test:watch'",
|
|
29
|
+
"test": "vitest run --typecheck",
|
|
30
|
+
"test:watch": "vitest --typecheck --clearScreen false",
|
|
31
|
+
"test:debug": "vitest --inspect-brk --no-file-parallelism",
|
|
32
|
+
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
33
|
+
"preversion": "npm ci && npm run build:clean && run-p test lint typecheck",
|
|
34
|
+
"prepublishOnly": "npm whoami || npm login",
|
|
35
|
+
"alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
|
|
36
|
+
"release": "npm version patch && npm publish && git push --follow-tags",
|
|
37
|
+
"version": "vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
|
|
38
|
+
},
|
|
39
|
+
"files": [
|
|
40
|
+
"dist",
|
|
41
|
+
"src"
|
|
42
|
+
],
|
|
43
|
+
"exports": {
|
|
44
|
+
"./package.json": "./package.json",
|
|
45
|
+
".": {
|
|
46
|
+
"types": "./dist/client/index.d.ts",
|
|
47
|
+
"default": "./dist/client/index.js"
|
|
48
|
+
},
|
|
49
|
+
"./test": "./src/test.ts",
|
|
50
|
+
"./_generated/component.js": {
|
|
51
|
+
"types": "./dist/component/_generated/component.d.ts"
|
|
52
|
+
},
|
|
53
|
+
"./convex.config": {
|
|
54
|
+
"types": "./dist/component/convex.config.d.ts",
|
|
55
|
+
"default": "./dist/component/convex.config.js"
|
|
56
|
+
},
|
|
57
|
+
"./convex.config.js": {
|
|
58
|
+
"types": "./dist/component/convex.config.d.ts",
|
|
59
|
+
"default": "./dist/component/convex.config.js"
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"peerDependencies": {
|
|
63
|
+
"convex": "^1.24.8"
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@edge-runtime/vm": "5.0.0",
|
|
67
|
+
"@eslint/eslintrc": "3.3.1",
|
|
68
|
+
"@eslint/js": "9.39.1",
|
|
69
|
+
"@types/node": "20.19.24",
|
|
70
|
+
"@types/react": "18.3.26",
|
|
71
|
+
"@types/react-dom": "18.3.7",
|
|
72
|
+
"@vitejs/plugin-react": "5.0.4",
|
|
73
|
+
"chokidar-cli": "3.0.0",
|
|
74
|
+
"convex": "1.30.0",
|
|
75
|
+
"convex-test": "0.0.41",
|
|
76
|
+
"cpy-cli": "6.0.0",
|
|
77
|
+
"eslint": "9.39.1",
|
|
78
|
+
"eslint-plugin-react": "7.37.5",
|
|
79
|
+
"eslint-plugin-react-hooks": "5.2.0",
|
|
80
|
+
"eslint-plugin-react-refresh": "0.4.24",
|
|
81
|
+
"globals": "15.14.0",
|
|
82
|
+
"npm-run-all2": "7.0.2",
|
|
83
|
+
"path-exists-cli": "2.0.0",
|
|
84
|
+
"pkg-pr-new": "0.0.60",
|
|
85
|
+
"prettier": "3.6.2",
|
|
86
|
+
"react": "18.3.1",
|
|
87
|
+
"react-dom": "18.3.1",
|
|
88
|
+
"typescript": "5.9.3",
|
|
89
|
+
"typescript-eslint": "8.46.4",
|
|
90
|
+
"vite": "^7.1.5",
|
|
91
|
+
"vitest": "3.2.4"
|
|
92
|
+
},
|
|
93
|
+
"types": "./dist/client/index.d.ts",
|
|
94
|
+
"module": "./dist/client/index.js"
|
|
95
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { describe, test, expect } from "vitest";
|
|
2
|
+
import { Migrations, DEFAULT_BATCH_SIZE } from "./index.js";
|
|
3
|
+
import type { ComponentApi } from "../component/_generated/component.js";
|
|
4
|
+
|
|
5
|
+
describe("Migrations class", () => {
|
|
6
|
+
test("can instantiate without error", () => {
|
|
7
|
+
const dummyComponent = {} as ComponentApi;
|
|
8
|
+
expect(() => new Migrations(dummyComponent)).not.toThrow();
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
describe("DEFAULT_BATCH_SIZE", () => {
|
|
13
|
+
test("should equal 100", () => {
|
|
14
|
+
expect(DEFAULT_BATCH_SIZE).toBe(100);
|
|
15
|
+
});
|
|
16
|
+
});
|