@rs-x/cli 2.0.0-next.2 → 2.0.0-next.20

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 (66) hide show
  1. package/README.md +5 -0
  2. package/bin/rsx.cjs +1373 -334
  3. package/package.json +5 -1
  4. package/{rs-x-vscode-extension-2.0.0-next.2.vsix → rs-x-vscode-extension-2.0.0-next.20.vsix} +0 -0
  5. package/scripts/prepare-local-rsx-packages.sh +20 -0
  6. package/scripts/verify-rsx-cli-mutations.sh +258 -0
  7. package/scripts/verify-rsx-projects.sh +134 -0
  8. package/scripts/verify-rsx-setup.sh +186 -0
  9. package/templates/angular-demo/README.md +115 -0
  10. package/templates/angular-demo/src/app/app.component.css +97 -0
  11. package/templates/angular-demo/src/app/app.component.html +58 -0
  12. package/templates/angular-demo/src/app/app.component.ts +52 -0
  13. package/templates/angular-demo/src/app/virtual-table/row-data.ts +35 -0
  14. package/templates/angular-demo/src/app/virtual-table/row-model.ts +45 -0
  15. package/templates/angular-demo/src/app/virtual-table/virtual-table-data.service.ts +136 -0
  16. package/templates/angular-demo/src/app/virtual-table/virtual-table-model.ts +224 -0
  17. package/templates/angular-demo/src/app/virtual-table/virtual-table.component.css +174 -0
  18. package/templates/angular-demo/src/app/virtual-table/virtual-table.component.html +50 -0
  19. package/templates/angular-demo/src/app/virtual-table/virtual-table.component.ts +83 -0
  20. package/templates/angular-demo/src/index.html +11 -0
  21. package/templates/angular-demo/src/main.ts +16 -0
  22. package/templates/angular-demo/src/styles.css +261 -0
  23. package/templates/next-demo/README.md +26 -0
  24. package/templates/next-demo/app/globals.css +431 -0
  25. package/templates/next-demo/app/layout.tsx +22 -0
  26. package/templates/next-demo/app/page.tsx +5 -0
  27. package/templates/next-demo/components/demo-app.tsx +114 -0
  28. package/templates/next-demo/components/virtual-table-row.tsx +40 -0
  29. package/templates/next-demo/components/virtual-table-shell.tsx +86 -0
  30. package/templates/next-demo/hooks/use-virtual-table-controller.ts +26 -0
  31. package/templates/next-demo/hooks/use-virtual-table-viewport.ts +41 -0
  32. package/templates/next-demo/lib/row-data.ts +35 -0
  33. package/templates/next-demo/lib/row-model.ts +45 -0
  34. package/templates/next-demo/lib/rsx-bootstrap.ts +46 -0
  35. package/templates/next-demo/lib/virtual-table-controller.ts +259 -0
  36. package/templates/next-demo/lib/virtual-table-data.service.ts +132 -0
  37. package/templates/react-demo/README.md +113 -0
  38. package/templates/react-demo/index.html +12 -0
  39. package/templates/react-demo/src/app/app.tsx +87 -0
  40. package/templates/react-demo/src/app/hooks/use-virtual-table-controller.ts +24 -0
  41. package/templates/react-demo/src/app/hooks/use-virtual-table-viewport.ts +39 -0
  42. package/templates/react-demo/src/app/virtual-table/row-data.ts +35 -0
  43. package/templates/react-demo/src/app/virtual-table/row-model.ts +45 -0
  44. package/templates/react-demo/src/app/virtual-table/virtual-table-controller.ts +259 -0
  45. package/templates/react-demo/src/app/virtual-table/virtual-table-data.service.ts +132 -0
  46. package/templates/react-demo/src/app/virtual-table/virtual-table-row.tsx +38 -0
  47. package/templates/react-demo/src/app/virtual-table/virtual-table-shell.tsx +84 -0
  48. package/templates/react-demo/src/main.tsx +24 -0
  49. package/templates/react-demo/src/rsx-bootstrap.ts +48 -0
  50. package/templates/react-demo/src/styles.css +422 -0
  51. package/templates/react-demo/tsconfig.json +17 -0
  52. package/templates/react-demo/vite.config.ts +6 -0
  53. package/templates/vue-demo/README.md +27 -0
  54. package/templates/vue-demo/src/App.vue +89 -0
  55. package/templates/vue-demo/src/components/VirtualTableRow.vue +33 -0
  56. package/templates/vue-demo/src/components/VirtualTableShell.vue +71 -0
  57. package/templates/vue-demo/src/composables/use-virtual-table-controller.ts +33 -0
  58. package/templates/vue-demo/src/composables/use-virtual-table-viewport.ts +40 -0
  59. package/templates/vue-demo/src/env.d.ts +10 -0
  60. package/templates/vue-demo/src/lib/row-data.ts +35 -0
  61. package/templates/vue-demo/src/lib/row-model.ts +45 -0
  62. package/templates/vue-demo/src/lib/rsx-bootstrap.ts +46 -0
  63. package/templates/vue-demo/src/lib/virtual-table-controller.ts +259 -0
  64. package/templates/vue-demo/src/lib/virtual-table-data.service.ts +132 -0
  65. package/templates/vue-demo/src/main.ts +13 -0
  66. package/templates/vue-demo/src/style.css +440 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rs-x/cli",
