@@ -20,11 +20,55 @@ strip_twig() {
2020 sed ' s/{{[^}]*}}/PLACEHOLDER/g' " $1 "
2121}
2222
23+ replace_first () {
24+ # POSIX-portable first-match replacement (no GNU sed required).
25+ # Exits with code 2 if the pattern is not found.
26+ # Usage: replace_first <file> <literal_old> <literal_new>
27+ local file=" $1 " old=" $2 " new=" $3 "
28+ awk -v o=" $old " -v n=" $new " -v done=0 \
29+ ' { if (!done && index($0, o)) { sub(o, n); done=1 } print } END { exit(done ? 0 : 2) }' \
30+ " $file " > " ${file} .tmp" && mv " ${file} .tmp" " $file "
31+ }
32+
33+ restore_twig_npm () {
34+ # Replace PLACEHOLDER values in package-lock.json with the correct
35+ # Twig expressions extracted from the corresponding package.json.twig.
36+ # PLACEHOLDER appears in: root "name", root "version",
37+ # packages[""] "name", "version", "license".
38+ local lockfile=" $1 "
39+ local twig_name=" $2 "
40+
41+ replace_first " $lockfile " ' "name": "PLACEHOLDER"' " \" name\" : \" ${twig_name} \" "
42+ replace_first " $lockfile " ' "version": "PLACEHOLDER"' ' "version": "{{ sdk.version }}"'
43+ replace_first " $lockfile " ' "name": "PLACEHOLDER"' " \" name\" : \" ${twig_name} \" "
44+ replace_first " $lockfile " ' "version": "PLACEHOLDER"' ' "version": "{{ sdk.version }}"'
45+ replace_first " $lockfile " ' "license": "PLACEHOLDER"' ' "license": "{{ sdk.license }}"'
46+
47+ if grep -q ' "PLACEHOLDER"' " $lockfile " ; then
48+ echo " ERROR: unresolved PLACEHOLDER values remain in $lockfile " >&2
49+ return 1
50+ fi
51+ }
52+
53+ restore_twig_bun () {
54+ # Replace PLACEHOLDER in bun.lock with the correct Twig expression.
55+ local lockfile=" $1 "
56+ local twig_name=" $2 "
57+
58+ replace_first " $lockfile " ' "name": "PLACEHOLDER"' " \" name\" : \" ${twig_name} \" "
59+
60+ if grep -q ' "PLACEHOLDER"' " $lockfile " ; then
61+ echo " ERROR: unresolved PLACEHOLDER values remain in $lockfile " >&2
62+ return 1
63+ fi
64+ }
65+
2366update_npm () {
2467 local lang=" $1 "
2568 local extra_flags=" ${2:- } "
69+ local twig_name=" $3 "
2670 local template=" $ROOT /templates/$lang /package.json.twig"
27- local dest=" $ROOT /templates/$lang /package-lock.json"
71+ local dest=" $ROOT /templates/$lang /package-lock.json.twig "
2872 local dir=" $WORKDIR /$lang "
2973
3074 echo " → $lang (npm)"
@@ -33,32 +77,35 @@ update_npm() {
3377 # shellcheck disable=SC2086
3478 (cd " $dir " && npm install --package-lock-only --ignore-scripts --silent $extra_flags 2> /dev/null)
3579 cp " $dir /package-lock.json" " $dest "
36- echo " updated templates/$lang /package-lock.json"
80+ restore_twig_npm " $dest " " $twig_name "
81+ echo " updated templates/$lang /package-lock.json.twig"
3782}
3883
3984update_bun () {
85+ local twig_name=" $1 "
4086 local dir=" $WORKDIR /cli"
4187 local template=" $ROOT /templates/cli/package.json.twig"
42- local dest=" $ROOT /templates/cli/bun.lock"
88+ local dest=" $ROOT /templates/cli/bun.lock.twig "
4389
4490 echo " → cli (bun)"
4591 mkdir -p " $dir "
4692 strip_twig " $template " > " $dir /package.json"
4793 cd " $dir " && bun install --silent 2> /dev/null
4894 cp " $dir /bun.lock" " $dest "
49- echo " updated templates/cli/bun.lock"
95+ restore_twig_bun " $dest " " $twig_name "
96+ echo " updated templates/cli/bun.lock.twig"
5097}
5198
5299case " $TARGET " in
53- web) update_npm web ;;
54- node) update_npm node ;;
55- react-native) update_npm react-native --legacy-peer-deps ;;
56- cli) update_bun ;;
100+ web) update_npm web " " " {{ language.params.npmPackage }} " ;;
101+ node) update_npm node " " " {{ language.params.npmPackage | caseDash }} " ;;
102+ react-native) update_npm react-native --legacy-peer-deps " {{ language.params.npmPackage }} " ;;
103+ cli) update_bun " {{ language.params.npmPackage|caseDash }} " ;;
57104 all)
58- update_npm web
59- update_npm node
60- update_npm react-native --legacy-peer-deps
61- update_bun
105+ update_npm web " " " {{ language.params.npmPackage }} "
106+ update_npm node " " " {{ language.params.npmPackage | caseDash }} "
107+ update_npm react-native --legacy-peer-deps " {{ language.params.npmPackage }} "
108+ update_bun " {{ language.params.npmPackage|caseDash }} "
62109 ;;
63110 * )
64111 echo " Unknown target: $TARGET . Use web | node | react-native | cli | all"
0 commit comments