From f1678ed8b757723ee2df8f298bd4f5f58a996d30 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 30 Mar 2026 09:55:56 -0700 Subject: [PATCH 01/21] fix(ios): scene notify first launch (#11149) --- packages/core/application/application.ios.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/core/application/application.ios.ts b/packages/core/application/application.ios.ts index fca05bf8bf..0a581e5ffc 100644 --- a/packages/core/application/application.ios.ts +++ b/packages/core/application/application.ios.ts @@ -186,6 +186,8 @@ class SceneDelegate extends UIResponder implements UIWindowSceneDelegate { return; } + const isFirstScene = !Application.ios.getPrimaryScene() && !Application.hasLaunched(); + this._scene = scene; // Create window for this scene @@ -221,7 +223,7 @@ class SceneDelegate extends UIResponder implements UIWindowSceneDelegate { } // If this is the first scene, trigger app startup - if (!Application.ios.getPrimaryScene()) { + if (isFirstScene) { Application.ios._notifySceneAppStarted(); } } @@ -905,8 +907,11 @@ export class iOSApplication extends ApplicationCommon { setiOSWindow(window); } - // Set up the window content for the primary scene - this.setWindowContent(); + // During initial scene startup we must wait for launch to be notified first. + // Some frameworks provide root content from launch handlers. + if (this.hasLaunched()) { + this.setWindowContent(); + } } } From db292be99235fdbda20ee5108541f37887a9e30a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 16:57:34 +0000 Subject: [PATCH 02/21] chore(release): publish - project: devtools 0.0.2-next.33 - project: webpack5 5.0.33-next.4 - project: core 9.0.18-next.7 - project: vite 1.0.6-next.33 --- packages/core/package.json | 2 +- packages/devtools/package.json | 4 ++-- packages/vite/package.json | 2 +- packages/webpack5/package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index b7d10c2766..a1d0161467 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/core", - "version": "9.0.18-next.6", + "version": "9.0.18-next.7", "description": "A JavaScript library providing an easy to use api for interacting with iOS and Android platform APIs.", "type": "module", "main": "index", diff --git a/packages/devtools/package.json b/packages/devtools/package.json index 0b095dc152..76fbba0255 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/devtools", - "version": "0.0.2-next.32", + "version": "0.0.2-next.33", "private": true, "files": [ "./dist/" @@ -10,6 +10,6 @@ "prepack": "tsc || echo ok" }, "devDependencies": { - "@nativescript/core": "9.0.18-next.6" + "@nativescript/core": "9.0.18-next.7" } } diff --git a/packages/vite/package.json b/packages/vite/package.json index bd049e471a..a58b48dd33 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/vite", - "version": "1.0.6-next.32", + "version": "1.0.6-next.33", "description": "Vite for NativeScript", "main": "./index.js", "module": "./index.js", diff --git a/packages/webpack5/package.json b/packages/webpack5/package.json index ccd9ca2372..d2f5e7b491 100644 --- a/packages/webpack5/package.json +++ b/packages/webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "5.0.33-next.3", + "version": "5.0.33-next.4", "private": false, "main": "dist/index.js", "files": [ From 7c6ebd95c5774779a5ae5923f710829597c818eb Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Mon, 30 Mar 2026 11:30:18 -0700 Subject: [PATCH 03/21] chore: allowlist for next tags --- .github/workflows/secure_nx_release.yml | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/.github/workflows/secure_nx_release.yml b/.github/workflows/secure_nx_release.yml index 643e3ff14b..2905db6b4a 100644 --- a/.github/workflows/secure_nx_release.yml +++ b/.github/workflows/secure_nx_release.yml @@ -45,6 +45,7 @@ jobs: env: # Optional: provide Nx Cloud token if used in this repo NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_CLOUD_ACCESS_TOKEN }} + NEXT_PRERELEASE_PROJECT_ALLOWLIST: core,webpack5 steps: - name: Harden the runner (Audit all outbound calls) @@ -124,8 +125,8 @@ jobs: fi fi - # Only consider libs under packages/* and exclude items configured as non-releaseable. - affected_json=$(npx nx show projects --affected --base "$base" --head "$head" --type lib --projects "packages/*" --exclude "ui-mobile-base,types-minimal,winter-tc,types,types-ios,types-android" --json) + # Only consider main-branch prerelease libraries allowed for automatic next publishes. + affected_json=$(npx nx show projects --affected --base "$base" --head "$head" --type lib --projects "$NEXT_PRERELEASE_PROJECT_ALLOWLIST" --json) affected_list=$(printf '%s' "$affected_json" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{const a=JSON.parse(s||"[]");process.stdout.write(a.join(","));});') affected_count=$(printf '%s' "$affected_json" | node -e 'let s="";process.stdin.on("data",d=>s+=d).on("end",()=>{const a=JSON.parse(s||"[]");process.stdout.write(String(a.length));});') @@ -337,7 +338,6 @@ jobs: - name: nx release publish (token, dispatch) if: ${{ steps.ctx.outputs.mode == 'dispatch' && steps.ctx.outputs.dry_run != 'true' && vars.USE_NPM_TOKEN == 'true' }} - shell: bash env: NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} NPM_CONFIG_PROVENANCE: true @@ -353,7 +353,6 @@ jobs: - name: nx release publish (token, dispatch dry-run) if: ${{ steps.ctx.outputs.mode == 'dispatch' && inputs.dry-run && vars.USE_NPM_TOKEN == 'true' }} - shell: bash env: NODE_AUTH_TOKEN: ${{ secrets.NPM_PUBLISH_TOKEN }} NPM_CONFIG_PROVENANCE: true @@ -403,9 +402,23 @@ jobs: - name: Summary if: always() run: | + mode="${{ steps.ctx.outputs.mode }}" + echo "Nx Release completed." - echo "- mode: ${{ steps.ctx.outputs.mode }}" + echo "- mode: ${mode}" echo "- dist-tag: ${{ steps.ctx.outputs.mode == 'tag' && steps.taginfo.outputs.dist_tag || steps.ctx.outputs.dist_tag }}" echo "- scope: '${{ steps.ctx.outputs.scope }}'" + echo "- next-prerelease-allowlist: ${NEXT_PRERELEASE_PROJECT_ALLOWLIST}" + if [[ "$mode" == "main" ]]; then + echo "- projects: ${{ steps.affected.outputs.projects }}" + elif [[ "$mode" == "dispatch" ]]; then + if [[ -n "${{ steps.ctx.outputs.scope }}" ]]; then + echo "- projects: ${{ steps.ctx.outputs.scope }}" + else + echo "- projects: all configured release projects" + fi + else + echo "- project: ${{ steps.taginfo.outputs.project }}" + fi echo "- dry-run: ${{ steps.ctx.outputs.dry_run }}" echo "- use-token: ${{ vars.USE_NPM_TOKEN == 'true' }}" From e6af168b0ca83c408e56f61240fac8d061a29a9f Mon Sep 17 00:00:00 2001 From: xieweilyg Date: Tue, 31 Mar 2026 02:35:15 +0800 Subject: [PATCH 04/21] fix(ios): guard against non-string imageURI in createUIImageFromURI (#11144) --- packages/core/ui/styling/background.ios.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/core/ui/styling/background.ios.ts b/packages/core/ui/styling/background.ios.ts index 613971e528..315a1b5988 100644 --- a/packages/core/ui/styling/background.ios.ts +++ b/packages/core/ui/styling/background.ios.ts @@ -184,6 +184,10 @@ export namespace ios { const style = view.style; if (imageURI) { + if (typeof imageURI !== 'string') { + callback(null); + return; + } const match = imageURI.match(uriPattern); if (match && match[2]) { imageURI = match[2]; From 938090e816490a5e357e21de523f21c3849860cc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Mar 2026 18:36:47 +0000 Subject: [PATCH 05/21] chore(release): publish - project: webpack5 5.0.33-next.5 - project: core 9.0.18-next.8 --- packages/core/package.json | 2 +- packages/devtools/package.json | 4 ++-- packages/vite/package.json | 2 +- packages/webpack5/package.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index a1d0161467..49a1b6a500 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/core", - "version": "9.0.18-next.7", + "version": "9.0.18-next.8", "description": "A JavaScript library providing an easy to use api for interacting with iOS and Android platform APIs.", "type": "module", "main": "index", diff --git a/packages/devtools/package.json b/packages/devtools/package.json index 76fbba0255..bf1683135f 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/devtools", - "version": "0.0.2-next.33", + "version": "0.0.2", "private": true, "files": [ "./dist/" @@ -10,6 +10,6 @@ "prepack": "tsc || echo ok" }, "devDependencies": { - "@nativescript/core": "9.0.18-next.7" + "@nativescript/core": "9.0.18-next.8" } } diff --git a/packages/vite/package.json b/packages/vite/package.json index a58b48dd33..03653b5bb7 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/vite", - "version": "1.0.6-next.33", + "version": "1.0.6", "description": "Vite for NativeScript", "main": "./index.js", "module": "./index.js", diff --git a/packages/webpack5/package.json b/packages/webpack5/package.json index d2f5e7b491..da31b61ef0 100644 --- a/packages/webpack5/package.json +++ b/packages/webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "5.0.33-next.4", + "version": "5.0.33-next.5", "private": false, "main": "dist/index.js", "files": [ From 2a090cc08f989dfac54fce7e85611b1033f2ccbe Mon Sep 17 00:00:00 2001 From: Abdelkarim Ait Bourich <142545968+VeinDevTtv@users.noreply.github.com> Date: Mon, 30 Mar 2026 11:57:45 -0700 Subject: [PATCH 06/21] fix(ios): liquid glass flexbox (#11134) --- .../src/ui/layouts/flexbox-layout-tests.ts | 38 ++++++++++++ apps/toolbox/src/pages/glass-effects.xml | 26 ++++++++- packages/core/ui/core/view/index.ios.ts | 12 ++-- .../liquid-glass-container/index.ios.ts | 56 ++++++++++++++++-- .../core/ui/layouts/liquid-glass/index.ios.ts | 58 +++++++++++++++++-- packages/core/utils/constants.ios.ts | 1 + 6 files changed, 174 insertions(+), 17 deletions(-) diff --git a/apps/automated/src/ui/layouts/flexbox-layout-tests.ts b/apps/automated/src/ui/layouts/flexbox-layout-tests.ts index 3bbe457cdc..2f562cf4db 100644 --- a/apps/automated/src/ui/layouts/flexbox-layout-tests.ts +++ b/apps/automated/src/ui/layouts/flexbox-layout-tests.ts @@ -1746,3 +1746,41 @@ export const testFlexboxLayout_does_not_crash_with_proxy_view_container = test(a // Omit testDivider_directionRow_verticalBeginning // Omit divider test family, we don't draw dividers + +let activity_liquidglass_flexbox_layout = () => + getViews( + ` + + + `, + ); + +export const testLiquidGlassFlexboxLayout = test(activity_liquidglass_flexbox_layout, noop, ({ flexbox, text1, text2, text3 }) => { + isTopAlignedWith(text1, flexbox); + isLeftAlignedWith(text1, flexbox); + isRightOf(text2, text1); + isTopAlignedWith(text2, flexbox); + isRightOf(text3, text2); + isTopAlignedWith(text3, flexbox); + + equal(width(flexbox), width(text1) + width(text2) + width(text3)); + // Layout helpers report device pixels, so fixed XML DIP sizes must be converted too. + closeEnough(height(flexbox), dipToDp(300)); +}); + +export const testLiquidGlassViews_do_not_crash_when_updating_iosGlassEffect = test(activity_liquidglass_flexbox_layout, noop, ({ root, text1, text2 }) => { + const liquidGlass = text1 as unknown as View; + const liquidGlassContainer = text2 as unknown as View; + + TKUnit.assertTrue(liquidGlass.nativeViewProtected instanceof UIVisualEffectView, 'LiquidGlass should create a UIVisualEffectView host.'); + TKUnit.assertTrue(liquidGlassContainer.nativeViewProtected instanceof UIVisualEffectView, 'LiquidGlassContainer should create a UIVisualEffectView host.'); + + liquidGlass.iosGlassEffect = 'regular'; + liquidGlassContainer.iosGlassEffect = { variant: 'clear', spacing: 12 }; + liquidGlass.iosGlassEffect = 'none'; + liquidGlassContainer.iosGlassEffect = 'none'; + + waitUntilTestElementLayoutIsValid(root); + TKUnit.assertTrue(root.isLoaded, 'Liquid glass view tree should remain loaded after glass effect updates.'); +}); diff --git a/apps/toolbox/src/pages/glass-effects.xml b/apps/toolbox/src/pages/glass-effects.xml index 58601674af..c457ccf70b 100644 --- a/apps/toolbox/src/pages/glass-effects.xml +++ b/apps/toolbox/src/pages/glass-effects.xml @@ -15,13 +15,13 @@