@xylex-group/athena 3.0.3 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +1 -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-DzimbvOA.d.ts} +48 -200
  11. package/dist/{athena-request-headers-DujFFyMU.d.cts → athena-request-headers-Lr_m8xCV.d.cts} +48 -200
  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 +912 -5
  17. package/dist/browser.cjs.map +1 -1
  18. package/dist/browser.d.cts +8 -7
  19. package/dist/browser.d.ts +8 -7
  20. package/dist/browser.js +881 -6
  21. package/dist/browser.js.map +1 -1
  22. package/dist/cli/index.cjs +7909 -7061
  23. package/dist/cli/index.cjs.map +1 -1
  24. package/dist/cli/index.d.cts +17 -10
  25. package/dist/cli/index.d.ts +17 -10
  26. package/dist/cli/index.js +7911 -7063
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/env.cjs +130 -0
  29. package/dist/env.cjs.map +1 -0
  30. package/dist/env.d.cts +70 -0
  31. package/dist/env.d.ts +70 -0
  32. package/dist/env.js +122 -0
  33. package/dist/env.js.map +1 -0
  34. package/dist/index.cjs +1570 -98
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +31 -8
  37. package/dist/index.d.ts +31 -8
  38. package/dist/index.js +1532 -100
  39. package/dist/index.js.map +1 -1
  40. package/dist/model-form-3Gr8rkdT.d.cts +281 -0
  41. package/dist/model-form-CotpEL7z.d.ts +281 -0
  42. package/dist/{module-CPG3ULxQ.d.cts → module-CQmOaDzP.d.cts} +4 -4
  43. package/dist/{module-BruTcxe0.d.ts → module-CWkUTcUc.d.ts} +4 -4
  44. package/dist/next/client.cjs +123 -7
  45. package/dist/next/client.cjs.map +1 -1
  46. package/dist/next/client.d.cts +4 -3
  47. package/dist/next/client.d.ts +4 -3
  48. package/dist/next/client.js +123 -7
  49. package/dist/next/client.js.map +1 -1
  50. package/dist/next/server.cjs +1130 -364
  51. package/dist/next/server.cjs.map +1 -1
  52. package/dist/next/server.d.cts +121 -8
  53. package/dist/next/server.d.ts +121 -8
  54. package/dist/next/server.js +1120 -365
  55. package/dist/next/server.js.map +1 -1
  56. package/dist/pipeline-BnRKO_Pd.d.cts +93 -0
  57. package/dist/pipeline-sWCmlFqu.d.ts +93 -0
  58. package/dist/{proxy-request-headers-m4D2Tduy.d.ts → proxy-request-headers-CttlcuRb.d.ts} +1 -1
  59. package/dist/{proxy-request-headers-DGxdoyA0.d.cts → proxy-request-headers-pIBSn1Fw.d.cts} +1 -1
  60. package/dist/react.cjs +672 -16
  61. package/dist/react.cjs.map +1 -1
  62. package/dist/react.d.cts +123 -8
  63. package/dist/react.d.ts +123 -8
  64. package/dist/react.js +671 -17
  65. package/dist/react.js.map +1 -1
  66. package/dist/schema-handlers-BtT_IQFi.d.cts +138 -0
  67. package/dist/schema-handlers-VjFDhIMw.d.ts +138 -0
  68. package/dist/social-providers.d.cts +1 -1
  69. package/dist/social-providers.d.ts +1 -1
  70. package/dist/{types-D6tZ9aoq.d.ts → types-BDX8zS7w.d.ts} +40 -1
  71. package/dist/{types-AOY-GLu8.d.cts → types-BVKpQmfY.d.cts} +11 -0
  72. package/dist/{types-AOY-GLu8.d.ts → types-BVKpQmfY.d.ts} +11 -0
  73. package/dist/{types-DFr2cL1N.d.cts → types-D-Am7YSd.d.cts} +40 -1
  74. package/dist/utils.cjs +30 -0
  75. package/dist/utils.cjs.map +1 -1
  76. package/dist/utils.d.cts +3 -2
  77. package/dist/utils.d.ts +3 -2
  78. package/dist/utils.js +30 -1
  79. package/dist/utils.js.map +1 -1
  80. package/dist/{v3-client-CWfZHcKL.d.cts → v3-client-G1SLeHRa.d.cts} +23 -1
  81. package/dist/{v3-client-DZp2NEhK.d.ts → v3-client-ao8BWQ8v.d.ts} +23 -1
  82. package/package.json +16 -2
  83. package/dist/model-form-Dh0sisdL.d.ts +0 -97
  84. package/dist/model-form-oOAJUVd4.d.cts +0 -97
  85. package/dist/pipeline-CIzV9f7b.d.cts +0 -8
  86. package/dist/pipeline-DNlc8Ayn.d.ts +0 -8
