@itssergio91/sandman 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/cli/commands/connect.d.ts +5 -1
  2. package/dist/cli/commands/connect.d.ts.map +1 -1
  3. package/dist/cli/commands/connect.js +22 -20
  4. package/dist/cli/commands/connect.js.map +1 -1
  5. package/dist/cli/commands/create.d.ts +3 -2
  6. package/dist/cli/commands/create.d.ts.map +1 -1
  7. package/dist/cli/commands/create.js +53 -16
  8. package/dist/cli/commands/create.js.map +1 -1
  9. package/dist/cli/commands/destroy.d.ts +1 -0
  10. package/dist/cli/commands/destroy.d.ts.map +1 -1
  11. package/dist/cli/commands/destroy.js +15 -6
  12. package/dist/cli/commands/destroy.js.map +1 -1
  13. package/dist/cli/commands/enable.d.ts +5 -1
  14. package/dist/cli/commands/enable.d.ts.map +1 -1
  15. package/dist/cli/commands/enable.js +29 -6
  16. package/dist/cli/commands/enable.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts +6 -1
  18. package/dist/cli/commands/init.d.ts.map +1 -1
  19. package/dist/cli/commands/init.js +13 -6
  20. package/dist/cli/commands/init.js.map +1 -1
  21. package/dist/cli/commands/status.d.ts +1 -1
  22. package/dist/cli/commands/status.d.ts.map +1 -1
  23. package/dist/cli/commands/status.js +34 -23
  24. package/dist/cli/commands/status.js.map +1 -1
  25. package/dist/cli/index.d.ts.map +1 -1
  26. package/dist/cli/index.js +14 -9
  27. package/dist/cli/index.js.map +1 -1
  28. package/dist/core/state-store.d.ts +3 -3
  29. package/dist/core/state-store.d.ts.map +1 -1
  30. package/dist/core/state-store.js +1 -1
  31. package/dist/core/state-store.js.map +1 -1
  32. package/dist/providers/aws/adapter.d.ts +3 -0
  33. package/dist/providers/aws/adapter.d.ts.map +1 -1
  34. package/dist/providers/aws/adapter.js +331 -9
  35. package/dist/providers/aws/adapter.js.map +1 -1
  36. package/dist/providers/aws/adapter.test.js +107 -0
  37. package/dist/providers/aws/adapter.test.js.map +1 -1
  38. package/dist/providers/base.d.ts +2 -0
  39. package/dist/providers/base.d.ts.map +1 -1
  40. package/dist/providers/base.js +15 -0
  41. package/dist/providers/base.js.map +1 -1
  42. package/dist/providers/cloudflare/adapter.d.ts +12 -0
  43. package/dist/providers/cloudflare/adapter.d.ts.map +1 -0
  44. package/dist/providers/cloudflare/adapter.js +85 -0
  45. package/dist/providers/cloudflare/adapter.js.map +1 -0
  46. package/dist/providers/cloudflare/adapter.test.d.ts +2 -0
  47. package/dist/providers/cloudflare/adapter.test.d.ts.map +1 -0
  48. package/dist/providers/cloudflare/adapter.test.js +178 -0
  49. package/dist/providers/cloudflare/adapter.test.js.map +1 -0
  50. package/dist/providers/gcp/adapter.d.ts +3 -0
  51. package/dist/providers/gcp/adapter.d.ts.map +1 -1
  52. package/dist/providers/gcp/adapter.js +150 -18
  53. package/dist/providers/gcp/adapter.js.map +1 -1
  54. package/dist/providers/gcp/adapter.test.js +122 -15
  55. package/dist/providers/gcp/adapter.test.js.map +1 -1
  56. package/dist/providers/index.d.ts +4 -0
  57. package/dist/providers/index.d.ts.map +1 -0
  58. package/dist/providers/index.js +13 -0
  59. package/dist/providers/index.js.map +1 -0
  60. package/dist/providers/vercel/adapter.d.ts +12 -0
  61. package/dist/providers/vercel/adapter.d.ts.map +1 -0
  62. package/dist/providers/vercel/adapter.js +74 -0
  63. package/dist/providers/vercel/adapter.js.map +1 -0
  64. package/dist/providers/vercel/adapter.test.d.ts +2 -0
  65. package/dist/providers/vercel/adapter.test.d.ts.map +1 -0
  66. package/dist/providers/vercel/adapter.test.js +166 -0
  67. package/dist/providers/vercel/adapter.test.js.map +1 -0
  68. package/dist/types/index.d.ts +21 -21
  69. package/dist/types/index.d.ts.map +1 -1
  70. package/dist/types/index.js +19 -4
  71. package/dist/types/index.js.map +1 -1
  72. package/dist/utils/cost-estimator.d.ts +36 -0
  73. package/dist/utils/cost-estimator.d.ts.map +1 -0
  74. package/dist/utils/cost-estimator.js +87 -0
  75. package/dist/utils/cost-estimator.js.map +1 -0
  76. package/dist/utils/cost-estimator.test.d.ts +2 -0
  77. package/dist/utils/cost-estimator.test.d.ts.map +1 -0
  78. package/dist/utils/cost-estimator.test.js +77 -0
  79. package/dist/utils/cost-estimator.test.js.map +1 -0
  80. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AASpD,QAAA,MAAM,OAAO,SAAgB,CAAC;AAC9B,QAAA,MAAM,KAAK,YAAmB,CAAC;AA2E/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUpD,QAAA,MAAM,OAAO,SAAgB,CAAC;AAC9B,QAAA,MAAM,KAAK,YAAmB,CAAC;AAgF/B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC"}
