@porulle/core 0.11.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/dist/auth/actor.d.ts +10 -0
  2. package/dist/auth/actor.d.ts.map +1 -0
  3. package/dist/auth/actor.js +91 -0
  4. package/dist/auth/auth-schema-guard.d.ts +2444 -0
  5. package/dist/auth/auth-schema-guard.d.ts.map +1 -0
  6. package/dist/auth/auth-schema-guard.js +113 -0
  7. package/dist/auth/auth-schema.d.ts +228 -0
  8. package/dist/auth/auth-schema.d.ts.map +1 -1
  9. package/dist/auth/auth-schema.js +24 -2
  10. package/dist/auth/middleware.d.ts +1 -0
  11. package/dist/auth/middleware.d.ts.map +1 -1
  12. package/dist/auth/middleware.js +16 -92
  13. package/dist/auth/org.d.ts +8 -2
  14. package/dist/auth/org.d.ts.map +1 -1
  15. package/dist/auth/org.js +12 -4
  16. package/dist/auth/organization-guard.d.ts +5 -0
  17. package/dist/auth/organization-guard.d.ts.map +1 -0
  18. package/dist/auth/organization-guard.js +124 -0
  19. package/dist/auth/permissions.d.ts +10 -0
  20. package/dist/auth/permissions.d.ts.map +1 -1
  21. package/dist/auth/permissions.js +31 -7
  22. package/dist/auth/role-authority.d.ts +44 -0
  23. package/dist/auth/role-authority.d.ts.map +1 -0
  24. package/dist/auth/role-authority.js +85 -0
  25. package/dist/auth/setup.d.ts.map +1 -1
  26. package/dist/auth/setup.js +19 -1
  27. package/dist/auth/strict-org-resolution.d.ts.map +1 -1
  28. package/dist/auth/strict-org-resolution.js +9 -1
  29. package/dist/auth/types.d.ts +1 -1
  30. package/dist/auth/types.d.ts.map +1 -1
  31. package/dist/config/defaults.d.ts.map +1 -1
  32. package/dist/config/defaults.js +2 -0
  33. package/dist/config/types.d.ts +32 -4
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/hooks/checkout.d.ts.map +1 -1
  36. package/dist/hooks/checkout.js +10 -9
  37. package/dist/index.d.ts +7 -5
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +5 -3
  40. package/dist/interfaces/rest/audit-middleware.d.ts.map +1 -1
  41. package/dist/interfaces/rest/audit-middleware.js +2 -0
  42. package/dist/interfaces/rest/customer-portal.d.ts.map +1 -1
  43. package/dist/interfaces/rest/customer-portal.js +9 -8
  44. package/dist/interfaces/rest/route-coverage.d.ts +14 -0
  45. package/dist/interfaces/rest/route-coverage.d.ts.map +1 -0
  46. package/dist/interfaces/rest/route-coverage.js +81 -0
  47. package/dist/interfaces/rest/router.d.ts +7 -2
  48. package/dist/interfaces/rest/router.d.ts.map +1 -1
  49. package/dist/interfaces/rest/router.js +8 -4
  50. package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts.map +1 -1
  51. package/dist/interfaces/rest/routes/admin/compensation-failures.js +7 -5
  52. package/dist/interfaces/rest/routes/admin/custom-field-proposals.js +2 -2
  53. package/dist/interfaces/rest/routes/admin/permissions.d.ts +1 -1
  54. package/dist/interfaces/rest/routes/admin/permissions.d.ts.map +1 -1
  55. package/dist/interfaces/rest/routes/admin/permissions.js +2 -0
  56. package/dist/interfaces/rest/routes/admin/staff.d.ts.map +1 -1
  57. package/dist/interfaces/rest/routes/admin/staff.js +126 -66
  58. package/dist/interfaces/rest/routes/admin-jobs.js +3 -3
  59. package/dist/interfaces/rest/routes/audit.js +3 -3
  60. package/dist/interfaces/rest/routes/carts.d.ts.map +1 -1
  61. package/dist/interfaces/rest/routes/carts.js +13 -10
  62. package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -1
  63. package/dist/interfaces/rest/routes/catalog.js +10 -2
  64. package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
  65. package/dist/interfaces/rest/routes/checkout.js +30 -35
  66. package/dist/interfaces/rest/routes/documents.d.ts.map +1 -1
  67. package/dist/interfaces/rest/routes/documents.js +10 -5
  68. package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -1
  69. package/dist/interfaces/rest/routes/inventory.js +2 -0
  70. package/dist/interfaces/rest/routes/media.d.ts.map +1 -1
  71. package/dist/interfaces/rest/routes/media.js +7 -3
  72. package/dist/interfaces/rest/routes/orders.d.ts.map +1 -1
  73. package/dist/interfaces/rest/routes/orders.js +26 -8
  74. package/dist/interfaces/rest/routes/pricing.js +2 -2
  75. package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -1
  76. package/dist/interfaces/rest/routes/promotions.js +13 -10
  77. package/dist/interfaces/rest/routes/search.d.ts.map +1 -1
  78. package/dist/interfaces/rest/routes/search.js +2 -1
  79. package/dist/interfaces/rest/schemas/carts.d.ts +7 -0
  80. package/dist/interfaces/rest/schemas/carts.d.ts.map +1 -1
  81. package/dist/interfaces/rest/schemas/customer-portal.d.ts +35 -0
  82. package/dist/interfaces/rest/schemas/customer-portal.d.ts.map +1 -1
  83. package/dist/interfaces/rest/schemas/orders.d.ts +204 -0
  84. package/dist/interfaces/rest/schemas/orders.d.ts.map +1 -1
  85. package/dist/interfaces/rest/schemas/responses.d.ts +71 -0
  86. package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -1
  87. package/dist/interfaces/rest/utils.d.ts +15 -0
  88. package/dist/interfaces/rest/utils.d.ts.map +1 -1
  89. package/dist/interfaces/rest/utils.js +45 -2
  90. package/dist/kernel/compensation/executor.js +2 -2
  91. package/dist/kernel/database/plugin-types.d.ts +11 -0
  92. package/dist/kernel/database/plugin-types.d.ts.map +1 -1
  93. package/dist/kernel/database/scoped-db.d.ts +12 -0
  94. package/dist/kernel/database/scoped-db.d.ts.map +1 -1
  95. package/dist/kernel/database/scoped-db.js +12 -0
  96. package/dist/kernel/database/tx-context.d.ts +8 -0
  97. package/dist/kernel/database/tx-context.d.ts.map +1 -1
  98. package/dist/kernel/database/tx-context.js +13 -0
  99. package/dist/kernel/hooks/create-context.d.ts +2 -0
  100. package/dist/kernel/hooks/create-context.d.ts.map +1 -1
  101. package/dist/kernel/hooks/create-context.js +1 -0
  102. package/dist/kernel/hooks/types.d.ts +2 -0
  103. package/dist/kernel/hooks/types.d.ts.map +1 -1
  104. package/dist/kernel/plugin/manifest.d.ts.map +1 -1
  105. package/dist/kernel/plugin/manifest.js +9 -5
  106. package/dist/modules/analytics/service.js +2 -2
  107. package/dist/modules/audit/service.js +3 -3
  108. package/dist/modules/cart/repository/index.d.ts +13 -7
  109. package/dist/modules/cart/repository/index.d.ts.map +1 -1
  110. package/dist/modules/cart/repository/index.js +16 -10
  111. package/dist/modules/cart/schema.d.ts +17 -0
  112. package/dist/modules/cart/schema.d.ts.map +1 -1
  113. package/dist/modules/cart/schema.js +4 -0
  114. package/dist/modules/cart/service.d.ts +22 -9
  115. package/dist/modules/cart/service.d.ts.map +1 -1
  116. package/dist/modules/cart/service.js +57 -33
  117. package/dist/modules/catalog/brand-service.js +7 -7
  118. package/dist/modules/catalog/category-service.js +7 -7
  119. package/dist/modules/catalog/entity-service.d.ts +14 -7
  120. package/dist/modules/catalog/entity-service.d.ts.map +1 -1
  121. package/dist/modules/catalog/entity-service.js +109 -31
  122. package/dist/modules/catalog/read-policy.d.ts +9 -0
  123. package/dist/modules/catalog/read-policy.d.ts.map +1 -0
  124. package/dist/modules/catalog/read-policy.js +8 -0
  125. package/dist/modules/catalog/repository/index.d.ts +3 -2
  126. package/dist/modules/catalog/repository/index.d.ts.map +1 -1
  127. package/dist/modules/catalog/repository/index.js +14 -4
  128. package/dist/modules/catalog/service.d.ts +15 -13
  129. package/dist/modules/catalog/service.d.ts.map +1 -1
  130. package/dist/modules/catalog/service.js +25 -18
  131. package/dist/modules/customers/module.d.ts.map +1 -1
  132. package/dist/modules/customers/module.js +1 -0
  133. package/dist/modules/customers/service.d.ts +2 -0
  134. package/dist/modules/customers/service.d.ts.map +1 -1
  135. package/dist/modules/customers/service.js +21 -20
  136. package/dist/modules/documents/module.d.ts.map +1 -1
  137. package/dist/modules/documents/module.js +1 -0
  138. package/dist/modules/documents/service.d.ts +18 -4
  139. package/dist/modules/documents/service.d.ts.map +1 -1
  140. package/dist/modules/documents/service.js +54 -16
  141. package/dist/modules/fulfillment/module.d.ts.map +1 -1
  142. package/dist/modules/fulfillment/module.js +1 -0
  143. package/dist/modules/fulfillment/service.d.ts +2 -0
  144. package/dist/modules/fulfillment/service.d.ts.map +1 -1
  145. package/dist/modules/fulfillment/service.js +15 -6
  146. package/dist/modules/inventory/service.d.ts.map +1 -1
  147. package/dist/modules/inventory/service.js +15 -14
  148. package/dist/modules/media/service.js +6 -6
  149. package/dist/modules/orders/guest-access.d.ts +27 -0
  150. package/dist/modules/orders/guest-access.d.ts.map +1 -0
  151. package/dist/modules/orders/guest-access.js +46 -0
  152. package/dist/modules/orders/module.d.ts.map +1 -1
  153. package/dist/modules/orders/module.js +1 -0
  154. package/dist/modules/orders/quote.d.ts.map +1 -1
  155. package/dist/modules/orders/quote.js +1 -0
  156. package/dist/modules/orders/repository/index.d.ts +1 -1
  157. package/dist/modules/orders/repository/index.d.ts.map +1 -1
  158. package/dist/modules/orders/repository/index.js +2 -2
  159. package/dist/modules/orders/schema.d.ts +17 -0
  160. package/dist/modules/orders/schema.d.ts.map +1 -1
  161. package/dist/modules/orders/schema.js +5 -3
  162. package/dist/modules/orders/service.d.ts +16 -7
  163. package/dist/modules/orders/service.d.ts.map +1 -1
  164. package/dist/modules/orders/service.js +184 -55
  165. package/dist/modules/pricing/module.d.ts.map +1 -1
  166. package/dist/modules/pricing/module.js +1 -0
  167. package/dist/modules/pricing/service.d.ts +2 -0
  168. package/dist/modules/pricing/service.d.ts.map +1 -1
  169. package/dist/modules/pricing/service.js +12 -11
  170. package/dist/modules/promotions/module.d.ts.map +1 -1
  171. package/dist/modules/promotions/module.js +1 -0
  172. package/dist/modules/promotions/service.d.ts +3 -0
  173. package/dist/modules/promotions/service.d.ts.map +1 -1
  174. package/dist/modules/promotions/service.js +19 -11
  175. package/dist/modules/search/adapter.d.ts +11 -0
  176. package/dist/modules/search/adapter.d.ts.map +1 -1
  177. package/dist/modules/search/module.d.ts.map +1 -1
  178. package/dist/modules/search/module.js +4 -1
  179. package/dist/modules/search/service.d.ts +1 -0
  180. package/dist/modules/search/service.d.ts.map +1 -1
  181. package/dist/modules/search/service.js +57 -6
  182. package/dist/modules/settings/module.d.ts.map +1 -1
  183. package/dist/modules/settings/module.js +1 -0
  184. package/dist/modules/settings/service.d.ts +3 -0
  185. package/dist/modules/settings/service.d.ts.map +1 -1
  186. package/dist/modules/settings/service.js +6 -4
  187. package/dist/modules/shipping/service.js +9 -9
  188. package/dist/modules/tax/module.d.ts.map +1 -1
  189. package/dist/modules/tax/module.js +1 -0
  190. package/dist/modules/tax/service.d.ts +3 -0
  191. package/dist/modules/tax/service.d.ts.map +1 -1
  192. package/dist/modules/tax/service.js +11 -9
  193. package/dist/modules/webhooks/hook.js +2 -2
  194. package/dist/modules/webhooks/module.d.ts.map +1 -1
  195. package/dist/modules/webhooks/module.js +1 -0
  196. package/dist/modules/webhooks/service.d.ts +2 -0
  197. package/dist/modules/webhooks/service.d.ts.map +1 -1
  198. package/dist/modules/webhooks/service.js +4 -4
  199. package/dist/runtime/server.d.ts.map +1 -1
  200. package/dist/runtime/server.js +28 -2
  201. package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -1
  202. package/dist/test-utils/create-pglite-adapter.js +35 -13
  203. package/dist/test-utils/create-test-config.d.ts.map +1 -1
  204. package/dist/test-utils/create-test-config.js +4 -0
  205. package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -1
  206. package/dist/test-utils/rest-api-test-utils.js +2 -0
  207. package/dist/test-utils/test-actors.js +2 -2
  208. package/dist/utils/id.d.ts +2 -0
  209. package/dist/utils/id.d.ts.map +1 -1
  210. package/dist/utils/id.js +11 -0
  211. package/package.json +6 -5
  212. package/src/auth/actor.ts +110 -0
  213. package/src/auth/auth-schema-guard.ts +143 -0
  214. package/src/auth/auth-schema.ts +50 -19
  215. package/src/auth/middleware.ts +25 -101
  216. package/src/auth/org.ts +15 -3
  217. package/src/auth/organization-guard.ts +158 -0
  218. package/src/auth/permissions.ts +31 -8
  219. package/src/auth/role-authority.ts +107 -0
  220. package/src/auth/setup.ts +19 -1
  221. package/src/auth/strict-org-resolution.ts +7 -1
  222. package/src/auth/types.ts +1 -1
  223. package/src/config/defaults.ts +2 -0
  224. package/src/config/types.ts +31 -4
  225. package/src/hooks/checkout.ts +19 -12
  226. package/src/index.ts +21 -6
  227. package/src/interfaces/rest/audit-middleware.ts +2 -0
  228. package/src/interfaces/rest/customer-portal.ts +31 -24
  229. package/src/interfaces/rest/route-coverage.ts +103 -0
  230. package/src/interfaces/rest/router.ts +16 -10
  231. package/src/interfaces/rest/routes/admin/compensation-failures.ts +8 -5
  232. package/src/interfaces/rest/routes/admin/custom-field-proposals.ts +2 -2
  233. package/src/interfaces/rest/routes/admin/permissions.ts +3 -1
  234. package/src/interfaces/rest/routes/admin/staff.ts +161 -72
  235. package/src/interfaces/rest/routes/admin-jobs.ts +3 -3
  236. package/src/interfaces/rest/routes/audit.ts +3 -3
  237. package/src/interfaces/rest/routes/carts.ts +17 -7
  238. package/src/interfaces/rest/routes/catalog.ts +11 -0
  239. package/src/interfaces/rest/routes/checkout.ts +41 -38
  240. package/src/interfaces/rest/routes/documents.ts +15 -1
  241. package/src/interfaces/rest/routes/inventory.ts +2 -0
  242. package/src/interfaces/rest/routes/media.ts +8 -3
  243. package/src/interfaces/rest/routes/orders.ts +27 -8
  244. package/src/interfaces/rest/routes/pricing.ts +2 -2
  245. package/src/interfaces/rest/routes/promotions.ts +12 -9
  246. package/src/interfaces/rest/routes/search.ts +3 -1
  247. package/src/interfaces/rest/utils.ts +61 -2
  248. package/src/kernel/compensation/executor.ts +2 -2
  249. package/src/kernel/database/plugin-types.ts +11 -0
  250. package/src/kernel/database/scoped-db.ts +12 -0
  251. package/src/kernel/database/tx-context.ts +25 -0
  252. package/src/kernel/hooks/create-context.ts +3 -0
  253. package/src/kernel/hooks/types.ts +2 -0
  254. package/src/kernel/plugin/manifest.ts +9 -5
  255. package/src/modules/analytics/service.ts +2 -2
  256. package/src/modules/audit/service.ts +3 -3
  257. package/src/modules/cart/repository/index.ts +22 -8
  258. package/src/modules/cart/schema.ts +4 -0
  259. package/src/modules/cart/service.ts +62 -27
  260. package/src/modules/catalog/brand-service.ts +7 -7
  261. package/src/modules/catalog/category-service.ts +7 -7
  262. package/src/modules/catalog/entity-service.ts +117 -35
  263. package/src/modules/catalog/read-policy.ts +16 -0
  264. package/src/modules/catalog/repository/index.ts +19 -3
  265. package/src/modules/catalog/service.ts +46 -31
  266. package/src/modules/customers/module.ts +2 -0
  267. package/src/modules/customers/service.ts +23 -22
  268. package/src/modules/documents/module.ts +2 -0
  269. package/src/modules/documents/service.ts +74 -11
  270. package/src/modules/fulfillment/module.ts +2 -0
  271. package/src/modules/fulfillment/service.ts +17 -6
  272. package/src/modules/inventory/service.ts +15 -24
  273. package/src/modules/media/service.ts +6 -6
  274. package/src/modules/orders/guest-access.ts +55 -0
  275. package/src/modules/orders/module.ts +1 -0
  276. package/src/modules/orders/quote.ts +1 -0
  277. package/src/modules/orders/repository/index.ts +2 -0
  278. package/src/modules/orders/schema.ts +5 -3
  279. package/src/modules/orders/service.ts +302 -52
  280. package/src/modules/pricing/module.ts +2 -0
  281. package/src/modules/pricing/service.ts +14 -16
  282. package/src/modules/promotions/module.ts +2 -0
  283. package/src/modules/promotions/service.ts +25 -16
  284. package/src/modules/search/adapter.ts +9 -0
  285. package/src/modules/search/module.ts +5 -1
  286. package/src/modules/search/service.ts +55 -6
  287. package/src/modules/settings/module.ts +2 -0
  288. package/src/modules/settings/service.ts +8 -4
  289. package/src/modules/shipping/service.ts +9 -9
  290. package/src/modules/tax/module.ts +1 -0
  291. package/src/modules/tax/service.ts +13 -9
  292. package/src/modules/webhooks/hook.ts +2 -2
  293. package/src/modules/webhooks/module.ts +2 -0
  294. package/src/modules/webhooks/service.ts +6 -4
  295. package/src/runtime/server.ts +41 -2
  296. package/src/test-utils/create-pglite-adapter.ts +34 -12
  297. package/src/test-utils/create-test-config.ts +10 -6
  298. package/src/test-utils/rest-api-test-utils.ts +2 -0
  299. package/src/test-utils/test-actors.ts +2 -2
  300. package/src/utils/id.ts +20 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-schema-guard.d.ts","sourceRoot":"","sources":["../../src/auth/auth-schema-guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Compares Porulle's Drizzle auth tables against better-auth's canonical