package/dist/env.cjs ADDED
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ // src/env/index.ts
4
+ var ATHENA_ENV_PRIMARY_KEYS = {
5
+ url: "ATHENA_URL",
6
+ apiKey: "ATHENA_API_KEY",
7
+ client: "ATHENA_CLIENT",
8
+ authUrl: "ATHENA_AUTH_URL"
9
+ };
10
+ var ATHENA_ENV_LEGACY_URL_KEYS = [
11
+ "ATHENA_URL",
12
+ "NEXT_PUBLIC_ATHENA_URL",
13
+ "ATHENA_GATEWAY_URL",
14
+ "NEXT_PUBLIC_ATHENA_GATEWAY_URL"
15
+ ];
16
+ var ATHENA_ENV_LEGACY_API_KEY_KEYS = [
17
+ "ATHENA_API_KEY",
18
+ "ATHENA_KEY",
19
+ "ATHENA_PUBLISHABLE_KEY",
20
+ "NEXT_PUBLIC_ATHENA_API_KEY",
21
+ "NEXT_PUBLIC_ATHENA_PUBLISHABLE_KEY"
22
+ ];
23
+ var ATHENA_ENV_LEGACY_CLIENT_KEYS = [
24
+ "ATHENA_CLIENT",
25
+ "NEXT_PUBLIC_ATHENA_CLIENT",
26
+ "ATHENA_CLIENT_NAME"
27
+ ];
28
+ var ATHENA_ENV_LEGACY_AUTH_URL_KEYS = [
29
+ "ATHENA_AUTH_URL",
30
+ "ATHENA_AUTH_UPSTREAM_URL",
31
+ "NEXT_PUBLIC_ATHENA_AUTH_URL",
32
+ "NEXT_PUBLIC_ATHENA_AUTH_UPSTREAM_URL"
33
+ ];
34
+ function readProcessEnv() {
35
+ try {
36
+ return globalThis.process?.env ?? {};
37
+ } catch {
38
+ return {};
39
+ }
40
+ }
41
+ function candidatesFor(field, legacyAliases) {
42
+ const primary = ATHENA_ENV_PRIMARY_KEYS[field];
43
+ if (!legacyAliases) return [primary];
44
+ switch (field) {
45
+ case "url":
46
+ return ATHENA_ENV_LEGACY_URL_KEYS;
47
+ case "apiKey":
48
+ return ATHENA_ENV_LEGACY_API_KEY_KEYS;
49
+ case "client":
50
+ return ATHENA_ENV_LEGACY_CLIENT_KEYS;
51
+ case "authUrl":
52
+ return ATHENA_ENV_LEGACY_AUTH_URL_KEYS;
53
+ default:
54
+ return [primary];
55
+ }
56
+ }
57
+ function pickField(field, source, legacyAliases, ignored) {
58
+ const keys = candidatesFor(field, legacyAliases);
59
+ let chosen = {};
60
+ for (const key of keys) {
61
+ const raw = source[key]?.trim();
62
+ if (!raw) continue;
63
+ if (!chosen.value) {
64
+ chosen = { value: raw, key };
65
+ } else {
66
+ ignored.push({ field, key });
67
+ }
68
+ }
69
+ return chosen;
70
+ }
71
+ function resolveAthenaEnv(options = {}) {
72
+ const source = options.env ?? readProcessEnv();
73
+ const legacyAliases = options.legacyAliases === true;
74
+ const ignored = [];
75
+ const url = pickField("url", source, legacyAliases, ignored);
76
+ const apiKey = pickField("apiKey", source, legacyAliases, ignored);
77
+ const client = pickField("client", source, legacyAliases, ignored);
78
+ const authUrl = pickField("authUrl", source, legacyAliases, ignored);
79
+ const result = {
80
+ url: url.value,
81
+ apiKey: apiKey.value,
82
+ client: client.value,
83
+ authUrl: authUrl.value,
84
+ sources: {
85
+ ...url.key ? { url: url.key } : {},
86
+ ...apiKey.key ? { apiKey: apiKey.key } : {},
87
+ ...client.key ? { client: client.key } : {},
88
+ ...authUrl.key ? { authUrl: authUrl.key } : {}
89
+ },
90
+ ignored
91
+ };
92
+ const shouldDebug = options.debug === true || options.debug !== false && typeof process !== "undefined" && process.env?.ATHENA_ENV_DEBUG === "1";
93
+ if (shouldDebug) {
94
+ console.info("[athena/env] resolved", {
95
+ sources: result.sources,
96
+ ignored: result.ignored,
97
+ hasUrl: Boolean(result.url),
98
+ hasApiKey: Boolean(result.apiKey),
99
+ hasClient: Boolean(result.client),
100
+ hasAuthUrl: Boolean(result.authUrl)
101
+ });
102
+ }
103
+ return result;
104
+ }
105
+ function requireAthenaEnv(options = {}) {
106
+ const resolved = resolveAthenaEnv(options);
107
+ if (!resolved.url || !resolved.apiKey) {
108
+ const missing = [];
109
+ if (!resolved.url) missing.push(ATHENA_ENV_PRIMARY_KEYS.url);
110
+ if (!resolved.apiKey) missing.push(ATHENA_ENV_PRIMARY_KEYS.apiKey);
111
+ throw new Error(
112
+ `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.")
113
+ );
114
+ }
115
+ return {
116
+ ...resolved,
117
+ url: resolved.url,
118
+ apiKey: resolved.apiKey
119
+ };
120
+ }
121
+
122
+ exports.ATHENA_ENV_LEGACY_API_KEY_KEYS = ATHENA_ENV_LEGACY_API_KEY_KEYS;
123
+ exports.ATHENA_ENV_LEGACY_AUTH_URL_KEYS = ATHENA_ENV_LEGACY_AUTH_URL_KEYS;
124
+ exports.ATHENA_ENV_LEGACY_CLIENT_KEYS = ATHENA_ENV_LEGACY_CLIENT_KEYS;
125
+ exports.ATHENA_ENV_LEGACY_URL_KEYS = ATHENA_ENV_LEGACY_URL_KEYS;
126
+ exports.ATHENA_ENV_PRIMARY_KEYS = ATHENA_ENV_PRIMARY_KEYS;
127
+ exports.requireAthenaEnv = requireAthenaEnv;
128
+ exports.resolveAthenaEnv = resolveAthenaEnv;
129
+ //# sourceMappingURL=env.cjs.map
130
+ //# sourceMappingURL=env.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/env/index.ts"],"names":[],"mappings":"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","file":"env.cjs","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 typeof process !== 'undefined' &&\n process.env?.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"]}
package/dist/env.d.cts ADDED
@@ -0,0 +1,70 @@
1
+ import { E as EnvLike } from './athena-auth-url-C1FbVmN6.cjs';
2
+
3
+ /**
4
+ * Canonical Athena environment resolution.
5
+ *
6
+ * Primary keys (default):
7
+ * - `ATHENA_URL`
8
+ * - `ATHENA_API_KEY`
9
+ * - `ATHENA_CLIENT`
10
+ * - `ATHENA_AUTH_URL`
11
+ *
12
+ * Pass `legacyAliases: true` to also accept historical multi-key sets used by
13
+ * older apps and generators.
14
+ */
15
+
16
+ /** Recommended primary environment keys. */
17
+ declare const ATHENA_ENV_PRIMARY_KEYS: {
18
+ readonly url: "ATHENA_URL";
19
+ readonly apiKey: "ATHENA_API_KEY";
20
+ readonly client: "ATHENA_CLIENT";
21
+ readonly authUrl: "ATHENA_AUTH_URL";
22
+ };
23
+ /** Legacy URL aliases (order = priority within the alias set). */
24
+ declare const ATHENA_ENV_LEGACY_URL_KEYS: readonly ["ATHENA_URL", "NEXT_PUBLIC_ATHENA_URL", "ATHENA_GATEWAY_URL", "NEXT_PUBLIC_ATHENA_GATEWAY_URL"];
25
+ /** Legacy API key aliases. */
26
+ declare const ATHENA_ENV_LEGACY_API_KEY_KEYS: readonly ["ATHENA_API_KEY", "ATHENA_KEY", "ATHENA_PUBLISHABLE_KEY", "NEXT_PUBLIC_ATHENA_API_KEY", "NEXT_PUBLIC_ATHENA_PUBLISHABLE_KEY"];
27
+ /** Legacy client-name aliases. */
28
+ declare const ATHENA_ENV_LEGACY_CLIENT_KEYS: readonly ["ATHENA_CLIENT", "NEXT_PUBLIC_ATHENA_CLIENT", "ATHENA_CLIENT_NAME"];
29
+ /** Legacy auth URL aliases. */
30
+ declare const ATHENA_ENV_LEGACY_AUTH_URL_KEYS: readonly ["ATHENA_AUTH_URL", "ATHENA_AUTH_UPSTREAM_URL", "NEXT_PUBLIC_ATHENA_AUTH_URL", "NEXT_PUBLIC_ATHENA_AUTH_UPSTREAM_URL"];
31
+ type AthenaEnvField = 'url' | 'apiKey' | 'client' | 'authUrl';
32
+ interface ResolveAthenaEnvOptions {
33
+ /** Explicit env map. Defaults to `process.env` when available. */
34
+ env?: EnvLike;
35
+ /**
36
+ * When true, fall back to {@link ATHENA_ENV_LEGACY_*_KEYS} after primary keys.
37
+ * Default false so new apps only document one key set.
38
+ */
39
+ legacyAliases?: boolean;
40
+ /** Log which keys resolved and which were ignored (non-production only unless forced). */
41
+ debug?: boolean;
42
+ }
43
+ interface AthenaEnvResolution {
44
+ url?: string;
45
+ apiKey?: string;
46
+ client?: string;
47
+ authUrl?: string;
48
+ /** Key that supplied each field, when present. */
49
+ sources: Partial<Record<AthenaEnvField, string>>;
50
+ /** Non-empty keys that were considered but not chosen (lower priority). */
51
+ ignored: Array<{
52
+ field: AthenaEnvField;
53
+ key: string;
54
+ }>;
55
+ }
56
+ /**
57
+ * Resolve Athena connection settings from an env map.
58
+ *
59
+ * Primary keys only unless `legacyAliases: true`.
60
+ */
61
+ declare function resolveAthenaEnv(options?: ResolveAthenaEnvOptions): AthenaEnvResolution;
62
+ /**
63
+ * Like {@link resolveAthenaEnv}, but throws when `url` or `apiKey` is missing.
64
+ */
65
+ declare function requireAthenaEnv(options?: ResolveAthenaEnvOptions): AthenaEnvResolution & {
66
+ url: string;
67
+ apiKey: string;
68
+ };
69
+
70
+ 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, type AthenaEnvField, type AthenaEnvResolution, type ResolveAthenaEnvOptions, requireAthenaEnv, resolveAthenaEnv };
package/dist/env.d.ts ADDED
@@ -0,0 +1,70 @@
1
+ import { E as EnvLike } from './athena-auth-url-C1FbVmN6.js';
2
+
3
+ /**
4
+ * Canonical Athena environment resolution.
5
+ *
6
+ * Primary keys (default):
7
+ * - `ATHENA_URL`
8
+ * - `ATHENA_API_KEY`
9
+ * - `ATHENA_CLIENT`
10
+ * - `ATHENA_AUTH_URL`
11
+ *
12
+ * Pass `legacyAliases: true` to also accept historical multi-key sets used by
13
+ * older apps and generators.
14
+ */
15
+
16
+ /** Recommended primary environment keys. */
17
+ declare const ATHENA_ENV_PRIMARY_KEYS: {
18
+ readonly url: "ATHENA_URL";
19
+ readonly apiKey: "ATHENA_API_KEY";
20
+ readonly client: "ATHENA_CLIENT";
21
+ readonly authUrl: "ATHENA_AUTH_URL";
22
+ };
23
+ /** Legacy URL aliases (order = priority within the alias set). */
24
+ declare const ATHENA_ENV_LEGACY_URL_KEYS: readonly ["ATHENA_URL", "NEXT_PUBLIC_ATHENA_URL", "ATHENA_GATEWAY_URL", "NEXT_PUBLIC_ATHENA_GATEWAY_URL"];
25
+ /** Legacy API key aliases. */
26
+ declare const ATHENA_ENV_LEGACY_API_KEY_KEYS: readonly ["ATHENA_API_KEY", "ATHENA_KEY", "ATHENA_PUBLISHABLE_KEY", "NEXT_PUBLIC_ATHENA_API_KEY", "NEXT_PUBLIC_ATHENA_PUBLISHABLE_KEY"];
27
+ /** Legacy client-name aliases. */
28
+ declare const ATHENA_ENV_LEGACY_CLIENT_KEYS: readonly ["ATHENA_CLIENT", "NEXT_PUBLIC_ATHENA_CLIENT", "ATHENA_CLIENT_NAME"];
29
+ /** Legacy auth URL aliases. */
30
+ declare const ATHENA_ENV_LEGACY_AUTH_URL_KEYS: readonly ["ATHENA_AUTH_URL", "ATHENA_AUTH_UPSTREAM_URL", "NEXT_PUBLIC_ATHENA_AUTH_URL", "NEXT_PUBLIC_ATHENA_AUTH_UPSTREAM_URL"];
31
+ type AthenaEnvField = 'url' | 'apiKey' | 'client' | 'authUrl';
32
+ interface ResolveAthenaEnvOptions {
33
+ /** Explicit env map. Defaults to `process.env` when available. */
34
+ env?: EnvLike;
35
+ /**
36
+ * When true, fall back to {@link ATHENA_ENV_LEGACY_*_KEYS} after primary keys.
37
+ * Default false so new apps only document one key set.
38
+ */
39
+ legacyAliases?: boolean;
40
+ /** Log which keys resolved and which were ignored (non-production only unless forced). */
41
+ debug?: boolean;
42
+ }
43
+ interface AthenaEnvResolution {
44
+ url?: string;
45
+ apiKey?: string;
46
+ client?: string;
47
+ authUrl?: string;
48
+ /** Key that supplied each field, when present. */
49
+ sources: Partial<Record<AthenaEnvField, string>>;
50
+ /** Non-empty keys that were considered but not chosen (lower priority). */
51
+ ignored: Array<{
52
+ field: AthenaEnvField;
53
+ key: string;
54
+ }>;
55
+ }
56
+ /**
57
+ * Resolve Athena connection settings from an env map.
58
+ *
59
+ * Primary keys only unless `legacyAliases: true`.
60
+ */
61
+ declare function resolveAthenaEnv(options?: ResolveAthenaEnvOptions): AthenaEnvResolution;
62
+ /**
63
+ * Like {@link resolveAthenaEnv}, but throws when `url` or `apiKey` is missing.
64
+ */
65
+ declare function requireAthenaEnv(options?: ResolveAthenaEnvOptions): AthenaEnvResolution & {
66
+ url: string;
67
+ apiKey: string;
68
+ };
69
+
70
+ 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, type AthenaEnvField, type AthenaEnvResolution, type ResolveAthenaEnvOptions, requireAthenaEnv, resolveAthenaEnv };
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 && typeof process !== "undefined" && 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 typeof process !== 'undefined' &&\n process.env?.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"]}