@maplibre/maplibre-react-native 10.0.0-alpha.24 → 10.0.0-alpha.26

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 (173) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/CONTRIBUTING.md +1 -1
  3. package/android/build.gradle +51 -16
  4. package/docs/Annotation.md +8 -17
  5. package/docs/BackgroundLayer.md +136 -128
  6. package/docs/Callout.md +5 -4
  7. package/docs/Camera.md +38 -39
  8. package/docs/CircleLayer.md +413 -388
  9. package/docs/FillExtrusionLayer.md +303 -292
  10. package/docs/FillLayer.md +266 -251
  11. package/docs/HeadingIndicator.md +5 -4
  12. package/docs/HeatmapLayer.md +179 -172
  13. package/docs/ImageSource.md +5 -4
  14. package/docs/Images.md +5 -4
  15. package/docs/Light.md +131 -123
  16. package/docs/LineLayer.md +525 -498
  17. package/docs/MapView.md +23 -42
  18. package/docs/MarkerView.md +5 -4
  19. package/docs/NativeUserLocation.md +5 -4
  20. package/docs/PointAnnotation.md +7 -10
  21. package/docs/RasterLayer.md +318 -310
  22. package/docs/RasterSource.md +5 -4
  23. package/docs/ShapeSource.md +16 -15
  24. package/docs/Style.md +5 -4
  25. package/docs/SymbolLayer.md +1501 -1406
  26. package/docs/UserLocation.md +10 -13
  27. package/docs/VectorSource.md +10 -9
  28. package/docs/coordinates.md +4 -3
  29. package/docs/docs.json +49 -88
  30. package/docs/location.md +4 -3
  31. package/docs/offlineManager.md +29 -44
  32. package/docs/snapshotManager.md +7 -6
  33. package/ios/RCTMLN/RCTMLNCamera.h +0 -3
  34. package/ios/RCTMLN/RCTMLNCamera.m +1 -1
  35. package/ios/RCTMLN/RCTMLNCameraManager.m +0 -3
  36. package/javascript/MLNModule.ts +9 -0
  37. package/javascript/Maplibre.ts +1 -1
  38. package/javascript/components/{annotations/Annotation.tsx → Annotation.tsx} +5 -5
  39. package/javascript/components/Camera.tsx +257 -388
  40. package/javascript/components/UserLocation.tsx +1 -1
  41. package/javascript/hooks/useNativeRef.ts +2 -1
  42. package/javascript/types/CameraMode.ts +6 -0
  43. package/package.json +16 -24
  44. package/scripts/codegen.ts +340 -0
  45. package/scripts/templates/MaplibreStyles.ts.ejs +8 -7
  46. package/scripts/templates/RCTMLNStyle.h.ejs +4 -3
  47. package/scripts/templates/RCTMLNStyle.m.ejs +11 -10
  48. package/scripts/templates/RCTMLNStyleFactory.java.ejs +12 -11
  49. package/scripts/templates/component.md.ejs +88 -85
  50. package/scripts/templates/index.d.ts.ejs +2 -1
  51. package/scripts/templates/styleMap.ts.ejs +2 -1
  52. package/scripts/utils/{DocJSONBuilder.js → DocJSONBuilder.ts} +133 -128
  53. package/scripts/utils/{JSDocNodeTree.js → JSDocNodeTree.ts} +14 -13
  54. package/scripts/utils/MarkdownBuilder.ts +44 -0
  55. package/scripts/utils/{template-globals.js → TemplateHelpers.ts} +66 -95
  56. package/scripts/utils/getNativeVersion.ts +53 -0
  57. package/tsconfig.json +2 -3
  58. package/.husky/pre-commit +0 -5
  59. package/android/rctmln/.settings/org.eclipse.buildship.core.prefs +0 -2
  60. package/android/rctmln/build.gradle +0 -64
  61. package/android/rctmln/proguard-rules.pro +0 -25
  62. package/docs/OfflineManager.md +0 -246
  63. package/react-native.config.js +0 -10
  64. package/scripts/download-style-spec.sh +0 -15
  65. package/scripts/generate-docs.js +0 -396
  66. package/scripts/utils/MarkdownBuilder.js +0 -37
  67. package/style-spec/v8.json +0 -6645
  68. /package/android/{rctmln/src → src}/main/AndroidManifest.xml +0 -0
  69. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/RCTMLNPackage.java +0 -0
  70. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/AbstractEvent.java +0 -0
  71. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/AbstractEventEmitter.java +0 -0
  72. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/AbstractMapFeature.java +0 -0
  73. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/annotation/MarkerView.java +0 -0
  74. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/annotation/MarkerViewManager.java +0 -0
  75. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/annotation/RCTMLNCallout.java +0 -0
  76. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/annotation/RCTMLNCalloutManager.java +0 -0
  77. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/annotation/RCTMLNMarkerView.java +0 -0
  78. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/annotation/RCTMLNMarkerViewManager.java +0 -0
  79. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/annotation/RCTMLNPointAnnotation.java +0 -0
  80. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/annotation/RCTMLNPointAnnotationManager.java +0 -0
  81. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/camera/CameraStop.java +0 -0
  82. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/camera/CameraUpdateItem.java +0 -0
  83. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/camera/CameraUpdateQueue.java +0 -0
  84. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/camera/RCTMLNCamera.java +0 -0
  85. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/camera/RCTMLNCameraManager.java +0 -0
  86. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/camera/constants/CameraMode.java +0 -0
  87. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/images/RCTMLNImages.java +0 -0
  88. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/images/RCTMLNImagesManager.java +0 -0
  89. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/location/LocationComponentManager.java +0 -0
  90. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/location/RCTMLNNativeUserLocation.java +0 -0
  91. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/location/RCTMLNNativeUserLocationManager.java +0 -0
  92. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/mapview/LayerSourceInfo.java +0 -0
  93. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/mapview/RCTMLNAndroidTextureMapView.java +0 -0
  94. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/mapview/RCTMLNAndroidTextureMapViewManager.java +0 -0
  95. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/mapview/RCTMLNMapView.java +0 -0
  96. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/mapview/RCTMLNMapViewManager.java +0 -0
  97. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/mapview/helpers/CameraChangeTracker.java +0 -0
  98. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/RCTMLNStyle.java +0 -0
  99. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/RCTMLNStyleFactory.java +0 -0
  100. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/RCTMLNStyleFunctionParser.java +0 -0
  101. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/RCTMLNStyleValue.java +0 -0
  102. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTLayer.java +0 -0
  103. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNBackgroundLayer.java +0 -0
  104. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNBackgroundLayerManager.java +0 -0
  105. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNCircleLayer.java +0 -0
  106. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNCircleLayerManager.java +0 -0
  107. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNFillExtrusionLayer.java +0 -0
  108. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNFillExtrusionLayerManager.java +0 -0
  109. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNFillLayer.java +0 -0
  110. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNFillLayerManager.java +0 -0
  111. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNHeatmapLayer.java +0 -0
  112. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNHeatmapLayerManager.java +0 -0
  113. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNLineLayer.java +0 -0
  114. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNLineLayerManager.java +0 -0
  115. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNRasterLayer.java +0 -0
  116. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNRasterLayerManager.java +0 -0
  117. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNSymbolLayer.java +0 -0
  118. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/layers/RCTMLNSymbolLayerManager.java +0 -0
  119. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/light/RCTMLNLight.java +0 -0
  120. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/light/RCTMLNLightManager.java +0 -0
  121. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNImageSource.java +0 -0
  122. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNImageSourceManager.java +0 -0
  123. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNRasterSource.java +0 -0
  124. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNRasterSourceManager.java +0 -0
  125. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNShapeSource.java +0 -0
  126. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNShapeSourceManager.java +0 -0
  127. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNTileSource.java +0 -0
  128. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNTileSourceManager.java +0 -0
  129. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNVectorSource.java +0 -0
  130. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTMLNVectorSourceManager.java +0 -0
  131. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/components/styles/sources/RCTSource.java +0 -0
  132. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/AbstractEvent.java +0 -0
  133. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/AndroidCallbackEvent.java +0 -0
  134. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/EventEmitter.java +0 -0
  135. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/FeatureClickEvent.java +0 -0
  136. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/IEvent.java +0 -0
  137. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/ImageMissingEvent.java +0 -0
  138. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/LocationEvent.java +0 -0
  139. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/MapChangeEvent.java +0 -0
  140. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/MapClickEvent.java +0 -0
  141. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/MapUserTrackingModeEvent.java +0 -0
  142. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/OfflineEvent.java +0 -0
  143. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/PointAnnotationClickEvent.java +0 -0
  144. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/PointAnnotationDragEvent.java +0 -0
  145. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/constants/EventKeys.java +0 -0
  146. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/events/constants/EventTypes.java +0 -0
  147. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/http/CustomHeadersInterceptor.java +0 -0
  148. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/location/LocationManager.java +0 -0
  149. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/location/UserLocation.java +0 -0
  150. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/location/UserLocationVerticalAlignment.java +0 -0
  151. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/location/UserTrackingMode.java +0 -0
  152. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/location/UserTrackingState.java +0 -0
  153. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/modules/RCTMLNLocationModule.java +0 -0
  154. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/modules/RCTMLNLogging.java +0 -0
  155. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/modules/RCTMLNModule.java +0 -0
  156. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/modules/RCTMLNOfflineModule.java +0 -0
  157. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/modules/RCTMLNSnapshotModule.java +0 -0
  158. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/BitmapUtils.java +0 -0
  159. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/ClusterPropertyEntry.java +0 -0
  160. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/ConvertUtils.java +0 -0
  161. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/DownloadMapImageTask.java +0 -0
  162. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/ExpressionParser.java +0 -0
  163. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/GeoJSONUtils.java +0 -0
  164. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/GeoViewport.java +0 -0
  165. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/ImageEntry.java +0 -0
  166. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/ResourceUtils.java +0 -0
  167. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/SimpleEventCallback.java +0 -0
  168. /package/android/{rctmln/src → src}/main/java/com/maplibre/rctmln/utils/SphericalMercator.java +0 -0
  169. /package/android/{rctmln/src → src}/main/res/drawable/empty.xml +0 -0
  170. /package/android/{rctmln/src → src}/main/res/drawable/empty_drawable.png +0 -0
  171. /package/android/{rctmln/src → src}/main/res/drawable-xxhdpi/red_marker.png +0 -0
  172. /package/android/{rctmln/src → src}/main/res/layout/annotation.xml +0 -0
  173. /package/android/{rctmln/src → src}/main/res/values/strings.xml +0 -0
