@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.
- package/dist/auth/actor.d.ts +10 -0
- package/dist/auth/actor.d.ts.map +1 -0
- package/dist/auth/actor.js +91 -0
- package/dist/auth/auth-schema-guard.d.ts +2444 -0
- package/dist/auth/auth-schema-guard.d.ts.map +1 -0
- package/dist/auth/auth-schema-guard.js +113 -0
- package/dist/auth/auth-schema.d.ts +228 -0
- package/dist/auth/auth-schema.d.ts.map +1 -1
- package/dist/auth/auth-schema.js +24 -2
- package/dist/auth/middleware.d.ts +1 -0
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +16 -92
- package/dist/auth/org.d.ts +8 -2
- package/dist/auth/org.d.ts.map +1 -1
- package/dist/auth/org.js +12 -4
- package/dist/auth/organization-guard.d.ts +5 -0
- package/dist/auth/organization-guard.d.ts.map +1 -0
- package/dist/auth/organization-guard.js +124 -0
- package/dist/auth/permissions.d.ts +10 -0
- package/dist/auth/permissions.d.ts.map +1 -1
- package/dist/auth/permissions.js +31 -7
- package/dist/auth/role-authority.d.ts +44 -0
- package/dist/auth/role-authority.d.ts.map +1 -0
- package/dist/auth/role-authority.js +85 -0
- package/dist/auth/setup.d.ts.map +1 -1
- package/dist/auth/setup.js +19 -1
- package/dist/auth/strict-org-resolution.d.ts.map +1 -1
- package/dist/auth/strict-org-resolution.js +9 -1
- package/dist/auth/types.d.ts +1 -1
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +2 -0
- package/dist/config/types.d.ts +32 -4
- package/dist/config/types.d.ts.map +1 -1
- package/dist/hooks/checkout.d.ts.map +1 -1
- package/dist/hooks/checkout.js +10 -9
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/interfaces/rest/audit-middleware.d.ts.map +1 -1
- package/dist/interfaces/rest/audit-middleware.js +2 -0
- package/dist/interfaces/rest/customer-portal.d.ts.map +1 -1
- package/dist/interfaces/rest/customer-portal.js +9 -8
- package/dist/interfaces/rest/route-coverage.d.ts +14 -0
- package/dist/interfaces/rest/route-coverage.d.ts.map +1 -0
- package/dist/interfaces/rest/route-coverage.js +81 -0
- package/dist/interfaces/rest/router.d.ts +7 -2
- package/dist/interfaces/rest/router.d.ts.map +1 -1
- package/dist/interfaces/rest/router.js +8 -4
- package/dist/interfaces/rest/routes/admin/compensation-failures.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/admin/compensation-failures.js +7 -5
- package/dist/interfaces/rest/routes/admin/custom-field-proposals.js +2 -2
- package/dist/interfaces/rest/routes/admin/permissions.d.ts +1 -1
- package/dist/interfaces/rest/routes/admin/permissions.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/admin/permissions.js +2 -0
- package/dist/interfaces/rest/routes/admin/staff.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/admin/staff.js +126 -66
- package/dist/interfaces/rest/routes/admin-jobs.js +3 -3
- package/dist/interfaces/rest/routes/audit.js +3 -3
- package/dist/interfaces/rest/routes/carts.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/carts.js +13 -10
- package/dist/interfaces/rest/routes/catalog.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/catalog.js +10 -2
- package/dist/interfaces/rest/routes/checkout.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/checkout.js +30 -35
- package/dist/interfaces/rest/routes/documents.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/documents.js +10 -5
- package/dist/interfaces/rest/routes/inventory.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/inventory.js +2 -0
- package/dist/interfaces/rest/routes/media.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/media.js +7 -3
- package/dist/interfaces/rest/routes/orders.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/orders.js +26 -8
- package/dist/interfaces/rest/routes/pricing.js +2 -2
- package/dist/interfaces/rest/routes/promotions.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/promotions.js +13 -10
- package/dist/interfaces/rest/routes/search.d.ts.map +1 -1
- package/dist/interfaces/rest/routes/search.js +2 -1
- package/dist/interfaces/rest/schemas/carts.d.ts +7 -0
- package/dist/interfaces/rest/schemas/carts.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/customer-portal.d.ts +35 -0
- package/dist/interfaces/rest/schemas/customer-portal.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/orders.d.ts +204 -0
- package/dist/interfaces/rest/schemas/orders.d.ts.map +1 -1
- package/dist/interfaces/rest/schemas/responses.d.ts +71 -0
- package/dist/interfaces/rest/schemas/responses.d.ts.map +1 -1
- package/dist/interfaces/rest/utils.d.ts +15 -0
- package/dist/interfaces/rest/utils.d.ts.map +1 -1
- package/dist/interfaces/rest/utils.js +45 -2
- package/dist/kernel/compensation/executor.js +2 -2
- package/dist/kernel/database/plugin-types.d.ts +11 -0
- package/dist/kernel/database/plugin-types.d.ts.map +1 -1
- package/dist/kernel/database/scoped-db.d.ts +12 -0
- package/dist/kernel/database/scoped-db.d.ts.map +1 -1
- package/dist/kernel/database/scoped-db.js +12 -0
- package/dist/kernel/database/tx-context.d.ts +8 -0
- package/dist/kernel/database/tx-context.d.ts.map +1 -1
- package/dist/kernel/database/tx-context.js +13 -0
- package/dist/kernel/hooks/create-context.d.ts +2 -0
- package/dist/kernel/hooks/create-context.d.ts.map +1 -1
- package/dist/kernel/hooks/create-context.js +1 -0
- package/dist/kernel/hooks/types.d.ts +2 -0
- package/dist/kernel/hooks/types.d.ts.map +1 -1
- package/dist/kernel/plugin/manifest.d.ts.map +1 -1
- package/dist/kernel/plugin/manifest.js +9 -5
- package/dist/modules/analytics/service.js +2 -2
- package/dist/modules/audit/service.js +3 -3
- package/dist/modules/cart/repository/index.d.ts +13 -7
- package/dist/modules/cart/repository/index.d.ts.map +1 -1
- package/dist/modules/cart/repository/index.js +16 -10
- package/dist/modules/cart/schema.d.ts +17 -0
- package/dist/modules/cart/schema.d.ts.map +1 -1
- package/dist/modules/cart/schema.js +4 -0
- package/dist/modules/cart/service.d.ts +22 -9
- package/dist/modules/cart/service.d.ts.map +1 -1
- package/dist/modules/cart/service.js +57 -33
- package/dist/modules/catalog/brand-service.js +7 -7
- package/dist/modules/catalog/category-service.js +7 -7
- package/dist/modules/catalog/entity-service.d.ts +14 -7
- package/dist/modules/catalog/entity-service.d.ts.map +1 -1
- package/dist/modules/catalog/entity-service.js +109 -31
- package/dist/modules/catalog/read-policy.d.ts +9 -0
- package/dist/modules/catalog/read-policy.d.ts.map +1 -0
- package/dist/modules/catalog/read-policy.js +8 -0
- package/dist/modules/catalog/repository/index.d.ts +3 -2
- package/dist/modules/catalog/repository/index.d.ts.map +1 -1
- package/dist/modules/catalog/repository/index.js +14 -4
- package/dist/modules/catalog/service.d.ts +15 -13
- package/dist/modules/catalog/service.d.ts.map +1 -1
- package/dist/modules/catalog/service.js +25 -18
- package/dist/modules/customers/module.d.ts.map +1 -1
- package/dist/modules/customers/module.js +1 -0
- package/dist/modules/customers/service.d.ts +2 -0
- package/dist/modules/customers/service.d.ts.map +1 -1
- package/dist/modules/customers/service.js +21 -20
- package/dist/modules/documents/module.d.ts.map +1 -1
- package/dist/modules/documents/module.js +1 -0
- package/dist/modules/documents/service.d.ts +18 -4
- package/dist/modules/documents/service.d.ts.map +1 -1
- package/dist/modules/documents/service.js +54 -16
- package/dist/modules/fulfillment/module.d.ts.map +1 -1
- package/dist/modules/fulfillment/module.js +1 -0
- package/dist/modules/fulfillment/service.d.ts +2 -0
- package/dist/modules/fulfillment/service.d.ts.map +1 -1
- package/dist/modules/fulfillment/service.js +15 -6
- package/dist/modules/inventory/service.d.ts.map +1 -1
- package/dist/modules/inventory/service.js +15 -14
- package/dist/modules/media/service.js +6 -6
- package/dist/modules/orders/guest-access.d.ts +27 -0
- package/dist/modules/orders/guest-access.d.ts.map +1 -0
- package/dist/modules/orders/guest-access.js +46 -0
- package/dist/modules/orders/module.d.ts.map +1 -1
- package/dist/modules/orders/module.js +1 -0
- package/dist/modules/orders/quote.d.ts.map +1 -1
- package/dist/modules/orders/quote.js +1 -0
- package/dist/modules/orders/repository/index.d.ts +1 -1
- package/dist/modules/orders/repository/index.d.ts.map +1 -1
- package/dist/modules/orders/repository/index.js +2 -2
- package/dist/modules/orders/schema.d.ts +17 -0
- package/dist/modules/orders/schema.d.ts.map +1 -1
- package/dist/modules/orders/schema.js +5 -3
- package/dist/modules/orders/service.d.ts +16 -7
- package/dist/modules/orders/service.d.ts.map +1 -1
- package/dist/modules/orders/service.js +184 -55
- package/dist/modules/pricing/module.d.ts.map +1 -1
- package/dist/modules/pricing/module.js +1 -0
- package/dist/modules/pricing/service.d.ts +2 -0
- package/dist/modules/pricing/service.d.ts.map +1 -1
- package/dist/modules/pricing/service.js +12 -11
- package/dist/modules/promotions/module.d.ts.map +1 -1
- package/dist/modules/promotions/module.js +1 -0
- package/dist/modules/promotions/service.d.ts +3 -0
- package/dist/modules/promotions/service.d.ts.map +1 -1
- package/dist/modules/promotions/service.js +19 -11
- package/dist/modules/search/adapter.d.ts +11 -0
- package/dist/modules/search/adapter.d.ts.map +1 -1
- package/dist/modules/search/module.d.ts.map +1 -1
- package/dist/modules/search/module.js +4 -1
- package/dist/modules/search/service.d.ts +1 -0
- package/dist/modules/search/service.d.ts.map +1 -1
- package/dist/modules/search/service.js +57 -6
- package/dist/modules/settings/module.d.ts.map +1 -1
- package/dist/modules/settings/module.js +1 -0
- package/dist/modules/settings/service.d.ts +3 -0
- package/dist/modules/settings/service.d.ts.map +1 -1
- package/dist/modules/settings/service.js +6 -4
- package/dist/modules/shipping/service.js +9 -9
- package/dist/modules/tax/module.d.ts.map +1 -1
- package/dist/modules/tax/module.js +1 -0
- package/dist/modules/tax/service.d.ts +3 -0
- package/dist/modules/tax/service.d.ts.map +1 -1
- package/dist/modules/tax/service.js +11 -9
- package/dist/modules/webhooks/hook.js +2 -2
- package/dist/modules/webhooks/module.d.ts.map +1 -1
- package/dist/modules/webhooks/module.js +1 -0
- package/dist/modules/webhooks/service.d.ts +2 -0
- package/dist/modules/webhooks/service.d.ts.map +1 -1
- package/dist/modules/webhooks/service.js +4 -4
- package/dist/runtime/server.d.ts.map +1 -1
- package/dist/runtime/server.js +28 -2
- package/dist/test-utils/create-pglite-adapter.d.ts.map +1 -1
- package/dist/test-utils/create-pglite-adapter.js +35 -13
- package/dist/test-utils/create-test-config.d.ts.map +1 -1
- package/dist/test-utils/create-test-config.js +4 -0
- package/dist/test-utils/rest-api-test-utils.d.ts.map +1 -1
- package/dist/test-utils/rest-api-test-utils.js +2 -0
- package/dist/test-utils/test-actors.js +2 -2
- package/dist/utils/id.d.ts +2 -0
- package/dist/utils/id.d.ts.map +1 -1
- package/dist/utils/id.js +11 -0
- package/package.json +6 -5
- package/src/auth/actor.ts +110 -0
- package/src/auth/auth-schema-guard.ts +143 -0
- package/src/auth/auth-schema.ts +50 -19
- package/src/auth/middleware.ts +25 -101
- package/src/auth/org.ts +15 -3
- package/src/auth/organization-guard.ts +158 -0
- package/src/auth/permissions.ts +31 -8
- package/src/auth/role-authority.ts +107 -0
- package/src/auth/setup.ts +19 -1
- package/src/auth/strict-org-resolution.ts +7 -1
- package/src/auth/types.ts +1 -1
- package/src/config/defaults.ts +2 -0
- package/src/config/types.ts +31 -4
- package/src/hooks/checkout.ts +19 -12
- package/src/index.ts +21 -6
- package/src/interfaces/rest/audit-middleware.ts +2 -0
- package/src/interfaces/rest/customer-portal.ts +31 -24
- package/src/interfaces/rest/route-coverage.ts +103 -0
- package/src/interfaces/rest/router.ts +16 -10
- package/src/interfaces/rest/routes/admin/compensation-failures.ts +8 -5
- package/src/interfaces/rest/routes/admin/custom-field-proposals.ts +2 -2
- package/src/interfaces/rest/routes/admin/permissions.ts +3 -1
- package/src/interfaces/rest/routes/admin/staff.ts +161 -72
- package/src/interfaces/rest/routes/admin-jobs.ts +3 -3
- package/src/interfaces/rest/routes/audit.ts +3 -3
- package/src/interfaces/rest/routes/carts.ts +17 -7
- package/src/interfaces/rest/routes/catalog.ts +11 -0
- package/src/interfaces/rest/routes/checkout.ts +41 -38
- package/src/interfaces/rest/routes/documents.ts +15 -1
- package/src/interfaces/rest/routes/inventory.ts +2 -0
- package/src/interfaces/rest/routes/media.ts +8 -3
- package/src/interfaces/rest/routes/orders.ts +27 -8
- package/src/interfaces/rest/routes/pricing.ts +2 -2
- package/src/interfaces/rest/routes/promotions.ts +12 -9
- package/src/interfaces/rest/routes/search.ts +3 -1
- package/src/interfaces/rest/utils.ts +61 -2
- package/src/kernel/compensation/executor.ts +2 -2
- package/src/kernel/database/plugin-types.ts +11 -0
- package/src/kernel/database/scoped-db.ts +12 -0
- package/src/kernel/database/tx-context.ts +25 -0
- package/src/kernel/hooks/create-context.ts +3 -0
- package/src/kernel/hooks/types.ts +2 -0
- package/src/kernel/plugin/manifest.ts +9 -5
- package/src/modules/analytics/service.ts +2 -2
- package/src/modules/audit/service.ts +3 -3
- package/src/modules/cart/repository/index.ts +22 -8
- package/src/modules/cart/schema.ts +4 -0
- package/src/modules/cart/service.ts +62 -27
- package/src/modules/catalog/brand-service.ts +7 -7
- package/src/modules/catalog/category-service.ts +7 -7
- package/src/modules/catalog/entity-service.ts +117 -35
- package/src/modules/catalog/read-policy.ts +16 -0
- package/src/modules/catalog/repository/index.ts +19 -3
- package/src/modules/catalog/service.ts +46 -31
- package/src/modules/customers/module.ts +2 -0
- package/src/modules/customers/service.ts +23 -22
- package/src/modules/documents/module.ts +2 -0
- package/src/modules/documents/service.ts +74 -11
- package/src/modules/fulfillment/module.ts +2 -0
- package/src/modules/fulfillment/service.ts +17 -6
- package/src/modules/inventory/service.ts +15 -24
- package/src/modules/media/service.ts +6 -6
- package/src/modules/orders/guest-access.ts +55 -0
- package/src/modules/orders/module.ts +1 -0
- package/src/modules/orders/quote.ts +1 -0
- package/src/modules/orders/repository/index.ts +2 -0
- package/src/modules/orders/schema.ts +5 -3
- package/src/modules/orders/service.ts +302 -52
- package/src/modules/pricing/module.ts +2 -0
- package/src/modules/pricing/service.ts +14 -16
- package/src/modules/promotions/module.ts +2 -0
- package/src/modules/promotions/service.ts +25 -16
- package/src/modules/search/adapter.ts +9 -0
- package/src/modules/search/module.ts +5 -1
- package/src/modules/search/service.ts +55 -6
- package/src/modules/settings/module.ts +2 -0
- package/src/modules/settings/service.ts +8 -4
- package/src/modules/shipping/service.ts +9 -9
- package/src/modules/tax/module.ts +1 -0
- package/src/modules/tax/service.ts +13 -9
- package/src/modules/webhooks/hook.ts +2 -2
- package/src/modules/webhooks/module.ts +2 -0
- package/src/modules/webhooks/service.ts +6 -4
- package/src/runtime/server.ts +41 -2
- package/src/test-utils/create-pglite-adapter.ts +34 -12
- package/src/test-utils/create-test-config.ts +10 -6
- package/src/test-utils/rest-api-test-utils.ts +2 -0
- package/src/test-utils/test-actors.ts +2 -2
- 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":"
|
|
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"}
|
package/dist/auth/auth-schema.js
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/auth/middleware.js
CHANGED
|
@@ -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
|
-
|
|
4
|
-
"
|
|
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
|
|
48
|
-
|
|
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
|
-
|
|
170
|
-
|
|
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:
|
|
144
|
+
userId: null,
|
|
221
145
|
email: null,
|
|
222
146
|
name: "Anonymous",
|
|
223
147
|
vendorId: null,
|
package/dist/auth/org.d.ts
CHANGED
|
@@ -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.
|
|
20
|
-
* 4.
|
|
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
|
/**
|
package/dist/auth/org.d.ts.map
CHANGED
|
@@ -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
|
|
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.
|
|
39
|
-
* 4.
|
|
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"}
|