@rc-tool/unified-auth-hosted-service 0.2.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 (130) hide show
  1. package/README.md +5 -0
  2. package/dist/cli/env.d.ts +40 -0
  3. package/dist/cli/env.d.ts.map +1 -0
  4. package/dist/cli/env.js +350 -0
  5. package/dist/cli/env.js.map +1 -0
  6. package/dist/cli/index.d.ts +4 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +145 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/cli.d.ts +3 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +4 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/hosted-service/applications.d.ts +8 -0
  15. package/dist/hosted-service/applications.d.ts.map +1 -0
  16. package/dist/hosted-service/applications.js +33 -0
  17. package/dist/hosted-service/applications.js.map +1 -0
  18. package/dist/hosted-service/constants.d.ts +6 -0
  19. package/dist/hosted-service/constants.d.ts.map +1 -0
  20. package/dist/hosted-service/constants.js +6 -0
  21. package/dist/hosted-service/constants.js.map +1 -0
  22. package/dist/hosted-service/cookies.d.ts +17 -0
  23. package/dist/hosted-service/cookies.d.ts.map +1 -0
  24. package/dist/hosted-service/cookies.js +56 -0
  25. package/dist/hosted-service/cookies.js.map +1 -0
  26. package/dist/hosted-service/crypto.d.ts +3 -0
  27. package/dist/hosted-service/crypto.d.ts.map +1 -0
  28. package/dist/hosted-service/crypto.js +39 -0
  29. package/dist/hosted-service/crypto.js.map +1 -0
  30. package/dist/hosted-service/http.d.ts +4 -0
  31. package/dist/hosted-service/http.d.ts.map +1 -0
  32. package/dist/hosted-service/http.js +27 -0
  33. package/dist/hosted-service/http.js.map +1 -0
  34. package/dist/hosted-service/login-page/components.d.ts +7 -0
  35. package/dist/hosted-service/login-page/components.d.ts.map +1 -0
  36. package/dist/hosted-service/login-page/components.js +40 -0
  37. package/dist/hosted-service/login-page/components.js.map +1 -0
  38. package/dist/hosted-service/login-page/document.d.ts +5 -0
  39. package/dist/hosted-service/login-page/document.d.ts.map +1 -0
  40. package/dist/hosted-service/login-page/document.js +19 -0
  41. package/dist/hosted-service/login-page/document.js.map +1 -0
  42. package/dist/hosted-service/login-page/escape.d.ts +2 -0
  43. package/dist/hosted-service/login-page/escape.d.ts.map +1 -0
  44. package/dist/hosted-service/login-page/escape.js +9 -0
  45. package/dist/hosted-service/login-page/escape.js.map +1 -0
  46. package/dist/hosted-service/login-page/icons.d.ts +5 -0
  47. package/dist/hosted-service/login-page/icons.d.ts.map +1 -0
  48. package/dist/hosted-service/login-page/icons.js +20 -0
  49. package/dist/hosted-service/login-page/icons.js.map +1 -0
  50. package/dist/hosted-service/login-page/index.d.ts +3 -0
  51. package/dist/hosted-service/login-page/index.d.ts.map +1 -0
  52. package/dist/hosted-service/login-page/index.js +23 -0
  53. package/dist/hosted-service/login-page/index.js.map +1 -0
  54. package/dist/hosted-service/login-page/links.d.ts +3 -0
  55. package/dist/hosted-service/login-page/links.d.ts.map +1 -0
  56. package/dist/hosted-service/login-page/links.js +50 -0
  57. package/dist/hosted-service/login-page/links.js.map +1 -0
  58. package/dist/hosted-service/login-page/styles.d.ts +2 -0
  59. package/dist/hosted-service/login-page/styles.d.ts.map +1 -0
  60. package/dist/hosted-service/login-page/styles.js +35 -0
  61. package/dist/hosted-service/login-page/styles.js.map +1 -0
  62. package/dist/hosted-service/login-page/types.d.ts +26 -0
  63. package/dist/hosted-service/login-page/types.d.ts.map +1 -0
  64. package/dist/hosted-service/login-page/types.js +2 -0
  65. package/dist/hosted-service/login-page/types.js.map +1 -0
  66. package/dist/hosted-service/oauth.d.ts +11 -0
  67. package/dist/hosted-service/oauth.d.ts.map +1 -0
  68. package/dist/hosted-service/oauth.js +37 -0
  69. package/dist/hosted-service/oauth.js.map +1 -0
  70. package/dist/hosted-service/providers/feishu.d.ts +4 -0
  71. package/dist/hosted-service/providers/feishu.d.ts.map +1 -0
  72. package/dist/hosted-service/providers/feishu.js +72 -0
  73. package/dist/hosted-service/providers/feishu.js.map +1 -0
  74. package/dist/hosted-service/providers/github.d.ts +4 -0
  75. package/dist/hosted-service/providers/github.d.ts.map +1 -0
  76. package/dist/hosted-service/providers/github.js +73 -0
  77. package/dist/hosted-service/providers/github.js.map +1 -0
  78. package/dist/hosted-service/providers/google.d.ts +4 -0
  79. package/dist/hosted-service/providers/google.d.ts.map +1 -0
  80. package/dist/hosted-service/providers/google.js +54 -0
  81. package/dist/hosted-service/providers/google.js.map +1 -0
  82. package/dist/hosted-service/routes.d.ts +12 -0
  83. package/dist/hosted-service/routes.d.ts.map +1 -0
  84. package/dist/hosted-service/routes.js +61 -0
  85. package/dist/hosted-service/routes.js.map +1 -0
  86. package/dist/hosted-service/service.d.ts +16 -0
  87. package/dist/hosted-service/service.d.ts.map +1 -0
  88. package/dist/hosted-service/service.js +205 -0
  89. package/dist/hosted-service/service.js.map +1 -0
  90. package/dist/hosted-service/session.d.ts +11 -0
  91. package/dist/hosted-service/session.d.ts.map +1 -0
  92. package/dist/hosted-service/session.js +52 -0
  93. package/dist/hosted-service/session.js.map +1 -0
  94. package/dist/hosted-service/store/file.d.ts +6 -0
  95. package/dist/hosted-service/store/file.d.ts.map +1 -0
  96. package/dist/hosted-service/store/file.js +62 -0
  97. package/dist/hosted-service/store/file.js.map +1 -0
  98. package/dist/hosted-service/store/index.d.ts +6 -0
  99. package/dist/hosted-service/store/index.d.ts.map +1 -0
  100. package/dist/hosted-service/store/index.js +3 -0
  101. package/dist/hosted-service/store/index.js.map +1 -0
  102. package/dist/hosted-service/store/memory.d.ts +6 -0
  103. package/dist/hosted-service/store/memory.d.ts.map +1 -0
  104. package/dist/hosted-service/store/memory.js +19 -0
  105. package/dist/hosted-service/store/memory.js.map +1 -0
  106. package/dist/hosted-service/store/state.d.ts +9 -0
  107. package/dist/hosted-service/store/state.d.ts.map +1 -0
  108. package/dist/hosted-service/store/state.js +156 -0
  109. package/dist/hosted-service/store/state.js.map +1 -0
  110. package/dist/hosted-service/store/types.d.ts +56 -0
  111. package/dist/hosted-service/store/types.d.ts.map +1 -0
  112. package/dist/hosted-service/store/types.js +2 -0
  113. package/dist/hosted-service/store/types.js.map +1 -0
  114. package/dist/hosted-service/types.d.ts +48 -0
  115. package/dist/hosted-service/types.d.ts.map +1 -0
  116. package/dist/hosted-service/types.js +2 -0
  117. package/dist/hosted-service/types.js.map +1 -0
  118. package/dist/hosted-service-cli.d.ts +2 -0
  119. package/dist/hosted-service-cli.d.ts.map +1 -0
  120. package/dist/hosted-service-cli.js +89 -0
  121. package/dist/hosted-service-cli.js.map +1 -0
  122. package/dist/hosted-service-node.d.ts +7 -0
  123. package/dist/hosted-service-node.d.ts.map +1 -0
  124. package/dist/hosted-service-node.js +35 -0
  125. package/dist/hosted-service-node.js.map +1 -0
  126. package/dist/index.d.ts +10 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +6 -0
  129. package/dist/index.js.map +1 -0
  130. package/package.json +39 -0
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # @rc-tool/unified-auth-hosted-service
2
+
3
+ Hosted Auth runtime for Unified Auth.
4
+
5
+ Use this package to mount SDK-provided login pages, OAuth routes, session APIs, file/memory stores, and the `unified-auth` CLI.
@@ -0,0 +1,40 @@
1
+ export type AuthProvider = "feishu" | "github" | "google";
2
+ export type AuthStoreProvider = "file" | "prisma";
3
+ export type CheckStatus = "fail" | "pass" | "warn";
4
+ export interface InitAuthEnvOptions {
5
+ app?: string;
6
+ cwd?: string;
7
+ envFile?: string;
8
+ exampleFile?: string;
9
+ name?: string;
10
+ port?: number;
11
+ providers?: AuthProvider[];
12
+ redirectURI?: string;
13
+ serviceURL?: string;
14
+ store?: AuthStoreProvider;
15
+ }
16
+ export interface DoctorAuthEnvOptions {
17
+ cwd?: string;
18
+ envFile?: string;
19
+ }
20
+ export interface EnvWriteSummary {
21
+ added: string[];
22
+ path: string;
23
+ updated: string[];
24
+ }
25
+ export interface InitAuthEnvResult {
26
+ env: EnvWriteSummary;
27
+ example: EnvWriteSummary;
28
+ gitignore: EnvWriteSummary;
29
+ }
30
+ export interface DoctorCheck {
31
+ message: string;
32
+ status: CheckStatus;
33
+ }
34
+ export interface DoctorAuthEnvResult {
35
+ checks: DoctorCheck[];
36
+ ok: boolean;
37
+ }
38
+ export declare function initAuthEnv(options?: InitAuthEnvOptions): InitAuthEnvResult;
39
+ export declare function doctorAuthEnv(options?: DoctorAuthEnvOptions): DoctorAuthEnvResult;
40
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAC1D,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAClD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,eAAe,CAAC;IACrB,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,eAAe,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,EAAE,EAAE,OAAO,CAAC;CACb;AAgBD,wBAAgB,WAAW,CAAC,OAAO,GAAE,kBAAuB,GAAG,iBAAiB,CAY/E;AAED,wBAAgB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB,CA4BrF"}
@@ -0,0 +1,350 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { basename, dirname, join, resolve } from "node:path";
4
+ const defaultProviders = ["feishu", "google", "github"];
5
+ const envSectionHeader = "# Unified Auth Service";
6
+ export function initAuthEnv(options = {}) {
7
+ const cwd = resolve(options.cwd ?? process.cwd());
8
+ const envPath = resolve(cwd, options.envFile ?? ".env.local");
9
+ const examplePath = resolve(cwd, options.exampleFile ?? ".env.example");
10
+ const gitignorePath = resolve(cwd, ".gitignore");
11
+ const config = resolveInitConfig(cwd, options);
12
+ return {
13
+ env: writeEnvFile(envPath, buildRuntimeEntries(config)),
14
+ example: writeEnvFile(examplePath, buildExampleEntries(config)),
15
+ gitignore: ensureGitignore(gitignorePath),
16
+ };
17
+ }
18
+ export function doctorAuthEnv(options = {}) {
19
+ const cwd = resolve(options.cwd ?? process.cwd());
20
+ const envPath = resolve(cwd, options.envFile ?? ".env.local");
21
+ const env = readMergedEnv(cwd, envPath);
22
+ const checks = [];
23
+ if (existsSync(envPath)) {
24
+ checks.push(pass(`${relativePath(cwd, envPath)} exists`));
25
+ }
26
+ else {
27
+ checks.push(fail(`${relativePath(cwd, envPath)} is missing; run unified-auth init`));
28
+ }
29
+ requireValue(checks, env, "AUTH_SERVICE_URL");
30
+ requireValue(checks, env, "AUTH_CLIENT_ID");
31
+ requireValue(checks, env, "AUTH_ALLOWED_REDIRECT_URI");
32
+ checkURL(checks, env, "AUTH_SERVICE_URL");
33
+ checkURL(checks, env, "AUTH_ALLOWED_REDIRECT_URI");
34
+ checkSessionSecret(checks, env.AUTH_SESSION_SECRET);
35
+ checkStore(checks, env);
36
+ checkProvider(checks, env, "feishu", "FEISHU_APP_ID", "FEISHU_APP_SECRET", "FEISHU_REDIRECT_URI");
37
+ checkProvider(checks, env, "google", "GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GOOGLE_REDIRECT_URI");
38
+ checkProvider(checks, env, "github", "GITHUB_CLIENT_ID", "GITHUB_CLIENT_SECRET", "GITHUB_REDIRECT_URI");
39
+ checkGitignore(checks, cwd);
40
+ return {
41
+ checks,
42
+ ok: !checks.some((check) => check.status === "fail"),
43
+ };
44
+ }
45
+ function resolveInitConfig(cwd, options) {
46
+ const redirectURI = options.redirectURI ?? "http://localhost:3004/";
47
+ const serviceURL = trimTrailingSlash(options.serviceURL ?? getURLOrigin(redirectURI) ?? `http://localhost:${options.port ?? 3005}`);
48
+ const port = options.port ?? getURLPort(serviceURL) ?? 3005;
49
+ const clientId = options.app ?? inferClientId(cwd);
50
+ return {
51
+ clientId,
52
+ name: options.name ?? titleFromClientId(clientId),
53
+ port,
54
+ providers: options.providers ?? defaultProviders,
55
+ redirectURI,
56
+ serviceURL,
57
+ store: options.store ?? "file",
58
+ };
59
+ }
60
+ function buildRuntimeEntries(config) {
61
+ return [
62
+ { key: "AUTH_SERVICE_PORT", value: String(config.port) },
63
+ { key: "AUTH_SERVICE_URL", value: config.serviceURL },
64
+ { key: "AUTH_CLIENT_ID", value: config.clientId },
65
+ { key: "AUTH_CLIENT_NAME", value: config.name },
66
+ { key: "AUTH_ALLOWED_REDIRECT_URI", value: config.redirectURI },
67
+ { key: "AUTH_SESSION_SECRET", sensitive: true, value: randomBytes(32).toString("base64url") },
68
+ { key: "AUTH_ALLOW_DEV_LOGIN", value: "true" },
69
+ { key: "AUTH_STORE_PROVIDER", value: config.store },
70
+ ...buildStoreEntries(config.store, false),
71
+ ...buildProviderEntries(config.serviceURL, config.providers, false),
72
+ ];
73
+ }
74
+ function buildExampleEntries(config) {
75
+ return [
76
+ { key: "AUTH_SERVICE_PORT", value: String(config.port) },
77
+ { key: "AUTH_SERVICE_URL", value: config.serviceURL },
78
+ { key: "AUTH_CLIENT_ID", value: config.clientId },
79
+ { key: "AUTH_CLIENT_NAME", value: config.name },
80
+ { key: "AUTH_ALLOWED_REDIRECT_URI", value: config.redirectURI },
81
+ { key: "AUTH_SESSION_SECRET", sensitive: true, value: "please-change-this-to-a-long-random-string" },
82
+ { key: "AUTH_ALLOW_DEV_LOGIN", value: "true" },
83
+ { key: "AUTH_STORE_PROVIDER", value: config.store },
84
+ ...buildStoreEntries(config.store, true),
85
+ ...buildProviderEntries(config.serviceURL, config.providers, true),
86
+ ];
87
+ }
88
+ function buildStoreEntries(store, example) {
89
+ if (store === "prisma") {
90
+ return [
91
+ {
92
+ key: "AUTH_DATABASE_URL",
93
+ sensitive: true,
94
+ value: example ? "postgresql://user:password@localhost:5432/unified_auth?schema=public" : "",
95
+ },
96
+ ];
97
+ }
98
+ return [{ key: "AUTH_STORE_FILE", value: ".auth/unified-auth-store.json" }];
99
+ }
100
+ function buildProviderEntries(serviceURL, providers, example) {
101
+ const callbackBase = trimTrailingSlash(serviceURL);
102
+ const entries = [];
103
+ if (providers.includes("feishu")) {
104
+ entries.push({ key: "FEISHU_APP_ID", value: "" }, { key: "FEISHU_APP_SECRET", sensitive: true, value: "" }, { key: "FEISHU_REDIRECT_URI", value: `${callbackBase}/api/auth/feishu/callback` });
105
+ }
106
+ if (providers.includes("google")) {
107
+ entries.push({ key: "GOOGLE_CLIENT_ID", value: "" }, { key: "GOOGLE_CLIENT_SECRET", sensitive: true, value: "" }, { key: "GOOGLE_REDIRECT_URI", value: `${callbackBase}/api/auth/google/callback` });
108
+ }
109
+ if (providers.includes("github")) {
110
+ entries.push({ key: "GITHUB_CLIENT_ID", value: "" }, { key: "GITHUB_CLIENT_SECRET", sensitive: true, value: "" }, { key: "GITHUB_REDIRECT_URI", value: `${callbackBase}/api/auth/github/callback` });
111
+ }
112
+ if (example) {
113
+ return entries.map((entry) => entry.sensitive ? { ...entry, value: entry.value || "" } : entry);
114
+ }
115
+ return entries;
116
+ }
117
+ function writeEnvFile(path, entries) {
118
+ const lines = readLines(path);
119
+ const assignments = parseAssignments(lines);
120
+ const added = [];
121
+ const updated = [];
122
+ const pending = [];
123
+ for (const entry of entries) {
124
+ const existing = assignments.get(entry.key);
125
+ if (!existing) {
126
+ pending.push(formatEntry(entry));
127
+ added.push(entry.key);
128
+ continue;
129
+ }
130
+ if (!entry.sensitive && !existing.value && entry.value) {
131
+ lines[existing.index] = formatEntry(entry);
132
+ updated.push(entry.key);
133
+ }
134
+ if (entry.key === "AUTH_SESSION_SECRET" && isPlaceholderSecret(existing.value) && entry.value) {
135
+ lines[existing.index] = formatEntry(entry);
136
+ updated.push(entry.key);
137
+ }
138
+ }
139
+ if (pending.length) {
140
+ if (lines.length && lines[lines.length - 1] !== "") {
141
+ lines.push("");
142
+ }
143
+ if (!lines.includes(envSectionHeader)) {
144
+ lines.push(envSectionHeader);
145
+ }
146
+ lines.push(...pending);
147
+ }
148
+ if (added.length || updated.length || !existsSync(path)) {
149
+ mkdirSync(dirname(path), { recursive: true });
150
+ writeFileSync(path, `${lines.join("\n").replace(/\n*$/, "")}\n`);
151
+ }
152
+ return { added, path, updated };
153
+ }
154
+ function ensureGitignore(path) {
155
+ const lines = readLines(path);
156
+ const required = [".auth", ".env", ".env.*", "!.env.example"];
157
+ const added = required.filter((item) => !lines.includes(item));
158
+ if (added.length) {
159
+ if (lines.length && lines[lines.length - 1] !== "") {
160
+ lines.push("");
161
+ }
162
+ lines.push(...added);
163
+ mkdirSync(dirname(path), { recursive: true });
164
+ writeFileSync(path, `${lines.join("\n").replace(/\n*$/, "")}\n`);
165
+ }
166
+ else if (!existsSync(path)) {
167
+ mkdirSync(dirname(path), { recursive: true });
168
+ writeFileSync(path, "");
169
+ }
170
+ return { added, path, updated: [] };
171
+ }
172
+ function readMergedEnv(cwd, envPath) {
173
+ const env = {};
174
+ for (const path of [envPath, join(cwd, ".env")]) {
175
+ for (const [key, assignment] of parseAssignments(readLines(path))) {
176
+ if (!(key in env)) {
177
+ env[key] = assignment.value;
178
+ }
179
+ }
180
+ }
181
+ return env;
182
+ }
183
+ function readLines(path) {
184
+ if (!existsSync(path)) {
185
+ return [];
186
+ }
187
+ return readFileSync(path, "utf8").replace(/\r\n/g, "\n").split("\n").filter((line, index, list) => {
188
+ return index < list.length - 1 || line.length > 0;
189
+ });
190
+ }
191
+ function parseAssignments(lines) {
192
+ const assignments = new Map();
193
+ lines.forEach((line, index) => {
194
+ const match = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)\s*$/.exec(line);
195
+ if (match) {
196
+ assignments.set(match[1], {
197
+ index,
198
+ value: unquoteEnvValue(match[2]),
199
+ });
200
+ }
201
+ });
202
+ return assignments;
203
+ }
204
+ function formatEntry(entry) {
205
+ return `${entry.key}=${entry.value}`;
206
+ }
207
+ function unquoteEnvValue(value) {
208
+ const trimmed = value.trim();
209
+ if ((trimmed.startsWith("\"") && trimmed.endsWith("\"")) ||
210
+ (trimmed.startsWith("'") && trimmed.endsWith("'"))) {
211
+ return trimmed.slice(1, -1);
212
+ }
213
+ return trimmed;
214
+ }
215
+ function requireValue(checks, env, key) {
216
+ if (env[key]) {
217
+ checks.push(pass(`${key} is set`));
218
+ }
219
+ else {
220
+ checks.push(fail(`${key} is missing`));
221
+ }
222
+ }
223
+ function checkURL(checks, env, key) {
224
+ if (!env[key]) {
225
+ return;
226
+ }
227
+ try {
228
+ new URL(env[key]);
229
+ checks.push(pass(`${key} is a valid URL`));
230
+ }
231
+ catch {
232
+ checks.push(fail(`${key} is not a valid URL`));
233
+ }
234
+ }
235
+ function checkSessionSecret(checks, secret) {
236
+ if (!secret) {
237
+ checks.push(fail("AUTH_SESSION_SECRET is missing"));
238
+ return;
239
+ }
240
+ if (isPlaceholderSecret(secret) || secret.length < 32) {
241
+ checks.push(fail("AUTH_SESSION_SECRET must be replaced with a long random value"));
242
+ return;
243
+ }
244
+ checks.push(pass("AUTH_SESSION_SECRET looks usable"));
245
+ }
246
+ function checkStore(checks, env) {
247
+ const store = env.AUTH_STORE_PROVIDER || "file";
248
+ if (store === "prisma") {
249
+ if (env.AUTH_DATABASE_URL || env.DATABASE_URL) {
250
+ checks.push(pass("Prisma store has a database URL"));
251
+ }
252
+ else {
253
+ checks.push(fail("AUTH_STORE_PROVIDER=prisma requires AUTH_DATABASE_URL"));
254
+ }
255
+ return;
256
+ }
257
+ if (store === "file") {
258
+ checks.push(env.AUTH_STORE_FILE ? pass("File store path is set") : warn("AUTH_STORE_FILE is missing; the service will use its default path"));
259
+ return;
260
+ }
261
+ checks.push(fail(`Unsupported AUTH_STORE_PROVIDER: ${store}`));
262
+ }
263
+ function checkProvider(checks, env, provider, idKey, secretKey, redirectKey) {
264
+ const hasId = Boolean(env[idKey]);
265
+ const hasSecret = Boolean(env[secretKey]);
266
+ if (!hasId && !hasSecret) {
267
+ checks.push(warn(`${provider} provider is disabled`));
268
+ return;
269
+ }
270
+ if (!hasId || !hasSecret) {
271
+ checks.push(fail(`${provider} provider needs both ${idKey} and ${secretKey}`));
272
+ return;
273
+ }
274
+ checks.push(pass(`${provider} provider credentials are set`));
275
+ if (env[redirectKey]) {
276
+ checkURL(checks, env, redirectKey);
277
+ }
278
+ else {
279
+ checks.push(warn(`${redirectKey} is missing; the service will use its default callback URL`));
280
+ }
281
+ }
282
+ function checkGitignore(checks, cwd) {
283
+ const path = join(cwd, ".gitignore");
284
+ const lines = readLines(path);
285
+ if (lines.includes(".env.*") && lines.includes("!.env.example")) {
286
+ checks.push(pass(".gitignore keeps local env files private"));
287
+ }
288
+ else {
289
+ checks.push(warn(".gitignore should include .env.* and !.env.example"));
290
+ }
291
+ }
292
+ function pass(message) {
293
+ return { message, status: "pass" };
294
+ }
295
+ function warn(message) {
296
+ return { message, status: "warn" };
297
+ }
298
+ function fail(message) {
299
+ return { message, status: "fail" };
300
+ }
301
+ function isPlaceholderSecret(value) {
302
+ return value === "please-change-this-to-a-long-random-string" || value === "unified-auth-local-secret";
303
+ }
304
+ function inferClientId(cwd) {
305
+ const id = basename(cwd)
306
+ .toLowerCase()
307
+ .replace(/[^a-z0-9]+/g, "-")
308
+ .replace(/^-+|-+$/g, "");
309
+ return id || "app";
310
+ }
311
+ function titleFromClientId(clientId) {
312
+ return clientId
313
+ .split(/[-_]/g)
314
+ .filter(Boolean)
315
+ .map((part) => `${part.slice(0, 1).toUpperCase()}${part.slice(1)}`)
316
+ .join(" ") || "Application";
317
+ }
318
+ function trimTrailingSlash(value) {
319
+ return value.endsWith("/") ? value.slice(0, -1) : value;
320
+ }
321
+ function getURLOrigin(value) {
322
+ try {
323
+ return new URL(value).origin;
324
+ }
325
+ catch {
326
+ return undefined;
327
+ }
328
+ }
329
+ function getURLPort(value) {
330
+ try {
331
+ const url = new URL(value);
332
+ if (url.port) {
333
+ return Number(url.port);
334
+ }
335
+ if (url.protocol === "https:") {
336
+ return 443;
337
+ }
338
+ if (url.protocol === "http:") {
339
+ return 80;
340
+ }
341
+ }
342
+ catch {
343
+ return undefined;
344
+ }
345
+ return undefined;
346
+ }
347
+ function relativePath(cwd, path) {
348
+ return path.startsWith(cwd) ? path.slice(cwd.length + 1) : path;
349
+ }
350
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/cli/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ type Output = Pick<typeof console, "error" | "log">;
2
+ export declare function runCli(argv: string[], output?: Output): 0 | 1;
3
+ export {};
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAGA,KAAK,MAAM,GAAG,IAAI,CAAC,OAAO,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,CAAC;AA2BpD,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAgB,SAsC9D"}
@@ -0,0 +1,145 @@
1
+ import { doctorAuthEnv, initAuthEnv } from "./env.js";
2
+ const helpText = `Unified Auth CLI
3
+
4
+ Usage:
5
+ unified-auth init [options]
6
+ unified-auth doctor [options]
7
+
8
+ Options:
9
+ --app <id> Auth client id. Defaults to the current folder name.
10
+ --name <name> Display name for the auth application.
11
+ --port <port> Local auth service port. Defaults to 3005.
12
+ --service-url <url> Auth service base URL. Defaults to http://localhost:<port>.
13
+ --redirect <url> Allowed app redirect URI. Defaults to http://localhost:3004/.
14
+ --providers <list> Comma-separated providers: feishu,google,github.
15
+ --store <provider> Store provider: file or prisma. Defaults to file.
16
+ --env-file <path> Env file to update. Defaults to .env.local.
17
+ --example-file <path> Example env file to update. Defaults to .env.example.
18
+ --cwd <path> Project directory. Defaults to the current directory.
19
+ --help Show this help message.
20
+ `;
21
+ export function runCli(argv, output = console) {
22
+ const args = parseArgs(argv);
23
+ try {
24
+ if (!args.command || args.command === "help" || args.flags.has("help")) {
25
+ output.log(helpText.trimEnd());
26
+ return 0;
27
+ }
28
+ if (args.command === "init") {
29
+ const result = initAuthEnv(toInitOptions(args.flags));
30
+ output.log("Unified Auth env initialized.");
31
+ printWriteSummary(output, ".env.local", result.env);
32
+ printWriteSummary(output, ".env.example", result.example);
33
+ printWriteSummary(output, ".gitignore", result.gitignore);
34
+ output.log("Run unified-auth doctor to verify the project config.");
35
+ return 0;
36
+ }
37
+ if (args.command === "doctor") {
38
+ const result = doctorAuthEnv({
39
+ cwd: readString(args.flags, "cwd"),
40
+ envFile: readString(args.flags, "env-file"),
41
+ });
42
+ for (const check of result.checks) {
43
+ output.log(formatCheck(check));
44
+ }
45
+ return result.ok ? 0 : 1;
46
+ }
47
+ output.error(`Unknown command: ${args.command}`);
48
+ output.error("Run unified-auth --help for usage.");
49
+ return 1;
50
+ }
51
+ catch (error) {
52
+ output.error(error instanceof Error ? error.message : "Unified Auth CLI failed.");
53
+ return 1;
54
+ }
55
+ }
56
+ function parseArgs(argv) {
57
+ const flags = new Map();
58
+ let command = "";
59
+ for (let index = 0; index < argv.length; index += 1) {
60
+ const arg = argv[index];
61
+ if (!arg.startsWith("--")) {
62
+ command ||= arg;
63
+ continue;
64
+ }
65
+ const inline = /^--([^=]+)=(.*)$/.exec(arg);
66
+ if (inline) {
67
+ flags.set(inline[1], inline[2]);
68
+ continue;
69
+ }
70
+ const name = arg.slice(2);
71
+ const next = argv[index + 1];
72
+ if (!next || next.startsWith("--")) {
73
+ flags.set(name, true);
74
+ continue;
75
+ }
76
+ flags.set(name, next);
77
+ index += 1;
78
+ }
79
+ return { command, flags };
80
+ }
81
+ function toInitOptions(flags) {
82
+ return {
83
+ app: readString(flags, "app"),
84
+ cwd: readString(flags, "cwd"),
85
+ envFile: readString(flags, "env-file"),
86
+ exampleFile: readString(flags, "example-file"),
87
+ name: readString(flags, "name"),
88
+ port: readNumber(flags, "port"),
89
+ providers: readProviders(flags),
90
+ redirectURI: readString(flags, "redirect"),
91
+ serviceURL: readString(flags, "service-url"),
92
+ store: readStore(flags),
93
+ };
94
+ }
95
+ function readString(flags, name) {
96
+ const value = flags.get(name);
97
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
98
+ }
99
+ function readNumber(flags, name) {
100
+ const value = readString(flags, name);
101
+ if (!value) {
102
+ return undefined;
103
+ }
104
+ const parsed = Number(value);
105
+ if (!Number.isInteger(parsed) || parsed <= 0) {
106
+ throw new Error(`--${name} must be a positive integer.`);
107
+ }
108
+ return parsed;
109
+ }
110
+ function readProviders(flags) {
111
+ const value = readString(flags, "providers");
112
+ if (!value) {
113
+ return undefined;
114
+ }
115
+ const providers = value.split(",").map((provider) => provider.trim()).filter(Boolean);
116
+ const allowed = new Set(["feishu", "github", "google"]);
117
+ for (const provider of providers) {
118
+ if (!allowed.has(provider)) {
119
+ throw new Error(`Unsupported provider: ${provider}`);
120
+ }
121
+ }
122
+ return providers;
123
+ }
124
+ function readStore(flags) {
125
+ const value = readString(flags, "store");
126
+ if (!value) {
127
+ return undefined;
128
+ }
129
+ if (value === "file" || value === "prisma") {
130
+ return value;
131
+ }
132
+ throw new Error(`Unsupported store provider: ${value}`);
133
+ }
134
+ function printWriteSummary(output, label, summary) {
135
+ const changes = [
136
+ summary.added.length ? `${summary.added.length} added` : "",
137
+ summary.updated.length ? `${summary.updated.length} updated` : "",
138
+ ].filter(Boolean).join(", ") || "already up to date";
139
+ output.log(`${label}: ${changes} (${summary.path})`);
140
+ }
141
+ function formatCheck(check) {
142
+ const prefix = check.status === "pass" ? "[ok]" : check.status === "warn" ? "[warn]" : "[fail]";
143
+ return `${prefix} ${check.message}`;
144
+ }
145
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./cli/index.js";
3
+ process.exitCode = runCli(process.argv.slice(2));
4
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { HostedAuthApplication, HostedAuthServiceOptions } from "./types.js";
2
+ export declare function normalizeBaseURL(baseURL: string): string;
3
+ export declare function getApplication(options: HostedAuthServiceOptions, clientId?: string): HostedAuthApplication;
4
+ export declare function getClientId(request: Request, options: HostedAuthServiceOptions): string;
5
+ export declare function getRedirectURI(request: Request, app: HostedAuthApplication): string;
6
+ export declare function isRedirectAllowed(redirectURI: string, app: HostedAuthApplication): boolean;
7
+ export declare function createProviderStartUrl(authBaseURL: string, provider: "feishu" | "github" | "google", clientId: string, redirectURI: string): URL;
8
+ //# sourceMappingURL=applications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applications.d.ts","sourceRoot":"","sources":["../../src/hosted-service/applications.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAElF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,UAE/C;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,wBAAwB,EAAE,QAAQ,CAAC,EAAE,MAAM,yBAQlF;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,wBAAwB,UAI9E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,qBAAqB,UAI1E;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,qBAAqB,WAMhF;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACxC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,OAQpB"}
@@ -0,0 +1,33 @@
1
+ import { DEFAULT_CLIENT_ID } from "./constants.js";
2
+ export function normalizeBaseURL(baseURL) {
3
+ return baseURL.endsWith("/") ? baseURL.slice(0, -1) : baseURL;
4
+ }
5
+ export function getApplication(options, clientId) {
6
+ const applications = options.applications ?? [];
7
+ const fallback = {
8
+ clientId: clientId || DEFAULT_CLIENT_ID,
9
+ name: clientId || "Application",
10
+ };
11
+ return applications.find((app) => app.clientId === clientId) ?? applications[0] ?? fallback;
12
+ }
13
+ export function getClientId(request, options) {
14
+ const url = new URL(request.url);
15
+ return url.searchParams.get("client_id") ?? getApplication(options).clientId;
16
+ }
17
+ export function getRedirectURI(request, app) {
18
+ const url = new URL(request.url);
19
+ return url.searchParams.get("redirect_uri") ?? app.redirectURI ?? app.allowedRedirectURIs?.[0] ?? "/";
20
+ }
21
+ export function isRedirectAllowed(redirectURI, app) {
22
+ if (!app.allowedRedirectURIs?.length) {
23
+ return true;
24
+ }
25
+ return app.allowedRedirectURIs.includes(redirectURI);
26
+ }
27
+ export function createProviderStartUrl(authBaseURL, provider, clientId, redirectURI) {
28
+ const startUrl = new URL(`/api/auth/${provider}/start`, authBaseURL);
29
+ startUrl.searchParams.set("client_id", clientId);
30
+ startUrl.searchParams.set("redirect_uri", redirectURI);
31
+ return startUrl;
32
+ }
33
+ //# sourceMappingURL=applications.js.map