@basemaps/lambda-tiler 6.41.0 → 6.44.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 (474) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/build/__tests__/index.test.js +17 -5
  3. package/build/__tests__/index.test.js.map +1 -1
  4. package/build/cli/render.preview.d.ts +2 -0
  5. package/build/cli/render.preview.d.ts.map +1 -0
  6. package/build/cli/render.preview.js +38 -0
  7. package/build/cli/render.preview.js.map +1 -0
  8. package/build/cli/render.tile.js +25 -10
  9. package/build/cli/render.tile.js.map +1 -1
  10. package/build/index.d.ts.map +1 -1
  11. package/build/index.js +6 -0
  12. package/build/index.js.map +1 -1
  13. package/build/routes/__tests__/preview.index.test.d.ts +2 -0
  14. package/build/routes/__tests__/preview.index.test.d.ts.map +1 -0
  15. package/build/routes/__tests__/preview.index.test.js +82 -0
  16. package/build/routes/__tests__/preview.index.test.js.map +1 -0
  17. package/build/routes/attribution.d.ts.map +1 -1
  18. package/build/routes/attribution.js +1 -3
  19. package/build/routes/attribution.js.map +1 -1
  20. package/build/routes/preview.d.ts +58 -0
  21. package/build/routes/preview.d.ts.map +1 -0
  22. package/build/routes/preview.index.d.ts +23 -0
  23. package/build/routes/preview.index.d.ts.map +1 -0
  24. package/build/routes/preview.index.js +98 -0
  25. package/build/routes/preview.index.js.map +1 -0
  26. package/build/routes/preview.js +159 -0
  27. package/build/routes/preview.js.map +1 -0
  28. package/build/routes/tile.xyz.raster.d.ts +15 -0
  29. package/build/routes/tile.xyz.raster.d.ts.map +1 -1
  30. package/build/routes/tile.xyz.raster.js +45 -26
  31. package/build/routes/tile.xyz.raster.js.map +1 -1
  32. package/build/routes/version.d.ts.map +1 -1
  33. package/build/routes/version.js +17 -1
  34. package/build/routes/version.js.map +1 -1
  35. package/build/util/validate.d.ts +3 -1
  36. package/build/util/validate.d.ts.map +1 -1
  37. package/build/util/validate.js +10 -0
  38. package/build/util/validate.js.map +1 -1
  39. package/bundle.sh +1 -1
  40. package/package.json +9 -9
  41. package/src/__tests__/index.test.ts +20 -5
  42. package/src/cli/render.preview.ts +44 -0
  43. package/src/cli/render.tile.ts +26 -10
  44. package/src/index.ts +7 -0
  45. package/src/routes/__tests__/preview.index.test.ts +94 -0
  46. package/src/routes/attribution.ts +1 -3
  47. package/src/routes/preview.index.ts +119 -0
  48. package/src/routes/preview.ts +234 -0
  49. package/src/routes/tile.xyz.raster.ts +53 -29
  50. package/src/routes/version.ts +17 -1
  51. package/src/util/validate.ts +10 -1
  52. package/tsconfig.tsbuildinfo +1 -1
  53. package/dist/index.js +0 -229
  54. package/dist/node_modules/.package-lock.json +0 -491
  55. package/dist/node_modules/base64-js/LICENSE +0 -21
  56. package/dist/node_modules/base64-js/README.md +0 -34
  57. package/dist/node_modules/base64-js/base64js.min.js +0 -1
  58. package/dist/node_modules/base64-js/index.d.ts +0 -3
  59. package/dist/node_modules/base64-js/index.js +0 -150
  60. package/dist/node_modules/base64-js/package.json +0 -47
  61. package/dist/node_modules/bl/.travis.yml +0 -17
  62. package/dist/node_modules/bl/BufferList.js +0 -396
  63. package/dist/node_modules/bl/LICENSE.md +0 -13
  64. package/dist/node_modules/bl/README.md +0 -247
  65. package/dist/node_modules/bl/bl.js +0 -84
  66. package/dist/node_modules/bl/package.json +0 -37
  67. package/dist/node_modules/bl/test/convert.js +0 -21
  68. package/dist/node_modules/bl/test/indexOf.js +0 -492
  69. package/dist/node_modules/bl/test/isBufferList.js +0 -32
  70. package/dist/node_modules/bl/test/test.js +0 -869
  71. package/dist/node_modules/buffer/AUTHORS.md +0 -70
  72. package/dist/node_modules/buffer/LICENSE +0 -21
  73. package/dist/node_modules/buffer/README.md +0 -410
  74. package/dist/node_modules/buffer/index.d.ts +0 -186
  75. package/dist/node_modules/buffer/index.js +0 -1817
  76. package/dist/node_modules/buffer/package.json +0 -96
  77. package/dist/node_modules/chownr/LICENSE +0 -15
  78. package/dist/node_modules/chownr/README.md +0 -3
  79. package/dist/node_modules/chownr/chownr.js +0 -167
  80. package/dist/node_modules/chownr/package.json +0 -29
  81. package/dist/node_modules/color/LICENSE +0 -21
  82. package/dist/node_modules/color/README.md +0 -123
  83. package/dist/node_modules/color/index.js +0 -496
  84. package/dist/node_modules/color/package.json +0 -47
  85. package/dist/node_modules/color-convert/CHANGELOG.md +0 -54
  86. package/dist/node_modules/color-convert/LICENSE +0 -21
  87. package/dist/node_modules/color-convert/README.md +0 -68
  88. package/dist/node_modules/color-convert/conversions.js +0 -839
  89. package/dist/node_modules/color-convert/index.js +0 -81
  90. package/dist/node_modules/color-convert/package.json +0 -48
  91. package/dist/node_modules/color-convert/route.js +0 -97
  92. package/dist/node_modules/color-name/LICENSE +0 -8
  93. package/dist/node_modules/color-name/README.md +0 -11
  94. package/dist/node_modules/color-name/index.js +0 -152
  95. package/dist/node_modules/color-name/package.json +0 -28
  96. package/dist/node_modules/color-string/LICENSE +0 -21
  97. package/dist/node_modules/color-string/README.md +0 -62
  98. package/dist/node_modules/color-string/index.js +0 -242
  99. package/dist/node_modules/color-string/package.json +0 -39
  100. package/dist/node_modules/decompress-response/index.d.ts +0 -22
  101. package/dist/node_modules/decompress-response/index.js +0 -58
  102. package/dist/node_modules/decompress-response/license +0 -9
  103. package/dist/node_modules/decompress-response/package.json +0 -56
  104. package/dist/node_modules/decompress-response/readme.md +0 -48
  105. package/dist/node_modules/deep-extend/CHANGELOG.md +0 -46
  106. package/dist/node_modules/deep-extend/LICENSE +0 -20
  107. package/dist/node_modules/deep-extend/README.md +0 -91
  108. package/dist/node_modules/deep-extend/index.js +0 -1
  109. package/dist/node_modules/deep-extend/lib/deep-extend.js +0 -150
  110. package/dist/node_modules/deep-extend/package.json +0 -62
  111. package/dist/node_modules/detect-libc/LICENSE +0 -201
  112. package/dist/node_modules/detect-libc/README.md +0 -163
  113. package/dist/node_modules/detect-libc/index.d.ts +0 -14
  114. package/dist/node_modules/detect-libc/lib/detect-libc.js +0 -279
  115. package/dist/node_modules/detect-libc/lib/filesystem.js +0 -41
  116. package/dist/node_modules/detect-libc/lib/process.js +0 -19
  117. package/dist/node_modules/detect-libc/package.json +0 -40
  118. package/dist/node_modules/end-of-stream/LICENSE +0 -21
  119. package/dist/node_modules/end-of-stream/README.md +0 -54
  120. package/dist/node_modules/end-of-stream/index.js +0 -94
  121. package/dist/node_modules/end-of-stream/package.json +0 -37
  122. package/dist/node_modules/expand-template/.travis.yml +0 -6
  123. package/dist/node_modules/expand-template/LICENSE +0 -21
  124. package/dist/node_modules/expand-template/README.md +0 -43
  125. package/dist/node_modules/expand-template/index.js +0 -26
  126. package/dist/node_modules/expand-template/package.json +0 -29
  127. package/dist/node_modules/expand-template/test.js +0 -67
  128. package/dist/node_modules/fs-constants/LICENSE +0 -21
  129. package/dist/node_modules/fs-constants/README.md +0 -26
  130. package/dist/node_modules/fs-constants/browser.js +0 -1
  131. package/dist/node_modules/fs-constants/index.js +0 -1
  132. package/dist/node_modules/fs-constants/package.json +0 -19
  133. package/dist/node_modules/github-from-package/.travis.yml +0 -4
  134. package/dist/node_modules/github-from-package/LICENSE +0 -18
  135. package/dist/node_modules/github-from-package/example/package.json +0 -8
  136. package/dist/node_modules/github-from-package/example/url.js +0 -3
  137. package/dist/node_modules/github-from-package/index.js +0 -17
  138. package/dist/node_modules/github-from-package/package.json +0 -30
  139. package/dist/node_modules/github-from-package/readme.markdown +0 -53
  140. package/dist/node_modules/github-from-package/test/a.json +0 -8
  141. package/dist/node_modules/github-from-package/test/b.json +0 -5
  142. package/dist/node_modules/github-from-package/test/c.json +0 -5
  143. package/dist/node_modules/github-from-package/test/d.json +0 -7
  144. package/dist/node_modules/github-from-package/test/e.json +0 -5
  145. package/dist/node_modules/github-from-package/test/url.js +0 -19
  146. package/dist/node_modules/ieee754/LICENSE +0 -11
  147. package/dist/node_modules/ieee754/README.md +0 -51
  148. package/dist/node_modules/ieee754/index.d.ts +0 -10
  149. package/dist/node_modules/ieee754/index.js +0 -85
  150. package/dist/node_modules/ieee754/package.json +0 -52
  151. package/dist/node_modules/inherits/LICENSE +0 -16
  152. package/dist/node_modules/inherits/README.md +0 -42
  153. package/dist/node_modules/inherits/inherits.js +0 -9
  154. package/dist/node_modules/inherits/inherits_browser.js +0 -27
  155. package/dist/node_modules/inherits/package.json +0 -29
  156. package/dist/node_modules/ini/LICENSE +0 -15
  157. package/dist/node_modules/ini/README.md +0 -102
  158. package/dist/node_modules/ini/ini.js +0 -206
  159. package/dist/node_modules/ini/package.json +0 -33
  160. package/dist/node_modules/is-arrayish/LICENSE +0 -21
  161. package/dist/node_modules/is-arrayish/README.md +0 -16
  162. package/dist/node_modules/is-arrayish/index.js +0 -9
  163. package/dist/node_modules/is-arrayish/package.json +0 -45
  164. package/dist/node_modules/is-arrayish/yarn-error.log +0 -1443
  165. package/dist/node_modules/lru-cache/LICENSE +0 -15
  166. package/dist/node_modules/lru-cache/README.md +0 -166
  167. package/dist/node_modules/lru-cache/index.js +0 -334
  168. package/dist/node_modules/lru-cache/package.json +0 -34
  169. package/dist/node_modules/mimic-response/index.d.ts +0 -17
  170. package/dist/node_modules/mimic-response/index.js +0 -77
  171. package/dist/node_modules/mimic-response/license +0 -9
  172. package/dist/node_modules/mimic-response/package.json +0 -42
  173. package/dist/node_modules/mimic-response/readme.md +0 -78
  174. package/dist/node_modules/minimist/.eslintrc +0 -29
  175. package/dist/node_modules/minimist/.github/FUNDING.yml +0 -12
  176. package/dist/node_modules/minimist/.nycrc +0 -14
  177. package/dist/node_modules/minimist/CHANGELOG.md +0 -298
  178. package/dist/node_modules/minimist/LICENSE +0 -18
  179. package/dist/node_modules/minimist/README.md +0 -121
  180. package/dist/node_modules/minimist/example/parse.js +0 -4
  181. package/dist/node_modules/minimist/index.js +0 -263
  182. package/dist/node_modules/minimist/package.json +0 -75
  183. package/dist/node_modules/minimist/test/all_bool.js +0 -34
  184. package/dist/node_modules/minimist/test/bool.js +0 -177
  185. package/dist/node_modules/minimist/test/dash.js +0 -43
  186. package/dist/node_modules/minimist/test/default_bool.js +0 -37
  187. package/dist/node_modules/minimist/test/dotted.js +0 -24
  188. package/dist/node_modules/minimist/test/kv_short.js +0 -32
  189. package/dist/node_modules/minimist/test/long.js +0 -33
  190. package/dist/node_modules/minimist/test/num.js +0 -38
  191. package/dist/node_modules/minimist/test/parse.js +0 -209
  192. package/dist/node_modules/minimist/test/parse_modified.js +0 -11
  193. package/dist/node_modules/minimist/test/proto.js +0 -64
  194. package/dist/node_modules/minimist/test/short.js +0 -69
  195. package/dist/node_modules/minimist/test/stop_early.js +0 -17
  196. package/dist/node_modules/minimist/test/unknown.js +0 -104
  197. package/dist/node_modules/minimist/test/whitespace.js +0 -10
  198. package/dist/node_modules/mkdirp-classic/LICENSE +0 -21
  199. package/dist/node_modules/mkdirp-classic/README.md +0 -18
  200. package/dist/node_modules/mkdirp-classic/index.js +0 -98
  201. package/dist/node_modules/mkdirp-classic/package.json +0 -18
  202. package/dist/node_modules/napi-build-utils/LICENSE +0 -21
  203. package/dist/node_modules/napi-build-utils/README.md +0 -48
  204. package/dist/node_modules/napi-build-utils/index.js +0 -213
  205. package/dist/node_modules/napi-build-utils/index.md +0 -81
  206. package/dist/node_modules/napi-build-utils/package.json +0 -41
  207. package/dist/node_modules/node-abi/.circleci/config.yml +0 -45
  208. package/dist/node_modules/node-abi/.github/CODEOWNERS +0 -1
  209. package/dist/node_modules/node-abi/.github/workflows/semantic.yml +0 -26
  210. package/dist/node_modules/node-abi/.github/workflows/update-abi.yml +0 -42
  211. package/dist/node_modules/node-abi/.releaserc.json +0 -9
  212. package/dist/node_modules/node-abi/CODE_OF_CONDUCT.md +0 -73
  213. package/dist/node_modules/node-abi/CONTRIBUTING.md +0 -62
  214. package/dist/node_modules/node-abi/LICENSE +0 -21
  215. package/dist/node_modules/node-abi/README.md +0 -52
  216. package/dist/node_modules/node-abi/abi_registry.json +0 -269
  217. package/dist/node_modules/node-abi/index.js +0 -179
  218. package/dist/node_modules/node-abi/package.json +0 -38
  219. package/dist/node_modules/node-abi/scripts/update-abi-registry.js +0 -119
  220. package/dist/node_modules/node-abi/test/index.js +0 -166
  221. package/dist/node_modules/node-addon-api/LICENSE.md +0 -13
  222. package/dist/node_modules/node-addon-api/README.md +0 -317
  223. package/dist/node_modules/node-addon-api/common.gypi +0 -21
  224. package/dist/node_modules/node-addon-api/except.gypi +0 -25
  225. package/dist/node_modules/node-addon-api/index.js +0 -11
  226. package/dist/node_modules/node-addon-api/napi-inl.deprecated.h +0 -186
  227. package/dist/node_modules/node-addon-api/napi-inl.h +0 -6303
  228. package/dist/node_modules/node-addon-api/napi.h +0 -3114
  229. package/dist/node_modules/node-addon-api/node_api.gyp +0 -9
  230. package/dist/node_modules/node-addon-api/noexcept.gypi +0 -26
  231. package/dist/node_modules/node-addon-api/nothing.c +0 -0
  232. package/dist/node_modules/node-addon-api/package-support.json +0 -21
  233. package/dist/node_modules/node-addon-api/package.json +0 -456
  234. package/dist/node_modules/node-addon-api/tools/README.md +0 -73
  235. package/dist/node_modules/node-addon-api/tools/check-napi.js +0 -99
  236. package/dist/node_modules/node-addon-api/tools/clang-format.js +0 -71
  237. package/dist/node_modules/node-addon-api/tools/conversion.js +0 -301
  238. package/dist/node_modules/node-addon-api/tools/eslint-format.js +0 -79
  239. package/dist/node_modules/once/LICENSE +0 -15
  240. package/dist/node_modules/once/README.md +0 -79
  241. package/dist/node_modules/once/once.js +0 -42
  242. package/dist/node_modules/once/package.json +0 -33
  243. package/dist/node_modules/prebuild-install/CHANGELOG.md +0 -116
  244. package/dist/node_modules/prebuild-install/CONTRIBUTING.md +0 -6
  245. package/dist/node_modules/prebuild-install/LICENSE +0 -21
  246. package/dist/node_modules/prebuild-install/README.md +0 -163
  247. package/dist/node_modules/prebuild-install/asset.js +0 -44
  248. package/dist/node_modules/prebuild-install/bin.js +0 -78
  249. package/dist/node_modules/prebuild-install/download.js +0 -142
  250. package/dist/node_modules/prebuild-install/error.js +0 -14
  251. package/dist/node_modules/prebuild-install/help.txt +0 -16
  252. package/dist/node_modules/prebuild-install/index.js +0 -1
  253. package/dist/node_modules/prebuild-install/log.js +0 -33
  254. package/dist/node_modules/prebuild-install/package.json +0 -67
  255. package/dist/node_modules/prebuild-install/proxy.js +0 -35
  256. package/dist/node_modules/prebuild-install/rc.js +0 -64
  257. package/dist/node_modules/prebuild-install/util.js +0 -143
  258. package/dist/node_modules/pump/.travis.yml +0 -5
  259. package/dist/node_modules/pump/LICENSE +0 -21
  260. package/dist/node_modules/pump/README.md +0 -65
  261. package/dist/node_modules/pump/index.js +0 -82
  262. package/dist/node_modules/pump/package.json +0 -24
  263. package/dist/node_modules/pump/test-browser.js +0 -66
  264. package/dist/node_modules/pump/test-node.js +0 -53
  265. package/dist/node_modules/rc/LICENSE.APACHE2 +0 -15
  266. package/dist/node_modules/rc/LICENSE.BSD +0 -26
  267. package/dist/node_modules/rc/LICENSE.MIT +0 -24
  268. package/dist/node_modules/rc/README.md +0 -227
  269. package/dist/node_modules/rc/browser.js +0 -7
  270. package/dist/node_modules/rc/cli.js +0 -4
  271. package/dist/node_modules/rc/index.js +0 -53
  272. package/dist/node_modules/rc/lib/utils.js +0 -104
  273. package/dist/node_modules/rc/package.json +0 -29
  274. package/dist/node_modules/rc/test/ini.js +0 -16
  275. package/dist/node_modules/rc/test/nested-env-vars.js +0 -50
  276. package/dist/node_modules/rc/test/test.js +0 -59
  277. package/dist/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  278. package/dist/node_modules/readable-stream/GOVERNANCE.md +0 -136
  279. package/dist/node_modules/readable-stream/LICENSE +0 -47
  280. package/dist/node_modules/readable-stream/README.md +0 -106
  281. package/dist/node_modules/readable-stream/errors-browser.js +0 -127
  282. package/dist/node_modules/readable-stream/errors.js +0 -116
  283. package/dist/node_modules/readable-stream/experimentalWarning.js +0 -17
  284. package/dist/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  285. package/dist/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  286. package/dist/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  287. package/dist/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  288. package/dist/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  289. package/dist/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  290. package/dist/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  291. package/dist/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  292. package/dist/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  293. package/dist/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  294. package/dist/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  295. package/dist/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  296. package/dist/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  297. package/dist/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  298. package/dist/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  299. package/dist/node_modules/readable-stream/package.json +0 -68
  300. package/dist/node_modules/readable-stream/readable-browser.js +0 -9
  301. package/dist/node_modules/readable-stream/readable.js +0 -16
  302. package/dist/node_modules/safe-buffer/LICENSE +0 -21
  303. package/dist/node_modules/safe-buffer/README.md +0 -584
  304. package/dist/node_modules/safe-buffer/index.d.ts +0 -187
  305. package/dist/node_modules/safe-buffer/index.js +0 -65
  306. package/dist/node_modules/safe-buffer/package.json +0 -51
  307. package/dist/node_modules/semver/LICENSE +0 -15
  308. package/dist/node_modules/semver/README.md +0 -637
  309. package/dist/node_modules/semver/bin/semver.js +0 -197
  310. package/dist/node_modules/semver/classes/comparator.js +0 -141
  311. package/dist/node_modules/semver/classes/index.js +0 -5
  312. package/dist/node_modules/semver/classes/range.js +0 -539
  313. package/dist/node_modules/semver/classes/semver.js +0 -302
  314. package/dist/node_modules/semver/functions/clean.js +0 -6
  315. package/dist/node_modules/semver/functions/cmp.js +0 -52
  316. package/dist/node_modules/semver/functions/coerce.js +0 -52
  317. package/dist/node_modules/semver/functions/compare-build.js +0 -7
  318. package/dist/node_modules/semver/functions/compare-loose.js +0 -3
  319. package/dist/node_modules/semver/functions/compare.js +0 -5
  320. package/dist/node_modules/semver/functions/diff.js +0 -65
  321. package/dist/node_modules/semver/functions/eq.js +0 -3
  322. package/dist/node_modules/semver/functions/gt.js +0 -3
  323. package/dist/node_modules/semver/functions/gte.js +0 -3
  324. package/dist/node_modules/semver/functions/inc.js +0 -19
  325. package/dist/node_modules/semver/functions/lt.js +0 -3
  326. package/dist/node_modules/semver/functions/lte.js +0 -3
  327. package/dist/node_modules/semver/functions/major.js +0 -3
  328. package/dist/node_modules/semver/functions/minor.js +0 -3
  329. package/dist/node_modules/semver/functions/neq.js +0 -3
  330. package/dist/node_modules/semver/functions/parse.js +0 -16
  331. package/dist/node_modules/semver/functions/patch.js +0 -3
  332. package/dist/node_modules/semver/functions/prerelease.js +0 -6
  333. package/dist/node_modules/semver/functions/rcompare.js +0 -3
  334. package/dist/node_modules/semver/functions/rsort.js +0 -3
  335. package/dist/node_modules/semver/functions/satisfies.js +0 -10
  336. package/dist/node_modules/semver/functions/sort.js +0 -3
  337. package/dist/node_modules/semver/functions/valid.js +0 -6
  338. package/dist/node_modules/semver/index.js +0 -89
  339. package/dist/node_modules/semver/internal/constants.js +0 -35
  340. package/dist/node_modules/semver/internal/debug.js +0 -9
  341. package/dist/node_modules/semver/internal/identifiers.js +0 -23
  342. package/dist/node_modules/semver/internal/parse-options.js +0 -15
  343. package/dist/node_modules/semver/internal/re.js +0 -212
  344. package/dist/node_modules/semver/package.json +0 -87
  345. package/dist/node_modules/semver/preload.js +0 -2
  346. package/dist/node_modules/semver/range.bnf +0 -16
  347. package/dist/node_modules/semver/ranges/gtr.js +0 -4
  348. package/dist/node_modules/semver/ranges/intersects.js +0 -7
  349. package/dist/node_modules/semver/ranges/ltr.js +0 -4
  350. package/dist/node_modules/semver/ranges/max-satisfying.js +0 -25
  351. package/dist/node_modules/semver/ranges/min-satisfying.js +0 -24
  352. package/dist/node_modules/semver/ranges/min-version.js +0 -61
  353. package/dist/node_modules/semver/ranges/outside.js +0 -80
  354. package/dist/node_modules/semver/ranges/simplify.js +0 -47
  355. package/dist/node_modules/semver/ranges/subset.js +0 -247
  356. package/dist/node_modules/semver/ranges/to-comparators.js +0 -8
  357. package/dist/node_modules/semver/ranges/valid.js +0 -11
  358. package/dist/node_modules/sharp/LICENSE +0 -191
  359. package/dist/node_modules/sharp/README.md +0 -117
  360. package/dist/node_modules/sharp/binding.gyp +0 -233
  361. package/dist/node_modules/sharp/build/Release/sharp-linux-x64.node +0 -0
  362. package/dist/node_modules/sharp/install/can-compile.js +0 -11
  363. package/dist/node_modules/sharp/install/dll-copy.js +0 -37
  364. package/dist/node_modules/sharp/install/libvips.js +0 -215
  365. package/dist/node_modules/sharp/lib/agent.js +0 -40
  366. package/dist/node_modules/sharp/lib/channel.js +0 -171
  367. package/dist/node_modules/sharp/lib/colour.js +0 -180
  368. package/dist/node_modules/sharp/lib/composite.js +0 -193
  369. package/dist/node_modules/sharp/lib/constructor.js +0 -386
  370. package/dist/node_modules/sharp/lib/index.js +0 -13
  371. package/dist/node_modules/sharp/lib/input.js +0 -507
  372. package/dist/node_modules/sharp/lib/is.js +0 -143
  373. package/dist/node_modules/sharp/lib/libvips.js +0 -136
  374. package/dist/node_modules/sharp/lib/operation.js +0 -803
  375. package/dist/node_modules/sharp/lib/output.js +0 -1231
  376. package/dist/node_modules/sharp/lib/platform.js +0 -27
  377. package/dist/node_modules/sharp/lib/resize.js +0 -473
  378. package/dist/node_modules/sharp/lib/sharp.js +0 -35
  379. package/dist/node_modules/sharp/lib/utility.js +0 -211
  380. package/dist/node_modules/sharp/package.json +0 -196
  381. package/dist/node_modules/sharp/src/common.cc +0 -966
  382. package/dist/node_modules/sharp/src/common.h +0 -352
  383. package/dist/node_modules/sharp/src/libvips/cplusplus/VConnection.cpp +0 -152
  384. package/dist/node_modules/sharp/src/libvips/cplusplus/VError.cpp +0 -50
  385. package/dist/node_modules/sharp/src/libvips/cplusplus/VImage.cpp +0 -1523
  386. package/dist/node_modules/sharp/src/libvips/cplusplus/VInterpolate.cpp +0 -63
  387. package/dist/node_modules/sharp/src/libvips/cplusplus/vips-operators.cpp +0 -3738
  388. package/dist/node_modules/sharp/src/metadata.cc +0 -291
  389. package/dist/node_modules/sharp/src/metadata.h +0 -92
  390. package/dist/node_modules/sharp/src/operations.cc +0 -412
  391. package/dist/node_modules/sharp/src/operations.h +0 -126
  392. package/dist/node_modules/sharp/src/pipeline.cc +0 -1624
  393. package/dist/node_modules/sharp/src/pipeline.h +0 -349
  394. package/dist/node_modules/sharp/src/sharp.cc +0 -52
  395. package/dist/node_modules/sharp/src/stats.cc +0 -193
  396. package/dist/node_modules/sharp/src/stats.h +0 -70
  397. package/dist/node_modules/sharp/src/utilities.cc +0 -243
  398. package/dist/node_modules/sharp/src/utilities.h +0 -29
  399. package/dist/node_modules/sharp/vendor/8.12.2/linux-x64/THIRD-PARTY-NOTICES.md +0 -43
  400. package/dist/node_modules/sharp/vendor/8.12.2/linux-x64/lib/libvips-cpp.so.42 +0 -0
  401. package/dist/node_modules/sharp/vendor/8.12.2/linux-x64/platform.json +0 -1
  402. package/dist/node_modules/sharp/vendor/8.12.2/linux-x64/versions.json +0 -31
  403. package/dist/node_modules/simple-concat/.travis.yml +0 -3
  404. package/dist/node_modules/simple-concat/LICENSE +0 -20
  405. package/dist/node_modules/simple-concat/README.md +0 -44
  406. package/dist/node_modules/simple-concat/index.js +0 -15
  407. package/dist/node_modules/simple-concat/package.json +0 -47
  408. package/dist/node_modules/simple-concat/test/basic.js +0 -41
  409. package/dist/node_modules/simple-get/.github/dependabot.yml +0 -15
  410. package/dist/node_modules/simple-get/.github/workflows/ci.yml +0 -23
  411. package/dist/node_modules/simple-get/LICENSE +0 -20
  412. package/dist/node_modules/simple-get/README.md +0 -333
  413. package/dist/node_modules/simple-get/index.js +0 -108
  414. package/dist/node_modules/simple-get/package.json +0 -67
  415. package/dist/node_modules/simple-swizzle/LICENSE +0 -21
  416. package/dist/node_modules/simple-swizzle/README.md +0 -39
  417. package/dist/node_modules/simple-swizzle/index.js +0 -29
  418. package/dist/node_modules/simple-swizzle/package.json +0 -36
  419. package/dist/node_modules/string_decoder/LICENSE +0 -48
  420. package/dist/node_modules/string_decoder/README.md +0 -47
  421. package/dist/node_modules/string_decoder/lib/string_decoder.js +0 -296
  422. package/dist/node_modules/string_decoder/package.json +0 -34
  423. package/dist/node_modules/strip-json-comments/index.js +0 -70
  424. package/dist/node_modules/strip-json-comments/license +0 -21
  425. package/dist/node_modules/strip-json-comments/package.json +0 -42
  426. package/dist/node_modules/strip-json-comments/readme.md +0 -64
  427. package/dist/node_modules/tar-fs/.travis.yml +0 -6
  428. package/dist/node_modules/tar-fs/LICENSE +0 -21
  429. package/dist/node_modules/tar-fs/README.md +0 -165
  430. package/dist/node_modules/tar-fs/index.js +0 -351
  431. package/dist/node_modules/tar-fs/package.json +0 -41
  432. package/dist/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
  433. package/dist/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
  434. package/dist/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  435. package/dist/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  436. package/dist/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  437. package/dist/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  438. package/dist/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  439. package/dist/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  440. package/dist/node_modules/tar-fs/test/fixtures/e/file +0 -0
  441. package/dist/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  442. package/dist/node_modules/tar-fs/test/index.js +0 -346
  443. package/dist/node_modules/tar-stream/LICENSE +0 -21
  444. package/dist/node_modules/tar-stream/README.md +0 -168
  445. package/dist/node_modules/tar-stream/extract.js +0 -257
  446. package/dist/node_modules/tar-stream/headers.js +0 -295
  447. package/dist/node_modules/tar-stream/index.js +0 -2
  448. package/dist/node_modules/tar-stream/pack.js +0 -255
  449. package/dist/node_modules/tar-stream/package.json +0 -58
  450. package/dist/node_modules/tar-stream/sandbox.js +0 -11
  451. package/dist/node_modules/tunnel-agent/LICENSE +0 -55
  452. package/dist/node_modules/tunnel-agent/README.md +0 -4
  453. package/dist/node_modules/tunnel-agent/index.js +0 -244
  454. package/dist/node_modules/tunnel-agent/package.json +0 -22
  455. package/dist/node_modules/util-deprecate/History.md +0 -16
  456. package/dist/node_modules/util-deprecate/LICENSE +0 -24
  457. package/dist/node_modules/util-deprecate/README.md +0 -53
  458. package/dist/node_modules/util-deprecate/browser.js +0 -67
  459. package/dist/node_modules/util-deprecate/node.js +0 -6
  460. package/dist/node_modules/util-deprecate/package.json +0 -27
  461. package/dist/node_modules/wrappy/LICENSE +0 -15
  462. package/dist/node_modules/wrappy/README.md +0 -36
  463. package/dist/node_modules/wrappy/package.json +0 -29
  464. package/dist/node_modules/wrappy/wrappy.js +0 -33
  465. package/dist/node_modules/yallist/LICENSE +0 -15
  466. package/dist/node_modules/yallist/README.md +0 -204
  467. package/dist/node_modules/yallist/iterator.js +0 -8
  468. package/dist/node_modules/yallist/package.json +0 -29
  469. package/dist/node_modules/yallist/yallist.js +0 -426
  470. package/dist/package-lock.json +0 -502
  471. package/dist/package.json +0 -38
  472. package/dist/static/expected_tile_2193_153_255_z7.png +0 -0
  473. package/dist/static/expected_tile_NZTM2000Quad_30_33_z6.png +0 -0
  474. package/dist/static/expected_tile_WebMercatorQuad_252_156_z8.png +0 -0