package/dist/cli/index.js CHANGED
@@ -16,28 +16,31 @@ program
16
16
  program
17
17
  .command('init')
18
18
  .description('Initialize a cloud provider')
19
- .argument('<provider>', 'Provider to initialize (aws or gcp)')
19
+ .argument('<provider>', 'Provider to initialize: aws | gcp')
20
20
  .option('-r, --region <region>', 'Default region')
21
+ .option('--json', 'Output as JSON')
21
22
  .action(async (provider, options) => {
22
- await initProvider(provider, options.region, store);
23
+ await initProvider(provider, options.region, store, { json: options.json });
23
24
  });
24
25
  program
25
26
  .command('create')
26
27
  .description('Create a sandbox environment')
27
28
  .argument('<name>', 'Environment name')
28
- .option('-p, --provider <provider>', 'Cloud provider (aws or gcp)')
29
+ .option('-p, --provider <provider>', 'Cloud provider: aws | gcp')
29
30
  .option('-r, --region <region>', 'Region')
30
31
  .option('--dry-run', 'Preview actions without executing')
32
+ .option('--json', 'Output as JSON')
31
33
  .action(async (name, options) => {
32
- await createEnvironment(name, { provider: options.provider, region: options.region }, store, { dryRun: options.dryRun });
34
+ await createEnvironment(name, { provider: options.provider, region: options.region }, store, { dryRun: options.dryRun, json: options.json });
33
35
  });
34
36
  program
35
37
  .command('enable')
36
38
  .description('Enable services for an environment')
37
39
  .argument('<services...>', 'Services to enable')
38
40
  .option('-e, --environment <name>', 'Environment name')
41
+ .option('--json', 'Output as JSON')
39
42
  .action(async (services, options) => {
40
- await enableServices(services, options.environment, store);
43
+ await enableServices(services, options.environment, store, { json: options.json });
41
44
  });
42
45
  program
43
46
  .command('list')
@@ -56,18 +59,20 @@ program
56
59
  });
57
60
  program
58
61
  .command('connect')
59
- .description('Connect to an environment')
62
+ .description('Connect to an environment and output credentials')
60
63
  .argument('<name>', 'Environment name')