3
+ * {@link getAuthTables} output so a dependency minor bump cannot add a column
4
+ * the declared schema omits.
5
+ */
6
+ import { getTableColumns, getTableName } from "drizzle-orm";
7
+ import { getAuthTables } from "better-auth/db";
8
+ import { apiKey } from "@better-auth/api-key";
9
+ import { organization, twoFactor, phoneNumber, jwt, bearer } from "better-auth/plugins";
10
+ import * as authSchema from "./auth-schema.js";
11
+ /**
12
+ * Every plugin {@link createAuth} can enable, not only the ones it enables by
13
+ * default. The shipped schema has to satisfy any configuration a merchant
14
+ * chooses, so the guard compares against the maximal table set: a column that
15
+ * only `twoFactor` needs is still a column this package must declare.
16
+ */
17
+ export const AUTH_SCHEMA_GUARD_OPTIONS = {
18
+ plugins: [
19
+ organization({ roles: {} }),
20
+ bearer(),
21
+ jwt(),
22
+ twoFactor({ issuer: "porulle-auth-schema-guard" }),
23
+ apiKey(),
24
+ phoneNumber(),
25
+ ],
26
+ user: {
27
+ additionalFields: {
28
+ vendorId: { type: "string", required: false },
29
+ posOperatorPin: { type: "string", required: false },
30
+ },
31
+ },
32
+ };
33
+ /**
34
+ * Drizzle tables keyed by the SQL table name they declare, so the guard walks
35
+ * whatever models better-auth reports rather than a list someone has to
36
+ * remember to extend. A hand-maintained model list is how `jwks.alg` shipped
37
+ * missing while this guard passed.
38
+ */
39
+ function drizzleTablesByName() {
40
+ const byName = new Map();
41
+ for (const value of Object.values(authSchema)) {
42
+ try {
43
+ byName.set(getTableName(value), value);
44
+ }
45
+ catch {
46
+ // Not a Drizzle table (type export, index helper) — skip.
47
+ }
48
+ }
49
+ return byName;
50
+ }
51
+ function drizzleColumnForField(table, fieldKey, fieldName) {
52
+ const columns = getTableColumns(table);
53
+ if (fieldKey in columns) {
54
+ return columns[fieldKey];
55
+ }
56
+ for (const column of Object.values(columns)) {
57
+ if (column.name === fieldName) {
58
+ return column;
59
+ }
60
+ }
61
+ return undefined;
62
+ }
63
+ /**
64
+ * Returns every mismatch between better-auth's expected auth tables and the
65
+ * Drizzle definitions Porulle ships. An empty array means parity holds.
66
+ */
67
+ export function findAuthSchemaParityMismatches(options = AUTH_SCHEMA_GUARD_OPTIONS) {
68
+ const mismatches = [];
69
+ const authTables = getAuthTables(options);
70
+ const byName = drizzleTablesByName();
71
+ for (const [model, tableDef] of Object.entries(authTables)) {
72
+ if (!tableDef)
73
+ continue;
74
+ const drizzleTable = byName.get(tableDef.modelName);
75
+ if (!drizzleTable) {
76
+ mismatches.push({
77
+ model,
78
+ field: "*",
79
+ issue: `no drizzle table declares better-auth model "${tableDef.modelName}"`,
80
+ });
81
+ continue;
82
+ }
83
+ for (const [fieldKey, fieldAttr] of Object.entries(tableDef.fields)) {
84
+ const column = drizzleColumnForField(drizzleTable, fieldKey, fieldAttr.fieldName ?? fieldKey);
85
+ if (!column) {
86
+ mismatches.push({
87
+ model,
88
+ field: fieldKey,
89
+ issue: `drizzle column missing for better-auth field "${fieldKey}"`,
90
+ });
91
+ continue;
92
+ }
93
+ const required = fieldAttr.required !== false;
94
+ if (required && !column.notNull) {
95
+ mismatches.push({
96
+ model,
97
+ field: fieldKey,
98
+ issue: `column "${column.name}" must be NOT NULL (better-auth required)`,
99
+ });
100
+ }
101
+ }
102
+ }
103
+ return mismatches;
104
+ }
105
+ export function assertAuthSchemaParity(options = AUTH_SCHEMA_GUARD_OPTIONS) {
106
+ const mismatches = findAuthSchemaParityMismatches(options);
107
+ if (mismatches.length === 0)
108
+ return;
109
+ const detail = mismatches
110
+ .map((m) => ` ${m.model}.${m.field}: ${m.issue}`)
111
+ .join("\n");
112
+ throw new Error(`Porulle auth-schema.ts is out of sync with installed better-auth:\n${detail}`);
113
+ }
@@ -155,6 +155,57 @@ export declare const user: import("drizzle-orm/pg-core").PgTableWithColumns<{
155
155
  identity: undefined;
156
156
  generated: undefined;
157
157
  }, {}, {}>;
