seamless-cli 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/commands/help.js +3 -1
  2. package/dist/commands/help.js.map +1 -1
  3. package/dist/commands/init.js +39 -4
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/core/images.js +1 -1
  6. package/dist/core/oauthProviders.js +89 -0
  7. package/dist/core/oauthProviders.js.map +1 -0
  8. package/dist/core/templates.js.map +1 -1
  9. package/dist/generators/auth/auth.js +4 -4
  10. package/dist/generators/auth/auth.js.map +1 -1
  11. package/dist/generators/docker/docker.js +31 -10
  12. package/dist/generators/docker/docker.js.map +1 -1
  13. package/dist/index.js +0 -0
  14. package/dist/prompts/oauthSetup.js +36 -0
  15. package/dist/prompts/oauthSetup.js.map +1 -0
  16. package/package.json +1 -1
  17. package/dist/commands/contribute.js +0 -121
  18. package/dist/commands/contribute.js.map +0 -1
  19. package/dist/commands/deploy.js +0 -190
  20. package/dist/commands/deploy.js.map +0 -1
  21. package/dist/commands/destroy.js +0 -122
  22. package/dist/commands/destroy.js.map +0 -1
  23. package/dist/contributor/catalog.js +0 -129
  24. package/dist/contributor/catalog.js.map +0 -1
  25. package/dist/contributor/workspace.js +0 -551
  26. package/dist/contributor/workspace.js.map +0 -1
  27. package/dist/core/acm.js +0 -24
  28. package/dist/core/acm.js.map +0 -1
  29. package/dist/core/aws.js +0 -374
  30. package/dist/core/aws.js.map +0 -1
  31. package/dist/core/buildPush.js +0 -91
  32. package/dist/core/buildPush.js.map +0 -1
  33. package/dist/core/configure.js +0 -25
  34. package/dist/core/configure.js.map +0 -1
  35. package/dist/core/deployConfig.js +0 -66
  36. package/dist/core/deployConfig.js.map +0 -1
  37. package/dist/core/deployManifest.js +0 -163
  38. package/dist/core/deployManifest.js.map +0 -1
  39. package/dist/core/deploySecrets.js +0 -31
  40. package/dist/core/deploySecrets.js.map +0 -1
  41. package/dist/core/destroy.js +0 -38
  42. package/dist/core/destroy.js.map +0 -1
  43. package/dist/core/envDiscovery.js +0 -153
  44. package/dist/core/envDiscovery.js.map +0 -1
  45. package/dist/core/envRegistry.js +0 -76
  46. package/dist/core/envRegistry.js.map +0 -1
  47. package/dist/core/health.js +0 -11
  48. package/dist/core/health.js.map +0 -1
  49. package/dist/core/help.js +0 -75
  50. package/dist/core/help.js.map +0 -1
  51. package/dist/core/preReqs.js +0 -14
  52. package/dist/core/preReqs.js.map +0 -1
  53. package/dist/core/terraform.js +0 -34
  54. package/dist/core/terraform.js.map +0 -1
  55. package/dist/core/tfVars.js +0 -69
  56. package/dist/core/tfVars.js.map +0 -1
  57. package/dist/generators/backend/express.js +0 -13
  58. package/dist/generators/backend/express.js.map +0 -1
  59. package/dist/generators/deploy/aws/dev/files.js +0 -36
  60. package/dist/generators/deploy/aws/dev/files.js.map +0 -1
  61. package/dist/generators/deploy/aws/dev/template.js +0 -1240
  62. package/dist/generators/deploy/aws/dev/template.js.map +0 -1
  63. package/dist/generators/frontend/react.js +0 -13
  64. package/dist/generators/frontend/react.js.map +0 -1
  65. package/dist/prompts/contributeSetup.js +0 -39
  66. package/dist/prompts/contributeSetup.js.map +0 -1
  67. package/dist/prompts/deploySetup.js +0 -244
  68. package/dist/prompts/deploySetup.js.map +0 -1
  69. package/dist/utils/repoUtils.js +0 -23
  70. package/dist/utils/repoUtils.js.map +0 -1
