@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.
- package/README.md +5 -0
- package/bin/rsx.cjs +2868 -595
- package/package.json +5 -1
- package/{rs-x-vscode-extension-2.0.0-next.2.vsix → rs-x-vscode-extension-2.0.0-next.21.vsix} +0 -0
- package/scripts/prepare-local-rsx-packages.sh +20 -0
- package/scripts/verify-rsx-cli-mutations.sh +296 -0
- package/scripts/verify-rsx-projects.sh +220 -0
- package/scripts/verify-rsx-setup.sh +190 -0
- package/templates/angular-demo/README.md +115 -0
- package/templates/angular-demo/src/app/app.component.css +97 -0
- package/templates/angular-demo/src/app/app.component.html +58 -0
- package/templates/angular-demo/src/app/app.component.ts +52 -0
- package/templates/angular-demo/src/app/virtual-table/row-data.ts +35 -0
- package/templates/angular-demo/src/app/virtual-table/row-model.ts +45 -0
- package/templates/angular-demo/src/app/virtual-table/virtual-table-data.service.ts +136 -0
- package/templates/angular-demo/src/app/virtual-table/virtual-table-model.ts +224 -0
- package/templates/angular-demo/src/app/virtual-table/virtual-table.component.css +174 -0
- package/templates/angular-demo/src/app/virtual-table/virtual-table.component.html +50 -0
- package/templates/angular-demo/src/app/virtual-table/virtual-table.component.ts +83 -0
- package/templates/angular-demo/src/index.html +11 -0
- package/templates/angular-demo/src/main.ts +16 -0
- package/templates/angular-demo/src/styles.css +261 -0
- package/templates/next-demo/README.md +26 -0
- package/templates/next-demo/app/globals.css +431 -0
- package/templates/next-demo/app/layout.tsx +22 -0
- package/templates/next-demo/app/page.tsx +5 -0
- package/templates/next-demo/components/demo-app.tsx +114 -0
- package/templates/next-demo/components/virtual-table-row.tsx +40 -0
- package/templates/next-demo/components/virtual-table-shell.tsx +86 -0
- package/templates/next-demo/hooks/use-virtual-table-controller.ts +26 -0
- package/templates/next-demo/hooks/use-virtual-table-viewport.ts +41 -0
- package/templates/next-demo/lib/row-data.ts +35 -0
- package/templates/next-demo/lib/row-model.ts +45 -0
- package/templates/next-demo/lib/rsx-bootstrap.ts +46 -0
- package/templates/next-demo/lib/virtual-table-controller.ts +259 -0
- package/templates/next-demo/lib/virtual-table-data.service.ts +132 -0
- package/templates/react-demo/README.md +113 -0
- package/templates/react-demo/index.html +12 -0
- package/templates/react-demo/src/app/app.tsx +87 -0
- package/templates/react-demo/src/app/hooks/use-virtual-table-controller.ts +24 -0
- package/templates/react-demo/src/app/hooks/use-virtual-table-viewport.ts +39 -0
- package/templates/react-demo/src/app/virtual-table/row-data.ts +35 -0
- package/templates/react-demo/src/app/virtual-table/row-model.ts +45 -0
- package/templates/react-demo/src/app/virtual-table/virtual-table-controller.ts +259 -0
- package/templates/react-demo/src/app/virtual-table/virtual-table-data.service.ts +132 -0
- package/templates/react-demo/src/app/virtual-table/virtual-table-row.tsx +38 -0
- package/templates/react-demo/src/app/virtual-table/virtual-table-shell.tsx +84 -0
- package/templates/react-demo/src/main.tsx +24 -0
- package/templates/react-demo/src/rsx-bootstrap.ts +48 -0
- package/templates/react-demo/src/styles.css +422 -0
- package/templates/react-demo/tsconfig.json +17 -0
- package/templates/react-demo/vite.config.ts +6 -0
- package/templates/vue-demo/README.md +27 -0
- package/templates/vue-demo/src/App.vue +89 -0
- package/templates/vue-demo/src/components/VirtualTableRow.vue +33 -0
- package/templates/vue-demo/src/components/VirtualTableShell.vue +71 -0
- package/templates/vue-demo/src/composables/use-virtual-table-controller.ts +33 -0
- package/templates/vue-demo/src/composables/use-virtual-table-viewport.ts +40 -0
- package/templates/vue-demo/src/env.d.ts +10 -0
- package/templates/vue-demo/src/lib/row-data.ts +35 -0
- package/templates/vue-demo/src/lib/row-model.ts +45 -0
- package/templates/vue-demo/src/lib/rsx-bootstrap.ts +46 -0
- package/templates/vue-demo/src/lib/virtual-table-controller.ts +259 -0
- package/templates/vue-demo/src/lib/virtual-table-data.service.ts +132 -0
- package/templates/vue-demo/src/main.ts +13 -0
- 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.
|
|
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
|
}
|
package/{rs-x-vscode-extension-2.0.0-next.2.vsix → rs-x-vscode-extension-2.0.0-next.21.vsix}
RENAMED
|
Binary file
|
|
@@ -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"
|