seamless-cli 0.2.0 → 0.5.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.
- package/README.md +5 -6
- package/dist/commands/help.js +18 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/init.js +104 -21
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/verify.js +259 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/bootstrapSecret.js +12 -4
- package/dist/core/bootstrapSecret.js.map +1 -1
- package/dist/core/exec.js +2 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/fetch.js +2 -1
- package/dist/core/fetch.js.map +1 -1
- package/dist/core/images.js +11 -0
- package/dist/core/images.js.map +1 -0
- package/dist/core/oauthProviders.js +89 -0
- package/dist/core/oauthProviders.js.map +1 -0
- package/dist/core/templates.js +185 -0
- package/dist/core/templates.js.map +1 -0
- package/dist/generators/auth/auth.js +40 -19
- package/dist/generators/auth/auth.js.map +1 -1
- package/dist/generators/config/config.js +3 -4
- package/dist/generators/config/config.js.map +1 -1
- package/dist/generators/docker/docker.js +51 -31
- package/dist/generators/docker/docker.js.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/prompts/oauthSetup.js +36 -0
- package/dist/prompts/oauthSetup.js.map +1 -0
- package/dist/prompts/projectSetup.js +43 -19
- package/dist/prompts/projectSetup.js.map +1 -1
- package/package.json +6 -1
- package/verify/adapter-app/Dockerfile +14 -0
- package/verify/adapter-app/package.json +13 -0
- package/verify/adapter-app/server.mjs +62 -0
- package/verify/adapter-app/vendor/.gitignore +3 -0
- package/verify/adapter-app/vendor/.gitkeep +0 -0
- package/verify/docker-compose.verify.yml +154 -0
- package/verify/harness/adapter/emailOtpLogin.spec.ts +12 -0
- package/verify/harness/adapter/magicLink.spec.ts +14 -0
- package/verify/harness/adapter/oauth.spec.ts +11 -0
- package/verify/harness/adapter/registration.spec.ts +11 -0
- package/verify/harness/adapter/sessionLifecycle.spec.ts +20 -0
- package/verify/harness/api/adminBootstrap.spec.ts +34 -0
- package/verify/harness/api/emailOtp.spec.ts +17 -0
- package/verify/harness/api/jwks.spec.ts +17 -0
- package/verify/harness/api/magicLink.spec.ts +36 -0
- package/verify/harness/api/oauth.spec.ts +12 -0
- package/verify/harness/api/organizations.spec.ts +28 -0
- package/verify/harness/api/phoneOtp.spec.ts +19 -0
- package/verify/harness/api/sessionLifecycle.spec.ts +26 -0
- package/verify/harness/api/stepUp.spec.ts +39 -0
- package/verify/harness/api/totp.spec.ts +24 -0
- package/verify/harness/global-setup.ts +45 -0
- package/verify/harness/lib/adapterFlows.ts +57 -0
- package/verify/harness/lib/client.ts +32 -0
- package/verify/harness/lib/env.ts +45 -0
- package/verify/harness/lib/fixtures.ts +20 -0
- package/verify/harness/lib/flows.ts +204 -0
- package/verify/harness/lib/matrixReporter.ts +73 -0
- package/verify/harness/lib/reactFlows.ts +117 -0
- package/verify/harness/lib/serviceToken.ts +26 -0
- package/verify/harness/lib/totp.ts +36 -0
- package/verify/harness/mock-oidc.ts +112 -0
- package/verify/harness/package-lock.json +93 -0
- package/verify/harness/package.json +14 -0
- package/verify/harness/playwright.config.ts +30 -0
- package/verify/harness/react/emailOtpLogin.spec.ts +13 -0
- package/verify/harness/react/logout.spec.ts +17 -0
- package/verify/harness/react/magicLinkLogin.spec.ts +29 -0
- package/verify/harness/react/oauth.spec.ts +13 -0
- package/verify/harness/react/passkeyLogin.spec.ts +24 -0
- package/verify/harness/react/passkeyRegister.spec.ts +15 -0
- package/verify/harness/react/register.spec.ts +18 -0
- package/verify/react-vendor/.gitkeep +0 -0
- package/dist/commands/contribute.js +0 -121
- package/dist/commands/contribute.js.map +0 -1
- package/dist/commands/deploy.js +0 -190
- package/dist/commands/deploy.js.map +0 -1
- package/dist/commands/destroy.js +0 -122
- package/dist/commands/destroy.js.map +0 -1
- package/dist/contributor/catalog.js +0 -129
- package/dist/contributor/catalog.js.map +0 -1
- package/dist/contributor/workspace.js +0 -551
- package/dist/contributor/workspace.js.map +0 -1
- package/dist/core/acm.js +0 -24
- package/dist/core/acm.js.map +0 -1
- package/dist/core/aws.js +0 -374
- package/dist/core/aws.js.map +0 -1
- package/dist/core/buildPush.js +0 -91
- package/dist/core/buildPush.js.map +0 -1
- package/dist/core/configure.js +0 -25
- package/dist/core/configure.js.map +0 -1
- package/dist/core/deployConfig.js +0 -66
- package/dist/core/deployConfig.js.map +0 -1
- package/dist/core/deployManifest.js +0 -163
- package/dist/core/deployManifest.js.map +0 -1
- package/dist/core/deploySecrets.js +0 -31
- package/dist/core/deploySecrets.js.map +0 -1
- package/dist/core/destroy.js +0 -38
- package/dist/core/destroy.js.map +0 -1
- package/dist/core/envDiscovery.js +0 -153
- package/dist/core/envDiscovery.js.map +0 -1
- package/dist/core/envRegistry.js +0 -76
- package/dist/core/envRegistry.js.map +0 -1
- package/dist/core/health.js +0 -11
- package/dist/core/health.js.map +0 -1
- package/dist/core/help.js +0 -75
- package/dist/core/help.js.map +0 -1
- package/dist/core/preReqs.js +0 -14
- package/dist/core/preReqs.js.map +0 -1
- package/dist/core/terraform.js +0 -34
- package/dist/core/terraform.js.map +0 -1
- package/dist/core/tfVars.js +0 -69
- package/dist/core/tfVars.js.map +0 -1
- package/dist/generators/backend/express.js +0 -13
- package/dist/generators/backend/express.js.map +0 -1
- package/dist/generators/deploy/aws/dev/files.js +0 -36
- package/dist/generators/deploy/aws/dev/files.js.map +0 -1
- package/dist/generators/deploy/aws/dev/template.js +0 -1240
- package/dist/generators/deploy/aws/dev/template.js.map +0 -1
- package/dist/generators/frontend/react.js +0 -13
- package/dist/generators/frontend/react.js.map +0 -1
- package/dist/prompts/contributeSetup.js +0 -39
- package/dist/prompts/contributeSetup.js.map +0 -1
- package/dist/prompts/deploySetup.js +0 -244
- package/dist/prompts/deploySetup.js.map +0 -1
- package/dist/utils/repoUtils.js +0 -23
- package/dist/utils/repoUtils.js.map +0 -1
package/README.md
CHANGED
|
@@ -141,13 +141,12 @@ Seamless CLI pulls from the following repositories:
|
|
|
141
141
|
- Seamless Auth API
|
|
142
142
|
[https://github.com/fells-code/seamless-auth-api](https://github.com/fells-code/seamless-auth-api)
|
|
143
143
|
|
|
144
|
-
- Seamless
|
|
145
|
-
[https://github.com/fells-code/seamless-
|
|
144
|
+
- Seamless Templates (the frontend and API starters)
|
|
145
|
+
[https://github.com/fells-code/seamless-templates](https://github.com/fells-code/seamless-templates)
|
|
146
146
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
Each project can be used independently, but the CLI connects them into a working system.
|
|
147
|
+
The starters live in the templates monorepo and are listed in its registry, so the set of
|
|
148
|
+
frameworks the CLI offers grows there. Each project can be used independently, but the CLI connects
|
|
149
|
+
them into a working system.
|
|
151
150
|
|
|
152
151
|
---
|
|
153
152
|
|
package/dist/commands/help.js
CHANGED
|
@@ -9,9 +9,10 @@ Seamless CLI — scaffold and manage full-stack authentication systems.
|
|
|
9
9
|
|
|
10
10
|
USAGE
|
|
11
11
|
|
|
12
|
-
seamless init [project-name]
|
|
12
|
+
seamless init [project-name] [--<example>]
|
|
13
13
|
seamless check
|
|
14
14
|
seamless bootstrap-admin [email]
|
|
15
|
+
seamless verify [--api-only] [--filter=<flow>] [--keep-up]
|
|
15
16
|
seamless --help
|
|
16
17
|
seamless --version
|
|
17
18
|
|
|
@@ -28,9 +29,22 @@ COMMANDS
|
|
|
28
29
|
With a name:
|
|
29
30
|
• Creates new directory
|
|
30
31
|
|
|
32
|
+
With an example flag (e.g. --oauth):
|
|
33
|
+
• Scaffolds that use-case starter and skips the web prompt
|
|
34
|
+
• Run an unknown flag to see the available examples
|
|
35
|
+
|
|
31
36
|
check
|
|
32
37
|
Validate project setup, Docker, and running services
|
|
33
38
|
|
|
39
|
+
verify [--local] [--api-only] [--filter=<flow>] [--keep-up]
|
|
40
|
+
Stand up the auth stack and run the conformance suite across the API and
|
|
41
|
+
the cookie (adapter) paths. Requires Docker. Builds the auth server from
|
|
42
|
+
a sibling seamless-auth-api checkout (override with SEAMLESS_API_DIR).
|
|
43
|
+
|
|
44
|
+
--local builds and links the local @seamless-auth/* SDK source (sibling
|
|
45
|
+
seamless-auth-server, override with SEAMLESS_SERVER_DIR) instead of the
|
|
46
|
+
published npm packages — so you can catch SDK regressions before publishing.
|
|
47
|
+
|
|
34
48
|
bootstrap-admin [email]
|
|
35
49
|
Create a bootstrap admin invite
|
|
36
50
|
|
|
@@ -83,6 +97,9 @@ EXAMPLES
|
|
|
83
97
|
seamless init my-app
|
|
84
98
|
→ Create new project in ./my-app
|
|
85
99
|
|
|
100
|
+
seamless init --oauth my-app
|
|
101
|
+
→ Create ./my-app from the OAuth example starter
|
|
102
|
+
|
|
86
103
|
seamless my-app
|
|
87
104
|
→ Shortcut for init
|
|
88
105
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;YACF,OAAO
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;YACF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkHlB,CAAC,CAAC;AACH,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import path from "path";
|
|
2
2
|
import fs from "fs";
|
|
3
3
|
import { runProjectSetupPrompts } from "../prompts/projectSetup.js";
|
|
4
|
-
import { generateReactStarter } from "../generators/frontend/react.js";
|
|
5
|
-
import { generateExpressStarter } from "../generators/backend/express.js";
|
|
6
4
|
import { generateAuthServer } from "../generators/auth/auth.js";
|
|
7
|
-
import {
|
|
8
|
-
import { configureAuthLocalEnv, generateDockerCompose, } from "../generators/docker/docker.js";
|
|
5
|
+
import { generateDockerCompose } from "../generators/docker/docker.js";
|
|
9
6
|
import { printSuccessOutput } from "../core/output.js";
|
|
10
7
|
import { generateSeamlessConfig } from "../generators/config/config.js";
|
|
11
|
-
|
|
8
|
+
import { applyTemplateEnv, assertCliSupports, openTemplateSource, } from "../core/templates.js";
|
|
9
|
+
import { runOAuthSetupPrompts } from "../prompts/oauthSetup.js";
|
|
10
|
+
const AUTH_SERVER_URL = "http://localhost:5312";
|
|
11
|
+
const API_URL = "http://localhost:3000";
|
|
12
|
+
export async function runCLI(projectName, aliases = []) {
|
|
12
13
|
const cwd = process.cwd();
|
|
13
14
|
let root = cwd;
|
|
14
15
|
if (projectName) {
|
|
@@ -26,48 +27,130 @@ export async function runCLI(projectName) {
|
|
|
26
27
|
console.log("Integration flow coming next.");
|
|
27
28
|
return;
|
|
28
29
|
}
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
const source = await openTemplateSource();
|
|
31
|
+
const preselect = resolveTemplateAliases(aliases, source.registry.templates);
|
|
32
|
+
const answers = await runProjectSetupPrompts(source.registry.templates, preselect);
|
|
33
|
+
const findEntry = (id) => {
|
|
34
|
+
const entry = source.registry.templates.find((t) => t.id === id);
|
|
35
|
+
if (!entry) {
|
|
36
|
+
throw new Error(`Selected template "${id}" is not in the registry.`);
|
|
37
|
+
}
|
|
38
|
+
return entry;
|
|
39
|
+
};
|
|
40
|
+
// Resolve the chosen templates (read manifests) before writing anything, so every
|
|
41
|
+
// prompt finishes before files are placed. Env wiring waits until the shared auth
|
|
42
|
+
// config (tokens, key id) exists below.
|
|
43
|
+
const selected = [];
|
|
44
|
+
for (const id of [answers.webTemplateId, answers.apiTemplateId]) {
|
|
45
|
+
const entry = findEntry(id);
|
|
46
|
+
const manifest = await source.readManifest(entry);
|
|
47
|
+
assertCliSupports(manifest, entry.label);
|
|
48
|
+
const dir = path.join(root, manifest.targetDir);
|
|
49
|
+
selected.push({ entry, manifest, dir });
|
|
50
|
+
}
|
|
51
|
+
// Templates can opt into OAuth setup (manifest setup.oauth). Collect providers now,
|
|
52
|
+
// before scaffolding, so the auth server can be wired up with them below.
|
|
53
|
+
const webSelection = selected.find((s) => s.entry.kind === "web");
|
|
54
|
+
let oauthProviders = [];
|
|
55
|
+
if (webSelection?.manifest.setup?.oauth) {
|
|
56
|
+
oauthProviders = await runOAuthSetupPrompts();
|
|
32
57
|
}
|
|
33
|
-
|
|
34
|
-
|
|
58
|
+
for (const { entry, dir } of selected) {
|
|
59
|
+
console.log(`Adding ${entry.label} starter...`);
|
|
60
|
+
await source.copyInto(entry, dir);
|
|
35
61
|
}
|
|
36
62
|
let sharedConfig = {};
|
|
37
63
|
if (answers.authMode === "local") {
|
|
38
|
-
await generateAuthServer({ root }, "local");
|
|
39
|
-
sharedConfig = await configureAuthLocalEnv(root);
|
|
64
|
+
sharedConfig = await generateAuthServer({ root }, "local", oauthProviders);
|
|
40
65
|
}
|
|
41
66
|
if (answers.useDocker) {
|
|
42
67
|
const dockerShared = await generateDockerCompose(root, {
|
|
43
68
|
authMode: answers.authMode,
|
|
44
69
|
adminMode: answers.adminMode,
|
|
45
70
|
includeAdmin: answers.includeAdmin,
|
|
71
|
+
oauth: oauthProviders,
|
|
46
72
|
});
|
|
47
73
|
if (answers.authMode === "docker") {
|
|
48
74
|
sharedConfig = dockerShared;
|
|
49
75
|
}
|
|
50
76
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
77
|
+
const ctx = {
|
|
78
|
+
authServerUrl: AUTH_SERVER_URL,
|
|
79
|
+
apiUrl: API_URL,
|
|
80
|
+
apiToken: sharedConfig.apiToken,
|
|
81
|
+
jwksKid: sharedConfig.kid,
|
|
82
|
+
};
|
|
83
|
+
for (const { manifest, dir } of selected) {
|
|
84
|
+
applyTemplateEnv(dir, manifest, ctx);
|
|
56
85
|
}
|
|
86
|
+
const webEntry = findEntry(answers.webTemplateId);
|
|
87
|
+
const apiEntry = findEntry(answers.apiTemplateId);
|
|
57
88
|
generateSeamlessConfig(root, {
|
|
58
89
|
projectName,
|
|
59
|
-
webFramework:
|
|
60
|
-
apiFramework:
|
|
90
|
+
webFramework: webEntry.framework,
|
|
91
|
+
apiFramework: apiEntry.framework,
|
|
61
92
|
authMode: answers.authMode,
|
|
62
93
|
adminMode: answers.adminMode,
|
|
63
94
|
});
|
|
64
95
|
printSuccessOutput({
|
|
65
96
|
projectName,
|
|
66
97
|
root,
|
|
67
|
-
webFramework:
|
|
68
|
-
apiFramework:
|
|
98
|
+
webFramework: webEntry.framework,
|
|
99
|
+
apiFramework: apiEntry.framework,
|
|
69
100
|
authMode: answers.authMode,
|
|
70
101
|
useDocker: answers.useDocker,
|
|
71
102
|
});
|
|
103
|
+
printOAuthNextSteps(oauthProviders);
|
|
104
|
+
}
|
|
105
|
+
// Summarizes the OAuth wiring after scaffolding: which providers are ready and which
|
|
106
|
+
// still need credentials, plus the redirect URI to register with each provider.
|
|
107
|
+
function printOAuthNextSteps(providers) {
|
|
108
|
+
if (providers.length === 0)
|
|
109
|
+
return;
|
|
110
|
+
const ready = providers
|
|
111
|
+
.filter((p) => p.clientId && p.clientSecret)
|
|
112
|
+
.map((p) => p.catalog.label);
|
|
113
|
+
const pending = providers
|
|
114
|
+
.filter((p) => !p.clientId || !p.clientSecret)
|
|
115
|
+
.map((p) => p.catalog.label);
|
|
116
|
+
console.log("\nOAuth providers");
|
|
117
|
+
if (ready.length) {
|
|
118
|
+
console.log(` Enabled: ${ready.join(", ")}`);
|
|
119
|
+
}
|
|
120
|
+
if (pending.length) {
|
|
121
|
+
console.log(` Needs credentials before use: ${pending.join(", ")}`);
|
|
122
|
+
console.log(" Add the client id/secret in the auth environment (OAUTH_PROVIDERS and the");
|
|
123
|
+
console.log(' matching *_CLIENT_SECRET), then set that provider\'s "enabled" to true.');
|
|
124
|
+
}
|
|
125
|
+
console.log(" Register this redirect URI with each provider: http://localhost:5173/oauth/callback");
|
|
126
|
+
}
|
|
127
|
+
// Resolves `--<alias>` flags (e.g. --oauth) to specific templates from the registry,
|
|
128
|
+
// so a matching layer's prompt can be skipped. Aliases live in the registry, so no
|
|
129
|
+
// per-flag code is needed here. Unknown or conflicting flags are hard errors.
|
|
130
|
+
function resolveTemplateAliases(aliases, templates) {
|
|
131
|
+
const preselect = {};
|
|
132
|
+
for (const alias of aliases) {
|
|
133
|
+
const entry = templates.find((t) => t.alias === alias && t.status !== "coming-soon");
|
|
134
|
+
if (!entry) {
|
|
135
|
+
const available = templates
|
|
136
|
+
.filter((t) => t.alias && t.status !== "coming-soon")
|
|
137
|
+
.map((t) => `--${t.alias}`)
|
|
138
|
+
.join(", ");
|
|
139
|
+
throw new Error(`Unknown option "--${alias}". Available template flags: ${available || "(none)"}.`);
|
|
140
|
+
}
|
|
141
|
+
if (entry.kind === "web") {
|
|
142
|
+
if (preselect.webTemplateId && preselect.webTemplateId !== entry.id) {
|
|
143
|
+
throw new Error(`Conflicting web template flags: --${alias} cannot combine with another web example.`);
|
|
144
|
+
}
|
|
145
|
+
preselect.webTemplateId = entry.id;
|
|
146
|
+
}
|
|
147
|
+
else if (entry.kind === "api") {
|
|
148
|
+
if (preselect.apiTemplateId && preselect.apiTemplateId !== entry.id) {
|
|
149
|
+
throw new Error(`Conflicting api template flags: --${alias} cannot combine with another api example.`);
|
|
150
|
+
}
|
|
151
|
+
preselect.apiTemplateId = entry.id;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return preselect;
|
|
72
155
|
}
|
|
73
156
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import kleur from "kleur";
|
|
6
|
+
import { runCommand } from "../core/exec.js";
|
|
7
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const REPO_ROOT = path.resolve(__dirname, "..", "..");
|
|
9
|
+
const VERIFY_DIR = path.join(REPO_ROOT, "verify");
|
|
10
|
+
const COMPOSE_FILE = path.join(VERIFY_DIR, "docker-compose.verify.yml");
|
|
11
|
+
const HARNESS_DIR = path.join(VERIFY_DIR, "harness");
|
|
12
|
+
function parseArgs(args) {
|
|
13
|
+
const apiOnly = args.includes("--api-only");
|
|
14
|
+
return {
|
|
15
|
+
local: args.includes("--local"),
|
|
16
|
+
keepUp: args.includes("--keep-up"),
|
|
17
|
+
apiOnly,
|
|
18
|
+
// The browser layer runs by default; --no-react (or --api-only) skips it.
|
|
19
|
+
react: !apiOnly && !args.includes("--no-react"),
|
|
20
|
+
grep: args.find((a) => a.startsWith("--filter="))?.split("=")[1],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function ensureDocker() {
|
|
24
|
+
try {
|
|
25
|
+
execSync("docker --version", { stdio: "ignore" });
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new Error("Docker is required for `seamless verify`. Install: https://docs.docker.com/get-docker/");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
// The auth API is built from local source. Defaults to a sibling checkout so a
|
|
32
|
+
// linked CLI works without extra config; override with SEAMLESS_API_DIR.
|
|
33
|
+
function resolveApiDir() {
|
|
34
|
+
const candidate = process.env.SEAMLESS_API_DIR ?? path.resolve(REPO_ROOT, "..", "seamless-auth-api");
|
|
35
|
+
if (!fs.existsSync(path.join(candidate, "package.json"))) {
|
|
36
|
+
throw new Error(`Could not find the seamless-auth-api source at ${candidate}.\n` +
|
|
37
|
+
" Set SEAMLESS_API_DIR to its local checkout.");
|
|
38
|
+
}
|
|
39
|
+
return candidate;
|
|
40
|
+
}
|
|
41
|
+
// The seamless-templates checkout the web template is resolved from. Defaults to a
|
|
42
|
+
// sibling checkout; override with SEAMLESS_TEMPLATES_DIR.
|
|
43
|
+
function resolveTemplatesRoot() {
|
|
44
|
+
return (process.env.SEAMLESS_TEMPLATES_DIR ??
|
|
45
|
+
path.resolve(REPO_ROOT, "..", "seamless-templates"));
|
|
46
|
+
}
|
|
47
|
+
function readTemplateFlows(dir) {
|
|
48
|
+
const manifestPath = path.join(dir, "template.json");
|
|
49
|
+
if (!fs.existsSync(manifestPath))
|
|
50
|
+
return undefined;
|
|
51
|
+
try {
|
|
52
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
53
|
+
return manifest.verify?.flows;
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// The web templates to build, serve, and drive. Each is served at :5173 in turn and
|
|
60
|
+
// pointed at the adapter. Resolution order: an explicit SEAMLESS_REACT_DIR (a single
|
|
61
|
+
// template path, used by CI), otherwise every runnable web template in the registry.
|
|
62
|
+
function resolveWebTemplates() {
|
|
63
|
+
const override = process.env.SEAMLESS_REACT_DIR;
|
|
64
|
+
if (override) {
|
|
65
|
+
if (!fs.existsSync(path.join(override, "package.json"))) {
|
|
66
|
+
throw new Error(`SEAMLESS_REACT_DIR=${override} has no package.json.`);
|
|
67
|
+
}
|
|
68
|
+
return [
|
|
69
|
+
{ id: path.basename(override), dir: override, flows: readTemplateFlows(override) },
|
|
70
|
+
];
|
|
71
|
+
}
|
|
72
|
+
const root = resolveTemplatesRoot();
|
|
73
|
+
const registryPath = path.join(root, "registry.json");
|
|
74
|
+
if (!fs.existsSync(registryPath)) {
|
|
75
|
+
throw new Error(`Could not find the templates registry at ${registryPath}.\n` +
|
|
76
|
+
" Set SEAMLESS_TEMPLATES_DIR (or SEAMLESS_REACT_DIR to a template path), or run with --no-react.");
|
|
77
|
+
}
|
|
78
|
+
const registry = JSON.parse(fs.readFileSync(registryPath, "utf-8"));
|
|
79
|
+
const webTemplates = (registry.templates ?? []).filter((t) => t.kind === "web" && t.status !== "coming-soon");
|
|
80
|
+
if (webTemplates.length === 0) {
|
|
81
|
+
throw new Error("The templates registry has no runnable web templates.");
|
|
82
|
+
}
|
|
83
|
+
return webTemplates.map((t) => {
|
|
84
|
+
const dir = path.resolve(root, t.path);
|
|
85
|
+
if (!fs.existsSync(path.join(dir, "package.json"))) {
|
|
86
|
+
throw new Error(`Web template "${t.id}" resolved to ${dir}, which has no package.json.`);
|
|
87
|
+
}
|
|
88
|
+
return { id: t.id, dir, flows: readTemplateFlows(dir) };
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
// A manifest's verify.flows (e.g. ["oauth"]) becomes a Playwright grep over the
|
|
92
|
+
// matching spec tags (e.g. "@oauth"). No flows means run the whole suite.
|
|
93
|
+
function flowsToGrep(flows) {
|
|
94
|
+
if (!flows || flows.length === 0)
|
|
95
|
+
return undefined;
|
|
96
|
+
return flows.map((f) => `@${f}`).join("|");
|
|
97
|
+
}
|
|
98
|
+
const VENDOR_DIR = path.join(VERIFY_DIR, "adapter-app", "vendor");
|
|
99
|
+
const REACT_VENDOR_DIR = path.join(VERIFY_DIR, "react-vendor");
|
|
100
|
+
// The React client SDK (@seamless-auth/react). Defaults to a sibling checkout;
|
|
101
|
+
// override with SEAMLESS_REACT_SDK_DIR. Only needed for --local browser runs.
|
|
102
|
+
function resolveReactSdkDir() {
|
|
103
|
+
const candidate = process.env.SEAMLESS_REACT_SDK_DIR ??
|
|
104
|
+
path.resolve(REPO_ROOT, "..", "seamless-auth-react");
|
|
105
|
+
if (!fs.existsSync(path.join(candidate, "package.json"))) {
|
|
106
|
+
throw new Error(`Could not find @seamless-auth/react at ${candidate}.\n` +
|
|
107
|
+
" Set SEAMLESS_REACT_SDK_DIR to its local checkout (needed for --local browser runs).");
|
|
108
|
+
}
|
|
109
|
+
return candidate;
|
|
110
|
+
}
|
|
111
|
+
// The local server SDK (@seamless-auth/core + /express). Defaults to a sibling
|
|
112
|
+
// checkout; override with SEAMLESS_SERVER_DIR. Only needed for --local.
|
|
113
|
+
function resolveServerDir() {
|
|
114
|
+
const candidate = process.env.SEAMLESS_SERVER_DIR ?? path.resolve(REPO_ROOT, "..", "seamless-auth-server");
|
|
115
|
+
if (!fs.existsSync(path.join(candidate, "pnpm-workspace.yaml"))) {
|
|
116
|
+
throw new Error(`Could not find seamless-auth-server at ${candidate}.\n` +
|
|
117
|
+
" Set SEAMLESS_SERVER_DIR to its local checkout (needed for --local).");
|
|
118
|
+
}
|
|
119
|
+
return candidate;
|
|
120
|
+
}
|
|
121
|
+
function cleanVendor() {
|
|
122
|
+
for (const dir of [VENDOR_DIR, REACT_VENDOR_DIR]) {
|
|
123
|
+
for (const f of fs.readdirSync(dir)) {
|
|
124
|
+
if (f.endsWith(".tgz"))
|
|
125
|
+
fs.rmSync(path.join(dir, f));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Build + pack the local @seamless-auth/react into ./react-vendor so the react
|
|
130
|
+
// service installs it over the published version (--local browser runs).
|
|
131
|
+
async function packLocalReactSdk(env) {
|
|
132
|
+
const sdkDir = resolveReactSdkDir();
|
|
133
|
+
console.log(kleur.cyan("→ Building & packing local @seamless-auth/react…"));
|
|
134
|
+
await runCommand("npm", ["run", "build"], sdkDir, env);
|
|
135
|
+
await runCommand("npm", ["pack", "--pack-destination", REACT_VENDOR_DIR], sdkDir, env);
|
|
136
|
+
}
|
|
137
|
+
async function packLocalSdks(env) {
|
|
138
|
+
const serverDir = resolveServerDir();
|
|
139
|
+
console.log(kleur.cyan("→ Building & packing local @seamless-auth/* (core, express)…"));
|
|
140
|
+
await runCommand("pnpm", ["--filter", "@seamless-auth/core", "build"], serverDir, env);
|
|
141
|
+
await runCommand("pnpm", ["--filter", "@seamless-auth/express", "build"], serverDir, env);
|
|
142
|
+
for (const pkg of ["@seamless-auth/core", "@seamless-auth/express"]) {
|
|
143
|
+
await runCommand("pnpm", ["--filter", pkg, "pack", "--pack-destination", VENDOR_DIR], serverDir, env);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function compose(env, ...args) {
|
|
147
|
+
return runCommand("docker", ["compose", "-f", COMPOSE_FILE, ...args], VERIFY_DIR, env);
|
|
148
|
+
}
|
|
149
|
+
// Runs a set of Playwright projects, optionally narrowed by a grep. Returns true on
|
|
150
|
+
// pass, false on failure, so one layer failing does not abort the others.
|
|
151
|
+
async function runProjects(env, projects, grep) {
|
|
152
|
+
const passthrough = projects.flatMap((p) => ["--project", p]);
|
|
153
|
+
if (grep)
|
|
154
|
+
passthrough.push("--grep", grep);
|
|
155
|
+
try {
|
|
156
|
+
await runCommand("npm", ["test", "--", ...passthrough], HARNESS_DIR, env);
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export async function runVerify(args = []) {
|
|
164
|
+
const opts = parseArgs(args);
|
|
165
|
+
console.log(kleur.bold("\nSeamless Verify — auth conformance"));
|
|
166
|
+
console.log(kleur.dim(`SDK: ${opts.local ? "local (built from source)" : "released (npm)"}\n`));
|
|
167
|
+
ensureDocker();
|
|
168
|
+
const apiDir = resolveApiDir();
|
|
169
|
+
const webTemplates = opts.react ? resolveWebTemplates() : [];
|
|
170
|
+
const serviceToken = process.env.API_SERVICE_TOKEN ?? "verify-dev-service-token";
|
|
171
|
+
const baseEnv = {
|
|
172
|
+
...process.env,
|
|
173
|
+
SEAMLESS_API_DIR: apiDir,
|
|
174
|
+
API_SERVICE_TOKEN: serviceToken,
|
|
175
|
+
JWKS_KID: process.env.JWKS_KID ?? "dev-main",
|
|
176
|
+
SEAMLESS_BOOTSTRAP_SECRET: process.env.SEAMLESS_BOOTSTRAP_SECRET ?? "verify-dev-bootstrap-secret",
|
|
177
|
+
// consumed by the harness
|
|
178
|
+
SEAMLESS_API_SERVICE_TOKEN: serviceToken,
|
|
179
|
+
SEAMLESS_API_URL: "http://localhost:5312",
|
|
180
|
+
SEAMLESS_ADAPTER_URL: "http://localhost:3000",
|
|
181
|
+
};
|
|
182
|
+
// The base stack (no browser layer). The react service is added per template below.
|
|
183
|
+
const baseServices = ["postgres", "auth-api"];
|
|
184
|
+
if (!opts.apiOnly)
|
|
185
|
+
baseServices.push("adapter");
|
|
186
|
+
let failed = false;
|
|
187
|
+
try {
|
|
188
|
+
// The adapter / react images install local @seamless-auth/* tarballs when present.
|
|
189
|
+
cleanVendor();
|
|
190
|
+
if (opts.local)
|
|
191
|
+
await packLocalSdks(baseEnv);
|
|
192
|
+
if (opts.local && opts.react)
|
|
193
|
+
await packLocalReactSdk(baseEnv);
|
|
194
|
+
// Fresh volumes each run → deterministic system_config seed (e.g. LOGIN_METHODS).
|
|
195
|
+
console.log(kleur.cyan("→ Cleaning any previous stack…"));
|
|
196
|
+
await compose(baseEnv, "--profile", "react", "down", "-v").catch(() => undefined);
|
|
197
|
+
console.log(kleur.cyan(`→ Building & starting the stack (${baseServices.join(", ")})…`));
|
|
198
|
+
await compose(baseEnv, "up", "-d", "--build", ...baseServices);
|
|
199
|
+
if (!fs.existsSync(path.join(HARNESS_DIR, "node_modules"))) {
|
|
200
|
+
console.log(kleur.cyan("→ Installing harness dependencies…"));
|
|
201
|
+
await runCommand("npm", ["install"], HARNESS_DIR, baseEnv);
|
|
202
|
+
}
|
|
203
|
+
if (opts.react) {
|
|
204
|
+
console.log(kleur.cyan("→ Ensuring the Chromium browser is installed…"));
|
|
205
|
+
await runCommand("npx", ["playwright", "install", "chromium"], HARNESS_DIR, baseEnv);
|
|
206
|
+
}
|
|
207
|
+
// API and adapter layers are template-independent, so they run once.
|
|
208
|
+
const apiEnv = {
|
|
209
|
+
...baseEnv,
|
|
210
|
+
...(opts.apiOnly ? {} : { SEAMLESS_VERIFY_ADAPTER: "1" }),
|
|
211
|
+
};
|
|
212
|
+
const apiProjects = ["api"];
|
|
213
|
+
if (!opts.apiOnly)
|
|
214
|
+
apiProjects.push("adapter");
|
|
215
|
+
console.log(kleur.cyan("→ Running the API / adapter conformance…\n"));
|
|
216
|
+
if (!(await runProjects(apiEnv, apiProjects, opts.grep)))
|
|
217
|
+
failed = true;
|
|
218
|
+
// The browser layer runs once per web template, each pointed at its own source
|
|
219
|
+
// and scoped to the flows its manifest declares (all flows when unset).
|
|
220
|
+
for (const tmpl of webTemplates) {
|
|
221
|
+
const reactEnv = {
|
|
222
|
+
...baseEnv,
|
|
223
|
+
SEAMLESS_REACT_DIR: tmpl.dir,
|
|
224
|
+
SEAMLESS_REACT_URL: "http://localhost:5173",
|
|
225
|
+
SEAMLESS_VERIFY_REACT: "1",
|
|
226
|
+
};
|
|
227
|
+
const grep = opts.grep ?? flowsToGrep(tmpl.flows);
|
|
228
|
+
console.log(kleur.bold(`\n→ Web template: ${tmpl.id}${grep ? ` (flows: ${grep})` : " (all flows)"}\n`));
|
|
229
|
+
await compose(reactEnv, "--profile", "react", "up", "-d", "--build", "react");
|
|
230
|
+
if (!(await runProjects(reactEnv, ["react"], grep)))
|
|
231
|
+
failed = true;
|
|
232
|
+
// Remove the react container so the next template rebuilds from its own source.
|
|
233
|
+
await compose(reactEnv, "--profile", "react", "rm", "-sf", "react").catch(() => undefined);
|
|
234
|
+
}
|
|
235
|
+
if (failed) {
|
|
236
|
+
console.log(kleur.red("\n✖ Conformance failed.\n"));
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
console.log(kleur.green("\n✔ Conformance passed.\n"));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
failed = true;
|
|
244
|
+
console.log(kleur.red(`\n✖ Conformance failed: ${err.message}\n`));
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
if (opts.keepUp) {
|
|
248
|
+
console.log(kleur.dim("Stack left running (--keep-up). Tear down with:"));
|
|
249
|
+
console.log(kleur.dim(` docker compose -f ${COMPOSE_FILE} --profile react down -v\n`));
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
console.log(kleur.cyan("→ Tearing down…"));
|
|
253
|
+
await compose(baseEnv, "--profile", "react", "down", "-v").catch(() => undefined);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
if (failed)
|
|
257
|
+
process.exit(1);
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACtD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAClD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,2BAA2B,CAAC,CAAC;AACxE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;AAUrD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC5C,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC/B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAClC,OAAO;QACP,0EAA0E;QAC1E,KAAK,EAAE,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC/C,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,wFAAwF,CACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,yEAAyE;AACzE,SAAS,aAAa;IACpB,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACrF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,kDAAkD,SAAS,KAAK;YAC9D,+CAA+C,CAClD,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,mFAAmF;AACnF,0DAA0D;AAC1D,SAAS,oBAAoB;IAC3B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,oBAAoB,CAAC,CACpD,CAAC;AACJ,CAAC;AASD,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IACrD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CACnB,CAAC;QACtB,OAAO,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,qFAAqF;AACrF,qFAAqF;AACrF,SAAS,mBAAmB;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC;IAChD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,sBAAsB,QAAQ,uBAAuB,CAAC,CAAC;QACzE,CAAC;QACD,OAAO;YACL,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE;SACnF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,4CAA4C,YAAY,KAAK;YAC3D,kGAAkG,CACrG,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAa,CAAC;IAChF,MAAM,YAAY,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,MAAM,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,KAAK,aAAa,CACtD,CAAC;IACF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,iBAAiB,CAAC,CAAC,EAAE,iBAAiB,GAAG,8BAA8B,CACxE,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,gFAAgF;AAChF,0EAA0E;AAC1E,SAAS,WAAW,CAAC,KAAgB;IACnC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAClE,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AAE/D,+EAA+E;AAC/E,8EAA8E;AAC9E,SAAS,kBAAkB;IACzB,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAClC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,qBAAqB,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CACb,0CAA0C,SAAS,KAAK;YACtD,uFAAuF,CAC1F,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,+EAA+E;AAC/E,wEAAwE;AACxE,SAAS,gBAAgB;IACvB,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,sBAAsB,CAAC,CAAC;IAC3F,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,KAAK,CACb,0CAA0C,SAAS,KAAK;YACtD,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,WAAW;IAClB,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,yEAAyE;AACzE,KAAK,UAAU,iBAAiB,CAAC,GAAsB;IACrD,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAC5E,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IACvD,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;AACzF,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAsB;IACjD,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC,CAAC;IACxF,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,qBAAqB,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACvF,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,wBAAwB,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IAC1F,KAAK,MAAM,GAAG,IAAI,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,EAAE,CAAC;QACpE,MAAM,UAAU,CACd,MAAM,EACN,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,oBAAoB,EAAE,UAAU,CAAC,EAC3D,SAAS,EACT,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,GAAsB,EAAE,GAAG,IAAc;IACxD,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;AACzF,CAAC;AAED,oFAAoF;AACpF,0EAA0E;AAC1E,KAAK,UAAU,WAAW,CACxB,GAAsB,EACtB,QAAkB,EAClB,IAAwB;IAExB,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,IAAI,IAAI;QAAE,WAAW,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAiB,EAAE;IACjD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;IAEhG,YAAY,EAAE,CAAC;IACf,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,0BAA0B,CAAC;IACjF,MAAM,OAAO,GAAsB;QACjC,GAAG,OAAO,CAAC,GAAG;QACd,gBAAgB,EAAE,MAAM;QACxB,iBAAiB,EAAE,YAAY;QAC/B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,UAAU;QAC5C,yBAAyB,EACvB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,6BAA6B;QACxE,0BAA0B;QAC1B,0BAA0B,EAAE,YAAY;QACxC,gBAAgB,EAAE,uBAAuB;QACzC,oBAAoB,EAAE,uBAAuB;KAC9C,CAAC;IAEF,oFAAoF;IACpF,MAAM,YAAY,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAI,CAAC,OAAO;QAAE,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEhD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC;QACH,mFAAmF;QACnF,WAAW,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK;YAAE,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE/D,kFAAkF;QAClF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;QAC1D,MAAM,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAElF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzF,MAAM,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,CAAC;QAE/D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAC9D,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;YACzE,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QACvF,CAAC;QAED,qEAAqE;QACrE,MAAM,MAAM,GAAsB;YAChC,GAAG,OAAO;YACV,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,uBAAuB,EAAE,GAAG,EAAE,CAAC;SAC1D,CAAC;QACF,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAAE,MAAM,GAAG,IAAI,CAAC;QAExE,+EAA+E;QAC/E,wEAAwE;QACxE,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,QAAQ,GAAsB;gBAClC,GAAG,OAAO;gBACV,kBAAkB,EAAE,IAAI,CAAC,GAAG;gBAC5B,kBAAkB,EAAE,uBAAuB;gBAC3C,qBAAqB,EAAE,GAAG;aAC3B,CAAC;YACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,qBAAqB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,cAAc,IAAI,CAC/E,CACF,CAAC;YACF,MAAM,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9E,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;gBAAE,MAAM,GAAG,IAAI,CAAC;YACnE,gFAAgF;YAChF,MAAM,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,CACvE,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA4B,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAChF,CAAC;YAAS,CAAC;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,YAAY,4BAA4B,CAAC,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC3C,MAAM,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,IAAI,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -3,29 +3,37 @@ import path from "path";
|
|
|
3
3
|
export function resolveBootstrapSecret() {
|
|
4
4
|
const root = process.cwd();
|
|
5
5
|
if (process.env.SEAMLESS_BOOTSTRAP_SECRET) {
|
|
6
|
-
return process.env.SEAMLESS_BOOTSTRAP_SECRET;
|
|
6
|
+
return normalizeSecretValue(process.env.SEAMLESS_BOOTSTRAP_SECRET);
|
|
7
7
|
}
|
|
8
8
|
const rootEnv = path.join(root, ".env");
|
|
9
9
|
if (fs.existsSync(rootEnv)) {
|
|
10
10
|
const content = fs.readFileSync(rootEnv, "utf-8");
|
|
11
11
|
const match = content.match(/SEAMLESS_BOOTSTRAP_SECRET=(.*)/);
|
|
12
12
|
if (match)
|
|
13
|
-
return match[1]
|
|
13
|
+
return normalizeSecretValue(match[1]);
|
|
14
14
|
}
|
|
15
15
|
const authEnv = path.join(root, "auth", ".env");
|
|
16
16
|
if (fs.existsSync(authEnv)) {
|
|
17
17
|
const content = fs.readFileSync(authEnv, "utf-8");
|
|
18
18
|
const match = content.match(/SEAMLESS_BOOTSTRAP_SECRET=(.*)/);
|
|
19
19
|
if (match)
|
|
20
|
-
return match[1]
|
|
20
|
+
return normalizeSecretValue(match[1]);
|
|
21
21
|
}
|
|
22
22
|
const compose = path.join(root, "docker-compose.yml");
|
|
23
23
|
if (fs.existsSync(compose)) {
|
|
24
24
|
const content = fs.readFileSync(compose, "utf-8");
|
|
25
25
|
const match = content.match(/SEAMLESS_BOOTSTRAP_SECRET:\s*(.*)/);
|
|
26
26
|
if (match)
|
|
27
|
-
return match[1]
|
|
27
|
+
return normalizeSecretValue(match[1]);
|
|
28
28
|
}
|
|
29
29
|
return null;
|
|
30
30
|
}
|
|
31
|
+
function normalizeSecretValue(value) {
|
|
32
|
+
const trimmed = value.trim();
|
|
33
|
+
if ((trimmed.startsWith('"') && trimmed.endsWith('"')) ||
|
|
34
|
+
(trimmed.startsWith("'") && trimmed.endsWith("'"))) {
|
|
35
|
+
return trimmed.slice(1, -1);
|
|
36
|
+
}
|
|
37
|
+
return trimmed;
|
|
38
|
+
}
|
|
31
39
|
//# sourceMappingURL=bootstrapSecret.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrapSecret.js","sourceRoot":"","sources":["../../src/core/bootstrapSecret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrapSecret.js","sourceRoot":"","sources":["../../src/core/bootstrapSecret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,sBAAsB;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC;QAC1C,OAAO,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC9D,IAAI,KAAK;YAAE,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC9D,IAAI,KAAK;YAAE,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACtD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAElD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACjE,IAAI,KAAK;YAAE,OAAO,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IACE,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAClD,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAClD,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
package/dist/core/exec.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
|
-
export function runCommand(command, args, cwd) {
|
|
2
|
+
export function runCommand(command, args, cwd, env) {
|
|
3
3
|
return new Promise((resolve, reject) => {
|
|
4
4
|
const child = spawn(command, args, {
|
|
5
5
|
stdio: "inherit",
|
|
6
6
|
cwd,
|
|
7
7
|
shell: true,
|
|
8
|
+
env: env ?? process.env,
|
|
8
9
|
});
|
|
9
10
|
child.on("close", (code) => {
|
|
10
11
|
if (code === 0)
|
package/dist/core/exec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAc,EACd,GAAW;
|
|
1
|
+
{"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/core/exec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,UAAU,UAAU,CACxB,OAAe,EACf,IAAc,EACd,GAAW,EACX,GAAuB;IAEvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,KAAK,EAAE,SAAS;YAChB,GAAG;YACH,KAAK,EAAE,IAAI;YACX,GAAG,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG;SACxB,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,EAAE,CAAC;;gBACrB,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/core/fetch.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { SEAMLESS_AUTH_API_VERSION } from "./images.js";
|
|
1
2
|
export async function fetchEnvExample() {
|
|
2
|
-
const url =
|
|
3
|
+
const url = `https://raw.githubusercontent.com/fells-code/seamless-auth-api/${SEAMLESS_AUTH_API_VERSION}/.env.example`;
|
|
3
4
|
const res = await fetch(url);
|
|
4
5
|
if (!res.ok) {
|
|
5
6
|
throw new Error("Failed to fetch auth env.example");
|
package/dist/core/fetch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/core/fetch.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,GAAG,GACP,
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/core/fetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,GAAG,GACP,kEAAkE,yBAAyB,eAAe,CAAC;IAE7G,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IAE7B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;AAC1B,CAAC"}
|