61
- .action(async (name) => {
62
- await connectEnvironment(name, store);
64
+ .option('--json', 'Output as JSON')
65
+ .action(async (name, options) => {
66
+ await connectEnvironment(name, store, options);
63
67
  });
64
68
  program
65
69
  .command('destroy')
66
70
  .description('Destroy an environment')
67
71
  .argument('<name>', 'Environment name')
68
72
  .option('-y, --yes', 'Skip confirmation')
73
+ .option('--json', 'Output as JSON')
69
74
  .action(async (name, options) => {
70
- await destroyEnvironment(name, store, { confirmed: options.yes ?? false });
75
+ await destroyEnvironment(name, store, { confirmed: options.yes ?? false, json: options.json });
71
76
  });
72
77
  export { program, store };
73
78
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG3D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAC;AAE/B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,oDAAoD,CAAC;KACjE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,6BAA6B,CAAC;KAC1C,QAAQ,CAAC,YAAY,EAAE,mCAAmC,CAAC;KAC3D,MAAM,CAAC,uBAAuB,EAAE,gBAAgB,CAAC;KACjD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,QAAgB,EAAE,OAA4C,EAAE,EAAE;IAC/E,MAAM,YAAY,CAAC,QAAwB,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,8BAA8B,CAAC;KAC3C,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;KACtC,MAAM,CAAC,2BAA2B,EAAE,2BAA2B,CAAC;KAChE,MAAM,CAAC,uBAAuB,EAAE,QAAQ,CAAC;KACzC,MAAM,CAAC,WAAW,EAAE,mCAAmC,CAAC;KACxD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAAiF,EAAE,EAAE;IAChH,MAAM,iBAAiB,CACrB,IAAI,EACJ,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAwB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EACtE,KAAK,EACL,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAC/C,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oCAAoC,CAAC;KACjD,QAAQ,CAAC,eAAe,EAAE,oBAAoB,CAAC;KAC/C,MAAM,CAAC,0BAA0B,EAAE,kBAAkB,CAAC;KACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,QAAkB,EAAE,OAAiD,EAAE,EAAE;IACtF,MAAM,cAAc,CAAC,QAAiB,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,uBAAuB,CAAC;KACpC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,OAA2B,EAAE,EAAE;IAC5C,MAAM,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yBAAyB,CAAC;KACtC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA2B,EAAE,EAAE;IAC1D,MAAM,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,kDAAkD,CAAC;KAC/D,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;KACtC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA2B,EAAE,EAAE;IAC1D,MAAM,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,wBAAwB,CAAC;KACrC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;KACtC,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;KACxC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA0C,EAAE,EAAE;IACzE,MAAM,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AACjG,CAAC,CAAC,CAAC;AAEL,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Config, EnvironmentRecord } from "../types/index.js";
1
+ import { Config, EnvironmentRecord, ProviderType } from "../types/index.js";
2
2
  export declare class StateStore {
3
3
  private configPath;
4
4
  private config;
@@ -9,9 +9,9 @@ export declare class StateStore {
9
9
  saveEnvironment(env: EnvironmentRecord): Promise<void>;
10
10
  deleteEnvironment(name: string): Promise<void>;
11
11
  listEnvironments(): Promise<EnvironmentRecord[]>;
12
- setProvider(provider: "aws" | "gcp", region?: string): Promise<void>;
12
+ setProvider(provider: ProviderType, region?: string): Promise<void>;
13
13
  getProvider(): Promise<{
14
- provider?: "aws" | "gcp";
14
+ provider?: ProviderType;
15
15
  region?: string;
16
16
  }>;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/core/state-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAgB,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAS5E,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,UAAU,GAAE,MAAiC;IAInD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAevB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAKpE,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKhD,WAAW,CAAC,QAAQ,EAAE,KAAK,GAAG,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASpE,WAAW,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAO5E"}
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../src/core/state-store.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,MAAM,EAEN,iBAAiB,EACjB,YAAY,EACb,MAAM,mBAAmB,CAAC;AAS3B,qBAAa,UAAU;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAuB;gBAEzB,UAAU,GAAE,MAAiC;IAInD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAevB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAKpE,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM9C,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAKhD,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnE,WAAW,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAO3E"}
@@ -1,7 +1,7 @@
1
1
  import { promises as fs } from "fs";
2
2
  import { dirname } from "path";
3
3
  import { homedir } from "os";
4
- import { ConfigSchema } from "../types/index.js";
4
+ import { ConfigSchema, } from "../types/index.js";
5
5
  function expandPath(path) {
6
6
  if (path.startsWith("~/")) {
7
7
  return path.replace("~", homedir());
@@ -1 +1 @@
1
- {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/core/state-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../src/core/state-store.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,9 @@ export declare class AwsAdapter implements ProviderAdapter {
5
5
  private region;
6
6
  init(): Promise<void>;
7
7
  createEnvironment(name: string): Promise<EnvironmentRecord>;
8
+ private createVpcResources;
9
+ private createIamResources;
10
+ private createEc2Instance;
8
11
  enableServices(env: EnvironmentRecord, services: ServiceName[]): Promise<void>;
9
12
  connect(env: EnvironmentRecord): Promise<Record<string, string>>;
10
13
  destroyEnvironment(env: EnvironmentRecord): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/aws/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,qBAAa,UAAW,YAAW,eAAe;IAChD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAuB;IAE/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAmC3D,cAAc,CAClB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC;IAIV,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAkBhE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2CzD,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAInE,cAAc,IAAI;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAM/D"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/providers/aws/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgB,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,qBAAa,UAAW,YAAW,eAAe;IAChD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAuB;IAE/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBrB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;YAmEnD,kBAAkB;YAkKlB,kBAAkB;YAuElB,iBAAiB;IAoCzB,cAAc,CAClB,GAAG,EAAE,iBAAiB,EACtB,QAAQ,EAAE,WAAW,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC;IAIV,OAAO,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IA2BhE,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoLzD,SAAS,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAInE,cAAc,IAAI;QAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAM/D"}
@@ -19,18 +19,47 @@ export class AwsAdapter {
19
19
  }
20
20
  async createEnvironment(name) {
21
21
  const bucketName = `sandman-${name}-${Date.now()}`;
22
+ const resources = {};
22
23
  try {
24
+ // Create S3 bucket
23
25
  const { S3Client, CreateBucketCommand } = await import("@aws-sdk/client-s3");
24
- const client = new S3Client({ region: this.region });
25
- await client.send(new CreateBucketCommand({
26
+ const s3Client = new S3Client({ region: this.region });
27
+ await s3Client.send(new CreateBucketCommand({
26
28
  Bucket: bucketName,
27
29
  }));
30
+ resources.bucketName = bucketName;
28
31
  }
29
32
  catch (error) {
30
33
  if (error.name !== "BucketAlreadyOwnedByYou") {
31
34
  console.warn("Could not create bucket:", error.message);
32
35
  }
33
36
  }
37
+ // Create VPC and networking
38
+ try {
39
+ const vpcResources = await this.createVpcResources(name);
40
+ Object.assign(resources, vpcResources);
41
+ }
42
+ catch (error) {
43
+ console.warn("Could not create VPC:", error.message);
44
+ }
45
+ // Create IAM role
46
+ try {
47
+ const iamResources = await this.createIamResources(name);
48
+ Object.assign(resources, iamResources);
49
+ }
50
+ catch (error) {
51
+ console.warn("Could not create IAM role:", error.message);
52
+ }
53
+ // Create EC2 instance
54
+ try {
55
+ if (resources.vpcId && resources.subnetId && resources.securityGroupId) {
56
+ const instanceId = await this.createEc2Instance(name, resources.subnetId, resources.securityGroupId, resources.iamInstanceProfile);
57
+ resources.instanceId = instanceId;
58
+ }
59
+ }
60
+ catch (error) {
61
+ console.warn("Could not create EC2 instance:", error.message);
62
+ }
34
63
  const now = new Date().toISOString();
35
64
  return {
36
65
  name,
@@ -39,13 +68,207 @@ export class AwsAdapter {
39
68
  region: this.region,
40
69
  status: "active",
41
70
  services: [],
42
- resources: {
43
- bucketName,
44
- },
71
+ resources,
45
72
  createdAt: now,
46
73
  updatedAt: now,
47
74
  };
48
75
  }
76
+ async createVpcResources(name) {
77
+ const { EC2Client } = await import("@aws-sdk/client-ec2");
78
+ const ec2Client = new EC2Client({ region: this.region });
79
+ const resources = {};
80
+ // Create VPC
81
+ const { CreateVpcCommand } = await import("@aws-sdk/client-ec2");
82
+ const vpcResponse = await ec2Client.send(new CreateVpcCommand({
83
+ CidrBlock: "10.0.0.0/16",
84
+ TagSpecifications: [
85
+ {
86
+ ResourceType: "vpc",
87
+ Tags: [
88
+ { Key: "Name", Value: `sandman-${name}` },
89
+ { Key: "CreatedBy", Value: "sandman" },
90
+ ],
91
+ },
92
+ ],
93
+ }));
94
+ resources.vpcId = vpcResponse.Vpc?.VpcId || "";
95
+ // Create Internet Gateway
96
+ const { CreateInternetGatewayCommand, AttachInternetGatewayCommand } = await import("@aws-sdk/client-ec2");
97
+ const igwResponse = await ec2Client.send(new CreateInternetGatewayCommand({
98
+ TagSpecifications: [
99
+ {
100
+ ResourceType: "internet-gateway",
101
+ Tags: [
102
+ { Key: "Name", Value: `sandman-${name}` },
103
+ { Key: "CreatedBy", Value: "sandman" },
104
+ ],
105
+ },
106
+ ],
107
+ }));
108
+ resources.internetGatewayId =
109
+ igwResponse.InternetGateway?.InternetGatewayId || "";
110
+ // Attach Internet Gateway to VPC
111
+ await ec2Client.send(new AttachInternetGatewayCommand({
112
+ InternetGatewayId: resources.internetGatewayId,
113
+ VpcId: resources.vpcId,
114
+ }));
115
+ // Create Subnet
116
+ const { CreateSubnetCommand } = await import("@aws-sdk/client-ec2");
117
+ const subnetResponse = await ec2Client.send(new CreateSubnetCommand({
118
+ VpcId: resources.vpcId,
119
+ CidrBlock: "10.0.1.0/24",
120
+ TagSpecifications: [
121
+ {
122
+ ResourceType: "subnet",
123
+ Tags: [
124
+ { Key: "Name", Value: `sandman-${name}` },
125
+ { Key: "CreatedBy", Value: "sandman" },
126
+ ],
127
+ },
128
+ ],
129
+ }));
130
+ resources.subnetId = subnetResponse.Subnet?.SubnetId || "";
131
+ // Create Route Table
132
+ const { CreateRouteTableCommand, CreateRouteCommand, AssociateRouteTableCommand, } = await import("@aws-sdk/client-ec2");
133
+ const rtResponse = await ec2Client.send(new CreateRouteTableCommand({
134
+ VpcId: resources.vpcId,
135
+ TagSpecifications: [
136
+ {
137
+ ResourceType: "route-table",
138
+ Tags: [
139
+ { Key: "Name", Value: `sandman-${name}` },
140
+ { Key: "CreatedBy", Value: "sandman" },
141
+ ],
142
+ },
143
+ ],
144
+ }));
145
+ resources.routeTableId = rtResponse.RouteTable?.RouteTableId || "";
146
+ // Create route to Internet Gateway
147
+ await ec2Client.send(new CreateRouteCommand({
148
+ RouteTableId: resources.routeTableId,
149
+ DestinationCidrBlock: "0.0.0.0/0",
150
+ GatewayId: resources.internetGatewayId,
151
+ }));
152
+ // Associate Route Table with Subnet
153
+ await ec2Client.send(new AssociateRouteTableCommand({
154
+ RouteTableId: resources.routeTableId,
155
+ SubnetId: resources.subnetId,
156
+ }));
157
+ // Create Security Group
158
+ const { CreateSecurityGroupCommand, AuthorizeSecurityGroupIngressCommand } = await import("@aws-sdk/client-ec2");
159
+ const sgResponse = await ec2Client.send(new CreateSecurityGroupCommand({
160
+ GroupName: `sandman-${name}-sg`,
161
+ Description: "Security group for Sandman environment",
162
+ VpcId: resources.vpcId,
163
+ TagSpecifications: [
164
+ {
165
+ ResourceType: "security-group",
166
+ Tags: [
167
+ { Key: "Name", Value: `sandman-${name}` },
168
+ { Key: "CreatedBy", Value: "sandman" },
169
+ ],
170
+ },
171
+ ],
172
+ }));
173
+ resources.securityGroupId = sgResponse.GroupId || "";
174
+ // Allow SSH and HTTP/HTTPS
175
+ await ec2Client.send(new AuthorizeSecurityGroupIngressCommand({
176
+ GroupId: resources.securityGroupId,
177
+ IpPermissions: [
178
+ {
179
+ IpProtocol: "tcp",
180
+ FromPort: 22,
181
+ ToPort: 22,
182
+ IpRanges: [{ CidrIp: "0.0.0.0/0", Description: "SSH" }],
183
+ },
184
+ {
185
+ IpProtocol: "tcp",
186
+ FromPort: 80,
187
+ ToPort: 80,
188
+ IpRanges: [{ CidrIp: "0.0.0.0/0", Description: "HTTP" }],
189
+ },
190
+ {
191
+ IpProtocol: "tcp",
192
+ FromPort: 443,
193
+ ToPort: 443,
194
+ IpRanges: [{ CidrIp: "0.0.0.0/0", Description: "HTTPS" }],
195
+ },
196
+ ],
197
+ }));
198
+ return resources;
199
+ }
200
+ async createIamResources(name) {
201
+ const { IAMClient } = await import("@aws-sdk/client-iam");
202
+ const iamClient = new IAMClient({ region: this.region });
203
+ const resources = {};
204
+ // Create IAM Role
205
+ const { CreateRoleCommand, AttachRolePolicyCommand, CreateInstanceProfileCommand, AddRoleToInstanceProfileCommand, } = await import("@aws-sdk/client-iam");
206
+ const roleName = `sandman-${name}-role`;
207
+ const trustPolicy = {
208
+ Version: "2012-10-17",
209
+ Statement: [
210
+ {
211
+ Effect: "Allow",
212
+ Principal: {
213
+ Service: "ec2.amazonaws.com",
214
+ },
215
+ Action: "sts:AssumeRole",
216
+ },
217
+ ],
218
+ };
219
+ const roleResponse = await iamClient.send(new CreateRoleCommand({
220
+ RoleName: roleName,
221
+ AssumeRolePolicyDocument: JSON.stringify(trustPolicy),
222
+ Tags: [
223
+ { Key: "Name", Value: `sandman-${name}` },
224
+ { Key: "CreatedBy", Value: "sandman" },
225
+ ],
226
+ }));
227
+ resources.iamRoleArn = roleResponse.Role?.Arn || "";
228
+ // Attach AmazonSSMManagedInstanceCore policy
229
+ await iamClient.send(new AttachRolePolicyCommand({
230
+ RoleName: roleName,
231
+ PolicyArn: "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore",
232
+ }));
233
+ // Create Instance Profile
234
+ const instanceProfileName = `sandman-${name}-profile`;
235
+ const profileResponse = await iamClient.send(new CreateInstanceProfileCommand({
236
+ InstanceProfileName: instanceProfileName,
237
+ }));
238
+ resources.iamInstanceProfile =
239
+ profileResponse.InstanceProfile?.InstanceProfileName || "";
240
+ // Add role to instance profile
241
+ await iamClient.send(new AddRoleToInstanceProfileCommand({
242
+ InstanceProfileName: instanceProfileName,
243
+ RoleName: roleName,
244
+ }));
245
+ return resources;
246
+ }
247
+ async createEc2Instance(name, subnetId, securityGroupId, iamInstanceProfile) {
248
+ const { EC2Client, RunInstancesCommand } = await import("@aws-sdk/client-ec2");
249
+ const ec2Client = new EC2Client({ region: this.region });
250
+ const instanceResponse = await ec2Client.send(new RunInstancesCommand({
251
+ ImageId: "ami-0c7217cdde317cfec", // Amazon Linux 2023
252
+ InstanceType: "t2.micro",
253
+ MinCount: 1,
254
+ MaxCount: 1,
255
+ SubnetId: subnetId,
256
+ SecurityGroupIds: [securityGroupId],
257
+ IamInstanceProfile: iamInstanceProfile
258
+ ? { Name: iamInstanceProfile }
259
+ : undefined,
260
+ TagSpecifications: [
261
+ {
262
+ ResourceType: "instance",
263
+ Tags: [
264
+ { Key: "Name", Value: `sandman-${name}` },
265
+ { Key: "CreatedBy", Value: "sandman" },
266
+ ],
267
+ },
268
+ ],
269
+ }));
270
+ return instanceResponse.Instances?.[0]?.InstanceId || "";
271
+ }
49
272
  async enableServices(env, services) {
50
273
  console.log(`Enabling AWS services: ${services.join(", ")}`);
51
274
  }
@@ -62,18 +285,43 @@ export class AwsAdapter {
62
285
  if (env.resources.bucketName) {
63
286
  result.AWS_S3_BUCKET = env.resources.bucketName;
64
287
  }
288
+ if (env.resources.vpcId) {
289
+ result.AWS_VPC_ID = env.resources.vpcId;
290
+ }
291
+ if (env.resources.instanceId) {
292
+ result.AWS_INSTANCE_ID = env.resources.instanceId;
293
+ }
294
+ if (env.resources.iamRoleArn) {
295
+ result.AWS_IAM_ROLE_ARN = env.resources.iamRoleArn;
296
+ }
65
297
  return result;
66
298
  }
67
299
  async destroyEnvironment(env) {
300
+ const { EC2Client } = await import("@aws-sdk/client-ec2");
301
+ const ec2Client = new EC2Client({ region: env.region });
302
+ // Terminate EC2 instance
303
+ if (env.resources.instanceId) {
304
+ try {
305
+ const { TerminateInstancesCommand } = await import("@aws-sdk/client-ec2");
306
+ await ec2Client.send(new TerminateInstancesCommand({
307
+ InstanceIds: [env.resources.instanceId],
308
+ }));
309
+ console.log(`Terminated EC2 instance: ${env.resources.instanceId}`);
310
+ }
311
+ catch (error) {
312
+ console.warn("Could not terminate instance:", error.message);
313
+ }
314
+ }
315
+ // Delete S3 bucket
68
316
  if (env.resources.bucketName) {
69
317
  try {
70
318
  const { S3Client, DeleteBucketCommand, ListObjectsV2Command, DeleteObjectsCommand, } = await import("@aws-sdk/client-s3");
71
- const client = new S3Client({ region: env.region });
72
- const listResponse = await client.send(new ListObjectsV2Command({
319
+ const s3Client = new S3Client({ region: env.region });
320
+ const listResponse = await s3Client.send(new ListObjectsV2Command({
73
321
  Bucket: env.resources.bucketName,
74
322
  }));
75
323
  if (listResponse.Contents?.length) {
76
- await client.send(new DeleteObjectsCommand({
324
+ await s3Client.send(new DeleteObjectsCommand({
77
325
  Bucket: env.resources.bucketName,
78
326
  Delete: {
79
327
  Objects: listResponse.Contents.map((obj) => ({
@@ -82,9 +330,10 @@ export class AwsAdapter {
82
330
  },
83
331
  }));
84
332
  }
85
- await client.send(new DeleteBucketCommand({
333
+ await s3Client.send(new DeleteBucketCommand({
86
334
  Bucket: env.resources.bucketName,
87
335
  }));
336
+ console.log(`Deleted S3 bucket: ${env.resources.bucketName}`);
88
337
  }
89
338
  catch (error) {
90
339
  if (error.name !== "NoSuchBucket") {
@@ -92,6 +341,79 @@ export class AwsAdapter {
92
341
  }
93
342
  }
94
343
  }
344
+ // Delete IAM resources
345
+ if (env.resources.iamInstanceProfile) {
346
+ try {
347
+ const { IAMClient, RemoveRoleFromInstanceProfileCommand, DeleteInstanceProfileCommand, DetachRolePolicyCommand, DeleteRoleCommand, } = await import("@aws-sdk/client-iam");
348
+ const iamClient = new IAMClient({ region: env.region });
349
+ const roleName = `sandman-${env.name}-role`;
350
+ const instanceProfileName = env.resources.iamInstanceProfile;
351
+ // Remove role from instance profile
352
+ await iamClient.send(new RemoveRoleFromInstanceProfileCommand({
353
+ InstanceProfileName: instanceProfileName,
354
+ RoleName: roleName,
355
+ }));
356
+ // Delete instance profile
357
+ await iamClient.send(new DeleteInstanceProfileCommand({
358
+ InstanceProfileName: instanceProfileName,
359
+ }));
360
+ // Detach policy from role
361
+ await iamClient.send(new DetachRolePolicyCommand({
362
+ RoleName: roleName,
363
+ PolicyArn: "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore",
364
+ }));
365
+ // Delete role
366
+ await iamClient.send(new DeleteRoleCommand({
367
+ RoleName: roleName,
368
+ }));
369
+ console.log(`Deleted IAM role and instance profile for: ${env.name}`);
370
+ }
371
+ catch (error) {
372
+ console.warn("Could not delete IAM resources:", error.message);
373
+ }
374
+ }
375
+ // Delete VPC resources
376
+ if (env.resources.vpcId) {
377
+ try {
378
+ const { DeleteSecurityGroupCommand, DeleteRouteTableCommand, DeleteSubnetCommand, DetachInternetGatewayCommand, DeleteInternetGatewayCommand, DeleteVpcCommand, } = await import("@aws-sdk/client-ec2");
379
+ // Delete security group
380
+ if (env.resources.securityGroupId) {
381
+ await ec2Client.send(new DeleteSecurityGroupCommand({
382
+ GroupId: env.resources.securityGroupId,
383
+ }));
384
+ }
385
+ // Delete route table
386
+ if (env.resources.routeTableId) {
387
+ await ec2Client.send(new DeleteRouteTableCommand({
388
+ RouteTableId: env.resources.routeTableId,
389
+ }));
390
+ }
391
+ // Delete subnet
392
+ if (env.resources.subnetId) {
393
+ await ec2Client.send(new DeleteSubnetCommand({
394
+ SubnetId: env.resources.subnetId,
395
+ }));
396
+ }
397
+ // Detach and delete internet gateway
398
+ if (env.resources.internetGatewayId) {
399
+ await ec2Client.send(new DetachInternetGatewayCommand({
400
+ InternetGatewayId: env.resources.internetGatewayId,
401
+ VpcId: env.resources.vpcId,
402
+ }));
403
+ await ec2Client.send(new DeleteInternetGatewayCommand({
404
+ InternetGatewayId: env.resources.internetGatewayId,
405
+ }));
406
+ }
407
+ // Delete VPC
408
+ await ec2Client.send(new DeleteVpcCommand({
409
+ VpcId: env.resources.vpcId,
410
+ }));
411
+ console.log(`Deleted VPC and associated resources for: ${env.name}`);
412
+ }
413
+ catch (error) {
414
+ console.warn("Could not delete VPC resources:", error.message);
415
+ }
416
+ }
95
417
  }
96
418
  async getStatus(env) {
97
419
  return env;
@@ -1 +1 @@
1
- {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/aws/adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/providers/aws/adapter.ts"],"names":[],"mappings":"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"}