@mavogel/cdk-vscode-server 0.0.64 โ†’ 0.0.65

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/CLAUDE.md CHANGED
@@ -173,6 +173,10 @@ aws ssm get-parameters --names \
173
173
  - `idleCheckIntervalMinutes` - How often to check (default: 5)
174
174
  - `skipStatusChecks` - Skip EC2 status checks before stopping (for testing only)
175
175
 
176
+ **Custom Installation**:
177
+ - `customInstallSteps` - Array of custom shell commands that run after standard installation
178
+ - `repoUrl` - Git repository to clone into home folder during setup
179
+
176
180
  **Extensions**:
177
181
  - `additionalInstanceRolePolicies`, `additionalTags`
178
182
 
@@ -182,6 +186,7 @@ aws ssm get-parameters --names \
182
186
  - All public APIs must be JSII-compatible (no TS-specific types)
183
187
  - Bundled dependencies (like `node-html-parser`) must be in `.projenrc.ts` `bundledDeps`
184
188
  - Lambda functions use esbuild bundling configured via Projen (auto-discovered in `src/**/*.lambda.ts`)
189
+ - **@example JSDoc blocks must NOT use code fences** (```) - JSII will fail with "must be code only, no code block fences allowed"
185
190
 
186
191
  ## CDK-nag Integration
187
192
 
@@ -239,11 +244,50 @@ Projen automatically discovers Lambda functions matching `src/**/*.lambda.ts` pa
239
244
  3. Run `npx projen` - auto-discovers and creates bundle task
240
245
  4. Import in construct: `import { MyFeatureFunction } from './my-feature/my-feature-function'`
241
246
 
247
+ ### Adding Custom Installation Steps
248
+
249
+ Custom steps are appended to SSM document `mainSteps` array in `createSSMDocument()`:
250
+
251
+ 1. **Define interface** (if needed) in `src/vscode-server.ts`:
252
+ ```typescript
253
+ export interface CustomInstallStep {
254
+ readonly name: string;
255
+ readonly commands: string[];
256
+ }
257
+ ```
258
+
259
+ 2. **Add prop** to `VSCodeServerProps` with JSDoc documentation (no code fences!)
260
+
261
+ 3. **Pass to Installer** in both Ubuntu and Amazon Linux paths:
262
+ ```typescript
263
+ installer = Installer.ubuntu({
264
+ // ... other options
265
+ customInstallSteps: customInstallSteps,
266
+ })._bind(this);
267
+ ```
268
+
269
+ 4. **Update `createSSMDocument()`** in `src/installer/installer.ts` to accept and use custom steps:
270
+ ```typescript
271
+ ...(customInstallSteps?.map((step) => ({
272
+ action: 'aws:runShellScript' as const,
273
+ name: step.name,
274
+ inputs: {
275
+ runCommand: step.commands,
276
+ },
277
+ })) ?? []),
278
+ ```
279
+
280
+ 5. **Write unit tests** in `test/vscode-server.test.ts` covering normal usage, without steps, and empty array
281
+
282
+ 6. **Update documentation** in README.md with practical examples and add to `examples/` directory
283
+
242
284
  ### Modifying VSCodeServer Props
243
285
 
244
286
  1. Edit `src/vscode-server.ts` - update `VSCodeServerProps` interface
245
- 2. Run `npx projen build` - regenerates JSII artifacts + API docs
246
- 3. Update README.md with usage examples
287
+ 2. If adding new types/interfaces, export them from `src/vscode-server.ts`
288
+ 3. Run `npx projen build` - regenerates JSII artifacts + API docs
289
+ 4. Update README.md with usage examples and feature section
290
+ 5. Add example usage in `examples/` directory
247
291
 
248
292
  ### Testing Changes
249
293
 
package/README.md CHANGED
@@ -24,6 +24,7 @@ we implement new features. Therefore make sure you use an exact version in your
24
24
  - [Pre-populate with Git Repository](#pre-populate-with-git-repository)
25
25
  - [Custom Domain Configuration](#custom-domain-configuration)
26
26
  - [Auto-Stop Configuration](#auto-stop-configuration)
27
+ - [Custom Installation Steps](#custom-installation-steps)
27
28
  - [Solution Design](#solution-design)
28
29
  - [Inspiration](#inspiration)
29
30
 
@@ -34,6 +35,7 @@ we implement new features. Therefore make sure you use an exact version in your
34
35
  - ๐Ÿคนโ€โ™‚๏ธ **Pre-installed packages**: Besides the [vscode](https://code.visualstudio.com/) server, other tools and software packages such as `git`, `docker`, `awscli` `nodejs` and `python` are pre-installed on the EC2 instance.
35
36
  - ๐ŸŒ **Custom Domain Support**: Use your own domain name with automatic ACM certificate creation and Route53 DNS configuration, or bring your existing certificate.
36
37
  - ๐Ÿ’ฐ **Auto-Stop**: Automatically stop EC2 instances after inactivity with Elastic IP retention - save up to 75% on costs for development environments.
38
+ - ๐Ÿ”ง **Custom Install Steps**: Extend the standard installation with your own shell commands to install workshop-specific tools, configure environments, or run setup scripts.
37
39
  - ๐Ÿ—๏ธ **Extensibility**: Pass in properties to the construct, which start with `additional*`. They allow you to extend the configuration to your needs. There are more to come...
38
40
 
39
41
  ## Usage
@@ -261,6 +263,67 @@ Run integration tests with:
261
263
  npm run integ-test
262
264
  ```
263
265
 
266
+ ### Custom Installation Steps
267
+
268
+ Extend the standard VS Code Server installation with your own custom shell commands - perfect for installing workshop-specific tools, configuring development environments, or running setup scripts:
269
+
270
+ ```ts
271
+ new VSCodeServer(this, 'vscode', {
272
+ // Add custom installation steps that run after standard setup
273
+ customInstallSteps: [
274
+ {
275
+ name: 'InstallWorkshopTools',
276
+ commands: [
277
+ '#!/bin/bash',
278
+ 'echo "Installing workshop-specific tools"',
279
+
280
+ // Install additional software
281
+ 'curl -fsSL https://get.docker.com | sh',
282
+ 'usermod -aG docker ubuntu',
283
+
284
+ // Configure environment
285
+ 'echo "export WORKSHOP_ENV=production" >> /home/ubuntu/.bashrc',
286
+ ],
287
+ },
288
+ {
289
+ name: 'CloneStarterCode',
290
+ commands: [
291
+ '#!/bin/bash',
292
+ 'cd /home/ubuntu',
293
+ 'git clone https://github.com/my-org/workshop-starter.git',
294
+ 'chown -R ubuntu:ubuntu workshop-starter',
295
+ ],
296
+ },
297
+ ],
298
+ });
299
+ ```
300
+
301
+ **Key Features:**
302
+ - **Execute After Standard Setup**: Custom steps run after VS Code Server installation completes
303
+ - **Multiple Steps**: Add as many installation steps as needed, executed in order
304
+ - **Full Shell Access**: Run any shell commands with root privileges
305
+ - **Workshop-Friendly**: Pre-install tools, configure environments, or download starter code
306
+
307
+ **Common Use Cases:**
308
+ - Install additional development tools (Docker, kubectl, terraform)
309
+ - Configure workshop-specific environments and credentials
310
+ - Clone starter code repositories with specific permissions
311
+ - Set up databases or services required for training
312
+ - Download and prepare datasets or assets
313
+ - Configure IDE extensions or settings
314
+
315
+ **Supported Operating Systems:**
316
+ - Ubuntu 22/24/25
317
+ - Amazon Linux 2023
318
+
319
+ **Requirements:**
320
+ - Commands execute with root privileges during instance initialization
321
+ - Use absolute paths or ensure proper working directory context
322
+ - Consider idempotency if instance might be restarted
323
+ - Commands run synchronously in the order specified
324
+
325
+ For complete examples, see [examples/custom-install-steps/main.ts](./examples/custom-install-steps/main.ts).
326
+
264
327
  ## Solution Design
265
328
 
266
329
  <details>
@@ -17,7 +17,7 @@ export class MyStack extends Stack {
17
17
  instanceVolumeSize: 8,
18
18
  instanceClass: ec2.InstanceClass.M7G,
19
19
  instanceSize: ec2.InstanceSize.LARGE,
20
- instanceOperatingSystem: LinuxFlavorType.UBUNTU_24,
20
+ instanceOperatingSystem: LinuxFlavorType.UBUNTU_24, // Supports UBUNTU_22, UBUNTU_24, UBUNTU_25, AMAZON_LINUX_2023
21
21
  instanceCpuArchitecture: LinuxArchitectureType.ARM,
22
22
 
23
23
  // ๐Ÿ‘‡๐Ÿฝ or if you want to give the InstanceRole more permissions
@@ -31,7 +31,29 @@ export class MyStack extends Stack {
31
31
  `arn:aws:codebuild:*:${Stack.of(this).account}:*/*`,
32
32
  ],
33
33
  }),
