@aotter/mantle 0.2.0-alpha.5 → 0.2.0-alpha.7

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 (932) hide show
  1. package/README.md +152 -45
  2. package/dist/auth/adapter.d.ts +32 -0
  3. package/dist/auth/adapter.js +285 -0
  4. package/dist/auth/admin.d.ts +3 -0
  5. package/dist/auth/admin.js +21 -0
  6. package/dist/auth/caller.d.ts +86 -0
  7. package/dist/auth/caller.js +154 -0
  8. package/dist/auth/hardening.d.ts +24 -0
  9. package/dist/auth/hardening.js +40 -0
  10. package/dist/auth/identity.d.ts +121 -0
  11. package/dist/auth/identity.js +203 -0
  12. package/dist/auth/oauth.d.ts +31 -0
  13. package/dist/auth/oauth.js +124 -0
  14. package/dist/auth/resource-seeds.js +10 -0
  15. package/dist/auth/routes.d.ts +32 -0
  16. package/dist/auth/{createAuthRoutes.js → routes.js} +130 -35
  17. package/dist/build/compiler.d.ts +790 -0
  18. package/dist/build/compiler.js +6971 -0
  19. package/dist/{spec → build/spec}/domain/model/ManifestGrammar.d.ts +28 -42
  20. package/dist/{spec → build/spec}/domain/model/RuntimePlan.d.ts +77 -3
  21. package/dist/{spec → build/spec}/domain/model/SqlIr.d.ts +35 -6
  22. package/dist/build/spec/domain/model/UserFields.d.ts +20 -0
  23. package/dist/{spec → build/spec}/domain/service/PlanFingerprint.d.ts +2 -1
  24. package/dist/{spec → build/spec}/kernel/diagnostic.d.ts +1 -30
  25. package/dist/bun/assets.d.ts +2 -0
  26. package/dist/bun/assets.js +24 -0
  27. package/dist/domain/adminOrder.js +24 -0
  28. package/dist/domain/columns.js +55 -0
  29. package/dist/domain/describe/chunk-ZIQVLA7X.js +363 -0
  30. package/dist/domain/describe/index.d.ts +58 -0
  31. package/dist/domain/describe/index.js +115 -0
  32. package/dist/domain/describe/target-hash.d.ts +8 -0
  33. package/dist/domain/describe/target-hash.js +12 -0
  34. package/dist/domain/describe/targets.d.ts +40 -0
  35. package/dist/domain/entry.js +33 -0
  36. package/dist/domain/generated-tools.js +17 -0
  37. package/dist/domain/generation.d.ts +16 -0
  38. package/dist/domain/generation.js +1 -0
  39. package/dist/domain/input.js +17 -0
  40. package/dist/domain/model.js +1 -0
  41. package/dist/domain/paging.js +204 -0
  42. package/dist/domain/recipes.js +19 -0
  43. package/dist/domain/userReferences.js +5 -0
  44. package/dist/domain/wireScalars.js +47 -0
  45. package/dist/infrastructure/adminEntries.js +153 -0
  46. package/dist/infrastructure/adminPaging.js +72 -0
  47. package/dist/infrastructure/artifacts.js +71 -0
  48. package/dist/infrastructure/authSchema.js +83 -0
  49. package/dist/infrastructure/bundle.js +84 -0
  50. package/dist/infrastructure/cli.js +101 -0
  51. package/dist/infrastructure/generate.d.ts +14 -0
  52. package/dist/infrastructure/generate.js +174 -0
  53. package/dist/infrastructure/generateAuth.d.ts +8 -0
  54. package/dist/infrastructure/generateAuth.js +17 -0
  55. package/dist/infrastructure/inputs.js +36 -0
  56. package/dist/infrastructure/wrangler.js +71 -0
  57. package/dist/kernel/authorization.d.ts +4 -0
  58. package/dist/kernel/authorization.js +16 -0
  59. package/dist/kernel/binds.d.ts +51 -0
  60. package/dist/kernel/binds.js +45 -0
  61. package/dist/kernel/caller-identity.d.ts +24 -0
  62. package/dist/kernel/caller-identity.js +22 -0
  63. package/dist/kernel/contract-error.d.ts +12 -0
  64. package/dist/kernel/contract-error.js +14 -0
  65. package/dist/kernel/contracts.d.ts +139 -0
  66. package/dist/kernel/contracts.js +92 -0
  67. package/dist/{spec/domain/service/CloudflareCron.d.ts → kernel/cron.d.ts} +0 -1
  68. package/dist/{spec/domain/service/CloudflareCron.js → kernel/cron.js} +1 -6
  69. package/dist/kernel/dialect/common.d.ts +39 -0
  70. package/dist/kernel/dialect/common.js +6 -0
  71. package/dist/kernel/dialect/postgres.d.ts +16 -0
  72. package/dist/kernel/dialect/postgres.js +18 -0
  73. package/dist/kernel/dialect/sqlite.d.ts +20 -0
  74. package/dist/kernel/dialect/sqlite.js +34 -0
  75. package/dist/kernel/driver/bun-sqlite.d.ts +19 -0
  76. package/dist/kernel/driver/bun-sqlite.js +77 -0
  77. package/dist/kernel/driver/d1.d.ts +24 -0
  78. package/dist/kernel/driver/d1.js +22 -0
  79. package/dist/kernel/driver/postgres.d.ts +25 -0
  80. package/dist/kernel/driver/postgres.js +95 -0
  81. package/dist/kernel/driver/transaction-context.d.ts +10 -0
  82. package/dist/kernel/driver/transaction-context.js +29 -0
  83. package/dist/kernel/email.d.ts +28 -0
  84. package/dist/{auth/emailTemplates.js → kernel/email.js} +13 -2
  85. package/dist/kernel/host-access.d.ts +10 -0
  86. package/dist/kernel/host-access.js +65 -0
  87. package/dist/kernel/host-caller.d.ts +38 -0
  88. package/dist/kernel/host-caller.js +55 -0
  89. package/dist/kernel/json-body.d.ts +4 -0
  90. package/dist/kernel/json-body.js +44 -0
  91. package/dist/kernel/mcp-apps.d.ts +49 -0
  92. package/dist/kernel/mcp-apps.js +40 -0
  93. package/dist/kernel/mcp-call.d.ts +5 -0
  94. package/dist/kernel/mcp-call.js +25 -0
  95. package/dist/kernel/mcp-handler.js +288 -0
  96. package/dist/kernel/mcp.d.ts +101 -0
  97. package/dist/kernel/mcp.js +25 -0
  98. package/dist/kernel/media.d.ts +27 -0
  99. package/dist/kernel/media.js +216 -0
  100. package/dist/kernel/paging.d.ts +55 -0
  101. package/dist/kernel/paging.js +95 -0
  102. package/dist/kernel/publishing.d.ts +4 -0
  103. package/dist/kernel/publishing.js +16 -0
  104. package/dist/{cloudflare/r2Media.d.ts → kernel/r2-media.d.ts} +4 -5
  105. package/dist/kernel/r2-media.js +78 -0
  106. package/dist/kernel/rest-dispatch.js +38 -0
  107. package/dist/kernel/rest-router.js +63 -0
  108. package/dist/kernel/rest.d.ts +58 -0
  109. package/dist/kernel/rest.js +41 -0
  110. package/dist/kernel/scalars.d.ts +6 -0
  111. package/dist/kernel/scalars.js +43 -0
  112. package/dist/kernel/search.js +5 -0
  113. package/dist/{core/site.d.ts → kernel/site-types.d.ts} +38 -9
  114. package/dist/kernel/site-types.js +1 -0
  115. package/dist/kernel/site.d.ts +41 -0
  116. package/dist/kernel/site.js +32 -0
  117. package/dist/kernel/store.d.ts +165 -0
  118. package/dist/kernel/store.js +257 -0
  119. package/dist/kernel/surface.d.ts +10 -0
  120. package/dist/kernel/surface.js +19 -0
  121. package/dist/kernel/sweep.d.ts +17 -0
  122. package/dist/kernel/sweep.js +27 -0
  123. package/dist/kernel/translations.d.ts +1 -0
  124. package/dist/kernel/translations.js +13 -0
  125. package/dist/kernel/user-caller.d.ts +31 -0
  126. package/dist/kernel/user-caller.js +67 -0
  127. package/dist/kernel/user-field-name.js +3 -0
  128. package/dist/kernel/user-fields.d.ts +34 -0
  129. package/dist/kernel/user-fields.js +71 -0
  130. package/dist/kernel/validation.d.ts +15 -0
  131. package/dist/kernel/validation.js +54 -0
  132. package/dist/kernel/web-gateway.js +68 -0
  133. package/dist/kernel/web-head.js +15 -0
  134. package/dist/kernel/web-response.js +8 -0
  135. package/dist/kernel/web.d.ts +75 -0
  136. package/dist/kernel/web.js +155 -0
  137. package/dist/kernel/where.js +27 -0
  138. package/dist/testing/index.d.ts +1 -37
  139. package/dist/testing/index.js +1 -43
  140. package/dist/usecase/adminBindings.js +142 -0
  141. package/dist/usecase/adminDescriptors.js +153 -0
  142. package/dist/usecase/generate.js +164 -0
  143. package/dist/usecase/handlers.js +21 -0
  144. package/dist/usecase/mcp-media.js +17 -0
  145. package/dist/usecase/mcp.js +96 -0
  146. package/dist/usecase/paging.js +72 -0
  147. package/dist/usecase/publishing.js +63 -0
  148. package/dist/usecase/refusals.js +27 -0
  149. package/dist/usecase/rest.js +54 -0
  150. package/dist/usecase/search.js +7 -0
  151. package/dist/usecase/site.js +40 -0
  152. package/dist/usecase/stores.js +62 -0
  153. package/dist/usecase/translations.js +78 -0
  154. package/dist/usecase/ttl.js +20 -0
  155. package/dist/usecase/validation.js +132 -0
  156. package/dist/usecase/web.js +22 -0
  157. package/docs/examples/README.md +31 -16
  158. package/docs/examples/app-shell/README.md +48 -0
  159. package/docs/examples/app-shell/package.json +34 -0
  160. package/docs/examples/app-shell/pnpm-workspace.yaml +8 -0
  161. package/docs/examples/app-shell/smoke-kit.mjs +100 -0
  162. package/docs/examples/app-shell/src/admin.ts +10 -0
  163. package/docs/examples/app-shell/src/auth.ts +55 -0
  164. package/docs/examples/app-shell/src/handlers.ts +5 -0
  165. package/docs/examples/app-shell/src/index.ts +4 -0
  166. package/docs/examples/app-shell/src/routes.ts +13 -0
  167. package/docs/examples/app-shell/src/schedule.ts +8 -0
  168. package/docs/examples/app-shell/src/service.ts +70 -0
  169. package/docs/examples/app-shell/src/sign-in.ts +41 -0
  170. package/docs/examples/app-shell/src/signup.ts +8 -0
  171. package/docs/examples/{reference-service → app-shell}/tsconfig.json +2 -1
  172. package/docs/examples/app-shell/worker-configuration.d.ts +22 -0
  173. package/docs/examples/app-shell/wrangler.jsonc +61 -0
  174. package/docs/examples/club-events/README.md +60 -0
  175. package/docs/examples/club-events/manifests/club-events.yaml +225 -0
  176. package/docs/examples/club-events/smoke.mjs +121 -0
  177. package/docs/examples/club-events/src/handlers.ts +25 -0
  178. package/docs/examples/club-events/src/signup.ts +9 -0
  179. package/docs/examples/generated-web/README.md +74 -0
  180. package/docs/examples/generated-web/posts.yaml +38 -0
  181. package/docs/examples/generated-web/seed.sql +6 -0
  182. package/docs/examples/generated-web/src/worker.ts +43 -0
  183. package/docs/examples/generated-web/tsconfig.json +8 -0
  184. package/docs/examples/generated-web/wrangler.jsonc +7 -0
  185. package/docs/examples/purchasing/.dev.vars.example +6 -0
  186. package/docs/examples/purchasing/README.md +90 -0
  187. package/docs/examples/purchasing/manifests/purchasing.yaml +341 -0
  188. package/docs/examples/purchasing/seed.sql +4 -0
  189. package/docs/examples/purchasing/smoke.mjs +171 -0
  190. package/docs/examples/purchasing/src/admin.ts +12 -0
  191. package/docs/examples/purchasing/src/handlers.ts +33 -0
  192. package/docs/examples/purchasing/src/notify.ts +29 -0
  193. package/docs/examples/purchasing/src/requests-page.ts +57 -0
  194. package/docs/examples/purchasing/src/routes.ts +53 -0
  195. package/docs/examples/purchasing/src/schedule.ts +31 -0
  196. package/docs/examples/purchasing/src/signup.ts +5 -0
  197. package/docs/examples/purchasing/src/supplier.ts +32 -0
  198. package/docs/examples/purchasing/wrangler.jsonc +68 -0
  199. package/docs/examples/recipes/README.md +58 -0
  200. package/docs/examples/recipes/manifests/recipes.yaml +75 -0
  201. package/docs/examples/recipes/smoke.mjs +102 -0
  202. package/docs/examples/recipes/src/media.ts +13 -0
  203. package/docs/examples/recipes/src/pages.ts +99 -0
  204. package/docs/examples/recipes/src/routes.ts +71 -0
  205. package/docs/examples/recipes/src/site-config.ts +12 -0
  206. package/docs/examples/recipes/wrangler.jsonc +73 -0
  207. package/docs/handbook/cloudflare/authentication.md +142 -212
  208. package/docs/handbook/cloudflare/chatgpt-sites.md +4 -113
  209. package/docs/handbook/cloudflare/deploy-and-operate.md +20 -103
  210. package/docs/handbook/cloudflare/media-r2.md +62 -133
  211. package/docs/handbook/cloudflare/service-entry.md +180 -116
  212. package/docs/handbook/concepts/authorization.md +10 -123
  213. package/docs/handbook/concepts/four-atoms.md +9 -92
  214. package/docs/handbook/concepts/lifecycle-and-locales.md +9 -80
  215. package/docs/handbook/concepts/mcp-and-agents.md +10 -141
  216. package/docs/handbook/concepts/procedures-and-triggers.md +5 -162
  217. package/docs/handbook/concepts/runtime-and-adapters.md +15 -183
  218. package/docs/handbook/concepts/views.md +10 -109
  219. package/docs/handbook/examples/hub.md +2 -18
  220. package/docs/handbook/guides/adapter-guide.md +11 -0
  221. package/docs/handbook/guides/admin-extensions.md +20 -0
  222. package/docs/handbook/guides/admin-ui.md +5 -163
  223. package/docs/handbook/guides/agent-setup.md +5 -18
  224. package/docs/handbook/guides/email.md +86 -0
  225. package/docs/handbook/guides/mcp-apps.md +44 -0
  226. package/docs/handbook/guides/native-admin.md +298 -0
  227. package/docs/handbook/guides/native-execution.md +132 -0
  228. package/docs/handbook/guides/oauth.md +105 -0
  229. package/docs/handbook/guides/postgres-adapters.md +56 -0
  230. package/docs/handbook/guides/public-pages.md +53 -0
  231. package/docs/handbook/guides/size-and-startup.md +9 -0
  232. package/docs/handbook/guides/typed-queries.md +39 -102
  233. package/docs/handbook/navigation.json +164 -30
  234. package/docs/handbook/reference/admin-descriptors.md +88 -0
  235. package/docs/handbook/reference/authorization.md +44 -52
  236. package/docs/handbook/reference/describe.md +56 -0
  237. package/docs/handbook/reference/diagnostics.md +15 -78
  238. package/docs/handbook/reference/features.md +45 -53
  239. package/docs/handbook/reference/manifest.md +6 -69
  240. package/docs/handbook/reference/procedure.md +9 -117
  241. package/docs/handbook/reference/schema.md +65 -172
  242. package/docs/handbook/reference/site-config.md +5 -65
  243. package/docs/handbook/reference/surface.md +279 -93
  244. package/docs/handbook/reference/trigger.md +24 -93
  245. package/docs/handbook/reference/view.md +32 -158
  246. package/docs/handbook/releases/index.md +124 -15
  247. package/docs/handbook/start/overview.md +9 -56
  248. package/docs/handbook/start/project-and-cli.md +40 -141
  249. package/docs/handbook/start/quickstart-worker.md +38 -116
  250. package/docs/skills/develop/SKILL.md +34 -117
  251. package/docs/skills/develop/mcp-app.md +37 -77
  252. package/docs/skills/integrate/SKILL.md +42 -84
  253. package/docs/skills/media-gc/SKILL.md +14 -3
  254. package/docs/skills/provision/SKILL.md +25 -88
  255. package/docs/skills/update/SKILL.md +19 -40
  256. package/docs/source/scripts/postgres-adapter.ts +101 -0
  257. package/docs/upgrade-0.1-to-0.2.md +26 -10
  258. package/package.json +97 -112
  259. package/skills/.keep +0 -0
  260. package/skills/README.md +72 -0
  261. package/skills/mantle/SKILL.md +135 -0
  262. package/skills/mantle/references/local-testing.md +11 -0
  263. package/skills/mantle/references/web.md +41 -0
  264. package/skills/mantle/references/website.md +47 -0
  265. package/dist/admin/consent.d.ts +0 -17
  266. package/dist/admin/consent.d.ts.map +0 -1
  267. package/dist/admin/consent.js +0 -17
  268. package/dist/admin/consent.js.map +0 -1
  269. package/dist/admin/createAdminSurface.d.ts +0 -22
  270. package/dist/admin/createAdminSurface.d.ts.map +0 -1
  271. package/dist/admin/createAdminSurface.js +0 -592
  272. package/dist/admin/createAdminSurface.js.map +0 -1
  273. package/dist/admin/design.d.ts +0 -7
  274. package/dist/admin/design.d.ts.map +0 -1
  275. package/dist/admin/design.js +0 -18
  276. package/dist/admin/design.js.map +0 -1
  277. package/dist/admin/developerConsole.d.ts +0 -267
  278. package/dist/admin/developerConsole.d.ts.map +0 -1
  279. package/dist/admin/developerConsole.js +0 -136
  280. package/dist/admin/developerConsole.js.map +0 -1
  281. package/dist/admin/identity.d.ts +0 -62
  282. package/dist/admin/identity.d.ts.map +0 -1
  283. package/dist/admin/identity.js +0 -7
  284. package/dist/admin/identity.js.map +0 -1
  285. package/dist/admin/index.d.ts +0 -6
  286. package/dist/admin/index.d.ts.map +0 -1
  287. package/dist/admin/index.js +0 -6
  288. package/dist/admin/index.js.map +0 -1
  289. package/dist/admin/procedureFlow.d.ts +0 -38
  290. package/dist/admin/procedureFlow.d.ts.map +0 -1
  291. package/dist/admin/procedureFlow.js +0 -188
  292. package/dist/admin/procedureFlow.js.map +0 -1
  293. package/dist/auth/ConsoleEmailSender.d.ts +0 -15
  294. package/dist/auth/ConsoleEmailSender.d.ts.map +0 -1
  295. package/dist/auth/ConsoleEmailSender.js +0 -19
  296. package/dist/auth/ConsoleEmailSender.js.map +0 -1
  297. package/dist/auth/appleClientSecret.d.ts +0 -75
  298. package/dist/auth/appleClientSecret.d.ts.map +0 -1
  299. package/dist/auth/appleClientSecret.js +0 -116
  300. package/dist/auth/appleClientSecret.js.map +0 -1
  301. package/dist/auth/buildAuth.d.ts +0 -4566
  302. package/dist/auth/buildAuth.d.ts.map +0 -1
  303. package/dist/auth/buildAuth.js +0 -311
  304. package/dist/auth/buildAuth.js.map +0 -1
  305. package/dist/auth/callerResolver.d.ts +0 -48
  306. package/dist/auth/callerResolver.d.ts.map +0 -1
  307. package/dist/auth/callerResolver.js +0 -49
  308. package/dist/auth/callerResolver.js.map +0 -1
  309. package/dist/auth/createAuthRoutes.d.ts +0 -22
  310. package/dist/auth/createAuthRoutes.d.ts.map +0 -1
  311. package/dist/auth/createAuthRoutes.js.map +0 -1
  312. package/dist/auth/createMantleAuth.d.ts +0 -3
  313. package/dist/auth/createMantleAuth.d.ts.map +0 -1
  314. package/dist/auth/createMantleAuth.js +0 -503
  315. package/dist/auth/createMantleAuth.js.map +0 -1
  316. package/dist/auth/db.d.ts +0 -17
  317. package/dist/auth/db.d.ts.map +0 -1
  318. package/dist/auth/db.js +0 -24
  319. package/dist/auth/db.js.map +0 -1
  320. package/dist/auth/emailTemplates.d.ts +0 -7
  321. package/dist/auth/emailTemplates.d.ts.map +0 -1
  322. package/dist/auth/emailTemplates.js.map +0 -1
  323. package/dist/auth/index.d.ts +0 -9
  324. package/dist/auth/index.d.ts.map +0 -1
  325. package/dist/auth/index.js +0 -7
  326. package/dist/auth/index.js.map +0 -1
  327. package/dist/auth/methods.d.ts +0 -717
  328. package/dist/auth/methods.d.ts.map +0 -1
  329. package/dist/auth/methods.js +0 -321
  330. package/dist/auth/methods.js.map +0 -1
  331. package/dist/auth/oauthTokens.d.ts +0 -24
  332. package/dist/auth/oauthTokens.d.ts.map +0 -1
  333. package/dist/auth/oauthTokens.js +0 -146
  334. package/dist/auth/oauthTokens.js.map +0 -1
  335. package/dist/auth/setupIncomplete.d.ts +0 -16
  336. package/dist/auth/setupIncomplete.d.ts.map +0 -1
  337. package/dist/auth/setupIncomplete.js +0 -50
  338. package/dist/auth/setupIncomplete.js.map +0 -1
  339. package/dist/auth/types.d.ts +0 -440
  340. package/dist/auth/types.d.ts.map +0 -1
  341. package/dist/auth/types.js +0 -10
  342. package/dist/auth/types.js.map +0 -1
  343. package/dist/bun/index.d.ts +0 -65
  344. package/dist/bun/index.d.ts.map +0 -1
  345. package/dist/bun/index.js +0 -130
  346. package/dist/bun/index.js.map +0 -1
  347. package/dist/cli/emitModule.d.ts +0 -7
  348. package/dist/cli/emitModule.d.ts.map +0 -1
  349. package/dist/cli/emitModule.js +0 -127
  350. package/dist/cli/emitModule.js.map +0 -1
  351. package/dist/cli/generate.d.ts +0 -8
  352. package/dist/cli/generate.d.ts.map +0 -1
  353. package/dist/cli/generate.js +0 -391
  354. package/dist/cli/generate.js.map +0 -1
  355. package/dist/cli/main.d.ts +0 -3
  356. package/dist/cli/main.d.ts.map +0 -1
  357. package/dist/cli/main.js +0 -21
  358. package/dist/cli/main.js.map +0 -1
  359. package/dist/cli/preset.d.ts +0 -18
  360. package/dist/cli/preset.d.ts.map +0 -1
  361. package/dist/cli/preset.js +0 -353
  362. package/dist/cli/preset.js.map +0 -1
  363. package/dist/cloudflare/index.d.ts +0 -21
  364. package/dist/cloudflare/index.d.ts.map +0 -1
  365. package/dist/cloudflare/index.js +0 -14
  366. package/dist/cloudflare/index.js.map +0 -1
  367. package/dist/cloudflare/r2Media.d.ts.map +0 -1
  368. package/dist/cloudflare/r2Media.js +0 -69
  369. package/dist/cloudflare/r2Media.js.map +0 -1
  370. package/dist/core/caller.d.ts +0 -35
  371. package/dist/core/caller.d.ts.map +0 -1
  372. package/dist/core/caller.js +0 -3
  373. package/dist/core/caller.js.map +0 -1
  374. package/dist/core/createMantle.d.ts +0 -22
  375. package/dist/core/createMantle.d.ts.map +0 -1
  376. package/dist/core/createMantle.js +0 -117
  377. package/dist/core/createMantle.js.map +0 -1
  378. package/dist/core/dialect.d.ts +0 -41
  379. package/dist/core/dialect.d.ts.map +0 -1
  380. package/dist/core/dialect.js +0 -7
  381. package/dist/core/dialect.js.map +0 -1
  382. package/dist/core/driver.d.ts +0 -17
  383. package/dist/core/driver.d.ts.map +0 -1
  384. package/dist/core/driver.js +0 -2
  385. package/dist/core/driver.js.map +0 -1
  386. package/dist/core/email.d.ts +0 -17
  387. package/dist/core/email.d.ts.map +0 -1
  388. package/dist/core/email.js +0 -2
  389. package/dist/core/email.js.map +0 -1
  390. package/dist/core/index.d.ts +0 -16
  391. package/dist/core/index.d.ts.map +0 -1
  392. package/dist/core/index.js +0 -16
  393. package/dist/core/index.js.map +0 -1
  394. package/dist/core/invocation.d.ts +0 -66
  395. package/dist/core/invocation.d.ts.map +0 -1
  396. package/dist/core/invocation.js +0 -3
  397. package/dist/core/invocation.js.map +0 -1
  398. package/dist/core/observation.d.ts +0 -3
  399. package/dist/core/observation.d.ts.map +0 -1
  400. package/dist/core/observation.js +0 -10
  401. package/dist/core/observation.js.map +0 -1
  402. package/dist/core/runtime/auth.d.ts +0 -9
  403. package/dist/core/runtime/auth.d.ts.map +0 -1
  404. package/dist/core/runtime/auth.js +0 -39
  405. package/dist/core/runtime/auth.js.map +0 -1
  406. package/dist/core/runtime/createRuntime.d.ts +0 -23
  407. package/dist/core/runtime/createRuntime.d.ts.map +0 -1
  408. package/dist/core/runtime/createRuntime.js +0 -214
  409. package/dist/core/runtime/createRuntime.js.map +0 -1
  410. package/dist/core/runtime/verifyPlan.d.ts +0 -34
  411. package/dist/core/runtime/verifyPlan.d.ts.map +0 -1
  412. package/dist/core/runtime/verifyPlan.js +0 -301
  413. package/dist/core/runtime/verifyPlan.js.map +0 -1
  414. package/dist/core/service.d.ts +0 -45
  415. package/dist/core/service.d.ts.map +0 -1
  416. package/dist/core/service.js +0 -2
  417. package/dist/core/service.js.map +0 -1
  418. package/dist/core/site.d.ts.map +0 -1
  419. package/dist/core/site.js +0 -2
  420. package/dist/core/site.js.map +0 -1
  421. package/dist/core/siteConfig.d.ts +0 -5
  422. package/dist/core/siteConfig.d.ts.map +0 -1
  423. package/dist/core/siteConfig.js +0 -24
  424. package/dist/core/siteConfig.js.map +0 -1
  425. package/dist/core/sql/allowlist.d.ts +0 -65
  426. package/dist/core/sql/allowlist.d.ts.map +0 -1
  427. package/dist/core/sql/allowlist.js +0 -705
  428. package/dist/core/sql/allowlist.js.map +0 -1
  429. package/dist/core/sql/ast.d.ts +0 -24
  430. package/dist/core/sql/ast.d.ts.map +0 -1
  431. package/dist/core/sql/ast.js +0 -32
  432. package/dist/core/sql/ast.js.map +0 -1
  433. package/dist/core/sql/compile.d.ts +0 -50
  434. package/dist/core/sql/compile.d.ts.map +0 -1
  435. package/dist/core/sql/compile.js +0 -48
  436. package/dist/core/sql/compile.js.map +0 -1
  437. package/dist/core/sql/policy.d.ts +0 -121
  438. package/dist/core/sql/policy.d.ts.map +0 -1
  439. package/dist/core/sql/policy.js +0 -379
  440. package/dist/core/sql/policy.js.map +0 -1
  441. package/dist/core/sql/positions.d.ts +0 -30
  442. package/dist/core/sql/positions.d.ts.map +0 -1
  443. package/dist/core/sql/positions.js +0 -22
  444. package/dist/core/sql/positions.js.map +0 -1
  445. package/dist/core/sql/run.d.ts +0 -76
  446. package/dist/core/sql/run.d.ts.map +0 -1
  447. package/dist/core/sql/run.js +0 -267
  448. package/dist/core/sql/run.js.map +0 -1
  449. package/dist/core/store/createStore.d.ts +0 -49
  450. package/dist/core/store/createStore.d.ts.map +0 -1
  451. package/dist/core/store/createStore.js +0 -227
  452. package/dist/core/store/createStore.js.map +0 -1
  453. package/dist/core/store/cursor.d.ts +0 -4
  454. package/dist/core/store/cursor.d.ts.map +0 -1
  455. package/dist/core/store/cursor.js +0 -22
  456. package/dist/core/store/cursor.js.map +0 -1
  457. package/dist/core/store/json.d.ts +0 -80
  458. package/dist/core/store/json.d.ts.map +0 -1
  459. package/dist/core/store/json.js +0 -342
  460. package/dist/core/store/json.js.map +0 -1
  461. package/dist/core/store.d.ts +0 -160
  462. package/dist/core/store.d.ts.map +0 -1
  463. package/dist/core/store.js +0 -2
  464. package/dist/core/store.js.map +0 -1
  465. package/dist/core/wire.d.ts +0 -20
  466. package/dist/core/wire.d.ts.map +0 -1
  467. package/dist/core/wire.js +0 -84
  468. package/dist/core/wire.js.map +0 -1
  469. package/dist/core/withCaller.d.ts +0 -24
  470. package/dist/core/withCaller.d.ts.map +0 -1
  471. package/dist/core/withCaller.js +0 -35
  472. package/dist/core/withCaller.js.map +0 -1
  473. package/dist/d1/adapter.d.ts +0 -12
  474. package/dist/d1/adapter.d.ts.map +0 -1
  475. package/dist/d1/adapter.js +0 -23
  476. package/dist/d1/adapter.js.map +0 -1
  477. package/dist/d1/codec.d.ts +0 -14
  478. package/dist/d1/codec.d.ts.map +0 -1
  479. package/dist/d1/codec.js +0 -136
  480. package/dist/d1/codec.js.map +0 -1
  481. package/dist/d1/compile/index.d.ts +0 -9
  482. package/dist/d1/compile/index.d.ts.map +0 -1
  483. package/dist/d1/compile/index.js +0 -9
  484. package/dist/d1/compile/index.js.map +0 -1
  485. package/dist/d1/dialect.d.ts +0 -4
  486. package/dist/d1/dialect.d.ts.map +0 -1
  487. package/dist/d1/dialect.js +0 -13
  488. package/dist/d1/dialect.js.map +0 -1
  489. package/dist/d1/executor.d.ts +0 -13
  490. package/dist/d1/executor.d.ts.map +0 -1
  491. package/dist/d1/executor.js +0 -91
  492. package/dist/d1/executor.js.map +0 -1
  493. package/dist/d1/index.d.ts +0 -6
  494. package/dist/d1/index.d.ts.map +0 -1
  495. package/dist/d1/index.js +0 -6
  496. package/dist/d1/index.js.map +0 -1
  497. package/dist/d1/lower.d.ts +0 -8
  498. package/dist/d1/lower.d.ts.map +0 -1
  499. package/dist/d1/lower.js +0 -167
  500. package/dist/d1/lower.js.map +0 -1
  501. package/dist/d1/media.d.ts +0 -5
  502. package/dist/d1/media.d.ts.map +0 -1
  503. package/dist/d1/media.js +0 -157
  504. package/dist/d1/media.js.map +0 -1
  505. package/dist/d1/migrations.d.ts +0 -12
  506. package/dist/d1/migrations.d.ts.map +0 -1
  507. package/dist/d1/migrations.js +0 -111
  508. package/dist/d1/migrations.js.map +0 -1
  509. package/dist/d1/print.d.ts +0 -28
  510. package/dist/d1/print.d.ts.map +0 -1
  511. package/dist/d1/print.js +0 -54
  512. package/dist/d1/print.js.map +0 -1
  513. package/dist/d1/site.d.ts +0 -17
  514. package/dist/d1/site.d.ts.map +0 -1
  515. package/dist/d1/site.js +0 -63
  516. package/dist/d1/site.js.map +0 -1
  517. package/dist/d1/storage.d.ts +0 -34
  518. package/dist/d1/storage.d.ts.map +0 -1
  519. package/dist/d1/storage.js +0 -288
  520. package/dist/d1/storage.js.map +0 -1
  521. package/dist/d1/tz.d.ts +0 -21
  522. package/dist/d1/tz.d.ts.map +0 -1
  523. package/dist/d1/tz.js +0 -54
  524. package/dist/d1/tz.js.map +0 -1
  525. package/dist/d1/validator.d.ts +0 -10
  526. package/dist/d1/validator.d.ts.map +0 -1
  527. package/dist/d1/validator.js +0 -33
  528. package/dist/d1/validator.js.map +0 -1
  529. package/dist/mcp/apps.d.ts +0 -43
  530. package/dist/mcp/apps.d.ts.map +0 -1
  531. package/dist/mcp/apps.js +0 -57
  532. package/dist/mcp/apps.js.map +0 -1
  533. package/dist/mcp/catalog.d.ts +0 -55
  534. package/dist/mcp/catalog.d.ts.map +0 -1
  535. package/dist/mcp/catalog.js +0 -81
  536. package/dist/mcp/catalog.js.map +0 -1
  537. package/dist/mcp/createMcpSurface.d.ts +0 -60
  538. package/dist/mcp/createMcpSurface.d.ts.map +0 -1
  539. package/dist/mcp/createMcpSurface.js +0 -182
  540. package/dist/mcp/createMcpSurface.js.map +0 -1
  541. package/dist/mcp/index.d.ts +0 -4
  542. package/dist/mcp/index.d.ts.map +0 -1
  543. package/dist/mcp/index.js +0 -4
  544. package/dist/mcp/index.js.map +0 -1
  545. package/dist/mcp/media.d.ts +0 -9
  546. package/dist/mcp/media.d.ts.map +0 -1
  547. package/dist/mcp/media.js +0 -33
  548. package/dist/mcp/media.js.map +0 -1
  549. package/dist/postgres/adapter.d.ts +0 -20
  550. package/dist/postgres/adapter.d.ts.map +0 -1
  551. package/dist/postgres/adapter.js +0 -44
  552. package/dist/postgres/adapter.js.map +0 -1
  553. package/dist/postgres/codec.d.ts +0 -13
  554. package/dist/postgres/codec.d.ts.map +0 -1
  555. package/dist/postgres/codec.js +0 -110
  556. package/dist/postgres/codec.js.map +0 -1
  557. package/dist/postgres/compile/index.d.ts +0 -9
  558. package/dist/postgres/compile/index.d.ts.map +0 -1
  559. package/dist/postgres/compile/index.js +0 -9
  560. package/dist/postgres/compile/index.js.map +0 -1
  561. package/dist/postgres/driver.d.ts +0 -92
  562. package/dist/postgres/driver.d.ts.map +0 -1
  563. package/dist/postgres/driver.js +0 -110
  564. package/dist/postgres/driver.js.map +0 -1
  565. package/dist/postgres/executor.d.ts +0 -20
  566. package/dist/postgres/executor.d.ts.map +0 -1
  567. package/dist/postgres/executor.js +0 -69
  568. package/dist/postgres/executor.js.map +0 -1
  569. package/dist/postgres/index.d.ts +0 -7
  570. package/dist/postgres/index.d.ts.map +0 -1
  571. package/dist/postgres/index.js +0 -7
  572. package/dist/postgres/index.js.map +0 -1
  573. package/dist/postgres/lower.d.ts +0 -6
  574. package/dist/postgres/lower.d.ts.map +0 -1
  575. package/dist/postgres/lower.js +0 -157
  576. package/dist/postgres/lower.js.map +0 -1
  577. package/dist/postgres/print.d.ts +0 -11
  578. package/dist/postgres/print.d.ts.map +0 -1
  579. package/dist/postgres/print.js +0 -121
  580. package/dist/postgres/print.js.map +0 -1
  581. package/dist/postgres/storage.d.ts +0 -19
  582. package/dist/postgres/storage.d.ts.map +0 -1
  583. package/dist/postgres/storage.js +0 -201
  584. package/dist/postgres/storage.js.map +0 -1
  585. package/dist/postgres/textRows.d.ts +0 -10
  586. package/dist/postgres/textRows.d.ts.map +0 -1
  587. package/dist/postgres/textRows.js +0 -44
  588. package/dist/postgres/textRows.js.map +0 -1
  589. package/dist/postgres/validator.d.ts +0 -12
  590. package/dist/postgres/validator.d.ts.map +0 -1
  591. package/dist/postgres/validator.js +0 -46
  592. package/dist/postgres/validator.js.map +0 -1
  593. package/dist/spec/domain/index.d.ts +0 -3
  594. package/dist/spec/domain/index.d.ts.map +0 -1
  595. package/dist/spec/domain/index.js +0 -3
  596. package/dist/spec/domain/index.js.map +0 -1
  597. package/dist/spec/domain/model/ContentState.d.ts +0 -8
  598. package/dist/spec/domain/model/ContentState.d.ts.map +0 -1
  599. package/dist/spec/domain/model/ContentState.js +0 -7
  600. package/dist/spec/domain/model/ContentState.js.map +0 -1
  601. package/dist/spec/domain/model/Entry.d.ts +0 -29
  602. package/dist/spec/domain/model/Entry.d.ts.map +0 -1
  603. package/dist/spec/domain/model/Entry.js +0 -16
  604. package/dist/spec/domain/model/Entry.js.map +0 -1
  605. package/dist/spec/domain/model/Locale.d.ts +0 -30
  606. package/dist/spec/domain/model/Locale.d.ts.map +0 -1
  607. package/dist/spec/domain/model/Locale.js +0 -33
  608. package/dist/spec/domain/model/Locale.js.map +0 -1
  609. package/dist/spec/domain/model/ManifestGrammar.d.ts.map +0 -1
  610. package/dist/spec/domain/model/ManifestGrammar.js +0 -149
  611. package/dist/spec/domain/model/ManifestGrammar.js.map +0 -1
  612. package/dist/spec/domain/model/MediaMimeAccept.d.ts +0 -55
  613. package/dist/spec/domain/model/MediaMimeAccept.d.ts.map +0 -1
  614. package/dist/spec/domain/model/MediaMimeAccept.js +0 -90
  615. package/dist/spec/domain/model/MediaMimeAccept.js.map +0 -1
  616. package/dist/spec/domain/model/RuntimePlan.d.ts.map +0 -1
  617. package/dist/spec/domain/model/RuntimePlan.js +0 -4
  618. package/dist/spec/domain/model/RuntimePlan.js.map +0 -1
  619. package/dist/spec/domain/model/SiteConfig.d.ts +0 -173
  620. package/dist/spec/domain/model/SiteConfig.d.ts.map +0 -1
  621. package/dist/spec/domain/model/SiteConfig.js +0 -13
  622. package/dist/spec/domain/model/SiteConfig.js.map +0 -1
  623. package/dist/spec/domain/model/SqlIr.d.ts.map +0 -1
  624. package/dist/spec/domain/model/SqlIr.js +0 -95
  625. package/dist/spec/domain/model/SqlIr.js.map +0 -1
  626. package/dist/spec/domain/model/index.d.ts +0 -14
  627. package/dist/spec/domain/model/index.d.ts.map +0 -1
  628. package/dist/spec/domain/model/index.js +0 -14
  629. package/dist/spec/domain/model/index.js.map +0 -1
  630. package/dist/spec/domain/service/CloudflareCron.d.ts.map +0 -1
  631. package/dist/spec/domain/service/CloudflareCron.js.map +0 -1
  632. package/dist/spec/domain/service/CrossSchemaChecker.d.ts +0 -34
  633. package/dist/spec/domain/service/CrossSchemaChecker.d.ts.map +0 -1
  634. package/dist/spec/domain/service/CrossSchemaChecker.js +0 -114
  635. package/dist/spec/domain/service/CrossSchemaChecker.js.map +0 -1
  636. package/dist/spec/domain/service/EntryDataValidator.d.ts +0 -56
  637. package/dist/spec/domain/service/EntryDataValidator.d.ts.map +0 -1
  638. package/dist/spec/domain/service/EntryDataValidator.js +0 -88
  639. package/dist/spec/domain/service/EntryDataValidator.js.map +0 -1
  640. package/dist/spec/domain/service/JsonSchemaToZod.d.ts +0 -29
  641. package/dist/spec/domain/service/JsonSchemaToZod.d.ts.map +0 -1
  642. package/dist/spec/domain/service/JsonSchemaToZod.js +0 -156
  643. package/dist/spec/domain/service/JsonSchemaToZod.js.map +0 -1
  644. package/dist/spec/domain/service/LifecycleStateMachine.d.ts +0 -75
  645. package/dist/spec/domain/service/LifecycleStateMachine.d.ts.map +0 -1
  646. package/dist/spec/domain/service/LifecycleStateMachine.js +0 -76
  647. package/dist/spec/domain/service/LifecycleStateMachine.js.map +0 -1
  648. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts +0 -29
  649. package/dist/spec/domain/service/LocaleCanonicalizer.d.ts.map +0 -1
  650. package/dist/spec/domain/service/LocaleCanonicalizer.js +0 -96
  651. package/dist/spec/domain/service/LocaleCanonicalizer.js.map +0 -1
  652. package/dist/spec/domain/service/ManifestFieldChecks.d.ts +0 -60
  653. package/dist/spec/domain/service/ManifestFieldChecks.d.ts.map +0 -1
  654. package/dist/spec/domain/service/ManifestFieldChecks.js +0 -116
  655. package/dist/spec/domain/service/ManifestFieldChecks.js.map +0 -1
  656. package/dist/spec/domain/service/ManifestGraphValidator.d.ts +0 -15
  657. package/dist/spec/domain/service/ManifestGraphValidator.d.ts.map +0 -1
  658. package/dist/spec/domain/service/ManifestGraphValidator.js +0 -225
  659. package/dist/spec/domain/service/ManifestGraphValidator.js.map +0 -1
  660. package/dist/spec/domain/service/ManifestLinker.d.ts +0 -45
  661. package/dist/spec/domain/service/ManifestLinker.d.ts.map +0 -1
  662. package/dist/spec/domain/service/ManifestLinker.js +0 -92
  663. package/dist/spec/domain/service/ManifestLinker.js.map +0 -1
  664. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts +0 -16
  665. package/dist/spec/domain/service/ManifestLocaleTrimmer.d.ts.map +0 -1
  666. package/dist/spec/domain/service/ManifestLocaleTrimmer.js +0 -76
  667. package/dist/spec/domain/service/ManifestLocaleTrimmer.js.map +0 -1
  668. package/dist/spec/domain/service/ManifestParser.d.ts +0 -49
  669. package/dist/spec/domain/service/ManifestParser.d.ts.map +0 -1
  670. package/dist/spec/domain/service/ManifestParser.js +0 -203
  671. package/dist/spec/domain/service/ManifestParser.js.map +0 -1
  672. package/dist/spec/domain/service/ManifestPartition.d.ts +0 -9
  673. package/dist/spec/domain/service/ManifestPartition.d.ts.map +0 -1
  674. package/dist/spec/domain/service/ManifestPartition.js +0 -19
  675. package/dist/spec/domain/service/ManifestPartition.js.map +0 -1
  676. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts +0 -33
  677. package/dist/spec/domain/service/ManifestPathDiagnoser.d.ts.map +0 -1
  678. package/dist/spec/domain/service/ManifestPathDiagnoser.js +0 -43
  679. package/dist/spec/domain/service/ManifestPathDiagnoser.js.map +0 -1
  680. package/dist/spec/domain/service/ManifestSourceSpans.d.ts +0 -10
  681. package/dist/spec/domain/service/ManifestSourceSpans.d.ts.map +0 -1
  682. package/dist/spec/domain/service/ManifestSourceSpans.js +0 -76
  683. package/dist/spec/domain/service/ManifestSourceSpans.js.map +0 -1
  684. package/dist/spec/domain/service/McpToolNaming.d.ts +0 -25
  685. package/dist/spec/domain/service/McpToolNaming.d.ts.map +0 -1
  686. package/dist/spec/domain/service/McpToolNaming.js +0 -50
  687. package/dist/spec/domain/service/McpToolNaming.js.map +0 -1
  688. package/dist/spec/domain/service/PlanFingerprint.d.ts.map +0 -1
  689. package/dist/spec/domain/service/PlanFingerprint.js +0 -14
  690. package/dist/spec/domain/service/PlanFingerprint.js.map +0 -1
  691. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts +0 -4
  692. package/dist/spec/domain/service/ProcedureViewSpecChecks.d.ts.map +0 -1
  693. package/dist/spec/domain/service/ProcedureViewSpecChecks.js +0 -211
  694. package/dist/spec/domain/service/ProcedureViewSpecChecks.js.map +0 -1
  695. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts +0 -42
  696. package/dist/spec/domain/service/SchemaAdminUiChecker.d.ts.map +0 -1
  697. package/dist/spec/domain/service/SchemaAdminUiChecker.js +0 -289
  698. package/dist/spec/domain/service/SchemaAdminUiChecker.js.map +0 -1
  699. package/dist/spec/domain/service/SchemaIndexChecker.d.ts +0 -33
  700. package/dist/spec/domain/service/SchemaIndexChecker.d.ts.map +0 -1
  701. package/dist/spec/domain/service/SchemaIndexChecker.js +0 -256
  702. package/dist/spec/domain/service/SchemaIndexChecker.js.map +0 -1
  703. package/dist/spec/domain/service/SchemaSearchChecker.d.ts +0 -11
  704. package/dist/spec/domain/service/SchemaSearchChecker.d.ts.map +0 -1
  705. package/dist/spec/domain/service/SchemaSearchChecker.js +0 -78
  706. package/dist/spec/domain/service/SchemaSearchChecker.js.map +0 -1
  707. package/dist/spec/domain/service/SchemaSpecChecks.d.ts +0 -31
  708. package/dist/spec/domain/service/SchemaSpecChecks.d.ts.map +0 -1
  709. package/dist/spec/domain/service/SchemaSpecChecks.js +0 -445
  710. package/dist/spec/domain/service/SchemaSpecChecks.js.map +0 -1
  711. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts +0 -39
  712. package/dist/spec/domain/service/SiteDefaultsValidator.d.ts.map +0 -1
  713. package/dist/spec/domain/service/SiteDefaultsValidator.js +0 -194
  714. package/dist/spec/domain/service/SiteDefaultsValidator.js.map +0 -1
  715. package/dist/spec/domain/service/SqlClassify.d.ts +0 -19
  716. package/dist/spec/domain/service/SqlClassify.d.ts.map +0 -1
  717. package/dist/spec/domain/service/SqlClassify.js +0 -42
  718. package/dist/spec/domain/service/SqlClassify.js.map +0 -1
  719. package/dist/spec/domain/service/SqlRefusal.d.ts +0 -16
  720. package/dist/spec/domain/service/SqlRefusal.d.ts.map +0 -1
  721. package/dist/spec/domain/service/SqlRefusal.js +0 -20
  722. package/dist/spec/domain/service/SqlRefusal.js.map +0 -1
  723. package/dist/spec/domain/service/SqlTypes.d.ts +0 -40
  724. package/dist/spec/domain/service/SqlTypes.d.ts.map +0 -1
  725. package/dist/spec/domain/service/SqlTypes.js +0 -110
  726. package/dist/spec/domain/service/SqlTypes.js.map +0 -1
  727. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts +0 -3
  728. package/dist/spec/domain/service/StaffRoleHierarchy.d.ts.map +0 -1
  729. package/dist/spec/domain/service/StaffRoleHierarchy.js +0 -19
  730. package/dist/spec/domain/service/StaffRoleHierarchy.js.map +0 -1
  731. package/dist/spec/domain/service/TriggerGraphChecks.d.ts +0 -16
  732. package/dist/spec/domain/service/TriggerGraphChecks.d.ts.map +0 -1
  733. package/dist/spec/domain/service/TriggerGraphChecks.js +0 -337
  734. package/dist/spec/domain/service/TriggerGraphChecks.js.map +0 -1
  735. package/dist/spec/domain/service/TriggerSpecChecks.d.ts +0 -4
  736. package/dist/spec/domain/service/TriggerSpecChecks.d.ts.map +0 -1
  737. package/dist/spec/domain/service/TriggerSpecChecks.js +0 -89
  738. package/dist/spec/domain/service/TriggerSpecChecks.js.map +0 -1
  739. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts +0 -11
  740. package/dist/spec/domain/service/ValidatedAdminUiProjection.d.ts.map +0 -1
  741. package/dist/spec/domain/service/ValidatedAdminUiProjection.js +0 -26
  742. package/dist/spec/domain/service/ValidatedAdminUiProjection.js.map +0 -1
  743. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts +0 -14
  744. package/dist/spec/domain/service/ViewAdminUiChecker.d.ts.map +0 -1
  745. package/dist/spec/domain/service/ViewAdminUiChecker.js +0 -53
  746. package/dist/spec/domain/service/ViewAdminUiChecker.js.map +0 -1
  747. package/dist/spec/domain/service/index.d.ts +0 -24
  748. package/dist/spec/domain/service/index.d.ts.map +0 -1
  749. package/dist/spec/domain/service/index.js +0 -24
  750. package/dist/spec/domain/service/index.js.map +0 -1
  751. package/dist/spec/index.d.ts +0 -10
  752. package/dist/spec/index.d.ts.map +0 -1
  753. package/dist/spec/index.js +0 -12
  754. package/dist/spec/index.js.map +0 -1
  755. package/dist/spec/infrastructure/cli/parseArgsError.d.ts +0 -16
  756. package/dist/spec/infrastructure/cli/parseArgsError.d.ts.map +0 -1
  757. package/dist/spec/infrastructure/cli/parseArgsError.js +0 -34
  758. package/dist/spec/infrastructure/cli/parseArgsError.js.map +0 -1
  759. package/dist/spec/infrastructure/index.d.ts +0 -2
  760. package/dist/spec/infrastructure/index.d.ts.map +0 -1
  761. package/dist/spec/infrastructure/index.js +0 -2
  762. package/dist/spec/infrastructure/index.js.map +0 -1
  763. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts +0 -18
  764. package/dist/spec/infrastructure/sql/PgQueryParser.d.ts.map +0 -1
  765. package/dist/spec/infrastructure/sql/PgQueryParser.js +0 -17
  766. package/dist/spec/infrastructure/sql/PgQueryParser.js.map +0 -1
  767. package/dist/spec/infrastructure/sql/compilePlan.d.ts +0 -37
  768. package/dist/spec/infrastructure/sql/compilePlan.d.ts.map +0 -1
  769. package/dist/spec/infrastructure/sql/compilePlan.js +0 -282
  770. package/dist/spec/infrastructure/sql/compilePlan.js.map +0 -1
  771. package/dist/spec/infrastructure/sql/compileSql.d.ts +0 -35
  772. package/dist/spec/infrastructure/sql/compileSql.d.ts.map +0 -1
  773. package/dist/spec/infrastructure/sql/compileSql.js +0 -92
  774. package/dist/spec/infrastructure/sql/compileSql.js.map +0 -1
  775. package/dist/spec/infrastructure/sql/frontEnd.d.ts +0 -8
  776. package/dist/spec/infrastructure/sql/frontEnd.d.ts.map +0 -1
  777. package/dist/spec/infrastructure/sql/frontEnd.js +0 -100
  778. package/dist/spec/infrastructure/sql/frontEnd.js.map +0 -1
  779. package/dist/spec/infrastructure/sql/index.d.ts +0 -4
  780. package/dist/spec/infrastructure/sql/index.d.ts.map +0 -1
  781. package/dist/spec/infrastructure/sql/index.js +0 -4
  782. package/dist/spec/infrastructure/sql/index.js.map +0 -1
  783. package/dist/spec/kernel/diagnostic.d.ts.map +0 -1
  784. package/dist/spec/kernel/diagnostic.js +0 -296
  785. package/dist/spec/kernel/diagnostic.js.map +0 -1
  786. package/dist/spec/kernel/index.d.ts +0 -8
  787. package/dist/spec/kernel/index.d.ts.map +0 -1
  788. package/dist/spec/kernel/index.js +0 -8
  789. package/dist/spec/kernel/index.js.map +0 -1
  790. package/dist/spec/usecase/EmitTypes.d.ts +0 -22
  791. package/dist/spec/usecase/EmitTypes.d.ts.map +0 -1
  792. package/dist/spec/usecase/EmitTypes.js +0 -182
  793. package/dist/spec/usecase/EmitTypes.js.map +0 -1
  794. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts +0 -8
  795. package/dist/spec/usecase/ValidateManifestsUseCase.d.ts.map +0 -1
  796. package/dist/spec/usecase/ValidateManifestsUseCase.js +0 -101
  797. package/dist/spec/usecase/ValidateManifestsUseCase.js.map +0 -1
  798. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts +0 -27
  799. package/dist/spec/usecase/dto/ValidateManifestsRequest.d.ts.map +0 -1
  800. package/dist/spec/usecase/dto/ValidateManifestsRequest.js +0 -2
  801. package/dist/spec/usecase/dto/ValidateManifestsRequest.js.map +0 -1
  802. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts +0 -14
  803. package/dist/spec/usecase/dto/ValidateManifestsResponse.d.ts.map +0 -1
  804. package/dist/spec/usecase/dto/ValidateManifestsResponse.js +0 -2
  805. package/dist/spec/usecase/dto/ValidateManifestsResponse.js.map +0 -1
  806. package/dist/spec/usecase/dto/index.d.ts +0 -3
  807. package/dist/spec/usecase/dto/index.d.ts.map +0 -1
  808. package/dist/spec/usecase/dto/index.js +0 -3
  809. package/dist/spec/usecase/dto/index.js.map +0 -1
  810. package/dist/spec/usecase/index.d.ts +0 -10
  811. package/dist/spec/usecase/index.d.ts.map +0 -1
  812. package/dist/spec/usecase/index.js +0 -10
  813. package/dist/spec/usecase/index.js.map +0 -1
  814. package/dist/testing/cases/before-hook.d.ts +0 -4
  815. package/dist/testing/cases/before-hook.d.ts.map +0 -1
  816. package/dist/testing/cases/before-hook.js +0 -71
  817. package/dist/testing/cases/before-hook.js.map +0 -1
  818. package/dist/testing/cases/corpus.d.ts +0 -12
  819. package/dist/testing/cases/corpus.d.ts.map +0 -1
  820. package/dist/testing/cases/corpus.js +0 -91
  821. package/dist/testing/cases/corpus.js.map +0 -1
  822. package/dist/testing/cases/policy.d.ts +0 -74
  823. package/dist/testing/cases/policy.d.ts.map +0 -1
  824. package/dist/testing/cases/policy.js +0 -142
  825. package/dist/testing/cases/policy.js.map +0 -1
  826. package/dist/testing/cases/printer.d.ts +0 -4
  827. package/dist/testing/cases/printer.d.ts.map +0 -1
  828. package/dist/testing/cases/printer.js +0 -32
  829. package/dist/testing/cases/printer.js.map +0 -1
  830. package/dist/testing/cases/report-view.d.ts +0 -5
  831. package/dist/testing/cases/report-view.d.ts.map +0 -1
  832. package/dist/testing/cases/report-view.js +0 -33
  833. package/dist/testing/cases/report-view.js.map +0 -1
  834. package/dist/testing/cases/requisition.d.ts +0 -4
  835. package/dist/testing/cases/requisition.d.ts.map +0 -1
  836. package/dist/testing/cases/requisition.js +0 -38
  837. package/dist/testing/cases/requisition.js.map +0 -1
  838. package/dist/testing/cases/search-places.d.ts +0 -4
  839. package/dist/testing/cases/search-places.d.ts.map +0 -1
  840. package/dist/testing/cases/search-places.js +0 -60
  841. package/dist/testing/cases/search-places.js.map +0 -1
  842. package/dist/testing/cases/stock.d.ts +0 -4
  843. package/dist/testing/cases/stock.d.ts.map +0 -1
  844. package/dist/testing/cases/stock.js +0 -35
  845. package/dist/testing/cases/stock.js.map +0 -1
  846. package/dist/testing/cases/store.d.ts +0 -4
  847. package/dist/testing/cases/store.d.ts.map +0 -1
  848. package/dist/testing/cases/store.js +0 -100
  849. package/dist/testing/cases/store.js.map +0 -1
  850. package/dist/testing/harness.d.ts +0 -94
  851. package/dist/testing/harness.d.ts.map +0 -1
  852. package/dist/testing/harness.js +0 -168
  853. package/dist/testing/harness.js.map +0 -1
  854. package/dist/testing/index.d.ts.map +0 -1
  855. package/dist/testing/index.js.map +0 -1
  856. package/dist/testing/report.d.ts +0 -15
  857. package/dist/testing/report.d.ts.map +0 -1
  858. package/dist/testing/report.js +0 -22
  859. package/dist/testing/report.js.map +0 -1
  860. package/dist/web/createRestSurface.d.ts +0 -7
  861. package/dist/web/createRestSurface.d.ts.map +0 -1
  862. package/dist/web/createRestSurface.js +0 -41
  863. package/dist/web/createRestSurface.js.map +0 -1
  864. package/dist/web/index.d.ts +0 -2
  865. package/dist/web/index.d.ts.map +0 -1
  866. package/dist/web/index.js +0 -2
  867. package/dist/web/index.js.map +0 -1
  868. package/docs/adr/0001-four-atom-manifest-model.md +0 -440
  869. package/docs/adr/0002-closed-enums-for-bindings.md +0 -253
  870. package/docs/adr/0007-ai-as-primary-author.md +0 -473
  871. package/docs/adr/0008-structured-diagnostic-shape.md +0 -338
  872. package/docs/adr/0009-consumer-supplied-manifests.md +0 -149
  873. package/docs/adr/0010-locale-and-translates.md +0 -453
  874. package/docs/adr/0011-adapter-port-spec.md +0 -281
  875. package/docs/adr/0012-views-as-public-rest.md +0 -161
  876. package/docs/adr/0013-agent-provisioned-consumer-projects.md +0 -154
  877. package/docs/adr/0014-auth-better-auth-and-multi-tenant-mcp.md +0 -939
  878. package/docs/adr/0016-site-semantic-layer.md +0 -70
  879. package/docs/adr/0017-media-multi-variant-agent-side-optimization.md +0 -181
  880. package/docs/adr/0018-core-starters-repository-boundary.md +0 -179
  881. package/docs/adr/0019-sealed-manifest-runtime-pipeline.md +0 -244
  882. package/docs/adr/0020-builtin-handler-contracts-and-matched-upsert.md +0 -199
  883. package/docs/adr/0021-retire-starter-scaffolding.md +0 -30
  884. package/docs/adr/0022-caller-observed-version-occ.md +0 -212
  885. package/docs/adr/0023-port-failure-contract.md +0 -69
  886. package/docs/adr/0024-manifest-native-schema-tables.md +0 -264
  887. package/docs/adr/0025-reserved-native-columns-and-published-only-public-views.md +0 -105
  888. package/docs/adr/0026-progressive-generate.md +0 -36
  889. package/docs/adr/0027-scheduled-procedure-triggers.md +0 -31
  890. package/docs/adr/0028-schema-ttl-expiry.md +0 -33
  891. package/docs/adr/0029-mcp-apps-interaction-contracts.md +0 -324
  892. package/docs/adr/0030-store.md +0 -40
  893. package/docs/adr/0031-host-cloud-core-contract.md +0 -102
  894. package/docs/adr/0032-store-centric-core-and-service-contract.md +0 -384
  895. package/docs/adr/0033-storage-converges-to-the-plan.md +0 -92
  896. package/docs/adr/0034-store-is-authored-as-sql.md +0 -192
  897. package/docs/adr/0035-sql-dialects.md +0 -154
  898. package/docs/adr/0036-host-and-dialect.md +0 -65
  899. package/docs/adr/0037-postgresql-is-the-reference-dialect.md +0 -124
  900. package/docs/adr/0038-bun-native-host.md +0 -63
  901. package/docs/adr/README.md +0 -96
  902. package/docs/adr/adr-lite-803-request-diagnostics.md +0 -38
  903. package/docs/adr/adr-lite-808-route-readiness.md +0 -47
  904. package/docs/adr/adr-lite-809-bounded-public-content.md +0 -71
  905. package/docs/adr/adr-lite-812-native-parity.md +0 -150
  906. package/docs/adr/adr-lite-823-home-statistics.md +0 -64
  907. package/docs/adr/adr-lite-842-mcp-authoring.md +0 -30
  908. package/docs/adr/adr-lite-845-frontend-client.md +0 -38
  909. package/docs/adr/adr-lite-861-admin-webmcp.md +0 -48
  910. package/docs/adr/adr-lite-909-admin-ui-kit.md +0 -37
  911. package/docs/examples/commerce-inventory.md +0 -481
  912. package/docs/examples/commerce.md +0 -254
  913. package/docs/examples/guarded-api.md +0 -238
  914. package/docs/examples/intake-hooks.md +0 -237
  915. package/docs/examples/intake.md +0 -127
  916. package/docs/examples/legal-documents.md +0 -218
  917. package/docs/examples/procurement.md +0 -226
  918. package/docs/examples/publication.md +0 -211
  919. package/docs/examples/reference-service/.mantle/generated/mantle.ts +0 -174
  920. package/docs/examples/reference-service/.mantle/generated/plan.json +0 -1936
  921. package/docs/examples/reference-service/README.md +0 -33
  922. package/docs/examples/reference-service/manifests/catalog.yaml +0 -103
  923. package/docs/examples/reference-service/manifests/orders.yaml +0 -120
  924. package/docs/examples/reference-service/mantle.config.json +0 -1
  925. package/docs/examples/reference-service/package.json +0 -27
  926. package/docs/examples/reference-service/smoke.mjs +0 -160
  927. package/docs/examples/reference-service/src/handlers.ts +0 -36
  928. package/docs/examples/reference-service/src/index.ts +0 -33
  929. package/docs/examples/reference-service/src/service.ts +0 -78
  930. package/docs/examples/reference-service/wrangler.jsonc +0 -26
  931. package/docs/examples/reservation.md +0 -142
  932. /package/docs/examples/{reference-service → app-shell}/.dev.vars.example +0 -0
