@xylex-group/athena 3.1.0 → 3.5.1

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 (100) hide show
  1. package/README.md +17 -1
  2. package/dist/admin.cjs +55 -1
  3. package/dist/admin.cjs.map +1 -1
  4. package/dist/admin.d.cts +32 -8
  5. package/dist/admin.d.ts +32 -8
  6. package/dist/admin.js +54 -2
  7. package/dist/admin.js.map +1 -1
  8. package/dist/athena-auth-url-C1FbVmN6.d.cts +200 -0
  9. package/dist/athena-auth-url-C1FbVmN6.d.ts +200 -0
  10. package/dist/{athena-request-headers-C7Jy-c_D.d.ts → athena-request-headers-BnFN2mbd.d.cts} +49 -201
  11. package/dist/{athena-request-headers-DujFFyMU.d.cts → athena-request-headers-Dwdkq2WR.d.ts} +49 -201
  12. package/dist/billing.cjs +1 -1
  13. package/dist/billing.cjs.map +1 -1
  14. package/dist/billing.js +1 -1
  15. package/dist/billing.js.map +1 -1
  16. package/dist/browser.cjs +3735 -248
  17. package/dist/browser.cjs.map +1 -1
  18. package/dist/browser.d.cts +11 -10
  19. package/dist/browser.d.ts +11 -10
  20. package/dist/browser.js +3726 -249
  21. package/dist/browser.js.map +1 -1
  22. package/dist/cli/index.cjs +3232 -190
  23. package/dist/cli/index.cjs.map +1 -1
  24. package/dist/cli/index.d.cts +4 -4
  25. package/dist/cli/index.d.ts +4 -4
  26. package/dist/cli/index.js +3232 -190
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/cloudflare.cjs +12914 -0
  29. package/dist/cloudflare.cjs.map +1 -0
  30. package/dist/cloudflare.d.cts +368 -0
  31. package/dist/cloudflare.d.ts +368 -0
  32. package/dist/cloudflare.js +12885 -0
  33. package/dist/cloudflare.js.map +1 -0
  34. package/dist/cookies.cjs +4 -3
  35. package/dist/cookies.cjs.map +1 -1
  36. package/dist/cookies.js +4 -3
  37. package/dist/cookies.js.map +1 -1
  38. package/dist/env.cjs +130 -0
  39. package/dist/env.cjs.map +1 -0
  40. package/dist/env.d.cts +70 -0
  41. package/dist/env.d.ts +70 -0
  42. package/dist/env.js +122 -0
  43. package/dist/env.js.map +1 -0
  44. package/dist/index.cjs +3749 -241
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.cts +11 -10
  47. package/dist/index.d.ts +11 -10
  48. package/dist/index.js +3739 -242
  49. package/dist/index.js.map +1 -1
  50. package/dist/{model-form-BhWWsA-7.d.cts → model-form-D0ykVVOs.d.cts} +26 -4
  51. package/dist/{model-form-BbdzJ9Uh.d.ts → model-form-U8NVtfSA.d.ts} +26 -4
  52. package/dist/{module-xFd7_Igv.d.cts → module-CMWlJ1z3.d.cts} +5 -5
  53. package/dist/{module-DKkJKOuJ.d.ts → module-CZ-wPcf2.d.ts} +5 -5
  54. package/dist/next/client.cjs +3212 -196
  55. package/dist/next/client.cjs.map +1 -1
  56. package/dist/next/client.d.cts +6 -5
  57. package/dist/next/client.d.ts +6 -5
  58. package/dist/next/client.js +3212 -196
  59. package/dist/next/client.js.map +1 -1
  60. package/dist/next/server.cjs +4461 -781
  61. package/dist/next/server.cjs.map +1 -1
  62. package/dist/next/server.d.cts +139 -13
  63. package/dist/next/server.d.ts +139 -13
  64. package/dist/next/server.js +4451 -782
  65. package/dist/next/server.js.map +1 -1
  66. package/dist/{pipeline-DuKzYGia.d.cts → pipeline-BCpb4BX1.d.cts} +1 -1
  67. package/dist/{pipeline-wer2G9xW.d.ts → pipeline-CgmXwMeX.d.ts} +1 -1
  68. package/dist/{proxy-request-headers-m4D2Tduy.d.ts → proxy-request-headers-CttlcuRb.d.ts} +1 -1
  69. package/dist/{proxy-request-headers-DGxdoyA0.d.cts → proxy-request-headers-pIBSn1Fw.d.cts} +1 -1
  70. package/dist/react.cjs +290 -31
  71. package/dist/react.cjs.map +1 -1
  72. package/dist/react.d.cts +62 -12
  73. package/dist/react.d.ts +62 -12
  74. package/dist/react.js +290 -32
  75. package/dist/react.js.map +1 -1
  76. package/dist/schema-handlers-CvWqF-dW.d.ts +138 -0
  77. package/dist/schema-handlers-Dr8h9Jg-.d.cts +138 -0
  78. package/dist/social-providers.cjs +1 -1
  79. package/dist/social-providers.cjs.map +1 -1
  80. package/dist/social-providers.d.cts +1 -1
  81. package/dist/social-providers.d.ts +1 -1
  82. package/dist/social-providers.js +1 -1
  83. package/dist/social-providers.js.map +1 -1
  84. package/dist/{types-Bltx6iL6.d.ts → types-B2RZPivM.d.cts} +8 -1
  85. package/dist/{types-Bltx6iL6.d.cts → types-B2RZPivM.d.ts} +8 -1
  86. package/dist/{types-1ztXDgPa.d.cts → types-BKklrX4J.d.ts} +14 -2
  87. package/dist/{types-AOY-GLu8.d.cts → types-BVKpQmfY.d.cts} +11 -0
  88. package/dist/{types-AOY-GLu8.d.ts → types-BVKpQmfY.d.ts} +11 -0
  89. package/dist/{types-CgCv5o6R.d.cts → types-D5dj1v5Z.d.cts} +1 -1
  90. package/dist/{types-CccOiXPo.d.ts → types-DqBFwfhn.d.cts} +14 -2
  91. package/dist/{types-B75PdABb.d.ts → types-S-bTMPiM.d.ts} +1 -1
  92. package/dist/utils.cjs +30 -0
  93. package/dist/utils.cjs.map +1 -1
  94. package/dist/utils.d.cts +4 -3
  95. package/dist/utils.d.ts +4 -3
  96. package/dist/utils.js +30 -1
  97. package/dist/utils.js.map +1 -1
  98. package/dist/{v3-client-CWfZHcKL.d.cts → v3-client-DP-qg82X.d.cts} +323 -5
  99. package/dist/{v3-client-DZp2NEhK.d.ts → v3-client-OAai_JNs.d.ts} +323 -5
  100. package/package.json +25 -4
