seamless-cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +79 -0
- package/LICENSE.md +26 -0
- package/README.md +238 -0
- package/dist/commands/bootstrapAdmin.js +96 -0
- package/dist/commands/bootstrapAdmin.js.map +1 -0
- package/dist/commands/check.js +92 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/contribute.js +121 -0
- package/dist/commands/contribute.js.map +1 -0
- package/dist/commands/deploy.js +190 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/destroy.js +122 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/help.js +103 -0
- package/dist/commands/help.js.map +1 -0
- package/dist/commands/init.js +73 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/contributor/catalog.js +129 -0
- package/dist/contributor/catalog.js.map +1 -0
- package/dist/contributor/workspace.js +551 -0
- package/dist/contributor/workspace.js.map +1 -0
- package/dist/core/acm.js +24 -0
- package/dist/core/acm.js.map +1 -0
- package/dist/core/aws.js +374 -0
- package/dist/core/aws.js.map +1 -0
- package/dist/core/bootstrapSecret.js +31 -0
- package/dist/core/bootstrapSecret.js.map +1 -0
- package/dist/core/buildPush.js +91 -0
- package/dist/core/buildPush.js.map +1 -0
- package/dist/core/configure.js +25 -0
- package/dist/core/configure.js.map +1 -0
- package/dist/core/deployConfig.js +66 -0
- package/dist/core/deployConfig.js.map +1 -0
- package/dist/core/deployManifest.js +163 -0
- package/dist/core/deployManifest.js.map +1 -0
- package/dist/core/deploySecrets.js +31 -0
- package/dist/core/deploySecrets.js.map +1 -0
- package/dist/core/destroy.js +38 -0
- package/dist/core/destroy.js.map +1 -0
- package/dist/core/env.js +35 -0
- package/dist/core/env.js.map +1 -0
- package/dist/core/envDiscovery.js +153 -0
- package/dist/core/envDiscovery.js.map +1 -0
- package/dist/core/envRegistry.js +76 -0
- package/dist/core/envRegistry.js.map +1 -0
- package/dist/core/exec.js +17 -0
- package/dist/core/exec.js.map +1 -0
- package/dist/core/fetch.js +9 -0
- package/dist/core/fetch.js.map +1 -0
- package/dist/core/health.js +11 -0
- package/dist/core/health.js.map +1 -0
- package/dist/core/help.js +75 -0
- package/dist/core/help.js.map +1 -0
- package/dist/core/inspect.js +15 -0
- package/dist/core/inspect.js.map +1 -0
- package/dist/core/jwks.js +19 -0
- package/dist/core/jwks.js.map +1 -0
- package/dist/core/output.js +94 -0
- package/dist/core/output.js.map +1 -0
- package/dist/core/packageManager.js +10 -0
- package/dist/core/packageManager.js.map +1 -0
- package/dist/core/paths.js +7 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/preReqs.js +14 -0
- package/dist/core/preReqs.js.map +1 -0
- package/dist/core/secrets.js +8 -0
- package/dist/core/secrets.js.map +1 -0
- package/dist/core/terraform.js +34 -0
- package/dist/core/terraform.js.map +1 -0
- package/dist/core/tfVars.js +69 -0
- package/dist/core/tfVars.js.map +1 -0
- package/dist/generators/admin/admin.js +2 -0
- package/dist/generators/admin/admin.js.map +1 -0
- package/dist/generators/auth/auth.js +47 -0
- package/dist/generators/auth/auth.js.map +1 -0
- package/dist/generators/backend/express.js +13 -0
- package/dist/generators/backend/express.js.map +1 -0
- package/dist/generators/config/config.js +43 -0
- package/dist/generators/config/config.js.map +1 -0
- package/dist/generators/deploy/aws/dev/files.js +36 -0
- package/dist/generators/deploy/aws/dev/files.js.map +1 -0
- package/dist/generators/deploy/aws/dev/template.js +1240 -0
- package/dist/generators/deploy/aws/dev/template.js.map +1 -0
- package/dist/generators/docker/docker.js +263 -0
- package/dist/generators/docker/docker.js.map +1 -0
- package/dist/generators/frontend/react.js +13 -0
- package/dist/generators/frontend/react.js.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/contributeSetup.js +39 -0
- package/dist/prompts/contributeSetup.js.map +1 -0
- package/dist/prompts/deploySetup.js +244 -0
- package/dist/prompts/deploySetup.js.map +1 -0
- package/dist/prompts/projectSetup.js +73 -0
- package/dist/prompts/projectSetup.js.map +1 -0
- package/dist/utils/repoUtils.js +23 -0
- package/dist/utils/repoUtils.js.map +1 -0
- package/dist/utils/writeEnv.js +9 -0
- package/dist/utils/writeEnv.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { VERSION } from "../index.js";
|
|
2
|
+
export function printHelp() {
|
|
3
|
+
console.log(`
|
|
4
|
+
create-seamless v${VERSION}
|
|
5
|
+
|
|
6
|
+
Seamless Auth CLI — scaffold and manage full-stack authentication systems.
|
|
7
|
+
|
|
8
|
+
────────────────────────────────────────────
|
|
9
|
+
|
|
10
|
+
USAGE
|
|
11
|
+
|
|
12
|
+
seamless init [project-name]
|
|
13
|
+
seamless check
|
|
14
|
+
seamless --help
|
|
15
|
+
seamless --version
|
|
16
|
+
|
|
17
|
+
────────────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
COMMANDS
|
|
20
|
+
|
|
21
|
+
init [project-name]
|
|
22
|
+
Scaffold a new Seamless Auth project
|
|
23
|
+
|
|
24
|
+
Without a name:
|
|
25
|
+
• Creates project in current directory
|
|
26
|
+
|
|
27
|
+
With a name:
|
|
28
|
+
• Creates new directory
|
|
29
|
+
|
|
30
|
+
check
|
|
31
|
+
Validate project setup, Docker, and running services
|
|
32
|
+
|
|
33
|
+
────────────────────────────────────────────
|
|
34
|
+
|
|
35
|
+
BEHAVIOR
|
|
36
|
+
|
|
37
|
+
seamless <project-name>
|
|
38
|
+
|
|
39
|
+
• Shortcut for: seamless init <project-name>
|
|
40
|
+
|
|
41
|
+
────────────────────────────────────────────
|
|
42
|
+
|
|
43
|
+
WHAT YOU GET
|
|
44
|
+
|
|
45
|
+
• Web application (React starter)
|
|
46
|
+
• API server (Express)
|
|
47
|
+
• SeamlessAuth server (Docker or local)
|
|
48
|
+
• Admin dashboard (Docker or source)
|
|
49
|
+
• Docker Compose setup
|
|
50
|
+
|
|
51
|
+
────────────────────────────────────────────
|
|
52
|
+
|
|
53
|
+
EXAMPLES
|
|
54
|
+
|
|
55
|
+
seamless init
|
|
56
|
+
→ Interactive setup in current directory
|
|
57
|
+
|
|
58
|
+
seamless init my-app
|
|
59
|
+
→ Create new project in ./my-app
|
|
60
|
+
|
|
61
|
+
seamless my-app
|
|
62
|
+
→ Shortcut for init
|
|
63
|
+
|
|
64
|
+
seamless check
|
|
65
|
+
→ Validate your project
|
|
66
|
+
|
|
67
|
+
────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
DOCS
|
|
70
|
+
|
|
71
|
+
https://docs.seamlessauth.com
|
|
72
|
+
|
|
73
|
+
`);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/core/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,CAAC;mBACK,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEzB,CAAC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { detectPackageManager } from "./packageManager.js";
|
|
4
|
+
export async function inspectProject(root) {
|
|
5
|
+
const hasPackageJson = fs.existsSync(path.join(root, "package.json"));
|
|
6
|
+
return {
|
|
7
|
+
root,
|
|
8
|
+
packageManager: detectPackageManager(root),
|
|
9
|
+
detected: {
|
|
10
|
+
packageJson: hasPackageJson,
|
|
11
|
+
anything: hasPackageJson,
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=inspect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/core/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IAEtE,OAAO;QACL,IAAI;QACJ,cAAc,EAAE,oBAAoB,CAAC,IAAI,CAAC;QAC1C,QAAQ,EAAE;YACR,WAAW,EAAE,cAAc;YAC3B,QAAQ,EAAE,cAAc;SACzB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { generateKeyPairSync } from "crypto";
|
|
2
|
+
export function generateJWKS() {
|
|
3
|
+
const { publicKey, privateKey } = generateKeyPairSync("rsa", {
|
|
4
|
+
modulusLength: 2048,
|
|
5
|
+
publicKeyEncoding: {
|
|
6
|
+
type: "spki",
|
|
7
|
+
format: "pem",
|
|
8
|
+
},
|
|
9
|
+
privateKeyEncoding: {
|
|
10
|
+
type: "pkcs8",
|
|
11
|
+
format: "pem",
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
return {
|
|
15
|
+
publicKey,
|
|
16
|
+
privateKey,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=jwks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwks.js","sourceRoot":"","sources":["../../src/core/jwks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAE7C,MAAM,UAAU,YAAY;IAC1B,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,mBAAmB,CAAC,KAAK,EAAE;QAC3D,aAAa,EAAE,IAAI;QACnB,iBAAiB,EAAE;YACjB,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,KAAK;SACd;QACD,kBAAkB,EAAE;YAClB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,KAAK;SACd;KACF,CAAC,CAAC;IAEH,OAAO;QACL,SAAS;QACT,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import kleur from "kleur";
|
|
2
|
+
export function printSuccessOutput(config) {
|
|
3
|
+
const { projectName, webFramework, apiFramework, authMode, useDocker } = config;
|
|
4
|
+
const title = kleur.bold().cyan("SEAMLESS");
|
|
5
|
+
console.log(`
|
|
6
|
+
╔════════════════════════════════════════╗
|
|
7
|
+
║ ${title} ║
|
|
8
|
+
╚════════════════════════════════════════╝
|
|
9
|
+
`);
|
|
10
|
+
console.log(kleur.green("Project initialized successfully.\n"));
|
|
11
|
+
if (projectName) {
|
|
12
|
+
console.log(kleur.dim("Project directory: ") + kleur.bold(projectName));
|
|
13
|
+
console.log(kleur.cyan(`cd ${projectName}\n`));
|
|
14
|
+
}
|
|
15
|
+
console.log(kleur.bold("Included services:\n"));
|
|
16
|
+
if (webFramework) {
|
|
17
|
+
console.log(" • " +
|
|
18
|
+
kleur.white("Web application") +
|
|
19
|
+
kleur.dim(` (${formatFramework(webFramework)})`));
|
|
20
|
+
}
|
|
21
|
+
if (apiFramework) {
|
|
22
|
+
console.log(" • " +
|
|
23
|
+
kleur.white("API server") +
|
|
24
|
+
kleur.dim(` (${formatFramework(apiFramework)})`));
|
|
25
|
+
}
|
|
26
|
+
console.log(" • " +
|
|
27
|
+
kleur.white("Auth server") +
|
|
28
|
+
kleur.dim(authMode === "local" ? " (local source)" : " (Docker image)"));
|
|
29
|
+
console.log(" • " + kleur.white("Admin dashboard") + kleur.dim(" (management UI)"));
|
|
30
|
+
console.log("");
|
|
31
|
+
console.log(kleur.bold("Next steps:\n"));
|
|
32
|
+
if (useDocker) {
|
|
33
|
+
console.log(" 1. Start services");
|
|
34
|
+
console.log(kleur.cyan(" docker compose up\n"));
|
|
35
|
+
console.log(" 2. Create your first admin user");
|
|
36
|
+
console.log(kleur.cyan(" seamless bootstrap-admin\n"));
|
|
37
|
+
console.log(" 3. Complete registration in the browser");
|
|
38
|
+
console.log(kleur.dim(" This grants admin access to the system\n"));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
if (authMode === "local") {
|
|
42
|
+
console.log(kleur.dim(" # Auth server"));
|
|
43
|
+
console.log(kleur.yellow(" Requires a local PostgreSQL instance running on localhost:5432\n"));
|
|
44
|
+
console.log(" cd auth");
|
|
45
|
+
console.log(" npm install\n");
|
|
46
|
+
console.log(kleur.dim(" # Initialize database"));
|
|
47
|
+
console.log(" npm run db:create");
|
|
48
|
+
console.log(" npm run db:migrate\n");
|
|
49
|
+
console.log(kleur.dim(" # Start auth server"));
|
|
50
|
+
console.log(" npm run dev\n");
|
|
51
|
+
}
|
|
52
|
+
if (apiFramework) {
|
|
53
|
+
console.log(kleur.dim(" # API server"));
|
|
54
|
+
console.log(" cd api && npm install && npm run dev\n");
|
|
55
|
+
}
|
|
56
|
+
if (webFramework) {
|
|
57
|
+
console.log(kleur.dim(" # Web app"));
|
|
58
|
+
console.log(" cd web && npm install && npm run dev\n");
|
|
59
|
+
}
|
|
60
|
+
console.log(" 2. Create your first admin user");
|
|
61
|
+
console.log(kleur.cyan(" seamless bootstrap-admin\n"));
|
|
62
|
+
}
|
|
63
|
+
console.log(kleur.bold("Available services:\n"));
|
|
64
|
+
console.log(" Auth: " + kleur.cyan("http://localhost:5312"));
|
|
65
|
+
if (apiFramework) {
|
|
66
|
+
console.log(" API: " + kleur.cyan("http://localhost:3000"));
|
|
67
|
+
}
|
|
68
|
+
if (webFramework) {
|
|
69
|
+
console.log(" Web: " + kleur.cyan("http://localhost:5173"));
|
|
70
|
+
}
|
|
71
|
+
console.log(" Admin: " + kleur.cyan("http://localhost:5174"));
|
|
72
|
+
console.log("");
|
|
73
|
+
console.log(kleur.bold("Notes:\n"));
|
|
74
|
+
console.log(kleur.dim(" • Web connects to API automatically"));
|
|
75
|
+
console.log(kleur.dim(" • API connects to Auth automatically"));
|
|
76
|
+
console.log(kleur.dim(" • Admin dashboard uses the same auth system"));
|
|
77
|
+
console.log(kleur.dim(" • Bootstrap command provisions the first admin user"));
|
|
78
|
+
console.log(kleur.dim(" • All secrets and keys are pre-configured\n"));
|
|
79
|
+
console.log(kleur.dim("Docs: ") + kleur.cyan("https://docs.seamlessauth.com\n"));
|
|
80
|
+
console.log(kleur.bold().green("Setup complete.\n"));
|
|
81
|
+
}
|
|
82
|
+
function formatFramework(name) {
|
|
83
|
+
const map = {
|
|
84
|
+
react: "React",
|
|
85
|
+
express: "Express",
|
|
86
|
+
angular: "Angular",
|
|
87
|
+
next: "Next.js",
|
|
88
|
+
fastapi: "FastAPI",
|
|
89
|
+
fastify: "Fastify",
|
|
90
|
+
vue: "Vue",
|
|
91
|
+
};
|
|
92
|
+
return map[name] || name;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/core/output.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
export function detectPackageManager(root) {
|
|
4
|
+
if (fs.existsSync(path.join(root, "pnpm-lock.yaml")))
|
|
5
|
+
return "pnpm";
|
|
6
|
+
if (fs.existsSync(path.join(root, "yarn.lock")))
|
|
7
|
+
return "yarn";
|
|
8
|
+
return "npm";
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=packageManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packageManager.js","sourceRoot":"","sources":["../../src/core/packageManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAIxB,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IACpE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { fileURLToPath } from "url";
|
|
3
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
4
|
+
const __dirname = path.dirname(__filename);
|
|
5
|
+
export const PROJECT_ROOT = path.resolve(__dirname, "../../");
|
|
6
|
+
export const TEMPLATE_ROOT = path.join(PROJECT_ROOT, "templates");
|
|
7
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/core/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { commandExists } from "./exec.js";
|
|
2
|
+
export async function ensureRequiredCommands() {
|
|
3
|
+
const required = ["aws", "docker", "terraform"];
|
|
4
|
+
const missing = [];
|
|
5
|
+
for (const command of required) {
|
|
6
|
+
const exists = await commandExists(command);
|
|
7
|
+
if (!exists)
|
|
8
|
+
missing.push(command);
|
|
9
|
+
}
|
|
10
|
+
if (missing.length > 0) {
|
|
11
|
+
throw new Error(`Missing required commands: ${missing.join(", ")}`);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=preReqs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preReqs.js","sourceRoot":"","sources":["../../src/core/preReqs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,sBAAsB;IAC1C,MAAM,QAAQ,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/core/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,MAAM,GAAG,EAAE;IACxC,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { execCommand } from "./exec.js";
|
|
3
|
+
import { getAwsDevInfraDir } from "./paths.js";
|
|
4
|
+
export async function terraformInit(projectDir) {
|
|
5
|
+
await execCommand("terraform", ["init"], {
|
|
6
|
+
cwd: getAwsDevInfraDir(projectDir),
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
export async function terraformPlan(projectDir) {
|
|
10
|
+
await execCommand("terraform", ["plan", "-out=tfplan"], {
|
|
11
|
+
cwd: getAwsDevInfraDir(projectDir),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export async function terraformApply(projectDir) {
|
|
15
|
+
await execCommand("terraform", ["apply", "-auto-approve"], {
|
|
16
|
+
cwd: getAwsDevInfraDir(projectDir),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export async function terraformOutput(projectDir, name) {
|
|
20
|
+
const result = await execCommand("terraform", ["output", "-raw", name], {
|
|
21
|
+
cwd: getAwsDevInfraDir(projectDir),
|
|
22
|
+
quiet: true,
|
|
23
|
+
});
|
|
24
|
+
return result.stdout.trim();
|
|
25
|
+
}
|
|
26
|
+
export function getTerraformWorkingDir(projectDir) {
|
|
27
|
+
return path.resolve(getAwsDevInfraDir(projectDir));
|
|
28
|
+
}
|
|
29
|
+
export async function terraformDestroy(projectDir) {
|
|
30
|
+
await execCommand("terraform", ["destroy", "-auto-approve"], {
|
|
31
|
+
cwd: getAwsDevInfraDir(projectDir),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=terraform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../src/core/terraform.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACpD,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE;QACvC,GAAG,EAAE,iBAAiB,CAAC,UAAU,CAAC;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB;IACpD,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE;QACtD,GAAG,EAAE,iBAAiB,CAAC,UAAU,CAAC;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE;QACzD,GAAG,EAAE,iBAAiB,CAAC,UAAU,CAAC;KACnC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,IAAY;IAEZ,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QACtE,GAAG,EAAE,iBAAiB,CAAC,UAAU,CAAC;QAClC,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACvD,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,MAAM,WAAW,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE;QAC3D,GAAG,EAAE,iBAAiB,CAAC,UAAU,CAAC;KACnC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tfVars.js","sourceRoot":"","sources":["../../src/core/tfVars.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin.js","sourceRoot":"","sources":["../../../src/generators/admin/admin.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { runCommand } from "../../core/exec.js";
|
|
4
|
+
import { writeEnv } from "../../utils/writeEnv.js";
|
|
5
|
+
const AUTH_REPO = "https://github.com/fells-code/seamless-auth-api";
|
|
6
|
+
const AUTH_PORT = 5312;
|
|
7
|
+
export async function generateAuthServer(context, mode) {
|
|
8
|
+
const { root } = context;
|
|
9
|
+
if (mode === "local") {
|
|
10
|
+
await setupLocalAuth(root);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
await setupDockerAuth(root);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function setupLocalAuth(root) {
|
|
17
|
+
const authDir = path.join(root, "auth");
|
|
18
|
+
console.log("Cloning SeamlessAuth server...");
|
|
19
|
+
await runCommand("git", ["clone", AUTH_REPO, "auth"], root);
|
|
20
|
+
console.log("Writing auth environment...");
|
|
21
|
+
writeEnv(authDir, {
|
|
22
|
+
PORT: AUTH_PORT,
|
|
23
|
+
NODE_ENV: "development",
|
|
24
|
+
AUTH_MODE: "server",
|
|
25
|
+
ISSUER: `http://localhost:${AUTH_PORT}`,
|
|
26
|
+
});
|
|
27
|
+
console.log("Auth server ready in /auth");
|
|
28
|
+
}
|
|
29
|
+
async function setupDockerAuth(root) {
|
|
30
|
+
console.log("Creating docker-compose for SeamlessAuth...");
|
|
31
|
+
const dockerCompose = `
|
|
32
|
+
services:
|
|
33
|
+
auth:
|
|
34
|
+
image: ghcr.io/fells-code/seamless-auth-api:v0.1.2
|
|
35
|
+
container_name: seamless-auth
|
|
36
|
+
ports:
|
|
37
|
+
- "5312:5312"
|
|
38
|
+
environment:
|
|
39
|
+
PORT: 5312
|
|
40
|
+
NODE_ENV: development
|
|
41
|
+
AUTH_MODE: server
|
|
42
|
+
ISSUER: http://localhost:5312
|
|
43
|
+
`;
|
|
44
|
+
fs.writeFileSync(path.join(root, "docker-compose.yml"), dockerCompose.trim() + "\n");
|
|
45
|
+
console.log("Docker setup ready.");
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/generators/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,SAAS,GAAG,iDAAiD,CAAC;AACpE,MAAM,SAAS,GAAG,IAAI,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAY,EACZ,IAAiC;IAEjC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAE5D,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,QAAQ,CAAC,OAAO,EAAE;QAChB,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,aAAa;QACvB,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,oBAAoB,SAAS,EAAE;KACxC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAC5C,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,IAAY;IACzC,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAE3D,MAAM,aAAa,GAAG;;;;;;;;;;;;CAYvB,CAAC;IAEA,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAoB,CAAC,EACrC,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAC5B,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { VERSION } from "../../index.js";
|
|
4
|
+
export function generateSeamlessConfig(root, options) {
|
|
5
|
+
const config = {
|
|
6
|
+
version: VERSION,
|
|
7
|
+
projectName: options.projectName || path.basename(root),
|
|
8
|
+
createdAt: new Date().toISOString(),
|
|
9
|
+
services: {
|
|
10
|
+
web: {
|
|
11
|
+
framework: options.webFramework,
|
|
12
|
+
path: "./web",
|
|
13
|
+
},
|
|
14
|
+
api: {
|
|
15
|
+
framework: options.apiFramework,
|
|
16
|
+
path: "./api",
|
|
17
|
+
},
|
|
18
|
+
auth: {
|
|
19
|
+
mode: options.authMode,
|
|
20
|
+
image: options.authMode === "docker"
|
|
21
|
+
? "ghcr.io/fells-code/seamless-auth-api:latest"
|
|
22
|
+
: null,
|
|
23
|
+
path: options.authMode === "local" ? "./auth" : null,
|
|
24
|
+
},
|
|
25
|
+
admin: {
|
|
26
|
+
mode: options.adminMode,
|
|
27
|
+
image: options.adminMode === "image"
|
|
28
|
+
? "ghcr.io/fells-code/seamless-auth-admin-dashboard:latest"
|
|
29
|
+
: null,
|
|
30
|
+
path: options.adminMode === "source" ? "./admin" : null,
|
|
31
|
+
},
|
|
32
|
+
database: {
|
|
33
|
+
type: "postgres",
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
docker: {
|
|
37
|
+
composeFile: "docker-compose.yml",
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
fs.writeFileSync(path.join(root, "seamless.config.json"), JSON.stringify(config, null, 2));
|
|
41
|
+
console.log("Seamless config created.");
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/generators/config/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAEzC,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,OAMC;IAED,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAEnC,QAAQ,EAAE;YACR,GAAG,EAAE;gBACH,SAAS,EAAE,OAAO,CAAC,YAAY;gBAC/B,IAAI,EAAE,OAAO;aACd;YACD,GAAG,EAAE;gBACH,SAAS,EAAE,OAAO,CAAC,YAAY;gBAC/B,IAAI,EAAE,OAAO;aACd;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,OAAO,CAAC,QAAQ;gBACtB,KAAK,EACH,OAAO,CAAC,QAAQ,KAAK,QAAQ;oBAC3B,CAAC,CAAC,6CAA6C;oBAC/C,CAAC,CAAC,IAAI;gBACV,IAAI,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;aACrD;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO,CAAC,SAAS;gBACvB,KAAK,EACH,OAAO,CAAC,SAAS,KAAK,OAAO;oBAC3B,CAAC,CAAC,yDAAyD;oBAC3D,CAAC,CAAC,IAAI;gBACV,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;aACxD;YACD,QAAQ,EAAE;gBACR,IAAI,EAAE,UAAU;aACjB;SACF;QAED,MAAM,EAAE;YACN,WAAW,EAAE,oBAAoB;SAClC;KACF,CAAC;IAEF,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,EACvC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAChC,CAAC;IAEF,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../../../../src/generators/deploy/aws/dev/files.ts"],"names":[],"mappings":"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"}
|