@@ -1,17 +1,26 @@
1
1
  import { ConfigProviderMemory } from '@basemaps/config';
2
2
  import { initConfigFromUrls } from '@basemaps/config/build/json/tiff.config.js';
3
- import { GoogleTms, ImageFormat } from '@basemaps/geo';
3
+ import { ImageFormat, Tile, TileMatrixSet, TileMatrixSets } from '@basemaps/geo';
4
4
  import { LogConfig, setDefaultConfig } from '@basemaps/shared';
5
5
  import { fsa } from '@chunkd/fs';
6
6
  import { LambdaHttpRequest, LambdaUrlRequest, UrlEvent } from '@linzjs/lambda';
7
7
  import { Context } from 'aws-lambda';
8
- import { TileXyzRaster } from '../routes/tile.xyz.raster.js';
9
8
  import { pathToFileURL } from 'url';
9
+ import { TileXyzRaster } from '../routes/tile.xyz.raster.js';
10
10
 
11
- const target = pathToFileURL(`/home/blacha/tmp/basemaps/white-lines/nz-0.5m/`);
12
- const tile = { z: 10, x: 1013, y: 633 };
13
- const tileMatrix = GoogleTms;
14
- const imageFormat = ImageFormat.Webp;
11
+ const target = pathToFileURL(`/home/blacha/tmp/imagery/southland-0.25-rural-2023/`);
12
+ const tile = fromPath('/18/117833/146174.webp');
13
+
14
+ const outputFormat = ImageFormat.Webp;
15
+ let tileMatrix: TileMatrixSet | null = null;
16
+
17
+ /** Convert a tile path /:z/:x/:y.png into a tile */
18
+ function fromPath(s: string): Tile {
19
+ const parts = s.split('.')[0].split('/').map(Number);
20
+ if (s.startsWith('/')) parts.shift();
21
+ if (parts.length !== 3) throw new Error(`Invalid tile path ${s}`);
22
+ return { z: parts[0], x: parts[1], y: parts[2] };
23
+ }
15
24
 
