@expo/fingerprint 0.4.1 → 0.6.0

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.
Files changed (53) hide show
  1. package/README.md +60 -6
  2. package/bin/cli.js +26 -5
  3. package/build/sourcer/Bare.js +13 -7
  4. package/build/sourcer/Bare.js.map +1 -1
  5. package/package.json +16 -9
  6. package/.eslintignore +0 -1
  7. package/CHANGELOG.md +0 -55
  8. package/__mocks__/@expo/spawn-async.ts +0 -30
  9. package/__mocks__/fs/promises.ts +0 -17
  10. package/__mocks__/fs.ts +0 -2
  11. package/__mocks__/resolve-from.ts +0 -24
  12. package/babel.config.js +0 -6
  13. package/e2e/__tests__/__snapshots__/managed-test.ts.snap +0 -242
  14. package/e2e/__tests__/bare-test.ts +0 -72
  15. package/e2e/__tests__/managed-test.ts +0 -165
  16. package/e2e/jest.config.js +0 -11
  17. package/jest.config.js +0 -10
  18. package/scripts/createFixture.ts +0 -81
  19. package/src/Dedup.ts +0 -97
  20. package/src/Fingerprint.ts +0 -60
  21. package/src/Fingerprint.types.ts +0 -110
  22. package/src/Options.ts +0 -81
  23. package/src/Sort.ts +0 -22
  24. package/src/__tests__/Dedup-test.ts +0 -177
  25. package/src/__tests__/Fingerprint-test.ts +0 -143
  26. package/src/__tests__/Sort-test.ts +0 -56
  27. package/src/hash/Hash.ts +0 -203
  28. package/src/hash/__tests__/Hash-test.ts +0 -238
  29. package/src/index.ts +0 -2
  30. package/src/sourcer/Bare.ts +0 -115
  31. package/src/sourcer/Expo.ts +0 -223
  32. package/src/sourcer/ExpoConfigLoader.ts +0 -84
  33. package/src/sourcer/PatchPackage.ts +0 -18
  34. package/src/sourcer/Sourcer.ts +0 -58
  35. package/src/sourcer/Utils.ts +0 -62
  36. package/src/sourcer/__tests__/Bare-test.ts +0 -88
  37. package/src/sourcer/__tests__/Expo-test.ts +0 -305
  38. package/src/sourcer/__tests__/PatchPackage-test.ts +0 -57
  39. package/src/sourcer/__tests__/Sourcer-test.ts +0 -21
  40. package/src/sourcer/__tests__/Utils-test.ts +0 -41
  41. package/src/sourcer/__tests__/__snapshots__/Bare-test.ts.snap +0 -21
  42. package/src/sourcer/__tests__/__snapshots__/Expo-test.ts.snap +0 -139
  43. package/src/sourcer/__tests__/fixtures/BareReactNative70Project.json +0 -47
  44. package/src/sourcer/__tests__/fixtures/ExpoAutolinkingAndroid.json +0 -82
  45. package/src/sourcer/__tests__/fixtures/ExpoAutolinkingIos.json +0 -114
  46. package/src/sourcer/__tests__/fixtures/ExpoManaged47Project.json +0 -6
  47. package/src/sourcer/__tests__/fixtures/PatchPackage.json +0 -4
  48. package/src/sourcer/__tests__/fixtures/RncliAutoLinking.json +0 -165
  49. package/src/utils/Path.ts +0 -26
  50. package/src/utils/Profile.ts +0 -47
  51. package/src/utils/__tests__/Path-test.ts +0 -36
  52. package/src/utils/__tests__/Profile-test.ts +0 -11
  53. package/tsconfig.json +0 -9
package/README.md CHANGED
@@ -2,7 +2,14 @@
2
2
 
3
3
  A library to generate a fingerprint from a React Native project
4
4
 
