From cabeda26534df14f58176134dbd0ff23fc180285 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 29 Apr 2026 07:04:41 -0700 Subject: [PATCH 01/24] ci: workflow dispatch --- .github/workflows/secure_nx_release.yml | 66 ++++++++++++++++++++----- 1 file changed, 53 insertions(+), 13 deletions(-) diff --git a/.github/workflows/secure_nx_release.yml b/.github/workflows/secure_nx_release.yml index 63bf00c3e9..05af100a29 100644 --- a/.github/workflows/secure_nx_release.yml +++ b/.github/workflows/secure_nx_release.yml @@ -9,8 +9,18 @@ on: - '*-*' workflow_dispatch: inputs: - dist-tag: - description: "npm dist-tag to use (e.g. latest | next | canary)" + release-type: + description: "Version bump (patch/minor/major publish to npm 'latest'; prerelease uses 'preid')" + required: false + type: choice + options: + - prerelease + - patch + - minor + - major + default: prerelease + preid: + description: "Prerelease identifier (used only when release-type=prerelease; also becomes the npm dist-tag, e.g. next | canary)" required: false type: string default: next @@ -83,16 +93,28 @@ jobs: set -euo pipefail if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" ]]; then - dist_tag="${{ inputs['dist-tag'] }}" + release_type="${{ inputs['release-type'] }}" + preid="${{ inputs['preid'] }}" scope="${{ inputs['release-group'] }}" dry_run="${{ inputs['dry-run'] }}" mode="dispatch" + + # npm dist-tag follows release type: prerelease -> preid, stable -> latest + if [[ "$release_type" == "prerelease" ]]; then + dist_tag="$preid" + else + dist_tag="latest" + fi elif [[ "${GITHUB_REF}" == refs/tags/* ]]; then + release_type="" + preid="" dist_tag="" scope="" dry_run="false" mode="tag" else + release_type="prerelease" + preid="next" dist_tag="next" scope="" dry_run="false" @@ -100,6 +122,8 @@ jobs: fi echo "mode=${mode}" >> "$GITHUB_OUTPUT" + echo "release_type=${release_type}" >> "$GITHUB_OUTPUT" + echo "preid=${preid}" >> "$GITHUB_OUTPUT" echo "dist_tag=${dist_tag}" >> "$GITHUB_OUTPUT" echo "scope=${scope}" >> "$GITHUB_OUTPUT" echo "dry_run=${dry_run}" >> "$GITHUB_OUTPUT" @@ -195,42 +219,56 @@ jobs: if: ${{ steps.ctx.outputs.mode == 'main' && steps.affected.outputs.count == '0' }} run: echo "No affected release projects on main; skipping version + publish." - - name: nx release version (dispatch) + # Orchestrated release: bumps versions, generates changelogs, commits + tags + pushes in one shot. + # --skip-publish keeps publishing as a separate step below so the OIDC token-clearing logic still runs. + - name: nx release version + changelog (dispatch) if: ${{ steps.ctx.outputs.mode == 'dispatch' && !inputs.dry-run }} shell: bash run: | set -euo pipefail scope="${{ steps.ctx.outputs.scope }}" + projects_arg=() if [[ -n "$scope" ]]; then projects_arg=(--projects "$scope") - else - projects_arg=() fi - npx nx release version prerelease \ - --preid "${{ steps.ctx.outputs.dist_tag }}" \ + release_type="${{ steps.ctx.outputs.release_type }}" + preid_arg=() + if [[ "$release_type" == "prerelease" ]]; then + preid_arg=(--preid "${{ steps.ctx.outputs.preid }}") + fi + + npx nx release "$release_type" \ + "${preid_arg[@]}" \ "${projects_arg[@]}" \ + --skip-publish \ --git-commit \ --git-push \ --verbose - - name: nx release version (dispatch, dry-run) + - name: nx release version + changelog (dispatch, dry-run) if: ${{ steps.ctx.outputs.mode == 'dispatch' && inputs.dry-run }} shell: bash run: | set -euo pipefail scope="${{ steps.ctx.outputs.scope }}" + projects_arg=() if [[ -n "$scope" ]]; then projects_arg=(--projects "$scope") - else - projects_arg=() fi - npx nx release version prerelease \ - --preid "${{ steps.ctx.outputs.dist_tag }}" \ + release_type="${{ steps.ctx.outputs.release_type }}" + preid_arg=() + if [[ "$release_type" == "prerelease" ]]; then + preid_arg=(--preid "${{ steps.ctx.outputs.preid }}") + fi + + npx nx release "$release_type" \ + "${preid_arg[@]}" \ "${projects_arg[@]}" \ + --skip-publish \ --verbose \ --dry-run @@ -406,6 +444,8 @@ jobs: echo "Nx Release completed." echo "- mode: ${mode}" + echo "- release-type: '${{ steps.ctx.outputs.release_type }}'" + echo "- preid: '${{ steps.ctx.outputs.preid }}'" 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}" From 34340aa59d400e4106937a866951c4916f761bfb Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 29 Apr 2026 07:27:18 -0700 Subject: [PATCH 02/24] ci: workflow dispatch config [skip ci] --- nx.json | 5 ----- 1 file changed, 5 deletions(-) diff --git a/nx.json b/nx.json index 005f557a1d..8c9e2cb989 100644 --- a/nx.json +++ b/nx.json @@ -133,11 +133,6 @@ "commitReferences": true, "versionTitleDate": true } - }, - "git": { - "commit": false, - "tag": false, - "push": false } }, "releaseTag": { From 5cc62766419d55444a57b2c30b00bee2542ebb7b Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 29 Apr 2026 07:49:46 -0700 Subject: [PATCH 03/24] ci: workflow arguments --- .github/workflows/secure_nx_release.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/secure_nx_release.yml b/.github/workflows/secure_nx_release.yml index 05af100a29..d30ba120a2 100644 --- a/.github/workflows/secure_nx_release.yml +++ b/.github/workflows/secure_nx_release.yml @@ -219,7 +219,8 @@ jobs: if: ${{ steps.ctx.outputs.mode == 'main' && steps.affected.outputs.count == '0' }} run: echo "No affected release projects on main; skipping version + publish." - # Orchestrated release: bumps versions, generates changelogs, commits + tags + pushes in one shot. + # Orchestrated release: bumps versions, generates changelogs, commits + tags in one shot. + # The orchestrator does not accept --git-* flags (config-driven only); push is handled in the next step. # --skip-publish keeps publishing as a separate step below so the OIDC token-clearing logic still runs. - name: nx release version + changelog (dispatch) if: ${{ steps.ctx.outputs.mode == 'dispatch' && !inputs.dry-run }} @@ -243,10 +244,12 @@ jobs: "${preid_arg[@]}" \ "${projects_arg[@]}" \ --skip-publish \ - --git-commit \ - --git-push \ --verbose + - name: Push release commit and tags (dispatch) + if: ${{ steps.ctx.outputs.mode == 'dispatch' && !inputs.dry-run }} + run: git push --follow-tags + - name: nx release version + changelog (dispatch, dry-run) if: ${{ steps.ctx.outputs.mode == 'dispatch' && inputs.dry-run }} shell: bash From 0eed66ccfbd7ab35d3b3feea10016c86eb1d4ab0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 14:56:50 +0000 Subject: [PATCH 04/24] chore(release): publish - project: webpack5 5.0.34 --- packages/webpack5/CHANGELOG.md | 10 ++++++++++ packages/webpack5/package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/webpack5/CHANGELOG.md b/packages/webpack5/CHANGELOG.md index 1367e39762..7d3b728055 100644 --- a/packages/webpack5/CHANGELOG.md +++ b/packages/webpack5/CHANGELOG.md @@ -1,3 +1,13 @@ +## 5.0.34 (2026-04-29) + +### 🩹 Fixes + +- **webpack:** resolve source map path with proper encoding ([#11180](https://github.com/NativeScript/NativeScript/pull/11180)) + +### ❤️ Thank You + +- Nathan Walker + ## 5.0.33 (2026-03-30) ### 🩹 Fixes diff --git a/packages/webpack5/package.json b/packages/webpack5/package.json index f35c6a6c3f..55cbcc3458 100644 --- a/packages/webpack5/package.json +++ b/packages/webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "5.0.34-next.2", + "version": "5.0.34", "private": false, "main": "dist/index.js", "files": [ From 2657df4a7714dadfa2872f016b94729ae76d9846 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 29 Apr 2026 12:33:49 -0700 Subject: [PATCH 05/24] fix(webpack): inline sourcemaps (#11188) --- .../plugins/FixSourceMapUrlPlugin.spec.ts | 75 ---------- packages/webpack5/src/configuration/base.ts | 20 ++- .../src/plugins/FixSourceMapUrlPlugin.ts | 130 ------------------ 3 files changed, 8 insertions(+), 217 deletions(-) delete mode 100644 packages/webpack5/__tests__/plugins/FixSourceMapUrlPlugin.spec.ts delete mode 100644 packages/webpack5/src/plugins/FixSourceMapUrlPlugin.ts diff --git a/packages/webpack5/__tests__/plugins/FixSourceMapUrlPlugin.spec.ts b/packages/webpack5/__tests__/plugins/FixSourceMapUrlPlugin.spec.ts deleted file mode 100644 index 55b471880b..0000000000 --- a/packages/webpack5/__tests__/plugins/FixSourceMapUrlPlugin.spec.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { resolve } from 'path'; -import { pathToFileURL } from 'url'; - -import FixSourceMapUrlPlugin from '../../src/plugins/FixSourceMapUrlPlugin'; - -function createCompiler() { - let emitHandler: ((compilation: any) => void) | undefined; - - return { - compiler: { - hooks: { - emit: { - tap(_name: string, handler: (compilation: any) => void) { - emitHandler = handler; - }, - }, - }, - } as any, - run(compilation: any) { - if (!emitHandler) { - throw new Error('Expected emit hook to be registered.'); - } - - emitHandler(compilation); - }, - }; -} - -function createCompilation(source: string) { - return { - assets: { - 'bundle.js': { - source: () => source, - size: () => source.length, - }, - }, - }; -} - -describe('FixSourceMapUrlPlugin', () => { - it('encodes spaces in rewritten source map urls', () => { - const outputPath = '/Users/test/my tns app/platforms/android/dist'; - const { compiler, run } = createCompiler(); - - new FixSourceMapUrlPlugin({ outputPath }).apply(compiler); - - const compilation = createCompilation( - 'console.log("test");\n//# sourceMappingURL=bundle.js.map', - ); - run(compilation); - - expect(compilation.assets['bundle.js'].source()).toContain( - `//# sourceMappingURL=${pathToFileURL(resolve(outputPath, 'bundle.js.map')).toString()}`, - ); - expect(compilation.assets['bundle.js'].source()).toContain('%20'); - }); - - it('leaves absolute source map urls unchanged', () => { - const outputPath = '/Users/test/my tns app/platforms/android/dist'; - const existingUrl = - 'file:///Users/test/my%20tns%20app/platforms/android/dist/bundle.js.map'; - const { compiler, run } = createCompiler(); - - new FixSourceMapUrlPlugin({ outputPath }).apply(compiler); - - const compilation = createCompilation( - `console.log("test");\n//# sourceMappingURL=${existingUrl}`, - ); - run(compilation); - - expect(compilation.assets['bundle.js'].source()).toContain( - `//# sourceMappingURL=${existingUrl}`, - ); - }); -}); diff --git a/packages/webpack5/src/configuration/base.ts b/packages/webpack5/src/configuration/base.ts index 516347c240..79fa1bb725 100644 --- a/packages/webpack5/src/configuration/base.ts +++ b/packages/webpack5/src/configuration/base.ts @@ -24,7 +24,6 @@ import { applyDotEnvPlugin } from '../helpers/dotEnv'; import { env as _env, IWebpackEnv } from '../index'; import { getValue } from '../helpers/config'; import { getIPS } from '../helpers/host'; -import FixSourceMapUrlPlugin from '../plugins/FixSourceMapUrlPlugin'; import { getAvailablePlatforms, getAbsoluteDistPath, @@ -42,12 +41,16 @@ export default function (config: Config, env: IWebpackEnv = _env): Config { // set mode config.mode(mode); - // use source map files by default with v9+ + // Inline source maps for v9+ dev builds. + // Chrome DevTools cannot fetch external .map files in this debugging + // flow: bundled DevTools blocks http:// via CSP, the appspot frontend + // hits the same CSP, and the iOS V8 inspector backend fetch is blocked + // by App Transport Security. A `data:` URL inlined in the bundle + // sidesteps all three since DevTools handles it without any network + // request. Production builds keep their configured devtool unchanged. function useSourceMapFiles() { if (mode === 'development') { - // in development we always use source-map files with v9+ runtimes - // they are parsed and mapped to display in-flight app error screens - env.sourceMap = 'source-map'; + env.sourceMap = 'inline-source-map'; } } // determine target output by @nativescript/* runtime version @@ -184,13 +187,6 @@ export default function (config: Config, env: IWebpackEnv = _env): Config { // Use devtool for both CommonJS and ESM - let webpack handle source mapping properly config.devtool(sourceMapType); - // For ESM builds, fix the sourceMappingURL to use correct paths - if (sourceMapType && sourceMapType !== 'hidden-source-map') { - config - .plugin('FixSourceMapUrlPlugin') - .use(FixSourceMapUrlPlugin as any, [{ outputPath }]); - } - // when using hidden-source-map, output source maps to the `platforms/{platformName}-sourceMaps` folder if (env.sourceMap === 'hidden-source-map') { const sourceMapAbsolutePath = getProjectFilePath( diff --git a/packages/webpack5/src/plugins/FixSourceMapUrlPlugin.ts b/packages/webpack5/src/plugins/FixSourceMapUrlPlugin.ts deleted file mode 100644 index 1ae51b2d06..0000000000 --- a/packages/webpack5/src/plugins/FixSourceMapUrlPlugin.ts +++ /dev/null @@ -1,130 +0,0 @@ -import { resolve } from 'path'; -import { pathToFileURL } from 'url'; -import type { Compiler } from 'webpack'; -import { sources } from 'webpack'; - -export interface FixSourceMapUrlPluginOptions { - outputPath: string; -} - -/** - * Ensures sourceMappingURL points to the actual file:// location on device/emulator. - * Handles Webpack 5 asset sources (string/Buffer/Source objects). - */ -export default class FixSourceMapUrlPlugin { - constructor(private readonly options: FixSourceMapUrlPluginOptions) {} - - apply(compiler: Compiler) { - const wp: any = (compiler as any).webpack; - const hasProcessAssets = - !!wp?.Compilation?.PROCESS_ASSETS_STAGE_DEV_TOOLING && - !!(compiler as any).hooks?.thisCompilation; - - const getSourceMapUrl = (sourceMapPath: string): string => { - if (/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(sourceMapPath)) { - return sourceMapPath; - } - - return pathToFileURL( - resolve(this.options.outputPath, sourceMapPath), - ).toString(); - }; - - const toStringContent = (content: any): string => { - if (typeof content === 'string') return content; - if (Buffer.isBuffer(content)) return content.toString('utf-8'); - if (content && typeof content.source === 'function') { - const inner = content.source(); - if (typeof inner === 'string') return inner; - if (Buffer.isBuffer(inner)) return inner.toString('utf-8'); - try { - return String(inner); - } catch { - return ''; - } - } - try { - return String(content); - } catch { - return ''; - } - }; - - const processFile = (filename: string, compilation: any) => { - if (!(filename.endsWith('.mjs') || filename.endsWith('.js'))) return; - - // Support both legacy compilation.assets and v5 Asset API - let rawSource: any; - if (typeof (compilation as any).getAsset === 'function') { - const assetObj = (compilation as any).getAsset(filename); - if (assetObj && assetObj.source) { - rawSource = (assetObj.source as any).source - ? (assetObj.source as any).source() - : (assetObj.source as any)(); - } - } - if ( - rawSource === undefined && - (compilation as any).assets && - (compilation as any).assets[filename] - ) { - const asset = (compilation as any).assets[filename]; - rawSource = typeof asset.source === 'function' ? asset.source() : asset; - } - - let source = toStringContent(rawSource); - // Replace sourceMappingURL to use file:// protocol pointing to actual location - source = source.replace( - /\/\/\# sourceMappingURL=(.+\.map(?:\?[^\s]*)?)/g, - (_match, sourceMapPath: string) => - `//# sourceMappingURL=${getSourceMapUrl(sourceMapPath)}`, - ); - - // Prefer Webpack 5 updateAsset with RawSource when available - const RawSourceCtor = - wp?.sources?.RawSource || (sources as any)?.RawSource; - if ( - typeof (compilation as any).updateAsset === 'function' && - RawSourceCtor - ) { - (compilation as any).updateAsset(filename, new RawSourceCtor(source)); - } else { - (compilation as any).assets[filename] = { - source: () => source, - size: () => source.length, - }; - } - }; - - if (hasProcessAssets) { - compiler.hooks.thisCompilation.tap( - 'FixSourceMapUrlPlugin', - (compilation: any) => { - // IMPORTANT: - // Run AFTER SourceMapDevToolPlugin has emitted external map assets. - // If we run at DEV_TOOLING and replace sources, we may drop mapping info - // before Webpack has a chance to write .map files. SUMMARIZE happens later. - const stage = - wp.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE || - // Fallback to DEV_TOOLING if summarize is unavailable - wp.Compilation.PROCESS_ASSETS_STAGE_DEV_TOOLING; - compilation.hooks.processAssets.tap( - { name: 'FixSourceMapUrlPlugin', stage }, - (assets: Record) => { - Object.keys(assets).forEach((filename) => - processFile(filename, compilation), - ); - }, - ); - }, - ); - } else { - // Fallback for older setups: use emit (may log deprecation in newer webpack) - compiler.hooks.emit.tap('FixSourceMapUrlPlugin', (compilation: any) => { - Object.keys((compilation as any).assets).forEach((filename) => - processFile(filename, compilation), - ); - }); - } - } -} From ec68a195ecf2f056721cc47bc4da364af4ebe8f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 20:36:32 +0000 Subject: [PATCH 06/24] chore(release): publish - project: webpack5 5.0.35 --- packages/webpack5/CHANGELOG.md | 10 ++++++++++ packages/webpack5/package.json | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/webpack5/CHANGELOG.md b/packages/webpack5/CHANGELOG.md index 7d3b728055..f95e2e4fe9 100644 --- a/packages/webpack5/CHANGELOG.md +++ b/packages/webpack5/CHANGELOG.md @@ -1,3 +1,13 @@ +## 5.0.35 (2026-04-29) + +### 🩹 Fixes + +- **webpack:** inline sourcemaps ([#11188](https://github.com/NativeScript/NativeScript/pull/11188)) + +### ❤️ Thank You + +- Nathan Walker + ## 5.0.34 (2026-04-29) ### 🩹 Fixes diff --git a/packages/webpack5/package.json b/packages/webpack5/package.json index 55cbcc3458..50d0560e15 100644 --- a/packages/webpack5/package.json +++ b/packages/webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "5.0.34", + "version": "5.0.35", "private": false, "main": "dist/index.js", "files": [ From c9d8433d7a2cc3dfafdd8ed32f27110b0c69b804 Mon Sep 17 00:00:00 2001 From: Osei Fortune Date: Mon, 4 May 2026 15:29:32 -0400 Subject: [PATCH 07/24] fix(ios): enableSwipeBackNavigation on ios 26+ (#11211) --- packages/core/ui/page/index.ios.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/core/ui/page/index.ios.ts b/packages/core/ui/page/index.ios.ts index 36ccdd67bc..c6063302ca 100644 --- a/packages/core/ui/page/index.ios.ts +++ b/packages/core/ui/page/index.ios.ts @@ -189,9 +189,15 @@ class UIViewControllerImpl extends UIViewController { // only consider when interactive transitions are not enabled navigationController.interactivePopGestureRecognizer.delegate = navigationController; navigationController.interactivePopGestureRecognizer.enabled = owner.enableSwipeBackNavigation; + if (SDK_VERSION >= 26) { + navigationController.interactiveContentPopGestureRecognizer.enabled = owner.enableSwipeBackNavigation; + } } } else { navigationController.interactivePopGestureRecognizer.enabled = false; + if (SDK_VERSION >= 26) { + navigationController.interactiveContentPopGestureRecognizer.enabled = false; + } } } } @@ -462,10 +468,16 @@ export class Page extends PageBase { public _updateEnableSwipeBackNavigation(enabled: boolean) { const navController = this._ios.navigationController; - if (this.frame && navController && navController.interactivePopGestureRecognizer) { + if (this.frame && navController) { // Make sure we don't set true if cannot go back enabled = enabled && this.frame.canGoBack(); - navController.interactivePopGestureRecognizer.enabled = enabled; + if (navController.interactivePopGestureRecognizer) { + navController.interactivePopGestureRecognizer.enabled = enabled; + } + + if (SDK_VERSION >= 26 && navController.interactiveContentPopGestureRecognizer) { + navController.interactiveContentPopGestureRecognizer.enabled = enabled; + } } } From 0c8229c6c84b51f6253eeb757e27f6bc8ffaf9ae Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 19:31:18 +0000 Subject: [PATCH 08/24] chore(release): publish - project: webpack5 5.0.36-next.0 - project: core 9.0.19-next.2 --- 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 193c7322dd..937baae32a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/core", - "version": "9.0.19-next.1", + "version": "9.0.19-next.2", "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 18b4f7f1b2..167e2d8b2c 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/devtools", - "version": "0.0.5", + "version": "0.0.6", "private": true, "files": [ "./dist/" @@ -10,6 +10,6 @@ "prepack": "tsc || echo ok" }, "devDependencies": { - "@nativescript/core": "9.0.19-next.1" + "@nativescript/core": "9.0.19-next.2" } } diff --git a/packages/vite/package.json b/packages/vite/package.json index 4d7391d300..da77e86008 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/vite", - "version": "1.0.9", + "version": "1.0.10", "description": "Vite for NativeScript", "main": "./index.js", "module": "./index.js", diff --git a/packages/webpack5/package.json b/packages/webpack5/package.json index 50d0560e15..5d6634f941 100644 --- a/packages/webpack5/package.json +++ b/packages/webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "5.0.35", + "version": "5.0.36-next.0", "private": false, "main": "dist/index.js", "files": [ From fe51a1441a5974bf42b7593417378382b08066bb Mon Sep 17 00:00:00 2001 From: Dimitris-Rafail Katsampas Date: Sun, 17 May 2026 21:48:23 +0300 Subject: [PATCH 09/24] fix(android): correct TabView fragment manager resolution (#11217) --- packages/core/ui/tab-view/index.android.ts | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/packages/core/ui/tab-view/index.android.ts b/packages/core/ui/tab-view/index.android.ts index be11df1e58..03191034c0 100644 --- a/packages/core/ui/tab-view/index.android.ts +++ b/packages/core/ui/tab-view/index.android.ts @@ -383,26 +383,7 @@ export class TabViewItem extends TabViewItemBase { public _getChildFragmentManager(): androidx.fragment.app.FragmentManager { const tabView = this.parent as TabView; - let tabFragment = null; - const fragmentManager = tabView._getFragmentManager(); - const fragments = fragmentManager.getFragments().toArray(); - for (let i = 0; i < fragments.length; i++) { - if (fragments[i].index === this.index) { - tabFragment = fragments[i]; - break; - } - } - - // TODO: can happen in a modal tabview scenario when the modal dialog fragment is already removed - if (!tabFragment) { - if (Trace.isEnabled()) { - Trace.write(`Could not get child fragment manager for tab item with index ${this.index}`, traceCategory); - } - - return (tabView)._getRootFragmentManager(); - } - - return tabFragment.getChildFragmentManager(); + return (tabView)._getRootFragmentManager(); } [fontSizeProperty.getDefault](): { nativeSize: number } { From 43d88822783c29c2fe36e1fdcea749f010d01ead Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 17 May 2026 18:50:05 +0000 Subject: [PATCH 10/24] chore(release): publish - project: webpack5 5.0.36-next.1 - project: core 9.0.19-next.3 --- 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 937baae32a..841e48ed6b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/core", - "version": "9.0.19-next.2", + "version": "9.0.19-next.3", "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 167e2d8b2c..f61160c779 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/devtools", - "version": "0.0.6", + "version": "0.0.7", "private": true, "files": [ "./dist/" @@ -10,6 +10,6 @@ "prepack": "tsc || echo ok" }, "devDependencies": { - "@nativescript/core": "9.0.19-next.2" + "@nativescript/core": "9.0.19-next.3" } } diff --git a/packages/vite/package.json b/packages/vite/package.json index da77e86008..0ab2fdc905 100644 --- a/packages/vite/package.json +++ b/packages/vite/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/vite", - "version": "1.0.10", + "version": "1.0.11", "description": "Vite for NativeScript", "main": "./index.js", "module": "./index.js", diff --git a/packages/webpack5/package.json b/packages/webpack5/package.json index 5d6634f941..2de5cbbe57 100644 --- a/packages/webpack5/package.json +++ b/packages/webpack5/package.json @@ -1,6 +1,6 @@ { "name": "@nativescript/webpack", - "version": "5.0.36-next.0", + "version": "5.0.36-next.1", "private": false, "main": "dist/index.js", "files": [ From 7a3552a2af8501d61b73e6b15db97a197bc9ec8d Mon Sep 17 00:00:00 2001 From: Dimitris-Rafail Katsampas Date: Sun, 17 May 2026 23:00:36 +0300 Subject: [PATCH 11/24] fix(ios): layout validity status during layout changed event (#11218) --- apps/automated/src/ui/image/image-tests.ts | 12 ++++-------- apps/automated/src/ui/label/label-tests.ts | 6 ++---- .../src/ui/view/view-tests-layout-event.ts | 17 +++++++++++++++++ packages/core/ui/core/view/index.ios.ts | 8 +++----- packages/core/ui/core/view/view-common.ts | 9 +-------- 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/apps/automated/src/ui/image/image-tests.ts b/apps/automated/src/ui/image/image-tests.ts index 20e129e235..50edc44da2 100644 --- a/apps/automated/src/ui/image/image-tests.ts +++ b/apps/automated/src/ui/image/image-tests.ts @@ -268,10 +268,8 @@ export const test_SettingImageSourceWhenSizedToParentDoesNotRequestLayout = ios( let mainPage = helper.getCurrentPage(); mainPage.content = host; - const nativeHostView = host.nativeViewProtected as UIView; - - // Check if native view layer is still marked as dirty before proceeding - TKUnit.waitUntilReady(() => host.isLoaded && nativeHostView?.layer && !nativeHostView.layer.needsLayout()); + // Check if view is loaded and layout is valid + TKUnit.waitUntilReady(() => host.isLoaded && host.isLayoutValid); let called = false; image.requestLayout = () => (called = true); @@ -290,10 +288,8 @@ export const test_SettingImageSourceWhenFixedWidthAndHeightDoesNotRequestLayout let mainPage = helper.getCurrentPage(); mainPage.content = host; - const nativeHostView = host.nativeViewProtected as UIView; - - // Check if native view layer is still marked as dirty before proceeding - TKUnit.waitUntilReady(() => host.isLoaded && nativeHostView?.layer && !nativeHostView.layer.needsLayout()); + // Check if view is loaded and layout is valid + TKUnit.waitUntilReady(() => host.isLoaded && host.isLayoutValid); let called = false; image.requestLayout = () => (called = true); diff --git a/apps/automated/src/ui/label/label-tests.ts b/apps/automated/src/ui/label/label-tests.ts index 9696aca3fe..508e0f7d87 100644 --- a/apps/automated/src/ui/label/label-tests.ts +++ b/apps/automated/src/ui/label/label-tests.ts @@ -602,10 +602,8 @@ export class LabelTest extends testModule.UITest