@@ -1,69 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { getAwsDevInfraDir } from "./paths.js";
4
- function getTfvarsPath(projectDir) {
5
- return path.join(getAwsDevInfraDir(projectDir), "terraform.tfvars.json");
6
- }
7
- export function buildAwsDevTfvars(manifest) {
8
- return {
9
- project_name: manifest.projectName,
10
- aws_region: manifest.region,
11
- aws_profile: manifest.awsProfile,
12
- root_domain: manifest.domain.root,
13
- hosted_zone_domain: manifest.domain.hostedZoneDomain ?? manifest.domain.root,
14
- acm_certificate_arn: manifest.runtime.acmCertificateArn ?? "",
15
- web_host: manifest.domain.webHost,
16
- api_host: manifest.domain.apiHost,
17
- auth_host: manifest.domain.authHost,
18
- admin_host: manifest.domain.adminHost,
19
- backup_enabled: manifest.backup.enabled,
20
- backup_retention_days: manifest.backup.retentionDays,
21
- web_image: "REPLACE_WEB_IMAGE_URI",
22
- api_image: "REPLACE_API_IMAGE_URI",
23
- auth_image: "REPLACE_AUTH_IMAGE_URI",
24
- admin_image: "REPLACE_ADMIN_IMAGE_URI",
25
- postgres_image: "REPLACE_POSTGRES_IMAGE_URI",
26
- api_origin: manifest.runtime.apiOrigin,
27
- auth_issuer: manifest.runtime.authIssuer,
28
- web_origin: manifest.runtime.webOrigin,
29
- admin_origin: manifest.runtime.adminOrigin,
30
- rpid: manifest.runtime.rpid,
31
- api_service_token: manifest.runtime.secrets.apiServiceToken,
32
- cookie_signing_key: manifest.runtime.secrets.cookieSigningKey,
33
- bootstrap_secret: manifest.runtime.secrets.bootstrapSecret,
34
- auth_db_user: manifest.runtime.secrets.authDbUser,
35
- auth_db_password: manifest.runtime.secrets.authDbPassword,
36
- auth_db_name: manifest.runtime.secrets.authDbName,
37
- api_db_user: manifest.runtime.secrets.apiDbUser,
38
- api_db_password: manifest.runtime.secrets.apiDbPassword,
39
- api_db_name: manifest.runtime.secrets.apiDbName,
40
- jwks_active_kid: manifest.runtime.secrets.jwks.kid,
41
- seamless_jwks_active_kid: manifest.runtime.secrets.jwks.kid,
42
- jwks_private_key: manifest.runtime.secrets.jwks.privateKey,
43
- jwks_public_keys: manifest.runtime.secrets.jwks.publicJwksJson,
44
- };
45
- }
46
- export function writeAwsDevTfvars(projectDir, tfvars) {
47
- const outPath = getTfvarsPath(projectDir);
48
- fs.writeFileSync(outPath, `${JSON.stringify(tfvars, null, 2)}\n`, "utf8");
49
- }
50
- export function readAwsDevTfvars(projectDir) {
51
- const tfvarsPath = getTfvarsPath(projectDir);
52
- const raw = fs.readFileSync(tfvarsPath, "utf8");
53
- return JSON.parse(raw);
54
- }
55
- export function updateAwsDevTfvarsImages(projectDir, images) {
56
- const current = readAwsDevTfvars(projectDir);
57
- writeAwsDevTfvars(projectDir, {
58
- ...current,
59
- ...images,
60
- });
61
- }
62
- export function updateAwsDevTfvarsCertificateArn(projectDir, acmCertificateArn) {
63
- const current = readAwsDevTfvars(projectDir);
64
- writeAwsDevTfvars(projectDir, {
65
- ...current,
66
- acm_certificate_arn: acmCertificateArn,
67
- });
68
- }
69
- //# sourceMappingURL=tfVars.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tfVars.js","sourceRoot":"","sources":["../../src/core/tfVars.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import path from "path";
2
- import { cloneRepo, removeGitDir, copyEnvExample, } from "../../utils/repoUtils.js";
3
- const API_STARTER_REPO = "https://github.com/fells-code/seamless-auth-starter-express.git";
4
- export async function generateExpressStarter(context) {
5
- const { root } = context;
6
- const apiDir = path.join(root, "api");
7
- console.log("Cloning Seamless Auth Express starter...");
8
- await cloneRepo(API_STARTER_REPO, apiDir);
9
- removeGitDir(apiDir);
10
- copyEnvExample(apiDir);
11
- console.log("API starter ready.");
12
- }
13
- //# sourceMappingURL=express.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../../../src/generators/backend/express.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,cAAc,GACf,MAAM,0BAA0B,CAAC;AAElC,MAAM,gBAAgB,GACpB,iEAAiE,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAyB;IACpE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAEtC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IAExD,MAAM,SAAS,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAE1C,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACpC,CAAC"}
@@ -1,36 +0,0 @@
1
- import fs from "node:fs";
2
- import path from "node:path";
3
- import { buildAwsDevTfvars, writeAwsDevTfvars, } from "../../../../core/tfVars.js";
4
- import { getAwsDevInfraDir, getInfraDir } from "../../../../core/paths.js";
5
- import { renderAcmTf, renderAlbTf, renderBackupTf, renderEcsTf, renderEc2Tf, renderIamTf, renderLogsTf, renderMainTf, renderNetworkingTf, renderOutputsTf, renderPostgresDockerfile, renderPostgresInitSql, renderRoute53Tf, renderS3Tf, renderVariablesTf, } from "./template.js";
6
- function ensureDir(dir) {
7
- fs.mkdirSync(dir, { recursive: true });
8
- }
9
- function writeFile(filePath, content) {
10
- fs.writeFileSync(filePath, `${content.trim()}\n`, "utf8");
11
- }
12
- export function generateAwsDevInfra(projectDir, manifest) {
13
- const infraDir = getInfraDir(projectDir);
14
- const awsDevDir = getAwsDevInfraDir(projectDir);
15
- const postgresDir = path.join(awsDevDir, "postgres");
16
- ensureDir(infraDir);
17
- ensureDir(awsDevDir);
18
- ensureDir(postgresDir);
19
- writeFile(path.join(awsDevDir, "main.tf"), renderMainTf());
20
- writeFile(path.join(awsDevDir, "variables.tf"), renderVariablesTf(manifest));
21
- writeFile(path.join(awsDevDir, "networking.tf"), renderNetworkingTf());
22
- writeFile(path.join(awsDevDir, "acm.tf"), renderAcmTf());
23
- writeFile(path.join(awsDevDir, "route53.tf"), renderRoute53Tf());
24
- writeFile(path.join(awsDevDir, "alb.tf"), renderAlbTf());
25
- writeFile(path.join(awsDevDir, "logs.tf"), renderLogsTf(manifest));
26
- writeFile(path.join(awsDevDir, "s3.tf"), renderS3Tf());
27
- writeFile(path.join(awsDevDir, "iam.tf"), renderIamTf());
28
- writeFile(path.join(awsDevDir, "ec2.tf"), renderEc2Tf());
29
- writeFile(path.join(awsDevDir, "ecs.tf"), renderEcsTf(manifest));
30
- writeFile(path.join(awsDevDir, "backup.tf"), renderBackupTf());
31
- writeFile(path.join(awsDevDir, "outputs.tf"), renderOutputsTf());
32
- writeFile(path.join(postgresDir, "Dockerfile"), renderPostgresDockerfile());
33
- writeFile(path.join(postgresDir, "init.sql"), renderPostgresInitSql(manifest));
34
- writeAwsDevTfvars(projectDir, buildAwsDevTfvars(manifest));
35
- }
36
- //# sourceMappingURL=files.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"files.js","sourceRoot":"","sources":["../../../../../src/generators/deploy/aws/dev/files.ts"],"names":[],"mappings":"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"}