Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/Build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,6 @@ jobs:
- name: "Installing dependencies"
run: pnpm install
- name: "Running build for development"
run: pnpm -r --filter=$(if [ "${{ steps.files.outputs.global_files }}" = "" ] && ${{ github.event_name == 'pull_request' }}; then echo '...[origin/main]'; else echo '**'; fi) run build
run: pnpm -r --filter='!native-widgets' --filter=$(if [ "${{ steps.files.outputs.global_files }}" = "" ] && ${{ github.event_name == 'pull_request' }}; then echo '...[origin/main]'; else echo '**'; fi) run build
env:
NODE_OPTIONS: --max_old_space_size=8192
19 changes: 19 additions & 0 deletions packages/jsActions/mobile-resources-native/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

## [Unreleased]

## [11.4.1] Native Mobile Resources - 2026-3-14

## [2.0.2] GalleryTextFilter

### Fixed

- Fixed VoiceOver/TalkBack not announcing the clear text button.

## [1.1.1] Switch

### Added

- Added the ability to change the position of the label in horizontal view from the left side of the switch to the right side.

### Fixed

- We fixed an issue where the validation message was rendered inside the view container of the switch, which caused incorrect styling of the switch.
- Fixed an issue where two overlapping tracks were seen in IOS, giving a inconsistent look to switch.

## [11.4.0] Native Mobile Resources - 2026-3-5

- We fixed native file system module reference.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@

<body>
<div id="application-info" style="visibility: hidden" data-template="">
Siemens Mendix Native Mobile Resources 11.4.0 -
Siemens Mendix Native Mobile Resources 11.4.1 -
</div>
<div id="template">
Siemens Third-Party Software Disclosure Document<br /><br />English / English<br />Note to Resellers: Please
Expand Down
4 changes: 3 additions & 1 deletion packages/jsActions/mobile-resources-native/package.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
{
"name": "mobile-resources-native",
"moduleName": "Native Mobile Resources",
"version": "11.4.0",
"version": "11.4.1",
"license": "Apache-2.0",
"copyright": "© Mendix Technology BV 2022. All rights reserved.",
"repository": {
"type": "git",
"url": "https://github.com/mendix/native-widgets.git"
},
"marketplace": {
"name": "Native Mobile Resources",
"description": "Download this module to access a rich set of widgets and nanoflow actions created for native mobile, including authentication, network, platform, and more. A must-have for native mobile development!",
"minimumMXVersion": "11.7.0",
"marketplaceId": 109513
},
Expand Down
2 changes: 2 additions & 0 deletions packages/jsActions/nanoflow-actions-native/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
"url": "https://github.com/mendix/native-widgets.git"
},
"marketplace": {
"name": "Nanoflow Commons",
"description": "The Nanoflow Commons module contains commonly used nanoflow actions that are usable across web, hybrid mobile, and native mobile apps, such as: client activities, geo location, local storage, & more.",
"minimumMXVersion": "11.7.0",
"marketplaceId": 109515
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

## [Unreleased]

## [2.0.2] - 2026-3-14

### Fixed

- Fixed VoiceOver/TalkBack not announcing the clear text button.
Expand Down
2 changes: 2 additions & 0 deletions packages/pluggableWidgets/switch-native/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),

## [Unreleased]

## [1.1.1] - 2026-3-14

### Added

- Added the ability to change the position of the label in horizontal view from the left side of the switch to the right side.
Expand Down
62 changes: 45 additions & 17 deletions scripts/release/marketplaceRelease.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,12 @@ main().catch(e => {
});

async function main() {
const pkgPath = join(process.cwd(), "package.json");
const {
name,
widgetName,
version,
marketplace: { minimumMXVersion, marketplaceId }
} = require(pkgPath);
} = packageMetadata();

console.log(`Starting release process for tag ${process.env.TAG}`);

Expand Down Expand Up @@ -53,30 +52,47 @@ async function uploadModuleToAppStore(pkgName, marketplaceId, version, minimumMX

async function getGithubAssetUrl() {
console.log("Retrieving informations from Github Tag");
const request = await fetch("GET", "https://api.github.com/repos/mendix/native-widgets/releases?per_page=10");
const data = (await request) ?? [];
const releaseId = data.find(info => info.tag_name === process.env.TAG)?.id;
if (!releaseId) {
throw new Error(`Could not find release with tag ${process.env.TAG} on GitHub`);
}
const assetsRequest = await fetch(
"GET",
`https://api.github.com/repos/mendix/native-widgets/releases/${releaseId}/assets`
);
const assetsData = (await assetsRequest) ?? [];
const downloadUrl = assetsData.find(asset => asset.name.endsWith(".mpk"))?.browser_download_url;
if (!downloadUrl) {
throw new Error(`Could not retrieve MPK url from GitHub release with tag ${process.env.TAG}`);
const tag = process.env.TAG;
// Use direct tag lookup endpoint instead of listing releases
// This avoids pagination issues and is more reliable
const maxRetries = 5;
const retryDelayMs = 5000;

for (let attempt = 1; attempt <= maxRetries; attempt++) {
console.log(`Attempt ${attempt}/${maxRetries}: Fetching release for tag ${tag}`);

const releaseData = await fetch(
"GET",
`https://api.github.com/repos/mendix/native-widgets/releases/tags/${tag}`
);

if (releaseData && releaseData.id) {
console.log(`Found release: ${releaseData.name} (id: ${releaseData.id})`);
const downloadUrl = releaseData.assets?.find(asset => asset.name.endsWith(".mpk"))?.browser_download_url;
if (!downloadUrl) {
throw new Error(`Could not retrieve MPK url from GitHub release with tag ${tag}`);
}
return downloadUrl;
}

if (attempt < maxRetries) {
console.log(`Release not found yet, waiting ${retryDelayMs / 1000}s before retry...`);
await new Promise(resolve => setTimeout(resolve, retryDelayMs));
}
}
return downloadUrl;

throw new Error(`Could not find release with tag ${tag} on GitHub after ${maxRetries} attempts`);
}

async function createDraft(marketplaceId, version, minimumMXVersion) {
console.log(`Creating draft in the Mendix Marketplace...`);
console.log(`ID: ${marketplaceId} - Version: ${version} - MXVersion: ${minimumMXVersion}`);
const [major, minor, patch] = version.split(".");
const { marketplace } = packageMetadata();
try {
const body = {
Name: marketplace.name,
Description: marketplace.description,
VersionMajor: major ?? 1,
VersionMinor: minor ?? 0,
VersionPatch: patch ?? 0,
Expand Down Expand Up @@ -143,10 +159,22 @@ async function fetch(method, url, body, additionalHeaders) {
} else if (response.status === 503) {
throw new Error(`Fetching Failed. "${url}" is unreachable (Code ${response.status}).`);
} else if (response.status !== 200 && response.status !== 201) {
try {
const responseBody = await response.text();
console.error(`Failed API response code: ${response.status} content: ${responseBody}`);
} catch {
console.error(`Failed to parse error response body.`);
}
throw new Error(`Fetching Failed (Code ${response.status}). ${response.statusText}`);
} else if (response.ok) {
return response.json();
} else {
throw new Error(`Fetching Failed (Code ${response.status}). ${response.statusText}`);
}
}

function packageMetadata() {
const pkgPath = join(process.cwd(), "package.json");
const { name, widgetName, version, marketplace } = require(pkgPath);
return { name, widgetName, version, marketplace };
}
Loading