@usebetterdev/tenant-express 0.5.1 → 0.5.3

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/index.cjs CHANGED
@@ -47,8 +47,7 @@ function createExpressMiddleware(tenant, options = {}) {
47
47
  await options.onMissingTenant(request, response);
48
48
  return;
49
49
  }
50
- const checked = tenant.resolverStrategies;
51
- const message = checked.length > 0 ? `Tenant could not be resolved. Checked: ${checked.join(", ")}` : "Tenant could not be resolved. No resolution strategies configured";
50
+ const message = (0, import_tenant_core.formatMissingTenantMessage)(tenant.resolverStrategies);
52
51
  response.status(missingTenantStatus).json({ error: message });
53
52
  }
54
53
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { toResolvableRequest } from \"@usebetterdev/tenant-core\";\nimport type {\n BetterTenantInstance,\n NodeLikeRequest,\n ResolvableRequest,\n TenantContext,\n} from \"@usebetterdev/tenant-core\";\n\nexport interface ExpressRequestLike extends NodeLikeRequest {\n headers: Record<string, string | string[] | number | undefined>;\n originalUrl?: string;\n hostname?: string;\n}\n\nexport interface ExpressResponseLike {\n status: (code: number) => ExpressResponseLike;\n json: (body: unknown) => unknown;\n /** Used to detect when the response is finished so the transaction stays open. Real Express responses always have this (inherited from http.ServerResponse). */\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n}\n\nexport type ExpressNextFunction = (error?: unknown) => void;\n\nexport interface CreateExpressMiddlewareOptions {\n missingTenantStatus?: 401 | 404;\n onMissingTenant?: (\n request: ExpressRequestLike,\n response: ExpressResponseLike,\n ) => void | Promise<void>;\n}\n\nexport interface ExpressTenantLike extends Pick<\n BetterTenantInstance,\n \"handleRequest\" | \"resolverStrategies\"\n> {}\n\nexport type ExpressMiddleware = (\n request: ExpressRequestLike,\n response: ExpressResponseLike,\n next: ExpressNextFunction,\n) => Promise<void>;\n\nexport function createExpressMiddleware(\n tenant: ExpressTenantLike,\n options: CreateExpressMiddlewareOptions = {},\n): ExpressMiddleware {\n const missingTenantStatus = options.missingTenantStatus ?? 404;\n\n return async (request, response, next) => {\n try {\n await tenant.handleRequest<ResolvableRequest, void>(\n toResolvableRequest(request),\n () =>\n new Promise<void>((resolve) => {\n const done = () => resolve();\n if (response.on) {\n response.on(\"finish\", done);\n response.on(\"close\", done);\n }\n next();\n if (!response.on) {\n done();\n }\n }),\n {\n onMissingTenant: async () => {\n if (options.onMissingTenant) {\n await options.onMissingTenant(request, response);\n return;\n }\n const checked = tenant.resolverStrategies;\n const message =\n checked.length > 0\n ? `Tenant could not be resolved. Checked: ${checked.join(\", \")}`\n : \"Tenant could not be resolved. No resolution strategies configured\";\n response.status(missingTenantStatus).json({ error: message });\n },\n },\n );\n } catch (error) {\n next(error);\n }\n };\n}\n\nexport type { TenantContext };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAoC;AA0C7B,SAAS,wBACd,QACA,UAA0C,CAAC,GACxB;AACnB,QAAM,sBAAsB,QAAQ,uBAAuB;AAE3D,SAAO,OAAO,SAAS,UAAU,SAAS;AACxC,QAAI;AACF,YAAM,OAAO;AAAA,YACX,wCAAoB,OAAO;AAAA,QAC3B,MACE,IAAI,QAAc,CAAC,YAAY;AAC7B,gBAAM,OAAO,MAAM,QAAQ;AAC3B,cAAI,SAAS,IAAI;AACf,qBAAS,GAAG,UAAU,IAAI;AAC1B,qBAAS,GAAG,SAAS,IAAI;AAAA,UAC3B;AACA,eAAK;AACL,cAAI,CAAC,SAAS,IAAI;AAChB,iBAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,QACH;AAAA,UACE,iBAAiB,YAAY;AAC3B,gBAAI,QAAQ,iBAAiB;AAC3B,oBAAM,QAAQ,gBAAgB,SAAS,QAAQ;AAC/C;AAAA,YACF;AACA,kBAAM,UAAU,OAAO;AACvB,kBAAM,UACJ,QAAQ,SAAS,IACb,0CAA0C,QAAQ,KAAK,IAAI,CAAC,KAC5D;AACN,qBAAS,OAAO,mBAAmB,EAAE,KAAK,EAAE,OAAO,QAAQ,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { formatMissingTenantMessage, toResolvableRequest } from \"@usebetterdev/tenant-core\";\nimport type {\n BetterTenantInstance,\n NodeLikeRequest,\n ResolvableRequest,\n TenantContext,\n} from \"@usebetterdev/tenant-core\";\n\nexport interface ExpressRequestLike extends NodeLikeRequest {\n headers: Record<string, string | string[] | number | undefined>;\n originalUrl?: string;\n hostname?: string;\n}\n\nexport interface ExpressResponseLike {\n status: (code: number) => ExpressResponseLike;\n json: (body: unknown) => unknown;\n /** Used to detect when the response is finished so the transaction stays open. Real Express responses always have this (inherited from http.ServerResponse). */\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n}\n\nexport type ExpressNextFunction = (error?: unknown) => void;\n\nexport interface CreateExpressMiddlewareOptions {\n missingTenantStatus?: 401 | 404;\n onMissingTenant?: (\n request: ExpressRequestLike,\n response: ExpressResponseLike,\n ) => void | Promise<void>;\n}\n\nexport interface ExpressTenantLike extends Pick<\n BetterTenantInstance,\n \"handleRequest\" | \"resolverStrategies\"\n> {}\n\nexport type ExpressMiddleware = (\n request: ExpressRequestLike,\n response: ExpressResponseLike,\n next: ExpressNextFunction,\n) => Promise<void>;\n\nexport function createExpressMiddleware(\n tenant: ExpressTenantLike,\n options: CreateExpressMiddlewareOptions = {},\n): ExpressMiddleware {\n const missingTenantStatus = options.missingTenantStatus ?? 404;\n\n return async (request, response, next) => {\n try {\n await tenant.handleRequest<ResolvableRequest, void>(\n toResolvableRequest(request),\n () =>\n new Promise<void>((resolve) => {\n const done = () => resolve();\n if (response.on) {\n response.on(\"finish\", done);\n response.on(\"close\", done);\n }\n next();\n if (!response.on) {\n done();\n }\n }),\n {\n onMissingTenant: async () => {\n if (options.onMissingTenant) {\n await options.onMissingTenant(request, response);\n return;\n }\n const message = formatMissingTenantMessage(tenant.resolverStrategies);\n response.status(missingTenantStatus).json({ error: message });\n },\n },\n );\n } catch (error) {\n next(error);\n }\n };\n}\n\nexport type { TenantContext };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAgE;AA0CzD,SAAS,wBACd,QACA,UAA0C,CAAC,GACxB;AACnB,QAAM,sBAAsB,QAAQ,uBAAuB;AAE3D,SAAO,OAAO,SAAS,UAAU,SAAS;AACxC,QAAI;AACF,YAAM,OAAO;AAAA,YACX,wCAAoB,OAAO;AAAA,QAC3B,MACE,IAAI,QAAc,CAAC,YAAY;AAC7B,gBAAM,OAAO,MAAM,QAAQ;AAC3B,cAAI,SAAS,IAAI;AACf,qBAAS,GAAG,UAAU,IAAI;AAC1B,qBAAS,GAAG,SAAS,IAAI;AAAA,UAC3B;AACA,eAAK;AACL,cAAI,CAAC,SAAS,IAAI;AAChB,iBAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,QACH;AAAA,UACE,iBAAiB,YAAY;AAC3B,gBAAI,QAAQ,iBAAiB;AAC3B,oBAAM,QAAQ,gBAAgB,SAAS,QAAQ;AAC/C;AAAA,YACF;AACA,kBAAM,cAAU,+CAA2B,OAAO,kBAAkB;AACpE,qBAAS,OAAO,mBAAmB,EAAE,KAAK,EAAE,OAAO,QAAQ,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACF;","names":[]}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/index.ts
2
- import { toResolvableRequest } from "@usebetterdev/tenant-core";
2
+ import { formatMissingTenantMessage, toResolvableRequest } from "@usebetterdev/tenant-core";
3
3
  function createExpressMiddleware(tenant, options = {}) {
4
4
  const missingTenantStatus = options.missingTenantStatus ?? 404;
5
5
  return async (request, response, next) => {
@@ -23,8 +23,7 @@ function createExpressMiddleware(tenant, options = {}) {
23
23
  await options.onMissingTenant(request, response);
24
24
  return;
25
25
  }
26
- const checked = tenant.resolverStrategies;
27
- const message = checked.length > 0 ? `Tenant could not be resolved. Checked: ${checked.join(", ")}` : "Tenant could not be resolved. No resolution strategies configured";
26
+ const message = formatMissingTenantMessage(tenant.resolverStrategies);
28
27
  response.status(missingTenantStatus).json({ error: message });
29
28
  }
30
29
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { toResolvableRequest } from \"@usebetterdev/tenant-core\";\nimport type {\n BetterTenantInstance,\n NodeLikeRequest,\n ResolvableRequest,\n TenantContext,\n} from \"@usebetterdev/tenant-core\";\n\nexport interface ExpressRequestLike extends NodeLikeRequest {\n headers: Record<string, string | string[] | number | undefined>;\n originalUrl?: string;\n hostname?: string;\n}\n\nexport interface ExpressResponseLike {\n status: (code: number) => ExpressResponseLike;\n json: (body: unknown) => unknown;\n /** Used to detect when the response is finished so the transaction stays open. Real Express responses always have this (inherited from http.ServerResponse). */\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n}\n\nexport type ExpressNextFunction = (error?: unknown) => void;\n\nexport interface CreateExpressMiddlewareOptions {\n missingTenantStatus?: 401 | 404;\n onMissingTenant?: (\n request: ExpressRequestLike,\n response: ExpressResponseLike,\n ) => void | Promise<void>;\n}\n\nexport interface ExpressTenantLike extends Pick<\n BetterTenantInstance,\n \"handleRequest\" | \"resolverStrategies\"\n> {}\n\nexport type ExpressMiddleware = (\n request: ExpressRequestLike,\n response: ExpressResponseLike,\n next: ExpressNextFunction,\n) => Promise<void>;\n\nexport function createExpressMiddleware(\n tenant: ExpressTenantLike,\n options: CreateExpressMiddlewareOptions = {},\n): ExpressMiddleware {\n const missingTenantStatus = options.missingTenantStatus ?? 404;\n\n return async (request, response, next) => {\n try {\n await tenant.handleRequest<ResolvableRequest, void>(\n toResolvableRequest(request),\n () =>\n new Promise<void>((resolve) => {\n const done = () => resolve();\n if (response.on) {\n response.on(\"finish\", done);\n response.on(\"close\", done);\n }\n next();\n if (!response.on) {\n done();\n }\n }),\n {\n onMissingTenant: async () => {\n if (options.onMissingTenant) {\n await options.onMissingTenant(request, response);\n return;\n }\n const checked = tenant.resolverStrategies;\n const message =\n checked.length > 0\n ? `Tenant could not be resolved. Checked: ${checked.join(\", \")}`\n : \"Tenant could not be resolved. No resolution strategies configured\";\n response.status(missingTenantStatus).json({ error: message });\n },\n },\n );\n } catch (error) {\n next(error);\n }\n };\n}\n\nexport type { TenantContext };\n"],"mappings":";AAAA,SAAS,2BAA2B;AA0C7B,SAAS,wBACd,QACA,UAA0C,CAAC,GACxB;AACnB,QAAM,sBAAsB,QAAQ,uBAAuB;AAE3D,SAAO,OAAO,SAAS,UAAU,SAAS;AACxC,QAAI;AACF,YAAM,OAAO;AAAA,QACX,oBAAoB,OAAO;AAAA,QAC3B,MACE,IAAI,QAAc,CAAC,YAAY;AAC7B,gBAAM,OAAO,MAAM,QAAQ;AAC3B,cAAI,SAAS,IAAI;AACf,qBAAS,GAAG,UAAU,IAAI;AAC1B,qBAAS,GAAG,SAAS,IAAI;AAAA,UAC3B;AACA,eAAK;AACL,cAAI,CAAC,SAAS,IAAI;AAChB,iBAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,QACH;AAAA,UACE,iBAAiB,YAAY;AAC3B,gBAAI,QAAQ,iBAAiB;AAC3B,oBAAM,QAAQ,gBAAgB,SAAS,QAAQ;AAC/C;AAAA,YACF;AACA,kBAAM,UAAU,OAAO;AACvB,kBAAM,UACJ,QAAQ,SAAS,IACb,0CAA0C,QAAQ,KAAK,IAAI,CAAC,KAC5D;AACN,qBAAS,OAAO,mBAAmB,EAAE,KAAK,EAAE,OAAO,QAAQ,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { formatMissingTenantMessage, toResolvableRequest } from \"@usebetterdev/tenant-core\";\nimport type {\n BetterTenantInstance,\n NodeLikeRequest,\n ResolvableRequest,\n TenantContext,\n} from \"@usebetterdev/tenant-core\";\n\nexport interface ExpressRequestLike extends NodeLikeRequest {\n headers: Record<string, string | string[] | number | undefined>;\n originalUrl?: string;\n hostname?: string;\n}\n\nexport interface ExpressResponseLike {\n status: (code: number) => ExpressResponseLike;\n json: (body: unknown) => unknown;\n /** Used to detect when the response is finished so the transaction stays open. Real Express responses always have this (inherited from http.ServerResponse). */\n on?: (event: string, listener: (...args: unknown[]) => void) => unknown;\n}\n\nexport type ExpressNextFunction = (error?: unknown) => void;\n\nexport interface CreateExpressMiddlewareOptions {\n missingTenantStatus?: 401 | 404;\n onMissingTenant?: (\n request: ExpressRequestLike,\n response: ExpressResponseLike,\n ) => void | Promise<void>;\n}\n\nexport interface ExpressTenantLike extends Pick<\n BetterTenantInstance,\n \"handleRequest\" | \"resolverStrategies\"\n> {}\n\nexport type ExpressMiddleware = (\n request: ExpressRequestLike,\n response: ExpressResponseLike,\n next: ExpressNextFunction,\n) => Promise<void>;\n\nexport function createExpressMiddleware(\n tenant: ExpressTenantLike,\n options: CreateExpressMiddlewareOptions = {},\n): ExpressMiddleware {\n const missingTenantStatus = options.missingTenantStatus ?? 404;\n\n return async (request, response, next) => {\n try {\n await tenant.handleRequest<ResolvableRequest, void>(\n toResolvableRequest(request),\n () =>\n new Promise<void>((resolve) => {\n const done = () => resolve();\n if (response.on) {\n response.on(\"finish\", done);\n response.on(\"close\", done);\n }\n next();\n if (!response.on) {\n done();\n }\n }),\n {\n onMissingTenant: async () => {\n if (options.onMissingTenant) {\n await options.onMissingTenant(request, response);\n return;\n }\n const message = formatMissingTenantMessage(tenant.resolverStrategies);\n response.status(missingTenantStatus).json({ error: message });\n },\n },\n );\n } catch (error) {\n next(error);\n }\n };\n}\n\nexport type { TenantContext };\n"],"mappings":";AAAA,SAAS,4BAA4B,2BAA2B;AA0CzD,SAAS,wBACd,QACA,UAA0C,CAAC,GACxB;AACnB,QAAM,sBAAsB,QAAQ,uBAAuB;AAE3D,SAAO,OAAO,SAAS,UAAU,SAAS;AACxC,QAAI;AACF,YAAM,OAAO;AAAA,QACX,oBAAoB,OAAO;AAAA,QAC3B,MACE,IAAI,QAAc,CAAC,YAAY;AAC7B,gBAAM,OAAO,MAAM,QAAQ;AAC3B,cAAI,SAAS,IAAI;AACf,qBAAS,GAAG,UAAU,IAAI;AAC1B,qBAAS,GAAG,SAAS,IAAI;AAAA,UAC3B;AACA,eAAK;AACL,cAAI,CAAC,SAAS,IAAI;AAChB,iBAAK;AAAA,UACP;AAAA,QACF,CAAC;AAAA,QACH;AAAA,UACE,iBAAiB,YAAY;AAC3B,gBAAI,QAAQ,iBAAiB;AAC3B,oBAAM,QAAQ,gBAAgB,SAAS,QAAQ;AAC/C;AAAA,YACF;AACA,kBAAM,UAAU,2BAA2B,OAAO,kBAAkB;AACpE,qBAAS,OAAO,mBAAmB,EAAE,KAAK,EAAE,OAAO,QAAQ,CAAC;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@usebetterdev/tenant-express",
3
- "version": "0.5.1",
3
+ "version": "0.5.3",
4
4
  "repository": "github:usebetter-dev/usebetter",
5
5
  "bugs": "https://github.com/usebetter-dev/usebetter/issues",
6
6
  "homepage": "https://github.com/usebetter-dev/usebetter#readme",
@@ -24,7 +24,7 @@
24
24
  "README.md"
25
25
  ],
26
26
  "dependencies": {
27
- "@usebetterdev/tenant-core": "0.5.1"
27
+ "@usebetterdev/tenant-core": "0.5.3"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "express": ">=5.0.0"
@@ -38,7 +38,7 @@
38
38
  "tsup": "^8.3.5",
39
39
  "typescript": "~5.7.2",
40
40
  "vitest": "^2.1.6",
41
- "@usebetterdev/test-utils": "0.5.1"
41
+ "@usebetterdev/test-utils": "0.5.3"
42
42
  },
43
43
  "engines": {
44
44
  "node": ">=22"