@authhero/cloudflare-adapter 2.35.2 → 2.36.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.
@@ -126,7 +126,7 @@ function v(e) {
126
126
  domain_metadata: i
127
127
  };
128
128
  }
129
- function ee(e) {
129
+ function y(e) {
130
130
  return {
131
131
  create: async (t, n) => {
132
132
  let { sslOverrides: r, rest: i } = _(n.domain_metadata), { result: a, errors: o, success: s } = h.parse(await g(e).post({
@@ -248,7 +248,7 @@ function ee(e) {
248
248
  }
249
249
  //#endregion
250
250
  //#region src/cache/index.ts
251
- var te = class {
251
+ var ee = class {
252
252
  config;
253
253
  cache = null;
254
254
  constructor(e) {
@@ -322,8 +322,8 @@ var te = class {
322
322
  console.warn("CloudflareCache.clear() is not implemented - Cloudflare Cache API does not support clearing all entries");
323
323
  }
324
324
  };
325
- function ne(e = {}) {
326
- return new te({
325
+ function te(e = {}) {
326
+ return new ee({
327
327
  defaultTtlSeconds: 300,
328
328
  keyPrefix: "authhero",
329
329
  getTimeoutMs: 200,
@@ -332,14 +332,14 @@ function ne(e = {}) {
332
332
  }
333
333
  //#endregion
334
334
  //#region ../../node_modules/.pnpm/nanoid@5.1.15/node_modules/nanoid/url-alphabet/index.js
335
- var re = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", y = (e = 21) => {
335
+ var ne = "useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict", b = (e = 21) => {
336
336
  let t = "", n = crypto.getRandomValues(new Uint8Array(e |= 0));
337
- for (; e--;) t += re[n[e] & 63];
337
+ for (; e--;) t += ne[n[e] & 63];
338
338
  return t;
339
339
  };
340
340
  //#endregion
341
341
  //#region src/r2-sql-logs/query.ts
342
- async function b(e, t) {
342
+ async function x(e, t) {
343
343
  let n = e.timeout || 3e4, r = new AbortController(), i = setTimeout(() => r.abort(), n);
344
344
  try {
345
345
  let n = `https://api.sql.cloudflarestorage.com/api/v1/accounts/${e.accountId}/r2-sql/query/${e.warehouseName}`, i = await fetch(n, {
@@ -359,15 +359,15 @@ async function b(e, t) {
359
359
  clearTimeout(i);
360
360
  }
361
361
  }
362
- function x(e) {
362
+ function S(e) {
363
363
  return `'${e.replace(/'/g, "''")}'`;
364
364
  }
365
- function S(e) {
365
+ function C(e) {
366
366
  return `"${e.replace(/"/g, "\"\"")}"`;
367
367
  }
368
368
  //#endregion
369
369
  //#region src/r2-sql-logs/logs.ts
370
- function C(e) {
370
+ function w(e) {
371
371
  let t = (e) => {
372
372
  if (!e) return "";
373
373
  try {
@@ -407,16 +407,16 @@ function C(e) {
407
407
  } : void 0
408
408
  };
409
409
  }
410
- function ie(e) {
410
+ function re(e) {
411
411
  return async (t, n) => {
412
- let r = n.log_id || y(), i = {
412
+ let r = n.log_id || b(), i = {
413
413
  ...n,
414
414
  log_id: r
415
415
  };
416
- return await ae(e, t, i), i;
416
+ return await ie(e, t, i), i;
417
417
  };
418
418
  }
419
- async function ae(e, t, n) {
419
+ async function ie(e, t, n) {
420
420
  let r = (e) => e ? JSON.stringify(e) : void 0, i = {
421
421
  id: n.log_id,
422
422
  tenant_id: t,
@@ -467,22 +467,22 @@ async function ae(e, t, n) {
467
467
  throw console.error("Failed to send log to Pipeline:", e), e;
468
468
  }
469
469
  }
470
- function w(e) {
470
+ function ae(e) {
471
471
  return async (t, n) => {
472
- let r = e.namespace || "default", i = e.tableName || "logs", a = await b(e, `
473
- SELECT * FROM ${S(r)}.${S(i)}
474
- WHERE tenant_id = ${x(t)}
475
- AND id = ${x(n)}
472
+ let r = e.namespace || "default", i = e.tableName || "logs", a = await x(e, `
473
+ SELECT * FROM ${C(r)}.${C(i)}
474
+ WHERE tenant_id = ${S(t)}
475
+ AND id = ${S(n)}
476
476
  LIMIT 1
477
477
  `);
478
478
  if (a.length === 0) return null;
479
479
  let o = a[0];
480
- return o ? C(o) : null;
480
+ return o ? w(o) : null;
481
481
  };
482
482
  }
483
483
  //#endregion
484
484
  //#region src/r2-sql-logs/list.ts
485
- function T(e) {
485
+ function oe(e) {
486
486
  let t = {}, n = /(\w+):(?:"([^"]*)"|(\S+))/g, r;
487
487
  for (; (r = n.exec(e)) !== null;) {
488
488
  let e = r[1], n = r[2] === void 0 ? r[3] : r[2];
@@ -490,40 +490,40 @@ function T(e) {
490
490
  }
491
491
  return t;
492
492
  }
493
- function E(e) {
493
+ function T(e) {
494
494
  let t = [];
495
495
  for (let [n, r] of Object.entries(e)) {
496
496
  let e = n.replace(/[^a-zA-Z0-9_]/g, "");
497
- e && r && t.push(`${S(e)} = ${x(r)}`);
497
+ e && r && t.push(`${C(e)} = ${S(r)}`);
498
498
  }
499
499
  return t;
500
500
  }
501
- function oe(e) {
501
+ function E(e) {
502
502
  return async (t, n = {}) => {
503
- let { page: r = 0, per_page: i = 50, include_totals: a = !1, sort: o, q: s } = n, c = e.namespace || "default", l = e.tableName || "logs", u = [`tenant_id = ${x(t)}`];
503
+ let { page: r = 0, per_page: i = 50, include_totals: a = !1, sort: o, q: s } = n, c = e.namespace || "default", l = e.tableName || "logs", u = [`tenant_id = ${S(t)}`];
504
504
  if (s) {
505
- let e = T(s);
506
- u.push(...E(e));
505
+ let e = oe(s);
506
+ u.push(...T(e));
507
507
  }
508
508
  let d = u.join(" AND "), f = "ORDER BY date DESC";
509
509
  if (o && o.sort_by) {
510
510
  let e = o.sort_by.replace(/[^a-zA-Z0-9_]/g, ""), t = o.sort_order === "asc" ? "ASC" : "DESC";
511
- f = `ORDER BY ${S(e)} ${t}`;
511
+ f = `ORDER BY ${C(e)} ${t}`;
512
512
  }
513
- let p = r * i, m = `LIMIT ${i} OFFSET ${p}`, h = (await b(e, `
514
- SELECT * FROM ${S(c)}.${S(l)}
513
+ let p = r * i, m = `LIMIT ${i} OFFSET ${p}`, h = (await x(e, `
514
+ SELECT * FROM ${C(c)}.${C(l)}
515
515
  WHERE ${d}
516
516
  ${f}
517
517
  ${m}
518
- `)).map(C);
518
+ `)).map(w);
519
519
  if (!a) return {
520
520
  logs: h,
521
521
  start: 0,
522
522
  limit: 0,
523
523
  length: 0
524
524
  };
525
- let g = (await b(e, `
526
- SELECT COUNT(*) as count FROM ${S(c)}.${S(l)}
525
+ let g = (await x(e, `
526
+ SELECT COUNT(*) as count FROM ${C(c)}.${C(l)}
527
527
  WHERE ${d}
528
528
  `))[0]?.count || 0;
529
529
  return {
@@ -554,9 +554,9 @@ function D(e) {
554
554
  if (!e.authToken) throw Error("R2 SQL logs adapter requires \"authToken\" configuration");
555
555
  if (!e.warehouseName) throw Error("R2 SQL logs adapter requires \"warehouseName\" configuration");
556
556
  return {
557
- create: ie(e),
558
- list: oe(e),
559
- get: w(e)
557
+ create: re(e),
558
+ list: E(e),
559
+ get: ae(e)
560
560
  };
561
561
  }
562
562
  //#endregion
@@ -626,7 +626,7 @@ function j(e) {
626
626
  }
627
627
  function ce(e) {
628
628
  return async (t, n) => {
629
- let r = n.log_id || y(), i = {
629
+ let r = n.log_id || b(), i = {
630
630
  ...n,
631
631
  log_id: r
632
632
  };
@@ -1584,27 +1584,66 @@ function Ue(e) {
1584
1584
  apiToken: e.apiToken,
1585
1585
  fetch: e.fetch,
1586
1586
  timeoutMs: e.timeoutMs
1587
- }), n = e.scriptNameTemplate ?? Re, r = e.d1NameTemplate ?? ze, i = e.scriptMetadata?.main_module ?? Be, a = e.scriptMetadata?.compatibility_date ?? Ve, o = e.scriptMetadata?.compatibility_flags ?? ["nodejs_compat"], s = e.dispatchNamespace;
1588
- async function c(e) {
1587
+ }), n = e.scriptNameTemplate ?? Re, r = e.d1NameTemplate ?? ze, i = e.scriptMetadata?.main_module ?? Be, a = e.scriptMetadata?.compatibility_date ?? Ve, o = e.scriptMetadata?.compatibility_flags ?? ["nodejs_compat"], s = e.dispatchNamespace, c = e.logger;
1588
+ async function l(e) {
1589
1589
  let n = (await t.listD1Databases(e)).find((t) => t.name === e);
1590
- if (n) return n.uuid;
1590
+ if (n) return {
1591
+ id: n.uuid,
1592
+ created: !1
1593
+ };
1591
1594
  try {
1592
- return (await t.createD1Database(e)).uuid;
1595
+ return {
1596
+ id: (await t.createD1Database(e)).uuid,
1597
+ created: !0
1598
+ };
1593
1599
  } catch (n) {
1594
1600
  if (!He(n)) throw n;
1595
1601
  let r = (await t.listD1Databases(e)).find((t) => t.name === e);
1596
- if (r) return r.uuid;
1602
+ if (r) return {
1603
+ id: r.uuid,
1604
+ created: !1
1605
+ };
1597
1606
  throw n;
1598
1607
  }
1599
1608
  }
1600
- async function l(n) {
1601
- for (let r of e.migrations) try {
1602
- await t.execD1(n, r.sql);
1603
- } catch (e) {
1604
- throw e instanceof Error ? Error(`Failed to apply migration "${r.name}" to D1 ${n}: ${e.message}`, { cause: e }) : e;
1609
+ let u = "_authhero_provisioner_migrations";
1610
+ function d(e, t) {
1611
+ let n = [];
1612
+ for (let r of e) for (let e of r.results ?? []) if (e && typeof e == "object" && t in e) {
1613
+ let r = e[t];
1614
+ typeof r == "string" && n.push(r);
1605
1615
  }
1616
+ return n;
1617
+ }
1618
+ async function f(e) {
1619
+ return d(await t.execD1(e, `SELECT name FROM sqlite_master WHERE type='table' AND name='${u}';`), "name").length > 0;
1620
+ }
1621
+ async function p(e) {
1622
+ await t.execD1(e, `CREATE TABLE IF NOT EXISTS ${u} (name TEXT PRIMARY KEY, applied_at TEXT NOT NULL);`);
1623
+ }
1624
+ async function m(e) {
1625
+ let n = await t.execD1(e, `SELECT name FROM ${u};`);
1626
+ return new Set(d(n, "name"));
1606
1627
  }
1607
- async function u(n, r) {
1628
+ function h(e) {
1629
+ return e.replace(/'/g, "''");
1630
+ }
1631
+ async function g(e, n) {
1632
+ let r = (/* @__PURE__ */ new Date()).toISOString();
1633
+ await t.execD1(e, `INSERT OR IGNORE INTO ${u} (name, applied_at) VALUES ('${h(n)}', '${h(r)}');`);
1634
+ }
1635
+ async function _(n) {
1636
+ let r = await m(n);
1637
+ for (let i of e.migrations) if (!r.has(i.name)) {
1638
+ try {
1639
+ await t.execD1(n, i.sql);
1640
+ } catch (e) {
1641
+ throw e instanceof Error ? Error(`Failed to apply migration "${i.name}" to D1 ${n}: ${e.message}`, { cause: e }) : e;
1642
+ }
1643
+ await g(n, i.name);
1644
+ }
1645
+ }
1646
+ async function v(n, r) {
1608
1647
  let c = [
1609
1648
  {
1610
1649
  type: "d1",
@@ -1627,31 +1666,44 @@ function Ue(e) {
1627
1666
  tags: ["authhero-tenant", `tenant:${n}`]
1628
1667
  });
1629
1668
  }
1630
- async function d(n, r) {
1669
+ async function y(n, r) {
1631
1670
  let i = await e.secrets(r);
1632
1671
  for (let [e, r] of Object.entries(i)) await t.setNamespacedScriptSecret(s, n, e, r);
1633
1672
  }
1634
1673
  return {
1635
- async onProvision(e) {
1636
- let t = Z(n, e), i = Z(r, e), a = await c(i);
1637
- return await l(a), await u(t, a), await d(t, e), {
1638
- d1DatabaseId: a,
1639
- scriptName: t,
1640
- d1Name: i
1674
+ async onProvision(t) {
1675
+ let i = Z(n, t), a = Z(r, t), { id: o, created: s } = await l(a), u = s ? !1 : await f(o);
1676
+ if (s || u) await p(o), await _(o);
1677
+ else {
1678
+ c?.warn(`D1 "${a}" has no migration-tracking table — assuming it predates tracking and is fully migrated; backfilling the tracking table and skipping migrations.`), await p(o);
1679
+ for (let t of e.migrations) await g(o, t.name);
1680
+ }
1681
+ return await v(i, o), await y(i, t), {
1682
+ d1DatabaseId: o,
1683
+ scriptName: i,
1684
+ d1Name: a
1641
1685
  };
1642
1686
  },
1643
1687
  async onDeprovision(e) {
1644
- let i = Z(n, e), a = Z(r, e);
1688
+ let i = Z(n, e), a = Z(r, e), o = [];
1645
1689
  try {
1646
1690
  await t.deleteNamespacedScript(s, i);
1647
1691
  } catch (e) {
1648
- if (!Q(e)) throw e;
1692
+ Q(e) || o.push(e);
1649
1693
  }
1650
- let o = (await t.listD1Databases(a)).find((e) => e.name === a);
1651
- if (o) try {
1652
- await t.deleteD1Database(o.uuid);
1694
+ try {
1695
+ let e = (await t.listD1Databases(a)).find((e) => e.name === a);
1696
+ if (e) try {
1697
+ await t.deleteD1Database(e.uuid);
1698
+ } catch (e) {
1699
+ Q(e) || o.push(e);
1700
+ }
1653
1701
  } catch (e) {
1654
- if (!Q(e)) throw e;
1702
+ o.push(e);
1703
+ }
1704
+ if (o.length > 0) {
1705
+ let t = o.map((e) => e instanceof Error ? e.message : String(e)).join("; ");
1706
+ throw Error(`Deprovision of tenant "${e}" had ${o.length} failure(s): ${t}`, { cause: o[0] });
1655
1707
  }
1656
1708
  }
1657
1709
  };
@@ -1662,8 +1714,14 @@ function We(e) {
1662
1714
  return e.deployment_type === "wfp";
1663
1715
  }
1664
1716
  function $(e) {
1665
- let { provisioner: t, tenants: n } = e, r = e.shouldProvision ?? We, i = e.logger;
1666
- async function a(e, t) {
1717
+ if (typeof e != "object" || !e) return [];
1718
+ let t = [];
1719
+ for (let n of Object.values(e)) if (typeof n == "object" && n && "errors" in n && Array.isArray(n.errors)) for (let e of n.errors) typeof e == "string" && t.push(e);
1720
+ return t;
1721
+ }
1722
+ function Ge(e) {
1723
+ let { provisioner: t, tenants: n, syncDefaults: r } = e, i = e.shouldProvision ?? We, a = e.logger;
1724
+ async function o(e, t) {
1667
1725
  let r = t instanceof Error ? t.message : String(t);
1668
1726
  try {
1669
1727
  await n.update(e, {
@@ -1672,59 +1730,83 @@ function $(e) {
1672
1730
  provisioning_state_changed_at: (/* @__PURE__ */ new Date()).toISOString()
1673
1731
  });
1674
1732
  } catch (t) {
1675
- i?.warn(`Failed to write provisioning_state="failed" for tenant ${e}:`, t);
1733
+ a?.warn(`Failed to write provisioning_state="failed" for tenant ${e}:`, t);
1676
1734
  }
1677
1735
  }
1678
1736
  return {
1679
1737
  async onProvision(e) {
1680
- let i = await n.get(e);
1681
- if (i && r(i)) try {
1682
- let r = await t.onProvision(e);
1683
- await n.update(e, {
1684
- d1_database_id: r.d1DatabaseId,
1685
- worker_script_name: r.scriptName,
1686
- provisioning_state: "ready",
1687
- provisioning_error: void 0,
1688
- provisioning_state_changed_at: (/* @__PURE__ */ new Date()).toISOString()
1689
- });
1738
+ let s = await n.get(e);
1739
+ if (!s || !i(s)) return;
1740
+ let c;
1741
+ try {
1742
+ c = await t.onProvision(e);
1690
1743
  } catch (t) {
1691
- throw await a(e, t), t;
1744
+ throw await o(e, t), t;
1692
1745
  }
1746
+ let l = {
1747
+ d1_database_id: c.d1DatabaseId,
1748
+ worker_script_name: c.scriptName
1749
+ };
1750
+ try {
1751
+ if (r) {
1752
+ let t = $(await r(e));
1753
+ if (t.length > 0) throw Error(`sync-defaults seed reported ${t.length} error(s): ${t.join("; ")}`);
1754
+ }
1755
+ } catch (t) {
1756
+ let r = t instanceof Error ? t.message : String(t);
1757
+ try {
1758
+ await n.update(e, {
1759
+ ...l,
1760
+ provisioning_state: "failed",
1761
+ provisioning_error: r.slice(0, 2048),
1762
+ provisioning_state_changed_at: (/* @__PURE__ */ new Date()).toISOString()
1763
+ });
1764
+ } catch (t) {
1765
+ a?.warn(`Failed to write provisioning_state="failed" for tenant ${e}:`, t);
1766
+ }
1767
+ throw t;
1768
+ }
1769
+ await n.update(e, {
1770
+ ...l,
1771
+ provisioning_state: "ready",
1772
+ provisioning_error: void 0,
1773
+ provisioning_state_changed_at: (/* @__PURE__ */ new Date()).toISOString()
1774
+ });
1693
1775
  },
1694
1776
  async onDeprovision(e) {
1695
- let i = await n.get(e);
1696
- i && !r(i) || await t.onDeprovision(e);
1777
+ let r = await n.get(e);
1778
+ r && !i(r) || await t.onDeprovision(e);
1697
1779
  }
1698
1780
  };
1699
1781
  }
1700
1782
  //#endregion
1701
1783
  //#region src/wfp-provisioner/wfp-forward.ts
1702
- var Ge = "DISPATCHER", Ke = "tenant-{tenant_id}-auth";
1703
- function qe(e) {
1784
+ var Ke = "DISPATCHER", qe = "tenant-{tenant_id}-auth";
1785
+ function Je(e) {
1704
1786
  return typeof e == "object" && !!e && "get" in e && typeof Reflect.get(e, "get") == "function";
1705
1787
  }
1706
- function Je(e, t) {
1788
+ function Ye(e, t) {
1707
1789
  return e.replace(/\{tenant_id\}/g, t);
1708
1790
  }
1709
- function Ye(e) {
1710
- let { tenants: t, controlPlaneTenantId: n, dispatcherBinding: r = Ge, scriptNameTemplate: i = Ke, resolveTenantId: a = (e) => e.req.header("tenant-id") } = e;
1791
+ function Xe(e) {
1792
+ let { tenants: t, controlPlaneTenantId: n, dispatcherBinding: r = Ke, scriptNameTemplate: i = qe, resolveTenantId: a = (e) => e.req.header("tenant-id") } = e;
1711
1793
  return async (e, o) => {
1712
1794
  let s = await a(e);
1713
1795
  if (!s || s === n) return o();
1714
1796
  let c = await t.get(s);
1715
1797
  if (!c || c.deployment_type !== "wfp" || c.provisioning_state && c.provisioning_state !== "ready") return o();
1716
1798
  let l = Reflect.get(e.env ?? {}, r);
1717
- if (!qe(l)) return o();
1718
- let u = Je(i, s);
1799
+ if (!Je(l)) return o();
1800
+ let u = Ye(i, s);
1719
1801
  return l.get(u).fetch(e.req.raw);
1720
1802
  };
1721
1803
  }
1722
1804
  //#endregion
1723
1805
  //#region src/index.ts
1724
- function Xe(e) {
1806
+ function Ze(e) {
1725
1807
  let t = {
1726
- customDomains: ee(e),
1727
- cache: ne({
1808
+ customDomains: y(e),
1809
+ cache: te({
1728
1810
  ...e.cacheName && { cacheName: e.cacheName },
1729
1811
  ...e.defaultTtlSeconds !== void 0 && { defaultTtlSeconds: e.defaultTtlSeconds },
1730
1812
  ...e.keyPrefix && { keyPrefix: e.keyPrefix }
@@ -1736,4 +1818,4 @@ function Xe(e) {
1736
1818
  return n && (t.rateLimit = n), t;
1737
1819
  }
1738
1820
  //#endregion
1739
- export { X as CloudflareApiClient, Y as CloudflareApiError, je as CloudflareCodeExecutor, J as DispatchNamespaceCodeExecutor, Ie as WorkerLoaderCodeExecutor, G as createAnalyticsEngineActionExecutionsAdapter, B as createAnalyticsEngineAnalyticsAdapter, V as createAnalyticsEngineLogsAdapter, L as createAnalyticsEngineStatsAdapter, K as createCloudflareRateLimitAdapter, Ue as createCloudflareWfpD1Provisioner, D as createR2SQLLogsAdapter, se as createR2SQLStatsAdapter, Ye as createWfpForwardMiddleware, $ as createWfpTenantProvisioningHook, Xe as default, q as generateWorkerScript };
1821
+ export { X as CloudflareApiClient, Y as CloudflareApiError, je as CloudflareCodeExecutor, J as DispatchNamespaceCodeExecutor, Ie as WorkerLoaderCodeExecutor, G as createAnalyticsEngineActionExecutionsAdapter, B as createAnalyticsEngineAnalyticsAdapter, V as createAnalyticsEngineLogsAdapter, L as createAnalyticsEngineStatsAdapter, K as createCloudflareRateLimitAdapter, Ue as createCloudflareWfpD1Provisioner, D as createR2SQLLogsAdapter, se as createR2SQLStatsAdapter, Xe as createWfpForwardMiddleware, Ge as createWfpTenantProvisioningHook, Ze as default, q as generateWorkerScript };