migrator.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import { useEffect, useReducer } from "react";
  2. async function readMigrationFiles({ journal, migrations }) {
  3. const migrationQueries = [];
  4. for await (const journalEntry of journal.entries) {
  5. const query = migrations[`m${journalEntry.idx.toString().padStart(4, "0")}`];
  6. if (!query) {
  7. throw new Error(`Missing migration: ${journalEntry.tag}`);
  8. }
  9. try {
  10. const result = query.split("--> statement-breakpoint").map((it) => {
  11. return it;
  12. });
  13. migrationQueries.push({
  14. sql: result,
  15. bps: journalEntry.breakpoints,
  16. folderMillis: journalEntry.when,
  17. hash: ""
  18. });
  19. } catch {
  20. throw new Error(`Failed to parse migration: ${journalEntry.tag}`);
  21. }
  22. }
  23. return migrationQueries;
  24. }
  25. async function migrate(db, config) {
  26. const migrations = await readMigrationFiles(config);
  27. return db.dialect.migrate(migrations, db.session);
  28. }
  29. const useMigrations = (db, migrations) => {
  30. const initialState = {
  31. success: false,
  32. error: void 0
  33. };
  34. const fetchReducer = (state2, action) => {
  35. switch (action.type) {
  36. case "migrating": {
  37. return { ...initialState };
  38. }
  39. case "migrated": {
  40. return { ...initialState, success: action.payload };
  41. }
  42. case "error": {
  43. return { ...initialState, error: action.payload };
  44. }
  45. default: {
  46. return state2;
  47. }
  48. }
  49. };
  50. const [state, dispatch] = useReducer(fetchReducer, initialState);
  51. useEffect(() => {
  52. dispatch({ type: "migrating" });
  53. migrate(db, migrations).then(() => {
  54. dispatch({ type: "migrated", payload: true });
  55. }).catch((error) => {
  56. dispatch({ type: "error", payload: error });
  57. });
  58. }, []);
  59. return state;
  60. };
  61. export {
  62. migrate,
  63. useMigrations
  64. };
  65. //# sourceMappingURL=migrator.js.map