@@ -1,9 +1,9 @@
1
1
  import React, { ReactElement, useEffect, useImperativeHandle } from "react";
2
2
 
3
+ import Annotation from "./Annotation";
3
4
  import CircleLayer from "./CircleLayer";
4
5
  import HeadingIndicator from "./HeadingIndicator";
5
6
  import NativeUserLocation from "./NativeUserLocation";
6
- import Annotation from "./annotations/Annotation";
7
7
  import locationManager, { Location } from "../modules/location/locationManager";
8
8
  import { CircleLayerStyleProps } from "../utils/MaplibreStyles";
9
9
 
@@ -1,7 +1,8 @@
1
1
  import React, { Component, useRef } from "react";
2
2
  import { NativeMethods } from "react-native";
3
3
 
4
- type NativeRef<NativeProps> = Component<NativeProps> & Readonly<NativeMethods>;
4
+ export type NativeRef<NativeProps> = Component<NativeProps> &
5
+ Readonly<NativeMethods>;
5
6
 
6
7
  /**
7
8
  * Separate module which allows to be mocked in tests.
@@ -0,0 +1,6 @@
1
+ export enum CameraMode {
2
+ Flight = 1,
3
+ Ease = 2,
4
+ Linear = 3,
5
+ None = 4,
6
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@maplibre/maplibre-react-native",
3
3
  "description": "React Native library for creating maps with MapLibre Native for Android & iOS",
4
- "version": "10.0.0-alpha.24",
4
+ "version": "10.0.0-alpha.26",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
@@ -21,9 +21,7 @@
21
21
  "url": "https://github.com/maplibre/maplibre-react-native"
22
22
  },
23
23
  "scripts": {
24
- "generate": "yarn generate:fetch-style-spec && yarn generate:docs",
25
- "generate:fetch-style-spec": "./scripts/download-style-spec.sh",
26
- "generate:docs": "yarn node ./scripts/generate-docs",
24
+ "codegen": "tsx scripts/codegen.ts",
27
25
  "test": "jest",
28
26
  "lint": "yarn lint:eslint && yarn lint:tsc",
29
27
  "lint:eslint": "eslint .",
@@ -32,9 +30,13 @@
32
30
  "plugin:build": "tsc --build plugin",
33
31
  "plugin:lint": "eslint plugin/src/*",
34
32
  "plugin:test": "jest plugin",
35
- "prepack": "pinst --disable && yarn plugin:build",
36
- "postpack": "pinst --enable"
33
+ "prepack": "yarn plugin:build"
37
34
  },
35
+ "workspaces": [
36
+ "apps/*",
37
+ "packages/*"
38
+ ],
39
+ "packageManager": "yarn@4.1.0",
38
40
  "peerDependenciesMeta": {
39
41
  "@expo/config-plugins": {
40
42
  "optional": true
@@ -63,43 +65,33 @@
63
65
  "@babel/eslint-parser": "^7.22.9",
64
66
  "@babel/plugin-proposal-class-properties": "7.18.6",
65
67
  "@babel/runtime": "7.17.2",
66
- "@expo/config-plugins": "^8.0.10",
68
+ "@expo/config-plugins": "^9.0.9",
69
+ "@maplibre/maplibre-gl-style-spec": "21.1.0",
67
70
  "@react-native/babel-preset": "^0.74.88",
68
71
  "@react-native/metro-config": "^0.74.88",
69
72
  "@sinonjs/fake-timers": "^11.2.2",
70
73
  "@testing-library/react-native": "^12.4.3",
71
- "@tsconfig/node14": "^14.1.0",
74
+ "@types/ejs": "^3.1.5",
72
75
  "@typescript-eslint/eslint-plugin": "^7.18.0",
73
76
  "@typescript-eslint/parser": "^7.18.0",
74
77
  "babel-jest": "^29.6.0",
75
78
  "documentation": "^14.0.0",
76
- "ejs": "^3.1.3",
79
+ "ejs": "^3.1.10",
77
80
  "ejs-lint": "^2.0.0",
78
81
  "eslint": "^8.57.1",
79
82
  "eslint-config-universe": "13.0.0",
80
- "expo-module-scripts": "^3.1.0",
81
- "husky": "^9.0.10",
83
+ "expo-module-scripts": "^4.0.2",
82
84
  "jest": "^29.7.0",
83
85
  "jest-cli": "^29.7.0",
84
- "lint-staged": "^15.2.2",
85
- "node-dir": "0.1.17",
86
- "pinst": "^3.0.0",
87
86
  "prettier": "3.3.3",
88
87
  "react": "18.2.0",
89
- "react-docgen": "rnmapbox/react-docgen#rnmapbox-dist",
88
+ "react-docgen": "^7.1.0",
90
89
  "react-native": "^0.74.6",
91
90
  "react-test-renderer": "18.2.0",
91
+ "tsx": "^4.19.2",
92
92
  "typescript": "^5.3.3"
93
93
  },
94
94
  "resolutions": {
95
95
  "typescript": "5.5.3"
96
- },
97
- "lint-staged": {
98
- "*.{js,jsx,ts,tsx}": "yarn lint"
99
- },
100
- "packageManager": "yarn@4.1.0",
101
- "workspaces": [
102
- "apps/*",
103
- "packages/*"
104
- ]
96
+ }
105
97
  }
@@ -0,0 +1,340 @@
1
+ import maplibreGlStyleSpec from "@maplibre/maplibre-gl-style-spec/src/reference/latest";
2
+ import ejs from "ejs";
3
+ import { exec } from "node:child_process";
4
+ import { promises as fs } from "node:fs";
5
+ import path from "node:path";
6
+ import prettier from "prettier";
7
+
8
+ import { DocJSONBuilder } from "./utils/DocJSONBuilder";
9
+ import { MarkdownBuilder } from "./utils/MarkdownBuilder";
10
+ import { camelCase } from "./utils/TemplateHelpers";
11
+ import * as TemplateHelpers from "./utils/TemplateHelpers";
12
+ import {
13
+ getAndroidVersion,
14
+ getIosVersion,
15
+ isVersionGTE,
16
+ } from "./utils/getNativeVersion";
17
+
18
+ const TMPL_PATH = path.join(__dirname, "templates");
19
+
20
+ const IOS_OUTPUT_PATH = path.join(__dirname, "..", "ios", "RCTMLN");
21
+ const ANDROID_OUTPUT_PATH = path.join(
22
+ __dirname,
23
+ "..",
24
+ "android",
25
+ "src",
26
+ "main",
27
+ "java",
28
+ "com",
29
+ "maplibre",
30
+ "rctmln",
31
+ "components",
32
+ "styles",
33
+ );
34
+
35
+ const JS_OUTPUT_PATH = path.join(__dirname, "..", "javascript", "utils");
36
+
37
+ const TEMPLATE_MAPPINGS = [
38
+ {
39
+ input: path.join(TMPL_PATH, "RCTMLNStyle.h.ejs"),
40
+ output: path.join(IOS_OUTPUT_PATH, "RCTMLNStyle.h"),
41
+ },
42
+ {
43
+ input: path.join(TMPL_PATH, "MaplibreStyles.ts.ejs"),
44
+ output: path.join(JS_OUTPUT_PATH, "MaplibreStyles.d.ts"),
45
+ },
46
+ {
47
+ input: path.join(TMPL_PATH, "RCTMLNStyle.m.ejs"),
48
+ output: path.join(IOS_OUTPUT_PATH, "RCTMLNStyle.m"),
49
+ },
50
+ {
51
+ input: path.join(TMPL_PATH, "RCTMLNStyleFactory.java.ejs"),
52
+ output: path.join(ANDROID_OUTPUT_PATH, "RCTMLNStyleFactory.java"),
53
+ },
54
+ {
55
+ input: path.join(TMPL_PATH, "styleMap.ts.ejs"),
56
+ output: path.join(JS_OUTPUT_PATH, "styleMap.ts"),
57
+ },
58
+ ];
59
+
60
+ async function generate() {
61
+ const androidVersion = await getAndroidVersion();
62
+ const iosVersion = await getIosVersion();
63
+
64
+ function getPropertiesForLight() {
65
+ const lightAttributes = maplibreGlStyleSpec.light;
66
+
67
+ return getSupportedProperties(lightAttributes).map((attrName) => {
68
+ return Object.assign({}, buildProperties(lightAttributes, attrName), {
69
+ allowedFunctionTypes: [],
70
+ });
71
+ });
72
+ }
73
+
74
+ function getPropertiesForLayer(layerName: string) {
75
+ const paintAttributes = maplibreGlStyleSpec[`paint_${layerName}`];
76
+ const layoutAttributes = maplibreGlStyleSpec[`layout_${layerName}`];
77
+
78
+ const paintProps = getSupportedProperties(paintAttributes).map(
79
+ (attrName) => {
80
+ const prop = buildProperties(paintAttributes, attrName);
81
+
82
+ // overrides
83
+ if (["line-width"].includes(attrName)) {
84
+ prop.allowedFunctionTypes = ["camera"];
85
+ }
86
+
87
+ return prop;
88
+ },
89
+ );
90
+
91
+ const layoutProps = getSupportedProperties(layoutAttributes).map(
92
+ (attrName) => {
93
+ const prop = buildProperties(layoutAttributes, attrName);
94
+
95
+ // overrides
96
+ if (
97
+ [
98
+ "line-join",
99
+ "text-max-width",
100
+ "text-letter-spacing",
101
+ "text-anchor",
102
+ "text-justify",
103
+ "text-font",
104
+ ].includes(attrName)
105
+ ) {
106
+ prop.allowedFunctionTypes = ["camera"];
107
+ }
108
+
109
+ // TODO
110
+ // Overide type padding
111
+ if (prop.type === "padding") {
112
+ prop.type = "array";
113
+ prop.value = "number";
114
+ prop.length = 4;
115
+ }
116
+
117
+ return prop;
118
+ },
119
+ );
120
+
121
+ return layoutProps.concat(paintProps);
122
+ }
123
+
124
+ function getSupportedLayers() {
125
+ return Object.entries(maplibreGlStyleSpec.layer.type.values)
126
+ .map(([layerName, layerProperties]) => {
127
+ if (
128
+ layerProperties &&
129
+ typeof layerProperties === "object" &&
130
+ "sdk-support" in layerProperties
131
+ ) {
132
+ const support = getAttributeSupport(layerProperties["sdk-support"]);
133
+
134
+ if (support.basic.android && support.basic.ios) {
135
+ return layerName;
136
+ }
137
+ }
138
+
139
+ return undefined;
140
+ })
141
+ .filter((layerName) => typeof layerName === "string");
142
+ }
143
+
144
+ function getSupportedProperties(attributes: any) {
145
+ return Object.keys(attributes).filter((attrName) =>
146
+ isAttrSupported(attributes[attrName]),
147
+ );
148
+ }
149
+
150
+ function buildProperties(attributes: any, attrName: string) {
151
+ return {
152
+ name: camelCase(attrName),
153
+ doc: {
154
+ default: attributes[attrName].default,
155
+ minimum: attributes[attrName].minimum,
156
+ maximum: attributes[attrName].maximum,
157
+ units: attributes[attrName].units,
158
+ description: formatDescription(attributes[attrName].doc),
159
+ requires: getRequires(attributes[attrName].requires),
160
+ disabledBy: getDisables(attributes[attrName].requires),
161
+ values: attributes[attrName].values,
162
+ },
163
+ type: attributes[attrName].type,
164
+ value: attributes[attrName].value,
165
+ length: undefined as undefined | number,
166
+ image: isImage(attrName),
167
+ translate: isTranslate(attrName),
168
+ transition: attributes[attrName].transition,
169
+ expression: attributes[attrName].expression,
170
+ expressionSupported:
171
+ Object.keys(attributes[attrName].expression || {}).length > 0,
172
+ support: getAttributeSupport(attributes[attrName]["sdk-support"]),
173
+ allowedFunctionTypes: getAllowedFunctionTypes(attributes[attrName]),
174
+ };
175
+ }
176
+
177
+ function formatDescription(description: string) {
178
+ const words = description.split(" ");
179
+
180
+ for (let i = 0; i < words.length; i++) {
181
+ const word = words[i];
182
+
183
+ if (word.includes("-")) {
184
+ words[i] = camelCase(word);
185
+ }
186
+ }
187
+
188
+ return words.join(" ");
189
+ }
190
+
191
+ function getRequires(requiredItems: any) {
192
+ const items: any[] = [];
193
+
194
+ if (!requiredItems) {
195
+ return items;
196
+ }
197
+
198
+ for (const item of requiredItems) {
199
+ if (typeof item === "string") {
200
+ items.push(camelCase(item, "-"));
201
+ }
202
+ }
203
+
204
+ return items;
205
+ }
206
+
207
+ function getDisables(disabledItems: any[]) {
208
+ const items: any[] = [];
209
+
210
+ if (!disabledItems) {
211
+ return items;
212
+ }
213
+
214
+ for (const item of disabledItems) {
215
+ if (item["!"]) {
216
+ items.push(camelCase(item["!"], "-"));
217
+ }
218
+ }
219
+
220
+ return items;
221
+ }
222
+
223
+ function isImage(attrName: string) {
224
+ return (
225
+ attrName.toLowerCase().indexOf("pattern") !== -1 ||
226
+ attrName.toLowerCase().indexOf("image") !== -1
227
+ );
228
+ }
229
+
230
+ function isTranslate(attrName: string) {
231
+ return attrName.toLowerCase().indexOf("translate") !== -1;
232
+ }
233
+
234
+ function isAttrSupported(attr: any) {
235
+ const support = getAttributeSupport(attr["sdk-support"]);
236
+ if (attr.private) {
237
+ return false;
238
+ }
239
+ return support.basic.android && support.basic.ios;
240
+ }
241
+
242
+ function getAttributeSupport(sdkSupport: any) {
243
+ const support = {
244
+ basic: { android: false, ios: false },
245
+ data: { android: false, ios: false },
246
+ };
247
+
248
+ const basicSupport = sdkSupport && sdkSupport["basic functionality"];
249
+ support.basic.android = isVersionGTE(androidVersion, basicSupport?.android);
250
+ support.basic.ios = isVersionGTE(iosVersion, basicSupport?.ios);
251
+
252
+ const dataDrivenSupport = sdkSupport && sdkSupport["data-driven styling"];
253
+ support.data.android = isVersionGTE(
254
+ androidVersion,
255
+ dataDrivenSupport?.android,
256
+ );
257
+ support.data.ios = isVersionGTE(iosVersion, dataDrivenSupport?.ios);
258
+
259
+ if (!support.data.ios || !support.data.android) {
260
+ support.data.ios = false;
261
+ support.data.android = false;
262
+ }
263
+
264
+ return support;
265
+ }
266
+
267
+ function getAllowedFunctionTypes(paintAttr: any) {
268
+ const allowedFunctionTypes = [];
269
+
270
+ if (paintAttr["zoom-function"]) {
271
+ allowedFunctionTypes.push("camera");
272
+ }
273
+
274
+ if (paintAttr["property-function"]) {
275
+ allowedFunctionTypes.push("source");
276
+ allowedFunctionTypes.push("composite");
277
+ }
278
+
279
+ return allowedFunctionTypes;
280
+ }
281
+
282
+ const layers = getSupportedLayers().map((layerName) => {
283
+ return {
284
+ name: layerName,
285
+ properties: getPropertiesForLayer(layerName),
286
+ };
287
+ });
288
+
289
+ // add light as a layer
290
+ layers.push({ name: "light", properties: getPropertiesForLight() });
291
+
292
+ // autogenerate code
293
+ await Promise.all(
294
+ TEMPLATE_MAPPINGS.map(async ({ input, output }) => {
295
+ const filename = path.parse(output).base;
296
+
297
+ console.log(`Generating ${filename}`);
298
+ const tmpl = ejs.compile(await fs.readFile(input, "utf8"), {
299
+ strict: true,
300
+ async: true,
301
+ });
302
+ let results = await tmpl({ layers, helpers: TemplateHelpers });
303
+ if (filename.endsWith("ts")) {
304
+ results = await prettier.format(results, {
305
+ filepath: filename,
306
+ });
307
+ // Ensure all enums are exported
308
+ results = results.replace(/enum (\w+Enum) \{[^}]+}\n/g, "export $&");
309
+ // Replace Array<any> with any[]
310
+ results = results.replace(/Array<any>/g, "any[]");
311
+ // Replace padding type with float array
312
+ results = results.replace(/padding: string;/g, "padding: number[];");
313
+ }
314
+ await fs.writeFile(output, results);
315
+ }),
316
+ );
317
+
318
+ // autogenerate docs
319
+ const docBuilder = new DocJSONBuilder(layers);
320
+ const markdownBuilder = new MarkdownBuilder();
321
+ await docBuilder.generate();
322
+ await markdownBuilder.generate();
323
+
324
+ // Check if any generated files changed
325
+ try {
326
+ exec(
327
+ `git diff --exit-code docs/ ${TEMPLATE_MAPPINGS.map((m) => m.output).join(" ")}`,
328
+ );
329
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
330
+ } catch (_error) {
331
+ console.error(
332
+ "\n\nThere are unstaged changes in the generated code. " +
333
+ "Please add them to your commit.\n" +
334
+ 'If you would really like to exclude them, run "git commit -n" to skip.\n\n',
335
+ );
336
+ process.exit(1);
337
+ }
338
+ }
339
+
340
+ generate();
@@ -1,5 +1,6 @@
1
1
  <%
2
2
  const layers = locals.layers;
3
+ const helpers = locals.helpers;
3
4
  -%>
4
5
  /* This file was generated from MapboxStyle.ts.ejs do not modify */