package/dist/env.js ADDED
@@ -0,0 +1,122 @@
1
+ // src/env/index.ts
2
+ var ATHENA_ENV_PRIMARY_KEYS = {
3
+ url: "ATHENA_URL",
4
+ apiKey: "ATHENA_API_KEY",
5
+ client: "ATHENA_CLIENT",
6
+ authUrl: "ATHENA_AUTH_URL"
7
+ };
8
+ var ATHENA_ENV_LEGACY_URL_KEYS = [
9
+ "ATHENA_URL",
10
+ "NEXT_PUBLIC_ATHENA_URL",
11
+ "ATHENA_GATEWAY_URL",
12
+ "NEXT_PUBLIC_ATHENA_GATEWAY_URL"
13
+ ];
14
+ var ATHENA_ENV_LEGACY_API_KEY_KEYS = [
15
+ "ATHENA_API_KEY",
16
+ "ATHENA_KEY",
17
+ "ATHENA_PUBLISHABLE_KEY",
18
+ "NEXT_PUBLIC_ATHENA_API_KEY",
19
+ "NEXT_PUBLIC_ATHENA_PUBLISHABLE_KEY"
20
+ ];
21
+ var ATHENA_ENV_LEGACY_CLIENT_KEYS = [
22
+ "ATHENA_CLIENT",
23
+ "NEXT_PUBLIC_ATHENA_CLIENT",
24
+ "ATHENA_CLIENT_NAME"
25
+ ];
26
+ var ATHENA_ENV_LEGACY_AUTH_URL_KEYS = [
27
+ "ATHENA_AUTH_URL",
28
+ "ATHENA_AUTH_UPSTREAM_URL",
29
+ "NEXT_PUBLIC_ATHENA_AUTH_URL",
30
+ "NEXT_PUBLIC_ATHENA_AUTH_UPSTREAM_URL"
31
+ ];
32
+ function readProcessEnv() {
33
+ try {
34
+ return globalThis.process?.env ?? {};
35
+ } catch {
36
+ return {};
37
+ }
38
+ }
39
+ function candidatesFor(field, legacyAliases) {
40
+ const primary = ATHENA_ENV_PRIMARY_KEYS[field];
41
+ if (!legacyAliases) return [primary];
42
+ switch (field) {
43
+ case "url":
44
+ return ATHENA_ENV_LEGACY_URL_KEYS;
45
+ case "apiKey":
46
+ return ATHENA_ENV_LEGACY_API_KEY_KEYS;
47
+ case "client":
48
+ return ATHENA_ENV_LEGACY_CLIENT_KEYS;
49
+ case "authUrl":
50
+ return ATHENA_ENV_LEGACY_AUTH_URL_KEYS;
51
+ default:
52
+ return [primary];
53
+ }
54
+ }
55
+ function pickField(field, source, legacyAliases, ignored) {
56
+ const keys = candidatesFor(field, legacyAliases);
57
+ let chosen = {};
58
+ for (const key of keys) {
59
+ const raw = source[key]?.trim();
60
+ if (!raw) continue;
61
+ if (!chosen.value) {
62
+ chosen = { value: raw, key };
63
+ } else {
64
+ ignored.push({ field, key });
65
+ }
66
+ }
67
+ return chosen;
68
+ }
69
+ function resolveAthenaEnv(options = {}) {
70
+ const source = options.env ?? readProcessEnv();
71
+ const legacyAliases = options.legacyAliases === true;
72
+ const ignored = [];
73
+ const url = pickField("url", source, legacyAliases, ignored);
74
+ const apiKey = pickField("apiKey", source, legacyAliases, ignored);
75
+ const client = pickField("client", source, legacyAliases, ignored);
76
+ const authUrl = pickField("authUrl", source, legacyAliases, ignored);
77
+ const result = {
78
+ url: url.value,
79
+ apiKey: apiKey.value,
80
+ client: client.value,
81
+ authUrl: authUrl.value,
82
+ sources: {
83
+ ...url.key ? { url: url.key } : {},
84
+ ...apiKey.key ? { apiKey: apiKey.key } : {},
85
+ ...client.key ? { client: client.key } : {},
86
+ ...authUrl.key ? { authUrl: authUrl.key } : {}
87
+ },
88
+ ignored
89
+ };
90
+ const shouldDebug = options.debug === true || options.debug !== false && globalThis.process?.env?.ATHENA_ENV_DEBUG === "1";
91
+ if (shouldDebug) {
92
+ console.info("[athena/env] resolved", {
93
+ sources: result.sources,
94
+ ignored: result.ignored,
95
+ hasUrl: Boolean(result.url),
96
+ hasApiKey: Boolean(result.apiKey),
97
+ hasClient: Boolean(result.client),
98
+ hasAuthUrl: Boolean(result.authUrl)
99
+ });
100
+ }
101
+ return result;
102
+ }
103
+ function requireAthenaEnv(options = {}) {
104
+ const resolved = resolveAthenaEnv(options);
105
+ if (!resolved.url || !resolved.apiKey) {
106
+ const missing = [];
107
+ if (!resolved.url) missing.push(ATHENA_ENV_PRIMARY_KEYS.url);
108
+ if (!resolved.apiKey) missing.push(ATHENA_ENV_PRIMARY_KEYS.apiKey);
109
+ throw new Error(
110
+ `Missing required Athena env: ${missing.join(", ")}. ` + (options.legacyAliases ? "Legacy aliases were enabled but none resolved." : "Set primary keys, or pass legacyAliases: true for historical names.")
111
+ );
112
+ }
113
+ return {
114
+ ...resolved,
115
+ url: resolved.url,
116
+ apiKey: resolved.apiKey
117
+ };
118
+ }
119
+
120
+ export { ATHENA_ENV_LEGACY_API_KEY_KEYS, ATHENA_ENV_LEGACY_AUTH_URL_KEYS, ATHENA_ENV_LEGACY_CLIENT_KEYS, ATHENA_ENV_LEGACY_URL_KEYS, ATHENA_ENV_PRIMARY_KEYS, requireAthenaEnv, resolveAthenaEnv };
121
+ //# sourceMappingURL=env.js.map
122
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/env/index.ts"],"names":[],"mappings":"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","file":"env.js","sourcesContent":["/**\n * Canonical Athena environment resolution.\n *\n * Primary keys (default):\n * - `ATHENA_URL`\n * - `ATHENA_API_KEY`\n * - `ATHENA_CLIENT`\n * - `ATHENA_AUTH_URL`\n *\n * Pass `legacyAliases: true` to also accept historical multi-key sets used by\n * older apps and generators.\n */\n\nimport type { EnvLike } from '../utils/athena-auth-url.ts'\n\n/** Recommended primary environment keys. */\nexport const ATHENA_ENV_PRIMARY_KEYS = {\n url: 'ATHENA_URL',\n apiKey: 'ATHENA_API_KEY',\n client: 'ATHENA_CLIENT',\n authUrl: 'ATHENA_AUTH_URL',\n} as const\n\n/** Legacy URL aliases (order = priority within the alias set). */\nexport const ATHENA_ENV_LEGACY_URL_KEYS = [\n 'ATHENA_URL',\n 'NEXT_PUBLIC_ATHENA_URL',\n 'ATHENA_GATEWAY_URL',\n 'NEXT_PUBLIC_ATHENA_GATEWAY_URL',\n] as const\n\n/** Legacy API key aliases. */\nexport const ATHENA_ENV_LEGACY_API_KEY_KEYS = [\n 'ATHENA_API_KEY',\n 'ATHENA_KEY',\n 'ATHENA_PUBLISHABLE_KEY',\n 'NEXT_PUBLIC_ATHENA_API_KEY',\n 'NEXT_PUBLIC_ATHENA_PUBLISHABLE_KEY',\n] as const\n\n/** Legacy client-name aliases. */\nexport const ATHENA_ENV_LEGACY_CLIENT_KEYS = [\n 'ATHENA_CLIENT',\n 'NEXT_PUBLIC_ATHENA_CLIENT',\n 'ATHENA_CLIENT_NAME',\n] as const\n\n/** Legacy auth URL aliases. */\nexport const ATHENA_ENV_LEGACY_AUTH_URL_KEYS = [\n 'ATHENA_AUTH_URL',\n 'ATHENA_AUTH_UPSTREAM_URL',\n 'NEXT_PUBLIC_ATHENA_AUTH_URL',\n 'NEXT_PUBLIC_ATHENA_AUTH_UPSTREAM_URL',\n] as const\n\nexport type AthenaEnvField = 'url' | 'apiKey' | 'client' | 'authUrl'\n\nexport interface ResolveAthenaEnvOptions {\n /** Explicit env map. Defaults to `process.env` when available. */\n env?: EnvLike\n /**\n * When true, fall back to {@link ATHENA_ENV_LEGACY_*_KEYS} after primary keys.\n * Default false so new apps only document one key set.\n */\n legacyAliases?: boolean\n /** Log which keys resolved and which were ignored (non-production only unless forced). */\n debug?: boolean\n}\n\nexport interface AthenaEnvResolution {\n url?: string\n apiKey?: string\n client?: string\n authUrl?: string\n /** Key that supplied each field, when present. */\n sources: Partial<Record<AthenaEnvField, string>>\n /** Non-empty keys that were considered but not chosen (lower priority). */\n ignored: Array<{ field: AthenaEnvField; key: string }>\n}\n\nfunction readProcessEnv(): EnvLike {\n try {\n return (globalThis as { process?: { env?: EnvLike } }).process?.env ?? {}\n } catch {\n return {}\n }\n}\n\nfunction candidatesFor(\n field: AthenaEnvField,\n legacyAliases: boolean,\n): readonly string[] {\n const primary = ATHENA_ENV_PRIMARY_KEYS[field]\n if (!legacyAliases) return [primary]\n\n switch (field) {\n case 'url':\n return ATHENA_ENV_LEGACY_URL_KEYS\n case 'apiKey':\n return ATHENA_ENV_LEGACY_API_KEY_KEYS\n case 'client':\n return ATHENA_ENV_LEGACY_CLIENT_KEYS\n case 'authUrl':\n return ATHENA_ENV_LEGACY_AUTH_URL_KEYS\n default:\n return [primary]\n }\n}\n\nfunction pickField(\n field: AthenaEnvField,\n source: EnvLike,\n legacyAliases: boolean,\n ignored: AthenaEnvResolution['ignored'],\n): { value?: string; key?: string } {\n const keys = candidatesFor(field, legacyAliases)\n let chosen: { value?: string; key?: string } = {}\n\n for (const key of keys) {\n const raw = source[key]?.trim()\n if (!raw) continue\n if (!chosen.value) {\n chosen = { value: raw, key }\n } else {\n ignored.push({ field, key })\n }\n }\n\n return chosen\n}\n\n/**\n * Resolve Athena connection settings from an env map.\n *\n * Primary keys only unless `legacyAliases: true`.\n */\nexport function resolveAthenaEnv(\n options: ResolveAthenaEnvOptions = {},\n): AthenaEnvResolution {\n const source = options.env ?? readProcessEnv()\n const legacyAliases = options.legacyAliases === true\n const ignored: AthenaEnvResolution['ignored'] = []\n\n const url = pickField('url', source, legacyAliases, ignored)\n const apiKey = pickField('apiKey', source, legacyAliases, ignored)\n const client = pickField('client', source, legacyAliases, ignored)\n const authUrl = pickField('authUrl', source, legacyAliases, ignored)\n\n const result: AthenaEnvResolution = {\n url: url.value,\n apiKey: apiKey.value,\n client: client.value,\n authUrl: authUrl.value,\n sources: {\n ...(url.key ? { url: url.key } : {}),\n ...(apiKey.key ? { apiKey: apiKey.key } : {}),\n ...(client.key ? { client: client.key } : {}),\n ...(authUrl.key ? { authUrl: authUrl.key } : {}),\n },\n ignored,\n }\n\n const shouldDebug =\n options.debug === true ||\n (options.debug !== false &&\n (globalThis as { process?: { env?: { ATHENA_ENV_DEBUG?: string } } }).process?.env\n ?.ATHENA_ENV_DEBUG === '1')\n\n if (shouldDebug) {\n console.info('[athena/env] resolved', {\n sources: result.sources,\n ignored: result.ignored,\n hasUrl: Boolean(result.url),\n hasApiKey: Boolean(result.apiKey),\n hasClient: Boolean(result.client),\n hasAuthUrl: Boolean(result.authUrl),\n })\n }\n\n return result\n}\n\n/**\n * Like {@link resolveAthenaEnv}, but throws when `url` or `apiKey` is missing.\n */\nexport function requireAthenaEnv(\n options: ResolveAthenaEnvOptions = {},\n): AthenaEnvResolution & { url: string; apiKey: string } {\n const resolved = resolveAthenaEnv(options)\n if (!resolved.url || !resolved.apiKey) {\n const missing: string[] = []\n if (!resolved.url) missing.push(ATHENA_ENV_PRIMARY_KEYS.url)\n if (!resolved.apiKey) missing.push(ATHENA_ENV_PRIMARY_KEYS.apiKey)\n throw new Error(\n `Missing required Athena env: ${missing.join(', ')}. ` +\n (options.legacyAliases\n ? 'Legacy aliases were enabled but none resolved.'\n : 'Set primary keys, or pass legacyAliases: true for historical names.'),\n )\n }\n return {\n ...resolved,\n url: resolved.url,\n apiKey: resolved.apiKey,\n }\n}\n"]}