34
- ]
34
+ ],
35
+
36
+ // ๐Ÿ‘‡๐Ÿฝ Add custom installation steps to extend the standard setup
37
+ customInstallSteps: [
38
+ {
39
+ name: 'InstallCodeBuildTools',
40
+ commands: [
41
+ '#!/bin/bash',
42
+ 'echo "Installing CodeBuild-related tools..."',
43
+ // Install AWS CodeBuild local agent for testing
44
+ 'docker pull public.ecr.aws/codebuild/local-builds:latest',
45
+ // Create helper script
46
+ 'cat > /usr/local/bin/codebuild-local << EOF',
47
+ '#!/bin/bash',
48
+ 'docker run -it --rm -v /var/run/docker.sock:/var/run/docker.sock \\',
49
+ ' -e "IMAGE_NAME=public.ecr.aws/codebuild/local-builds:latest" \\',
50
+ ' public.ecr.aws/codebuild/local-builds:latest',
51
+ 'EOF',
52
+ 'chmod +x /usr/local/bin/codebuild-local',
53
+ 'echo "CodeBuild tools installed successfully"',
54
+ ],
55
+ },
56
+ ],
35
57
 
36
58
  // and more... ๐Ÿ’ก
37
59
  });
@@ -0,0 +1,201 @@
1
+ import { App, Stack, StackProps } from 'aws-cdk-lib';
2
+ import * as ec2 from 'aws-cdk-lib/aws-ec2';
3
+ import { Construct } from 'constructs';
4
+ import {
5
+ CustomInstallStep,
6
+ LinuxArchitectureType,
7
+ LinuxFlavorType,
8
+ VSCodeServer,
9
+ } from '../../src/index';
10
+
11
+ /**
12
+ * Example: VS Code Server with Custom Installation Steps
13
+ *
14
+ * This example demonstrates how to extend the standard VS Code Server installation
15
+ * with custom shell commands. Perfect for:
16
+ * - Installing workshop-specific tools
17
+ * - Configuring development environments
18
+ * - Running setup scripts
19
+ * - Preparing datasets or assets
20
+ * - Setting up databases or services
21
+ *
22
+ * All custom steps execute with root privileges after the standard installation completes.
23
+ */
24
+ export class CustomInstallStepsExampleStack extends Stack {
25
+ constructor(scope: Construct, id: string, props: StackProps = {}) {
26
+ super(scope, id, props);
27
+
28
+ // Define custom installation steps
29
+ const customSteps: CustomInstallStep[] = [
30
+ // Step 1: Install additional development tools
31
+ {
32
+ name: 'InstallDevelopmentTools',
33
+ commands: [
34
+ '#!/bin/bash',
35
+ 'set -e', // Exit on error
36
+ 'echo "Installing development tools..."',
37
+
38
+ // Install Docker (if not already installed)
39
+ 'if ! command -v docker &> /dev/null; then',
40
+ ' curl -fsSL https://get.docker.com | sh',
41
+ ' usermod -aG docker ubuntu',
42
+ ' systemctl enable docker',
43
+ ' systemctl start docker',
44
+ 'fi',
45
+
46
+ // Install kubectl
47
+ 'curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/arm64/kubectl"',
48
+ 'install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl',
49
+ 'rm kubectl',
50
+
51
+ // Install terraform
52
+ 'wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg',
53
+ 'echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | tee /etc/apt/sources.list.d/hashicorp.list',
54
+ 'apt-get update && apt-get install -y terraform',
55
+
56
+ 'echo "Development tools installed successfully"',
57
+ ],
58
+ },
59
+
60
+ // Step 2: Configure workshop environment
61
+ {
62
+ name: 'ConfigureWorkshopEnvironment',
63
+ commands: [
64
+ '#!/bin/bash',
65
+ 'set -e',
66
+ 'echo "Configuring workshop environment..."',
67
+
68
+ // Set environment variables
69
+ 'cat >> /home/ubuntu/.bashrc << EOF',
70
+ '',
71
+ '# Workshop environment variables',
72
+ 'export WORKSHOP_NAME="AWS CDK Workshop"',
73
+ 'export WORKSHOP_VERSION="2.0"',
74
+ 'export AWS_REGION="${AWS::Region}"',
75
+ 'export AWS_ACCOUNT_ID="${AWS::AccountId}"',
76
+ '',
77
+ '# Custom aliases',
78
+ 'alias k="kubectl"',
79
+ 'alias tf="terraform"',
80
+ 'alias ll="ls -la"',
81
+ 'EOF',
82
+
83
+ // Create workshop directories
84
+ 'mkdir -p /home/ubuntu/workshop',
85
+ 'mkdir -p /home/ubuntu/workshop/code',
86
+ 'mkdir -p /home/ubuntu/workshop/data',
87
+
88
+ // Set proper ownership
89
+ 'chown -R ubuntu:ubuntu /home/ubuntu/workshop',
90
+ 'chown ubuntu:ubuntu /home/ubuntu/.bashrc',
91
+
92
+ 'echo "Workshop environment configured successfully"',
93
+ ],
94
+ },
95
+
96
+ // Step 3: Clone and prepare workshop starter code
97
+ {
98
+ name: 'PrepareWorkshopCode',
99
+ commands: [
100
+ '#!/bin/bash',
101
+ 'set -e',
102
+ 'echo "Preparing workshop starter code..."',
103
+
104
+ // Clone workshop repository
105
+ 'cd /home/ubuntu/workshop/code',
106
+ 'git clone https://github.com/aws-samples/aws-cdk-examples.git',
107
+
108
+ // Download sample datasets
109
+ 'cd /home/ubuntu/workshop/data',
110
+ 'curl -o sample-data.json https://raw.githubusercontent.com/aws-samples/aws-cdk-examples/main/package.json',
111
+
112
+ // Create a README for participants
113
+ 'cat > /home/ubuntu/workshop/README.md << EOF',
114
+ '# Welcome to the AWS CDK Workshop!',
115
+ '',
116
+ '## Getting Started',
117
+ '',
118
+ '1. Navigate to the code directory: `cd ~/workshop/code`',
119
+ '2. Explore the examples: `ls -la aws-cdk-examples`',
120
+ '3. Run your first CDK app',
121
+ '',
122
+ '## Resources',
123
+ '',
124
+ '- AWS CDK Documentation: https://docs.aws.amazon.com/cdk',
125
+ '- Workshop Guide: [TBD]',
126
+ '',
127
+ '## Installed Tools',
128
+ '',
129
+ '- Node.js $(node --version)',
130
+ '- Python $(python3 --version)',
131
+ '- Docker $(docker --version)',
132
+ '- kubectl $(kubectl version --client --short 2>/dev/null || echo "installed")',
133
+ '- Terraform $(terraform version | head -n1)',
134
+ 'EOF',
135
+
136
+ // Set ownership
137
+ 'chown -R ubuntu:ubuntu /home/ubuntu/workshop',
138
+
139
+ 'echo "Workshop code prepared successfully"',
140
+ ],
141
+ },
142
+
143
+ // Step 4: Install VS Code extensions
144
+ {
145
+ name: 'InstallVSCodeExtensions',
146
+ commands: [
147
+ '#!/bin/bash',
148
+ 'set -e',
149
+ 'echo "Installing VS Code extensions..."',
150
+
151
+ // Switch to ubuntu user to install extensions
152
+ 'sudo -u ubuntu bash << EOF',
153
+ 'export HOME=/home/ubuntu',
154
+
155
+ // Wait for code-server to be ready
156
+ 'sleep 5',
157
+
158
+ // Install useful extensions (examples - adjust based on your needs)
159
+ '# Note: Extension installation via CLI requires code-server to be running',
160
+ '# These would typically be installed through the VS Code UI after first login',
161
+
162
+ 'echo "VS Code extensions configured successfully"',
163
+ 'EOF',
164
+ ],
165
+ },
166
+ ];
167
+
168
+ // Create VS Code Server with custom installation steps
169
+ new VSCodeServer(this, 'vscode-custom-install', {
170
+ // Instance configuration
171
+ instanceClass: ec2.InstanceClass.M7G,
172
+ instanceSize: ec2.InstanceSize.XLARGE,
173
+ instanceVolumeSize: 50, // Larger volume for additional tools
174
+ instanceOperatingSystem: LinuxFlavorType.UBUNTU_24, // Supports UBUNTU_22, UBUNTU_24, UBUNTU_25, AMAZON_LINUX_2023
175
+ instanceCpuArchitecture: LinuxArchitectureType.ARM,
176
+
177
+ // VS Code configuration
178
+ homeFolder: '/workshop',
179
+ vscodeUser: 'ubuntu',
180
+
181
+ // ๐Ÿ”ง Custom installation steps
182
+ customInstallSteps: customSteps,
183
+
184
+ // Additional configuration
185
+ additionalTags: {
186
+ Workshop: 'AWS-CDK-Workshop',
187
+ Environment: 'Training',
188
+ CustomInstallSteps: 'Enabled',
189
+ },
190
+ });
191
+ }
192
+ }
193
+
194
+ const env = {
195
+ account: process.env.CDK_DEFAULT_ACCOUNT || '123456789012',
196
+ region: process.env.CDK_DEFAULT_REGION || 'eu-west-1',
197
+ };
198
+
199
+ const app = new App();
200
+ new CustomInstallStepsExampleStack(app, 'vscode-custom-install-example', { env });
201
+ app.synth();
@@ -83,5 +83,5 @@ class IdleMonitor extends constructs_1.Construct {
83
83
  }
