@office-iss/react-native-win32 0.71.12 → 0.71.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.json CHANGED
@@ -2,7 +2,37 @@
2
2
  "name": "@office-iss/react-native-win32",
3
3
  "entries": [
4
4
  {
5
- "date": "Thu, 06 Jul 2023 20:21:09 GMT",
5
+ "date": "Fri, 11 Aug 2023 00:25:54 GMT",
6
+ "tag": "@office-iss/react-native-win32_v0.71.14",
7
+ "version": "0.71.14",
8
+ "comments": {
9
+ "patch": [
10
+ {
11
+ "author": "30809111+acoates-ms@users.noreply.github.com",
12
+ "package": "@office-iss/react-native-win32",
13
+ "commit": "819530506ec8814c704ca77907c632b75fc9d451",
14
+ "comment": "Add saveAssetPlugin to fix long path assets"
15
+ }
16
+ ]
17
+ }
18
+ },
19
+ {
20
+ "date": "Fri, 04 Aug 2023 23:49:15 GMT",
21
+ "tag": "@office-iss/react-native-win32_v0.71.13",
22
+ "version": "0.71.13",
23
+ "comments": {
24
+ "patch": [
25
+ {
26
+ "author": "email not defined",
27
+ "package": "@office-iss/react-native-win32",
28
+ "commit": "958bd7b3a1d65a3cd4076bed410c0cb1b5675740",
29
+ "comment": "add isDefaultButton check to win32"
30
+ }
31
+ ]
32
+ }
33
+ },
34
+ {
35
+ "date": "Thu, 06 Jul 2023 20:21:35 GMT",
6
36
  "tag": "@office-iss/react-native-win32_v0.71.12",
7
37
  "version": "0.71.12",
8
38
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,17 +1,33 @@
1
1
  # Change Log - @office-iss/react-native-win32
2
2
 
3
- This log was last generated on Thu, 06 Jul 2023 20:21:09 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 11 Aug 2023 00:25:54 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
- ## 0.71.12
7
+ ## 0.71.14
8
8
 
9
- Thu, 06 Jul 2023 20:21:09 GMT
9
+ Fri, 11 Aug 2023 00:25:54 GMT
10
10
 
11
11
  ### Patches
12
12
 
13
- - Update core 0.71.6 -> 0.71.12 (30809111+acoates-ms@users.noreply.github.com)
13
+ - Add saveAssetPlugin to fix long path assets (30809111+acoates-ms@users.noreply.github.com)
14
14
 
15
+ ## 0.71.13
16
+
17
+ Fri, 04 Aug 2023 23:49:15 GMT
18
+
19
+ ### Patches
20
+
21
+ - add isDefaultButton check to win32 (email not defined)
22
+
23
+ ## 0.71.12
24
+
25
+ Thu, 06 Jul 2023 20:21:35 GMT
26
+
27
+ ### Patches
28
+
29
+ - Update core 0.71.6 -> 0.71.12 (30809111+acoates-ms@users.noreply.github.com)
30
+
15
31
  ## 0.71.11
16
32
 
17
33
  Fri, 23 Jun 2023 18:19:55 GMT
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Copyright (c) Microsoft Corporation.
3
+ * Licensed under the MIT License.
4
+ *
5
+ * @flow strict-local
6
+ * @format
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ // Some windows machines may not have long paths enabled
12
+ // https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation
13
+ // Assets in nested node_modules (common when using pnpm) - end up creating very long paths
14
+ // Using this function we shorten longer paths to prevent paths from hitting the path limit
15
+ function ensureShortPath(str: string): string {
16
+ if (str.length < 40) return str;
17
+
18
+ const assetsPrefix = 'assets/';
19
+
20
+ if (!str.startsWith(assetsPrefix)) {
21
+ console.warn(`Unexpected asset uri - ${str} may not load correctly.`);
22
+ }
23
+
24
+ const postStr = str.slice(assetsPrefix.length);
25
+ var hash = 0,
26
+ i,
27
+ chr;
28
+ for (i = 0; i < postStr.length; i++) {
29
+ chr = postStr.charCodeAt(i);
30
+ hash = (hash << 5) - hash + chr;
31
+ hash |= 0; // Convert to 32bit integer
32
+ }
33
+ return assetsPrefix + hash.toString();
34
+ }
35
+
36
+ module.exports = ensureShortPath;
@@ -10,6 +10,7 @@
10
10
 
11
11
  const resolveAssetSource = require('./resolveAssetSource.js'); // Get base impl
12
12
  const Platform = require('../Utilities/Platform');
13
+ const ensureShortPath = require('./assetPaths.js');
13
14
 
14
15
  type IPackagerAsset = {
15
16
  __packager_asset: boolean,
@@ -56,7 +57,7 @@ class AssetResolverLateScaleResolution {
56
57
  */
57
58
  _scaledAssetURLInBundle() {
58
59
  const path = this._resolver.bundleUrl || 'file://';
59
- return this._fromSource(path + this._getAssetPath());
60
+ return this._fromSource(path + this._getAssetPath(true));
60
61
  }
61
62
 
62
63
  /**
@@ -66,7 +67,7 @@ class AssetResolverLateScaleResolution {
66
67
  _assetServerURL() {
67
68
  return this._fromSource(
68
69
  this._resolver.serverUrl +
69
- this._getAssetPath() +
70
+ this._getAssetPath(false) +
70
71
  '?platform=' +
71
72
  Platform.OS +
72
73
  '&hash=' +
@@ -77,8 +78,8 @@ class AssetResolverLateScaleResolution {
77
78
  /**
78
79
  * Returns a path like 'assets/AwesomeModule/icon.png'
79
80
  */
80
- _getAssetPath(): string {
81
- const assetDir = this._getBasePath();
81
+ _getAssetPath(local: boolean): string {
82
+ const assetDir = this._getBasePath(local);
82
83
  return (
83
84
  assetDir +
84
85
  '/' +
@@ -88,7 +89,19 @@ class AssetResolverLateScaleResolution {
88
89
  );
89
90
  }
90
91
 
91
- _getBasePath() {
92
+ _getBasePath(local: boolean) {
93
+ if (local) {
94
+ const safePath = this._resolver.asset.httpServerLocation
95
+ .substr(1)
96
+ .replace(/\.\.\//g, '_');
97
+ // If this asset was created with the newer saveAssetPlugin, then we should shorten the path
98
+ // This conditional is added to allow back compat of older bundles which might have been created without the saveAssetPlugin
99
+ if (this._resolver.asset.__useShortPath) {
100
+ return ensureShortPath(safePath);
101
+ }
102
+ return safePath;
103
+ }
104
+
92
105
  let basePath = this._resolver.asset.httpServerLocation;
93
106
  if (basePath[0] === '/') {
94
107
  basePath = basePath.substr(1);
@@ -427,6 +427,7 @@ export default class Pressability {
427
427
  |}>;
428
428
  _touchActivateTime: ?number;
429
429
  _touchState: TouchState = 'NOT_RESPONDER';
430
+ _isKeyDown: boolean = false;
430
431
 
431
432
  constructor(config: PressabilityConfig) {
432
433
  this.configure(config);
@@ -468,6 +469,7 @@ export default class Pressability {
468
469
  if (onBlur != null) {
469
470
  onBlur(event);
470
471
  }
472
+ this._isKeyDown = false;
471
473
  },
472
474
  onFocus: (event: FocusEvent): void => {
473
475
  const {onFocus} = this._config;
@@ -596,7 +598,8 @@ export default class Pressability {
596
598
  (event.nativeEvent.code === 'Space' ||
597
599
  event.nativeEvent.code === 'Enter' ||
598
600
  event.nativeEvent.code === 'GamepadA') &&
599
- event.defaultPrevented !== true
601
+ event.defaultPrevented !== true &&
602
+ this._isKeyDown
600
603
  ) {
601
604
  const {onPressOut, onPress} = this._config;
602
605
  // $FlowFixMe: PressEvents don't mesh with keyboarding APIs. Keep legacy behavior of passing KeyEvents instead
@@ -604,6 +607,8 @@ export default class Pressability {
604
607
  // $FlowFixMe: PressEvents don't mesh with keyboarding APIs. Keep legacy behavior of passing KeyEvents instead
605
608
  onPress && onPress(event);
606
609
  }
610
+ // Native windows app clears the key pressed state when another key press interrupts the current
611
+ this._isKeyDown = false;
607
612
  },
608
613
  onKeyDown: (event: KeyEvent): void => {
609
614
  const {onKeyDown} = this._config;
@@ -616,6 +621,7 @@ export default class Pressability {
616
621
  event.defaultPrevented !== true
617
622
  ) {
618
623
  const {onPressIn} = this._config;
624
+ this._isKeyDown = true;
619
625
  // $FlowFixMe: PressEvents don't mesh with keyboarding APIs. Keep legacy behavior of passing KeyEvents instead
620
626
  onPressIn && onPressIn(event);
621
627
  }
@@ -780,6 +786,12 @@ export default class Pressability {
780
786
  }
781
787
  }
782
788
 
789
+ // [Win32]
790
+ // $FlowFixMe - button typing
791
+ _isDefaultPressButton(button): boolean {
792
+ return !button; // Treat 0 or undefined as default press
793
+ }
794
+
783
795
  /**
784
796
  * Performs a transition between touchable states and identify any activations
785
797
  * or deactivations (and callback invocations).
@@ -808,7 +820,10 @@ export default class Pressability {
808
820
 
809
821
  if (isPressInSignal(prevState) && signal === 'LONG_PRESS_DETECTED') {
810
822
  const {onLongPress} = this._config;
811
- if (onLongPress != null) {
823
+ if (
824
+ onLongPress != null &&
825
+ this._isDefaultPressButton(getTouchFromPressEvent(event).button)
826
+ ) {
812
827
  onLongPress(event);
813
828
  }
814
829
  }
@@ -829,7 +844,11 @@ export default class Pressability {
829
844
  this._deactivate(event);
830
845
  }
831
846
  const {onLongPress, onPress, android_disableSound} = this._config;
832
- if (onPress != null) {
847
+
848
+ if (
849
+ onPress != null &&
850
+ this._isDefaultPressButton(getTouchFromPressEvent(event).button)
851
+ ) {
833
852
  const isPressCanceledByLongPress =
834
853
  onLongPress != null &&
835
854
  prevState === 'RESPONDER_ACTIVE_LONG_PRESS_IN' &&
@@ -848,17 +867,20 @@ export default class Pressability {
848
867
 
849
868
  _activate(event: PressEvent): void {
850
869
  const {onPressIn} = this._config;
851
- const {pageX, pageY} = getTouchFromPressEvent(event);
870
+ const {pageX, pageY, button} = getTouchFromPressEvent(event);
852
871
  this._touchActivatePosition = {pageX, pageY};
853
872
  this._touchActivateTime = Date.now();
854
- if (onPressIn != null) {
873
+ if (onPressIn != null && this._isDefaultPressButton(button)) {
855
874
  onPressIn(event);
856
875
  }
857
876
  }
858
877
 
859
878
  _deactivate(event: PressEvent): void {
860
879
  const {onPressOut} = this._config;
861
- if (onPressOut != null) {
880
+ if (
881
+ onPressOut != null &&
882
+ this._isDefaultPressButton(getTouchFromPressEvent(event).button)
883
+ ) {
862
884
  const minPressDuration = normalizeDelay(
863
885
  this._config.minPressDuration,
864
886
  0,
package/metro.config.js CHANGED
@@ -14,3 +14,5 @@ if (
14
14
 
15
15
  const {makeMetroConfig} = require('@rnw-scripts/metro-dev-config');
16
16
  module.exports = makeMetroConfig();
17
+ // Enable this when RN CLI gets support for saveAssetPlugins: https://github.com/react-native-community/cli/pull/2002
18
+ // module.exports.transformer.assetPlugins = [require.resolve('./metroShortPathAssetDataPlugin.js')];
@@ -0,0 +1,15 @@
1
+ // @ts-check
2
+ /**
3
+ * @typedef {import("metro").AssetData} AssetData;
4
+ **/
5
+
6
+ /**
7
+ * @param {AssetData & {__useShortPath: boolean}} asset
8
+ * @returns {Promise<AssetData>}
9
+ */
10
+ async function metroShortPathAssetDataPlugin(asset) {
11
+ asset.__useShortPath = true;
12
+ return Promise.resolve(asset);
13
+ }
14
+
15
+ module.exports = metroShortPathAssetDataPlugin;
package/overrides.json CHANGED
@@ -221,6 +221,10 @@
221
221
  "baseHash": "37908d71eb9a61c619f700795ff2d692410c5a57",
222
222
  "issue": 5170
223
223
  },
224
+ {
225
+ "type": "platform",
226
+ "file": "src/Libraries/Image/assetPaths.js"
227
+ },
224
228
  {
225
229
  "type": "derived",
226
230
  "file": "src/Libraries/Image/Image.win32.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@office-iss/react-native-win32",
3
- "version": "0.71.12",
3
+ "version": "0.71.14",
4
4
  "description": "Implementation of react native on top of Office's Win32 platform.",
5
5
  "license": "MIT",
6
6
  "main": "./index.win32.js",
@@ -7,6 +7,8 @@ module.exports = {
7
7
  projectConfig: (projectRoot, projectParams) => null,
8
8
  dependencyConfig: (projectRoot, dependencyParams) => null,
9
9
  npmPackageName: '@office-iss/react-native-win32',
10
+ // Enable once CLI config supports it - https://github.com/react-native-community/cli/pull/2002
11
+ // saveAssetsPlugin: '@office-iss/react-native-win32/saveAssetPlugin'
10
12
  },
11
13
  },
12
14
  };
@@ -0,0 +1,45 @@
1
+ // @ts-check
2
+ const path = require('path');
3
+ const ensureShortPath = require('./Libraries/Image/assetPaths');
4
+
5
+ /**
6
+ * @typedef {import("metro").AssetData} AssetData;
7
+ **/
8
+
9
+ /**
10
+ * @param {AssetData} asset
11
+ * @param {number} scale
12
+ * @returns {string}
13
+ */
14
+ function getAssetDestPath(asset, scale) {
15
+ const suffix = scale === 1 ? '' : `@${scale}x`;
16
+ const fileName = `${asset.name + suffix}.${asset.type}`;
17
+ return path.join(
18
+ // Assets can have relative paths outside of the project root.
19
+ // Replace `../` with `_` to make sure they don't end up outside of
20
+ // the expected assets directory.
21
+ ensureShortPath(asset.httpServerLocation.substr(1).replace(/\.\.\//g, '_')),
22
+ fileName,
23
+ );
24
+ }
25
+
26
+ /**
27
+ * @param {ReadonlyArray<AssetData>} assets
28
+ * @param {string} _platform
29
+ * @param {string | undefined} _assetsDest
30
+ * @param {string | undefined} _assetCatalogDest
31
+ * @param {(asset: AssetData, allowedScales: number[] | undefined, getAssetDestPath: (asset: AssetData, scale: number) => string) => void} addAssetToCopy
32
+ */
33
+ function saveAssetsWin32(
34
+ assets,
35
+ _platform,
36
+ _assetsDest,
37
+ _assetCatalogDest,
38
+ addAssetToCopy,
39
+ ) {
40
+ assets.forEach((asset) =>
41
+ addAssetToCopy(asset, undefined, getAssetDestPath),
42
+ );
43
+ }
44
+
45
+ module.exports = saveAssetsWin32;