5
- ## Usage
5
+ ## Table of Contents
6
+
7
+ * [API Usage](#api-usage)
8
+ * [CLI Usage](#cli-usage)
9
+ * [Customizations](#customizations)
10
+ * [Limitations](#limitations)
11
+
12
+ ## API Usage
6
13
 
7
14
  ```ts
8
15
  import * as Fingerprint from '@expo/fingerprint';
@@ -10,10 +17,14 @@ import * as Fingerprint from '@expo/fingerprint';
10
17
  await Fingerprint.createFingerprintAsync('/projectRoot');
11
18
  ```
12
19
 
13
- ### `async function createFingerprintAsync(projectRoot: string, options?: Options): Promise<Fingerprint>`
20
+ ### createFingerprintAsync
14
21
 
15
22
  Create a fingerprint from project
16
23
 
24
+ ```ts
25
+ function createFingerprintAsync(projectRoot: string, options?: Options): Promise<Fingerprint>;
26
+ ```
27
+
17
28
  Example:
18
29
 
19
30
  ```ts
@@ -47,10 +58,14 @@ console.log(fingerprint);
47
58
  }
48
59
  ```
49
60
 
50
- ### `async function createProjectHashAsync(projectRoot: string, options?: Options): Promise<string>`
61
+ ### createProjectHashAsync
51
62
 
52
63
  Create a native hash value from project
53
64
 
65
+ ```ts
66
+ function createProjectHashAsync(projectRoot: string, options?: Options): Promise<string>;
67
+ ```
68
+
54
69
  Example:
55
70
 
56
71
  ```ts
@@ -62,9 +77,13 @@ console.log(hash);
62
77
  bf8a3b08935f056270b1688333b02f1ef5fa25bf
63
78
  ```
64
79
 
65
- ### `diffFingerprintChangesAsync(fingerprint: Fingerprint, projectRoot: string, options?: Options): Promise<FingerprintSource[]>`
80
+ ### diffFingerprintChangesAsync
66
81
 
67
- Differentiate given `fingerprint` with the current project fingerprint state
82
+ Diff the given `fingerprint` with the current project fingerprint state
83
+
84
+ ```ts
85
+ function diffFingerprintChangesAsync(fingerprint: Fingerprint, projectRoot: string, options?: Options): Promise<FingerprintSource[]>;
86
+ ```
68
87
 
69
88
  Example:
70
89
 
@@ -113,13 +132,48 @@ console.log(result);
113
132
  ]
114
133
  ```
115
134
 
135
+ ### diffFingerprints
136
+
137
+ Find the diff between two fingerprints
138
+
139
+ ```ts
140
+ function diffFingerprints(fingerprint1: Fingerprint, fingerprint2: Fingerprint): FingerprintSource[];
141
+ ```
142
+
116
143
  ## CLI Usage
117
144
 
145
+ ### Generate a fingerprint for a given project
146
+
118
147
  `npx @expo/fingerprint /path/to/projectRoot`
119
148
 
149
+ ### Generate a fingerprint for a given project and write it to a file
150
+
151
+ `npx @expo/fingerprint /path/to/projectRoot > fingerprint.json`
152
+
153
+ ### Compare a fingerprint with the current project state
154
+
155
+ `npx @expo/fingerprint /path/to/projectRoot fingerprint.json`
156
+
157
+ ## Customizations
158
+
159
+ ### Include or exclude extra files in the **.fingerprintignore** file
160
+
161
+ Our default ignore paths, found here [`DEFAULT_IGNORE_PATHS`](https://github.com/expo/expo/blob/main/packages/%40expo/fingerprint/src/Options.ts#L9), make hashing fast and keep hashing results stable. If the default setup does not fit your workflow, you can add a **.fingerprintignore** file in your project root. It works like [**.gitignore**](https://git-scm.com/docs/gitignore#_pattern_format) but with some slight differences: We use `minimatch` for pattern matching with the [limitations](https://github.com/expo/expo/blob/9b9133c96f209b0616d1796aadae28913f8d012f/packages/%40expo/fingerprint/src/Fingerprint.types.ts#L46-L55).
162
+
163
+ Here's how to use **.fingerprintignore**: To skip a whole folder but keep some files, you can do this:
164
+
165
+ ```
166
+ # Ignore the entire /app/ios folder
167
+ /app/ios/**/*
168
+
169
+ # But still keep /app/ios/Podfile and /app/ios/Podfile.lock
170
+ !/app/ios/Podfile
171
+ !/app/ios/Podfile.lock
172
+ ```
173
+
120
174
  ## Limitations
121
175
 
122
- ## Limited support for [config-plugins raw functions](https://docs.expo.dev/config-plugins/plugins-and-mods/#raw-functions)
176
+ ### Limited support for [config-plugins raw functions](https://docs.expo.dev/config-plugins/plugins-and-mods/#raw-functions)
123
177
 
124
178
  When using config-plugins with raw functions, it's essential to be aware of certain limitations, particularly in the context of fingerprinting. Expo makes its best effort to generate fingerprints for changes made through config-plugins; however, raw functions pose specific challenges. Raw functions are not serializable as fingerprints, which means they cannot be directly used for generating unique hashes.
125
179
 
package/bin/cli.js CHANGED
@@ -1,24 +1,45 @@
1
1
  #!/usr/bin/env node
2
2
  const path = require('path');
3
+ const fs = require('fs');
3
4
 
4
5
  let Fingerprint;
5
6
  try {
6
7
  Fingerprint = require('@expo/fingerprint');
7
- } catch {}
8
+ } catch { }
8
9
  if (!Fingerprint) {
9
10
  Fingerprint = require(path.join(__dirname, '..', 'build', 'index'));
10
11
  }
11
12
 
12
13
  (async () => {
13
- if (process.argv.length !== 3) {
14
- console.log(`Usage: ${path.basename(process.argv[1])} projectRoot`);
14
+ if (process.argv.length !== 3 && process.argv.length !== 4) {
15
+ console.log(`Usage: ${path.basename(process.argv[1])} projectRoot [fingerprintFileToDiff]`);
15
16
  process.exit(1);
16
17
  }
18
+
19
+ let comparatorFingerprint;
20
+ if (process.argv.length === 4) {
21
+ const comparator = process.argv[3];
22
+ try {
23
+ comparatorFingerprint = JSON.parse(fs.readFileSync(comparator));
24
+ } catch (e) {
25
+ console.log(`Unable to diff with fingerprint file ${comparator}: ${e.message}`);
26
+ process.exit(1);
27
+ }
28
+ }
29
+
17
30
  const projectRoot = process.argv[2];
18
31
 
19
32
  try {
20
- const fingerprint = await Fingerprint.createFingerprintAsync(projectRoot);
21
- console.log(JSON.stringify(fingerprint, null, 2));
33
+ if (comparatorFingerprint) {
34
+ const diff = await Fingerprint.diffFingerprintChangesAsync(
35
+ comparatorFingerprint,
36
+ projectRoot
37
+ );
38
+ console.log(JSON.stringify(diff, null, 2));
39
+ } else {
40
+ const fingerprint = await Fingerprint.createFingerprintAsync(projectRoot);
41
+ console.log(JSON.stringify(fingerprint, null, 2));
42
+ }
22
43
  // console.log(fingerprint.hash);
23
44
  } catch (e) {
24
45
  console.error('Uncaught Error', e);
@@ -74,11 +74,16 @@ async function getRncliAutolinkingSourcesAsync(projectRoot, options) {
74
74
  const reasons = ['bareRncliAutolinking'];
75
75
  const autolinkingConfig = {};
76
76
  for (const [depName, depData] of Object.entries(config.dependencies)) {
77
- stripRncliAutolinkingAbsolutePaths(depData, root);
78
- const filePath = depData.root;
79
- debug(`Adding react-native-cli autolinking dir - ${chalk_1.default.dim(filePath)}`);
80
- results.push({ type: 'dir', filePath, reasons });
81
- autolinkingConfig[depName] = depData;
77
+ try {
78
+ stripRncliAutolinkingAbsolutePaths(depData, root);
79
+ const filePath = depData.root;
80
+ debug(`Adding react-native-cli autolinking dir - ${chalk_1.default.dim(filePath)}`);
81
+ results.push({ type: 'dir', filePath, reasons });
82
+ autolinkingConfig[depName] = depData;
83
+ }
84
+ catch (e) {
85
+ debug(chalk_1.default.red(`Error adding react-native-cli autolinking dir - ${depName}.\n${e}`));
86
+ }
82
87
  }
83
88
  results.push({
84
89
  type: 'contents',
@@ -88,7 +93,8 @@ async function getRncliAutolinkingSourcesAsync(projectRoot, options) {
88
93
  });
89
94
  return results;
90
95
  }
91
- catch {
96
+ catch (e) {
97
+ debug(chalk_1.default.red(`Error adding react-native-cli autolinking sources.\n${e}`));
92
98
  return [];
93
99
  }
94
100
  }
@@ -98,7 +104,7 @@ function stripRncliAutolinkingAbsolutePaths(dependency, root) {
98
104
  const dependencyRoot = dependency.root;
99
105
  dependency.root = path_1.default.relative(root, dependencyRoot);
100
106
  for (const platformData of Object.values(dependency.platforms)) {
101
- for (const [key, value] of Object.entries(platformData)) {
107
+ for (const [key, value] of Object.entries(platformData ?? {})) {
102
108
  platformData[key] = value.startsWith?.(dependencyRoot) ? path_1.default.relative(root, value) : value;
103
109
  }
104
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Bare.js","sourceRoot":"","sources":["../../src/sourcer/Bare.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Bare.js","sourceRoot":"","sources":["../../src/sourcer/Bare.ts"],"names":[],"mappings":";;;;;;AAAA,oEAA2C;AAC3C,oDAA4B;AAC5B,kDAA0B;AAC1B,gDAAwB;AACxB,gEAAuC;AAEvC,mCAAsD;AAGtD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,+BAA+B,CAAC,CAAC;AAEzD,KAAK,UAAU,0BAA0B,CAC9C,WAAmB,EACnB,OAA0B;IAE1B,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,IAAA,mCAA2B,EAAC,WAAW,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;QAC1F,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,KAAK,CAAC,4BAA4B,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,CAAC;SACjB;KACF;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAZD,gEAYC;AAEM,KAAK,UAAU,sBAAsB,CAC1C,WAAmB,EACnB,OAA0B;IAE1B,IAAI,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACrC,MAAM,MAAM,GAAG,MAAM,IAAA,mCAA2B,EAAC,WAAW,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACtF,IAAI,MAAM,IAAI,IAAI,EAAE;YAClB,KAAK,CAAC,4BAA4B,eAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,MAAM,CAAC,CAAC;SACjB;KACF;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAZD,wDAYC;AAEM,KAAK,UAAU,gCAAgC,CACpD,WAAmB,EACnB,OAA0B;IAE1B,IAAI,WAAW,CAAC;IAChB,IAAI;QACF,WAAW,GAAG,OAAO,CAAC,IAAA,sBAAW,EAAC,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC;KACjF;IAAC,OAAO,CAAU,EAAE;QACnB,KAAK,CAAC,oCAAoC,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC;QAC1F,OAAO,EAAE,CAAC;KACX;IACD,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,IAAI,WAAW,CAAC,OAAO,EAAE;QACvB,KAAK,CAAC,kCAAkC,eAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAChE,MAAM,EAAE,GAAG,qBAAqB,CAAC;QACjC,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,UAAU;YAChB,EAAE;YACF,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC;YAC7C,OAAO,EAAE,CAAC,EAAE,CAAC;SACd,CAAC,CAAC;KACJ;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAvBD,4EAuBC;AAEM,KAAK,UAAU,wBAAwB,CAAC,WAAmB,EAAE,OAA0B;IAC5F,MAAM,MAAM,GAAG,MAAM,IAAA,mCAA2B,EAAC,WAAW,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAC7F,IAAI,MAAM,IAAI,IAAI,EAAE;QAClB,KAAK,CAAC,iBAAiB,eAAK,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,MAAM,CAAC,CAAC;KACjB;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAPD,4DAOC;AAEM,KAAK,UAAU,+BAA+B,CACnD,WAAmB,EACnB,OAA0B;IAE1B,IAAI;QACF,MAAM,OAAO,GAAiB,EAAE,CAAC;QACjC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,qBAAU,EAAC,KAAK,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7F,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACxB,MAAM,OAAO,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACzC,MAAM,iBAAiB,GAAwB,EAAE,CAAC;QAClD,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAM,MAAM,CAAC,YAAY,CAAC,EAAE;YACzE,IAAI;gBACF,kCAAkC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;gBAC9B,KAAK,CAAC,6CAA6C,eAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;gBAEjD,iBAAiB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;aACtC;YAAC,OAAO,CAAC,EAAE;gBACV,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,mDAAmD,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;aACvF;SACF;QAED,OAAO,CAAC,IAAI,CAAC;YACX,IAAI,EAAE,UAAU;YAChB,EAAE,EAAE,wBAAwB;YAC5B,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC;YAC3C,OAAO;SACR,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;KAChB;IAAC,OAAO,CAAC,EAAE;QACV,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,uDAAuD,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,EAAE,CAAC;KACX;AACH,CAAC;AAnCD,0EAmCC;AAED,SAAS,kCAAkC,CAAC,UAAe,EAAE,IAAY;IACvE,IAAA,gBAAM,EAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC;IACvC,UAAU,CAAC,IAAI,GAAG,cAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IACtD,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,MAAM,CAAM,UAAU,CAAC,SAAS,CAAC,EAAE;QACnE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAM,YAAY,IAAI,EAAE,CAAC,EAAE;YAClE,YAAY,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SAC7F;KACF;AACH,CAAC"}
package/package.json CHANGED
@@ -1,21 +1,27 @@
1
1
  {
2
2
  "name": "@expo/fingerprint",
3
- "version": "0.4.1",
3
+ "version": "0.6.0",
4
4
  "description": "A library to generate a fingerprint from a React Native project",
5
5
  "main": "build/index.js",
6
6
  "types": "build/index.d.ts",
7
7
  "scripts": {
8
- "watch": "tsc --watch --preserveWatchOutput",
9
- "build": "tsc --sourceMap",
10
- "prepare": "yarn run clean && yarn build",
11
- "clean": "rimraf build ./tsconfig.tsbuildinfo",
12
- "lint": "eslint .",
13
- "test": "jest",
14
- "test:e2e": "yarn prepare && jest --config e2e/jest.config.js"
8
+ "build": "expo-module tsc",
9
+ "clean": "expo-module clean",
10
+ "lint": "expo-module lint",
11
+ "prepare": "expo-module clean && expo-module tsc",
12
+ "prepublishOnly": "expo-module prepublishOnly",
13
+ "test": "expo-module test",
14
+ "test:e2e": "yarn run prepare && expo-module test --config e2e/jest.config.js",
15
+ "typecheck": "expo-module typecheck",
16
+ "watch": "expo-module tsc --watch"
15
17
  },
16
18
  "bin": {
17
19
  "fingerprint": "bin/cli.js"
18
20
  },
21
+ "files": [
22
+ "bin",
23
+ "build"
24
+ ],
19
25
  "keywords": [
20
26
  "expo",
21
27
  "react-native",
@@ -45,8 +51,9 @@
45
51
  },
46
52
  "devDependencies": {
47
53
  "@types/find-up": "^4.0.0",
54
+ "expo-module-scripts": "^3.3.0",
48
55
  "glob": "^7.1.7",
49
56
  "temp-dir": "^2.0.0"
50
57
  },
51
- "gitHead": "3142a086578deffd8704a8f1b6f0f661527d836c"
58
+ "gitHead": "2763e9cc6f2317b40da73382fe2595f8deebff46"
52
59
  }
package/.eslintignore DELETED
@@ -1 +0,0 @@
1
- build
package/CHANGELOG.md DELETED
@@ -1,55 +0,0 @@
1
- # Changelog
2
-
3
- ## Unpublished
4
-
5
- ### 🛠 Breaking changes
6
-
7
- ### 🎉 New features
8
-
9
- ### 🐛 Bug fixes
10
-
11
- ### 💡 Others
12
-
13
- ## 0.4.1 — 2023-11-14
14
-
15
- _This version does not introduce any user-facing changes._
16
-
17
- ## 0.4.0 — 2023-10-17
18
-
19
- ### 💡 Others
20
-
21
- - Transpile for Node 18 (LTS). ([#24471](https://github.com/expo/expo/pull/24471) by [@EvanBacon](https://github.com/EvanBacon))
22
-
23
- ## 0.3.0 — 2023-09-20
24
-
25
- ### 🛠 Breaking changes
26
-
27
- - This version includes fingerprint result breaking changes. ([#24520](https://github.com/expo/expo/pull/24520) by [@kudo](https://github.com/kudo))
28
-
29
- ### 🎉 New features
30
-
31
- - Improve fingerprint sourcing scope for local config-plugins. ([#24520](https://github.com/expo/expo/pull/24520) by [@kudo](https://github.com/kudo))
32
-
33
- ## 0.2.0 — 2023-09-08
34
-
35
- ### 🛠 Breaking changes
36
-
37
- - Normalize Expo config and remove `runtimeVersion` from fingerprint. Note that the fingerprint result will be changed from this version. ([#24290](https://github.com/expo/expo/pull/24290) by [@Kudo](https://github.com/kudo))
38
-
39
- ### 🎉 New features
40
-
41
- - Added `options.ignorePaths` and **.fingerprintignore** to support. ([#24265](https://github.com/expo/expo/pull/24265) by [@Kudo](https://github.com/kudo))
42
-
43
- ## 0.1.0 — 2023-08-29
44
-
45
- ### 🛠 Breaking changes
46
-
47
- - The fingerprint result is changed since this version. ([24097](https://github.com/expo/expo/pull/24097) by [@kudo](https://github.com/kudo))
48
-
49
- ### 🎉 New features
50
-
51
- - Added `diffFingerprints()` to support diff for two fingerprints. ([24097](https://github.com/expo/expo/pull/24097) by [@kudo](https://github.com/kudo))
52
-
53
- ### 🐛 Bug fixes
54
-
55
- - Fixed non-deterministic hash if packages hoisted from monorepo. ([24097](https://github.com/expo/expo/pull/24097) by [@kudo](https://github.com/kudo))
@@ -1,30 +0,0 @@
1
- import spawnAsync from '@expo/spawn-async';
2
- import { getConfig } from 'expo/config';
3
- import path from 'path';
4
-
5
- type SpawnAsyncType = typeof spawnAsync;
6
-
7
- const origSpawnAsync = jest.requireActual('@expo/spawn-async') as SpawnAsyncType;
8
- const mockSpawnAsync = jest
9
- .fn()
10
- .mockImplementation(
11
- async (
12
- command: Parameters<SpawnAsyncType>[0],
13
- args: Parameters<SpawnAsyncType>[1],
14
- options: Parameters<SpawnAsyncType>[2]
15
- ) => {
16
- if (args != null && args.length >= 2 && path.parse(args[0]).name === 'ExpoConfigLoader') {
17
- // For unit tests, we don't really spawn a process to execute the ExpoConfigLoader because the file system is just a memfs.
18
- // Rather than that, we just call `getConfig` directly.
19
- const projectRoot = args[1];
20
- const config = await getConfig(projectRoot, { skipSDKVersionRequirement: true });
21
- const stdout = JSON.stringify({ config, loadedModules: [] });
22
- return {
23
- stdout,
24
- };
25
- }
26
- return origSpawnAsync(command, args, options);
27
- }
28
- ) as SpawnAsyncType;
29
-
30
- module.exports = mockSpawnAsync;
@@ -1,17 +0,0 @@
1
- import { fs } from 'memfs';
2
- import path from 'path';
3
-
4
- /**
5
- * Further mock `fs.promises` to ensure the parent directory exists.
6
- * We used to call `fs.promises.mkdtemp(path.join(os.tmpdir(), ...))`, so that we don't have to worry about os.tmpdir() exists.
7
- */
8
- const origMkdtemp = fs.promises.mkdtemp;
9
- fs.promises.mkdtemp = (
10
- prefix: string,
11
- options?: Parameters<typeof origMkdtemp>[1]
12
- ): ReturnType<typeof origMkdtemp> => {
13
- fs.mkdirSync(path.dirname(prefix), { recursive: true });
14
- return origMkdtemp(prefix, options);
15
- };
16
-
17
- module.exports = fs.promises;
package/__mocks__/fs.ts DELETED
@@ -1,2 +0,0 @@
1
- import { fs } from 'memfs';
2
- module.exports = fs;
@@ -1,24 +0,0 @@
1
- const resolveFrom = jest.requireActual('resolve-from');
2
-
3
- function mockedResolveFrom(fromDirectory: string, moduleId: string, silent: boolean) {
4
- if (fromDirectory === '/app' && moduleId === './package.json') {
5
- // Mock call for resolveFrom('/app', './package.json')
6
- return '/app/package.json';
7
- } else {
8
- // We should use the resolve from current projectRoot rather than mocked /app.
9
- // E.g. resolveFrom('/app', 'expo/config') -> resolveFrom(__dirname, 'expo/config')
10
- return silent ? resolveFrom.silent(__dirname, moduleId) : resolveFrom(__dirname, moduleId);
11
- }
12
- }
13
-
14
- module.exports = jest
15
- .fn()
16
- .mockImplementation((fromDirectory: string, moduleId: string) =>
17
- mockedResolveFrom(fromDirectory, moduleId, false)
18
- );
19
-
20
- module.exports.silent = jest
21
- .fn()
22
- .mockImplementation((fromDirectory: string, moduleId: string) =>
23
- mockedResolveFrom(fromDirectory, moduleId, true)
24
- );
package/babel.config.js DELETED
@@ -1,6 +0,0 @@
1
- module.exports = function (api) {
2
- api.cache(true);
3
- return {
4
- presets: ['@expo/babel-preset-cli'],
5
- };
6
- };
@@ -1,242 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`getHashSourcesAsync - managed project should match snapshot 1`] = `
4
- [
5
- {
6
- "filePath": "node_modules/expo/android",
7
- "reasons": [
8
- "expoAutolinkingAndroid",
9
- ],
10
- "type": "dir",
11
- },
12
- {
13
- "filePath": "node_modules/expo-application/android",
14
- "reasons": [
15
- "expoAutolinkingAndroid",
16
- ],
17
- "type": "dir",
18
- },
19
- {
20
- "filePath": "node_modules/expo-constants/android",
21
- "reasons": [
22
- "expoAutolinkingAndroid",
23
- ],
24
- "type": "dir",
25
- },
26
- {
27
- "filePath": "node_modules/expo-file-system/android",
28
- "reasons": [
29
- "expoAutolinkingAndroid",
30
- ],
31
- "type": "dir",
32
- },
33
- {
34
- "filePath": "node_modules/expo-font/android",
35
- "reasons": [
36
- "expoAutolinkingAndroid",
37
- ],
38
- "type": "dir",
39
- },
40
- {
41
- "filePath": "node_modules/expo-keep-awake/android",
42
- "reasons": [
43
- "expoAutolinkingAndroid",
44
- ],
45
- "type": "dir",
46
- },
47
- {
48
- "filePath": "node_modules/expo-modules-core/android",
49
- "reasons": [
50
- "expoAutolinkingAndroid",
51
- ],
52
- "type": "dir",
53
- },
54
- {
55
- "filePath": "node_modules/expo-modules-core/android-annotation",
56
- "reasons": [
57
- "expoAutolinkingAndroid",
58
- ],
59
- "type": "dir",
60
- },
61
- {
62
- "filePath": "node_modules/expo-modules-core/android-annotation-processor",
63
- "reasons": [
64
- "expoAutolinkingAndroid",
65
- ],
66
- "type": "dir",
67
- },
68
- {
69
- "contents": "{"extraDependencies":{"androidMavenRepos":[],"iosPods":{}},"modules":[{"packageName":"expo","packageVersion":"49.0.16","projects":[{"name":"expo","sourceDir":"node_modules/expo/android"}],"modules":[]},{"packageName":"expo-application","packageVersion":"5.3.1","projects":[{"name":"expo-application","sourceDir":"node_modules/expo-application/android"}],"modules":[]},{"packageName":"expo-constants","packageVersion":"14.4.2","projects":[{"name":"expo-constants","sourceDir":"node_modules/expo-constants/android"}],"modules":["expo.modules.constants.ConstantsModule"]},{"packageName":"expo-file-system","packageVersion":"15.4.4","projects":[{"name":"expo-file-system","sourceDir":"node_modules/expo-file-system/android"}],"modules":["expo.modules.filesystem.FileSystemModule"]},{"packageName":"expo-font","packageVersion":"11.4.0","projects":[{"name":"expo-font","sourceDir":"node_modules/expo-font/android"}],"modules":[]},{"packageName":"expo-keep-awake","packageVersion":"12.3.0","projects":[{"name":"expo-keep-awake","sourceDir":"node_modules/expo-keep-awake/android"}],"modules":[]},{"packageName":"expo-modules-core","packageVersion":"1.5.11","projects":[{"name":"expo-modules-core","sourceDir":"node_modules/expo-modules-core/android"},{"name":"expo-modules-core$android-annotation","sourceDir":"node_modules/expo-modules-core/android-annotation"},{"name":"expo-modules-core$android-annotation-processor","sourceDir":"node_modules/expo-modules-core/android-annotation-processor"}],"modules":[]}]}",
70
- "id": "expoAutolinkingConfig:android",
71
- "reasons": [
72
- "expoAutolinkingAndroid",
73
- ],
74
- "type": "contents",
75
- },
76
- {
77
- "filePath": "node_modules/expo",
78
- "reasons": [
79
- "expoAutolinkingIos",
80
- ],
81
- "type": "dir",
82
- },
83
- {
84
- "filePath": "node_modules/expo-application/ios",
85
- "reasons": [
86
- "expoAutolinkingIos",
87
- ],
88
- "type": "dir",
89
- },
90
- {
91
- "filePath": "node_modules/expo-constants/ios",
92
- "reasons": [
93
- "expoAutolinkingIos",
94
- ],
95
- "type": "dir",
96
- },
97
- {
98
- "filePath": "node_modules/expo-file-system/ios",
99
- "reasons": [
100
- "expoAutolinkingIos",
101
- ],
102
- "type": "dir",
103
- },
104
- {
105
- "filePath": "node_modules/expo-font/ios",
106
- "reasons": [
107
- "expoAutolinkingIos",
108
- ],
109
- "type": "dir",
110
- },
111
- {
112
- "filePath": "node_modules/expo-keep-awake/ios",
113
- "reasons": [
114
- "expoAutolinkingIos",
115
- ],
116
- "type": "dir",
117
- },
118
- {
119
- "filePath": "node_modules/expo-modules-core",
120
- "reasons": [
121
- "expoAutolinkingIos",
122
- ],
123
- "type": "dir",
124
- },
125
- {
126
- "contents": "{"extraDependencies":{"androidMavenRepos":[],"iosPods":{}},"modules":[{"packageName":"expo","packageVersion":"49.0.16","pods":[{"podName":"Expo","podspecDir":"node_modules/expo"}],"swiftModuleNames":["Expo"],"modules":[],"appDelegateSubscribers":[],"reactDelegateHandlers":[],"debugOnly":false},{"packageName":"expo-application","packageVersion":"5.3.1","pods":[{"podName":"EXApplication","podspecDir":"node_modules/expo-application/ios"}],"swiftModuleNames":["EXApplication"],"modules":[],"appDelegateSubscribers":[],"reactDelegateHandlers":[],"debugOnly":false},{"packageName":"expo-constants","packageVersion":"14.4.2","pods":[{"podName":"EXConstants","podspecDir":"node_modules/expo-constants/ios"}],"swiftModuleNames":["EXConstants"],"modules":["ConstantsModule"],"appDelegateSubscribers":[],"reactDelegateHandlers":[],"debugOnly":false},{"packageName":"expo-file-system","packageVersion":"15.4.4","pods":[{"podName":"EXFileSystem","podspecDir":"node_modules/expo-file-system/ios"}],"swiftModuleNames":["EXFileSystem"],"modules":[],"appDelegateSubscribers":[],"reactDelegateHandlers":[],"debugOnly":false},{"packageName":"expo-font","packageVersion":"11.4.0","pods":[{"podName":"EXFont","podspecDir":"node_modules/expo-font/ios"}],"swiftModuleNames":["EXFont"],"modules":[],"appDelegateSubscribers":[],"reactDelegateHandlers":[],"debugOnly":false},{"packageName":"expo-keep-awake","packageVersion":"12.3.0","pods":[{"podName":"ExpoKeepAwake","podspecDir":"node_modules/expo-keep-awake/ios"}],"swiftModuleNames":["ExpoKeepAwake"],"modules":["KeepAwakeModule"],"appDelegateSubscribers":[],"reactDelegateHandlers":[],"debugOnly":false},{"packageName":"expo-modules-core","packageVersion":"1.5.11","pods":[{"podName":"ExpoModulesCore","podspecDir":"node_modules/expo-modules-core"}],"swiftModuleNames":["ExpoModulesCore"],"modules":[],"appDelegateSubscribers":[],"reactDelegateHandlers":[],"debugOnly":false}]}",
127
- "id": "expoAutolinkingConfig:ios",
128
- "reasons": [
129
- "expoAutolinkingIos",
130
- ],
131
- "type": "contents",
132
- },
133
- {
134
- "contents": "{"android":{"adaptiveIcon":{"backgroundColor":"#ffffff","foregroundImage":"./assets/adaptive-icon.png"}},"assetBundlePatterns":["**/*"],"icon":"./assets/icon.png","ios":{"supportsTablet":true},"name":"fingerprint-e2e-managed","orientation":"portrait","platforms":["android","ios"],"sdkVersion":"49.0.0","slug":"fingerprint-e2e-managed","splash":{"backgroundColor":"#ffffff","image":"./assets/splash.png","resizeMode":"contain"},"userInterfaceStyle":"light","version":"1.0.0","web":{"favicon":"./assets/favicon.png"}}",
135
- "id": "expoConfig",
136
- "reasons": [
137
- "expoConfig",
138
- ],
139
- "type": "contents",
140
- },
141
- {
142
- "filePath": "./assets/icon.png",
143
- "reasons": [
144
- "expoConfigExternalFile",
145
- ],
146
- "type": "file",
147
- },
148
- {
149
- "filePath": "./assets/adaptive-icon.png",
150
- "reasons": [
151
- "expoConfigExternalFile",
152
- ],
153
- "type": "file",
154
- },
155
- {
156
- "filePath": "./assets/splash.png",
157
- "reasons": [
158
- "expoConfigExternalFile",
159
- ],
160
- "type": "file",
161
- },
162
- {
163
- "filePath": "node_modules/chalk/index.js",
164
- "reasons": [
165
- "expoConfigPlugins",
166
- ],
167
- "type": "file",
168
- },
169
- {
170
- "filePath": "node_modules/chalk/node_modules/ansi-styles/index.js",
171
- "reasons": [
172
- "expoConfigPlugins",
173
- ],
174
- "type": "file",
175
- },
176
- {
177
- "filePath": "node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/index.js",
178
- "reasons": [
179
- "expoConfigPlugins",
180
- ],
181
- "type": "file",
182
- },
183
- {
184
- "filePath": "node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/conversions.js",
185
- "reasons": [
186
- "expoConfigPlugins",
187
- ],
188
- "type": "file",
189
- },
190
- {
191
- "filePath": "node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/node_modules/color-name/index.js",
192
- "reasons": [
193
- "expoConfigPlugins",
194
- ],
195
- "type": "file",
196
- },
197
- {
198
- "filePath": "node_modules/chalk/node_modules/ansi-styles/node_modules/color-convert/route.js",
199
- "reasons": [
200
- "expoConfigPlugins",
201
- ],
202
- "type": "file",
203
- },
204
- {
205
- "filePath": "node_modules/chalk/templates.js",
206
- "reasons": [
207
- "expoConfigPlugins",
208
- ],
209
- "type": "file",
210
- },
211
- {
212
- "filePath": ".gitignore",
213
- "reasons": [
214
- "bareGitIgnore",
215
- ],
216
- "type": "file",
217
- },
218
- {
219
- "contents": "{"start":"expo start","android":"expo start --android","ios":"expo start --ios","web":"expo start --web"}",
220
- "id": "packageJson:scripts",
221
- "reasons": [
222
- "packageJson:scripts",
223
- ],
224
- "type": "contents",
225
- },
226
- {
227
- "filePath": "node_modules/expo",
228
- "reasons": [
229
- "bareRncliAutolinking",
230
- ],
231
- "type": "dir",
232
- },
233
- {
234
- "contents": "{"expo":{"root":"node_modules/expo","name":"expo","platforms":{"ios":{"podspecPath":"node_modules/expo/Expo.podspec","configurations":[],"scriptPhases":[]},"android":{"sourceDir":"node_modules/expo/android","packageImportPath":"import expo.modules.ExpoModulesPackage;","packageInstance":"new ExpoModulesPackage()","buildTypes":[],"componentDescriptors":[],"cmakeListsPath":"node_modules/expo/android/build/generated/source/codegen/jni/CMakeLists.txt"}}}}",
235
- "id": "rncliAutolinkingConfig",
236
- "reasons": [
237
- "bareRncliAutolinking",
238
- ],
239
- "type": "contents",
240
- },
241
- ]
242
- `;