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.
Files changed (129) hide show
  1. package/README.md +5 -6
  2. package/dist/commands/help.js +18 -1
  3. package/dist/commands/help.js.map +1 -1
  4. package/dist/commands/init.js +104 -21
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/verify.js +259 -0
  7. package/dist/commands/verify.js.map +1 -0
  8. package/dist/core/bootstrapSecret.js +12 -4
  9. package/dist/core/bootstrapSecret.js.map +1 -1
  10. package/dist/core/exec.js +2 -1
  11. package/dist/core/exec.js.map +1 -1
  12. package/dist/core/fetch.js +2 -1
  13. package/dist/core/fetch.js.map +1 -1
  14. package/dist/core/images.js +11 -0
  15. package/dist/core/images.js.map +1 -0
  16. package/dist/core/oauthProviders.js +89 -0
  17. package/dist/core/oauthProviders.js.map +1 -0
  18. package/dist/core/templates.js +185 -0
  19. package/dist/core/templates.js.map +1 -0
  20. package/dist/generators/auth/auth.js +40 -19
  21. package/dist/generators/auth/auth.js.map +1 -1
  22. package/dist/generators/config/config.js +3 -4
  23. package/dist/generators/config/config.js.map +1 -1
  24. package/dist/generators/docker/docker.js +51 -31
  25. package/dist/generators/docker/docker.js.map +1 -1
  26. package/dist/index.js +11 -2
  27. package/dist/index.js.map +1 -1
  28. package/dist/prompts/oauthSetup.js +36 -0
  29. package/dist/prompts/oauthSetup.js.map +1 -0
  30. package/dist/prompts/projectSetup.js +43 -19
  31. package/dist/prompts/projectSetup.js.map +1 -1
  32. package/package.json +6 -1
  33. package/verify/adapter-app/Dockerfile +14 -0
  34. package/verify/adapter-app/package.json +13 -0
  35. package/verify/adapter-app/server.mjs +62 -0
  36. package/verify/adapter-app/vendor/.gitignore +3 -0
  37. package/verify/adapter-app/vendor/.gitkeep +0 -0
  38. package/verify/docker-compose.verify.yml +154 -0
  39. package/verify/harness/adapter/emailOtpLogin.spec.ts +12 -0
  40. package/verify/harness/adapter/magicLink.spec.ts +14 -0
  41. package/verify/harness/adapter/oauth.spec.ts +11 -0
  42. package/verify/harness/adapter/registration.spec.ts +11 -0
  43. package/verify/harness/adapter/sessionLifecycle.spec.ts +20 -0
  44. package/verify/harness/api/adminBootstrap.spec.ts +34 -0
  45. package/verify/harness/api/emailOtp.spec.ts +17 -0
  46. package/verify/harness/api/jwks.spec.ts +17 -0
  47. package/verify/harness/api/magicLink.spec.ts +36 -0
  48. package/verify/harness/api/oauth.spec.ts +12 -0
  49. package/verify/harness/api/organizations.spec.ts +28 -0
  50. package/verify/harness/api/phoneOtp.spec.ts +19 -0
  51. package/verify/harness/api/sessionLifecycle.spec.ts +26 -0
  52. package/verify/harness/api/stepUp.spec.ts +39 -0
  53. package/verify/harness/api/totp.spec.ts +24 -0
  54. package/verify/harness/global-setup.ts +45 -0
  55. package/verify/harness/lib/adapterFlows.ts +57 -0
  56. package/verify/harness/lib/client.ts +32 -0
  57. package/verify/harness/lib/env.ts +45 -0
  58. package/verify/harness/lib/fixtures.ts +20 -0
  59. package/verify/harness/lib/flows.ts +204 -0
  60. package/verify/harness/lib/matrixReporter.ts +73 -0
  61. package/verify/harness/lib/reactFlows.ts +117 -0
  62. package/verify/harness/lib/serviceToken.ts +26 -0
  63. package/verify/harness/lib/totp.ts +36 -0
  64. package/verify/harness/mock-oidc.ts +112 -0
  65. package/verify/harness/package-lock.json +93 -0
  66. package/verify/harness/package.json +14 -0
  67. package/verify/harness/playwright.config.ts +30 -0
  68. package/verify/harness/react/emailOtpLogin.spec.ts +13 -0
  69. package/verify/harness/react/logout.spec.ts +17 -0
  70. package/verify/harness/react/magicLinkLogin.spec.ts +29 -0
  71. package/verify/harness/react/oauth.spec.ts +13 -0
  72. package/verify/harness/react/passkeyLogin.spec.ts +24 -0
  73. package/verify/harness/react/passkeyRegister.spec.ts +15 -0
  74. package/verify/harness/react/register.spec.ts +18 -0
  75. package/verify/react-vendor/.gitkeep +0 -0
  76. package/dist/commands/contribute.js +0 -121
  77. package/dist/commands/contribute.js.map +0 -1
  78. package/dist/commands/deploy.js +0 -190
  79. package/dist/commands/deploy.js.map +0 -1
  80. package/dist/commands/destroy.js +0 -122
  81. package/dist/commands/destroy.js.map +0 -1
  82. package/dist/contributor/catalog.js +0 -129
  83. package/dist/contributor/catalog.js.map +0 -1
  84. package/dist/contributor/workspace.js +0 -551
  85. package/dist/contributor/workspace.js.map +0 -1
  86. package/dist/core/acm.js +0 -24
  87. package/dist/core/acm.js.map +0 -1
  88. package/dist/core/aws.js +0 -374
  89. package/dist/core/aws.js.map +0 -1
  90. package/dist/core/buildPush.js +0 -91
  91. package/dist/core/buildPush.js.map +0 -1
  92. package/dist/core/configure.js +0 -25
  93. package/dist/core/configure.js.map +0 -1
  94. package/dist/core/deployConfig.js +0 -66
  95. package/dist/core/deployConfig.js.map +0 -1
  96. package/dist/core/deployManifest.js +0 -163
  97. package/dist/core/deployManifest.js.map +0 -1
  98. package/dist/core/deploySecrets.js +0 -31
  99. package/dist/core/deploySecrets.js.map +0 -1
  100. package/dist/core/destroy.js +0 -38
  101. package/dist/core/destroy.js.map +0 -1
  102. package/dist/core/envDiscovery.js +0 -153
  103. package/dist/core/envDiscovery.js.map +0 -1
  104. package/dist/core/envRegistry.js +0 -76
  105. package/dist/core/envRegistry.js.map +0 -1
  106. package/dist/core/health.js +0 -11
  107. package/dist/core/health.js.map +0 -1
  108. package/dist/core/help.js +0 -75
  109. package/dist/core/help.js.map +0 -1
  110. package/dist/core/preReqs.js +0 -14
  111. package/dist/core/preReqs.js.map +0 -1
  112. package/dist/core/terraform.js +0 -34
  113. package/dist/core/terraform.js.map +0 -1
  114. package/dist/core/tfVars.js +0 -69
  115. package/dist/core/tfVars.js.map +0 -1
  116. package/dist/generators/backend/express.js +0 -13
  117. package/dist/generators/backend/express.js.map +0 -1
  118. package/dist/generators/deploy/aws/dev/files.js +0 -36
  119. package/dist/generators/deploy/aws/dev/files.js.map +0 -1
  120. package/dist/generators/deploy/aws/dev/template.js +0 -1240
  121. package/dist/generators/deploy/aws/dev/template.js.map +0 -1
  122. package/dist/generators/frontend/react.js +0 -13
  123. package/dist/generators/frontend/react.js.map +0 -1
  124. package/dist/prompts/contributeSetup.js +0 -39
  125. package/dist/prompts/contributeSetup.js.map +0 -1
  126. package/dist/prompts/deploySetup.js +0 -244
  127. package/dist/prompts/deploySetup.js.map +0 -1
  128. package/dist/utils/repoUtils.js +0 -23
  129. 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 Auth React Starter