16
25
  async function main(): Promise<void> {
17
26
  const log = LogConfig.get();
@@ -21,21 +30,28 @@ async function main(): Promise<void> {
21
30
 
22
31
  if (tileSet.layers.length === 0) throw new Error('No imagery found in path: ' + target);
23
32
  log.info({ tileSet: tileSet.name, layers: tileSet.layers.length }, 'TileSet:Loaded');
33
+
24
34
  for (const im of imagery) {
25
35
  log.info({ url: im.uri, title: im.title, tileMatrix: im.tileMatrix, files: im.files.length }, 'Imagery:Loaded');
36
+ if (tileMatrix == null) {
37
+ tileMatrix = TileMatrixSets.find(im.tileMatrix);
38
+ log.info({ tileMatrix: im.tileMatrix }, 'Imagery:TileMatrix:Set');
39
+ }
26
40
  }
41
+
42
+ if (tileMatrix == null) throw new Error('No tileMatrix found');
27
43
  const request = new LambdaUrlRequest({ headers: {} } as UrlEvent, {} as Context, log) as LambdaHttpRequest;
28
44
 
29
- tileSet.background = { r: 255, g: 255, b: 255, alpha: 1 };
45
+ tileSet.background = { r: 255, g: 0, b: 255, alpha: 0.25 };
30
46
  const res = await TileXyzRaster.tile(request, tileSet, {
31
47
  tile,
32
48
  tileMatrix,
33
49
  tileSet: tileSet.id,
34
- tileType: imageFormat,
50
+ tileType: outputFormat,
35
51
  });
36
52
 
37
- await fsa.write(`./${tile.z}_${tile.x}_${tile.y}.${imageFormat}`, Buffer.from(res.body, 'base64'));
38
- log.info({ path: `./${tile.z}_${tile.x}_${tile.y}.${imageFormat}` }, 'Tile:Write');
53
+ await fsa.write(`./${tile.z}_${tile.x}_${tile.y}.${outputFormat}`, Buffer.from(res.body, 'base64'));
54
+ log.info({ path: `./${tile.z}_${tile.x}_${tile.y}.${outputFormat}` }, 'Tile:Write');
39
55
  }
40
56
 
41
57
  main();
package/src/index.ts CHANGED
@@ -18,6 +18,8 @@ import { versionGet } from './routes/version.js';
18
18
  import { NotFound, OkResponse } from './util/response.js';
19
19
  import { CoSources } from './util/source.cache.js';
20
20
  import { St } from './util/source.tracer.js';
21
+ import { tilePreviewGet } from './routes/preview.js';
22
+ import { previewIndexGet } from './routes/preview.index.js';
21
23
 
22
24
  export const handler = lf.http(LogConfig.get());
23
25
 
@@ -93,6 +95,11 @@ handler.router.get('/v1/tiles/:tileSet/:tileMatrix/tile.json', tileJsonGet);
93
95
  // Tiles
94
96
  handler.router.get('/v1/tiles/:tileSet/:tileMatrix/:z/:x/:y.:tileType', tileXyzGet);
95
97
 
98
+ // Preview
99
+ handler.router.get('/v1/preview/:tileSet/:tileMatrix/:z/:lon/:lat', tilePreviewGet);
100
+ handler.router.get('/v1/@:location', previewIndexGet);
101
+ handler.router.get('/@:location', previewIndexGet);
102
+
96
103
  // Attribution
97
104
  handler.router.get('/v1/tiles/:tileSet/:tileMatrix/attribution.json', tileAttributionGet);
98
105
  handler.router.get('/v1/attribution/:tileSet/:tileMatrix/summary.json', tileAttributionGet);
@@ -0,0 +1,94 @@
1
+ import { Env, LogConfig, V, fsa } from '@basemaps/shared';
2
+ import { LambdaAlbRequest, LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
3
+ import { ALBEvent, Context } from 'aws-lambda';
4
+ import o from 'ospec';
5
+
6
+ import { loadAndServeIndexHtml } from '../preview.index.js';
7
+ import { LocationUrl } from '@basemaps/geo';
8
+ import { FsMemory } from '@chunkd/source-memory';
9
+
10
+ o.spec('/@*', async () => {
11
+ o.specTimeout(1000);
12
+ const baseRequest: ALBEvent = {
13
+ requestContext: null as any,
14
+ httpMethod: 'get',
15
+ path: '/@-41.8900012,174.0492432,z5',
16
+ body: null,
17
+ isBase64Encoded: false,
18
+ };
19
+
20
+ const fsMem = new FsMemory();
21
+ let lastLocation: string | undefined;
22
+ o.beforeEach(() => {
23
+ fsa.register('memory://', fsMem);
24
+ lastLocation = process.env[Env.StaticAssetLocation];
25
+ });
26
+ o.afterEach(() => {
27
+ if (lastLocation == null) delete process.env[Env.StaticAssetLocation];
28
+ else process.env[Env.StaticAssetLocation] = lastLocation;
29
+ });
30
+
31
+ o('Should redirect on failure to load', async () => {
32
+ const ctx: LambdaHttpRequest = new LambdaAlbRequest(baseRequest, {} as Context, LogConfig.get());
33
+
34
+ const res = await loadAndServeIndexHtml(ctx);
35
+ o(res.status).equals(302);
36
+ o(res.header('location')).equals('/?');
37
+ });
38
+
39
+ o('Should redirect with querystring on failure to load', async () => {
40
+ const evt: ALBEvent = { ...baseRequest, queryStringParameters: { config: 'config-latest.json' } };
41
+ const ctx: LambdaHttpRequest = new LambdaAlbRequest(evt, {} as Context, LogConfig.get());
42
+
43
+ const res = await loadAndServeIndexHtml(ctx);
44
+ o(res.status).equals(302);
45
+ o(res.header('location')).equals('/?config=config-latest.json');
46
+ });
47
+
48
+ o('Should redirect with querystring and location on failure to load', async () => {
49
+ const evt: ALBEvent = { ...baseRequest, queryStringParameters: { config: 'config-latest.json' } };
50
+ const loc = LocationUrl.fromSlug(evt.path);
51
+ const ctx: LambdaHttpRequest = new LambdaAlbRequest(evt, {} as Context, LogConfig.get());
52
+
53
+ const res = await loadAndServeIndexHtml(ctx, loc);
54
+ o(res.status).equals(302);
55
+ o(res.header('location')).equals('/?config=config-latest.json#@-41.8900012,174.0492432,z5');
56
+ });
57
+
58
+ o('should redirect on failure to load index.html', async () => {
59
+ const ctx: LambdaHttpRequest = new LambdaAlbRequest(baseRequest, {} as Context, LogConfig.get());
60
+ process.env[Env.StaticAssetLocation] = 'memory://assets/';
61
+
62
+ const res = await loadAndServeIndexHtml(ctx);
63
+ o(res.status).equals(302);
64
+ });
65
+
66
+ o('should redirect with new tags!', async () => {
67
+ const ctx = new LambdaAlbRequest(baseRequest, {} as Context, LogConfig.get());
68
+ process.env[Env.StaticAssetLocation] = 'memory://assets/';
69
+
70
+ const indexHtml = V('html', [
71
+ V('head', [
72
+ V('meta', { property: 'og:title', content: 'LINZ Basemaps' }),
73
+ V('meta', { property: 'og:image', content: '/basemaps-card.jepg' }),
74
+ V('meta', { name: 'viewport' }),
75
+ ]),
76
+ ]).toString();
77
+
78
+ await fsa.write('memory://assets/index.html', indexHtml);
79
+
80
+ // Pass back the body un altered
81
+ const res = await loadAndServeIndexHtml(ctx);
82
+ o(getBody(res)?.toString()).equals(indexHtml);
83
+
84
+ // Replace og:title with a <fake tag />
85
+ const resB = await loadAndServeIndexHtml(ctx, null, new Map([['og:title', '<fake tag />']]));
86
+ o(getBody(resB)?.toString().includes('<fake tag />')).equals(true);
87
+ });
88
+ });
89
+
90
+ function getBody(res: LambdaHttpResponse): Buffer | null {
91
+ if (res._body == null) return null;
92
+ if (res.isBase64Encoded) return Buffer.from(res._body as string, 'base64');
93
+ return Buffer.from(res._body as string);
94
+ }
@@ -125,8 +125,7 @@ async function tileSetAttribution(
125
125
 
126
126
  items.push(item);
127
127
 
128
- const minZoom = layer.disabled ? 32 : layer.minZoom;
129
- const zoomMin = TileMatrixSet.convertZoomLevel(minZoom ? minZoom : 0, GoogleTms, tileMatrix, true);
128
+ const zoomMin = TileMatrixSet.convertZoomLevel(layer.minZoom ? layer.minZoom : 0, GoogleTms, tileMatrix, true);
130
129
  const zoomMax = TileMatrixSet.convertZoomLevel(layer.maxZoom ? layer.maxZoom : 32, GoogleTms, tileMatrix, true);
131
130
  cols.push({
132
131
  stac_version: Stac.Version,
@@ -141,7 +140,6 @@ async function tileSetAttribution(
141
140
  'linz:category': im.category,
142
141
  'linz:zoom': { min: zoomMin, max: zoomMax },
143
142
  'linz:priority': [1000 + tileSet.layers.indexOf(layer)],
144
- 'linz:disabled': layer.disabled ? true : false,
145
143
  },
146
144
  });
147
145
  }
@@ -0,0 +1,119 @@
1
+ import { GoogleTms, LocationUrl, LonLatZoom, TileMatrixSets } from '@basemaps/geo';
2
+ import { HttpHeader, LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
3
+ import { ConfigLoader } from '../util/config.loader.js';
4
+ import { Env, fsa } from '@basemaps/shared';
5
+ import { isGzip } from '../util/cotar.serve.js';
6
+ import { gunzip } from 'node:zlib';
7
+ import { promisify } from 'node:util';
8
+ import { Etag } from '../util/etag.js';
9
+
10
+ const gunzipP = promisify(gunzip);
11
+
12
+ export interface PreviewIndexGet {
13
+ Params: {
14
+ location: string;
15
+ };
16
+ Query: {
17
+ config?: string;
18
+ style?: string;
19
+ tileMatrix?: string;
20
+ };
21
+ }
22
+
23
+ /**
24
+ * Load the `index.html` from the static bucket and replace `<meta />` tags with the preview open graph tags
25
+ *
26
+ * @param loc location of the request if valid
27
+ * @param tags tags to replace if they exist
28
+ *
29
+ * @returns response containing the output HTML
30
+ */
31
+ export async function loadAndServeIndexHtml(
32
+ req: LambdaHttpRequest,
33
+ loc?: LonLatZoom | null,
34
+ tags?: Map<string, string>,
35
+ ): Promise<LambdaHttpResponse> {
36
+ const locUrl = loc ? `#` + LocationUrl.toSlug(loc) : '';
37
+ // If the static location is given to us replace
38
+ const staticLocation = Env.get(Env.StaticAssetLocation);
39
+ // No static assets defined, just redirect back to the main page
40
+ if (staticLocation == null) {
41
+ return new LambdaHttpResponse(302, 'Invalid index.html', {
42
+ location: '/?' + req.query.toString() + locUrl,
43
+ });
44
+ }
45
+
46
+ try {
47
+ let indexHtml = await fsa.read(fsa.join(staticLocation, 'index.html'));
48
+ if (isGzip(indexHtml)) indexHtml = await gunzipP(indexHtml);
49
+
50
+ const res = new LambdaHttpResponse(200, 'ok');
51
+ // These index.html documents are refreshed frequently so only let them be cached for short durations
52
+ res.header(HttpHeader.CacheControl, 'public, max-age=30, stale-while-revalidate=60');
53
+
54
+ if (tags == null) {
55
+ res.header(HttpHeader.ETag, Etag.key(indexHtml));
56
+ res.buffer(indexHtml, `text/html; charset=utf-8`);
57
+ return res;
58
+ }
59
+
60
+ // Replace open graph tags
61
+ const output = String(indexHtml)
62
+ .split('\n')
63
+ .map((f) => {
64
+ for (const [key, value] of tags.entries()) {
65
+ if (f.includes(key)) return value;
66
+ }
67
+ return f;
68
+ });
69
+
70
+ const outHtml = output.join('\n');
71
+ res.header(HttpHeader.ETag, Etag.key(outHtml));
72
+ res.buffer(outHtml, `text/html; charset=utf-8`);
73
+ return res;
74
+ } catch (e) {
75
+ req.log.fatal({ e }, 'Index:Failed');
76
+ // If we fail to read transform the index, just redirect the user to the actual index.html
77
+ return new LambdaHttpResponse(302, 'Failed to render index.html', {
78
+ location: '/?' + req.query.toString() + locUrl,
79
+ });
80
+ }
81
+ }
82
+
83
+ export async function previewIndexGet(req: LambdaHttpRequest<PreviewIndexGet>): Promise<LambdaHttpResponse> {
84
+ const config = await ConfigLoader.load(req);
85
+ const loc = LocationUrl.fromSlug(req.params.location);
86
+ if (loc == null) return loadAndServeIndexHtml(req);
87
+
88
+ const query = LocationUrl.parseQuery(req.query);
89
+
90
+ req.timer.start('tileset:load');
91
+ const tileSet = await config.TileSet.get(config.TileSet.id(query.style));
92
+ req.timer.end('tileset:load');
93
+ if (tileSet == null) return loadAndServeIndexHtml(req, loc);
94
+ if (tileSet.type !== 'raster') return loadAndServeIndexHtml(req, loc);
95
+
96
+ let tileMatrix = TileMatrixSets.find(query.tileMatrix);
97
+ if (tileMatrix == null) tileMatrix = GoogleTms;
98
+
99
+ const short = LocationUrl.truncateLatLon(loc);
100
+ const shortLocation = [short.zoom, short.lon, short.lat].join('/');
101
+
102
+ // Include tile matrix name eg "[NZTM2000Quad]" in the title if its not WebMercatorQuad
103
+ const tileMatrixId = tileMatrix.identifier === GoogleTms.identifier ? '' : ` [${tileMatrix.identifier}]`;
104
+ // List of tags to replace in the index.html
105
+ const ogTags = new Map([
106
+ ['og:title', `<meta name="twitter:title" property="og:title" content="LINZ Basemaps">`],
107
+ // TODO attribution could be used to get exactly what imagery is being looked at.
108
+ [
109
+ 'og:description',
110
+ `<meta name="twitter:description" property="og:description" content="${tileSet.title}${tileMatrixId}" />`,
111
+ ],
112
+ [
113
+ 'og:image',
114
+ `<meta name="twitter:image" property="og:image" content="/v1/preview/${tileSet.name}/${tileMatrix.identifier}/${shortLocation}" />`,
115
+ ],
116
+ ]);
117
+
118
+ return loadAndServeIndexHtml(req, loc, ogTags);
119
+ }
@@ -0,0 +1,234 @@
1
+ import { ConfigTileSetRaster } from '@basemaps/config';
2
+ import { Bounds, ImageFormat, LatLon, Projection, TileMatrixSet } from '@basemaps/geo';
3
+ import { CompositionTiff, Tiler } from '@basemaps/tiler';
4
+ import { SharpOverlay, TileMakerSharp } from '@basemaps/tiler-sharp';
5
+ import { HttpHeader, LambdaHttpRequest, LambdaHttpResponse } from '@linzjs/lambda';
6
+ import { ConfigLoader } from '../util/config.loader.js';
7
+ import { Etag } from '../util/etag.js';
8
+ import { NotModified } from '../util/response.js';
9
+ import { Validate } from '../util/validate.js';
10
+ import { DefaultResizeKernel, TileXyzRaster, isArchiveTiff } from './tile.xyz.raster.js';
11
+ import sharp from 'sharp';
12
+
13
+ export interface PreviewGet {
14
+ Params: {
15
+ tileSet: string;
16
+ tileMatrix: string;
17
+ lat: string;
18
+ lon: string;
19
+ z: string;
20
+ };
21
+ }
22
+
23
+ const PreviewSize = { width: 1200, height: 630 };
24
+ const TilerSharp = new TileMakerSharp(PreviewSize.width, PreviewSize.height);
25
+
26
+ const OutputFormat = ImageFormat.Webp;
27
+ /** Slightly grey color for the checker background */
28
+ const PreviewBackgroundFillColor = 0xef;
29
+ /** Make th e checkered background 30x30px */
30
+ const PreviewBackgroundSizePx = 30;
31
+
32
+ /**
33
+ * Serve a preview of a imagery set
34
+ *
35
+ * /v1/preview/:tileSet/:tileMatrixSet/:z/:lon/:lat
36
+ *
37
+ * @example
38
+ * Raster Tile `/v1/preview/aerial/WebMercatorQuad/12/177.3998405/-39.0852555`
39
+ *
40
+ */
41
+ export async function tilePreviewGet(req: LambdaHttpRequest<PreviewGet>): Promise<LambdaHttpResponse> {
42
+ const tileMatrix = Validate.getTileMatrixSet(req.params.tileMatrix);
43
+ if (tileMatrix == null) return new LambdaHttpResponse(404, 'Tile Matrix not found');
44
+
45
+ req.set('tileMatrix', tileMatrix.identifier);
46
+ req.set('projection', tileMatrix.projection.code);
47
+
48
+ // TODO we should detect the format based off the "Accept" header and maybe default back to webp
49
+ req.set('extension', OutputFormat);
50
+
51
+ const location = Validate.getLocation(req.params.lon, req.params.lat);
52
+ if (location == null) return new LambdaHttpResponse(404, 'Preview location not found');
53
+ req.set('location', location);
54
+
55
+ const z = Math.ceil(parseFloat(req.params.z));
56
+ if (isNaN(z) || z < 0 || z > tileMatrix.maxZoom) return new LambdaHttpResponse(404, 'Preview zoom invalid');
57
+
58
+ const config = await ConfigLoader.load(req);
59
+
60
+ req.timer.start('tileset:load');
61
+ const tileSet = await config.TileSet.get(config.TileSet.id(req.params.tileSet));
62
+ req.timer.end('tileset:load');
63
+ if (tileSet == null) return new LambdaHttpResponse(404, 'Tileset not found');
64
+ // Only raster previews are supported
65
+ if (tileSet.type !== 'raster') return new LambdaHttpResponse(404, 'Preview invalid tile set type');
66
+
67
+ return renderPreview(req, { tileSet, tileMatrix, location, outputFormat: OutputFormat, z });
68
+ }
69
+
70
+ interface PreviewRenderContext {
71
+ /** Imagery to use */
72
+ tileSet: ConfigTileSetRaster;
73
+ /** output tilematrix to use */
74
+ tileMatrix: TileMatrixSet;
75
+ /** Center point of the preview */
76
+ location: LatLon;
77
+ /** Iamge format to render the preview as */
78
+ outputFormat: ImageFormat;
79
+ /** Zom level to be use, must be a integer */
80
+ z: number;
81
+ }
82
+ /**
83
+ * Render the preview!
84
+ *
85
+ * All the parameter validation is done in {@link tilePreviewGet} this function expects everything to align
86
+ *
87
+ * @returns 304 not modified if the ETag matches or 200 ok with the content of the image
88
+ */
89
+ export async function renderPreview(req: LambdaHttpRequest, ctx: PreviewRenderContext): Promise<LambdaHttpResponse> {
90
+ const tileMatrix = ctx.tileMatrix;
91
+ // Convert the input lat/lon into the projected coordinates to make it easier to do math with
92
+ const coords = Projection.get(tileMatrix).fromWgs84([ctx.location.lon, ctx.location.lat]);
93
+
94
+ // use the input as the center point, but round it to the closest pixel to make it easier to do math
95
+ const point = tileMatrix.sourceToPixels(coords[0], coords[1], ctx.z);
96
+ const pointCenter = { x: Math.round(point.x), y: Math.round(point.y) };
97
+
98
+ // position of the preview in relation to the output screen
99
+ const screenBounds = new Bounds(
100
+ pointCenter.x - PreviewSize.width / 2,
101
+ pointCenter.y - PreviewSize.height / 2,
102
+ PreviewSize.width,
103
+ PreviewSize.height,
104
+ );
105
+
106
+ // Convert the screen bounds back into the source to find the assets we need to render the preview
107
+ const topLeft = tileMatrix.pixelsToSource(screenBounds.x, screenBounds.y, ctx.z);
108
+ const bottomRight = tileMatrix.pixelsToSource(screenBounds.right, screenBounds.bottom, ctx.z);
109
+ const sourceBounds = Bounds.fromBbox([topLeft.x, topLeft.y, bottomRight.x, bottomRight.y]);
110
+
111
+ const assetLocations = await TileXyzRaster.getAssetsForBounds(
112
+ req,
113
+ ctx.tileSet,
114
+ tileMatrix,
115
+ sourceBounds,
116
+ ctx.z,
117
+ true,
118
+ );
119
+
120
+ const cacheKey = Etag.key(assetLocations);
121
+ if (Etag.isNotModified(req, cacheKey)) return NotModified();
122
+
123
+ const assets = await TileXyzRaster.loadAssets(req, assetLocations);
124
+ const tiler = new Tiler(tileMatrix);
125
+
126
+ // Figure out what tiffs and tiles need to be read and where they are placed on the output image
127
+ const compositions: CompositionTiff[] = [];
128
+ for (const asset of assets) {
129
+ // there shouldn't be any Cotar archives in previews but ignore them to be safe
130
+ if (!isArchiveTiff(asset)) continue;
131
+ const result = tiler.getTiles(asset, screenBounds, ctx.z);
132
+ if (result == null) continue;
133
+ compositions.push(...result);
134
+ }
135
+
136
+ // Load all the tiff tiles and resize/them into the correct locations
137
+ req.timer.start('compose:overlay');
138
+ const overlays = (await Promise.all(
139
+ compositions.map((comp) => TilerSharp.composeTileTiff(comp, DefaultResizeKernel)),
140
+ ).then((items) => items.filter((f) => f != null))) as SharpOverlay[];
141
+ req.timer.end('compose:overlay');
142
+
143
+ // Create the output image and render all the individual pieces into them
144
+ const img = getBaseImage(ctx.tileSet.background);
145
+ img.composite(overlays);
146
+
147
+ req.timer.start('compose:compress');
148
+ const buf = await TilerSharp.toImage(ctx.outputFormat, img);
149
+ req.timer.end('compose:compress');
150
+
151
+ req.set('layersUsed', overlays.length);
152
+ req.set('bytes', buf.byteLength);
153
+ const response = new LambdaHttpResponse(200, 'ok');
154
+ response.header(HttpHeader.ETag, cacheKey);
155
+ response.header(HttpHeader.CacheControl, 'public, max-age=604800, stale-while-revalidate=86400');
156
+ response.buffer(buf, 'image/' + ctx.outputFormat);
157
+
158
+ const shortLocation = [ctx.location.lon.toFixed(7), ctx.location.lat.toFixed(7)].join('_');
159
+ const suggestedFileName = `preview_${ctx.tileSet.name}_z${ctx.z}_${shortLocation}.${ctx.outputFormat}`;
160
+ response.header('Content-Disposition', `inline; filename=\"${suggestedFileName}\"`);
161
+
162
+ return response;
163
+ }
164
+
165
+ function getBaseImage(bg?: { r: number; g: number; b: number; alpha: number }): sharp.Sharp {
166
+ if (bg == null || bg.alpha === 0) {
167
+ const buf = createCheckerBoard({
168
+ width: PreviewSize.width,
169
+ height: PreviewSize.height,
170
+ colors: { fill: PreviewBackgroundFillColor, background: 0xff },
171
+ size: PreviewBackgroundSizePx,
172
+ });
173
+ return sharp(buf.buffer, { raw: buf.raw });
174
+ }
175
+ return TilerSharp.createImage(bg);
176
+ }
177
+
178
+ export interface CheckerBoard {
179
+ /** Output image width in pixels */
180
+ width: number;
181
+ /** Output image height in pixels */
182
+ height: number;
183
+ colors: {
184
+ /** Color of the checker board eg 0xef */
185
+ fill: number;
186
+ /** Color of the background eg 0xff */
187
+ background: number;
188
+ };
189
+ /** Size of the checkers */
190
+ size: number;
191
+ }
192
+
193
+ /** Create a chess/checkerboard background alternating between two colors */
194
+ function createCheckerBoard(ctx: CheckerBoard): {
195
+ buffer: Buffer;
196
+ raw: { width: number; height: number; channels: 1 };
197
+ } {
198
+ const { width, height, size } = ctx;
199
+ const fillColor = ctx.colors.fill;
200
+ // Create a one band image, which starts off as full white
201
+ const buf = Buffer.alloc(height * width, ctx.colors.background); // 1 band grey buffer;
202
+
203
+ // Number of squares to make in x/y directions
204
+ const tileY = height / size;
205
+ const tileX = width / size;
206
+
207
+ // Fill in a square at the x/y pixel offsets
208
+ function fillSquare(xOffset: number, yOffset: number): void {
209
+ for (let y = 0; y < size; y++) {
210
+ const yPx = (yOffset + y) * width;
211
+ for (let x = 0; x < size; x++) {
212
+ const px = yPx + xOffset + x;
213
+ // Actually set the color
214
+ buf[px] = fillColor;
215
+ }
216
+ }
217
+ }
218
+ for (let tX = 0; tX < tileX; tX++) {
219
+ for (let tY = 0; tY < tileY; tY++) {
220
+ const yOffset = tY * size;
221
+ const y2 = tY % 2;
222
+
223
+ // Draw every second tile alternating on rows
224
+ const x2 = tX % 2;
225
+ if (x2 === 0 && y2 === 1) continue;
226
+ if (x2 === 1 && y2 === 0) continue;
227
+
228
+ const xOffset = tX * size;
229
+ fillSquare(xOffset, yOffset);
230
+ }
231
+ }
232
+
233
+ return { buffer: buf, raw: { width, height, channels: 1 } };
234
+ }
@@ -24,47 +24,62 @@ export function getTiffName(name: string): string {
24
24
 
25
25
  export type CloudArchive = CogTiff | Cotar;
26
26
 
27
+ /** Check to see if a cloud archive is a Tiff or a Cotar */
28
+ export function isArchiveTiff(x: CloudArchive): x is CogTiff {
29
+ if (x instanceof CogTiff) return true;
30
+ if (x.source.uri.endsWith('.tiff')) return true;
31
+ if (x.source.uri.endsWith('.tif')) return true;
32
+ return false;
33
+ }
34
+
27
35
  export const TileComposer = new TileMakerSharp(256);
28
36
 
29
- const DefaultResizeKernel = { in: 'lanczos3', out: 'lanczos3' } as const;
30
- const DefaultBackground = { r: 0, g: 0, b: 0, alpha: 0 };
37
+ export const DefaultResizeKernel = { in: 'lanczos3', out: 'lanczos3' } as const;
38
+ export const DefaultBackground = { r: 0, g: 0, b: 0, alpha: 0 };
31
39
 
32
40
  export const TileXyzRaster = {
33
- async getAssetsForTile(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, xyz: TileXyz): Promise<string[]> {
41
+ async getAssetsForBounds(
42
+ req: LambdaHttpRequest,
43
+ tileSet: ConfigTileSetRaster,
44
+ tileMatrix: TileMatrixSet,
45
+ bounds: Bounds,
46
+ zoom: number,
47
+ ignoreOverview = false,
48
+ ): Promise<string[]> {
34
49
  const config = await ConfigLoader.load(req);
35
- const imagery = await getAllImagery(config, tileSet.layers, [xyz.tileMatrix.projection]);
50
+ const imagery = await getAllImagery(config, tileSet.layers, [tileMatrix.projection]);
36
51
  const filteredLayers = filterLayers(req, tileSet.layers);
37
52
 
38
53
  const output: string[] = [];
39
- const tileBounds = xyz.tileMatrix.tileToSourceBounds(xyz.tile);
40
54
 
41
55
  // All zoom level config is stored as Google zoom levels
42
- const filterZoom = TileMatrixSet.convertZoomLevel(xyz.tile.z, xyz.tileMatrix, TileMatrixSets.get(Epsg.Google));
56
+ const filterZoom = TileMatrixSet.convertZoomLevel(zoom, tileMatrix, TileMatrixSets.get(Epsg.Google));
43
57
  for (const layer of filteredLayers) {
44
- if (layer.disabled) continue;
45
58
  if (layer.maxZoom != null && filterZoom > layer.maxZoom) continue;
46
59
  if (layer.minZoom != null && filterZoom < layer.minZoom) continue;
47
60
 
48
- const imgId = layer[xyz.tileMatrix.projection.code];
49
- if (imgId == null) {
50
- req.log.warn({ layer: layer.name, projection: xyz.tileMatrix.projection.code }, 'Failed to lookup imagery');
51
- continue;
52
- }
61
+ const imgId = layer[tileMatrix.projection.code];
62
+ // Imagery does not exist for this projection
63
+ if (imgId == null) continue;
53
64
 
54
65
  const img = imagery.get(imgId);
55
66
  if (img == null) {
56
- req.log.warn(
57
- { layer: layer.name, projection: xyz.tileMatrix.projection.code, imgId },
58
- 'Failed to lookup imagery',
59
- );
67
+ req.log.warn({ layer: layer.name, projection: tileMatrix.projection.code, imgId }, 'Failed to lookup imagery');
60
68
  continue;
61
69
  }
62
- if (!tileBounds.intersects(Bounds.fromJson(img.bounds))) continue;
70
+ if (!bounds.intersects(Bounds.fromJson(img.bounds))) continue;
63
71
 
64
72
  for (const c of img.files) {
65
- if (!tileBounds.intersects(Bounds.fromJson(c))) continue;
66
-
67
- if (img.overviews && img.overviews.maxZoom >= filterZoom && img.overviews.minZoom <= filterZoom) {
73
+ if (!bounds.intersects(Bounds.fromJson(c))) continue;
74
+
75
+ // If there are overviews and they exist for this zoom range and we are not ignoring them
76
+ // lets use the overviews instead!
77
+ if (
78
+ img.overviews &&
79
+ img.overviews.maxZoom >= filterZoom &&
80
+ img.overviews.minZoom <= filterZoom &&
81
+ ignoreOverview !== true
82
+ ) {
68
83
  output.push(fsa.join(img.uri, img.overviews.path));
69
84
  break;
70
85
  }
@@ -76,15 +91,9 @@ export const TileXyzRaster = {
76
91
  return output;
77
92
  },
78
93
 
79
- async tile(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, xyz: TileXyz): Promise<LambdaHttpResponse> {
80
- if (xyz.tileType === VectorFormat.MapboxVectorTiles) return NotFound();
81
-
82
- const assetPaths = await this.getAssetsForTile(req, tileSet, xyz);
83
- const cacheKey = Etag.key(assetPaths);
84
- if (Etag.isNotModified(req, cacheKey)) return NotModified();
85
-
94
+ async loadAssets(req: LambdaHttpRequest, assets: string[]): Promise<CloudArchive[]> {
86
95
  const toLoad: Promise<CloudArchive | null>[] = [];
87
- for (const assetPath of assetPaths) {
96
+ for (const assetPath of assets) {
88
97
  toLoad.push(
89
98
  LoadingQueue((): Promise<CloudArchive | null> => {
90
99
  if (assetPath.endsWith('.tar.co')) {
@@ -101,7 +110,22 @@ export const TileXyzRaster = {
101
110
  );
102
111
  }
103
112
 
104
- const assets = (await Promise.all(toLoad)).filter((f) => f != null) as CloudArchive[];
113
+ return (await Promise.all(toLoad)).filter((f) => f != null) as CloudArchive[];
114
+ },
115
+
116
+ async getAssetsForTile(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, xyz: TileXyz): Promise<string[]> {
117
+ const tileBounds = xyz.tileMatrix.tileToSourceBounds(xyz.tile);
118
+ return TileXyzRaster.getAssetsForBounds(req, tileSet, xyz.tileMatrix, tileBounds, xyz.tile.z);
119
+ },
120
+
121
+ async tile(req: LambdaHttpRequest, tileSet: ConfigTileSetRaster, xyz: TileXyz): Promise<LambdaHttpResponse> {
122
+ if (xyz.tileType === VectorFormat.MapboxVectorTiles) return NotFound();
123
+
124
+ const assetPaths = await this.getAssetsForTile(req, tileSet, xyz);
125
+ const cacheKey = Etag.key(assetPaths);
126
+ if (Etag.isNotModified(req, cacheKey)) return NotModified();
127
+
128
+ const assets = await TileXyzRaster.loadAssets(req, assetPaths);
105
129
 
106
130
  const tiler = new Tiler(xyz.tileMatrix);
107
131
  const layers = await tiler.tile(assets, xyz.tile.x, xyz.tile.y, xyz.tile.z);