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

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 +2868 -595
  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.21.vsix} +0 -0
  5. package/scripts/prepare-local-rsx-packages.sh +20 -0
  6. package/scripts/verify-rsx-cli-mutations.sh +296 -0
  7. package/scripts/verify-rsx-projects.sh +220 -0
  8. package/scripts/verify-rsx-setup.sh +190 -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.21",
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,296 @@
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
+ set_build_config_paths() {
169
+ local project_dir="$1"
170
+
171
+ node -e "
172
+ const fs = require('node:fs');
173
+ const path = require('node:path');
174
+ const configPath = path.join(process.argv[1], 'rsx.config.json');
175
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
176
+ config.build = {
177
+ ...(config.build || {}),
178
+ preparse: true,
179
+ preparseFile: 'tmp/generated/custom-preparse.ts',
180
+ compiled: true,
181
+ compiledFile: 'tmp/generated/custom-compiled.ts',
182
+ registrationFile: 'tmp/generated/custom-registration.ts',
183
+ compiledResolvedEvaluator: false,
184
+ };
185
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
186
+ " "$project_dir"
187
+ }
188
+
189
+ rm -rf "$base_dir"
190
+ mkdir -p "$base_dir"
191
+
192
+ printf 'Using workspace: %s\n' "$base_dir"
193
+ printf 'Using package manager: %s\n' "$pm"
194
+ printf 'Using tag flag: %s\n' "$tag_flag"
195
+
196
+ install_dir="$base_dir/install-compiler-verify"
197
+ generic_dir="$base_dir/init-add-verify"
198
+
199
+ printf '\n== install-compiler ==\n'
200
+ rm -rf "$install_dir"
201
+ mkdir -p "$install_dir"
202
+ cat >"$install_dir/package.json" <<'EOF'
203
+ {
204
+ "name": "rsx-install-compiler-verify",
205
+ "private": true
206
+ }
207
+ EOF
208
+
209
+ if ! run_step_in_dir "install-compiler" "command" "$install_dir" "$base_dir/install-compiler.log" \
210
+ "${rsx_cmd[@]}" install compiler --pm "$pm" "$tag_flag"
211
+ then
212
+ summary_lines+=("install-compiler: failed")
213
+ overall_status=1
214
+ else
215
+ if rg -q '"@rs-x/compiler"|"@rs-x/typescript-plugin"' "$install_dir/package.json"; then
216
+ summary_lines+=("install-compiler: pass")
217
+ else
218
+ printf 'install-compiler: package.json missing expected deps.\n'
219
+ summary_lines+=("install-compiler: verify failed")
220
+ overall_status=1
221
+ fi
222
+ fi
223
+
224
+ printf '\n== init-and-add ==\n'
225
+ create_generic_project "$generic_dir"
226
+
227
+ if ! run_step_in_dir "init-and-add" "npm install" "$generic_dir" "$base_dir/init-install.log" "$pm" install; then
228
+ summary_lines+=("init-and-add: npm install failed")
229
+ overall_status=1
230
+ else
231
+ if ! run_step_in_dir "init-and-add" "rsx init" "$generic_dir" "$base_dir/init.log" \
232
+ "${rsx_cmd[@]}" init --pm "$pm" "$tag_flag" "$skip_vscode_flag" --entry src/main.ts
233
+ then
234
+ summary_lines+=("init-and-add: init failed")
235
+ overall_status=1
236
+ elif ! run_step_in_dir_with_input "init-and-add" "rsx add" "$generic_dir" "$base_dir/add.log" \
237
+ $'sampleExpression\n\nsrc/expressions\nn\n' \
238
+ "${rsx_cmd[@]}" add
239
+ then
240
+ summary_lines+=("init-and-add: add failed")
241
+ overall_status=1
242
+ elif [[ ! -f "$generic_dir/rsx.config.json" ]]; then
243
+ printf 'init-and-add: rsx.config.json was not created.\n'
244
+ summary_lines+=("init-and-add: missing rsx.config.json")
245
+ overall_status=1
246
+ elif ! set_build_config_paths "$generic_dir"; then
247
+ printf 'init-and-add: failed to patch rsx.config.json.\n'
248
+ summary_lines+=("init-and-add: config patch failed")
249
+ overall_status=1
250
+ elif ! run_step_in_dir "init-and-add" "rsx build" "$generic_dir" "$base_dir/build.log" \
251
+ "${rsx_cmd[@]}" build --project tsconfig.json --no-emit --prod
252
+ then
253
+ summary_lines+=("init-and-add: build failed")
254
+ overall_status=1
255
+ elif [[ ! -f "$generic_dir/tmp/generated/custom-preparse.ts" || ! -f "$generic_dir/tmp/generated/custom-compiled.ts" ]]; then
256
+ printf 'init-and-add: custom rsx.config.json build outputs were not generated.\n'
257
+ summary_lines+=("init-and-add: custom build outputs missing")
258
+ overall_status=1
259
+ elif ! run_step_in_dir "init-and-add" "rsx typecheck" "$generic_dir" "$base_dir/typecheck.log" \
260
+ "${rsx_cmd[@]}" typecheck --project tsconfig.json
261
+ then
262
+ summary_lines+=("init-and-add: typecheck failed")
263
+ overall_status=1
264
+ else
265
+ summary_lines+=("init-and-add: pass")
266
+ fi
267
+ fi
268
+
269
+ printf '\n== project ==\n'
270
+ if ! run_step "project" "smoke" "$base_dir/project-smoke.log" \
271
+ env RSX_PROJECT_VERIFY_DIR="$project_smoke_dir" RSX_PM="$pm" RSX_TAG_FLAG="$tag_flag" RSX_SKIP_VSCODE_FLAG="$skip_vscode_flag" \
272
+ zsh "$script_dir/verify-rsx-projects.sh"
273
+ then
274
+ summary_lines+=("project: failed")
275
+ overall_status=1
276
+ else
277
+ summary_lines+=("project: pass")
278
+ fi
279
+
280
+ printf '\n== setup ==\n'
281
+ if ! run_step "setup" "smoke" "$base_dir/setup-smoke.log" \
282
+ env RSX_SETUP_VERIFY_DIR="$setup_smoke_dir" RSX_PM="$pm" RSX_TAG_FLAG="$tag_flag" RSX_SKIP_VSCODE_FLAG="$skip_vscode_flag" \
283
+ zsh "$script_dir/verify-rsx-setup.sh"
284
+ then
285
+ summary_lines+=("setup: failed")
286
+ overall_status=1
287
+ else
288
+ summary_lines+=("setup: pass")
289
+ fi
290
+
291
+ printf '\nSummary\n'
292
+ for line in "${summary_lines[@]}"; do
293
+ printf ' %s\n' "$line"
294
+ done
295
+
296
+ exit "$overall_status"
@@ -0,0 +1,220 @@
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
+ verify_log="$base_dir/${display_name}-verify.log"
98
+ build_log="$base_dir/${display_name}-build.log"
99
+
100
+ rm -rf "$project_dir"
101
+
102
+ printf '\n== %s ==\n' "$display_name"
103
+ printf 'Scaffolding %s...\n' "$project_dir"
104
+
105
+ if ! run_in_log \
106
+ "$scaffold_log" \
107
+ "${rsx_cmd[@]}" project "$template_name" --name "$(basename "$project_dir")" --project-parent-dir "$work_base_dir" --pm "$pm" "$tag_flag" "$skip_vscode_flag"
108
+ then
109
+ printf 'Scaffold failed.\n'
110
+ print_log_tail "$scaffold_log"
111
+ summary_lines+=("$display_name: scaffold failed")
112
+ overall_status=1
113
+ continue
114
+ fi
115
+
116
+ if ! run_in_dir_log "$project_dir" "$verify_log" node -e "
117
+ const fs = require('node:fs');
118
+ const path = require('node:path');
119
+ const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
120
+ const scripts = pkg.scripts || {};
121
+ const deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
122
+ const expectedByFramework = {
123
+ angular: {
124
+ scripts: ['build:rsx', 'start'],
125
+ deps: ['@rs-x/angular', '@rs-x/compiler', '@rs-x/typescript-plugin'],
126
+ files: ['src/main.ts', 'src/app/app.component.ts'],
127
+ config: {
128
+ buildPrefix: 'src/rsx-generated/',
129
+ defaultDirectory: 'src/expressions'
130
+ }
131
+ },
132
+ react: {
133
+ scripts: ['build:rsx', 'dev', 'build'],
134
+ deps: ['@rs-x/react', '@rs-x/compiler', '@rs-x/typescript-plugin'],
135
+ files: ['src/main.tsx', 'src/rsx-bootstrap.ts', 'src/app/app.tsx'],
136
+ config: {
137
+ buildPrefix: 'src/rsx-generated/',
138
+ defaultDirectory: 'src/expressions'
139
+ }
140
+ },
141
+ vue: {
142
+ scripts: ['build:rsx', 'dev', 'build'],
143
+ deps: ['@rs-x/vue', '@rs-x/compiler', '@rs-x/typescript-plugin'],
144
+ files: ['src/main.ts', 'src/App.vue', 'src/lib/rsx-bootstrap.ts'],
145
+ config: {
146
+ buildPrefix: 'src/rsx-generated/',
147
+ defaultDirectory: 'src/expressions'
148
+ }
149
+ },
150
+ next: {
151
+ scripts: ['build:rsx', 'dev', 'build'],
152
+ deps: ['@rs-x/react', '@rs-x/compiler', '@rs-x/typescript-plugin'],
153
+ files: ['app/layout.tsx', 'app/page.tsx', 'components/demo-app.tsx'],
154
+ config: {
155
+ buildPrefix: 'app/rsx-generated/',
156
+ defaultDirectory: 'app/expressions'
157
+ }
158
+ }
159
+ };
160
+ const expected = expectedByFramework['$display_name'];
161
+ for (const key of expected.scripts) {
162
+ if (typeof scripts[key] !== 'string' || scripts[key].trim() === '') {
163
+ throw new Error('Missing script: ' + key);
164
+ }
165
+ }
166
+ for (const key of expected.deps) {
167
+ if (typeof deps[key] !== 'string') {
168
+ throw new Error('Missing dependency: ' + key);
169
+ }
170
+ }
171
+ for (const rel of expected.files) {
172
+ if (!fs.existsSync(path.join(process.cwd(), rel))) {
173
+ throw new Error('Missing file: ' + rel);
174
+ }
175
+ }
176
+ const rsxConfig = JSON.parse(fs.readFileSync('rsx.config.json', 'utf8'));
177
+ if (!rsxConfig.build || typeof rsxConfig.build !== 'object') {
178
+ throw new Error('Missing rsx.config.json build section');
179
+ }
180
+ if (!rsxConfig.cli || !rsxConfig.cli.add || typeof rsxConfig.cli.add !== 'object') {
181
+ throw new Error('Missing rsx.config.json cli.add section');
182
+ }
183
+ if (typeof rsxConfig.build.preparseFile !== 'string' || !rsxConfig.build.preparseFile.startsWith(expected.config.buildPrefix)) {
184
+ throw new Error('Unexpected rsx.config.json build.preparseFile: ' + rsxConfig.build.preparseFile);
185
+ }
186
+ if (typeof rsxConfig.build.compiledFile !== 'string' || !rsxConfig.build.compiledFile.startsWith(expected.config.buildPrefix)) {
187
+ throw new Error('Unexpected rsx.config.json build.compiledFile: ' + rsxConfig.build.compiledFile);
188
+ }
189
+ if (rsxConfig.cli.add.defaultDirectory !== expected.config.defaultDirectory) {
190
+ throw new Error('Unexpected rsx.config.json cli.add.defaultDirectory: ' + rsxConfig.cli.add.defaultDirectory);
191
+ }
192
+ "
193
+ then
194
+ printf 'Verification failed.\n'
195
+ print_log_tail "$verify_log"
196
+ summary_lines+=("$display_name: verify failed")
197
+ overall_status=1
198
+ continue
199
+ fi
200
+
201
+ printf 'Building %s...\n' "$project_dir"
202
+ if ! run_in_dir_log "$project_dir" "$build_log" "$pm" run build
203
+ then
204
+ printf 'Build failed.\n'
205
+ print_log_tail "$build_log"
206
+ summary_lines+=("$display_name: build failed")
207
+ overall_status=1
208
+ continue
209
+ fi
210
+
211
+ printf 'Build passed.\n'
212
+ summary_lines+=("$display_name: pass")
213
+ done
214
+
215
+ printf '\nSummary\n'
216
+ for line in "${summary_lines[@]}"; do
217
+ printf ' %s\n' "$line"
218
+ done
219
+
220
+ exit "$overall_status"