145
- [https://github.com/fells-code/seamless-auth-starter-react](https://github.com/fells-code/seamless-auth-starter-react)
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
- - Seamless Auth API Starter
148
- [https://github.com/fells-code/seamless-auth-starter-express](https://github.com/fells-code/seamless-auth-starter-express)
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
 
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGlB,CAAC,CAAC;AACH,CAAC"}
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"}
@@ -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 { configureApiEnv, configureWebEnv } from "../core/configure.js";
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
- export async function runCLI(projectName) {
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 answers = await runProjectSetupPrompts();
30
- if (answers.web && answers.webFramework === "react") {
31
- await generateReactStarter({ root });
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
- if (answers.api && answers.apiFramework === "express") {
34
- await generateExpressStarter({ root });
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
- if (answers.api) {
52
- configureApiEnv(root, sharedConfig);
53
- }
54
- if (answers.web) {
55
- configureWebEnv(root);
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: answers.webFramework,
60
- apiFramework: answers.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: answers.webFramework,
68
- apiFramework: answers.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":"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"}
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":"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"}
@@ -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].trim();
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].trim();
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].trim();
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;IAC/C,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,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,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,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,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,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,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)
@@ -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;IAEX,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;SACZ,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"}
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"}
@@ -1,5 +1,6 @@
1
+ import { SEAMLESS_AUTH_API_VERSION } from "./images.js";
1
2
  export async function fetchEnvExample() {
2
- const url = "https://raw.githubusercontent.com/fells-code/seamless-auth-api/main/.env.example";
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");
@@ -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,kFAAkF,CAAC;IAErF,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"}
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"}