@mavogel/cdk-vscode-server 0.0.62 → 0.0.64
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/.jsii +124 -178
- package/API.md +105 -200
- package/CLAUDE.md +288 -58
- package/README.md +40 -2
- package/assets/idle-monitor-enabler/idle-monitor-enabler.lambda/index.js +67 -0
- package/assets/installer/installer.lambda/index.js +67 -30
- package/awslint.json +5 -0
- package/examples/auto-stop/main.ts +1 -1
- package/examples/custom/main.ts +1 -1
- package/examples/git-repo/main.ts +30 -0
- package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.assets.json +2 -2
- package/integ-tests/integ.al2023.ts.snapshot/IntegSetupVSCodeOnAl2023DefaultTestDeployAssert74D8F645.template.json +1 -1
- package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.assets.json +8 -8
- package/integ-tests/integ.al2023.ts.snapshot/IntegTestStackAl2023.template.json +257 -94
- package/integ-tests/{integ.stop-on-idle.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.al2023.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.ubuntu.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.al2023.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.al2023.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.al2023.ts.snapshot/manifest.json +19 -3
- package/integ-tests/integ.al2023.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.assets.json +2 -2
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegSetupVSCodeOnCustomDomainDefaultTestDeployAssert6982D514.template.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.assets.json +8 -8
- package/integ-tests/integ.custom-domain.ts.snapshot/IntegTestStackCustomDomain.template.json +273 -97
- package/integ-tests/{integ.ubuntu.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.custom-domain.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.al2023.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.custom-domain.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.custom-domain.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/manifest.json +25 -6
- package/integ-tests/integ.custom-domain.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.stop-on-idle.ts +1 -4
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.assets.json +2 -2
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegStopOnIdleFunctionalityDefaultTestDeployAssertEECF3FC0.template.json +4 -4
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.assets.json +23 -9
- package/integ-tests/integ.stop-on-idle.ts.snapshot/IntegTestStackStopOnIdle.template.json +758 -197
- package/integ-tests/integ.stop-on-idle.ts.snapshot/asset.22c8a6c357b704e370bef317ae1b52c59f684aa7640422a3d1dfe813d1f77853.lambda/index.js +67 -0
- package/integ-tests/{integ.custom-domain.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.stop-on-idle.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/integ.stop-on-idle.ts.snapshot/manifest.json +363 -76
- package/integ-tests/integ.stop-on-idle.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +2 -2
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.assets.json +8 -8
- package/integ-tests/integ.ubuntu.ts.snapshot/IntegTestStackUbuntu22.template.json +273 -97
- package/integ-tests/{integ.al2023.ts.snapshot/asset.33da23274e25bd9f43638c5d83dad26e3931cbe78d462ffd9a9f565e948b4f5f.lambda → integ.ubuntu.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda}/index.js +67 -30
- package/integ-tests/{integ.custom-domain.ts.snapshot/asset.0ad50fc42afd768c3d0bfdd4701e43284fb077a25f19eea1e8c51a5ca36ebfe4 → integ.ubuntu.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9}/index.js +50 -25
- package/integ-tests/integ.ubuntu.ts.snapshot/integ.json +1 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/manifest.json +25 -6
- package/integ-tests/integ.ubuntu.ts.snapshot/tree.json +1 -1
- package/integ-tests/integ.ubuntu24.ts +69 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.assets.json +33 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegSetupVSCodeOnUbuntuDefaultTestDeployAssertFF8DF2C5.template.json +337 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.assets.json +118 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/IntegTestStackUbuntu24.template.json +2725 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/integ.json +23 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/manifest.json +1473 -0
- package/integ-tests/integ.ubuntu24.ts.snapshot/tree.json +1 -0
- package/integ-tests/integ.ubuntu25.ts +69 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/IntegSetupVSCodeOnUbuntu25DefaultTestDeployAssert48DBCF35.assets.json +33 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/IntegSetupVSCodeOnUbuntu25DefaultTestDeployAssert48DBCF35.template.json +337 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/IntegTestStackUbuntu25.assets.json +118 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/IntegTestStackUbuntu25.template.json +2725 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.2819175352ad1ce0dae768e83fc328fb70fb5f10b4a8ff0ccbcb791f02b0716d/index.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.2f99f38311da357eaaea1284d67c759759324dec4a1cd11621d9c59eea9e81df.lambda/index.js +180 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.530055f7515b3f0a47900f5df37e729ba40ca977b2d07b952bdefa2b8f883f42.bundle/index.js +30676 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.781ab0ab74634cdaf61539ab208ab777829ef07097ac21f95b9e15a3b1eedc1b.lambda/index.js +57 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/__entrypoint__.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.7fa1e366ee8a9ded01fc355f704cff92bfd179574e6f9cfee800a3541df1b200/index.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.9d043014be736e8162bcc7ec5590cc6d2ff24fd0d9c73a5c5d595151c5fdad00/index.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/cfn-response.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/consts.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/framework.js +3 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/outbound.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.bdc104ed9cab1b5b6421713c8155f0b753380595356f710400609664d3635eca/util.js +1 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/asset.efac30c7091c58fed492058fa6403c14f7e58aab8cf4fd595d838b8d5eeec2b9/index.js +6017 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/integ.json +23 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/manifest.json +1473 -0
- package/integ-tests/integ.ubuntu25.ts.snapshot/tree.json +1 -0
- package/lib/idle-monitor/idle-monitor-function.js +2 -2
- package/lib/idle-monitor/idle-monitor.js +5 -2
- package/lib/idle-monitor-enabler/idle-monitor-enabler-function.d.ts +13 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler-function.js +22 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.d.ts +25 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.js +76 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.d.ts +9 -0
- package/lib/idle-monitor-enabler/idle-monitor-enabler.lambda.js +48 -0
- package/lib/index.d.ts +0 -1
- package/lib/index.js +1 -2
- package/lib/installer/installer-function.js +2 -2
- package/lib/installer/installer.d.ts +105 -0
- package/lib/installer/installer.js +659 -301
- package/lib/installer/installer.lambda.js +64 -30
- package/lib/mappings.js +11 -3
- package/lib/secret-retriever/secret-retriever-function.js +2 -2
- package/lib/vscode-server.d.ts +45 -1
- package/lib/vscode-server.js +35 -5
- package/package.json +12 -12
- package/.claude/hooks/file_checker.sh +0 -178
- package/.qlty/.gitignore +0 -7
- package/.qlty/configs/.yamllint.yaml +0 -21
- package/.qlty/qlty.toml +0 -115
- package/assets/status-check/status-check.lambda/index.js +0 -123
- package/integ-tests/integ.al2023.ts.snapshot/cdk.out +0 -1
- package/integ-tests/integ.al2023.ts.snapshot/read.13497.1.lock +0 -1
- package/integ-tests/integ.custom-domain.ts.snapshot/read.13497.1.lock +0 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/cdk.out +0 -1
- package/integ-tests/integ.ubuntu.ts.snapshot/read.13497.1.lock +0 -1
- package/lib/status-check/status-check-function.d.ts +0 -13
- package/lib/status-check/status-check-function.js +0 -22
- package/lib/status-check/status-check.d.ts +0 -36
- package/lib/status-check/status-check.js +0 -109
- package/lib/status-check/status-check.lambda.d.ts +0 -2
- package/lib/status-check/status-check.lambda.js +0 -104
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# for now
|
|
4
|
-
exit 0;
|
|
5
|
-
|
|
6
|
-
# NOTE: initially from https://www.npmjs.com/package/daddy-claude?activeTab=code
|
|
7
|
-
# Colors
|
|
8
|
-
RED='\033[0;31m'
|
|
9
|
-
GREEN='\033[0;32m'
|
|
10
|
-
NC='\033[0m'
|
|
11
|
-
|
|
12
|
-
# Find the most recently modified source file (exclude cache files and generated files)
|
|
13
|
-
files=$(find . -type f -mmin -1 \( -name "*.ts" -o -name "*.tsx" -o -name "*.js" -o -name "*.jsx" \) -not -path "*/node_modules/*" -not -path "*/.git/*" -not -path "*/lib/*" -not -path "*/dist/*" -not -path "*/coverage/*" -not -path "*/test-reports/*" -printf '%T@ %p\n' 2>/dev/null | sort -nr | head -1 | cut -d' ' -f2)
|
|
14
|
-
if [[ -z $files ]]; then
|
|
15
|
-
exit 2
|
|
16
|
-
fi
|
|
17
|
-
|
|
18
|
-
# Check if qlty is available and initialized
|
|
19
|
-
qlty_available=false
|
|
20
|
-
if command -v qlty >/dev/null 2>&1 && [[ -d ".qlty" ]]; then
|
|
21
|
-
qlty_available=true
|
|
22
|
-
fi
|
|
23
|
-
|
|
24
|
-
# Auto-format TypeScript/JavaScript files with eslint --fix first
|
|
25
|
-
eslint_format_applied=false
|
|
26
|
-
if [[ $files == *.ts ]] || [[ $files == *.tsx ]] || [[ $files == *.js ]] || [[ $files == *.jsx ]]; then
|
|
27
|
-
# Try projen eslint first if available
|
|
28
|
-
if command -v npx >/dev/null 2>&1 && [[ -f "package.json" ]] && grep -q "projen" package.json; then
|
|
29
|
-
eslint_fix_output=$(npx projen eslint --fix "$files" 2>&1)
|
|
30
|
-
if [[ $eslint_fix_output == *"fixed"* ]] || [[ $eslint_fix_output == *"formatted"* ]]; then
|
|
31
|
-
eslint_format_applied=true
|
|
32
|
-
fi
|
|
33
|
-
elif command -v eslint >/dev/null 2>&1; then
|
|
34
|
-
# Fallback to direct eslint
|
|
35
|
-
eslint_fix_output=$(eslint --fix "$files" 2>&1)
|
|
36
|
-
if [[ $eslint_fix_output == *"fixed"* ]] || [[ $eslint_fix_output == *"formatted"* ]]; then
|
|
37
|
-
eslint_format_applied=true
|
|
38
|
-
fi
|
|
39
|
-
fi
|
|
40
|
-
fi
|
|
41
|
-
|
|
42
|
-
# Run qlty checks (only if available)
|
|
43
|
-
fmt_output=""
|
|
44
|
-
check_output=""
|
|
45
|
-
check_exit_code=0
|
|
46
|
-
if [[ $qlty_available == true ]]; then
|
|
47
|
-
fmt_output=$(qlty fmt "$files" 2>&1)
|
|
48
|
-
check_output=$(qlty check --fix $files 2>&1)
|
|
49
|
-
check_exit_code=$?
|
|
50
|
-
fi
|
|
51
|
-
|
|
52
|
-
# Run additional TypeScript/JavaScript tools
|
|
53
|
-
eslint_output=""
|
|
54
|
-
tsc_output=""
|
|
55
|
-
awslint_output=""
|
|
56
|
-
eslint_exit_code=0
|
|
57
|
-
tsc_exit_code=0
|
|
58
|
-
awslint_exit_code=0
|
|
59
|
-
|
|
60
|
-
if [[ $files == *.ts ]] || [[ $files == *.tsx ]] || [[ $files == *.js ]] || [[ $files == *.jsx ]]; then
|
|
61
|
-
# Run eslint (linting check without fix)
|
|
62
|
-
if command -v npx >/dev/null 2>&1 && [[ -f "package.json" ]] && grep -q "projen" package.json; then
|
|
63
|
-
eslint_output=$(npx projen eslint "$files" 2>&1)
|
|
64
|
-
eslint_exit_code=$?
|
|
65
|
-
elif command -v eslint >/dev/null 2>&1; then
|
|
66
|
-
eslint_output=$(eslint "$files" 2>&1)
|
|
67
|
-
eslint_exit_code=$?
|
|
68
|
-
fi
|
|
69
|
-
|
|
70
|
-
# Run TypeScript compiler check for .ts/.tsx files
|
|
71
|
-
if [[ $files == *.ts ]] || [[ $files == *.tsx ]]; then
|
|
72
|
-
if command -v tsc >/dev/null 2>&1; then
|
|
73
|
-
tsc_output=$(tsc --noEmit --skipLibCheck 2>&1)
|
|
74
|
-
tsc_exit_code=$?
|
|
75
|
-
fi
|
|
76
|
-
fi
|
|
77
|
-
|
|
78
|
-
# Run awslint for CDK projects (check if this is a CDK project)
|
|
79
|
-
if [[ -f "package.json" ]] && grep -q "aws-cdk" package.json; then
|
|
80
|
-
if command -v awslint >/dev/null 2>&1; then
|
|
81
|
-
awslint_output=$(awslint 2>&1)
|
|
82
|
-
awslint_exit_code=$?
|
|
83
|
-
elif command -v npx >/dev/null 2>&1; then
|
|
84
|
-
awslint_output=$(npm run awslint 2>&1)
|
|
85
|
-
awslint_exit_code=$?
|
|
86
|
-
fi
|
|
87
|
-
fi
|
|
88
|
-
fi
|
|
89
|
-
|
|
90
|
-
# Check for issues
|
|
91
|
-
has_issues=false
|
|
92
|
-
|
|
93
|
-
# Check if formatting happened (this is auto-fixed, so don't count as issue)
|
|
94
|
-
formatting_applied=false
|
|
95
|
-
if [[ $fmt_output == *"Formatted"* ]]; then
|
|
96
|
-
formatting_applied=true
|
|
97
|
-
fi
|
|
98
|
-
|
|
99
|
-
# Check if linting found issues
|
|
100
|
-
if [[ $qlty_available == true ]]; then
|
|
101
|
-
if [[ $check_output != *"No issues"* ]] || [[ $check_exit_code -ne 0 ]]; then
|
|
102
|
-
has_issues=true
|
|
103
|
-
fi
|
|
104
|
-
fi
|
|
105
|
-
|
|
106
|
-
# Check TypeScript/JavaScript tool issues
|
|
107
|
-
if [[ $eslint_exit_code -ne 0 ]] || [[ $tsc_exit_code -ne 0 ]] || [[ $awslint_exit_code -ne 0 ]]; then
|
|
108
|
-
has_issues=true
|
|
109
|
-
fi
|
|
110
|
-
|
|
111
|
-
# Remove test logic - now using real qlty detection
|
|
112
|
-
|
|
113
|
-
# Display results
|
|
114
|
-
if [[ $has_issues == true ]]; then
|
|
115
|
-
echo -e "${RED}🛑 STOP - Issues found in: $files${NC}" >&2
|
|
116
|
-
echo -e "${RED}The following MUST BE FIXED:${NC}" >&2
|
|
117
|
-
echo "" >&2
|
|
118
|
-
|
|
119
|
-
if [[ $qlty_available == true ]] && [[ $check_output != *"No issues"* ]]; then
|
|
120
|
-
# Extract remaining issue lines (skip headers/footers)
|
|
121
|
-
issue_lines=$(echo "$check_output" | grep -E "^\s*[0-9]+:[0-9]+\s+|high\s+|medium\s+|low\s+" | head -3)
|
|
122
|
-
remaining_issues=$(echo "$check_output" | grep -c "high\|medium\|low" 2>/dev/null || echo "0")
|
|
123
|
-
|
|
124
|
-
# Ensure remaining_issues is a valid number
|
|
125
|
-
if ! [[ $remaining_issues =~ ^[0-9]+$ ]]; then
|
|
126
|
-
remaining_issues=0
|
|
127
|
-
fi
|
|
128
|
-
|
|
129
|
-
# Simple, clear output
|
|
130
|
-
echo "🔍 QLTY Issues: ($remaining_issues remaining)" >&2
|
|
131
|
-
|
|
132
|
-
if [[ -n $issue_lines ]]; then
|
|
133
|
-
echo "$issue_lines" >&2
|
|
134
|
-
if [[ $remaining_issues -gt 3 ]]; then
|
|
135
|
-
echo "... and $((remaining_issues - 3)) more issues" >&2
|
|
136
|
-
fi
|
|
137
|
-
else
|
|
138
|
-
# Fallback: show first few lines if parsing failed
|
|
139
|
-
echo "$check_output" | head -5 >&2
|
|
140
|
-
fi
|
|
141
|
-
echo "" >&2
|
|
142
|
-
fi
|
|
143
|
-
|
|
144
|
-
# Show eslint issues
|
|
145
|
-
if [[ $eslint_exit_code -ne 0 ]] && [[ -n $eslint_output ]]; then
|
|
146
|
-
echo "🔍 ESLint Issues:" >&2
|
|
147
|
-
echo "$eslint_output" | head -5 >&2
|
|
148
|
-
echo "" >&2
|
|
149
|
-
fi
|
|
150
|
-
|
|
151
|
-
# Show TypeScript issues
|
|
152
|
-
if [[ $tsc_exit_code -ne 0 ]] && [[ -n $tsc_output ]]; then
|
|
153
|
-
echo "🔍 TypeScript Issues:" >&2
|
|
154
|
-
echo "$tsc_output" | grep -E "error|warning" | head -5 >&2
|
|
155
|
-
echo "" >&2
|
|
156
|
-
fi
|
|
157
|
-
|
|
158
|
-
# Show awslint issues
|
|
159
|
-
if [[ $awslint_exit_code -ne 0 ]] && [[ -n $awslint_output ]]; then
|
|
160
|
-
echo "🔍 AWS CDK Lint Issues:" >&2
|
|
161
|
-
echo "$awslint_output" | grep -E "error|warning" | head -5 >&2
|
|
162
|
-
echo "" >&2
|
|
163
|
-
fi
|
|
164
|
-
|
|
165
|
-
echo -e "${RED}Fix all issues above before continuing${NC}" >&2
|
|
166
|
-
exit 1
|
|
167
|
-
else
|
|
168
|
-
if [[ $eslint_format_applied == true ]] && [[ $formatting_applied == true ]]; then
|
|
169
|
-
echo -e "${GREEN}✅ ESLint + QLTY formatted $files. Code quality good. Continue${NC}" >&2
|
|
170
|
-
elif [[ $eslint_format_applied == true ]]; then
|
|
171
|
-
echo -e "${GREEN}✅ ESLint formatted $files. Code quality good. Continue${NC}" >&2
|
|
172
|
-
elif [[ $formatting_applied == true ]]; then
|
|
173
|
-
echo -e "${GREEN}✅ QLTY formatted $files. Code quality good. Continue${NC}" >&2
|
|
174
|
-
else
|
|
175
|
-
echo -e "${GREEN}✅ Code quality good for $files. Continue${NC}" >&2
|
|
176
|
-
fi
|
|
177
|
-
exit 2
|
|
178
|
-
fi
|
package/.qlty/.gitignore
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
extends: default
|
|
2
|
-
|
|
3
|
-
rules:
|
|
4
|
-
document-start: disable
|
|
5
|
-
quoted-strings:
|
|
6
|
-
required: only-when-needed
|
|
7
|
-
extra-allowed: ["{|}"]
|
|
8
|
-
key-duplicates: {}
|
|
9
|
-
octal-values:
|
|
10
|
-
forbid-implicit-octal: true
|
|
11
|
-
line-length: disable
|
|
12
|
-
indentation: disable
|
|
13
|
-
new-line-at-end-of-file: disable
|
|
14
|
-
trailing-spaces: disable
|
|
15
|
-
brackets: disable
|
|
16
|
-
colons: disable
|
|
17
|
-
empty-lines: disable
|
|
18
|
-
comments: disable
|
|
19
|
-
braces: disable
|
|
20
|
-
comments-indentation: disable
|
|
21
|
-
commas: disable
|
package/.qlty/qlty.toml
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
# This file was automatically generated by `qlty init`.
|
|
2
|
-
# You can modify it to suit your needs.
|
|
3
|
-
# We recommend you to commit this file to your repository.
|
|
4
|
-
#
|
|
5
|
-
# This configuration is used by both Qlty CLI and Qlty Cloud.
|
|
6
|
-
#
|
|
7
|
-
# Qlty CLI -- Code quality toolkit for developers
|
|
8
|
-
# Qlty Cloud -- Fully automated Code Health Platform
|
|
9
|
-
#
|
|
10
|
-
# Try Qlty Cloud: https://qlty.sh
|
|
11
|
-
#
|
|
12
|
-
# For a guide to configuration, visit https://qlty.sh/d/config
|
|
13
|
-
# Or for a full reference, visit https://qlty.sh/d/qlty-toml
|
|
14
|
-
config_version = "0"
|
|
15
|
-
|
|
16
|
-
exclude_patterns = [
|
|
17
|
-
"*_min.*",
|
|
18
|
-
"*-min.*",
|
|
19
|
-
"*.min.*",
|
|
20
|
-
"**/.yarn/**",
|
|
21
|
-
"**/*.d.ts",
|
|
22
|
-
"**/assets/**",
|
|
23
|
-
"**/bower_components/**",
|
|
24
|
-
"**/build/**",
|
|
25
|
-
"**/cache/**",
|
|
26
|
-
"**/config/**",
|
|
27
|
-
"**/db/**",
|
|
28
|
-
"**/deps/**",
|
|
29
|
-
"**/dist/**",
|
|
30
|
-
"**/extern/**",
|
|
31
|
-
"**/external/**",
|
|
32
|
-
"**/generated/**",
|
|
33
|
-
"**/Godeps/**",
|
|
34
|
-
"**/gradlew/**",
|
|
35
|
-
"**/mvnw/**",
|
|
36
|
-
"**/node_modules/**",
|
|
37
|
-
"**/protos/**",
|
|
38
|
-
"**/seed/**",
|
|
39
|
-
"**/target/**",
|
|
40
|
-
"**/templates/**",
|
|
41
|
-
"**/testdata/**",
|
|
42
|
-
"**/vendor/**",
|
|
43
|
-
]
|
|
44
|
-
|
|
45
|
-
test_patterns = [
|
|
46
|
-
"**/test/**",
|
|
47
|
-
"**/spec/**",
|
|
48
|
-
"**/*.test.*",
|
|
49
|
-
"**/*.spec.*",
|
|
50
|
-
"**/*_test.*",
|
|
51
|
-
"**/*_spec.*",
|
|
52
|
-
"**/test_*.*",
|
|
53
|
-
"**/spec_*.*",
|
|
54
|
-
]
|
|
55
|
-
|
|
56
|
-
[smells]
|
|
57
|
-
mode = "comment"
|
|
58
|
-
|
|
59
|
-
[[source]]
|
|
60
|
-
name = "default"
|
|
61
|
-
default = true
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
[[plugin]]
|
|
65
|
-
name = "actionlint"
|
|
66
|
-
|
|
67
|
-
[[plugin]]
|
|
68
|
-
name = "checkov"
|
|
69
|
-
|
|
70
|
-
[[plugin]]
|
|
71
|
-
name = "eslint"
|
|
72
|
-
version = "9.33.0"
|
|
73
|
-
package_file = "package.json"
|
|
74
|
-
package_filters = ["eslint", "jest"]
|
|
75
|
-
|
|
76
|
-
[[plugin]]
|
|
77
|
-
name = "gofmt"
|
|
78
|
-
|
|
79
|
-
[[plugin]]
|
|
80
|
-
name = "golangci-lint"
|
|
81
|
-
mode = "comment"
|
|
82
|
-
|
|
83
|
-
[[plugin]]
|
|
84
|
-
name = "markdownlint"
|
|
85
|
-
mode = "comment"
|
|
86
|
-
|
|
87
|
-
[[plugin]]
|
|
88
|
-
name = "osv-scanner"
|
|
89
|
-
|
|
90
|
-
[[plugin]]
|
|
91
|
-
name = "prettier"
|
|
92
|
-
|
|
93
|
-
[[plugin]]
|
|
94
|
-
name = "radarlint-go"
|
|
95
|
-
mode = "monitor"
|
|
96
|
-
|
|
97
|
-
[[plugin]]
|
|
98
|
-
name = "radarlint-js"
|
|
99
|
-
|
|
100
|
-
[[plugin]]
|
|
101
|
-
name = "ripgrep"
|
|
102
|
-
mode = "comment"
|
|
103
|
-
|
|
104
|
-
[[plugin]]
|
|
105
|
-
name = "trivy"
|
|
106
|
-
drivers = [
|
|
107
|
-
"config",
|
|
108
|
-
"fs-vuln",
|
|
109
|
-
]
|
|
110
|
-
|
|
111
|
-
[[plugin]]
|
|
112
|
-
name = "trufflehog"
|
|
113
|
-
|
|
114
|
-
[[plugin]]
|
|
115
|
-
name = "yamllint"
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __export = (target, all) => {
|
|
7
|
-
for (var name in all)
|
|
8
|
-
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
-
};
|
|
10
|
-
var __copyProps = (to, from, except, desc) => {
|
|
11
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
-
for (let key of __getOwnPropNames(from))
|
|
13
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
-
|
|
20
|
-
// src/status-check/status-check.lambda.ts
|
|
21
|
-
var status_check_lambda_exports = {};
|
|
22
|
-
__export(status_check_lambda_exports, {
|
|
23
|
-
handler: () => handler
|
|
24
|
-
});
|
|
25
|
-
module.exports = __toCommonJS(status_check_lambda_exports);
|
|
26
|
-
var import_client_dynamodb = require("@aws-sdk/client-dynamodb");
|
|
27
|
-
var import_client_ec2 = require("@aws-sdk/client-ec2");
|
|
28
|
-
var import_lib_dynamodb = require("@aws-sdk/lib-dynamodb");
|
|
29
|
-
var ec2 = new import_client_ec2.EC2Client({});
|
|
30
|
-
var ddbClient = new import_client_dynamodb.DynamoDBClient({});
|
|
31
|
-
var ddb = import_lib_dynamodb.DynamoDBDocumentClient.from(ddbClient);
|
|
32
|
-
var TABLE_NAME = process.env.TABLE_NAME;
|
|
33
|
-
var handler = async (event) => {
|
|
34
|
-
console.log("StatusCheck/Start triggered", { event });
|
|
35
|
-
const instanceId = event.pathParameters?.instanceId;
|
|
36
|
-
const isStartRequest = event.resource?.includes("/start") && event.httpMethod === "POST";
|
|
37
|
-
if (!instanceId) {
|
|
38
|
-
return {
|
|
39
|
-
statusCode: 400,
|
|
40
|
-
headers: {
|
|
41
|
-
"Content-Type": "application/json",
|
|
42
|
-
"Access-Control-Allow-Origin": "*"
|
|
43
|
-
},
|
|
44
|
-
body: JSON.stringify({ error: "Missing instanceId" })
|
|
45
|
-
};
|
|
46
|
-
}
|
|
47
|
-
try {
|
|
48
|
-
if (isStartRequest) {
|
|
49
|
-
console.log("Starting instance:", instanceId);
|
|
50
|
-
const startCommand = new import_client_ec2.StartInstancesCommand({
|
|
51
|
-
InstanceIds: [instanceId]
|
|
52
|
-
});
|
|
53
|
-
await ec2.send(startCommand);
|
|
54
|
-
await ddb.send(new import_lib_dynamodb.UpdateCommand({
|
|
55
|
-
TableName: TABLE_NAME,
|
|
56
|
-
Key: { instanceId },
|
|
57
|
-
UpdateExpression: "SET instanceState = :state, lastActivityTime = :time",
|
|
58
|
-
ExpressionAttributeValues: {
|
|
59
|
-
":state": "starting",
|
|
60
|
-
":time": (/* @__PURE__ */ new Date()).toISOString()
|
|
61
|
-
}
|
|
62
|
-
}));
|
|
63
|
-
return {
|
|
64
|
-
statusCode: 200,
|
|
65
|
-
headers: {
|
|
66
|
-
"Content-Type": "application/json",
|
|
67
|
-
"Access-Control-Allow-Origin": "*"
|
|
68
|
-
},
|
|
69
|
-
body: JSON.stringify({
|
|
70
|
-
message: "Instance start initiated",
|
|
71
|
-
state: "starting",
|
|
72
|
-
instanceId
|
|
73
|
-
})
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
const statusCommand = new import_client_ec2.DescribeInstanceStatusCommand({
|
|
77
|
-
InstanceIds: [instanceId],
|
|
78
|
-
IncludeAllInstances: true
|
|
79
|
-
});
|
|
80
|
-
const statusResponse = await ec2.send(statusCommand);
|
|
81
|
-
const instanceStatus = statusResponse.InstanceStatuses?.[0];
|
|
82
|
-
const state = instanceStatus?.InstanceState?.Name || "unknown";
|
|
83
|
-
console.log("Instance state:", state);
|
|
84
|
-
if (state === "running") {
|
|
85
|
-
await ddb.send(new import_lib_dynamodb.UpdateCommand({
|
|
86
|
-
TableName: TABLE_NAME,
|
|
87
|
-
Key: { instanceId },
|
|
88
|
-
UpdateExpression: "SET instanceState = :state, lastActivityTime = :time",
|
|
89
|
-
ExpressionAttributeValues: {
|
|
90
|
-
":state": "running",
|
|
91
|
-
":time": (/* @__PURE__ */ new Date()).toISOString()
|
|
92
|
-
}
|
|
93
|
-
}));
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
statusCode: 200,
|
|
97
|
-
headers: {
|
|
98
|
-
"Content-Type": "application/json",
|
|
99
|
-
"Access-Control-Allow-Origin": "*",
|
|
100
|
-
"Cache-Control": "no-cache, no-store, must-revalidate"
|
|
101
|
-
},
|
|
102
|
-
body: JSON.stringify({
|
|
103
|
-
state,
|
|
104
|
-
ready: state === "running",
|
|
105
|
-
instanceId
|
|
106
|
-
})
|
|
107
|
-
};
|
|
108
|
-
} catch (error) {
|
|
109
|
-
console.error("Error in status check/start:", error);
|
|
110
|
-
return {
|
|
111
|
-
statusCode: 500,
|
|
112
|
-
headers: {
|
|
113
|
-
"Content-Type": "application/json",
|
|
114
|
-
"Access-Control-Allow-Origin": "*"
|
|
115
|
-
},
|
|
116
|
-
body: JSON.stringify({ error: "Internal server error" })
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
// Annotate the CommonJS export names for ESM import in node:
|
|
121
|
-
0 && (module.exports = {
|
|
122
|
-
handler
|
|
123
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":"41.0.0"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
13497
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
13497
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":"41.0.0"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
13497
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
2
|
-
import { Construct } from 'constructs';
|
|
3
|
-
/**
|
|
4
|
-
* Props for StatusCheckFunction
|
|
5
|
-
*/
|
|
6
|
-
export interface StatusCheckFunctionProps extends lambda.FunctionOptions {
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* An AWS Lambda function which executes src/status-check/status-check.
|
|
10
|
-
*/
|
|
11
|
-
export declare class StatusCheckFunction extends lambda.Function {
|
|
12
|
-
constructor(scope: Construct, id: string, props?: StatusCheckFunctionProps);
|
|
13
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.StatusCheckFunction = void 0;
|
|
4
|
-
// ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
|
|
5
|
-
const path = require("path");
|
|
6
|
-
const lambda = require("aws-cdk-lib/aws-lambda");
|
|
7
|
-
/**
|
|
8
|
-
* An AWS Lambda function which executes src/status-check/status-check.
|
|
9
|
-
*/
|
|
10
|
-
class StatusCheckFunction extends lambda.Function {
|
|
11
|
-
constructor(scope, id, props) {
|
|
12
|
-
super(scope, id, {
|
|
13
|
-
description: 'src/status-check/status-check.lambda.ts',
|
|
14
|
-
...props,
|
|
15
|
-
runtime: new lambda.Runtime('nodejs20.x', lambda.RuntimeFamily.NODEJS),
|
|
16
|
-
handler: 'index.handler',
|
|
17
|
-
code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/status-check/status-check.lambda')),
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
exports.StatusCheckFunction = StatusCheckFunction;
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLWNoZWNrLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YXR1cy1jaGVjay9zdGF0dXMtY2hlY2stZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkVBQTZFO0FBQzdFLDZCQUE2QjtBQUM3QixpREFBaUQ7QUFTakQ7O0dBRUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLE1BQU0sQ0FBQyxRQUFRO0lBQ3RELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZ0M7UUFDeEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUseUNBQXlDO1lBQ3RELEdBQUcsS0FBSztZQUNSLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO1NBQ25HLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQVZELGtEQVVDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy50cyBhbmQgcnVuIFwibnB4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBTdGF0dXNDaGVja0Z1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHVzQ2hlY2tGdW5jdGlvblByb3BzIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uT3B0aW9ucyB7XG59XG5cbi8qKlxuICogQW4gQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaCBleGVjdXRlcyBzcmMvc3RhdHVzLWNoZWNrL3N0YXR1cy1jaGVjay5cbiAqL1xuZXhwb3J0IGNsYXNzIFN0YXR1c0NoZWNrRnVuY3Rpb24gZXh0ZW5kcyBsYW1iZGEuRnVuY3Rpb24ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wcz86IFN0YXR1c0NoZWNrRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzcmMvc3RhdHVzLWNoZWNrL3N0YXR1cy1jaGVjay5sYW1iZGEudHMnLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBydW50aW1lOiBuZXcgbGFtYmRhLlJ1bnRpbWUoJ25vZGVqczIwLngnLCBsYW1iZGEuUnVudGltZUZhbWlseS5OT0RFSlMpLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9hc3NldHMvc3RhdHVzLWNoZWNrL3N0YXR1cy1jaGVjay5sYW1iZGEnKSksXG4gICAgfSk7XG4gIH1cbn0iXX0=
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { RestApi } from 'aws-cdk-lib/aws-apigateway';
|
|
2
|
-
import { ITable } from 'aws-cdk-lib/aws-dynamodb';
|
|
3
|
-
import { IInstance } from 'aws-cdk-lib/aws-ec2';
|
|
4
|
-
import { Function as LambdaFunction } from 'aws-cdk-lib/aws-lambda';
|
|
5
|
-
import { Construct } from 'constructs';
|
|
6
|
-
/**
|
|
7
|
-
* Props for StatusCheckApi construct
|
|
8
|
-
*/
|
|
9
|
-
export interface StatusCheckApiProps {
|
|
10
|
-
/**
|
|
11
|
-
* The EC2 instance to check status for
|
|
12
|
-
*/
|
|
13
|
-
readonly instance: IInstance;
|
|
14
|
-
/**
|
|
15
|
-
* DynamoDB table for tracking instance state
|
|
16
|
-
*/
|
|
17
|
-
readonly stateTable: ITable;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* API Gateway endpoint for checking instance status, used by resume page for polling
|
|
21
|
-
*/
|
|
22
|
-
export declare class StatusCheckApi extends Construct {
|
|
23
|
-
/**
|
|
24
|
-
* The API Gateway REST API
|
|
25
|
-
*/
|
|
26
|
-
readonly api: RestApi;
|
|
27
|
-
/**
|
|
28
|
-
* The URL of the status check API endpoint
|
|
29
|
-
*/
|
|
30
|
-
readonly apiUrl: string;
|
|
31
|
-
/**
|
|
32
|
-
* The Lambda function that handles status check requests
|
|
33
|
-
*/
|
|
34
|
-
readonly function: LambdaFunction;
|
|
35
|
-
constructor(scope: Construct, id: string, props: StatusCheckApiProps);
|
|
36
|
-
}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.StatusCheckApi = void 0;
|
|
5
|
-
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
-
const path = require("path");
|
|
7
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
8
|
-
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
|
|
9
|
-
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
10
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
11
|
-
const cdk_nag_1 = require("cdk-nag");
|
|
12
|
-
const constructs_1 = require("constructs");
|
|
13
|
-
/**
|
|
14
|
-
* API Gateway endpoint for checking instance status, used by resume page for polling
|
|
15
|
-
*/
|
|
16
|
-
class StatusCheckApi extends constructs_1.Construct {
|
|
17
|
-
constructor(scope, id, props) {
|
|
18
|
-
super(scope, id);
|
|
19
|
-
this.function = new aws_lambda_1.Function(this, 'Function', {
|
|
20
|
-
runtime: aws_lambda_1.Runtime.NODEJS_20_X,
|
|
21
|
-
handler: 'index.handler',
|
|
22
|
-
code: aws_lambda_1.Code.fromAsset(path.join(__dirname, '../../assets/status-check/status-check.lambda')),
|
|
23
|
-
timeout: aws_cdk_lib_1.Duration.seconds(10),
|
|
24
|
-
memorySize: 128,
|
|
25
|
-
environment: {
|
|
26
|
-
TABLE_NAME: props.stateTable.tableName,
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
// Grant permissions
|
|
30
|
-
props.stateTable.grantReadWriteData(this.function);
|
|
31
|
-
this.function.addToRolePolicy(new aws_iam_1.PolicyStatement({
|
|
32
|
-
actions: [
|
|
33
|
-
'ec2:DescribeInstanceStatus',
|
|
34
|
-
'ec2:DescribeInstances',
|
|
35
|
-
'ec2:StartInstances', // Allow starting instances for resume functionality
|
|
36
|
-
],
|
|
37
|
-
resources: [
|
|
38
|
-
`arn:aws:ec2:${aws_cdk_lib_1.Stack.of(this).region}:${aws_cdk_lib_1.Stack.of(this).account}:instance/${props.instance.instanceId}`,
|
|
39
|
-
],
|
|
40
|
-
}));
|
|
41
|
-
// Create API Gateway
|
|
42
|
-
this.api = new aws_apigateway_1.RestApi(this, 'Api', {
|
|
43
|
-
restApiName: 'VSCodeStatusCheckApi',
|
|
44
|
-
description: 'API for checking VS Code Server instance status',
|
|
45
|
-
defaultCorsPreflightOptions: {
|
|
46
|
-
allowOrigins: aws_apigateway_1.Cors.ALL_ORIGINS,
|
|
47
|
-
allowMethods: aws_apigateway_1.Cors.ALL_METHODS,
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
const statusResource = this.api.root.addResource('status');
|
|
51
|
-
const instanceResource = statusResource.addResource('{instanceId}');
|
|
52
|
-
// GET /status/{instanceId} - Check instance status
|
|
53
|
-
instanceResource.addMethod('GET', new aws_apigateway_1.LambdaIntegration(this.function));
|
|
54
|
-
// POST /status/{instanceId}/start - Start stopped instance
|
|
55
|
-
const startResource = instanceResource.addResource('start');
|
|
56
|
-
startResource.addMethod('POST', new aws_apigateway_1.LambdaIntegration(this.function));
|
|
57
|
-
this.apiUrl = this.api.url;
|
|
58
|
-
// CDK-nag suppressions
|
|
59
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions(this.function, [
|
|
60
|
-
{
|
|
61
|
-
id: 'AwsSolutions-IAM4',
|
|
62
|
-
reason: 'Managed policies acceptable for workshop Lambda functions',
|
|
63
|
-
},
|
|
64
|
-
{
|
|
65
|
-
id: 'AwsSolutions-L1',
|
|
66
|
-
reason: 'Latest runtime not required for this function',
|
|
67
|
-
},
|
|
68
|
-
], true);
|
|
69
|
-
cdk_nag_1.NagSuppressions.addResourceSuppressions(this.api, [
|
|
70
|
-
{
|
|
71
|
-
id: 'AwsSolutions-APIG2',
|
|
72
|
-
reason: 'Request validation not required for this simple API',
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
id: 'AwsSolutions-IAM4',
|
|
76
|
-
reason: 'Managed policies acceptable for workshop API Gateway',
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
id: 'AwsSolutions-APIG4',
|
|
80
|
-
reason: 'Authorization not required for status check endpoint',
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
id: 'AwsSolutions-COG4',
|
|
84
|
-
reason: 'Cognito not required for this workshop API',
|
|
85
|
-
},
|
|
86
|
-
{
|
|
87
|
-
id: 'AwsSolutions-APIG1',
|
|
88
|
-
reason: 'Access logging not required for workshop environment',
|
|
89
|
-
},
|
|
90
|
-
{
|
|
91
|
-
id: 'AwsSolutions-APIG3',
|
|
92
|
-
reason: 'WAF not required for this workshop API',
|
|
93
|
-
},
|
|
94
|
-
{
|
|
95
|
-
id: 'AwsSolutions-APIG6',
|
|
96
|
-
reason: 'CloudWatch logging not required for workshop environment',
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
id: 'AwsSolutions-IAM5',
|
|
100
|
-
reason: 'Wildcard permissions acceptable for workshop API Gateway execution role',
|
|
101
|
-
appliesTo: ['Resource::*'],
|
|
102
|
-
},
|
|
103
|
-
], true);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
exports.StatusCheckApi = StatusCheckApi;
|
|
107
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
108
|
-
StatusCheckApi[_a] = { fqn: "@mavogel/cdk-vscode-server.StatusCheckApi", version: "0.0.62" };
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLWNoZWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YXR1cy1jaGVjay9zdGF0dXMtY2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2QkFBNkI7QUFDN0IsNkNBQThDO0FBQzlDLCtEQUE4RTtBQUc5RSxpREFBc0Q7QUFDdEQsdURBQW1GO0FBQ25GLHFDQUEwQztBQUMxQywyQ0FBdUM7QUFnQnZDOztHQUVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFjM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxxQkFBYyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDbkQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsK0NBQStDLENBQUMsQ0FBQztZQUMzRixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLFVBQVUsRUFBRSxHQUFHO1lBQ2YsV0FBVyxFQUFFO2dCQUNYLFVBQVUsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLFNBQVM7YUFDdkM7U0FDRixDQUFDLENBQUM7UUFFSCxvQkFBb0I7UUFDcEIsS0FBSyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQzNCLElBQUkseUJBQWUsQ0FBQztZQUNsQixPQUFPLEVBQUU7Z0JBQ1AsNEJBQTRCO2dCQUM1Qix1QkFBdUI7Z0JBQ3ZCLG9CQUFvQixFQUFFLG9EQUFvRDthQUMzRTtZQUNELFNBQVMsRUFBRTtnQkFDVCxlQUFlLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLGFBQWEsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUU7YUFDdkc7U0FDRixDQUFDLENBQ0gsQ0FBQztRQUVGLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksd0JBQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ2xDLFdBQVcsRUFBRSxzQkFBc0I7WUFDbkMsV0FBVyxFQUFFLGlEQUFpRDtZQUM5RCwyQkFBMkIsRUFBRTtnQkFDM0IsWUFBWSxFQUFFLHFCQUFJLENBQUMsV0FBVztnQkFDOUIsWUFBWSxFQUFFLHFCQUFJLENBQUMsV0FBVzthQUMvQjtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzRCxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFcEUsbURBQW1EO1FBQ25ELGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxrQ0FBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUV4RSwyREFBMkQ7UUFDM0QsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVELGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksa0NBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFFdEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUUzQix1QkFBdUI7UUFDdkIseUJBQWUsQ0FBQyx1QkFBdUIsQ0FDckMsSUFBSSxDQUFDLFFBQVEsRUFDYjtZQUNFO2dCQUNFLEVBQUUsRUFBRSxtQkFBbUI7Z0JBQ3ZCLE1BQU0sRUFBRSwyREFBMkQ7YUFDcEU7WUFDRDtnQkFDRSxFQUFFLEVBQUUsaUJBQWlCO2dCQUNyQixNQUFNLEVBQUUsK0NBQStDO2FBQ3hEO1NBQ0YsRUFDRCxJQUFJLENBQ0wsQ0FBQztRQUVGLHlCQUFlLENBQUMsdUJBQXVCLENBQ3JDLElBQUksQ0FBQyxHQUFHLEVBQ1I7WUFDRTtnQkFDRSxFQUFFLEVBQUUsb0JBQW9CO2dCQUN4QixNQUFNLEVBQUUscURBQXFEO2FBQzlEO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLG1CQUFtQjtnQkFDdkIsTUFBTSxFQUFFLHNEQUFzRDthQUMvRDtZQUNEO2dCQUNFLEVBQUUsRUFBRSxvQkFBb0I7Z0JBQ3hCLE1BQU0sRUFBRSxzREFBc0Q7YUFDL0Q7WUFDRDtnQkFDRSxFQUFFLEVBQUUsbUJBQW1CO2dCQUN2QixNQUFNLEVBQUUsNENBQTRDO2FBQ3JEO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLG9CQUFvQjtnQkFDeEIsTUFBTSxFQUFFLHNEQUFzRDthQUMvRDtZQUNEO2dCQUNFLEVBQUUsRUFBRSxvQkFBb0I7Z0JBQ3hCLE1BQU0sRUFBRSx3Q0FBd0M7YUFDakQ7WUFDRDtnQkFDRSxFQUFFLEVBQUUsb0JBQW9CO2dCQUN4QixNQUFNLEVBQUUsMERBQTBEO2FBQ25FO1lBQ0Q7Z0JBQ0UsRUFBRSxFQUFFLG1CQUFtQjtnQkFDdkIsTUFBTSxFQUFFLHlFQUF5RTtnQkFDakYsU0FBUyxFQUFFLENBQUMsYUFBYSxDQUFDO2FBQzNCO1NBQ0YsRUFDRCxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7O0FBekhILHdDQTBIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBSZXN0QXBpLCBMYW1iZGFJbnRlZ3JhdGlvbiwgQ29ycyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCB7IElUYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgeyBJSW5zdGFuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7IFBvbGljeVN0YXRlbWVudCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgUnVudGltZSwgQ29kZSwgRnVuY3Rpb24gYXMgTGFtYmRhRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IE5hZ1N1cHByZXNzaW9ucyB9IGZyb20gJ2Nkay1uYWcnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIFN0YXR1c0NoZWNrQXBpIGNvbnN0cnVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c0NoZWNrQXBpUHJvcHMge1xuICAvKipcbiAgICogVGhlIEVDMiBpbnN0YW5jZSB0byBjaGVjayBzdGF0dXMgZm9yXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZTogSUluc3RhbmNlO1xuICAvKipcbiAgICogRHluYW1vREIgdGFibGUgZm9yIHRyYWNraW5nIGluc3RhbmNlIHN0YXRlXG4gICAqL1xuICByZWFkb25seSBzdGF0ZVRhYmxlOiBJVGFibGU7XG59XG5cbi8qKlxuICogQVBJIEdhdGV3YXkgZW5kcG9pbnQgZm9yIGNoZWNraW5nIGluc3RhbmNlIHN0YXR1cywgdXNlZCBieSByZXN1bWUgcGFnZSBmb3IgcG9sbGluZ1xuICovXG5leHBvcnQgY2xhc3MgU3RhdHVzQ2hlY2tBcGkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpOiBSZXN0QXBpO1xuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGUgc3RhdHVzIGNoZWNrIEFQSSBlbmRwb2ludFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaVVybDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgc3RhdHVzIGNoZWNrIHJlcXVlc3RzXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZnVuY3Rpb246IExhbWJkYUZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGF0dXNDaGVja0FwaVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuZnVuY3Rpb24gPSBuZXcgTGFtYmRhRnVuY3Rpb24odGhpcywgJ0Z1bmN0aW9uJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9hc3NldHMvc3RhdHVzLWNoZWNrL3N0YXR1cy1jaGVjay5sYW1iZGEnKSksXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgIG1lbW9yeVNpemU6IDEyOCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIFRBQkxFX05BTUU6IHByb3BzLnN0YXRlVGFibGUudGFibGVOYW1lLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIEdyYW50IHBlcm1pc3Npb25zXG4gICAgcHJvcHMuc3RhdGVUYWJsZS5ncmFudFJlYWRXcml0ZURhdGEodGhpcy5mdW5jdGlvbik7XG5cbiAgICB0aGlzLmZ1bmN0aW9uLmFkZFRvUm9sZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgJ2VjMjpEZXNjcmliZUluc3RhbmNlU3RhdHVzJyxcbiAgICAgICAgICAnZWMyOkRlc2NyaWJlSW5zdGFuY2VzJyxcbiAgICAgICAgICAnZWMyOlN0YXJ0SW5zdGFuY2VzJywgLy8gQWxsb3cgc3RhcnRpbmcgaW5zdGFuY2VzIGZvciByZXN1bWUgZnVuY3Rpb25hbGl0eVxuICAgICAgICBdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBgYXJuOmF3czplYzI6JHtTdGFjay5vZih0aGlzKS5yZWdpb259OiR7U3RhY2sub2YodGhpcykuYWNjb3VudH06aW5zdGFuY2UvJHtwcm9wcy5pbnN0YW5jZS5pbnN0YW5jZUlkfWAsXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQ3JlYXRlIEFQSSBHYXRld2F5XG4gICAgdGhpcy5hcGkgPSBuZXcgUmVzdEFwaSh0aGlzLCAnQXBpJywge1xuICAgICAgcmVzdEFwaU5hbWU6ICdWU0NvZGVTdGF0dXNDaGVja0FwaScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FQSSBmb3IgY2hlY2tpbmcgVlMgQ29kZSBTZXJ2ZXIgaW5zdGFuY2Ugc3RhdHVzJyxcbiAgICAgIGRlZmF1bHRDb3JzUHJlZmxpZ2h0T3B0aW9uczoge1xuICAgICAgICBhbGxvd09yaWdpbnM6IENvcnMuQUxMX09SSUdJTlMsXG4gICAgICAgIGFsbG93TWV0aG9kczogQ29ycy5BTExfTUVUSE9EUyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBzdGF0dXNSZXNvdXJjZSA9IHRoaXMuYXBpLnJvb3QuYWRkUmVzb3VyY2UoJ3N0YXR1cycpO1xuICAgIGNvbnN0IGluc3RhbmNlUmVzb3VyY2UgPSBzdGF0dXNSZXNvdXJjZS5hZGRSZXNvdXJjZSgne2luc3RhbmNlSWR9Jyk7XG5cbiAgICAvLyBHRVQgL3N0YXR1cy97aW5zdGFuY2VJZH0gLSBDaGVjayBpbnN0YW5jZSBzdGF0dXNcbiAgICBpbnN0YW5jZVJlc291cmNlLmFkZE1ldGhvZCgnR0VUJywgbmV3IExhbWJkYUludGVncmF0aW9uKHRoaXMuZnVuY3Rpb24pKTtcblxuICAgIC8vIFBPU1QgL3N0YXR1cy97aW5zdGFuY2VJZH0vc3RhcnQgLSBTdGFydCBzdG9wcGVkIGluc3RhbmNlXG4gICAgY29uc3Qgc3RhcnRSZXNvdXJjZSA9IGluc3RhbmNlUmVzb3VyY2UuYWRkUmVzb3VyY2UoJ3N0YXJ0Jyk7XG4gICAgc3RhcnRSZXNvdXJjZS5hZGRNZXRob2QoJ1BPU1QnLCBuZXcgTGFtYmRhSW50ZWdyYXRpb24odGhpcy5mdW5jdGlvbikpO1xuXG4gICAgdGhpcy5hcGlVcmwgPSB0aGlzLmFwaS51cmw7XG5cbiAgICAvLyBDREstbmFnIHN1cHByZXNzaW9uc1xuICAgIE5hZ1N1cHByZXNzaW9ucy5hZGRSZXNvdXJjZVN1cHByZXNzaW9ucyhcbiAgICAgIHRoaXMuZnVuY3Rpb24sXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1JQU00JyxcbiAgICAgICAgICByZWFzb246ICdNYW5hZ2VkIHBvbGljaWVzIGFjY2VwdGFibGUgZm9yIHdvcmtzaG9wIExhbWJkYSBmdW5jdGlvbnMnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtTDEnLFxuICAgICAgICAgIHJlYXNvbjogJ0xhdGVzdCBydW50aW1lIG5vdCByZXF1aXJlZCBmb3IgdGhpcyBmdW5jdGlvbicsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgICAgdHJ1ZSxcbiAgICApO1xuXG4gICAgTmFnU3VwcHJlc3Npb25zLmFkZFJlc291cmNlU3VwcHJlc3Npb25zKFxuICAgICAgdGhpcy5hcGksXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1BUElHMicsXG4gICAgICAgICAgcmVhc29uOiAnUmVxdWVzdCB2YWxpZGF0aW9uIG5vdCByZXF1aXJlZCBmb3IgdGhpcyBzaW1wbGUgQVBJJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUlBTTQnLFxuICAgICAgICAgIHJlYXNvbjogJ01hbmFnZWQgcG9saWNpZXMgYWNjZXB0YWJsZSBmb3Igd29ya3Nob3AgQVBJIEdhdGV3YXknLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtQVBJRzQnLFxuICAgICAgICAgIHJlYXNvbjogJ0F1dGhvcml6YXRpb24gbm90IHJlcXVpcmVkIGZvciBzdGF0dXMgY2hlY2sgZW5kcG9pbnQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtQ09HNCcsXG4gICAgICAgICAgcmVhc29uOiAnQ29nbml0byBub3QgcmVxdWlyZWQgZm9yIHRoaXMgd29ya3Nob3AgQVBJJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUFQSUcxJyxcbiAgICAgICAgICByZWFzb246ICdBY2Nlc3MgbG9nZ2luZyBub3QgcmVxdWlyZWQgZm9yIHdvcmtzaG9wIGVudmlyb25tZW50JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiAnQXdzU29sdXRpb25zLUFQSUczJyxcbiAgICAgICAgICByZWFzb246ICdXQUYgbm90IHJlcXVpcmVkIGZvciB0aGlzIHdvcmtzaG9wIEFQSScsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogJ0F3c1NvbHV0aW9ucy1BUElHNicsXG4gICAgICAgICAgcmVhc29uOiAnQ2xvdWRXYXRjaCBsb2dnaW5nIG5vdCByZXF1aXJlZCBmb3Igd29ya3Nob3AgZW52aXJvbm1lbnQnLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6ICdBd3NTb2x1dGlvbnMtSUFNNScsXG4gICAgICAgICAgcmVhc29uOiAnV2lsZGNhcmQgcGVybWlzc2lvbnMgYWNjZXB0YWJsZSBmb3Igd29ya3Nob3AgQVBJIEdhdGV3YXkgZXhlY3V0aW9uIHJvbGUnLFxuICAgICAgICAgIGFwcGxpZXNUbzogWydSZXNvdXJjZTo6KiddLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxufVxuIl19
|