diff --git a/CHANGELOG.md b/CHANGELOG.md
index c5759037ef9..4e51dd3dc38 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,137 @@
+## [12.6.1](https://github.com/tidev/titanium_mobile/compare/12_6_0_GA...12.6.1) (2024-12-19)
+
+## About this release
+
+Titanium SDK 12.6.1 is a patch release of the SDK, addressing a regression related to click events on iOS from 12.6.0.
+
+## Community Credits
+
+* Michael Gangolf
+ * ios workflow update ([94d9cac](https://github.com/tidev/titanium_mobile/commit/94d9cace7c98d8b670e20bd0f56ac0fe839b86da))
+
+* Hans Knöchel
+ * Revert "fix(android): ios click speed (#14115)" (#14153) ([53227e4](https://github.com/tidev/titanium_mobile/commit/53227e41b2855dcc5008b43fecd0c4720d22c073))
+ * bump version ([82d9471](https://github.com/tidev/titanium_mobile/commit/82d9471170bb6f19526d94d87353e9d8b689e081))
+
+## SDK Module Versions
+
+| Module | Android version | iOS Version |
+| ----------- | --------------- | ----------- |
+| facebook | 13.0.0 | 15.0.0 |
+| ti.map | 5.6.1 | 7.3.1 |
+| ti.webdialog | 2.3.0 | 3.0.2 |
+| ti.playservices | 18.3.0 | n/a |
+| ti.identity | 3.1.0 | 5.0.0 |
+| urlSession | n/a | 4.0.1 |
+| ti.coremotion | n/a | 4.0.1 |
+| ti.applesignin | n/a | 3.1.2 |
+| hyperloop | 7.0.9 | 7.0.9 |
+
+# [12.6.0](https://github.com/tidev/titanium_mobile/compare/12_5_X...12.6.0) (2024-12-12)
+
+## About this release
+
+Titanium SDK 12.6.0 is a minor release of the SDK, adding new features and addressing potential bugs from previous releases.
+
+## Community Credits
+
+* Prashant Saini
+ * added new methods in Ti.Calendar.Calendar module for bulk operations ([25fb9fd](https://github.com/tidev/titanium_mobile/commit/25fb9fd00a1976f3fd2aada0aa11ecac16e5c832))
+
+* Michael Gangolf
+ * set default exitOnClose property to true ([929aeea](https://github.com/tidev/titanium_mobile/commit/929aeea5127e69462cde5bf3ce4383594838d3a3))
+ * update node-titanium-sdk ([5c25ec1](https://github.com/tidev/titanium_mobile/commit/5c25ec197b929c341b1c51a0429c87454ebb9c75))
+ * optimize cameraX rotation after camera is active ([69b645f](https://github.com/tidev/titanium_mobile/commit/69b645f185d860b4371ae5c912fd2b36e55bbfda))
+ * tableView row parent ([6fc9dcb](https://github.com/tidev/titanium_mobile/commit/6fc9dcbb40d0c1c739af5d9a2b5fe2088f7398fd))
+ * findStateDrawableIndex reflection method ([4364a7c](https://github.com/tidev/titanium_mobile/commit/4364a7c1c6b8b826ceb5e2bb0f35648e88e4b2de))
+ * fix starting activity when launching from home screen ([c69e2ec](https://github.com/tidev/titanium_mobile/commit/c69e2ecfcd5594fd9a6e137b25537d6501084044))
+ * webview content will fill up the whole Ti.UI.WebView by default ([c817069](https://github.com/tidev/titanium_mobile/commit/c817069cbfc3de352e7fa0d7b93dea45294a7c6e))
+ * fix Material3 BottomNavigation height ([d83d64e](https://github.com/tidev/titanium_mobile/commit/d83d64ef4573d5301337d813c6f104b95566f888))
+ * add x/y to ScrollView drag events ([70073c4](https://github.com/tidev/titanium_mobile/commit/70073c425c72d7e3a62ed2bb749c896b0cff832b))
+ * enable gradle config caching ([6f0d755](https://github.com/tidev/titanium_mobile/commit/6f0d755e05a01d5abbc66d5610af5f6fdfdceaf8))
+ * add direction to ListView scrolling ([81d5d1e](https://github.com/tidev/titanium_mobile/commit/81d5d1e79b13f6677041256e7416f72662c2f2dc))
+ * build module with example app ([b8d1a8f](https://github.com/tidev/titanium_mobile/commit/b8d1a8fe6a8a7b6c4d2209f2873f4a3eb0c52981))
+ * update NotificationChannel example ([cd0b55f](https://github.com/tidev/titanium_mobile/commit/cd0b55fd4a7263b96f31918f229cf3f1b6de0aa0))
+ * update gradle files ([f3676e1](https://github.com/tidev/titanium_mobile/commit/f3676e19e1eacadba532010f511f6123efc0f244))
+ * add responseDictionary to HTTPClient documentation ([d98f6a6](https://github.com/tidev/titanium_mobile/commit/d98f6a6fbf5d6406ceb20492ba89410400b6a95c))
+
+* Hans Knöchel
+ * add 12.6.0 changelog ([4fcd806](https://github.com/tidev/titanium_mobile/commit/4fcd806bc23fc37b66962ed046b60c040cc4f796))
+ * fix line ([2e85703](https://github.com/tidev/titanium_mobile/commit/2e857038e3f0ad620bf3f3b0bfd23bab2ec5100d))
+ * update hyperloop to 7.0.9 to fix dex issues ([829d4ab](https://github.com/tidev/titanium_mobile/commit/829d4ab2b481e5cb4e5ee399ab8cad419267c21d))
+ * update ti.facebook to latest ([5aec767](https://github.com/tidev/titanium_mobile/commit/5aec767eb550e95a2ae86395e6bdfdb661f5e661))
+ * update hyperloop to 7.0.8 to support SDK 12.6.0+ ([c5f2132](https://github.com/tidev/titanium_mobile/commit/c5f2132e87d2eca048e2c866ed9e8f2457d7994a))
+ * update hyperloop to 7.0.7 ([d084485](https://github.com/tidev/titanium_mobile/commit/d084485ed0bd0c0bfcc84154ad543be4ccdd59cf))
+ * bump master to 12.6.0 ([5b274a7](https://github.com/tidev/titanium_mobile/commit/5b274a769b10fc3f25d2c746d6ec24aec6b5e014))
+
+* dlewis23
+ * iOS 18 dark mode icons (#14138) ([8f201d9](https://github.com/tidev/titanium_mobile/commit/8f201d94bd13dc3a7c67ce850d11c828d2ca12e7))
+
+* Abdullah Al-Faqeir
+ * override user interface style ([5bebfdb](https://github.com/tidev/titanium_mobile/commit/5bebfdb97f59e3cb76a7eb82d6d940762563b6ab))
+ * fixing not finding themes when building sdk app.js ([5dd0259](https://github.com/tidev/titanium_mobile/commit/5dd0259b7a2310f92f45f78e52913437d93b4677))
+ * be able to add plugins to build.gradle ([e1212e9](https://github.com/tidev/titanium_mobile/commit/e1212e9fccd79f5c302a8380157288df356081da))
+ * gradle 8 ([50d8604](https://github.com/tidev/titanium_mobile/commit/50d8604ea40b4c2aacb55ee1128a2706f421715c))
+ * ios click speed ([6cc8830](https://github.com/tidev/titanium_mobile/commit/6cc8830f874474a176cc181390e4d3c18f7b8b38))
+
+* Douglas Alves
+ * handle x/y position for touch in dragstart/dragend events on iOS ([62e9d4a](https://github.com/tidev/titanium_mobile/commit/62e9d4abfdaf893b854465b8d0766fa662ca6f35))
+
+
+## Bug Fixes
+
+### Android platform
+
+* build module with example app ([b8d1a8f](https://github.com/tidev/titanium_mobile/commit/b8d1a8fe6a8a7b6c4d2209f2873f4a3eb0c52981))
+* findStateDrawableIndex reflection method ([4364a7c](https://github.com/tidev/titanium_mobile/commit/4364a7c1c6b8b826ceb5e2bb0f35648e88e4b2de))
+* fix Material3 BottomNavigation height ([d83d64e](https://github.com/tidev/titanium_mobile/commit/d83d64ef4573d5301337d813c6f104b95566f888))
+* fix starting activity when launching from home screen ([c69e2ec](https://github.com/tidev/titanium_mobile/commit/c69e2ecfcd5594fd9a6e137b25537d6501084044))
+* fixing not finding themes when building sdk app.js ([5dd0259](https://github.com/tidev/titanium_mobile/commit/5dd0259b7a2310f92f45f78e52913437d93b4677))
+* ios click speed ([6cc8830](https://github.com/tidev/titanium_mobile/commit/6cc8830f874474a176cc181390e4d3c18f7b8b38))
+* optimize cameraX rotation after camera is active ([69b645f](https://github.com/tidev/titanium_mobile/commit/69b645f185d860b4371ae5c912fd2b36e55bbfda))
+* override user interface style ([5bebfdb](https://github.com/tidev/titanium_mobile/commit/5bebfdb97f59e3cb76a7eb82d6d940762563b6ab))
+* set default exitOnClose property to true ([929aeea](https://github.com/tidev/titanium_mobile/commit/929aeea5127e69462cde5bf3ce4383594838d3a3))
+* tableView row parent ([6fc9dcb](https://github.com/tidev/titanium_mobile/commit/6fc9dcbb40d0c1c739af5d9a2b5fe2088f7398fd))
+
+### Multiple platforms
+
+* handle x/y position for touch in dragstart/dragend events on iOS ([62e9d4a](https://github.com/tidev/titanium_mobile/commit/62e9d4abfdaf893b854465b8d0766fa662ca6f35))
+
+## Features
+
+### Multiple platforms
+
+* update ti.facebook to latest ([5aec767](https://github.com/tidev/titanium_mobile/commit/5aec767eb550e95a2ae86395e6bdfdb661f5e661))
+* update hyperloop to 7.0.7 ([d084485](https://github.com/tidev/titanium_mobile/commit/d084485ed0bd0c0bfcc84154ad543be4ccdd59cf))
+* update hyperloop to 7.0.8 to support SDK 12.6.0+ ([c5f2132](https://github.com/tidev/titanium_mobile/commit/c5f2132e87d2eca048e2c866ed9e8f2457d7994a))
+* update hyperloop to 7.0.9 to fix dex issues ([829d4ab](https://github.com/tidev/titanium_mobile/commit/829d4ab2b481e5cb4e5ee399ab8cad419267c21d))
+
+### Android platform
+
+* add x/y to ScrollView drag events ([70073c4](https://github.com/tidev/titanium_mobile/commit/70073c425c72d7e3a62ed2bb749c896b0cff832b))
+* added new methods in Ti.Calendar.Calendar module for bulk operations ([25fb9fd](https://github.com/tidev/titanium_mobile/commit/25fb9fd00a1976f3fd2aada0aa11ecac16e5c832))
+* be able to add plugins to build.gradle ([e1212e9](https://github.com/tidev/titanium_mobile/commit/e1212e9fccd79f5c302a8380157288df356081da))
+* enable gradle config caching ([6f0d755](https://github.com/tidev/titanium_mobile/commit/6f0d755e05a01d5abbc66d5610af5f6fdfdceaf8))
+* webview content will fill up the whole Ti.UI.WebView by default ([c817069](https://github.com/tidev/titanium_mobile/commit/c817069cbfc3de352e7fa0d7b93dea45294a7c6e))
+
+### iOS platform
+
+* add direction to ListView scrolling ([81d5d1e](https://github.com/tidev/titanium_mobile/commit/81d5d1e79b13f6677041256e7416f72662c2f2dc))
+
+## SDK Module Versions
+
+| Module | Android version | iOS Version |
+| ----------- | --------------- | ----------- |
+| facebook | 13.0.0 | 15.0.0 |
+| ti.map | 5.6.1 | 7.3.1 |
+| ti.webdialog | 2.3.0 | 3.0.2 |
+| ti.playservices | 18.3.0 | n/a |
+| ti.identity | 3.1.0 | 5.0.0 |
+| urlSession | n/a | 4.0.1 |
+| ti.coremotion | n/a | 4.0.1 |
+| ti.applesignin | n/a | 3.1.2 |
+| hyperloop | 7.0.9 | 7.0.9 |
+
## [12.5.1](https://github.com/tidev/titanium_mobile/compare/12_5_0_GA...12.5.1) (2024-10-02)
## About this release
diff --git a/README.md b/README.md
index fb592739dbd..c8b3f977cbc 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,7 @@ today and benefit from 1:1 sessions with the core team, exclusive modules, merch
Learn more about sponsoring TiDev, the organization behind the Titanium SDK, [here](https://github.com/sponsors/tidev) 🚀.
-




















+





















## Features
diff --git a/android/app/build.gradle b/android/app/build.gradle
index 2577c868951..d89cdc7bbfd 100644
--- a/android/app/build.gradle
+++ b/android/app/build.gradle
@@ -9,7 +9,7 @@ apply plugin: 'com.android.application'
// Set up Android app project.
android {
- compileSdkVersion 34
+ compileSdkVersion 34
ndkVersion project.ext.tiNdkVersion
defaultConfig {
applicationId 'com.titanium.test'
@@ -86,6 +86,7 @@ dependencies {
// exclude group: 'com.google.android.gms'
}
+ implementation "androidx.activity:activity:1.8.0"
implementation "androidx.appcompat:appcompat:${project.ext.tiAndroidXAppCompatLibVersion}"
implementation "com.google.android.material:material:${project.ext.tiMaterialLibVersion}"
}
diff --git a/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarProxy.java b/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarProxy.java
index 86082882a18..dd95acc7997 100644
--- a/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarProxy.java
+++ b/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarProxy.java
@@ -7,9 +7,13 @@
package ti.modules.titanium.calendar;
+import static ti.modules.titanium.calendar.EventProxy.getEventsUri;
+
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
import org.appcelerator.kroll.KrollDict;
import org.appcelerator.kroll.KrollProxy;
@@ -19,11 +23,17 @@
import android.app.Activity;
import android.content.ContentResolver;
+import android.content.ContentValues;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
+import android.provider.CalendarContract;
import android.text.format.DateUtils;
+import android.content.ContentProviderOperation;
+import android.content.ContentProviderResult;
+import android.content.OperationApplicationException;
+import android.os.RemoteException;
@Kroll.proxy(parentModule = CalendarModule.class)
public class CalendarProxy extends KrollProxy
@@ -188,12 +198,147 @@ public EventProxy getEventById(int id)
return null;
}
+ @Kroll.method
+ public EventProxy[] getEventsById(Object args)
+ {
+ ArrayList events = new ArrayList<>();
+
+ if (args instanceof Object[] eventIds && eventIds.length > 0) {
+ String query = CalendarUtils.prepareQuerySelection("_id", eventIds.length);
+ String[] queryArgs = CalendarUtils.prepareQueryArguments(eventIds);
+
+ events.addAll(EventProxy.queryEvents(query, queryArgs));
+ }
+
+ return events.toArray(new EventProxy[0]);
+ }
+
@Kroll.method
public EventProxy createEvent(KrollDict data)
{
return EventProxy.createEvent(this, data);
}
+ @Kroll.method
+ public EventProxy[] createEvents(Object data)
+ {
+ // Validate arguments to be an array.
+ if (!(data instanceof Object[] dataList && dataList.length > 0)) {
+ Log.e(TAG, "Argument expected to be an array.");
+ return null;
+ }
+
+ // Check for permissions.
+ ContentResolver contentResolver = TiApplication.getInstance().getContentResolver();
+ if (!hasCalendarPermissions()) {
+ Log.e(TAG, "Calendar permissions are missing.");
+ return null;
+ }
+
+ ArrayList operations = new ArrayList<>();
+ ArrayList eventProxies = new ArrayList<>();
+ Map proxyResultIndexMapping = new HashMap<>();
+
+ for (int i = 0, firstIndex = 0; i < dataList.length; i++) {
+ KrollDict krollDict = new KrollDict((HashMap) dataList[i]);
+
+ EventProxy eventProxy = new EventProxy();
+ ContentValues contentValues = CalendarUtils.createContentValues(this, krollDict, eventProxy);
+
+ // We cannot pass null data to ContentProviderOperation.
+ // Necessary to keep track of non-null items later.
+ if (contentValues == null) {
+ eventProxies.add(null);
+ Log.e(TAG, "Event was not created, no title found for event");
+ continue;
+ }
+
+ ContentProviderOperation.Builder builder = ContentProviderOperation
+ .newInsert(CalendarContract.Events.CONTENT_URI)
+ .withValues(contentValues);
+
+ operations.add(builder.build());
+ eventProxies.add(eventProxy);
+
+ proxyResultIndexMapping.put(i, firstIndex);
+ firstIndex++;
+ }
+
+ try {
+ // Execute the batch operation
+ ContentProviderResult[] results = contentResolver.applyBatch(
+ getEventsUri().getAuthority(),
+ operations
+ );
+
+ // Find non-null proxies and map their IDs
+ for (int proxyIndex : proxyResultIndexMapping.keySet()) {
+ int proxyIndexInResults = proxyResultIndexMapping.get(proxyIndex);
+ Uri eventUri = results[proxyIndexInResults].uri;
+
+ if (eventUri != null) {
+ // Set event id to proxy.
+ eventProxies.get(proxyIndex).id = eventUri.getLastPathSegment();
+ } else {
+ // Event failed to get a proper URI path, should set to null in this case too.
+ eventProxies.set(proxyIndex, null);
+ }
+ }
+
+ return eventProxies.toArray(new EventProxy[0]);
+
+ } catch (RemoteException | OperationApplicationException e) {
+ Log.e(TAG, "Batch insert operation failed: " + e.getMessage());
+ return null;
+ }
+ }
+
+ @Kroll.method
+ public int deleteEvents(Object args)
+ {
+ int deletedCount = 0;
+
+ // Validate arguments to be an array.
+ if (!(args instanceof Object[] eventIds && eventIds.length > 0)) {
+ Log.e(TAG, "Argument expected to be an array.");
+ return deletedCount;
+ }
+
+ // Check for permissions.
+ ContentResolver contentResolver = TiApplication.getInstance().getContentResolver();
+ if (!hasCalendarPermissions()) {
+ Log.e(TAG, "Calendar permissions are missing.");
+ return deletedCount;
+ }
+
+ String query = CalendarUtils.prepareQuerySelection("_id", eventIds.length);
+ String[] queryArgs = CalendarUtils.prepareQueryArguments(eventIds);
+
+ ArrayList operations = new ArrayList<>();
+ ContentProviderOperation.Builder builder = ContentProviderOperation
+ .newDelete(CalendarContract.Events.CONTENT_URI)
+ .withSelection(query, queryArgs);
+
+ operations.add(builder.build());
+
+ try {
+ // Execute the batch operation
+ ContentProviderResult[] results = contentResolver.applyBatch(
+ getEventsUri().getAuthority(),
+ operations
+ );
+
+ if (results.length > 0 && results[0].count != null) {
+ deletedCount = results[0].count;
+ }
+
+ } catch (RemoteException | OperationApplicationException e) {
+ Log.e(TAG, "Batch deletion failed: " + e.getMessage());
+ }
+
+ return deletedCount;
+ }
+
@Kroll.getProperty
public String getName()
{
diff --git a/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarUtils.java b/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarUtils.java
new file mode 100644
index 00000000000..a1693d76c02
--- /dev/null
+++ b/android/modules/calendar/src/java/ti/modules/titanium/calendar/CalendarUtils.java
@@ -0,0 +1,90 @@
+package ti.modules.titanium.calendar;
+
+import android.content.ContentValues;
+import android.provider.CalendarContract;
+import android.text.TextUtils;
+
+import org.appcelerator.kroll.KrollDict;
+import org.appcelerator.titanium.TiC;
+import org.appcelerator.titanium.util.TiConvert;
+
+import java.util.Collections;
+import java.util.Date;
+
+public class CalendarUtils
+{
+ public static final String TAG = "CalendarUtils";
+
+ // Build the selection string for IN clause.
+ public static String prepareQuerySelection(String columnName, int limit)
+ {
+ return columnName + " IN (" + TextUtils.join(", ", Collections.nCopies(limit, "?")) + ")";
+ }
+
+ // Creates String[] for selectionArgs.
+ public static String[] prepareQueryArguments(Object[] data)
+ {
+ String[] queryArgs = new String[data.length];
+ for (int i = 0; i < data.length; i++) {
+ queryArgs[i] = String.valueOf(data[i]);
+ }
+ return queryArgs;
+ }
+
+ public static ContentValues createContentValues(CalendarProxy calendar, KrollDict data, EventProxy event)
+ {
+ if (!data.containsKey(TiC.PROPERTY_TITLE)) {
+ return null;
+ }
+
+ ContentValues contentValues = new ContentValues();
+ contentValues.put("hasAlarm", 1);
+ contentValues.put("hasExtendedProperties", 1);
+
+ event.title = TiConvert.toString(data, TiC.PROPERTY_TITLE);
+ contentValues.put(TiC.PROPERTY_TITLE, event.title);
+ contentValues.put("calendar_id", calendar.getId());
+ contentValues.put(CalendarContract.Events.EVENT_TIMEZONE, new Date().toString());
+
+ if (data.containsKey(TiC.PROPERTY_LOCATION)) {
+ event.location = TiConvert.toString(data, TiC.PROPERTY_LOCATION);
+ contentValues.put(CalendarModule.EVENT_LOCATION, event.location);
+ }
+
+ if (data.containsKey(TiC.PROPERTY_DESCRIPTION)) {
+ event.description = TiConvert.toString(data, TiC.PROPERTY_DESCRIPTION);
+ contentValues.put(TiC.PROPERTY_DESCRIPTION, event.description);
+ }
+
+ if (data.containsKey("begin")) {
+ event.begin = TiConvert.toDate(data, "begin");
+ if (event.begin != null) {
+ contentValues.put("dtstart", event.begin.getTime());
+ }
+ }
+
+ if (data.containsKey(TiC.PROPERTY_END)) {
+ event.end = TiConvert.toDate(data, TiC.PROPERTY_END);
+ if (event.end != null) {
+ contentValues.put("dtend", event.end.getTime());
+ }
+ }
+
+ if (data.containsKey("allDay")) {
+ event.allDay = TiConvert.toBoolean(data, "allDay");
+ contentValues.put("allDay", event.allDay ? 1 : 0);
+ }
+
+ if (data.containsKey("hasExtendedProperties")) {
+ event.hasExtendedProperties = TiConvert.toBoolean(data, "hasExtendedProperties");
+ contentValues.put("hasExtendedProperties", event.hasExtendedProperties ? 1 : 0);
+ }
+
+ if (data.containsKey("hasAlarm")) {
+ event.hasAlarm = TiConvert.toBoolean(data, "hasAlarm");
+ contentValues.put("hasAlarm", event.hasAlarm ? 1 : 0);
+ }
+
+ return contentValues;
+ }
+}
diff --git a/android/modules/calendar/src/java/ti/modules/titanium/calendar/EventProxy.java b/android/modules/calendar/src/java/ti/modules/titanium/calendar/EventProxy.java
index 9ad71100316..5a5c8f39b43 100644
--- a/android/modules/calendar/src/java/ti/modules/titanium/calendar/EventProxy.java
+++ b/android/modules/calendar/src/java/ti/modules/titanium/calendar/EventProxy.java
@@ -55,9 +55,9 @@ public EventProxy()
super();
}
- public static String getEventsUri()
+ public static Uri getEventsUri()
{
- return CalendarProxy.getBaseCalendarUri() + "/events";
+ return Events.CONTENT_URI;
}
public static String getInstancesWhenUri()
@@ -72,7 +72,7 @@ public static String getExtendedPropertiesUri()
public static ArrayList queryEvents(String query, String[] queryArgs)
{
- return queryEvents(Uri.parse(getEventsUri()), query, queryArgs, "dtstart ASC");
+ return queryEvents(getEventsUri(), query, queryArgs, "dtstart ASC");
}
public static ArrayList queryEventsBetweenDates(long date1, long date2, String query,
@@ -146,7 +146,7 @@ public void save()
contentValues.put(Events.RRULE, ruleToSave);
ContentResolver contentResolver = TiApplication.getInstance().getContentResolver();
try {
- contentResolver.update(Events.CONTENT_URI, contentValues, Events._ID + "=?", new String[] { id });
+ contentResolver.update(getEventsUri(), contentValues, Events._ID + "=?", new String[] { id });
} catch (IllegalArgumentException e) {
Log.e(TAG, "Invalid event recurrence rule.");
}
@@ -203,60 +203,20 @@ public static EventProxy createEvent(CalendarProxy calendar, KrollDict data)
if (!CalendarProxy.hasCalendarPermissions()) {
return null;
}
- EventProxy event = new EventProxy();
- ContentValues eventValues = new ContentValues();
- eventValues.put("hasAlarm", 1);
- eventValues.put("hasExtendedProperties", 1);
+ EventProxy event = new EventProxy();
+ ContentValues contentValues = CalendarUtils.createContentValues(calendar, data, event);
- if (!data.containsKey("title")) {
+ if (contentValues == null) {
Log.e(TAG, "Title was not created, no title found for event");
return null;
}
- event.title = TiConvert.toString(data, "title");
- eventValues.put("title", event.title);
- eventValues.put("calendar_id", calendar.getId());
- eventValues.put(Events.EVENT_TIMEZONE, new Date().toString());
-
- if (data.containsKey(TiC.PROPERTY_LOCATION)) {
- event.location = TiConvert.toString(data, TiC.PROPERTY_LOCATION);
- eventValues.put(CalendarModule.EVENT_LOCATION, event.location);
- }
- if (data.containsKey("description")) {
- event.description = TiConvert.toString(data, "description");
- eventValues.put("description", event.description);
- }
- if (data.containsKey("begin")) {
- event.begin = TiConvert.toDate(data, "begin");
- if (event.begin != null) {
- eventValues.put("dtstart", event.begin.getTime());
- }
- }
- if (data.containsKey("end")) {
- event.end = TiConvert.toDate(data, "end");
- if (event.end != null) {
- eventValues.put("dtend", event.end.getTime());
- }
- }
- if (data.containsKey("allDay")) {
- event.allDay = TiConvert.toBoolean(data, "allDay");
- eventValues.put("allDay", event.allDay ? 1 : 0);
- }
-
- if (data.containsKey("hasExtendedProperties")) {
- event.hasExtendedProperties = TiConvert.toBoolean(data, "hasExtendedProperties");
- eventValues.put("hasExtendedProperties", event.hasExtendedProperties ? 1 : 0);
- }
-
- if (data.containsKey("hasAlarm")) {
- event.hasAlarm = TiConvert.toBoolean(data, "hasAlarm");
- eventValues.put("hasAlarm", event.hasAlarm ? 1 : 0);
+ Uri eventUri = contentResolver.insert(Uri.parse(CalendarProxy.getBaseCalendarUri() + "/events"), contentValues);
+ if (eventUri == null) {
+ return null;
}
- Uri eventUri = contentResolver.insert(Uri.parse(CalendarProxy.getBaseCalendarUri() + "/events"), eventValues);
- Log.d("TiEvents", "created event with uri: " + eventUri, Log.DEBUG_MODE);
-
String eventId = eventUri.getLastPathSegment();
event.id = eventId;
@@ -565,13 +525,12 @@ public boolean remove()
ContentResolver contentResolver = TiApplication.getInstance().getContentResolver();
try {
- Uri deleteUri = ContentUris.withAppendedId(CalendarContract.Events.CONTENT_URI, TiConvert.toInt(id));
- contentResolver.delete(deleteUri, null, null);
+ Uri deleteUri = ContentUris.withAppendedId(getEventsUri(), TiConvert.toInt(id));
+ int deletedCount = contentResolver.delete(deleteUri, null, null);
+ return deletedCount == 1;
} catch (IllegalArgumentException e) {
return false;
}
-
- return true;
}
@Override
diff --git a/android/modules/ui/src/java/ti/modules/titanium/ui/RefreshControlProxy.java b/android/modules/ui/src/java/ti/modules/titanium/ui/RefreshControlProxy.java
index f4a8fd62783..c5f5a82f61d 100644
--- a/android/modules/ui/src/java/ti/modules/titanium/ui/RefreshControlProxy.java
+++ b/android/modules/ui/src/java/ti/modules/titanium/ui/RefreshControlProxy.java
@@ -13,7 +13,9 @@
import org.appcelerator.kroll.annotations.Kroll;
import org.appcelerator.kroll.common.Log;
import org.appcelerator.titanium.TiC;
+import org.appcelerator.titanium.TiDimension;
import org.appcelerator.titanium.util.TiColorHelper;
+import org.appcelerator.titanium.util.TiConvert;
import java.util.HashSet;
@@ -30,7 +32,8 @@ public class RefreshControlProxy extends KrollProxy
* The default Android log tag name to be used by this class.
*/
private static final String TAG = "RefreshControlProxy";
-
+ private static int offsetStart = -1;
+ private static int offsetEnd = -1;
/**
* Android's default progress indicator color used by the SwipeRefreshLayout class.
* This is defined in Google's "MaterialProgressDrawable.java", which is an internal class.
@@ -134,9 +137,18 @@ public void handleCreationDict(KrollDict properties)
super.handleCreationDict(properties);
// Fetch "tintColor" property, if provided.
- value = properties.get(TiC.PROPERTY_TINT_COLOR);
- if (value != null) {
- onTintColorChanged(value);
+ if (properties.containsKeyAndNotNull(TiC.PROPERTY_TINT_COLOR)) {
+ value = properties.get(TiC.PROPERTY_TINT_COLOR);
+ if (value != null) {
+ onTintColorChanged(value);
+ }
+ }
+ if (properties.containsKeyAndNotNull("offset")) {
+ KrollDict offset = properties.getKrollDict("offset");
+ offsetStart = new TiDimension(TiConvert.toInt(offset.get("start"), 0), TiDimension.TYPE_TOP)
+ .getAsPixels(this.swipeRefreshLayout);
+ offsetEnd = new TiDimension(TiConvert.toInt(offset.get("end"), 80), TiDimension.TYPE_BOTTOM)
+ .getAsPixels(this.swipeRefreshLayout);
}
}
@@ -275,6 +287,9 @@ public void assignTo(TiSwipeRefreshLayout view)
// Set up the given view for pull-down refresh support.
view.setColorSchemeColors(this.tintColor);
+ if (offsetStart != -1 && offsetEnd != -1) {
+ view.setProgressViewOffset(false, offsetStart, offsetEnd);
+ }
view.setSwipeRefreshEnabled(true);
view.setOnRefreshListener(new TiSwipeRefreshLayout.OnRefreshListener()
{
diff --git a/android/package.json b/android/package.json
index cb890f2d580..72d1b882847 100644
--- a/android/package.json
+++ b/android/package.json
@@ -17,7 +17,7 @@
"integrity": "sha512-A0tV+fYtkpKfIF5roRTCFPtdULMFygmfWlEuuHOBjC3q4rz/mKnAsJTYBlqayC/4oYEWehj867Oh1o6vy26XHQ=="
},
"minSDKVersion": "21",
- "compileSDKVersion": "33",
+ "compileSDKVersion": "34",
"vendorDependencies": {
"android sdk": ">=23.x <=34.x",
"android build tools": ">=30.0.2 <=34.x",
diff --git a/android/templates/build/ti.constants.gradle b/android/templates/build/ti.constants.gradle
index 6988acc5601..27cf7beb9c3 100644
--- a/android/templates/build/ti.constants.gradle
+++ b/android/templates/build/ti.constants.gradle
@@ -7,11 +7,11 @@
project.ext {
tiNdkVersion = '26.2.11394342'
- tiAndroidXAppCompatLibVersion = '1.4.1'
+ tiAndroidXAppCompatLibVersion = '1.7.0'
tiAndroidXCoreLibVersion = '1.9.0'
- tiAndroidXFragmentLibVersion = '1.5.7'
- tiMaterialLibVersion = '1.6.1'
- tiPlayServicesBaseLibVersion = '18.2.0'
+ tiAndroidXFragmentLibVersion = '1.7.1'
+ tiMaterialLibVersion = '1.12.0'
+ tiPlayServicesBaseLibVersion = '18.3.0'
tiManifestPlaceholders = [
tiActivityConfigChanges: 'density|fontScale|keyboard|keyboardHidden|layoutDirection|locale|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode'
]
diff --git a/android/titanium/build.gradle b/android/titanium/build.gradle
index c3078c48701..a5909b6a936 100644
--- a/android/titanium/build.gradle
+++ b/android/titanium/build.gradle
@@ -46,7 +46,7 @@ android {
ndkVersion project.ext.tiNdkVersion
namespace 'org.appcelerator.titanium'
defaultConfig {
- compileSdk 33
+ compileSdk 34
minSdkVersion 21
targetSdkVersion 34
versionName tiBuildVersionString
@@ -284,11 +284,11 @@ dependencies {
implementation 'androidx.drawerlayout:drawerlayout:1.2.0'
implementation 'androidx.exifinterface:exifinterface:1.3.7'
implementation "androidx.fragment:fragment:${project.ext.tiAndroidXFragmentLibVersion}"
- implementation 'androidx.media:media:1.6.0'
+ implementation 'androidx.media:media:1.7.0'
implementation 'androidx.recyclerview:recyclerview:1.3.2'
implementation 'androidx.recyclerview:recyclerview-selection:1.1.0'
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
- implementation 'androidx.transition:transition:1.4.1'
+ implementation 'androidx.transition:transition:1.5.1'
implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
implementation 'androidx.viewpager:viewpager:1.0.0'
diff --git a/apidoc/Titanium/Calendar/CalendarProxy.yml b/apidoc/Titanium/Calendar/CalendarProxy.yml
index a678efc8776..a612444197f 100644
--- a/apidoc/Titanium/Calendar/CalendarProxy.yml
+++ b/apidoc/Titanium/Calendar/CalendarProxy.yml
@@ -17,6 +17,21 @@ methods:
type: Dictionary
platforms: [android, iphone, ipad, macos]
+ - name: createEvents
+ summary: Creates multiple events at once in this calendar.
+ description: |
+ Use this method to bulk-create events for faster performance.
+ Successful or failed results are returned at the same position as passed in the parameters list.
+ For failed events, it will return `null` and for successful events.
+ returns:
+ type: Array
+ parameters:
+ - name: propertiesArray
+ summary: Array of the event properties
+ type: Array>
+ platforms: [android]
+ since: {android: "12.6.0"}
+
- name: getEventById
summary: Gets the event with the specified identifier.
returns:
@@ -27,6 +42,41 @@ methods:
type: String
platforms: [android, iphone, ipad, macos]
+ - name: getEventsById
+ summary: Gets multiple events with their specified identifier(s).
+ description: |
+ Use this method to bulk-fetch events for faster performance.
+ Only successful events are returned, so the identifier of events
+ should be used to compare which events were not fetched successfully.
+ returns:
+ type: Array
+ parameters:
+ - name: ids
+ summary: Array of identifiers of events.
+ type: [Array, Array]
+ platforms: [android]
+ since: {android: "12.6.0"}
+
+ - name: deleteEvents
+ summary: Deletes multiple events with their specified identifier(s).
+ description: |
+ Use this method to bulk-delete events for faster performance.
+ This method only returns the count of successfully deleted events.
+ If it is important for apps to know whether the event was deleted or not,
+ either use the [remove()](Titanium.Calendar.Event.remove) method, or
+ a single identifier that is passed as an array to this method.
+ If a specified identifier event does not exist, it will not be treated as a count,
+ so the count range can be in `0 <= count <= ids.length`.
+ returns:
+ type: Number
+ summary: Count of successfully deleted events.
+ parameters:
+ - name: ids
+ summary: Array of identifiers of events.
+ type: [Array, Array]
+ platforms: [android]
+ since: {android: "12.6.0"}
+
- name: getEventsBetweenDates
summary: Gets events that occur between two dates.
returns:
diff --git a/apidoc/Titanium/UI/ListView.yml b/apidoc/Titanium/UI/ListView.yml
index b6ac0a46f03..b2fa371f090 100644
--- a/apidoc/Titanium/UI/ListView.yml
+++ b/apidoc/Titanium/UI/ListView.yml
@@ -659,6 +659,30 @@ events:
summary: |
The expected y axis offset when the scrolling action decelerates to a stop.
type: Number
+
+ - name: visibleItemCount
+ summary: The number of visible items in the list view when the event fires.
+ type: Number
+
+ - name: firstVisibleItem
+ summary: The first visible item in the list view when the event fires; this item might not be fully visible. May be -1 on iOS.
+ type: [Object, Number]
+
+ - name: firstVisibleSection
+ summary: The first visible section in the list view when the event fires.
+ type: Titanium.UI.ListSection
+
+ - name: firstVisibleItemIndex
+ summary: |
+ The index of the first visible item in the list view when the event fires; this item might not be fully visible.
+ Note: The index is `-1` when there are no items in the .
+ type: Number
+
+ - name: firstVisibleSectionIndex
+ summary: |
+ The index of the first visible section in the list view when the event fires.
+ Note: The index is `-1` when there are no items in the .
+ type: Number
properties:
- name: allowsSelection
diff --git a/apidoc/Titanium/UI/RefreshControl.yml b/apidoc/Titanium/UI/RefreshControl.yml
index 1abd9a4c6c8..d3c78eb2b35 100644
--- a/apidoc/Titanium/UI/RefreshControl.yml
+++ b/apidoc/Titanium/UI/RefreshControl.yml
@@ -55,6 +55,13 @@ properties:
platforms: [android, iphone, ipad, macos]
since: { android: "6.2.0", iphone: "3.2.0", ipad: "3.2.0" }
+ - name: offset
+ summary: Offset of the refresh control view.
+ type: RefreshControlOffset
+ platforms: [android]
+ since: { android: "12.7.0" }
+ availability: creation
+
- name: backgroundColor
summary: The background color for the refresh control, as a color name or hex triplet.
description: |
@@ -146,3 +153,13 @@ examples:
$.index.open();
```
+---
+name: RefreshControlOffset
+summary: Offset of the refresh control view.
+properties:
+ - name: start
+ summary: The offset from the top of this view at which the progress spinner should appear.
+ type: Number
+ - name: end
+ summary: The offset from the top of this view at which the progress spinner should come to rest after a successful swipe gesture.
+ type: Number
diff --git a/iphone/TitaniumKit/TitaniumKit/Sources/API/TiUIView.m b/iphone/TitaniumKit/TitaniumKit/Sources/API/TiUIView.m
index 3f0331e6921..f433f0bd01f 100644
--- a/iphone/TitaniumKit/TitaniumKit/Sources/API/TiUIView.m
+++ b/iphone/TitaniumKit/TitaniumKit/Sources/API/TiUIView.m
@@ -1312,7 +1312,6 @@ - (UITapGestureRecognizer *)singleTapRecognizer
{
if (singleTapRecognizer == nil) {
singleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(recognizedTap:)];
- [singleTapRecognizer setNumberOfTapsRequired:1];
[self configureGestureRecognizer:singleTapRecognizer];
[self addGestureRecognizer:singleTapRecognizer];
if (doubleTapRecognizer != nil) {
@@ -1435,8 +1434,6 @@ - (void)recognizedTap:(UITapGestureRecognizer *)recognizer
[proxy fireEvent:@"dblclick" withObject:event propagate:YES];
}
[proxy fireEvent:@"doubletap" withObject:event];
- } else if ([recognizer numberOfTapsRequired] == 1 && [proxy _hasListeners:@"click"]) {
- [proxy fireEvent:@"click" withObject:event propagate:YES];
} else {
[proxy fireEvent:@"singletap" withObject:event];
}
@@ -1612,7 +1609,12 @@ - (void)processTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
// Click handling is special; don't propagate if we have a delegate,
// but DO invoke the touch delegate.
// clicks should also be handled by any control the view is embedded in.
- if ([touch tapCount] == 2 && [proxy _hasListeners:@"dblclick"]) {
+ if ([touch tapCount] == 1 && [proxy _hasListeners:@"click"]) {
+ if (touchDelegate == nil) {
+ [proxy fireEvent:@"click" withObject:evt propagate:YES];
+ return;
+ }
+ } else if ([touch tapCount] == 2 && [proxy _hasListeners:@"dblclick"]) {
[proxy fireEvent:@"dblclick" withObject:evt propagate:YES];
return;
}
diff --git a/iphone/iphone/Titanium.plist b/iphone/iphone/Titanium.plist
index 997d287518d..c2bc373aac4 100644
--- a/iphone/iphone/Titanium.plist
+++ b/iphone/iphone/Titanium.plist
@@ -59,10 +59,6 @@
Can we use your microphone?
NSPhotoLibraryUsageDescription
Can we save to your photo library?
- UIAppFonts
-
- comic_zine_ot.otf
-
UILaunchStoryboardName
LaunchScreen
UIRequiresFullScreen
diff --git a/package-lock.json b/package-lock.json
index 0f2d21a575d..6b96c4de6b7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,7 +24,7 @@
"colors": "1.4.0",
"ejs": "3.1.9",
"fields": "0.1.24",
- "fs-extra": "11.2.0",
+ "fs-extra": "10.0.0",
"ioslib": "1.7.39",
"liveview": "1.5.6",
"lodash.merge": "4.6.2",
@@ -80,7 +80,7 @@
"nyc": "15.1.0",
"request-promise-native": "1.0.9",
"rollup": "2.76.0",
- "ssri": "10.0.4",
+ "ssri": "8.0.1",
"stream-splitter": "0.3.2",
"strip-ansi": "6.0.1",
"titanium": "6.1.1",
@@ -4957,6 +4957,18 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/cacache/node_modules/ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/cacheable-lookup": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
@@ -7757,16 +7769,17 @@
}
},
"node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+ "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
+ "license": "MIT",
"dependencies": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
},
"engines": {
- "node": ">=14.14"
+ "node": ">=12"
}
},
"node_modules/fs-minipass": {
@@ -10732,6 +10745,18 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/make-fetch-happen/node_modules/ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/map-obj": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
@@ -12777,6 +12802,18 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/pacote/node_modules/ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "license": "ISC",
+ "dependencies": {
+ "minipass": "^7.0.3"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -14812,22 +14849,16 @@
}
},
"node_modules/ssri": {
- "version": "10.0.4",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz",
- "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+ "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "minipass": "^5.0.0"
+ "minipass": "^3.1.1"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/ssri/node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
- "engines": {
- "node": ">=8"
+ "node": ">= 8"
}
},
"node_modules/stack-trace": {
@@ -19887,6 +19918,14 @@
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="
+ },
+ "ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "requires": {
+ "minipass": "^7.0.3"
+ }
}
}
},
@@ -21950,9 +21989,9 @@
"dev": true
},
"fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+ "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
"requires": {
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
@@ -24171,6 +24210,14 @@
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
"integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ=="
+ },
+ "ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "requires": {
+ "minipass": "^7.0.3"
+ }
}
}
},
@@ -25687,6 +25734,14 @@
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
"integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ=="
+ },
+ "ssri": {
+ "version": "10.0.6",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz",
+ "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==",
+ "requires": {
+ "minipass": "^7.0.3"
+ }
}
}
},
@@ -27181,18 +27236,12 @@
}
},
"ssri": {
- "version": "10.0.4",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz",
- "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
+ "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+ "dev": true,
"requires": {
- "minipass": "^5.0.0"
- },
- "dependencies": {
- "minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="
- }
+ "minipass": "^3.1.1"
}
},
"stack-trace": {
diff --git a/package.json b/package.json
index 347236f6f39..5a958725048 100644
--- a/package.json
+++ b/package.json
@@ -99,7 +99,7 @@
"colors": "1.4.0",
"ejs": "3.1.9",
"fields": "0.1.24",
- "fs-extra": "11.2.0",
+ "fs-extra": "10.0.0",
"ioslib": "1.7.39",
"liveview": "1.5.6",
"lodash.merge": "4.6.2",
@@ -155,7 +155,7 @@
"nyc": "15.1.0",
"request-promise-native": "1.0.9",
"rollup": "2.76.0",
- "ssri": "10.0.4",
+ "ssri": "8.0.1",
"stream-splitter": "0.3.2",
"strip-ansi": "6.0.1",
"titanium": "6.1.1",