@hot-updater/server 0.30.12 → 0.31.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.
Files changed (165) hide show
  1. package/dist/_virtual/_rolldown/runtime.cjs +25 -0
  2. package/dist/_virtual/_rolldown/runtime.mjs +6 -0
  3. package/dist/adapters/drizzle.cjs +6 -9
  4. package/dist/adapters/drizzle.d.cts +8 -1
  5. package/dist/adapters/drizzle.d.mts +8 -1
  6. package/dist/adapters/drizzle.mjs +5 -2
  7. package/dist/adapters/kysely.cjs +7 -9
  8. package/dist/adapters/kysely.d.cts +14 -1
  9. package/dist/adapters/kysely.d.mts +14 -1
  10. package/dist/adapters/kysely.mjs +6 -2
  11. package/dist/adapters/mongodb.cjs +7 -9
  12. package/dist/adapters/mongodb.d.cts +9 -1
  13. package/dist/adapters/mongodb.d.mts +9 -1
  14. package/dist/adapters/mongodb.mjs +5 -2
  15. package/dist/adapters/prisma.cjs +6 -9
  16. package/dist/adapters/prisma.d.cts +8 -1
  17. package/dist/adapters/prisma.d.mts +8 -1
  18. package/dist/adapters/prisma.mjs +5 -2
  19. package/dist/db/createBundleDiff.cjs +166 -0
  20. package/dist/db/createBundleDiff.d.cts +20 -0
  21. package/dist/db/createBundleDiff.d.mts +20 -0
  22. package/dist/db/createBundleDiff.mjs +161 -0
  23. package/dist/db/index.cjs +15 -16
  24. package/dist/db/index.d.cts +5 -4
  25. package/dist/db/index.d.mts +5 -4
  26. package/dist/db/index.mjs +14 -16
  27. package/dist/db/ormCore.cjs +173 -65
  28. package/dist/db/ormCore.d.cts +100 -34
  29. package/dist/db/ormCore.d.mts +100 -34
  30. package/dist/db/ormCore.mjs +171 -64
  31. package/dist/db/pluginCore.cjs +37 -3
  32. package/dist/db/pluginCore.mjs +36 -3
  33. package/dist/db/schemaEnhancements.cjs +171 -0
  34. package/dist/db/schemaEnhancements.mjs +167 -0
  35. package/dist/db/types.cjs +6 -0
  36. package/dist/db/types.d.cts +19 -7
  37. package/dist/db/types.d.mts +22 -10
  38. package/dist/db/types.mjs +6 -1
  39. package/dist/db/updateArtifacts.cjs +127 -0
  40. package/dist/db/updateArtifacts.mjs +125 -0
  41. package/dist/handler.cjs +61 -5
  42. package/dist/handler.d.cts +2 -2
  43. package/dist/handler.d.mts +5 -5
  44. package/dist/handler.mjs +59 -5
  45. package/dist/index.cjs +2 -0
  46. package/dist/index.d.cts +3 -2
  47. package/dist/index.d.mts +3 -2
  48. package/dist/index.mjs +2 -1
  49. package/dist/node.d.cts +0 -1
  50. package/dist/node.d.mts +0 -1
  51. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/_u64.cjs +112 -0
  52. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/_u64.mjs +108 -0
  53. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/cryptoNode.cjs +22 -0
  54. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/cryptoNode.mjs +18 -0
  55. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/sha3.cjs +219 -0
  56. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/sha3.mjs +214 -0
  57. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/utils.cjs +275 -0
  58. package/dist/node_modules/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/utils.mjs +270 -0
  59. package/dist/node_modules/.pnpm/@paralleldrive_cuid2@2.3.1/node_modules/@paralleldrive/cuid2/index.cjs +17 -0
  60. package/dist/node_modules/.pnpm/@paralleldrive_cuid2@2.3.1/node_modules/@paralleldrive/cuid2/index.mjs +13 -0
  61. package/dist/node_modules/.pnpm/@paralleldrive_cuid2@2.3.1/node_modules/@paralleldrive/cuid2/src/index.cjs +69 -0
  62. package/dist/node_modules/.pnpm/@paralleldrive_cuid2@2.3.1/node_modules/@paralleldrive/cuid2/src/index.mjs +65 -0
  63. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/column.cjs +52 -0
  64. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/column.mjs +52 -0
  65. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/entity.cjs +16 -0
  66. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/entity.mjs +15 -0
  67. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/pg-core/columns/enum.cjs +7 -0
  68. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/pg-core/columns/enum.mjs +7 -0
  69. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/sql/expressions/conditions.cjs +92 -0
  70. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/sql/expressions/conditions.mjs +78 -0
  71. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/sql/expressions/select.cjs +11 -0
  72. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/sql/expressions/select.mjs +10 -0
  73. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/sql/sql.cjs +383 -0
  74. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/sql/sql.mjs +366 -0
  75. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/subquery.cjs +17 -0
  76. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/subquery.mjs +17 -0
  77. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/table.cjs +60 -0
  78. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/table.mjs +59 -0
  79. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/table.utils.cjs +4 -0
  80. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/table.utils.mjs +4 -0
  81. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/tracing.cjs +6 -0
  82. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/tracing.mjs +6 -0
  83. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/view-common.cjs +4 -0
  84. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pglite@0.2.17_@_31f44b782f9321d71f3ce9d35aa1edf7/node_modules/drizzle-orm/view-common.mjs +4 -0
  85. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/drizzle/index.cjs +383 -0
  86. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/drizzle/index.d.cts +12 -0
  87. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/drizzle/index.d.mts +12 -0
  88. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/drizzle/index.mjs +383 -0
  89. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/kysely/index.cjs +4 -0
  90. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/kysely/index.mjs +5 -0
  91. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/prisma/index.cjs +339 -0
  92. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/prisma/index.d.cts +70 -0
  93. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/prisma/index.d.mts +70 -0
  94. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/adapters/prisma/index.mjs +339 -0
  95. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-7PZK4ONR.cjs +57 -0
  96. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-7PZK4ONR.mjs +56 -0
  97. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-C6OTUURW.cjs +330 -0
  98. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-C6OTUURW.mjs +326 -0
  99. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-CHTIKPQU.cjs +166 -0
  100. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-CHTIKPQU.mjs +163 -0
  101. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-GUE4GMNC.cjs +14 -0
  102. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-GUE4GMNC.mjs +13 -0
  103. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-LHHP6UVP.cjs +24 -0
  104. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-LHHP6UVP.mjs +24 -0
  105. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-LVCPMTAT.cjs +1190 -0
  106. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-LVCPMTAT.mjs +1189 -0
  107. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-PK2W2SQ7.cjs +197 -0
  108. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-PK2W2SQ7.mjs +197 -0
  109. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-ZEQMAIFI.cjs +410 -0
  110. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-ZEQMAIFI.mjs +400 -0
  111. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-ZOCGSAWS.cjs +213 -0
  112. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/chunk-ZOCGSAWS.mjs +212 -0
  113. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/create-tg0451Y_.d.cts +285 -0
  114. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/create-tg0451Y_.d.mts +285 -0
  115. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/index-CMqePMTF.d.cts +45 -0
  116. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/index-CMqePMTF.d.mts +45 -0
  117. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/index.cjs +69 -0
  118. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/index.d.cts +49 -0
  119. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/index.d.mts +49 -0
  120. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/index.mjs +67 -0
  121. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/query/index.d.cts +156 -0
  122. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/query/index.d.mts +156 -0
  123. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/schema/index.cjs +1 -0
  124. package/dist/node_modules/.pnpm/fumadb@0.2.2_drizzle-orm@0.44.7_@cloudflare_workers-types@4.20260313.1_@electric-sql_pg_c72c8c754becd21f6d6662e8fbd28e7f/node_modules/fumadb/dist/schema/index.mjs +2 -0
  125. package/dist/{package.cjs → packages/server/package.cjs} +1 -1
  126. package/dist/{package.mjs → packages/server/package.mjs} +1 -1
  127. package/dist/runtime.cjs +13 -13
  128. package/dist/runtime.d.cts +4 -4
  129. package/dist/runtime.d.mts +4 -4
  130. package/dist/runtime.mjs +12 -13
  131. package/dist/schema/v0_21_0.cjs +16 -15
  132. package/dist/schema/v0_21_0.mjs +3 -2
  133. package/dist/schema/v0_29_0.cjs +18 -17
  134. package/dist/schema/v0_29_0.mjs +3 -2
  135. package/dist/schema/v0_31_0.cjs +48 -0
  136. package/dist/schema/v0_31_0.mjs +48 -0
  137. package/dist/storageAccess.cjs +44 -0
  138. package/dist/storageAccess.mjs +44 -0
  139. package/dist/version.cjs +1 -1
  140. package/dist/version.mjs +1 -1
  141. package/package.json +15 -7
  142. package/src/adapters/drizzle.ts +15 -1
  143. package/src/adapters/kysely.ts +24 -1
  144. package/src/adapters/mongodb.ts +19 -1
  145. package/src/adapters/prisma.ts +15 -1
  146. package/src/db/createBundleDiff.spec.ts +402 -0
  147. package/src/db/createBundleDiff.ts +375 -0
  148. package/src/db/index.spec.ts +528 -27
  149. package/src/db/index.ts +22 -36
  150. package/src/db/ormCore.ts +308 -75
  151. package/src/db/pluginCore.spec.ts +385 -0
  152. package/src/db/pluginCore.ts +45 -4
  153. package/src/db/schemaEnhancements.ts +460 -0
  154. package/src/db/types.ts +38 -7
  155. package/src/db/updateArtifacts.ts +388 -0
  156. package/src/handler-standalone.integration.spec.ts +1 -0
  157. package/src/handler.spec.ts +121 -0
  158. package/src/handler.ts +117 -5
  159. package/src/runtime.spec.ts +287 -55
  160. package/src/runtime.ts +21 -37
  161. package/src/schema/v0_21_0.ts +1 -1
  162. package/src/schema/v0_29_0.ts +1 -1
  163. package/src/schema/v0_31_0.ts +58 -0
  164. package/src/storageAccess.spec.ts +57 -0
  165. package/src/storageAccess.ts +90 -0