158
+ twoFactorEnabled: import("drizzle-orm/pg-core").PgColumn<{
159
+ name: "two_factor_enabled";
160
+ tableName: "user";
161
+ dataType: "boolean";
162
+ columnType: "PgBoolean";
163
+ data: boolean;
164
+ driverParam: boolean;
165
+ notNull: false;
166
+ hasDefault: true;
167
+ isPrimaryKey: false;
168
+ isAutoincrement: false;
169
+ hasRuntimeDefault: false;
170
+ enumValues: undefined;
171
+ baseColumn: never;
172
+ identity: undefined;
173
+ generated: undefined;
174
+ }, {}, {}>;
175
+ phoneNumber: import("drizzle-orm/pg-core").PgColumn<{
176
+ name: "phone_number";
177
+ tableName: "user";
178
+ dataType: "string";
179
+ columnType: "PgText";
180
+ data: string;
181
+ driverParam: string;
182
+ notNull: false;
183
+ hasDefault: false;
184
+ isPrimaryKey: false;
185
+ isAutoincrement: false;
186
+ hasRuntimeDefault: false;
187
+ enumValues: [string, ...string[]];
188
+ baseColumn: never;
189
+ identity: undefined;
190
+ generated: undefined;
191
+ }, {}, {}>;
192
+ phoneNumberVerified: import("drizzle-orm/pg-core").PgColumn<{
193
+ name: "phone_number_verified";
194
+ tableName: "user";
195
+ dataType: "boolean";
196
+ columnType: "PgBoolean";
197
+ data: boolean;
198
+ driverParam: boolean;
199
+ notNull: false;
200
+ hasDefault: true;
201
+ isPrimaryKey: false;
202
+ isAutoincrement: false;
203
+ hasRuntimeDefault: false;
204
+ enumValues: undefined;
205
+ baseColumn: never;
206
+ identity: undefined;
207
+ generated: undefined;
208
+ }, {}, {}>;
158
209
  };