5
6
  import { type ImageSourcePropType } from 'react-native';
@@ -58,20 +59,20 @@ export type Value<T, AllowedParameters extends ExpressionParameters[] = []> =
58
59
  | T
59
60
  | Expression;
60
61
 
61
- <%_ for (let enumInfo of getEnums(layers)) { _%>
62
- enum <%- pascalCase(enumInfo.name) %>Enum {
62
+ <%_ for (let enumInfo of helpers.getEnums(layers)) { _%>
63
+ enum <%- helpers.pascalCase(enumInfo.name) %>Enum {
63
64
  <%_ for (let k of Object.keys(enumInfo.values)) { _%>
64
65
  /** <%- enumInfo.values[k].doc %> */
65
- <%- pascalCase(k) %> = '<%- k %>',
66
+ <%- helpers.pascalCase(k) %> = '<%- k %>',
66
67
  <%_ } _%>
67
68
  }
68
- type <%- pascalCase(enumInfo.name) %>EnumValues = <%- Object.keys(enumInfo.values).map(k => `'${k}'`).join(' | ') %>;
69
+ type <%- helpers.pascalCase(enumInfo.name) %>EnumValues = <%- Object.keys(enumInfo.values).map(k => `'${k}'`).join(' | ') %>;
69
70
  <%_ } _%>
70
71
 
71
72
  type Enum<EnumType, EnumValues> = EnumType | EnumValues;
72
73
 
73
74
  <%_ for (let layer of layers) { _%>
74
- export interface <%- pascalCase(layer.name) %>LayerStyleProps {
75
+ export interface <%- helpers.pascalCase(layer.name) %>LayerStyleProps {
75
76
  <%_ for (let prop of layer.properties) { _%>
76
77
  /**
77
78
  * <%- prop.doc.description %>
@@ -84,7 +85,7 @@ type Enum<EnumType, EnumValues> = EnumType | EnumValues;
84
85
  * @disabledBy <%- prop.doc.disabledBy.join(', ') %>
85
86
  <%_ } _%>
86
87
  */
87
- <%= prop.name %>?: <%- dtsInterfaceType(prop) %>
88
+ <%= prop.name %>?: <%- helpers.dtsInterfaceType(prop) %>
88
89
  <%_ if (true && prop.transition) { %>
89
90
  /**
90
91
  * The transition affecting any changes to this layer’s <%= prop.name %> property.
@@ -96,4 +97,4 @@ type Enum<EnumType, EnumValues> = EnumType | EnumValues;
96
97
  };
97
98
  <%_ } _%>
98
99
 
99
- export type AllLayerStyleProps = <%- layers.map(l => `${pascalCase(l.name)}LayerStyleProps`).join("|") -%>;
100
+ export type AllLayerStyleProps = <%- layers.map(l => `${helpers.pascalCase(l.name)}LayerStyleProps`).join("|") -%>;
@@ -1,5 +1,6 @@
1
1
  <%
2
2
  const layers = locals.layers;
3
+ const helpers = locals.helpers;
3
4
  -%>
4
5
  // DO NOT MODIFY
5
6
  // THIS FILE IS AUTOGENERATED
@@ -18,14 +19,14 @@
18
19
  - (id)initWithMLNStyle:(MLNStyle*)mlnStyle;
19
20
 
20
21
  <%_ for (const layer of layers) { _%>
21
- - (void)<%- setLayerMethodName(layer, 'ios') -%>:(<%- getLayerType(layer, 'ios') -%> *)layer withReactStyle:(NSDictionary *)reactStyle isValid:(BOOL (^)(void)) isValid;
22
+ - (void)<%- helpers.setLayerMethodName(layer, 'ios') -%>:(<%- helpers.getLayerType(layer, 'ios') -%> *)layer withReactStyle:(NSDictionary *)reactStyle isValid:(BOOL (^)(void)) isValid;
22
23
  <%_ } _%>
23
24
 
24
25
  <%_ for (const layer of layers) { _%>
25
26
  <%_ for (const prop of layer.properties) { _%>
26
- - (void)set<%- iosPropMethodName(layer, pascalCase(prop.name)) -%>:(<%- getLayerType(layer, 'ios') -%> *)layer withReactStyleValue:(RCTMLNStyleValue *)styleValue;
27
+ - (void)set<%- helpers.iosPropMethodName(layer, helpers.pascalCase(prop.name)) -%>:(<%- helpers.getLayerType(layer, 'ios') -%> *)layer withReactStyleValue:(RCTMLNStyleValue *)styleValue;
27
28
  <%_ if (prop.transition) { _%>
28
- - (void)set<%- iosPropMethodName(layer, pascalCase(prop.name)) -%>Transition:(<%- getLayerType(layer, 'ios') -%> *)layer withReactStyleValue:(RCTMLNStyleValue *)styleValue;
29
+ - (void)set<%- helpers.iosPropMethodName(layer, helpers.pascalCase(prop.name)) -%>Transition:(<%- helpers.getLayerType(layer, 'ios') -%> *)layer withReactStyleValue:(RCTMLNStyleValue *)styleValue;
29
30
  <%_ } _%>
30
31
  <%_ } _%>
31
32
  <% } %>
@@ -1,5 +1,6 @@
1
1
  <%
2
2
  const layers = locals.layers;
3
+ const helpers = locals.helpers;
3
4
  -%>
4
5
  // DO NOT MODIFY
5
6
  // THIS FILE IS AUTOGENERATED
@@ -18,7 +19,7 @@
18
19
  }
19
20
 
20
21
  <% for (const layer of layers) { %>
21
- - (void)<%- setLayerMethodName(layer, 'ios') -%>:(<%- getLayerType(layer, 'ios') -%> *)layer withReactStyle:(NSDictionary *)reactStyle isValid:(BOOL (^)(void)) isValid
22
+ - (void)<%- helpers.setLayerMethodName(layer, 'ios') -%>:(<%- helpers.getLayerType(layer, 'ios') -%> *)layer withReactStyle:(NSDictionary *)reactStyle isValid:(BOOL (^)(void)) isValid
22
23
  {
23
24
  if (![self _hasReactStyle:reactStyle]) {
24
25
  // TODO throw exception
@@ -34,10 +35,10 @@
34
35
  RCTMLNStyleValue *styleValue = [RCTMLNStyleValue make:reactStyle[prop]];
35
36
 
36
37
  <% for (let i = 0; i < layer.properties.length; i++) { -%>
37
- <%- ifOrElseIf(i) -%> ([prop isEqualToString:@"<%= layer.properties[i].name %>"]) {
38
+ <%- helpers.ifOrElseIf(i) -%> ([prop isEqualToString:@"<%= layer.properties[i].name %>"]) {
38
39
  <%_ if (layer.properties[i].image) { _%>
39
40
  if (![styleValue shouldAddImage]) {
40
- [self set<%- iosPropMethodName(layer, pascalCase(layer.properties[i].name)) -%>:layer withReactStyleValue:styleValue];
41
+ [self set<%- helpers.iosPropMethodName(layer, helpers.pascalCase(layer.properties[i].name)) -%>:layer withReactStyleValue:styleValue];
41
42
  } else {
42
43
  NSString *imageURI = [styleValue getImageURI];
43
44
 
@@ -46,18 +47,18 @@
46
47
  dispatch_async(dispatch_get_main_queue(), ^{
47
48
  if (isValid()) {
48
49
  [self->_style setImage:image forName:imageURI];
49
- [self set<%- iosPropMethodName(layer, pascalCase(layer.properties[i].name)) -%>:layer withReactStyleValue:styleValue];
50
+ [self set<%- helpers.iosPropMethodName(layer, helpers.pascalCase(layer.properties[i].name)) -%>:layer withReactStyleValue:styleValue];
50
51
  }
51
52
  });
52
53
  }
53
54
  }];
54
55
  }
55
56
  <%_ } else { _%>
56
- [self set<%- iosPropMethodName(layer, pascalCase(layer.properties[i].name)) -%>:layer withReactStyleValue:styleValue];
57
+ [self set<%- helpers.iosPropMethodName(layer, helpers.pascalCase(layer.properties[i].name)) -%>:layer withReactStyleValue:styleValue];
57
58
  <%_ } _%>
58
59
  <%_ if (layer.properties[i].transition) { _%>
59
60
  } else if ([prop isEqualToString:@"<%= layer.properties[i].name %>Transition"]) {
60
- [self set<%- iosPropMethodName(layer, pascalCase(layer.properties[i].name)) -%>Transition:layer withReactStyleValue:styleValue];
61
+ [self set<%- helpers.iosPropMethodName(layer, helpers.pascalCase(layer.properties[i].name)) -%>Transition:layer withReactStyleValue:styleValue];
61
62
  <%_ } _%>
62
63
  <% } -%>
63
64
  } else {
@@ -69,21 +70,21 @@
69
70
 
70
71
  <% for (const layer of layers) {%>
71
72
  <% for (const prop of layer.properties) {%>
72
- - (void)set<%- iosPropMethodName(layer, pascalCase(prop.name)) -%>:(<%- getLayerType(layer, 'ios') -%> *)layer withReactStyleValue:(RCTMLNStyleValue *)styleValue
73
+ - (void)set<%- helpers.iosPropMethodName(layer, helpers.pascalCase(prop.name)) -%>:(<%- helpers.getLayerType(layer, 'ios') -%> *)layer withReactStyleValue:(RCTMLNStyleValue *)styleValue
73
74
  {
74
75
  <%_ if (layer.name === 'light' && prop.name === 'position') { _%>
75
76
  layer.position = [styleValue getSphericalPosition];
76
77
  <%_ } else if (prop.name === 'visibility') { _%>
77
78
  layer.visible = [styleValue isVisible];
78
79
  <%_ } else { _%>
79
- layer.<%- iosPropName(prop.name) -%> = styleValue.mlnStyleValue;
80
+ layer.<%- helpers.iosPropName(prop.name) -%> = styleValue.mlnStyleValue;
80
81
  <%_ } _%>
81
82
  }
82
83
  <%_ if (prop.transition) { _%>
83
84
 
84
- - (void)set<%- iosPropMethodName(layer, pascalCase(prop.name)) -%>Transition:(<%- getLayerType(layer, 'ios') -%> *)layer withReactStyleValue:(RCTMLNStyleValue *)styleValue
85
+ - (void)set<%- helpers.iosPropMethodName(layer, helpers.pascalCase(prop.name)) -%>Transition:(<%- helpers.getLayerType(layer, 'ios') -%> *)layer withReactStyleValue:(RCTMLNStyleValue *)styleValue
85
86
  {
86
- layer.<%- iosPropName(prop.name) -%>Transition = [styleValue getTransition];
87
+ layer.<%- helpers.iosPropName(prop.name) -%>Transition = [styleValue getTransition];
87
88
  }
88
89
  <%_ } _%>
89
90
  <% } %>