@@ -0,0 +1,388 @@
1
+ import {
2
+ getAssetBaseStorageUri,
3
+ getBundlePatch,
4
+ getManifestFileHash,
5
+ getManifestStorageUri,
6
+ stripBundleArtifactMetadata,
7
+ type AppUpdateAvailableInfo,
8
+ type Bundle,
9
+ type ChangedAsset,
10
+ } from "@hot-updater/core";
11
+ import type { HotUpdaterContext } from "@hot-updater/plugin-core";
12
+
13
+ type BundleManifest = {
14
+ bundleId: string;
15
+ assets: Record<string, { fileHash: string; signature?: string }>;
16
+ };
17
+
18
+ type ResolveFileUrl<TContext> = (
19
+ storageUri: string | null,
20
+ context?: HotUpdaterContext<TContext>,
21
+ ) => Promise<string | null>;
22
+
23
+ type ReadStorageText<TContext> = (
24
+ storageUri: string,
25
+ context?: HotUpdaterContext<TContext>,
26
+ ) => Promise<string | null>;
27
+
28
+ const HBC_ASSET_PATH_RE = /\.bundle$/;
29
+ const BR_COMPRESSED_ASSET_PATH_RE = /(^|\/)index\.[^/]+\.bundle$/;
30
+
31
+ const resolveUniqueHbcAssetPath = (manifest: BundleManifest) => {
32
+ const candidates = Object.keys(manifest.assets)
33
+ .sort((left, right) => left.localeCompare(right))
34
+ .filter((candidate) => HBC_ASSET_PATH_RE.test(candidate));
35
+
36
+ return candidates.length === 1 ? candidates[0] : null;
37
+ };
38
+
39
+ const isBundleManifest = (value: unknown): value is BundleManifest => {
40
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
41
+ return false;
42
+ }
43
+
44
+ const manifest = value as {
45
+ bundleId?: unknown;
46
+ assets?: unknown;
47
+ };
48
+
49
+ if (typeof manifest.bundleId !== "string") {
50
+ return false;
51
+ }
52
+
53
+ if (!manifest.assets || typeof manifest.assets !== "object") {
54
+ return false;
55
+ }
56
+
57
+ return Object.values(manifest.assets as Record<string, unknown>).every(
58
+ (asset) => {
59
+ if (!asset || typeof asset !== "object" || Array.isArray(asset)) {
60
+ return false;
61
+ }
62
+
63
+ const manifestAsset = asset as {
64
+ fileHash?: unknown;
65
+ signature?: unknown;
66
+ };
67
+
68
+ return (
69
+ typeof manifestAsset.fileHash === "string" &&
70
+ (manifestAsset.signature === undefined ||
71
+ typeof manifestAsset.signature === "string")
72
+ );
73
+ },
74
+ );
75
+ };
76
+
77
+ const createChildStorageUri = (
78
+ baseStorageUri: string,
79
+ relativePath: string,
80
+ ) => {
81
+ const baseUrl = new URL(baseStorageUri);
82
+ const normalizedBasePath = baseUrl.pathname.replace(/\/+$/, "");
83
+ const relativeSegments = relativePath
84
+ .split("/")
85
+ .filter(Boolean)
86
+ .map((segment) => encodeURIComponent(segment));
87
+
88
+ baseUrl.pathname = `${normalizedBasePath}/${relativeSegments.join("/")}`;
89
+ return baseUrl.toString();
90
+ };
91
+
92
+ export const parseBundleMetadata = (
93
+ value: unknown,
94
+ ): Bundle["metadata"] | undefined => {
95
+ if (!value) {
96
+ return undefined;
97
+ }
98
+
99
+ let parsedValue: unknown = value;
100
+
101
+ if (typeof parsedValue === "string") {
102
+ try {
103
+ parsedValue = JSON.parse(parsedValue) as unknown;
104
+ } catch {
105
+ return undefined;
106
+ }
107
+ }
108
+
109
+ if (
110
+ !parsedValue ||
111
+ typeof parsedValue !== "object" ||
112
+ Array.isArray(parsedValue)
113
+ ) {
114
+ return undefined;
115
+ }
116
+
117
+ return stripBundleArtifactMetadata(parsedValue as Bundle["metadata"]);
118
+ };
119
+
120
+ export const parseBundleRawMetadata = (
121
+ value: unknown,
122
+ ): Bundle["metadata"] | undefined => {
123
+ if (!value) {
124
+ return undefined;
125
+ }
126
+
127
+ let parsedValue: unknown = value;
128
+
129
+ if (typeof parsedValue === "string") {
130
+ try {
131
+ parsedValue = JSON.parse(parsedValue) as unknown;
132
+ } catch {
133
+ return undefined;
134
+ }
135
+ }
136
+
137
+ if (
138
+ !parsedValue ||
139
+ typeof parsedValue !== "object" ||
140
+ Array.isArray(parsedValue)
141
+ ) {
142
+ return undefined;
143
+ }
144
+
145
+ return parsedValue as Bundle["metadata"];
146
+ };
147
+
148
+ async function fetchBundleManifest<TContext>(
149
+ storageUri: string,
150
+ readStorageText: ReadStorageText<TContext>,
151
+ resolveFileUrl: ResolveFileUrl<TContext>,
152
+ context?: HotUpdaterContext<TContext>,
153
+ ): Promise<{ fileUrl: string; manifest: BundleManifest } | null> {
154
+ const [storageText, fileUrl] = await Promise.all([
155
+ readStorageText(storageUri, context),
156
+ resolveFileUrl(storageUri, context),
157
+ ]);
158
+ if (storageText === null) {
159
+ return null;
160
+ }
161
+
162
+ let payload: unknown;
163
+ try {
164
+ payload = JSON.parse(storageText) as unknown;
165
+ } catch {
166
+ return null;
167
+ }
168
+
169
+ if (!isBundleManifest(payload)) {
170
+ return null;
171
+ }
172
+
173
+ if (!fileUrl) {
174
+ return null;
175
+ }
176
+
177
+ return {
178
+ fileUrl,
179
+ manifest: payload,
180
+ };
181
+ }
182
+
183
+ async function resolveChangedAssets<TContext>({
184
+ assetBaseStorageUri,
185
+ currentManifest,
186
+ currentBundle,
187
+ resolveFileUrl,
188
+ targetBundle,
189
+ targetManifest,
190
+ context,
191
+ }: {
192
+ assetBaseStorageUri: string;
193
+ currentManifest: BundleManifest | null;
194
+ currentBundle: Bundle | null;
195
+ resolveFileUrl: ResolveFileUrl<TContext>;
196
+ targetBundle: Bundle | null;
197
+ targetManifest: BundleManifest;
198
+ context?: HotUpdaterContext<TContext>;
199
+ }): Promise<Record<string, ChangedAsset> | null> {
200
+ const patchDescriptor = await resolveHbcPatchDescriptor({
201
+ currentBundle,
202
+ resolveFileUrl,
203
+ targetBundle,
204
+ targetManifest,
205
+ context,
206
+ });
207
+ const changedEntries = await Promise.all(
208
+ Object.entries(targetManifest.assets).map(async ([assetPath, asset]) => {
209
+ const currentAsset = currentManifest?.assets[assetPath];
210
+ if (currentAsset?.fileHash === asset.fileHash) {
211
+ return null;
212
+ }
213
+
214
+ const usesBrotliAsset = BR_COMPRESSED_ASSET_PATH_RE.test(assetPath);
215
+ const downloadPath = usesBrotliAsset ? `${assetPath}.br` : assetPath;
216
+ const storageUri = createChildStorageUri(
217
+ assetBaseStorageUri,
218
+ downloadPath,
219
+ );
220
+ const patch =
221
+ patchDescriptor?.assetPath === assetPath ? patchDescriptor.patch : null;
222
+
223
+ let fileUrl: string | null = null;
224
+ try {
225
+ fileUrl = await resolveFileUrl(storageUri, context);
226
+ } catch (error) {
227
+ if (!patch) {
228
+ throw error;
229
+ }
230
+ }
231
+
232
+ if (!fileUrl && !patch) {
233
+ return false;
234
+ }
235
+
236
+ const changedAsset: ChangedAsset = {
237
+ fileHash: asset.fileHash,
238
+ };
239
+ if (fileUrl) {
240
+ changedAsset.file = {
241
+ url: fileUrl,
242
+ };
243
+ if (usesBrotliAsset) {
244
+ changedAsset.file.compression = "br";
245
+ }
246
+ }
247
+ if (patch) {
248
+ changedAsset.patch = patch;
249
+ }
250
+
251
+ return [assetPath, changedAsset] as const;
252
+ }),
253
+ );
254
+
255
+ if (changedEntries.some((entry) => entry === false)) {
256
+ return null;
257
+ }
258
+
259
+ return Object.fromEntries(
260
+ changedEntries.filter(
261
+ (entry): entry is readonly [string, ChangedAsset] => entry !== null,
262
+ ),
263
+ );
264
+ }
265
+
266
+ async function resolveHbcPatchDescriptor<TContext>({
267
+ currentBundle,
268
+ resolveFileUrl,
269
+ targetBundle,
270
+ targetManifest,
271
+ context,
272
+ }: {
273
+ currentBundle: Bundle | null;
274
+ resolveFileUrl: ResolveFileUrl<TContext>;
275
+ targetBundle: Bundle | null;
276
+ targetManifest: BundleManifest;
277
+ context?: HotUpdaterContext<TContext>;
278
+ }): Promise<{
279
+ assetPath: string;
280
+ patch: ChangedAsset["patch"];
281
+ } | null> {
282
+ const matchingPatch =
283
+ targetBundle && currentBundle
284
+ ? getBundlePatch(targetBundle, currentBundle.id)
285
+ : null;
286
+ const patchAssetPath = resolveUniqueHbcAssetPath(targetManifest);
287
+
288
+ if (
289
+ !currentBundle ||
290
+ !matchingPatch ||
291
+ !patchAssetPath ||
292
+ !matchingPatch.patchStorageUri ||
293
+ !matchingPatch.patchFileHash ||
294
+ !matchingPatch.baseFileHash
295
+ ) {
296
+ return null;
297
+ }
298
+
299
+ const patchUrl = await resolveFileUrl(matchingPatch.patchStorageUri, context);
300
+ if (!patchUrl) {
301
+ return null;
302
+ }
303
+
304
+ return {
305
+ assetPath: patchAssetPath,
306
+ patch: {
307
+ algorithm: "bsdiff",
308
+ baseBundleId: matchingPatch.baseBundleId,
309
+ baseFileHash: matchingPatch.baseFileHash,
310
+ patchFileHash: matchingPatch.patchFileHash,
311
+ patchUrl,
312
+ },
313
+ };
314
+ }
315
+
316
+ export async function resolveManifestArtifacts<TContext>({
317
+ currentBundle,
318
+ resolveFileUrl,
319
+ readStorageText,
320
+ targetBundle,
321
+ context,
322
+ }: {
323
+ currentBundle: Bundle | null;
324
+ resolveFileUrl: ResolveFileUrl<TContext>;
325
+ readStorageText: ReadStorageText<TContext>;
326
+ targetBundle: Bundle | null;
327
+ context?: HotUpdaterContext<TContext>;
328
+ }): Promise<Pick<
329
+ AppUpdateAvailableInfo,
330
+ "changedAssets" | "manifestFileHash" | "manifestUrl"
331
+ > | null> {
332
+ const manifestStorageUri = targetBundle
333
+ ? getManifestStorageUri(targetBundle)
334
+ : null;
335
+ const manifestFileHash = targetBundle
336
+ ? getManifestFileHash(targetBundle)
337
+ : null;
338
+ const assetBaseStorageUri = targetBundle
339
+ ? getAssetBaseStorageUri(targetBundle)
340
+ : null;
341
+
342
+ if (!manifestStorageUri || !manifestFileHash || !assetBaseStorageUri) {
343
+ return null;
344
+ }
345
+
346
+ const currentManifestStorageUri = currentBundle
347
+ ? getManifestStorageUri(currentBundle)
348
+ : null;
349
+ const [targetManifestResult, currentManifestResult] = await Promise.all([
350
+ fetchBundleManifest(
351
+ manifestStorageUri,
352
+ readStorageText,
353
+ resolveFileUrl,
354
+ context,
355
+ ),
356
+ currentManifestStorageUri
357
+ ? fetchBundleManifest(
358
+ currentManifestStorageUri,
359
+ readStorageText,
360
+ resolveFileUrl,
361
+ context,
362
+ )
363
+ : null,
364
+ ]);
365
+
366
+ if (!targetManifestResult) {
367
+ return null;
368
+ }
369
+
370
+ const changedAssets = await resolveChangedAssets({
371
+ assetBaseStorageUri,
372
+ currentManifest: currentManifestResult?.manifest ?? null,
373
+ currentBundle,
374
+ resolveFileUrl,
375
+ targetBundle,
376
+ targetManifest: targetManifestResult.manifest,
377
+ context,
378
+ });
379
+ if (!changedAssets) {
380
+ return null;
381
+ }
382
+
383
+ return {
384
+ changedAssets,
385
+ manifestFileHash,
386
+ manifestUrl: targetManifestResult.fileUrl,
387
+ };
388
+ }
@@ -87,6 +87,7 @@ beforeAll(async () => {
87
87
 
88
88
  afterEach(async () => {
89
89
  // Clean up database after each test
90
+ await db.exec("DELETE FROM bundle_patches");
90
91
  await db.exec("DELETE FROM bundles");
91
92
  });
92
93
 
@@ -4,6 +4,9 @@ import { describe, expect, it, vi } from "vitest";
4
4
  import { createHandler, type HandlerAPI } from "./handler";
5
5
  import { HOT_UPDATER_SERVER_VERSION } from "./version";
6
6
 
7
+ const NEXT_SDK_VERSION_FOR_TEST = "0.31.0";
8
+ const CURRENT_PACKAGE_SDK_VERSION = "0.30.10";
9
+
7
10
  type TestEnv = {
8
11
  tenantId: string;
9
12
  };
@@ -83,6 +86,83 @@ describe("createHandler", () => {
83
86
  );
84
87
  });
85
88
 
89
+ it("keeps legacy no-update responses as null when SDK version is missing", async () => {
90
+ const api = createApi();
91
+ api.getAppUpdateInfo.mockResolvedValueOnce(null);
92
+ const handler = createHandler(api, { basePath: "/hot-updater" });
93
+
94
+ const response = await handler(
95
+ new Request(
96
+ "http://localhost/hot-updater/app-version/ios/1.0.0/production/default/default",
97
+ ),
98
+ );
99
+
100
+ expect(response.status).toBe(200);
101
+ await expect(response.json()).resolves.toBeNull();
102
+ });
103
+
104
+ it("returns UP_TO_DATE for no-update responses from SDK-versioned clients", async () => {
105
+ const api = createApi();
106
+ api.getAppUpdateInfo.mockResolvedValueOnce(null);
107
+ const handler = createHandler(api, { basePath: "/hot-updater" });
108
+
109
+ const response = await handler(
110
+ new Request(
111
+ "http://localhost/hot-updater/app-version/ios/1.0.0/production/default/default",
112
+ {
113
+ headers: {
114
+ "Hot-Updater-SDK-Version": NEXT_SDK_VERSION_FOR_TEST,
115
+ },
116
+ },
117
+ ),
118
+ );
119
+
120
+ expect(response.status).toBe(200);
121
+ await expect(response.json()).resolves.toEqual({
122
+ status: "UP_TO_DATE",
123
+ });
124
+ });
125
+
126
+ it("keeps no-update responses as null for unsupported SDK versions", async () => {
127
+ const api = createApi();
128
+ api.getAppUpdateInfo.mockResolvedValueOnce(null);
129
+ const handler = createHandler(api, { basePath: "/hot-updater" });
130
+
131
+ const response = await handler(
132
+ new Request(
133
+ "http://localhost/hot-updater/app-version/ios/1.0.0/production/default/default",
134
+ {
135
+ headers: {
136
+ "Hot-Updater-SDK-Version": CURRENT_PACKAGE_SDK_VERSION,
137
+ },
138
+ },
139
+ ),
140
+ );
141
+
142
+ expect(response.status).toBe(200);
143
+ await expect(response.json()).resolves.toBeNull();
144
+ });
145
+
146
+ it("keeps no-update responses as null for invalid SDK versions", async () => {
147
+ const api = createApi();
148
+ api.getAppUpdateInfo.mockResolvedValueOnce(null);
149
+ const handler = createHandler(api, { basePath: "/hot-updater" });
150
+
151
+ const response = await handler(
152
+ new Request(
153
+ "http://localhost/hot-updater/app-version/ios/1.0.0/production/default/default",
154
+ {
155
+ headers: {
156
+ "Hot-Updater-SDK-Version": "invalid",
157
+ },
158
+ },
159
+ ),
160
+ );
161
+
162
+ expect(response.status).toBe(200);
163
+ await expect(response.json()).resolves.toBeNull();
164
+ });
165
+
86
166
  it("supports the fingerprint route without a cohort segment", async () => {
87
167
  const api = createApi();
88
168
  const handler = createHandler(api, { basePath: "/hot-updater" });
@@ -247,6 +327,47 @@ describe("createHandler", () => {
247
327
  );
248
328
  });
249
329
 
330
+ it("passes advanced bundle filters through to getBundles", async () => {
331
+ const api = createApi();
332
+ api.getBundles.mockResolvedValue({
333
+ data: [testBundle],
334
+ pagination: {
335
+ total: 1,
336
+ hasNextPage: false,
337
+ hasPreviousPage: false,
338
+ currentPage: 1,
339
+ totalPages: 1,
340
+ },
341
+ });
342
+ const handler = createHandler(api, { basePath: "/hot-updater" });
343
+
344
+ const response = await handler(
345
+ new Request(
346
+ "http://localhost/hot-updater/api/bundles?channel=production&platform=ios&enabled=true&idLt=bundle-9&targetAppVersion=1.0.x&targetAppVersionNotNull=true&fingerprintHash=null&limit=5",
347
+ ),
348
+ );
349
+
350
+ expect(response.status).toBe(200);
351
+ expect(api.getBundles).toHaveBeenCalledWith(
352
+ {
353
+ where: {
354
+ channel: "production",
355
+ platform: "ios",
356
+ enabled: true,
357
+ id: {
358
+ lt: "bundle-9",
359
+ },
360
+ targetAppVersion: "1.0.x",
361
+ targetAppVersionNotNull: true,
362
+ fingerprintHash: null,
363
+ },
364
+ limit: 5,
365
+ page: undefined,
366
+ },
367
+ undefined,
368
+ );
369
+ });
370
+
250
371
  it("passes cursor pagination params through to getBundles", async () => {
251
372
  const api = createApi();
252
373
  api.getBundles.mockResolvedValue({