3
- "version": "2.0.0-next.2",
3
+ "version": "2.0.0-next.20",
4
4
  "description": "CLI for installing RS-X compiler tooling and VS Code integration",
5
5
  "bin": {
6
6
  "rsx": "./bin/rsx.cjs"
@@ -8,6 +8,7 @@
8
8
  "files": [
9
9
  "bin",
10
10
  "scripts",
11
+ "templates",
11
12
  "*.vsix",
12
13
  "README.md"
13
14
  ],
@@ -35,6 +36,9 @@
35
36
  ],
36
37
  "scripts": {
37
38
  "build": "node -e \"console.log('No build step required for @rs-x/cli')\"",
39
+ "verify:cli-mutations": "zsh ./scripts/verify-rsx-cli-mutations.sh",
40
+ "verify:project-smoke": "zsh ./scripts/verify-rsx-projects.sh",
41
+ "verify:setup-smoke": "zsh ./scripts/verify-rsx-setup.sh",
38
42
  "postinstall": "node ./scripts/postinstall.cjs"
39
43
  }
40
44
  }
@@ -0,0 +1,20 @@
1
+ #!/bin/zsh
2
+
3
+ set -euo pipefail
4
+
5
+ script_dir="${0:A:h}"
6
+ package_root="${script_dir:h}"
7
+ repo_root="${package_root:h}"
8
+
9
+ cd "$repo_root"
10
+
11
+ echo "Preparing local RS-X packages from $repo_root"
12
+
13
+ pnpm --filter @rs-x/core run build
14
+ pnpm --filter @rs-x/state-manager run build
15
+ pnpm --filter @rs-x/expression-parser run build
16
+ pnpm --filter @rs-x/compiler run build
17
+ pnpm --filter @rs-x/typescript-plugin run build
18
+ pnpm --filter @rs-x/react run build
19
+ pnpm --filter @rs-x/vue run build
20
+ pnpm run build:angular
@@ -0,0 +1,258 @@
1
+ #!/bin/zsh
2
+
3
+ set -u
4
+
5
+ unset INIT_CWD
6
+ unset npm_package_json
7
+ unset npm_package_name
8
+ unset npm_package_version
9
+ unset npm_lifecycle_event
10
+ unset npm_lifecycle_script
11
+ unset npm_config_local_prefix
12
+ unset npm_prefix
13
+ unset npm_execpath
14
+ unset npm_command
15
+ unset npm_config_node_linker
16
+ unset NPM_CONFIG_NODE_LINKER
17
+ export CI=true
18
+
19
+ script_dir="${0:A:h}"
20
+ package_root="${script_dir:h}"
21
+ rsx_cmd=(node "$package_root/bin/rsx.cjs")
22
+ default_base_dir="$package_root/.tests/rsx-cli-mutation-smoke"
23
+
24
+ base_dir="${RSX_MUTATION_VERIFY_DIR:-$default_base_dir}"
25
+ pm="${RSX_PM:-npm}"
26
+ tag_flag="${RSX_TAG_FLAG:---next}"
27
+ skip_vscode_flag="${RSX_SKIP_VSCODE_FLAG:---skip-vscode}"
28
+ project_smoke_dir="${RSX_PROJECT_VERIFY_DIR:-$base_dir/project-smoke}"
29
+ setup_smoke_dir="${RSX_SETUP_VERIFY_DIR:-$base_dir/setup-smoke}"
30
+
31
+ typeset -a summary_lines
32
+ overall_status=0
33
+
34
+ run_in_log() {
35
+ local log_file="$1"
36
+ shift
37
+
38
+ "$@" < /dev/null >"$log_file" 2>&1
39
+ }
40
+
41
+ run_in_dir_log() {
42
+ local project_dir="$1"
43
+ local log_file="$2"
44
+ shift 2
45
+
46
+ (
47
+ cd "$project_dir" || exit 1
48
+ "$@" < /dev/null
49
+ ) >"$log_file" 2>&1
50
+ }
51
+
52
+ run_in_dir_with_input_log() {
53
+ local project_dir="$1"
54
+ local log_file="$2"
55
+ local input_text="$3"
56
+ shift 3
57
+
58
+ (
59
+ cd "$project_dir" || exit 1
60
+ printf '%s' "$input_text" | "$@"
61
+ ) >"$log_file" 2>&1
62
+ }
63
+
64
+ print_log_tail() {
65
+ local log_file="$1"
66
+
67
+ printf ' log: %s\n' "$log_file"
68
+ printf ' last lines:\n'
69
+ tail -n 20 "$log_file" | sed 's/^/ /'
70
+ }
71
+
72
+ run_step() {
73
+ local label="$1"
74
+ local step_name="$2"
75
+ local log_file="$3"
76
+ shift 3
77
+
78
+ printf '%s: %s...\n' "$label" "$step_name"
79
+ if ! run_in_log "$log_file" "$@"; then
80
+ printf '%s: %s failed.\n' "$label" "$step_name"
81
+ print_log_tail "$log_file"
82
+ return 1
83
+ fi
84
+
85
+ return 0
86
+ }
87
+
88
+ run_step_in_dir() {
89
+ local label="$1"
90
+ local step_name="$2"
91
+ local project_dir="$3"
92
+ local log_file="$4"
93
+ shift 4
94
+
95
+ printf '%s: %s...\n' "$label" "$step_name"
96
+ if ! run_in_dir_log "$project_dir" "$log_file" "$@"; then
97
+ printf '%s: %s failed.\n' "$label" "$step_name"
98
+ print_log_tail "$log_file"
99
+ return 1
100
+ fi
101
+
102
+ return 0
103
+ }
104
+
105
+ run_step_in_dir_with_input() {
106
+ local label="$1"
107
+ local step_name="$2"
108
+ local project_dir="$3"
109
+ local log_file="$4"
110
+ local input_text="$5"
111
+ shift 5
112
+
113
+ printf '%s: %s...\n' "$label" "$step_name"
114
+ if ! run_in_dir_with_input_log "$project_dir" "$log_file" "$input_text" "$@"; then
115
+ printf '%s: %s failed.\n' "$label" "$step_name"
116
+ print_log_tail "$log_file"
117
+ return 1
118
+ fi
119
+
120
+ return 0
121
+ }
122
+
123
+ create_generic_project() {
124
+ local project_dir="$1"
125
+
126
+ rm -rf "$project_dir"
127
+ mkdir -p "$project_dir/src"
128
+
129
+ cat >"$project_dir/package.json" <<'EOF'
130
+ {
131
+ "name": "rsx-generic-init-verify",
132
+ "private": true,
133
+ "type": "module",
134
+ "scripts": {
135
+ "build": "node ../dist/main.js"
136
+ },
137
+ "devDependencies": {
138
+ "typescript": "^5.9.3"
139
+ }
140
+ }
141
+ EOF
142
+
143
+ cat >"$project_dir/tsconfig.json" <<'EOF'
144
+ {
145
+ "compilerOptions": {
146
+ "target": "ES2022",
147
+ "module": "ESNext",
148
+ "moduleResolution": "Bundler",
149
+ "strict": true,
150
+ "skipLibCheck": true,
151
+ "outDir": "dist"
152
+ },
153
+ "include": [
154
+ "src/**/*.ts"
155
+ ]
156
+ }
157
+ EOF
158
+
159
+ cat >"$project_dir/src/main.ts" <<'EOF'
160
+ export async function main(): Promise<void> {
161
+ console.log('rsx generic init smoke test');
162
+ }
163
+
164
+ main();
165
+ EOF
166
+ }
167
+
168
+ rm -rf "$base_dir"
169
+ mkdir -p "$base_dir"
170
+
171
+ printf 'Using workspace: %s\n' "$base_dir"
172
+ printf 'Using package manager: %s\n' "$pm"
173
+ printf 'Using tag flag: %s\n' "$tag_flag"
174
+
175
+ install_dir="$base_dir/install-compiler-verify"
176
+ generic_dir="$base_dir/init-add-verify"
177
+
178
+ printf '\n== install-compiler ==\n'
179
+ rm -rf "$install_dir"
180
+ mkdir -p "$install_dir"
181
+ cat >"$install_dir/package.json" <<'EOF'
182
+ {
183
+ "name": "rsx-install-compiler-verify",
184
+ "private": true
185
+ }
186
+ EOF
187
+
188
+ if ! run_step_in_dir "install-compiler" "command" "$install_dir" "$base_dir/install-compiler.log" \
189
+ "${rsx_cmd[@]}" install compiler --pm "$pm" "$tag_flag"
190
+ then
191
+ summary_lines+=("install-compiler: failed")
192
+ overall_status=1
193
+ else
194
+ if rg -q '"@rs-x/compiler"|"@rs-x/typescript-plugin"' "$install_dir/package.json"; then
195
+ summary_lines+=("install-compiler: pass")
196
+ else
197
+ printf 'install-compiler: package.json missing expected deps.\n'
198
+ summary_lines+=("install-compiler: verify failed")
199
+ overall_status=1
200
+ fi
201
+ fi
202
+
203
+ printf '\n== init-and-add ==\n'
204
+ create_generic_project "$generic_dir"
205
+
206
+ if ! run_step_in_dir "init-and-add" "npm install" "$generic_dir" "$base_dir/init-install.log" "$pm" install; then
207
+ summary_lines+=("init-and-add: npm install failed")
208
+ overall_status=1
209
+ else
210
+ if ! run_step_in_dir "init-and-add" "rsx init" "$generic_dir" "$base_dir/init.log" \
211
+ "${rsx_cmd[@]}" init --pm "$pm" "$tag_flag" "$skip_vscode_flag" --entry src/main.ts
212
+ then
213
+ summary_lines+=("init-and-add: init failed")
214
+ overall_status=1
215
+ elif ! run_step_in_dir_with_input "init-and-add" "rsx add" "$generic_dir" "$base_dir/add.log" \
216
+ $'sampleExpression\n\nsrc/expressions\nn\n' \
217
+ "${rsx_cmd[@]}" add
218
+ then
219
+ summary_lines+=("init-and-add: add failed")
220
+ overall_status=1
221
+ elif ! run_step_in_dir "init-and-add" "rsx typecheck" "$generic_dir" "$base_dir/typecheck.log" \
222
+ "${rsx_cmd[@]}" typecheck --project tsconfig.json
223
+ then
224
+ summary_lines+=("init-and-add: typecheck failed")
225
+ overall_status=1
226
+ else
227
+ summary_lines+=("init-and-add: pass")
228
+ fi
229
+ fi
230
+
231
+ printf '\n== project ==\n'
232
+ if ! run_step "project" "smoke" "$base_dir/project-smoke.log" \
233
+ env RSX_PROJECT_VERIFY_DIR="$project_smoke_dir" RSX_PM="$pm" RSX_TAG_FLAG="$tag_flag" RSX_SKIP_VSCODE_FLAG="$skip_vscode_flag" \
234
+ zsh "$script_dir/verify-rsx-projects.sh"
235
+ then
236
+ summary_lines+=("project: failed")
237
+ overall_status=1
238
+ else
239
+ summary_lines+=("project: pass")
240
+ fi
241
+
242
+ printf '\n== setup ==\n'
243
+ if ! run_step "setup" "smoke" "$base_dir/setup-smoke.log" \
244
+ env RSX_SETUP_VERIFY_DIR="$setup_smoke_dir" RSX_PM="$pm" RSX_TAG_FLAG="$tag_flag" RSX_SKIP_VSCODE_FLAG="$skip_vscode_flag" \
245
+ zsh "$script_dir/verify-rsx-setup.sh"
246
+ then
247
+ summary_lines+=("setup: failed")
248
+ overall_status=1
249
+ else
250
+ summary_lines+=("setup: pass")
251
+ fi
252
+
253
+ printf '\nSummary\n'
254
+ for line in "${summary_lines[@]}"; do
255
+ printf ' %s\n' "$line"
256
+ done
257
+
258
+ exit "$overall_status"
@@ -0,0 +1,134 @@
1
+ #!/bin/zsh
2
+
3
+ set -u
4
+
5
+ unset INIT_CWD
6
+ unset npm_package_json
7
+ unset npm_package_name
8
+ unset npm_package_version
9
+ unset npm_lifecycle_event
10
+ unset npm_lifecycle_script
11
+ unset npm_config_local_prefix
12
+ unset npm_prefix
13
+ unset npm_execpath
14
+ unset npm_command
15
+ unset npm_config_node_linker
16
+ unset NPM_CONFIG_NODE_LINKER
17
+ export CI=true
18
+
19
+ script_dir="${0:A:h}"
20
+ package_root="${script_dir:h}"
21
+ rsx_cmd=(node "$package_root/bin/rsx.cjs")
22
+ default_base_dir="$package_root/.tests/rsx-project-smoke"
23
+ prebuild_script="$script_dir/prepare-local-rsx-packages.sh"
24
+
25
+ base_dir="${RSX_PROJECT_VERIFY_DIR:-$default_base_dir}"
26
+ work_base_dir="${RSX_PROJECT_WORK_DIR:-$base_dir/workspace}"
27
+ pm="${RSX_PM:-npm}"
28
+ tag_flag="${RSX_TAG_FLAG:---next}"
29
+ skip_vscode_flag="${RSX_SKIP_VSCODE_FLAG:---skip-vscode}"
30
+
31
+ frameworks=(
32
+ "angular:angular"
33
+ "react:react"
34
+ "vue:vuejs"
35
+ "next:nextjs"
36
+ )
37
+
38
+ typeset -a summary_lines
39
+ overall_status=0
40
+
41
+ run_in_log() {
42
+ local log_file="$1"
43
+ shift
44
+
45
+ "$@" < /dev/null >"$log_file" 2>&1
46
+ }
47
+
48
+ run_in_dir_log() {
49
+ local project_dir="$1"
50
+ local log_file="$2"
51
+ shift 2
52
+
53
+ (
54
+ cd "$project_dir" || exit 1
55
+ "$@" < /dev/null
56
+ ) >"$log_file" 2>&1
57
+ }
58
+
59
+ print_log_tail() {
60
+ local log_file="$1"
61
+
62
+ printf ' log: %s\n' "$log_file"
63
+ printf ' last lines:\n'
64
+ tail -n 20 "$log_file" | sed 's/^/ /'
65
+ }
66
+
67
+ rm -rf "$base_dir"
68
+ mkdir -p "$base_dir"
69
+ mkdir -p "$work_base_dir"
70
+ cat > "$work_base_dir/package.json" <<'EOF'
71
+ {
72
+ "name": "rsx-project-smoke-workspace",
73
+ "private": true
74
+ }
75
+ EOF
76
+ : > "$work_base_dir/.npmrc"
77
+
78
+ printf 'Using workspace: %s\n' "$base_dir"
79
+ printf 'Using project dir: %s\n' "$work_base_dir"
80
+ printf 'Using package manager: %s\n' "$pm"
81
+ printf 'Using tag flag: %s\n' "$tag_flag"
82
+
83
+ printf 'Preparing local RS-X packages...\n'
84
+ if ! run_in_log "$base_dir/prepare-packages.log" zsh "$prebuild_script"; then
85
+ printf 'Preparation failed.\n'
86
+ print_log_tail "$base_dir/prepare-packages.log"
87
+ exit 1
88
+ fi
89
+
90
+ cd "$work_base_dir" || exit 1
91
+
92
+ for entry in "${frameworks[@]}"; do
93
+ display_name="${entry%%:*}"
94
+ template_name="${entry##*:}"
95
+ project_dir="$work_base_dir/rsx-project-${display_name}-verify"
96
+ scaffold_log="$base_dir/${display_name}-scaffold.log"
97
+ build_log="$base_dir/${display_name}-build.log"
98
+
99
+ rm -rf "$project_dir"
100
+
101
+ printf '\n== %s ==\n' "$display_name"
102
+ printf 'Scaffolding %s...\n' "$project_dir"
103
+
104
+ if ! run_in_log \
105
+ "$scaffold_log" \
106
+ "${rsx_cmd[@]}" project "$template_name" --name "$(basename "$project_dir")" --project-parent-dir "$work_base_dir" --pm "$pm" "$tag_flag" "$skip_vscode_flag"
107
+ then
108
+ printf 'Scaffold failed.\n'
109
+ print_log_tail "$scaffold_log"
110
+ summary_lines+=("$display_name: scaffold failed")
111
+ overall_status=1
112
+ continue
113
+ fi
114
+
115
+ printf 'Building %s...\n' "$project_dir"
116
+ if ! run_in_dir_log "$project_dir" "$build_log" "$pm" run build
117
+ then
118
+ printf 'Build failed.\n'
119
+ print_log_tail "$build_log"
120
+ summary_lines+=("$display_name: build failed")
121
+ overall_status=1
122
+ continue
123
+ fi
124
+
125
+ printf 'Build passed.\n'
126
+ summary_lines+=("$display_name: pass")
127
+ done
128
+
129
+ printf '\nSummary\n'
130
+ for line in "${summary_lines[@]}"; do
131
+ printf ' %s\n' "$line"
132
+ done
133
+
134
+ exit "$overall_status"
@@ -0,0 +1,186 @@
1
+ #!/bin/zsh
2
+
3
+ set -u
4
+
5
+ unset INIT_CWD
6
+ unset npm_package_json
7
+ unset npm_package_name
8
+ unset npm_package_version
9
+ unset npm_lifecycle_event
10
+ unset npm_lifecycle_script
11
+ unset npm_config_local_prefix
12
+ unset npm_prefix
13
+ unset npm_execpath
14
+ unset npm_command
15
+ unset npm_config_node_linker
16
+ unset NPM_CONFIG_NODE_LINKER
17
+ export CI=true
18
+
19
+ script_dir="${0:A:h}"
20
+ package_root="${script_dir:h}"
21
+ rsx_cmd=(node "$package_root/bin/rsx.cjs")
22
+ default_base_dir="$package_root/.tests/rsx-setup-smoke"
23
+ prebuild_script="$script_dir/prepare-local-rsx-packages.sh"
24
+
25
+ base_dir="${RSX_SETUP_VERIFY_DIR:-$default_base_dir}"
26
+ work_base_dir="${RSX_SETUP_WORK_DIR:-$base_dir/workspace}"
27
+ pm="${RSX_PM:-npm}"
28
+ tag_flag="${RSX_TAG_FLAG:---next}"
29
+ skip_vscode_flag="${RSX_SKIP_VSCODE_FLAG:---skip-vscode}"
30
+
31
+ typeset -a summary_lines
32
+ overall_status=0
33
+
34
+ run_in_log() {
35
+ local log_file="$1"
36
+ shift
37
+
38
+ "$@" < /dev/null >"$log_file" 2>&1
39
+ }
40
+
41
+ run_in_dir_log() {
42
+ local project_dir="$1"
43
+ local log_file="$2"
44
+ shift 2
45
+
46
+ (
47
+ cd "$project_dir" || exit 1
48
+ "$@" < /dev/null
49
+ ) >"$log_file" 2>&1
50
+ }
51
+
52
+ print_log_tail() {
53
+ local log_file="$1"
54
+
55
+ printf ' log: %s\n' "$log_file"
56
+ printf ' last lines:\n'
57
+ tail -n 20 "$log_file" | sed 's/^/ /'
58
+ }
59
+
60
+ run_step() {
61
+ local framework="$1"
62
+ local step_name="$2"
63
+ local log_file="$3"
64
+ shift 3
65
+
66
+ printf '%s: %s...\n' "$framework" "$step_name"
67
+ if ! run_in_log "$log_file" "$@"; then
68
+ printf '%s: %s failed.\n' "$framework" "$step_name"
69
+ print_log_tail "$log_file"
70
+ return 1
71
+ fi
72
+
73
+ return 0
74
+ }
75
+
76
+ run_step_in_dir() {
77
+ local framework="$1"
78
+ local step_name="$2"
79
+ local project_dir="$3"
80
+ local log_file="$4"
81
+ shift 4
82
+
83
+ printf '%s: %s...\n' "$framework" "$step_name"
84
+ if ! run_in_dir_log "$project_dir" "$log_file" "$@"; then
85
+ printf '%s: %s failed.\n' "$framework" "$step_name"
86
+ print_log_tail "$log_file"
87
+ return 1
88
+ fi
89
+
90
+ return 0
91
+ }
92
+
93
+ rm -rf "$base_dir"
94
+ mkdir -p "$base_dir"
95
+ mkdir -p "$work_base_dir"
96
+ cat > "$work_base_dir/package.json" <<'EOF'
97
+ {
98
+ "name": "rsx-setup-smoke-workspace",
99
+ "private": true
100
+ }
101
+ EOF
102
+ : > "$work_base_dir/.npmrc"
103
+
104
+ printf 'Using workspace: %s\n' "$base_dir"
105
+ printf 'Using project dir: %s\n' "$work_base_dir"
106
+ printf 'Using package manager: %s\n' "$pm"
107
+ printf 'Using tag flag: %s\n' "$tag_flag"
108
+
109
+ printf 'Preparing local RS-X packages...\n'
110
+ if ! run_in_log "$base_dir/prepare-packages.log" zsh "$prebuild_script"; then
111
+ printf 'Preparation failed.\n'
112
+ print_log_tail "$base_dir/prepare-packages.log"
113
+ exit 1
114
+ fi
115
+
116
+ verify_framework() {
117
+ local framework="$1"
118
+ local project_name="rsx-setup-${framework}-verify"
119
+ local project_dir="$work_base_dir/$project_name"
120
+ local project_arg="./$project_name"
121
+ local scaffold_log="$base_dir/${framework}-scaffold.log"
122
+ local install_log="$base_dir/${framework}-install.log"
123
+ local setup_log="$base_dir/${framework}-setup.log"
124
+ local build_log="$base_dir/${framework}-build.log"
125
+
126
+ rm -rf "$project_dir"
127
+
128
+ printf '\n== %s ==\n' "$framework"
129
+
130
+ case "$framework" in
131
+ angular)
132
+ run_step_in_dir "$framework" "scaffold" "$work_base_dir" "$scaffold_log" \
133
+ npx @angular/cli@latest new "$project_name" --directory "$project_arg" --style css --routing --skip-git --skip-install --defaults \
134
+ || { summary_lines+=("$framework: scaffold failed"); overall_status=1; return; }
135
+ run_step_in_dir "$framework" "install" "$project_dir" "$install_log" "$pm" install \
136
+ || { summary_lines+=("$framework: install failed"); overall_status=1; return; }
137
+ ;;
138
+ react)
139
+ run_step_in_dir "$framework" "scaffold" "$work_base_dir" "$scaffold_log" \
140
+ npx create-vite@latest "$project_arg" --no-interactive --template react-ts \
141
+ || { summary_lines+=("$framework: scaffold failed"); overall_status=1; return; }
142
+ run_step_in_dir "$framework" "install" "$project_dir" "$install_log" "$pm" install \
143
+ || { summary_lines+=("$framework: install failed"); overall_status=1; return; }
144
+ ;;
145
+ vue)
146
+ run_step_in_dir "$framework" "scaffold" "$work_base_dir" "$scaffold_log" \
147
+ npx create-vite@latest "$project_arg" --no-interactive --template vue-ts \
148
+ || { summary_lines+=("$framework: scaffold failed"); overall_status=1; return; }
149
+ run_step_in_dir "$framework" "install" "$project_dir" "$install_log" "$pm" install \
150
+ || { summary_lines+=("$framework: install failed"); overall_status=1; return; }
151
+ ;;
152
+ next)
153
+ run_step_in_dir "$framework" "scaffold" "$work_base_dir" "$scaffold_log" \
154
+ npx create-next-app@latest "$project_arg" --ts --app --empty --use-npm --yes --disable-git \
155
+ || { summary_lines+=("$framework: scaffold failed"); overall_status=1; return; }
156
+ ;;
157
+ *)
158
+ printf 'Unknown framework: %s\n' "$framework"
159
+ summary_lines+=("$framework: unsupported")
160
+ overall_status=1
161
+ return
162
+ ;;
163
+ esac
164
+
165
+ run_step_in_dir "$framework" "rsx setup" "$project_dir" "$setup_log" "${rsx_cmd[@]}" setup --pm "$pm" "$tag_flag" "$skip_vscode_flag" \
166
+ || { summary_lines+=("$framework: rsx setup failed"); overall_status=1; return; }
167
+
168
+ run_step_in_dir "$framework" "build" "$project_dir" "$build_log" "$pm" run build \
169
+ || { summary_lines+=("$framework: build failed"); overall_status=1; return; }
170
+
171
+ printf '%s: build passed.\n' "$framework"
172
+ summary_lines+=("$framework: pass")
173
+ }
174
+
175
+ cd "$base_dir" || exit 1
176
+ verify_framework angular
177
+ verify_framework react
178
+ verify_framework vue
179
+ verify_framework next
180
+
181
+ printf '\nSummary\n'
182
+ for line in "${summary_lines[@]}"; do
183
+ printf ' %s\n' "$line"
184
+ done
185
+
186
+ exit "$overall_status"