@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.
Files changed (57) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +523 -0
  3. package/dist/client/index.d.ts +390 -0
  4. package/dist/client/index.d.ts.map +1 -0
  5. package/dist/client/index.js +528 -0
  6. package/dist/client/index.js.map +1 -0
  7. package/dist/client/log.d.ts +8 -0
  8. package/dist/client/log.d.ts.map +1 -0
  9. package/dist/client/log.js +74 -0
  10. package/dist/client/log.js.map +1 -0
  11. package/dist/component/_generated/api.d.ts +34 -0
  12. package/dist/component/_generated/api.d.ts.map +1 -0
  13. package/dist/component/_generated/api.js +31 -0
  14. package/dist/component/_generated/api.js.map +1 -0
  15. package/dist/component/_generated/component.d.ts +95 -0
  16. package/dist/component/_generated/component.d.ts.map +1 -0
  17. package/dist/component/_generated/component.js +11 -0
  18. package/dist/component/_generated/component.js.map +1 -0
  19. package/dist/component/_generated/dataModel.d.ts +46 -0
  20. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  21. package/dist/component/_generated/dataModel.js +11 -0
  22. package/dist/component/_generated/dataModel.js.map +1 -0
  23. package/dist/component/_generated/server.d.ts +121 -0
  24. package/dist/component/_generated/server.d.ts.map +1 -0
  25. package/dist/component/_generated/server.js +78 -0
  26. package/dist/component/_generated/server.js.map +1 -0
  27. package/dist/component/convex.config.d.ts +3 -0
  28. package/dist/component/convex.config.d.ts.map +1 -0
  29. package/dist/component/convex.config.js +3 -0
  30. package/dist/component/convex.config.js.map +1 -0
  31. package/dist/component/lib.d.ts +74 -0
  32. package/dist/component/lib.d.ts.map +1 -0
  33. package/dist/component/lib.js +290 -0
  34. package/dist/component/lib.js.map +1 -0
  35. package/dist/component/schema.d.ts +28 -0
  36. package/dist/component/schema.d.ts.map +1 -0
  37. package/dist/component/schema.js +20 -0
  38. package/dist/component/schema.js.map +1 -0
  39. package/dist/shared.d.ts +40 -0
  40. package/dist/shared.d.ts.map +1 -0
  41. package/dist/shared.js +22 -0
  42. package/dist/shared.js.map +1 -0
  43. package/package.json +95 -0
  44. package/src/client/index.test.ts +16 -0
  45. package/src/client/index.ts +765 -0
  46. package/src/client/log.ts +76 -0
  47. package/src/component/_generated/api.ts +50 -0
  48. package/src/component/_generated/component.ts +116 -0
  49. package/src/component/_generated/dataModel.ts +60 -0
  50. package/src/component/_generated/server.ts +161 -0
  51. package/src/component/convex.config.ts +3 -0
  52. package/src/component/lib.test.ts +110 -0
  53. package/src/component/lib.ts +356 -0
  54. package/src/component/schema.ts +20 -0
  55. package/src/component/setup.test.ts +5 -0
  56. package/src/shared.ts +37 -0
  57. 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":"AACA,OAAO,EAAE,WAAW,EAAmB,CAAC,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAIL,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAE1C,OAAO,EACL,QAAQ,EAER,KAAK,GAEN,MAAM,wBAAwB,CAAC;AAQhC,MAAM,gBAAgB,GAAG;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEjD,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjC,YAAY,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IACrC,IAAI,EAAE,CAAC,CAAC,QAAQ,CACd,CAAC,CAAC,KAAK,CACL,CAAC,CAAC,MAAM,CAAC;QACP,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACrB,CAAC,CACH,CACF;IACD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAC;IAC9B,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,eAAe;IACxB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,mCAAmC;QACnC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAChE,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,qBAAqB;gBACnB,wDAAwD;gBACxD,iEAAiE;gBACjE,kDAAkD,CACrD,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GACT,CAAC,MAAM,GAAG,CAAC,EAAE;aACV,KAAK,CAAC,YAAY,CAAC;aACnB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;aAC5C,MAAM,EAAE,CAAC;YACZ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CACf,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,EAAE;gBAChC,IAAI;gBACJ,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;gBAC3B,MAAM,EAAE,KAAK;gBACb,SAAS,EAAE,CAAC;gBACZ,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;gBACvB,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CACH,CAAE,CAAC;QAEN,8CAA8C;QAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACjC,mBAAmB;YACnB,iEAAiE;YACjE,2DAA2D;YAC3D,2DAA2D;YAC3D,MAAM,MAAM,GACV,KAAK,CAAC,QAAQ,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9D,IACE,MAAM;gBACN,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,EACvE,CAAC;gBACD,gDAAgD;gBAChD,OAAO,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACjC,OAAO,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACvC,CAAC;YACD,6BAA6B;YAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC3B,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC;gBACrB,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC/B,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC5B,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,CAAC;YACD,iDAAiD;QACnD,CAAC;QAED,SAAS,WAAW,CAAC,MAAuB;YAC1C,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;YACrC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;YACpC,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACnD,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,6BAA6B;YAC7B,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAClC,QAAmC,EACnC;oBACE,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,SAAS;oBACT,MAAM;oBACN,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CACF,CAAC;gBACF,WAAW,CAAC,MAAM,CAAC,CAAC;gBACpB,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;YAC1B,CAAC;YAED,qDAAqD;YACrD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC7B,CAAC;iBAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBACzB,uCAAuC;gBACvC,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE;oBAChE,GAAG,IAAI;oBACP,MAAM,EAAE,KAAK,CAAC,MAAM;iBACrB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;gBAC3B,6CAA6C;gBAC7C,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACzB,iDAAiD;gBACjD,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE;yBACrB,KAAK,CAAC,YAAY,CAAC;yBACnB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC;yBACrD,MAAM,EAAE,CAAC;oBACZ,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;wBACxB,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;wBACxC,IAAI,MAAM,EAAE,CAAC;4BACX,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE;gCAC/C,IAAI,EAAE,MAAM,CAAC,IAAI;gCACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gCACzB,IAAI,EAAE,IAAI;gCACV,SAAS;gCACT,MAAM;6BACP,CAAC,CAAC;wBACL,CAAC;wBACD,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAC9B,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;oBACrE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CACV,aAAa,IAAI,WAAW;wBAC1B,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CACrD,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC3B,IAAI,MAAM,IAAI,CAAC,YAAY,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBACpE,2CAA2C;gBAC3C,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,KAAK,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,KAAK,CAAC,aAAa,IAAI,YAAY,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBACnD,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC7B,MAAM,CAAC,IAAI,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACxC,MAAM,IAAI,WAAW,CAAC;oBACpB,IAAI,EAAE,SAAS;oBACf,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,2BAA2B;QAC3B,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,wEAAwE;YACxE,qBAAqB;YACrB,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/B,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;QACJ,CAAC;QACD,OAAO,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,CAAC;IAC7B,IAAI,EAAE;QACJ,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC9B;IACD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;IACjC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK;YACrB,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,KAAK,EAAE,CAAC,EAAE,EAAE,CACV,CAAC,MAAM,GAAG,CAAC,EAAE;iBACV,KAAK,CAAC,YAAY,CAAC;iBACnB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;iBACzC,MAAM,EAAE,CAAC,IAAI;gBACd,IAAI,EAAE,CAAC;gBACP,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI;gBACZ,WAAW,EAAE,CAAC;gBACd,QAAQ,EAAE,SAAS;gBACnB,MAAM,EAAE,KAAc;aACvB,CACJ,CACF;YACH,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;iBACT,KAAK,CAAC,YAAY,CAAC;iBACnB,KAAK,CAAC,MAAM,CAAC;iBACb,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAE9B,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI;aACD,OAAO,EAAE;aACT,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAC/D,CAAC;IACJ,CAAC;CACF,CAAC,CAAC;AAEH,KAAK,UAAU,iBAAiB,CAC9B,GAAa,EACb,SAAiD;IAEjD,MAAM,MAAM,GACV,SAAS,CAAC,QAAQ,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC,CAEd,CAAC;IACd,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM;QAC5B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,QAAQ;YAClD,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,UAAU;gBACjC,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,YAAY;oBACjC,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,SAAS;oBAClC,CAAC,CAAC,YAAY;oBACd,CAAC,CAAC,SAAS,CAAC;IACpB,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,KAAK;QACL,SAAS,EAAE,IAAI,EAAE,SAAS;QAC1B,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,QAAQ,CAAC;IAC7B,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE;IAC1B,OAAO,EAAE,eAAe;IACxB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE;aAC3B,KAAK,CAAC,YAAY,CAAC;aACnB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;aACjD,MAAM,EAAE,CAAC;QAEZ,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACpD,IAAI,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CACT,4BAA4B,SAAS,CAAC,IAAI,gBAAgB,KAAK,CAAC,KAAK,EAAE,CACxE,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAC,CAAC;AAEH,KAAK,UAAU,eAAe,CAAC,GAAgB,EAAE,SAA4B;IAC3E,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,QAAS,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,UAAmB,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;IAChC,wCAAwC;IACxC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;IACzC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;IACjC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,YAAY,CAAC;aACnB,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CACzB,IAAI,CAAC,OAAO;YACV,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC;YAC1D,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAC1B;aACA,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE;gBACjD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,aAAa;aACpD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;CACF,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC/B,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;IACxC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE;IACjB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;aACzB,KAAK,CAAC,YAAY,CAAC;aACnB,SAAS,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CACnC,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAClD;aACA,KAAK,CAAC,MAAM,CAAC;aACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC3B,MAAM,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE;gBAChD,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,aAAa;aAClC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
@@ -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"}
@@ -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
+ });