@@ -1,705 +0,0 @@
1
- import { PG_GRAMMAR } from "../../spec/domain/model/SqlIr.js";
2
- import { SqlRefusal } from "../../spec/domain/service/SqlRefusal.js";
3
- import { intervalMicros, parseNumeric } from "../../spec/domain/service/SqlTypes.js";
4
- /** node type -> the keys it may carry */
5
- export const KEYS_SRC = {
6
- SelectStmt: 'targetList fromClause whereClause groupClause havingClause sortClause limitCount distinctClause valuesLists limitOption op',
7
- InsertStmt: 'relation cols selectStmt onConflictClause returningClause override',
8
- UpdateStmt: 'relation targetList whereClause returningClause',
9
- DeleteStmt: 'relation whereClause returningClause',
10
- ReturningClause: 'exprs', ResTarget: 'name val', ColumnRef: 'fields', String: 'sval', A_Star: '',
11
- A_Const: 'ival fval sval boolval isnull', A_Expr: 'kind name lexpr rexpr',
12
- BoolExpr: 'boolop args', NullTest: 'arg nulltesttype', CaseExpr: 'arg args defresult', CaseWhen: 'expr result',
13
- CoalesceExpr: 'args', TypeCast: 'arg typeName', TypeName: 'names typemod typmods',
14
- FuncCall: 'funcname args agg_star agg_distinct over funcformat', WindowDef: 'partitionClause orderClause frameOptions',
15
- SubLink: 'subLinkType testexpr subselect operName', SortBy: 'node sortby_dir sortby_nulls',
16
- RangeVar: 'relname alias inh relpersistence mantle', Alias: 'aliasname', RangeSubselect: 'subquery alias',
17
- RangeFunction: 'functions alias', JoinExpr: 'jointype larg rarg quals', List: 'items',
18
- OnConflictClause: 'action infer targetList whereClause', InferClause: 'indexElems', IndexElem: 'name ordering nulls_ordering',
19
- };
20
- export const KEYS = Object.fromEntries(Object.entries(KEYS_SRC).map(([k, v]) => [k, new Set(v.split(' ').filter(Boolean))]));
21
- /**
22
- * Where a node may sit. The printers print whatever node a slot holds, and the policy rewriter wraps only a `RangeVar` in FROM, so
23
- * the type of every child is checked against its slot: a `String` in FROM would print as a table read with no wrapper. A key not
24
- * listed here is a scalar (a name, an enum, a flag) and must hold a string, number or boolean, never a node.
25
- */
26
- const EXPR = 'ColumnRef A_Const A_Expr BoolExpr NullTest CaseExpr CoalesceExpr TypeCast FuncCall SubLink MinMaxExpr';
27
- const FROM = 'RangeVar RangeSubselect RangeFunction JoinExpr';
28
- const SLOTS_SRC = {
29
- 'SelectStmt.targetList': 'ResTarget', 'SelectStmt.fromClause': FROM, 'SelectStmt.whereClause': EXPR, 'SelectStmt.havingClause': EXPR,
30
- 'SelectStmt.groupClause': EXPR, 'SelectStmt.sortClause': 'SortBy', 'SelectStmt.limitCount': EXPR, 'SelectStmt.distinctClause': EXPR,
31
- 'SelectStmt.valuesLists': 'List', 'SelectStmt>List.items': EXPR,
32
- 'InsertStmt.cols': 'ResTarget', 'InsertStmt.selectStmt': 'SelectStmt', 'UpdateStmt.targetList': 'ResTarget', 'UpdateStmt.whereClause': EXPR,
33
- 'DeleteStmt.whereClause': EXPR, 'ReturningClause.exprs': 'ResTarget', 'ResTarget.val': EXPR,
34
- 'ColumnRef.fields': 'String A_Star', 'A_Expr.name': 'String', 'A_Expr.lexpr': EXPR, 'A_Expr.rexpr': `${EXPR} List`, 'A_Expr>List.items': EXPR,
35
- 'BoolExpr.args': EXPR, 'NullTest.arg': EXPR, 'CaseExpr.arg': EXPR, 'CaseExpr.args': 'CaseWhen', 'CaseExpr.defresult': EXPR,
36
- 'CaseWhen.expr': EXPR, 'CaseWhen.result': EXPR, 'CoalesceExpr.args': EXPR, 'TypeCast.arg': EXPR, 'TypeName.names': 'String', 'TypeName.typmods': 'A_Const',
37
- 'FuncCall.funcname': 'String', 'FuncCall.args': EXPR, 'FuncCall.agg_filter': EXPR, 'FuncCall.agg_order': 'SortBy',
38
- 'WindowDef.partitionClause': EXPR, 'WindowDef.orderClause': 'SortBy', 'WindowDef.startOffset': EXPR, 'WindowDef.endOffset': EXPR,
39
- 'SubLink.testexpr': EXPR, 'SubLink.subselect': 'SelectStmt', 'SubLink.operName': 'String', 'SortBy.node': EXPR,
40
- 'RangeSubselect.subquery': 'SelectStmt', 'RangeFunction.functions': 'List', 'RangeFunction>List.items': 'FuncCall',
41
- 'JoinExpr.larg': FROM, 'JoinExpr.rarg': FROM, 'JoinExpr.quals': EXPR,
42
- 'OnConflictClause.targetList': 'ResTarget', 'OnConflictClause.whereClause': EXPR, 'InferClause.indexElems': 'IndexElem',
43
- 'WithClause.ctes': 'CommonTableExpr', 'CommonTableExpr.ctequery': 'SelectStmt', 'CommonTableExpr.aliascolnames': 'String', 'MinMaxExpr.args': EXPR,
44
- };
45
- const SLOTS = new Map(Object.entries(SLOTS_SRC).map(([k, v]) => [k, new Set(v.split(' '))]));
46
- /** keys (or `Type.key`) whose value is one node with the type key omitted (libpg-query prints nothing for it) */
47
- export const BARE = { alias: 'Alias', typeName: 'TypeName', infer: 'InferClause', returningClause: 'ReturningClause', relation: 'RangeVar', over: 'WindowDef', onConflictClause: 'OnConflictClause', withClause: 'WithClause', 'SelectStmt.larg': 'SelectStmt', 'SelectStmt.rarg': 'SelectStmt' };
48
- export const ENUM = {
49
- 'SelectStmt.op': ['SETOP_NONE'], 'SelectStmt.limitOption': ['LIMIT_OPTION_DEFAULT', 'LIMIT_OPTION_COUNT'],
50
- 'InsertStmt.override': ['OVERRIDING_NOT_SET'], 'RangeVar.inh': [true], 'RangeVar.relpersistence': ['p'], 'RangeVar.mantle': ['table', 'cte'],
51
- 'A_Expr.kind': ['AEXPR_OP', 'AEXPR_IN', 'AEXPR_LIKE', 'AEXPR_BETWEEN', 'AEXPR_NOT_BETWEEN', 'AEXPR_DISTINCT', 'AEXPR_NOT_DISTINCT', 'AEXPR_NULLIF'],
52
- 'BoolExpr.boolop': ['AND_EXPR', 'OR_EXPR', 'NOT_EXPR'], 'NullTest.nulltesttype': ['IS_NULL', 'IS_NOT_NULL'],
53
- 'SubLink.subLinkType': ['EXISTS_SUBLINK', 'EXPR_SUBLINK', 'ANY_SUBLINK'], 'JoinExpr.jointype': ['JOIN_INNER', 'JOIN_LEFT'],
54
- 'SortBy.sortby_dir': ['SORTBY_DEFAULT', 'SORTBY_ASC', 'SORTBY_DESC'], 'SortBy.sortby_nulls': ['SORTBY_NULLS_DEFAULT', 'SORTBY_NULLS_FIRST', 'SORTBY_NULLS_LAST'],
55
- 'FuncCall.funcformat': ['COERCE_EXPLICIT_CALL', 'COERCE_SQL_SYNTAX'],
56
- 'WindowDef.frameOptions': [1058], // 1058 = the default frame; any frame clause is refused
57
- 'OnConflictClause.action': ['ONCONFLICT_NOTHING', 'ONCONFLICT_UPDATE'], 'TypeName.typemod': [-1],
58
- 'IndexElem.ordering': ['SORTBY_DEFAULT'], 'IndexElem.nulls_ordering': ['SORTBY_NULLS_DEFAULT'],
59
- };
60
- // LIKE is an AEXPR_LIKE node, checked below; `~~` written as a plain operator prints as itself, which SQLite cannot parse
61
- const OPS = new Set(['=', '<>', '!=', '<', '>', '<=', '>=', '+', '-', '*', '/', '%', '||', '->>']);
62
- /** scalar and aggregate functions. `pg_catalog.` is stripped before the lookup. */
63
- export const FUNCS = new Set([
64
- 'count', 'sum', 'min', 'max', 'avg', 'json_group_array', 'json_group_object', 'row_number', 'rank',
65
- 'lower', 'upper', 'length', 'abs', 'round', 'substr', 'replace', 'btrim', 'ltrim', 'rtrim', 'instr', 'typeof', 'hex', // btrim is what PostgreSQL parses trim(x) to
66
- 'json_extract', 'json_set', 'json_insert', 'json_remove', 'json_array_length',
67
- 'now', 'auth.uid', 'auth.role', 'date_trunc', 'extract', 'like_escape',
68
- 'mantle.search', 'mantle.search_rank', 'mantle.near', 'mantle.distance',
69
- ]);
70
- const WINDOW = new Set(['row_number', 'rank', 'sum', 'count']);
71
- /** functions that exist only with OVER */
72
- const WINDOW_ONLY = new Set(['row_number', 'rank', 'dense_rank', 'lag', 'lead', 'first_value', 'last_value']);
73
- const AGG = new Set(['count', 'sum', 'min', 'max', 'avg', 'json_group_array', 'json_group_object']);
74
- export const TRUNC_UNITS = new Set(['hour', 'day', 'week', 'month', 'year']);
75
- export const EXTRACT_FIELDS = new Set(['year', 'month', 'day', 'dow', 'hour']);
76
- const CAST_TYPES = new Set(['text', 'int4', 'int8', 'float8', 'bool', 'timestamptz', 'date', 'numeric', 'interval']);
77
- export const MAX_RADIUS_M = 50_000;
78
- export const MAX_NEAR_K = 100;
79
- /** The most nodes one program's IR may have. */
80
- export const MAX_NODES = 2000;
81
- const BASE_PROFILE = { name: 'base', keys: KEYS, enums: ENUM, ops: OPS, funcs: FUNCS, window: WINDOW, agg: AGG, trunc: TRUNC_UNITS, extract: EXTRACT_FIELDS, casts: CAST_TYPES };
82
- // ---- ADR-0037 decision 2: the reference profile's additions --------------------------------------------------------------
83
- const MORE_KEYS = {
84
- SelectStmt: 'withClause larg rarg all', WithClause: 'ctes recursive', CommonTableExpr: 'ctename ctequery aliascolnames ctematerialized',
85
- RangeSubselect: 'lateral', FuncCall: 'agg_filter agg_order', WindowDef: 'startOffset endOffset', MinMaxExpr: 'op args',
86
- };
87
- const MORE_ENUM = {
88
- 'SelectStmt.op': ['SETOP_UNION', 'SETOP_INTERSECT', 'SETOP_EXCEPT'], 'A_Expr.kind': ['AEXPR_ILIKE'],
89
- 'CommonTableExpr.ctematerialized': ['CTEMaterializeDefault', 'CTEMaterializeAlways', 'CTEMaterializeNever'], 'MinMaxExpr.op': ['IS_GREATEST', 'IS_LEAST'],
90
- };
91
- const MORE_OPS = ['->', '#>', '#>>', '@>', '<@', '?', '?|', '?&', '~', '~*', '!~', '!~*', '~~*', '!~~*'];
92
- const MORE_WINDOW = ['avg', 'min', 'max', 'lag', 'lead', 'first_value', 'last_value', 'dense_rank'];
93
- const MORE_AGG = ['string_agg', 'jsonb_agg', 'jsonb_object_agg'];
94
- const MORE_FUNCS = [...MORE_WINDOW, ...MORE_AGG, 'jsonb_build_object', 'jsonb_build_array', 'jsonb_strip_nulls', 'to_jsonb', 'jsonb_typeof', 'split_part', 'floor', 'ceil', 'sqrt', 'power', 'timezone'];
95
- /** frame bits a window may not set: GROUPS and every EXCLUDE (PostgreSQL's FRAMEOPTION_* in parsenodes.h) */
96
- export const FRAME_REFUSED = 0x8 | 0x8000 | 0x10000 | 0x20000;
97
- const union = (a, b) => new Set([...a, ...b]);
98
- const REFERENCE_PROFILE = {
99
- name: 'reference',
100
- keys: Object.fromEntries([...new Set([...Object.keys(KEYS), ...Object.keys(MORE_KEYS)])].map((k) => [k, union(KEYS[k] ?? [], (MORE_KEYS[k] ?? '').split(' ').filter(Boolean))])),
101
- // a frame is checked by its bits (check.WindowDef), not as one enum value
102
- enums: Object.fromEntries([...new Set([...Object.keys(ENUM), ...Object.keys(MORE_ENUM)])].filter((k) => k !== 'WindowDef.frameOptions').map((k) => [k, [...(ENUM[k] ?? []), ...(MORE_ENUM[k] ?? [])]])),
103
- ops: union(OPS, MORE_OPS), funcs: union(FUNCS, MORE_FUNCS), window: union(WINDOW, MORE_WINDOW), agg: union(AGG, MORE_AGG),
104
- trunc: union(TRUNC_UNITS, ['minute', 'quarter']), extract: union(EXTRACT_FIELDS, ['minute', 'quarter', 'week', 'isoyear', 'isodow', 'doy', 'epoch']),
105
- casts: union(CAST_TYPES, ['jsonb']),
106
- };
107
- export const PROFILES = { base: BASE_PROFILE, reference: REFERENCE_PROFILE };
108
- /**
109
- * Names that SQLite rejects unquoted while PostgreSQL's keyword list lets the printer emit them bare.
110
- * Measured on local D1 by `cases/deparser.ts` (it fails if this list drifts from the measurement).
111
- */
112
- export const SQLITE_ONLY_KEYWORDS = new Set([
113
- 'add', 'alter', 'autoincrement', 'commit', 'delete', 'drop', 'escape', 'index', 'insert', 'nothing', 'raise', 'set', 'transaction', 'update',
114
- ]);
115
- export const SYSTEM = new Set(['version', 'status', 'author_id', 'created_at', 'updated_at']);
116
- const sv = (list) => list.map((n) => n.String?.sval ?? (n.A_Star ? '*' : no('SQL_UNSUPPORTED', 'a name part that is not an identifier'))).join('.');
117
- const fname = (n) => sv(n.funcname).replace(/^pg_catalog\./, '');
118
- function no(code, message, offset, keyword) {
119
- throw new SqlRefusal(code, message, offset, keyword);
120
- }
121
- /** structural refusals name a key or an enum value; these find the keyword in the source text (the AST carries no location for them) */
122
- const KEYWORD = {
123
- 'SelectStmt.withClause': /\bWITH\b/i, 'InsertStmt.withClause': /\bWITH\b/i, 'UpdateStmt.withClause': /\bWITH\b/i, 'DeleteStmt.withClause': /\bWITH\b/i,
124
- 'SelectStmt.limitOffset': /\bOFFSET\b/i, 'SelectStmt.lockingClause': /\bFOR\s+(NO\s+KEY\s+)?(UPDATE|SHARE|KEY\s+SHARE)\b/i, 'SelectStmt.intoClause': /\bINTO\b/i,
125
- 'SelectStmt.op': /\b(UNION|INTERSECT|EXCEPT)\b/i, 'UpdateStmt.fromClause': /\bFROM\b/i, 'DeleteStmt.usingClause': /\bUSING\b/i,
126
- 'JoinExpr.jointype': /\b(RIGHT|FULL)\b/i, 'JoinExpr.isNatural': /\bNATURAL\b/i, 'JoinExpr.usingClause': /\bUSING\b/i,
127
- 'WindowDef.frameOptions': /\b(ROWS|RANGE|GROUPS)\b/i, 'A_Expr.kind': /\bILIKE\b/i, 'InferClause.conname': /\bON\s+CONSTRAINT\b/i,
128
- 'SelectStmt.distinctClause': /\bDISTINCT\s+ON\b/i, GroupingSet: /\bGROUPING\s+SETS\b/i,
129
- };
130
- /** first source offset found in a subtree, so a refusal about a key can still point somewhere */
131
- function firstLoc(v) {
132
- if (!v || typeof v !== 'object')
133
- return undefined;
134
- if (typeof v.location === 'number' && v.location >= 0)
135
- return v.location;
136
- for (const c of Array.isArray(v) ? v : Object.values(v)) {
137
- const l = firstLoc(c);
138
- if (l !== undefined)
139
- return l;
140
- }
141
- return undefined;
142
- }
143
- /** Validate a program of statements under a profile. `stmts` are the `stmt` of each RawStmt; `locs` their offsets (CLI only). */
144
- export function validateProgram(stmts, ctx, locs = [], profile = BASE_PROFILE) {
145
- program(stmts, { ...ctx, p: profile, scope: [] }, locs);
146
- }
147
- function program(stmts, ctx, locs) {
148
- if (!Array.isArray(stmts) || !stmts.length)
149
- no('SQL_SHAPE', 'an empty program');
150
- if (ctx.kind === 'view' && (stmts.length !== 1 || !stmts[0].SelectStmt))
151
- no('SQL_SHAPE', 'a View is exactly one SELECT', locs[1]);
152
- ctx = { ...ctx, known: knownColumns(stmts), cols: ctx.columns ?? schemaColumns(ctx.schemas) };
153
- const w = { ctx, budget: { n: 0 } };
154
- stmts.forEach((s, i) => {
155
- const t = Object.keys(s)[0] ?? '';
156
- const at = locs[i] ?? firstLoc(s);
157
- if (!['SelectStmt', 'InsertStmt', 'UpdateStmt', 'DeleteStmt'].includes(t))
158
- no('SQL_UNSUPPORTED', `statement ${t} is refused`, at);
159
- if (t === 'SelectStmt' && ctx.kind !== 'view')
160
- no('SQL_SHAPE', 'a Procedure statement is a write', at);
161
- if (t !== 'SelectStmt' && ctx.kind === 'view')
162
- no('SQL_SHAPE', 'a View is one SELECT', at);
163
- walk(t, s[t], w, [t], at);
164
- });
165
- if (ctx.public)
166
- publishedJoin(stmts, ctx);
167
- }
168
- /** every node of a tree with the given key, at any depth */
169
- function* find(v, key) {
170
- if (!v || typeof v !== 'object')
171
- return;
172
- for (const [k, c] of Object.entries(v)) {
173
- if (k === key)
174
- yield c;
175
- yield* find(c, key);
176
- }
177
- }
178
- /** What every program checked against these Schemas reads off them: computed once per plan by a caller that checks many. */
179
- export function schemaColumns(schemas) {
180
- const known = new Set();
181
- const scopes = new Set();
182
- const types = new Map();
183
- for (const s of Object.values(schemas)) {
184
- if (typeof s.scope === 'string')
185
- scopes.add(s.scope.toLowerCase());
186
- for (const [f, t] of Object.entries(s.fields)) {
187
- (t === 'geo' ? [f, `${f}_lat`, `${f}_lng`] : [f]).forEach((c) => known.add(c));
188
- types.set(f, types.has(f) && types.get(f) !== t ? null : t); // null: two Schemas disagree
189
- }
190
- }
191
- return { known, scopes, types: new Map([...types].filter((e) => e[1] !== null)) };
192
- }
193
- /**
194
- * Every name a column may have beyond the declared fields (`SchemaColumns.known`, a geo field also as _lat and _lng): `id`, the
195
- * system columns, json_each's, relation names and aliases, and every output name the program gives (ORDER BY and outer queries
196
- * read them). A name outside both is a typo. Not per relation: a column of another table passes here.
197
- */
198
- function knownColumns(stmts) {
199
- const known = new Set(['id', 'key', 'value', 'type', 'atom', 'parent', 'fullkey', 'path', ...SYSTEM]);
200
- for (const r of find(stmts, 'ResTarget'))
201
- if (r.name)
202
- known.add(String(r.name).toLowerCase());
203
- for (const r of find(stmts, 'RangeVar'))
204
- [r.relname, r.alias?.aliasname].forEach((a) => a && known.add(a.toLowerCase())); // mantle.search(<alias>, ...) names a relation
205
- for (const c of find(stmts, 'CommonTableExpr'))
206
- [c.ctename, ...(c.aliascolnames ?? []).map((x) => x.String?.sval)].forEach((a) => a && known.add(String(a).toLowerCase()));
207
- return known;
208
- }
209
- /** ADR-0034 decision 8: a public View that joins a non-publishing Schema must tie it to a publishing one in a JOIN ... ON. */
210
- function publishedJoin(stmts, ctx) {
211
- // a CTE reference is not a relation: the Schemas its body reads are found where they are
212
- const rels = [...find(stmts, 'RangeVar')].filter((r) => r.mantle !== 'cte').map((r) => ({
213
- alias: (r.alias?.aliasname ?? r.relname).toLowerCase(),
214
- publishing: !!ctx.schemas[r.relname.toLowerCase()]?.publishing,
215
- }));
216
- if (!rels.some((r) => r.publishing))
217
- return;
218
- const ons = [...find(stmts, 'JoinExpr')].map((j) => new Set([...find(j.quals, 'ColumnRef')].filter((c) => c.fields.length === 2).map((c) => c.fields[0].String.sval.toLowerCase())));
219
- for (const r of rels)
220
- if (!r.publishing && !ons.some((o) => o.has(r.alias) && rels.some((p) => p.publishing && o.has(p.alias))))
221
- no('SQL_RELATION', `${r.alias} has no published state: a public View must join it to a publishing Schema in a JOIN ... ON`);
222
- }
223
- /** A node's keys and enum values against the profile. */
224
- function shape(type, node, w, here) {
225
- const keys = w.ctx.p.keys[type] ?? no('SQL_UNSUPPORTED', `${type} is not in the subset`, here, KEYWORD[type]);
226
- for (const [k, v] of Object.entries(node)) {
227
- if (k === 'location' || k === 'rexpr_list_start' || k === 'rexpr_list_end')
228
- continue; // source positions, not structure
229
- if (!keys.has(k))
230
- no('SQL_UNSUPPORTED', `${type}.${k} is not in the subset`, firstLoc(v) ?? here, KEYWORD[`${type}.${k}`]);
231
- const e = w.ctx.p.enums[`${type}.${k}`];
232
- if (e && !e.includes(v))
233
- no('SQL_UNSUPPORTED', `${type}.${k} = ${JSON.stringify(v)} is refused`, firstLoc(node) ?? here, KEYWORD[`${type}.${k}`]);
234
- }
235
- if (type === 'String' && node.sval !== undefined && typeof node.sval !== 'string')
236
- no('SQL_SHAPE', 'a name is a string', here);
237
- if (type === 'A_Const' && !constant(node))
238
- no('SQL_UNSUPPORTED', 'a literal is one integer, numeric, string, boolean or NULL', firstLoc(node) ?? here);
239
- }
240
- /**
241
- * A literal's value is printed as it is, so its type is checked here: the walker never descends into a literal, and a plan
242
- * that reaches the runtime is untrusted. libpg-query omits a zero, a false and an empty string (`{ ival: {} }`).
243
- */
244
- function constant(node) {
245
- const own = Object.keys(node).filter((k) => k !== 'location');
246
- if (own.length !== 1)
247
- return false;
248
- const [k] = own;
249
- const v = node[k];
250
- const only = (key, ok) => !!v && typeof v === 'object' && Object.keys(v).every((x) => x === key) && (!(key in v) || ok(v[key]));
251
- switch (k) {
252
- case 'ival': return only('ival', Number.isSafeInteger);
253
- // the parser's Float: a point or exponent, or an integer past int32 (smaller ones are ival); never a sign the printers would
254
- // print as `+2`, which SQLite reads as a column position in ORDER BY
255
- // (one split of the digits, so the match is linear; and no longer than any number the parser writes)
256
- case 'fval': return only('fval', (x) => typeof x === 'string' && x.length <= 64 && /^-?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?$/.test(x) && (/[.eE]/.test(x) || Math.abs(Number(x)) >= 2 ** 31));
257
- case 'sval': return only('sval', (x) => typeof x === 'string');
258
- case 'boolval': return only('boolval', (x) => typeof x === 'boolean');
259
- case 'isnull': return v === true;
260
- default: return false;
261
- }
262
- }
263
- /** Runs `f` with these CTE names in scope. */
264
- function withScope(w, names, f) {
265
- w.ctx.scope.push(new Set(names));
266
- try {
267
- f();
268
- }
269
- finally {
270
- w.ctx.scope.pop();
271
- }
272
- }
273
- function walk(type, node, w, path, loc) {
274
- if (++w.budget.n > MAX_NODES)
275
- no('SQL_SHAPE', 'statement too large', loc);
276
- const here = typeof node.location === 'number' ? node.location : loc;
277
- shape(type, node, w, here);
278
- try {
279
- check[type]?.(node, w.ctx, path, here);
280
- }
281
- catch (e) {
282
- if (e instanceof SqlRefusal && e.offset === undefined && !e.keyword)
283
- e.offset = here; // a helper (interval, numeric) refused without knowing where
284
- throw e;
285
- }
286
- // PostgreSQL's CTE scope: a body sees its earlier siblings (every sibling under RECURSIVE); the SELECT's body sees them all
287
- const wc = type === 'SelectStmt' ? node.withClause : undefined;
288
- const names = (wc?.ctes ?? []).map((x) => String(x.CommonTableExpr?.ctename));
289
- if (wc) {
290
- shape('WithClause', wc, w, here);
291
- if (wc.recursive !== undefined && typeof wc.recursive !== 'boolean')
292
- no('SQL_UNSUPPORTED', 'WithClause.recursive is a flag', here);
293
- (wc.ctes ?? []).forEach((x, j) => withScope(w, wc.recursive ? names : names.slice(0, j), () => child(x, w, [...path, 'WithClause'], 'ctes', here)));
294
- }
295
- // the Schema relations this statement reads directly, by alias: what a column reference in it can name (`jsonCompare`)
296
- const rels = type === 'SelectStmt' || type === 'UpdateStmt' || type === 'DeleteStmt' ? relationsOf(node) : undefined;
297
- if (rels)
298
- (w.ctx.rels ??= []).push(rels);
299
- try {
300
- withScope(w, names, () => {
301
- for (const [k, v] of Object.entries(node)) {
302
- if (type === 'A_Const' || k === 'location' || k === 'rexpr_list_start' || k === 'rexpr_list_end' || (wc && k === 'withClause'))
303
- continue;
304
- const bare = BARE[`${type}.${k}`] ?? BARE[k];
305
- const slot = bare || SLOTS.has(`${type}.${k}`) || (type === 'List' && k === 'items');
306
- if (!slot) {
307
- if (v !== null && typeof v === 'object')
308
- no('SQL_UNSUPPORTED', `${type}.${k} is a value, not a node`, here);
309
- continue;
310
- }
311
- if (v === null || typeof v !== 'object')
312
- no('SQL_UNSUPPORTED', `${type}.${k} holds a node`, here);
313
- if (bare)
314
- walk(bare, v, w, [...path, bare], here);
315
- else if (Array.isArray(v))
316
- v.forEach((c) => child(c, w, path, k, here));
317
- else
318
- child(v, w, path, k, here);
319
- }
320
- });
321
- }
322
- finally {
323
- if (rels)
324
- w.ctx.rels.pop();
325
- }
326
- }
327
- /** A statement's own Schema relations (FROM, its joins, an UPDATE or DELETE target), by alias; never a subquery or CTE. */
328
- function relationsOf(node) {
329
- const out = new Map();
330
- const add = (n) => {
331
- if (n?.JoinExpr)
332
- return (add(n.JoinExpr.larg), add(n.JoinExpr.rarg));
333
- const v = n?.RangeVar ?? n;
334
- if (v?.mantle === 'table')
335
- out.set(String(v.alias?.aliasname ?? v.relname).toLowerCase(), String(v.relname).toLowerCase());
336
- };
337
- for (const f of node.fromClause ?? [])
338
- add(f);
339
- add(node.relation);
340
- return out;
341
- }
342
- function child(c, w, path, k, loc) {
343
- const keys = Object.keys(c);
344
- if (!keys.length) {
345
- if (k === 'distinctClause' || (k === 'items' && path.at(-2) === 'RangeFunction'))
346
- return; // `DISTINCT` is [{}]; a json_each coldeflist slot is {}
347
- no('SQL_UNSUPPORTED', `an empty node in ${k}`, loc);
348
- }
349
- if (keys.length !== 1 || c[keys[0]] === null || typeof c[keys[0]] !== 'object')
350
- no('SQL_UNSUPPORTED', 'a malformed node', loc);
351
- const parent = path.at(-1);
352
- const allowed = SLOTS.get(parent === 'List' ? `${path.at(-2)}>List.${k}` : `${parent}.${k}`);
353
- if (w.ctx.p.keys[keys[0]] && !allowed?.has(keys[0]))
354
- no('SQL_SHAPE', `${keys[0]} cannot stand in ${parent}.${k}`, loc); // an unknown type is shape()'s refusal
355
- walk(keys[0], c[keys[0]], w, [...path, keys[0]], loc);
356
- }
357
- /** A cast's type: `t` or `pg_catalog.t`, read as the lowerings and printers read it (the last name part). */
358
- const castType = (typeName) => {
359
- const names = (typeName?.names ?? []).map((n) => n?.String?.sval);
360
- const ok = names.every((x) => typeof x === 'string' && /^[a-z_][a-z0-9_]*$/.test(x)) && (names.length === 1 || (names.length === 2 && names[0] === 'pg_catalog'));
361
- if (!ok)
362
- no('SQL_TYPE', `a cast names one type: ${JSON.stringify(names)}`);
363
- return names.at(-1);
364
- };
365
- const isConst = (n) => !!n?.A_Const;
366
- const isInputRef = (n) => n?.ColumnRef?.fields?.length === 2 && n.ColumnRef.fields[0].String?.sval === 'input';
367
- const check = {
368
- RangeVar: (n, ctx, _p, at) => {
369
- // the parser folds an unquoted name and the CLI writes only lower case: an `ARTICLES` would be one Schema to the checks and
370
- // another to what keys hooks and publishing by the folded name, so a relation (a Schema or a CTE reference) is lower case
371
- if (typeof n.relname !== 'string' || n.relname !== n.relname.toLowerCase())
372
- no('SQL_RELATION', `${JSON.stringify(n.relname)}: a relation is named in lower case`, at);
373
- const name = n.relname;
374
- if (name.startsWith('_mantle') || name === 'input' || name === 'auth')
375
- no('SQL_RELATION', `${name} is not a declared Schema`, at);
376
- const reference = ctx.p.name === 'reference';
377
- // a `cte` tag is honored only for a CTE in scope here (the runtime never trusts an IR's tags); base has no WITH at all
378
- if (n.mantle === 'cte') {
379
- if (reference && ctx.scope.some((s) => s.has(n.relname)))
380
- return;
381
- no('SQL_RELATION', `${name}: a cte reference is not defined in scope`, at);
382
- }
383
- if (!ctx.schemas[name])
384
- no('SQL_RELATION', `${name} is not a declared Schema`, at);
385
- if (n.mantle !== undefined && n.mantle !== 'table')
386
- no('SQL_RELATION', `${name}: relation not name-resolved`, at);
387
- if (n.alias && ['input', 'auth', 'excluded'].includes(n.alias.aliasname))
388
- no('SQL_RELATION', `${n.alias.aliasname} is a reserved alias`, at);
389
- if (!reference)
390
- for (const ident of [name, n.alias?.aliasname])
391
- if (ident && SQLITE_ONLY_KEYWORDS.has(ident))
392
- no('SQL_UNSUPPORTED', `${ident} is an SQLite keyword: the printer would not quote it`, at);
393
- },
394
- ColumnRef: (n, ctx, _p, at) => {
395
- const f = sv(n.fields), last = f.split('.').pop().toLowerCase();
396
- if (n.fields.length > 2)
397
- no('SQL_COLUMN', `${f}: at most alias.column`, at);
398
- if (['rowid', 'oid', '_rowid_', '_rid'].includes(last))
399
- no('SQL_COLUMN', `${last} is not addressable`, at);
400
- if (ctx.cols.scopes.has(last))
401
- no('SQL_COLUMN', `${f}: the scope column is not addressable`, at);
402
- if (f.startsWith('input.') && !(last in ctx.inputs))
403
- no('SQL_COLUMN', `${f} is not a declared input`, at);
404
- if (ctx.p.name === 'base' && SQLITE_ONLY_KEYWORDS.has(last))
405
- no('SQL_UNSUPPORTED', `${last} is an SQLite keyword: the printer would not quote it`, at);
406
- if (last !== '*' && !f.startsWith('input.') && !ctx.known.has(last) && !ctx.cols.known.has(last))
407
- no('SQL_COLUMN', `${f} is not a declared field`, at);
408
- },
409
- FuncCall: (n, ctx, path, at) => {
410
- const f = fname(n);
411
- if (f === 'json_each') {
412
- if (path.at(-2) !== 'List' || path.at(-3) !== 'RangeFunction')
413
- no('SQL_FUNCTION', 'json_each is only allowed in FROM', at);
414
- return;
415
- }
416
- if (!ctx.p.funcs.has(f))
417
- no('SQL_FUNCTION', `function ${f} is not on the allowlist`, at);
418
- if (n.over && (ctx.kind !== 'view' || !ctx.p.window.has(f)))
419
- no('SQL_FUNCTION', `window function ${f} is refused here`, at);
420
- if (!n.over && WINDOW_ONLY.has(f))
421
- no('SQL_FUNCTION', `${f}() is a window function: it needs OVER (...)`, at);
422
- if ((f === 'lag' || f === 'lead') && n.args?.[1] && n.args[1].A_Const?.ival === undefined)
423
- no('SQL_FUNCTION', `${f}'s offset is an integer literal`, at);
424
- if ((n.agg_filter || n.agg_order) && !ctx.p.agg.has(f))
425
- no('SQL_FUNCTION', `FILTER and ORDER BY belong to an aggregate, and ${f} is not one`, at);
426
- const args = n.args ?? [];
427
- const str = (a) => a?.A_Const?.sval?.sval;
428
- switch (f) {
429
- case 'like_escape':
430
- if (path.at(-2) !== 'A_Expr' || args.length !== 2)
431
- no('SQL_FUNCTION', 'like_escape is only the ESCAPE of a LIKE', at);
432
- break;
433
- case 'date_trunc':
434
- if (args.length !== 2 || !ctx.p.trunc.has(str(args[0]) ?? ''))
435
- no('SQL_TYPE', `date_trunc takes ${[...ctx.p.trunc].join(', ')} as a literal first argument`, at);
436
- break;
437
- case 'extract':
438
- if (args.length !== 2 || !ctx.p.extract.has(str(args[0]) ?? ''))
439
- no('SQL_TYPE', `extract takes ${[...ctx.p.extract].join(', ')}`, at);
440
- break;
441
- case 'now':
442
- case 'auth.uid':
443
- case 'auth.role':
444
- if (args.length)
445
- no('SQL_FUNCTION', `${f}() takes no arguments`, at);
446
- break;
447
- case 'mantle.search':
448
- case 'mantle.search_rank':
449
- if (args.length !== (f === 'mantle.search' ? 2 : 1) || args[0]?.ColumnRef?.fields?.length !== 1)
450
- no('SQL_FUNCTION', f === 'mantle.search' ? 'mantle.search(<alias>, <query>)' : 'mantle.search_rank(<alias>)', at);
451
- break;
452
- case 'mantle.near':
453
- case 'mantle.distance': {
454
- const want = f === 'mantle.near' ? 4 : 3;
455
- const fld = args[0]?.ColumnRef?.fields;
456
- if (args.length !== want || fld?.length !== 2)
457
- no('SQL_FUNCTION', `${f}(<alias>.<geo field>, lat, lng${f === 'mantle.near' ? ', meters' : ''})`, at);
458
- for (const a of args.slice(1, 3))
459
- if (!isConst(a) && !isInputRef(a))
460
- no('SQL_FUNCTION', `${f}: latitude and longitude are a literal or input.<name>`, at);
461
- if (f === 'mantle.near') {
462
- const m = args[3]?.A_Const?.ival?.ival ?? args[3]?.A_Const?.fval?.fval;
463
- if (m === undefined)
464
- no('SQL_FUNCTION', 'mantle.near() needs a literal radius in meters', at);
465
- if (Number(m) > MAX_RADIUS_M || Number(m) <= 0)
466
- no('SQL_FUNCTION', `mantle.near() radius is at most ${MAX_RADIUS_M} m`, at);
467
- }
468
- break;
469
- }
470
- }
471
- if (ctx.p.agg.has(f) && n.args?.length === 0 && !n.agg_star)
472
- no('SQL_FUNCTION', `${f} needs an argument`, at);
473
- // the printers print these as written: `*` is count(*) only, DISTINCT one argument of an aggregate outside a window
474
- if (n.agg_star && (f !== 'count' || args.length))
475
- no('SQL_FUNCTION', `${f}(*) is refused: only count(*)`, at);
476
- if (n.agg_distinct && (!ctx.p.agg.has(f) || args.length !== 1 || n.over))
477
- no('SQL_FUNCTION', `DISTINCT is one argument of an aggregate, outside a window`, at);
478
- },
479
- A_Expr: (n, ctx, _p, at) => {
480
- const op = sv(n.name);
481
- // the printer joins what it is given: a missing operand or a one-bound BETWEEN would bind the policy predicate appended after it
482
- const items = n.rexpr?.List?.items;
483
- const range = n.kind === 'AEXPR_BETWEEN' || n.kind === 'AEXPR_NOT_BETWEEN';
484
- if (!n.rexpr || (!n.lexpr && !(n.kind === 'AEXPR_OP' && (op === '-' || op === '+'))) || (range && items?.length !== 2) || (n.kind === 'AEXPR_IN' && !items?.length) || (!range && n.kind !== 'AEXPR_IN' && n.rexpr.List))
485
- no('SQL_SHAPE', `a malformed ${op} expression`, at);
486
- // the parser folds a sign into its number (`-2` is ival -2): a sign over a number constant is a resealed IR, and PostgreSQL
487
- // folds `- -2` back into 2, a column position in ORDER BY and GROUP BY
488
- if (n.kind === 'AEXPR_OP' && !n.lexpr && (op === '-' || op === '+') && (n.rexpr?.A_Const?.ival !== undefined || n.rexpr?.A_Const?.fval !== undefined))
489
- no('SQL_SHAPE', `a sign over a number is that number: write ${op === '-' ? 'the negative constant' : 'the constant'}`, at);
490
- if (ctx.p.name === 'base')
491
- bareLiteralCompare(n, ctx, at); // PostgreSQL casts the literal to the column's type
492
- jsonCompare(n, ctx, at);
493
- if (n.kind === 'AEXPR_OP' && !ctx.p.ops.has(op))
494
- no('SQL_UNSUPPORTED', `operator ${op} is refused`, at);
495
- if (n.kind === 'AEXPR_IN' && !['=', '<>'].includes(op))
496
- no('SQL_UNSUPPORTED', 'a bad IN', at);
497
- if (n.kind === 'AEXPR_LIKE' && !['~~', '!~~'].includes(op))
498
- no('SQL_UNSUPPORTED', 'ILIKE and regular expressions are refused', at, /\bILIKE\b/i);
499
- if (n.kind === 'AEXPR_ILIKE' && !['~~*', '!~~*'].includes(op))
500
- no('SQL_UNSUPPORTED', 'a bad ILIKE', at);
501
- const esc = (x) => !!x?.FuncCall && fname(x.FuncCall) === 'like_escape';
502
- if (esc(n.lexpr) || (esc(n.rexpr) && n.kind !== 'AEXPR_LIKE'))
503
- no('SQL_FUNCTION', 'like_escape is only the ESCAPE of a LIKE', at);
504
- },
505
- TypeCast: (n, ctx, _p, at) => {
506
- const t = castType(n.typeName);
507
- if (!ctx.p.casts.has(t))
508
- no('SQL_TYPE', `CAST to ${t} is refused`, at);
509
- const lit = n.arg?.A_Const;
510
- // the literal-only rules exist because SQLite truncates and stores time and decimals as integers; PostgreSQL casts any value
511
- const base = ctx.p.name === 'base';
512
- if (base && (t === 'int4' || t === 'int8') && !(lit?.ival || /^\s*-?\d+\s*$/.test(lit?.sval?.sval ?? 'x')))
513
- no('SQL_TYPE', `CAST to ${t} takes an integer literal: SQLite truncates toward zero where PostgreSQL rounds. Write round(x)`, at);
514
- // a type modifier is numeric's precision and scale, or one interval field (hour, minute, second) that truncates nothing; D1
515
- // encodes nothing else (timestamptz(0) rounds on PostgreSQL, interval '90 minutes' hour truncates to an hour there)
516
- // (intervalMicros reads a bare number in the field's unit and refuses any other field; one unit of the field divides the value)
517
- const mods = n.typeName.typmods ?? [];
518
- const typmod = mods[0]?.A_Const?.ival?.ival;
519
- if (mods.length && t !== 'numeric' && !(t === 'interval' && mods.length === 1 && intervalMicros(lit?.sval?.sval ?? 'x', typmod) % intervalMicros('1', typmod) === 0))
520
- no('SQL_TYPE', `CAST to ${t} takes no type modifier here, or one that truncates nothing`, at);
521
- if (t === 'interval') {
522
- if (!lit?.sval)
523
- no('SQL_TYPE', 'an interval is a literal such as interval \'36 hours\'', at);
524
- intervalMicros(lit.sval.sval, n.typeName.typmods?.[0]?.A_Const?.ival?.ival); // throws SQL_TYPE for calendar units
525
- }
526
- if (base && (t === 'timestamptz' || t === 'date') && !lit?.sval)
527
- no('SQL_TYPE', `CAST to ${t} takes a literal (the compiler folds it to its integer encoding)`, at);
528
- if (t === 'numeric') {
529
- const [p, s] = (n.typeName.typmods ?? []).map((m) => m.A_Const?.ival?.ival ?? 0);
530
- if (p === undefined)
531
- no('SQL_TYPE', 'numeric needs (precision, scale)', at);
532
- parseNumeric(`numeric(${p}, ${s})`);
533
- if (base && !lit)
534
- no('SQL_TYPE', 'CAST to numeric takes a literal: numeric columns are integer counts of the smallest unit', at);
535
- }
536
- },
537
- ResTarget: (n, ctx, _p, at) => {
538
- if (ctx.p.name === 'base' && n.name && SQLITE_ONLY_KEYWORDS.has(n.name))
539
- no('SQL_UNSUPPORTED', `${n.name} is an SQLite keyword: the printer would not quote it`, at);
540
- },
541
- SubLink: (n, _c, _p, at) => {
542
- if (n.subLinkType === 'ANY_SUBLINK' && n.operName && sv(n.operName) !== '=')
543
- no('SQL_UNSUPPORTED', 'only IN (subquery)', at);
544
- },
545
- JoinExpr: (n, _c, _p, at) => {
546
- if (!n.quals)
547
- no('SQL_SHAPE', 'a JOIN needs ON', at, /\bCROSS\s+JOIN\b|\bJOIN\b/i);
548
- },
549
- RangeFunction: (n, _c, _p, at) => {
550
- const fs = n.functions;
551
- if (fs.length !== 1 || fs[0]?.List?.items?.length !== 2 || sv(fs[0].List.items[0].FuncCall?.funcname ?? []) !== 'json_each')
552
- no('SQL_FUNCTION', 'only json_each() is allowed in FROM', at);
553
- if (fs[0].List.items[0].FuncCall.args?.length !== 1)
554
- no('SQL_FUNCTION', 'json_each takes one argument', at);
555
- },
556
- RangeSubselect: (n, _c, _p, at) => {
557
- if (!n.alias)
558
- no('SQL_SHAPE', 'a subquery in FROM needs an alias', at);
559
- },
560
- CommonTableExpr: (n, _c, _p, at) => {
561
- if (!n.ctequery?.SelectStmt)
562
- no('SQL_SHAPE', 'a CTE body is a SELECT: a write inside WITH is refused', at);
563
- // the printer writes a CTE's name and its column names unquoted: each is a plain lower-case identifier
564
- for (const name of [n.ctename, ...(n.aliascolnames ?? []).map((c) => c?.String?.sval)])
565
- if (typeof name !== 'string' || !/^[a-z_][a-z0-9_]*$/.test(name))
566
- no('SQL_SHAPE', `a CTE name is lower case, a plain identifier: ${JSON.stringify(name)}`, at);
567
- },
568
- BoolExpr: (n, _c, _p, at) => {
569
- const k = (n.args ?? []).length;
570
- if (n.boolop === 'NOT_EXPR' ? k !== 1 : k < 1)
571
- no('SQL_SHAPE', `a malformed ${n.boolop}`, at);
572
- },
573
- WindowDef: (n, _c, _p, at) => {
574
- if (n.frameOptions & FRAME_REFUSED)
575
- no('SQL_UNSUPPORTED', 'GROUPS frames and EXCLUDE are refused', at, /\b(GROUPS|EXCLUDE)\b/i);
576
- // an offset is a literal: rows as an integer, a RANGE over time as an interval literal
577
- for (const o of [n.startOffset, n.endOffset])
578
- if (o && !(o.A_Const?.ival !== undefined || (o.TypeCast?.arg?.A_Const?.sval && castType(o.TypeCast.typeName) === 'interval')))
579
- no('SQL_SHAPE', 'a frame offset is a literal: an integer, or an interval such as interval \'6 days\'', at);
580
- },
581
- SelectStmt: (n, ctx, path, at) => {
582
- const reference = ctx.p.name === 'reference';
583
- // Core pages and orders a View's own SELECT (ADR-0037 decision 2), so what reshapes rows lives in a CTE or a subquery
584
- const top = ctx.kind === 'view' && path.length === 1;
585
- const distinctOn = !!n.distinctClause && (n.distinctClause.length !== 1 || Object.keys(n.distinctClause[0]).length > 0);
586
- if (n.op && n.op !== 'SETOP_NONE' && top)
587
- no('SQL_SHAPE', 'UNION, INTERSECT and EXCEPT go inside a WITH or a subquery: Core pages the View\'s own SELECT', at, /\b(UNION|INTERSECT|EXCEPT)\b/i);
588
- if (n.limitCount && !n.sortClause)
589
- no('SQL_SHAPE', 'LIMIT needs an ORDER BY', firstLoc(n.limitCount) ?? at);
590
- if (distinctOn && (!reference || top))
591
- no(reference ? 'SQL_SHAPE' : 'SQL_UNSUPPORTED', reference ? 'DISTINCT ON goes inside a WITH or a subquery: Core pages the View\'s own SELECT' : 'DISTINCT ON is refused', at, /\bDISTINCT\s+ON\b/i);
592
- if (n.distinctClause && !distinctOn && n.sortClause)
593
- no('SQL_SHAPE', 'DISTINCT with ORDER BY is refused: the appended id key would change what is distinct', at);
594
- if (n.valuesLists && (path.at(-2) !== 'InsertStmt' || n.valuesLists.length !== 1))
595
- no('SQL_SHAPE', 'VALUES is one row, in INSERT only', firstLoc(n.valuesLists) ?? at);
596
- if ((n.fromClause ?? []).slice(1).some((f) => !f.RangeFunction && !(reference && f.RangeSubselect?.lateral)))
597
- no('SQL_SHAPE', reference ? 'a comma join is refused (except json_each and LATERAL)' : 'a comma join is refused (except json_each)', at);
598
- // mantle.near()/mantle.distance(): a query ordered by mantle.distance() needs a LIMIT of at most MAX_NEAR_K
599
- const byDistance = JSON.stringify(n.sortClause ?? []).includes('"distance"');
600
- if (byDistance) {
601
- const k = n.limitCount?.A_Const?.ival?.ival;
602
- if (k === undefined || k > MAX_NEAR_K)
603
- no('SQL_SHAPE', `a query ordered by mantle.distance() needs a literal LIMIT of at most ${MAX_NEAR_K}`, firstLoc(n.sortClause) ?? at);
604
- }
605
- },
606
- UpdateStmt: (n, ctx) => writeList(n.targetList, ctx, n.relation, false),
607
- InsertStmt: (n, ctx, _p, at) => {
608
- writeList(n.cols ?? no('SQL_WRITE', 'INSERT needs a column list', at), ctx, n.relation, true, n.selectStmt?.SelectStmt?.valuesLists?.[0]?.List?.items);
609
- if (n.onConflictClause?.action === 'ONCONFLICT_UPDATE')
610
- writeList(n.onConflictClause.targetList, ctx, n.relation, false);
611
- },
612
- };
613
- /** Columns stored as integers that PostgreSQL compares with a string literal by casting it: the system timestamps and these types. */
614
- const STORED_AS_NUMBER = new Set(['timestamptz', 'date', 'bool']);
615
- const SYSTEM_TIMES = new Set(['created_at', 'updated_at']);
616
- /** The type a column name has in every Schema that declares it, or undefined when none does or they disagree. */
617
- function columnType(ctx, name) {
618
- if (SYSTEM_TIMES.has(name))
619
- return 'timestamptz';
620
- return ctx.cols.types.get(name);
621
- }
622
- /**
623
- * PostgreSQL reads `startsAt > '2020-01-01'` by casting the literal to the column's type; SQLite compares the stored integer with
624
- * text and the condition is silently false. A bare string literal against a date-time, date or boolean column is refused.
625
- */
626
- function bareLiteralCompare(n, ctx, at) {
627
- const compares = n.kind === 'AEXPR_OP' ? ['=', '<>', '!=', '<', '>', '<=', '>='].includes(sv(n.name)) : ['AEXPR_IN', 'AEXPR_BETWEEN', 'AEXPR_NOT_BETWEEN', 'AEXPR_DISTINCT', 'AEXPR_NOT_DISTINCT'].includes(n.kind);
628
- if (!compares)
629
- return;
630
- const typeOf = (x) => { const f = x?.ColumnRef?.fields; const name = f?.at(-1)?.String?.sval; return name && !(f.length === 2 && f[0].String?.sval === 'input') ? columnType(ctx, String(name).toLowerCase()) : undefined; };
631
- const literals = (x) => (x?.List ? x.List.items.flatMap(literals) : x?.A_Const?.sval ? [x.A_Const.sval.sval] : []);
632
- for (const [colSide, other] of [[n.lexpr, n.rexpr], [n.rexpr, n.lexpr]]) {
633
- const type = typeOf(colSide);
634
- if (!type || !STORED_AS_NUMBER.has(type))
635
- continue;
636
- const text = literals(other)[0];
637
- if (text !== undefined)
638
- no('SQL_TYPE', `'${text}' is text and the column is ${type}, which is stored as a number: ${type === 'bool' ? 'write true or false' : `write CAST('${text}' AS ${type})`}, or bind it as an input`, at);
639
- }
640
- }
641
- /**
642
- * A json field compares as its stored text on SQLite and as jsonb on PostgreSQL (no jsonb < integer): either way not as the value
643
- * the author meant, so a comparison of one is refused on every dialect. The field is the statement's own Schema column: named
644
- * through its alias, or bare when exactly one of its Schema relations declares it.
645
- */
646
- function jsonCompare(n, ctx, at) {
647
- const compares = n.kind === 'AEXPR_OP' ? ['=', '<>', '!=', '<', '>', '<=', '>='].includes(sv(n.name)) : ['AEXPR_IN', 'AEXPR_BETWEEN', 'AEXPR_NOT_BETWEEN', 'AEXPR_DISTINCT', 'AEXPR_NOT_DISTINCT'].includes(n.kind);
648
- const rels = ctx.rels?.at(-1);
649
- if (!compares || !rels)
650
- return;
651
- for (const side of [n.lexpr, n.rexpr]) {
652
- const f = side?.ColumnRef?.fields;
653
- if (!f || f.length > 2 || !f.every((x) => x.String))
654
- continue;
655
- const name = String(f.at(-1).String.sval).toLowerCase();
656
- const schemas = f.length === 2 ? [rels.get(String(f[0].String.sval).toLowerCase())].filter((s) => !!s)
657
- : [...new Set(rels.values())].filter((s) => Object.hasOwn(ctx.schemas[s]?.fields ?? {}, name));
658
- if (schemas.length === 1 && ctx.schemas[schemas[0]]?.fields[name] === 'json')
659
- no('SQL_TYPE', `${f.at(-1).String.sval} is json: compare a value read with ->> (and CAST), or declare the field with one scalar type`, at);
660
- }
661
- }
662
- /** A write may not name the scope field or a system column; `id` is never writable on update, and on a scoped Schema never on insert. */
663
- function writeList(list, ctx, rel, insert, values) {
664
- const s = ctx.schemas[rel.relname.toLowerCase()];
665
- for (const [i, { ResTarget: r }] of list.entries()) {
666
- const at = firstLoc(r) ?? firstLoc(rel);
667
- const name = String(r.name).toLowerCase();
668
- const scopedId = insert && name === 'id' && s?.scope;
669
- if (name === s?.scope?.toLowerCase() || SYSTEM.has(name) || (!insert && name === 'id') || scopedId)
670
- no('SQL_WRITE', `${r.name} is filled by Mantle and cannot be written${scopedId ? ' (a scoped Schema generates its ids)' : ''}`, at);
671
- const cols = Object.entries(s?.fields ?? {}).flatMap(([f, t]) => (t === 'geo' ? [`${f}_lat`, `${f}_lng`] : [f]));
672
- if (name !== 'id' && !cols.includes(name))
673
- no('SQL_WRITE', `${rel.relname} has no field ${r.name}`, at);
674
- // a bare text literal in a column stored as a number: SQLite's STRICT table would fail it at run time, so refuse it here
675
- const type = s?.fields[name];
676
- const literal = (insert ? values?.[i] : r.val)?.A_Const?.sval?.sval;
677
- if (ctx.p.name === 'base' && literal !== undefined && type && !['text', 'json'].includes(type) && !/^-?\d+(\.\d+)?$/.test(literal))
678
- no('SQL_TYPE', `'${literal}' is text and ${r.name} is ${type}: write CAST('${literal}' AS ${type === 'integer' ? 'int8' : type === 'real' ? 'float8' : type}), or bind it as an input`, at);
679
- }
680
- }
681
- /** A `SqlRefusal` as a `SqlDiagnostic`, without a source position (the runtime has no source text). */
682
- function refusalToDiagnostic(e) {
683
- return { code: e.code, message: e.message };
684
- }
685
- /**
686
- * The runtime's check of a plan's IR: the grammar version, then the exact allowlist.
687
- * Returns no diagnostics when the plan is acceptable, otherwise the first refusal.
688
- * Also the check for IR built by handler code. Never throws for bad input.
689
- */
690
- export function validateIr(plan, ctx, profile = BASE_PROFILE) {
691
- try {
692
- if (plan?.grammar !== PG_GRAMMAR)
693
- no("SQL_UNSUPPORTED", `plan was compiled with PostgreSQL grammar ${plan?.grammar}, this runtime reads ${PG_GRAMMAR}`);
694
- validateProgram(plan.stmts, ctx, [], profile);
695
- return [];
696
- }
697
- catch (e) {
698
- if (e instanceof SqlRefusal)
699
- return [refusalToDiagnostic(e)];
700
- // Hand-built IR can be malformed in ways the allowlist does not anticipate (null, wrong types).
701
- // Refusing is the only safe answer.
702
- return [{ code: "SQL_UNSUPPORTED", message: `malformed IR: ${e instanceof Error ? e.message : String(e)}` }];
703
- }
704
- }
705
- //# sourceMappingURL=allowlist.js.map