84
84
  exports.IdleMonitor = IdleMonitor;
85
85
  _a = JSII_RTTI_SYMBOL_1;
86
- IdleMonitor[_a] = { fqn: "@mavogel/cdk-vscode-server.IdleMonitor", version: "0.0.64" };
86
+ IdleMonitor[_a] = { fqn: "@mavogel/cdk-vscode-server.IdleMonitor", version: "0.0.65" };
87
87
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRsZS1tb25pdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2lkbGUtbW9uaXRvci9pZGxlLW1vbml0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUFDN0IsNkNBQThDO0FBRzlDLHVEQUF3RDtBQUN4RCx1RUFBd0Y7QUFDeEYsaURBQXNEO0FBQ3RELHVEQUFtRjtBQUNuRixxQ0FBMEM7QUFDMUMsMkNBQXVDO0FBcUN2Qzs7R0FFRztBQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFTO0lBV3hDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDL0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUkscUJBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQ25ELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLCtDQUErQyxDQUFDLENBQUM7WUFDM0YsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUM3QixVQUFVLEVBQUUsR0FBRztZQUNmLFdBQVcsRUFBRTtnQkFDWCxXQUFXLEVBQUUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVO2dCQUN0QyxlQUFlLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxjQUFjO2dCQUNsRCxvQkFBb0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFO2dCQUN6RCxrQkFBa0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTzthQUM5RDtTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUMzQixJQUFJLHlCQUFlLENBQUM7WUFDbEIsT0FBTyxFQUFFO2dCQUNQLGdDQUFnQztnQkFDaEMsMEJBQTBCO2FBQzNCO1lBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQ2pCLENBQUMsQ0FDSCxDQUFDO1FBRUYsd0ZBQXdGO1FBQ3hGLGtDQUFrQztRQUNsQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FDM0IsSUFBSSx5QkFBZSxDQUFDO1lBQ2xCLE9BQU8sRUFBRTtnQkFDUCx1QkFBdUI7Z0JBQ3ZCLDRCQUE0QjthQUM3QjtZQUNELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNqQixDQUFDLENBQ0gsQ0FBQztRQUVGLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FDM0IsSUFBSSx5QkFBZSxDQUFDO1lBQ2xCLE9BQU8sRUFBRTtnQkFDUCxtQkFBbUI7YUFDcEI7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsZUFBZSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksbUJBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxhQUFhLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFO2FBQ3ZHO1NBQ0YsQ0FBQyxDQUNILENBQUM7UUFFRiwyREFBMkQ7UUFDM0QseUVBQXlFO1FBQ3pFLDZFQUE2RTtRQUM3RSxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsb0JBQW9CLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxpQkFBSSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDakQsUUFBUSxFQUFFLHFCQUFRLENBQUMsSUFBSSxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sRUFBRSxLQUFLLEVBQUUscURBQXFEO1NBQ3RFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksbUNBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFckUsdUJBQXVCO1FBQ3ZCLHlCQUFlLENBQUMsdUJBQXVCLENBQ3JDLElBQUksQ0FBQyxRQUFRLEVBQ2I7WUFDRTtnQkFDRSxFQUFFLEVBQUUsbUJBQW1CO2dCQUN2QixNQUFNLEVBQUUsMkRBQTJEO2FBQ3BFO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLG1CQUFtQjtnQkFDdkIsTUFBTSxFQUFFLGlEQUFpRDthQUMxRDtZQUNEO2dCQUNFLEVBQUUsRUFBRSxpQkFBaUI7Z0JBQ3JCLE1BQU0sRUFBRSwrQ0FBK0M7YUFDeEQ7U0FDRixFQUNELElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQzs7QUE1Rkgsa0NBNkZDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IER1cmF0aW9uLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IElEaXN0cmlidXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgeyBJSW5zdGFuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IFJ1bGUsIFNjaGVkdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiBhcyBMYW1iZGFGdW5jdGlvblRhcmdldCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgeyBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IFJ1bnRpbWUsIENvZGUsIEZ1bmN0aW9uIGFzIExhbWJkYUZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBOYWdTdXBwcmVzc2lvbnMgfSBmcm9tICdjZGstbmFnJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBJZGxlTW9uaXRvciBjb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGxlTW9uaXRvclByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBFQzIgaW5zdGFuY2UgdG8gbW9uaXRvclxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFuY2U6IElJbnN0YW5jZTtcbiAgLyoqXG4gICAqIFRoZSBDbG91ZEZyb250IGRpc3RyaWJ1dGlvbiB0byBtb25pdG9yIGZvciBhY3Rpdml0eVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uOiBJRGlzdHJpYnV0aW9uO1xuICAvKipcbiAgICogTnVtYmVyIG9mIG1pbnV0ZXMgb2YgaW5hY3Rpdml0eSBiZWZvcmUgc3RvcHBpbmcgdGhlIGluc3RhbmNlXG4gICAqL1xuICByZWFkb25seSBpZGxlVGltZW91dE1pbnV0ZXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEhvdyBvZnRlbiB0byBjaGVjayBmb3IgaWRsZSBhY3Rpdml0eSAoaW4gbWludXRlcylcbiAgICogQGRlZmF1bHQgNSAtIENoZWNrIGV2ZXJ5IDUgbWludXRlc1xuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tJbnRlcnZhbE1pbnV0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBTa2lwIGluc3RhbmNlIHN0YXR1cyBjaGVja3MgYmVmb3JlIHN0b3BwaW5nXG4gICAqIFdoZW4gdHJ1ZSwgSWRsZU1vbml0b3Igd2lsbCBzdG9wIGlkbGUgaW5zdGFuY2VzIGV2ZW4gaWYgc3RhdHVzIGNoZWNrcyBoYXZlbid0IHBhc3NlZFxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW50ZWdyYXRpb24gdGVzdHMgd2hlcmUgc3RhdHVzIGNoZWNrIGluaXRpYWxpemF0aW9uIHRpbWVcbiAgICogZXhjZWVkcyB0ZXN0IHRpbWVvdXQgbGltaXRzXG4gICAqXG4gICAqIFdBUk5JTkc6IEZvciB0ZXN0aW5nIG9ubHkgLSBpbiBwcm9kdWN0aW9uLCB5b3Ugc2hvdWxkIHdhaXQgZm9yIHN0YXR1cyBjaGVja3NcbiAgICogdG8gcGFzcyBiZWZvcmUgc3RvcHBpbmcgaW5zdGFuY2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwU3RhdHVzQ2hlY2tzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgdGhhdCBtb25pdG9ycyBDbG91ZEZyb250IHJlcXVlc3QgbWV0cmljcyBhbmQgc3RvcHMgdGhlIEVDMiBpbnN0YW5jZSB3aGVuIGlkbGVcbiAqL1xuZXhwb3J0IGNsYXNzIElkbGVNb25pdG9yIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFRoZSBMYW1iZGEgZnVuY3Rpb24gdGhhdCBwZXJmb3JtcyBpZGxlIG1vbml0b3JpbmdcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmdW5jdGlvbjogTGFtYmRhRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSBFdmVudEJyaWRnZSBydWxlIHRoYXQgdHJpZ2dlcnMgaWRsZSBtb25pdG9yaW5nIGNoZWNrc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNjaGVkdWxlUnVsZTogUnVsZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogSWRsZU1vbml0b3JQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uID0gbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMsICdGdW5jdGlvbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vYXNzZXRzL2lkbGUtbW9uaXRvci9pZGxlLW1vbml0b3IubGFtYmRhJykpLFxuICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICBtZW1vcnlTaXplOiAyNTYsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBJTlNUQU5DRV9JRDogcHJvcHMuaW5zdGFuY2UuaW5zdGFuY2VJZCxcbiAgICAgICAgRElTVFJJQlVUSU9OX0lEOiBwcm9wcy5kaXN0cmlidXRpb24uZGlzdHJpYnV0aW9uSWQsXG4gICAgICAgIElETEVfVElNRU9VVF9NSU5VVEVTOiBwcm9wcy5pZGxlVGltZW91dE1pbnV0ZXMudG9TdHJpbmcoKSxcbiAgICAgICAgU0tJUF9TVEFUVVNfQ0hFQ0tTOiBwcm9wcy5za2lwU3RhdHVzQ2hlY2tzID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2Nsb3Vkd2F0Y2g6R2V0TWV0cmljU3RhdGlzdGljcycsXG4gICAgICAgICAgJ2Nsb3Vkd2F0Y2g6R2V0TWV0cmljRGF0YScsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gRGVzY3JpYmVJbnN0YW5jZXMgYW5kIERlc2NyaWJlSW5zdGFuY2VTdGF0dXMgZG9uJ3Qgc3VwcG9ydCByZXNvdXJjZS1sZXZlbCBwZXJtaXNzaW9uc1xuICAgIC8vIFRoZXkgcmVxdWlyZSB3aWxkY2FyZCByZXNvdXJjZXNcbiAgICB0aGlzLmZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlcycsXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlU3RhdHVzJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTdG9wSW5zdGFuY2VzIHN1cHBvcnRzIHJlc291cmNlLWxldmVsIHBlcm1pc3Npb25zLCBzbyB3ZSBjYW4gcmVzdHJpY3QgaXRcbiAgICB0aGlzLmZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2VjMjpTdG9wSW5zdGFuY2VzJyxcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgYGFybjphd3M6ZWMyOiR7U3RhY2sub2YodGhpcykucmVnaW9ufToke1N0YWNrLm9mKHRoaXMpLmFjY291bnR9Omluc3RhbmNlLyR7cHJvcHMuaW5zdGFuY2UuaW5zdGFuY2VJZH1gLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBFdmVudEJyaWRnZSBydWxlIHRvIHRyaWdnZXIgYXQgc3BlY2lmaWVkIGludGVydmFsXG4gICAgLy8gTk9URTogUnVsZSBpcyBjcmVhdGVkIGluIERJU0FCTEVEIHN0YXRlIGFuZCBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZFxuICAgIC8vIGFmdGVyIGluc3RhbGxhdGlvbiBjb21wbGV0ZXMgdG8gcHJldmVudCBzdG9wcGluZyB0aGUgaW5zdGFuY2UgZHVyaW5nIHNldHVwXG4gICAgY29uc3QgY2hlY2tJbnRlcnZhbCA9IHByb3BzLmNoZWNrSW50ZXJ2YWxNaW51dGVzID8/IDU7XG4gICAgdGhpcy5zY2hlZHVsZVJ1bGUgPSBuZXcgUnVsZSh0aGlzLCAnU2NoZWR1bGVSdWxlJywge1xuICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcyhjaGVja0ludGVydmFsKSksXG4gICAgICBlbmFibGVkOiBmYWxzZSwgLy8gU3RhcnQgZGlzYWJsZWQsIHdpbGwgYmUgZW5hYmxlZCBhZnRlciBpbnN0YWxsYXRpb25cbiAgICB9KTtcblxuICAgIHRoaXMuc2NoZWR1bGVSdWxlLmFkZFRhcmdldChuZXcgTGFtYmRhRnVuY3Rpb25UYXJnZXQodGhpcy5mdW5jdGlvbikpO1xuXG4gICAgLy8gQ0RLLW5hZyBzdXBwcmVzc2lvbnNcbiAgICBOYWdTdXBwcmVzc2lvbnMuYWRkUmVzb3VyY2VTdXBwcmVzc2lvbnMoXG4gICAgICB0aGlzLmZ1bmN0aW9uLFxuICAgICAgW1xuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNCcsXG4gICAgICAgICAgcmVhc29uOiAnTWFuYWdlZCBwb2xpY2llcyBhY2NlcHRhYmxlIGZvciB3b3Jrc2hvcCBMYW1iZGEgZnVuY3Rpb25zJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTUnLFxuICAgICAgICAgIHJlYXNvbjogJ0Nsb3VkV2F0Y2ggbWV0cmljcyByZXF1aXJlIHdpbGRjYXJkIHBlcm1pc3Npb25zJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUwxJyxcbiAgICAgICAgICByZWFzb246ICdMYXRlc3QgcnVudGltZSBub3QgcmVxdWlyZWQgZm9yIHRoaXMgZnVuY3Rpb24nLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -1,5 +1,5 @@
1
1
  import { Construct } from 'constructs';
2
- import { LinuxFlavorType } from '../vscode-server';
2
+ import { LinuxFlavorType, CustomInstallStep } from '../vscode-server';
3
3
  interface InstallerOptionsBase {
4
4
  /**
5
5
  * The ec2 instance id to install the ssm document on
@@ -92,6 +92,12 @@ interface InstallerOptionsBase {
92
92
  * @default - no folders created
93
93
  */
94
94
  readonly folderZipS3Path?: string;
95
+ /**
96
+ * Custom installation steps to extend the SSM document
97
+ *
98
+ * @default - no custom installation steps
99
+ */
100
+ readonly customInstallSteps?: CustomInstallStep[];
95
101
  }
96
102
  export interface InstallerOptions extends InstallerOptionsBase {
97
103
  }