159
210
  dialect: "pg";
160
211
  }>;
@@ -339,6 +390,23 @@ export declare const account: import("drizzle-orm/pg-core").PgTableWithColumns<{
339
390
  identity: undefined;
340
391
  generated: undefined;
341
392
  }, {}, {}>;
393
+ issuer: import("drizzle-orm/pg-core").PgColumn<{
394
+ name: "issuer";
395
+ tableName: "account";
396
+ dataType: "string";
397
+ columnType: "PgText";
398
+ data: string;
399
+ driverParam: string;
400
+ notNull: true;
401
+ hasDefault: false;
402
+ isPrimaryKey: false;
403
+ isAutoincrement: false;
404
+ hasRuntimeDefault: false;
405
+ enumValues: [string, ...string[]];
406
+ baseColumn: never;
407
+ identity: undefined;
408
+ generated: undefined;
409
+ }, {}, {}>;
342
410
  accountId: import("drizzle-orm/pg-core").PgColumn<{
343
411
  name: "account_id";
344
412
  tableName: "account";
@@ -1469,6 +1537,166 @@ export declare const jwks: import("drizzle-orm/pg-core").PgTableWithColumns<{
1469
1537
  identity: undefined;
1470
1538
  generated: undefined;
1471
1539
  }, {}, {}>;
1540
+ alg: import("drizzle-orm/pg-core").PgColumn<{
1541
+ name: "alg";
1542
+ tableName: "jwks";
1543
+ dataType: "string";
1544
+ columnType: "PgText";
1545
+ data: string;
1546
+ driverParam: string;
1547
+ notNull: false;
1548
+ hasDefault: false;
1549
+ isPrimaryKey: false;
1550
+ isAutoincrement: false;
1551
+ hasRuntimeDefault: false;
1552
+ enumValues: [string, ...string[]];
1553
+ baseColumn: never;
1554
+ identity: undefined;
1555
+ generated: undefined;
1556
+ }, {}, {}>;
1557
+ crv: import("drizzle-orm/pg-core").PgColumn<{
1558
+ name: "crv";
1559
+ tableName: "jwks";
1560
+ dataType: "string";
1561
+ columnType: "PgText";
1562
+ data: string;
1563
+ driverParam: string;
1564
+ notNull: false;
1565
+ hasDefault: false;
1566
+ isPrimaryKey: false;
1567
+ isAutoincrement: false;
1568
+ hasRuntimeDefault: false;
1569
+ enumValues: [string, ...string[]];
1570
+ baseColumn: never;
1571
+ identity: undefined;
1572
+ generated: undefined;
1573
+ }, {}, {}>;
1574
+ };
1575
+ dialect: "pg";
1576
+ }>;
1577
+ export declare const twoFactor: import("drizzle-orm/pg-core").PgTableWithColumns<{
1578
+ name: "twoFactor";
1579
+ schema: undefined;
1580
+ columns: {
1581
+ id: import("drizzle-orm/pg-core").PgColumn<{
1582
+ name: "id";
1583
+ tableName: "twoFactor";
1584
+ dataType: "string";
1585
+ columnType: "PgText";
1586
+ data: string;
1587
+ driverParam: string;
1588
+ notNull: true;
1589
+ hasDefault: false;
1590
+ isPrimaryKey: true;
1591
+ isAutoincrement: false;
1592
+ hasRuntimeDefault: false;
1593
+ enumValues: [string, ...string[]];
1594
+ baseColumn: never;
1595
+ identity: undefined;
1596
+ generated: undefined;
1597
+ }, {}, {}>;
1598
+ secret: import("drizzle-orm/pg-core").PgColumn<{
1599
+ name: "secret";
1600
+ tableName: "twoFactor";
1601
+ dataType: "string";
1602
+ columnType: "PgText";
1603
+ data: string;
1604
+ driverParam: string;
1605
+ notNull: true;
1606
+ hasDefault: false;
1607
+ isPrimaryKey: false;
1608
+ isAutoincrement: false;
1609
+ hasRuntimeDefault: false;
1610
+ enumValues: [string, ...string[]];
1611
+ baseColumn: never;
1612
+ identity: undefined;
1613
+ generated: undefined;
1614
+ }, {}, {}>;
1615
+ backupCodes: import("drizzle-orm/pg-core").PgColumn<{
1616
+ name: "backup_codes";
1617
+ tableName: "twoFactor";
1618
+ dataType: "string";
1619
+ columnType: "PgText";
1620
+ data: string;
1621
+ driverParam: string;
1622
+ notNull: true;
1623
+ hasDefault: false;
1624
+ isPrimaryKey: false;
1625
+ isAutoincrement: false;
1626
+ hasRuntimeDefault: false;
1627
+ enumValues: [string, ...string[]];
1628
+ baseColumn: never;
1629
+ identity: undefined;
1630
+ generated: undefined;
1631
+ }, {}, {}>;
1632
+ userId: import("drizzle-orm/pg-core").PgColumn<{
1633
+ name: "user_id";
1634
+ tableName: "twoFactor";
1635
+ dataType: "string";
1636
+ columnType: "PgText";
1637
+ data: string;
1638
+ driverParam: string;
1639
+ notNull: true;
1640
+ hasDefault: false;
1641
+ isPrimaryKey: false;
1642
+ isAutoincrement: false;
1643
+ hasRuntimeDefault: false;
1644
+ enumValues: [string, ...string[]];
1645
+ baseColumn: never;
1646
+ identity: undefined;
1647
+ generated: undefined;
1648
+ }, {}, {}>;
1649
+ verified: import("drizzle-orm/pg-core").PgColumn<{
1650
+ name: "verified";
1651
+ tableName: "twoFactor";
1652
+ dataType: "boolean";
1653
+ columnType: "PgBoolean";
1654
+ data: boolean;
1655
+ driverParam: boolean;
1656
+ notNull: false;
1657
+ hasDefault: true;
1658
+ isPrimaryKey: false;
1659
+ isAutoincrement: false;
1660
+ hasRuntimeDefault: false;
1661
+ enumValues: undefined;
1662
+ baseColumn: never;
1663
+ identity: undefined;
1664
+ generated: undefined;
1665
+ }, {}, {}>;
1666
+ failedVerificationCount: import("drizzle-orm/pg-core").PgColumn<{
1667
+ name: "failed_verification_count";
1668
+ tableName: "twoFactor";
1669
+ dataType: "number";
1670
+ columnType: "PgInteger";
1671
+ data: number;
1672
+ driverParam: string | number;
1673
+ notNull: false;
1674
+ hasDefault: true;
1675
+ isPrimaryKey: false;
1676
+ isAutoincrement: false;
1677
+ hasRuntimeDefault: false;
1678
+ enumValues: undefined;
1679
+ baseColumn: never;
1680
+ identity: undefined;
1681
+ generated: undefined;
1682
+ }, {}, {}>;
1683
+ lockedUntil: import("drizzle-orm/pg-core").PgColumn<{
1684
+ name: "locked_until";
1685
+ tableName: "twoFactor";
1686
+ dataType: "date";
1687
+ columnType: "PgTimestamp";
1688
+ data: Date;
1689
+ driverParam: string;
1690
+ notNull: false;
1691
+ hasDefault: false;
1692
+ isPrimaryKey: false;
1693
+ isAutoincrement: false;
1694
+ hasRuntimeDefault: false;
1695
+ enumValues: undefined;
1696
+ baseColumn: never;
1697
+ identity: undefined;
1698
+ generated: undefined;
1699
+ }, {}, {}>;
1472
1700
  };
1473
1701
  dialect: "pg";
1474
1702
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"auth-schema.d.ts","sourceRoot":"","sources":["../../src/auth/auth-schema.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAaf,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAclB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBlB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOvB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUjB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAarB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBjB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAMf,CAAC"}
1
+ {"version":3,"file":"auth-schema.d.ts","sourceRoot":"","sources":["../../src/auth/auth-schema.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmBf,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAclB,CAAC;AAEH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BnB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUvB,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAOvB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUjB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAarB,CAAC;AAEH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBjB,CAAC;AAEH,eAAO,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQf,CAAC;AAEH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAUpB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { pgTable, text, timestamp, boolean, integer, } from "drizzle-orm/pg-core";
1
+ import { pgTable, text, timestamp, boolean, integer, uniqueIndex, } from "drizzle-orm/pg-core";
2
2
  export const user = pgTable("user", {
3
3
  id: text("id").primaryKey(),
4
4
  name: text("name").notNull(),
@@ -12,6 +12,12 @@ export const user = pgTable("user", {
12
12
  .notNull(),
13
13
  vendorId: text("vendor_id"),
14
14
  posOperatorPin: text("pos_operator_pin"),
15
+ // Contributed by the twoFactor and phoneNumber plugins. Declared
16
+ // unconditionally: the plugins are config-gated, but one shipped schema has
17
+ // to satisfy every configuration a merchant can choose.
18
+ twoFactorEnabled: boolean("two_factor_enabled").default(false),
19
+ phoneNumber: text("phone_number").unique(),
20
+ phoneNumberVerified: boolean("phone_number_verified").default(false),
15
21
  });
16
22
  export const session = pgTable("session", {
17
23
  id: text("id").primaryKey(),
@@ -30,6 +36,7 @@ export const session = pgTable("session", {
30
36
  });
31
37
  export const account = pgTable("account", {
32
38
  id: text("id").primaryKey(),
39
+ issuer: text("issuer").notNull(),
33
40
  accountId: text("account_id").notNull(),
34
41
  providerId: text("provider_id").notNull(),
35
42
  userId: text("user_id")
@@ -46,7 +53,9 @@ export const account = pgTable("account", {
46
53
  updatedAt: timestamp("updated_at")
47
54
  .$onUpdate(() => /* @__PURE__ */ new Date())
48
55
  .notNull(),
49
- });
56
+ }, (table) => [
57
+ uniqueIndex("account_issuer_account_id_unique").on(table.issuer, table.accountId),
58
+ ]);
50
59
  export const verification = pgTable("verification", {
51
60
  id: text("id").primaryKey(),
52
61
  identifier: text("identifier").notNull(),
@@ -121,4 +130,17 @@ export const jwks = pgTable("jwks", {
121
130
  privateKey: text("private_key").notNull(),
122
131
  createdAt: timestamp("created_at").notNull(),
123
132
  expiresAt: timestamp("expires_at"),
133
+ alg: text("alg"),
134
+ crv: text("crv"),
135
+ });
136
+ export const twoFactor = pgTable("twoFactor", {
137
+ id: text("id").primaryKey(),
138
+ secret: text("secret").notNull(),
139
+ backupCodes: text("backup_codes").notNull(),
140
+ userId: text("user_id")
141
+ .notNull()
142
+ .references(() => user.id, { onDelete: "cascade" }),
143
+ verified: boolean("verified").default(false),
144
+ failedVerificationCount: integer("failed_verification_count").default(0),
145
+ lockedUntil: timestamp("locked_until"),
124
146
  });
@@ -1,5 +1,6 @@
1
1
  import type { MiddlewareHandler } from "hono";
2
2
  import type { CommerceConfig } from "../config/types.js";
3
3
  import type { AuthInstance } from "./setup.js";
4
+ export { DEFAULT_CUSTOMER_PERMISSIONS } from "./actor.js";
4
5
  export declare function authMiddleware(auth: AuthInstance, config: CommerceConfig): MiddlewareHandler;
5
6
  //# sourceMappingURL=middleware.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAkC/C,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,cAAc,GACrB,iBAAiB,CA4PnB"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAY/C,OAAO,EAAE,4BAA4B,EAAE,MAAM,YAAY,CAAC;AAK1D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,YAAY,EAClB,MAAM,EAAE,cAAc,GACrB,iBAAiB,CAiMnB"}
@@ -1,28 +1,15 @@
1
+ import { getCustomerPermissions, resolveActor } from "./actor.js";
1
2
  import { DEFAULT_ORG_ID } from "./org.js";
2
3
  import { isStrictOrgResolution } from "./strict-org-resolution.js";
3
- const DEFAULT_CUSTOMER_PERMISSIONS = [
4
- "catalog:read",
5
- "cart:create",
6
- "cart:read",
7
- "cart:update",
8
- "orders:create",
9
- "orders:read:own",
10
- "customers:read:self",
11
- "customers:update:self",
12
- ];
13
- function getCustomerPermissions(config) {
14
- return config.auth?.customerPermissions ?? [...DEFAULT_CUSTOMER_PERMISSIONS];
4
+ function emptyToNull(value) {
5
+ return value == null || value === "" ? null : value;
15
6
  }
7
+ // Exported so the storefront contract can be pinned by a test: an anonymous
8
+ // visitor resolved by `storeResolver` gets these permissions, so dropping
9
+ // `catalog:read` here would 401 every public storefront read.
10
+ export { DEFAULT_CUSTOMER_PERMISSIONS } from "./actor.js";
16
11
  const LEGACY_STORE_RESOLVER_WARN_COOLDOWN_MS = 60_000;
17
12
  let lastLegacyStoreResolverWarnAt = 0;
18
- function resolvePermissions(session, config) {
19
- const role = session.session.activeOrganizationRole;
20
- if (!role) {
21
- return getCustomerPermissions(config);
22
- }
23
- const roleConfig = config.auth?.roles?.[role];
24
- return roleConfig ? roleConfig.permissions : [];
25
- }
26
13
  export function authMiddleware(auth, config) {
27
14
  return async (c, next) => {
28
15
  // Resolve the default org from config, falling back to deprecated constant
@@ -44,74 +31,9 @@ export function authMiddleware(auth, config) {
44
31
  }
45
32
  }
46
33
  }
47
- const session = (await auth.api.getSession({
48
- headers: c.req.raw.headers,
49
- }));
50
- if (session) {
51
- // Better Auth's session stores activeOrganizationId, but often not the role.
52
- // For single-store apps (org_default), users may never call set-active,
53
- // so activeOrganizationId can be null even for valid org members.
54
- let role = session.session.activeOrganizationRole;
55
- let orgId = session.session.activeOrganizationId;
56
- // If no active org, try to resolve the user's membership in org_default.
57
- // This handles the common case where the user is a member but hasn't
58
- // called organization/set-active (single-store apps, seed scripts, tests).
59
- if (!role && auth.api.getFullOrganization) {
60
- try {
61
- const org = await auth.api.getFullOrganization({
62
- query: { organizationId: orgId ?? defaultOrgId },
63
- headers: c.req.raw.headers,
64
- });
65
- if (org?.members) {
66
- const membership = org.members.find((m) => m.userId === session.user.id);
67
- if (membership) {
68
- role = membership.role;
69
- orgId = orgId ?? defaultOrgId;
70
- }
71
- }
72
- }
73
- catch {
74
- // fall through — treat as customer
75
- }
76
- }
77
- // Also try getActiveMemberRole if active org is set
78
- if (!role && orgId && auth.api.getActiveMemberRole) {
79
- try {
80
- const roleResult = await auth.api.getActiveMemberRole({
81
- headers: c.req.raw.headers,
82
- });
83
- role = roleResult?.role;
84
- }
85
- catch {
86
- // fall through — treat as customer
87
- }
88
- }
89
- // For customers without org membership, resolve the store from the request.
90
- // This enables multi-store SaaS where each storefront is a different org.
91
- if (!orgId && config.auth?.storeResolver) {
92
- try {
93
- const resolved = await config.auth.storeResolver(c.req.raw);
94
- if (resolved)
95
- orgId = resolved;
96
- }
97
- catch {
98
- // fall through — use defaultOrgId
99
- }
100
- }
101
- const enrichedSession = {
102
- ...session,
103
- session: { ...session.session, activeOrganizationRole: role ?? null },
104
- };
105
- c.set("actor", {
106
- type: "user",
107
- userId: session.user.id,
108
- email: session.user.email ?? null,
109
- name: session.user.name ?? "User",
110
- vendorId: session.user.vendorId ?? null,
111
- organizationId: orgId ?? defaultOrgId,
112
- role: role ?? "customer",
113
- permissions: resolvePermissions(enrichedSession, config),
114
- });
34
+ const actor = await resolveActor(c.req.raw.headers, auth, config, c.req.raw);
35
+ if (actor) {
36
+ c.set("actor", actor);
115
37
  await next();
116
38
  return;
117
39
  }
@@ -166,9 +88,11 @@ export function authMiddleware(auth, config) {
166
88
  : null;
167
89
  const metaOrg = typeof meta?.organizationId === "string" ? meta.organizationId : undefined;
168
90
  const orgId = (metaOrg ?? apiKey.organizationId ?? defaultOrgId);
169
- const userId = ((typeof meta?.operatorId === "string" ? meta.operatorId : undefined)
170
- ?? apiKey.referenceId
171
- ?? "");
91
+ // No operator and no reference means the key carries no user
92
+ // identity. Leave it absent rather than substituting a shared
93
+ // placeholder, which would make every such key look like one person.
94
+ const userId = emptyToNull((typeof meta?.operatorId === "string" ? meta.operatorId : undefined) ??
95
+ (typeof apiKey.referenceId === "string" ? apiKey.referenceId : undefined));
172
96
  // Better Auth stores permissions as Record<string, string[]>
173
97
  // (e.g. {"catalog":["read","create"]}). Flatten to the
174
98
  // "resource:action" string[] format the engine expects.
@@ -217,7 +141,7 @@ export function authMiddleware(auth, config) {
217
141
  // services can scope queries correctly.
218
142
  c.set("actor", {
219
143
  type: "user",
220
- userId: "anonymous",
144
+ userId: null,
221
145
  email: null,
222
146
  name: "Anonymous",
223
147
  vendorId: null,
@@ -10,14 +10,20 @@ export declare const DEFAULT_ORG_ID = "org_default";
10
10
  * config (available at boot) and services (which don't have config access).
11
11
  */
12
12
  export declare function setBootDefaultOrgId(orgId: string): void;
13
+ /**
14
+ * Resolves org using an explicit config default — not ambient boot state.
15
+ * Use when the caller holds CommerceConfig and may lack an actor organizationId.
16
+ */
17
+ export declare function resolveOrgIdForCommerce(actor: unknown, config?: CommerceConfig | null): string;
13
18
  /**
14
19
  * Extracts the organization ID from an actor.
15
20
  *
16
21
  * Resolution order:
17
22
  * 1. Actor's organizationId (set by middleware from session/API key/storeResolver)
18
23
  * 2. Explicit defaultOrgId parameter (caller override)
19
- * 3. Boot-time default (from config.auth.defaultOrganizationId via setBootDefaultOrgId)
20
- * 4. Deprecated fallback to DEFAULT_ORG_ID (will be removed)
24
+ * 3. Strict check throw OrgResolutionError when enabled
25
+ * 4. Boot-time default (from config.auth.defaultOrganizationId via setBootDefaultOrgId)
26
+ * 5. Deprecated fallback to DEFAULT_ORG_ID (will be removed)
21
27
  */
22
28
  export declare function resolveOrgId(actor: unknown, defaultOrgId?: string, commerceConfig?: CommerceConfig): string;
23
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../../src/auth/org.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAiBzD;;;GAGG;AACH,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAS5C;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,cAAc,GAC9B,MAAM,CAcR;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,OAAO,EACX,SAAS,SAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOf"}
1
+ {"version":3,"file":"org.d.ts","sourceRoot":"","sources":["../../src/auth/org.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAiBzD;;;GAGG;AACH,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAS5C;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,GAC7B,MAAM,CAER;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,YAAY,CAAC,EAAE,MAAM,EACrB,cAAc,CAAC,EAAE,cAAc,GAC9B,MAAM,CAcR;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,OAAO,EACX,SAAS,SAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAOf"}
package/dist/auth/org.js CHANGED
@@ -29,14 +29,22 @@ let _bootDefaultOrgId;
29
29
  export function setBootDefaultOrgId(orgId) {
30
30
  _bootDefaultOrgId = orgId;
31
31
  }
32
+ /**
33
+ * Resolves org using an explicit config default — not ambient boot state.
34
+ * Use when the caller holds CommerceConfig and may lack an actor organizationId.
35
+ */
36
+ export function resolveOrgIdForCommerce(actor, config) {
37
+ return resolveOrgId(actor, config?.auth?.defaultOrganizationId, config ?? undefined);
38
+ }
32
39
  /**
33
40
  * Extracts the organization ID from an actor.
34
41
  *
35
42
  * Resolution order:
36
43
  * 1. Actor's organizationId (set by middleware from session/API key/storeResolver)
37
44
  * 2. Explicit defaultOrgId parameter (caller override)
38
- * 3. Boot-time default (from config.auth.defaultOrganizationId via setBootDefaultOrgId)
39
- * 4. Deprecated fallback to DEFAULT_ORG_ID (will be removed)
45
+ * 3. Strict check throw OrgResolutionError when enabled
46
+ * 4. Boot-time default (from config.auth.defaultOrganizationId via setBootDefaultOrgId)
47
+ * 5. Deprecated fallback to DEFAULT_ORG_ID (will be removed)
40
48
  */
41
49
  export function resolveOrgId(actor, defaultOrgId, commerceConfig) {
42
50
  if (actor != null && typeof actor === "object" && "organizationId" in actor) {
@@ -46,11 +54,11 @@ export function resolveOrgId(actor, defaultOrgId, commerceConfig) {
46
54
  }
47
55
  if (defaultOrgId)
48
56
  return defaultOrgId;
49
- if (_bootDefaultOrgId)
50
- return _bootDefaultOrgId;
51
57
  if (isStrictOrgResolution(commerceConfig)) {
52
58
  throw new OrgResolutionError("Organization could not be resolved: no actor organizationId, no defaultOrgId, and no configured default organization.");
53
59
  }
60
+ if (_bootDefaultOrgId)
61
+ return _bootDefaultOrgId;
54
62
  warnDeprecatedOrgDefaultFallback();
55
63
  return DEFAULT_ORG_ID;
56
64
  }
@@ -0,0 +1,5 @@
1
+ import type { MiddlewareHandler } from "hono";
2
+ import type { CommerceConfig } from "../config/types.js";
3
+ import type { DrizzleDatabase } from "../kernel/database/drizzle-db.js";
4
+ export declare function organizationGuard(db: DrizzleDatabase, config: CommerceConfig): MiddlewareHandler;
5
+ //# sourceMappingURL=organization-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-guard.d.ts","sourceRoot":"","sources":["../../src/auth/organization-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAE9C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AA+DxE,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,eAAe,EACnB,MAAM,EAAE,cAAc,GACrB,iBAAiB,CAwFnB"}