uomtiles 0.1.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.
- package/.output/nitro.json +15 -0
- package/.output/public/_nuxt/1d1PDhA4.js +1 -0
- package/.output/public/_nuxt/3B2XYGg4.js +1 -0
- package/.output/public/_nuxt/981KwFWf.js +1 -0
- package/.output/public/_nuxt/B30dSvM4.js +1 -0
- package/.output/public/_nuxt/BN1Gp4Dm.js +1 -0
- package/.output/public/_nuxt/BQlj8Xoe.js +6 -0
- package/.output/public/_nuxt/BRkljK8J.js +1 -0
- package/.output/public/_nuxt/BSdHYVlE2.js +1 -0
- package/.output/public/_nuxt/B_MqTg2k2.js +1 -0
- package/.output/public/_nuxt/BiWblTbb2.js +64 -0
- package/.output/public/_nuxt/BrPwntMr.js +1 -0
- package/.output/public/_nuxt/BskybydR.js +1 -0
- package/.output/public/_nuxt/ByRlKR9F.js +1 -0
- package/.output/public/_nuxt/C0Zdl2EE2.js +1 -0
- package/.output/public/_nuxt/C4qlzA4o.js +1 -0
- package/.output/public/_nuxt/C7HxHbxA.js +1 -0
- package/.output/public/_nuxt/C97TfNgP.js +3 -0
- package/.output/public/_nuxt/CNs_Ozdc.js +1 -0
- package/.output/public/_nuxt/CPuhwLY1.js +1 -0
- package/.output/public/_nuxt/CVE291Pi.js +1 -0
- package/.output/public/_nuxt/C_0VY3Cv2.js +4 -0
- package/.output/public/_nuxt/Ce26t8_Y.js +1 -0
- package/.output/public/_nuxt/CfW544W5.js +1 -0
- package/.output/public/_nuxt/CgMd2Y5s.js +2 -0
- package/.output/public/_nuxt/CgdzV712.js +1 -0
- package/.output/public/_nuxt/D1wVNWS0.js +1 -0
- package/.output/public/_nuxt/DC3bhq63.js +1 -0
- package/.output/public/_nuxt/DK3Fl9T5.js +1 -0
- package/.output/public/_nuxt/DL1MZZLI.js +1 -0
- package/.output/public/_nuxt/DXm-42Fi.js +1 -0
- package/.output/public/_nuxt/Djg3Kzfv.js +1 -0
- package/.output/public/_nuxt/DkcySee1.js +1 -0
- package/.output/public/_nuxt/DmN-PKW1.js +1 -0
- package/.output/public/_nuxt/DtFVCXI9.js +1 -0
- package/.output/public/_nuxt/Dz7VMlHR.js +1 -0
- package/.output/public/_nuxt/NL65vbjG2.js +1 -0
- package/.output/public/_nuxt/Oxy7pKSk.js +3 -0
- package/.output/public/_nuxt/Pik8or8N2.js +1 -0
- package/.output/public/_nuxt/XZ59tThl.js +1 -0
- package/.output/public/_nuxt/ZpWjFsgV.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -0
- package/.output/public/_nuxt/builds/meta/9f85104e-738d-4a74-8daa-40b136ce17d5.json +1 -0
- package/.output/public/_nuxt/dXz6dFgW2.js +1 -0
- package/.output/public/_nuxt/entry.P6tFNE31.css +1 -0
- package/.output/public/_nuxt/error-404.Biv0P6cJ.css +1 -0
- package/.output/public/_nuxt/error-500.8ok468rV.css +1 -0
- package/.output/public/_nuxt/j0MRD-c3.js +1 -0
- package/.output/public/_nuxt/local-pixel-diff.worker-C6RdZoCq.js +2 -0
- package/.output/public/_nuxt/maplibre-gl-worker.nfnkSQvL.mjs +6 -0
- package/.output/public/_nuxt/nearest-area.worker-iSLH0Y_s.js +2 -0
- package/.output/public/_nuxt/q7DkoVkj.js +828 -0
- package/.output/public/_nuxt/raster-tile.worker-BFlOgJig.js +2 -0
- package/.output/public/_nuxt/services._3nQizF8.css +1 -0
- package/.output/public/_nuxt/sql-wasm.DfANybxk.wasm +0 -0
- package/.output/public/_nuxt/tile-diff.worker-CvWWI_eu.js +1 -0
- package/.output/public/_nuxt/zZ1EGR7Y.js +1 -0
- package/.output/public/apple-touch-icon.png +0 -0
- package/.output/public/favicon.ico +0 -0
- package/.output/public/favicon.svg +8 -0
- package/.output/public/icon-192.png +0 -0
- package/.output/public/icon-512.png +0 -0
- package/.output/public/site.webmanifest +11 -0
- package/.output/server/chunks/_/config.mjs +208 -0
- package/.output/server/chunks/_/config.mjs.map +1 -0
- package/.output/server/chunks/_/data-directory.mjs +24 -0
- package/.output/server/chunks/_/data-directory.mjs.map +1 -0
- package/.output/server/chunks/_/error-500.mjs +20 -0
- package/.output/server/chunks/_/error-500.mjs.map +1 -0
- package/.output/server/chunks/_/file-workspace.mjs +910 -0
- package/.output/server/chunks/_/file-workspace.mjs.map +1 -0
- package/.output/server/chunks/_/icons.mjs +6269 -0
- package/.output/server/chunks/_/icons.mjs.map +1 -0
- package/.output/server/chunks/_/map-service.mjs +233 -0
- package/.output/server/chunks/_/map-service.mjs.map +1 -0
- package/.output/server/chunks/_/missing-tile.mjs +104 -0
- package/.output/server/chunks/_/missing-tile.mjs.map +1 -0
- package/.output/server/chunks/_/pixel-diff.mjs +78 -0
- package/.output/server/chunks/_/pixel-diff.mjs.map +1 -0
- package/.output/server/chunks/_/uom-auth.mjs +334 -0
- package/.output/server/chunks/_/uom-auth.mjs.map +1 -0
- package/.output/server/chunks/_/uom-map.mjs +265 -0
- package/.output/server/chunks/_/uom-map.mjs.map +1 -0
- package/.output/server/chunks/build/Alert-0ngTJXxP.mjs +5076 -0
- package/.output/server/chunks/build/Alert-0ngTJXxP.mjs.map +1 -0
- package/.output/server/chunks/build/DashboardSidebarToggle-pncTaIJq.mjs +569 -0
- package/.output/server/chunks/build/DashboardSidebarToggle-pncTaIJq.mjs.map +1 -0
- package/.output/server/chunks/build/Empty-CkW3mADt.mjs +359 -0
- package/.output/server/chunks/build/Empty-CkW3mADt.mjs.map +1 -0
- package/.output/server/chunks/build/FocusScope-Cf0lg0zt.mjs +207 -0
- package/.output/server/chunks/build/FocusScope-Cf0lg0zt.mjs.map +1 -0
- package/.output/server/chunks/build/FormField-CEUZHcv7.mjs +278 -0
- package/.output/server/chunks/build/FormField-CEUZHcv7.mjs.map +1 -0
- package/.output/server/chunks/build/Input-BeNavYXb.mjs +592 -0
- package/.output/server/chunks/build/Input-BeNavYXb.mjs.map +1 -0
- package/.output/server/chunks/build/MapBaseLayerTabs-4445J6yh.mjs +2003 -0
- package/.output/server/chunks/build/MapBaseLayerTabs-4445J6yh.mjs.map +1 -0
- package/.output/server/chunks/build/Modal-DNZtVxca.mjs +1326 -0
- package/.output/server/chunks/build/Modal-DNZtVxca.mjs.map +1 -0
- package/.output/server/chunks/build/OnlineMap-CKwiuqUY.mjs +146 -0
- package/.output/server/chunks/build/OnlineMap-CKwiuqUY.mjs.map +1 -0
- package/.output/server/chunks/build/Pagination-CDHx4HTZ.mjs +1025 -0
- package/.output/server/chunks/build/Pagination-CDHx4HTZ.mjs.map +1 -0
- package/.output/server/chunks/build/PopperArrow-Bqfdf2Et.mjs +2066 -0
- package/.output/server/chunks/build/PopperArrow-Bqfdf2Et.mjs.map +1 -0
- package/.output/server/chunks/build/ScrollArea-BQK3em8b.mjs +379 -0
- package/.output/server/chunks/build/ScrollArea-BQK3em8b.mjs.map +1 -0
- package/.output/server/chunks/build/Slider-D-n8Y0CX.mjs +1087 -0
- package/.output/server/chunks/build/Slider-D-n8Y0CX.mjs.map +1 -0
- package/.output/server/chunks/build/Tooltip-CkpSktvJ.mjs +1345 -0
- package/.output/server/chunks/build/Tooltip-CkpSktvJ.mjs.map +1 -0
- package/.output/server/chunks/build/_virtual_public-CeOptKUP.mjs +7 -0
- package/.output/server/chunks/build/_virtual_public-CeOptKUP.mjs.map +1 -0
- package/.output/server/chunks/build/advanced-D1onodoF.mjs +1430 -0
- package/.output/server/chunks/build/advanced-D1onodoF.mjs.map +1 -0
- package/.output/server/chunks/build/compare-DmSAW8oA.mjs +1093 -0
- package/.output/server/chunks/build/compare-DmSAW8oA.mjs.map +1 -0
- package/.output/server/chunks/build/dashboard-BJxrZ19n.mjs +3217 -0
- package/.output/server/chunks/build/dashboard-BJxrZ19n.mjs.map +1 -0
- package/.output/server/chunks/build/details-CBMqXYyo.mjs +3714 -0
- package/.output/server/chunks/build/details-CBMqXYyo.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-D9aQjJRn.mjs +86 -0
- package/.output/server/chunks/build/error-404-D9aQjJRn.mjs.map +1 -0
- package/.output/server/chunks/build/error-404-styles.DciiguV6.mjs +9 -0
- package/.output/server/chunks/build/error-404-styles.DciiguV6.mjs.map +1 -0
- package/.output/server/chunks/build/error-500-BNyA3wrb.mjs +74 -0
- package/.output/server/chunks/build/error-500-BNyA3wrb.mjs.map +1 -0
- package/.output/server/chunks/build/error-500-styles.C562DYMR.mjs +9 -0
- package/.output/server/chunks/build/error-500-styles.C562DYMR.mjs.map +1 -0
- package/.output/server/chunks/build/esm-Dp2lJXbp.mjs +1121 -0
- package/.output/server/chunks/build/esm-Dp2lJXbp.mjs.map +1 -0
- package/.output/server/chunks/build/interval-BxUMpo78.mjs +411 -0
- package/.output/server/chunks/build/interval-BxUMpo78.mjs.map +1 -0
- package/.output/server/chunks/build/login-lbtjN0MV.mjs +642 -0
- package/.output/server/chunks/build/login-lbtjN0MV.mjs.map +1 -0
- package/.output/server/chunks/build/pages-Ba0Eixbd.mjs +220 -0
- package/.output/server/chunks/build/pages-Ba0Eixbd.mjs.map +1 -0
- package/.output/server/chunks/build/services-DuJwjAB8.mjs +3005 -0
- package/.output/server/chunks/build/services-DuJwjAB8.mjs.map +1 -0
- package/.output/server/chunks/build/services-styles.eoO16BY9.mjs +9 -0
- package/.output/server/chunks/build/services-styles.eoO16BY9.mjs.map +1 -0
- package/.output/server/chunks/build/tasks-CyN9x492.mjs +915 -0
- package/.output/server/chunks/build/tasks-CyN9x492.mjs.map +1 -0
- package/.output/server/chunks/build/tasks-D_Q5EDnn.mjs +87 -0
- package/.output/server/chunks/build/tasks-D_Q5EDnn.mjs.map +1 -0
- package/.output/server/chunks/nitro/nitro.mjs +6215 -0
- package/.output/server/chunks/nitro/nitro.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/captcha.post.mjs +21 -0
- package/.output/server/chunks/routes/api/auth/captcha.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/login.post.mjs +27 -0
- package/.output/server/chunks/routes/api/auth/login.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs +22 -0
- package/.output/server/chunks/routes/api/auth/logout.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/map-token.post.mjs +22 -0
- package/.output/server/chunks/routes/api/auth/map-token.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/send-sms.post.mjs +31 -0
- package/.output/server/chunks/routes/api/auth/send-sms.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/auth/status.get.mjs +21 -0
- package/.output/server/chunks/routes/api/auth/status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map/base/_baseLayer/_zoom/_tileX/_tileY_.get.mjs +44 -0
- package/.output/server/chunks/routes/api/map/base/_baseLayer/_zoom/_tileX/_tileY_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map/live/status.get.mjs +32 -0
- package/.output/server/chunks/routes/api/map/live/status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map/online/_layerGroup/_zoom/_tileX/_tileY_.get.mjs +48 -0
- package/.output/server/chunks/routes/api/map/online/_layerGroup/_zoom/_tileX/_tileY_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map/online-root/_layerGroup/_rootX/_rootY_.get.mjs +46 -0
- package/.output/server/chunks/routes/api/map/online-root/_layerGroup/_rootX/_rootY_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map-service/config.post.mjs +38 -0
- package/.output/server/chunks/routes/api/map-service/config.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map-service/file.post.mjs +41 -0
- package/.output/server/chunks/routes/api/map-service/file.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map-service/source.post.mjs +35 -0
- package/.output/server/chunks/routes/api/map-service/source.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/map-service/status.get.mjs +32 -0
- package/.output/server/chunks/routes/api/map-service/status.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/analysis.get.mjs +47 -0
- package/.output/server/chunks/routes/api/workspace/_filename/analysis.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/download.get.mjs +38 -0
- package/.output/server/chunks/routes/api/workspace/_filename/download.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/export/_format_.get.mjs +42 -0
- package/.output/server/chunks/routes/api/workspace/_filename/export/_format_.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/tile.get.mjs +48 -0
- package/.output/server/chunks/routes/api/workspace/_filename/tile.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename/tiles.get.mjs +45 -0
- package/.output/server/chunks/routes/api/workspace/_filename/tiles.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/_filename_.delete.mjs +32 -0
- package/.output/server/chunks/routes/api/workspace/_filename_.delete.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/compare/batch.get.mjs +38 -0
- package/.output/server/chunks/routes/api/workspace/compare/batch.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/compare.post.mjs +33 -0
- package/.output/server/chunks/routes/api/workspace/compare.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/fetch.post.mjs +33 -0
- package/.output/server/chunks/routes/api/workspace/fetch.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/files.get.mjs +27 -0
- package/.output/server/chunks/routes/api/workspace/files.get.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/files.post.mjs +38 -0
- package/.output/server/chunks/routes/api/workspace/files.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/stop.post.mjs +32 -0
- package/.output/server/chunks/routes/api/workspace/stop.post.mjs.map +1 -0
- package/.output/server/chunks/routes/api/workspace/tasks.post.mjs +36 -0
- package/.output/server/chunks/routes/api/workspace/tasks.post.mjs.map +1 -0
- package/.output/server/chunks/routes/renderer.mjs +422 -0
- package/.output/server/chunks/routes/renderer.mjs.map +1 -0
- package/.output/server/chunks/routes/services/wms.get.mjs +54 -0
- package/.output/server/chunks/routes/services/wms.get.mjs.map +1 -0
- package/.output/server/chunks/routes/services/wmts.get.mjs +54 -0
- package/.output/server/chunks/routes/services/wmts.get.mjs.map +1 -0
- package/.output/server/chunks/virtual/_virtual_spa-template.mjs +4 -0
- package/.output/server/chunks/virtual/_virtual_spa-template.mjs.map +1 -0
- package/.output/server/chunks/virtual/entry.mjs +18545 -0
- package/.output/server/chunks/virtual/entry.mjs.map +1 -0
- package/.output/server/chunks/virtual/precomputed.mjs +4 -0
- package/.output/server/chunks/virtual/precomputed.mjs.map +1 -0
- package/.output/server/chunks/virtual/styles.mjs +10 -0
- package/.output/server/chunks/virtual/styles.mjs.map +1 -0
- package/.output/server/index.mjs +12 -0
- package/.output/server/index.mjs.map +1 -0
- package/.output/server/node_modules/@babel/parser/lib/index.js +14611 -0
- package/.output/server/node_modules/@babel/parser/package.json +50 -0
- package/.output/server/node_modules/@iconify/utils/lib/colors/index.js +295 -0
- package/.output/server/node_modules/@iconify/utils/lib/colors/keywords.js +701 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/common.js +75 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/format.js +39 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/icon.js +47 -0
- package/.output/server/node_modules/@iconify/utils/lib/css/icons.js +128 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/bool.js +19 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/defaults.js +13 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/flip.js +17 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/merge.js +16 -0
- package/.output/server/node_modules/@iconify/utils/lib/customisations/rotate.js +30 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/cleanup.js +78 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/convert.js +100 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/data.js +28 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/format.js +58 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/parse.js +48 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/base.js +203 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/create.js +33 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/numbers.js +132 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/similar.js +165 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/regex/tree.js +79 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/replace/find.js +92 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/replace/replace.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/components.js +76 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/missing.js +66 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/name.js +45 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/parse.js +103 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/similar.js +36 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/tree.js +92 -0
- package/.output/server/node_modules/@iconify/utils/lib/emoji/test/variations.js +62 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/defaults.js +25 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/merge.js +16 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/name.js +57 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/square.js +33 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon/transformations.js +12 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/convert-info.js +125 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/expand.js +19 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icon.js +25 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/get-icons.js +36 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/minify.js +91 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/parse.js +46 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/tree.js +23 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/validate-basic.js +42 -0
- package/.output/server/node_modules/@iconify/utils/lib/icon-set/validate.js +123 -0
- package/.output/server/node_modules/@iconify/utils/lib/index.js +52 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/custom.js +30 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/loader.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/modern.js +27 -0
- package/.output/server/node_modules/@iconify/utils/lib/loader/utils.js +105 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/objects.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/strings.js +26 -0
- package/.output/server/node_modules/@iconify/utils/lib/misc/title.js +9 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/build.js +113 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/defs.js +31 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/encode-svg-for-css.js +13 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/html.js +9 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/id.js +41 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/inner-html.js +22 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/parse.js +67 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/pretty.js +54 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/size.js +27 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/trim.js +7 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/url.js +22 -0
- package/.output/server/node_modules/@iconify/utils/lib/svg/viewbox.js +8 -0
- package/.output/server/node_modules/@iconify/utils/package.json +119 -0
- package/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6801 -0
- package/.output/server/node_modules/@vue/compiler-core/package.json +58 -0
- package/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +692 -0
- package/.output/server/node_modules/@vue/compiler-dom/package.json +57 -0
- package/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1420 -0
- package/.output/server/node_modules/@vue/compiler-ssr/package.json +34 -0
- package/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1903 -0
- package/.output/server/node_modules/@vue/reactivity/package.json +55 -0
- package/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +6976 -0
- package/.output/server/node_modules/@vue/runtime-core/package.json +52 -0
- package/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1841 -0
- package/.output/server/node_modules/@vue/runtime-dom/package.json +60 -0
- package/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +904 -0
- package/.output/server/node_modules/@vue/server-renderer/package.json +53 -0
- package/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +609 -0
- package/.output/server/node_modules/@vue/shared/package.json +47 -0
- package/.output/server/node_modules/consola/dist/chunks/prompt.mjs +280 -0
- package/.output/server/node_modules/consola/dist/core.mjs +512 -0
- package/.output/server/node_modules/consola/dist/index.mjs +651 -0
- package/.output/server/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs +72 -0
- package/.output/server/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs +288 -0
- package/.output/server/node_modules/consola/package.json +136 -0
- package/.output/server/node_modules/devalue/index.js +17 -0
- package/.output/server/node_modules/devalue/package.json +39 -0
- package/.output/server/node_modules/devalue/src/base64.js +60 -0
- package/.output/server/node_modules/devalue/src/constants.js +12 -0
- package/.output/server/node_modules/devalue/src/operations.js +193 -0
- package/.output/server/node_modules/devalue/src/parse.js +270 -0
- package/.output/server/node_modules/devalue/src/stringify.js +428 -0
- package/.output/server/node_modules/devalue/src/uneval.js +582 -0
- package/.output/server/node_modules/devalue/src/utils.js +185 -0
- package/.output/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
- package/.output/server/node_modules/entities/dist/commonjs/decode.js +568 -0
- package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
- package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
- package/.output/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
- package/.output/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
- package/.output/server/node_modules/entities/dist/commonjs/package.json +3 -0
- package/.output/server/node_modules/entities/package.json +120 -0
- package/.output/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
- package/.output/server/node_modules/estree-walker/package.json +37 -0
- package/.output/server/node_modules/fflate/esm/index.mjs +2710 -0
- package/.output/server/node_modules/fflate/package.json +128 -0
- package/.output/server/node_modules/fnv1a-64/dist/index.mjs +95 -0
- package/.output/server/node_modules/fnv1a-64/package.json +75 -0
- package/.output/server/node_modules/hookable/dist/index.mjs +257 -0
- package/.output/server/node_modules/hookable/package.json +53 -0
- package/.output/server/node_modules/nostics/dist/formatters/ansi.mjs +19 -0
- package/.output/server/node_modules/nostics/dist/index.mjs +187 -0
- package/.output/server/node_modules/nostics/package.json +125 -0
- package/.output/server/node_modules/object-identity/index.js +60 -0
- package/.output/server/node_modules/object-identity/package.json +40 -0
- package/.output/server/node_modules/p-limit/index.js +104 -0
- package/.output/server/node_modules/p-limit/package.json +58 -0
- package/.output/server/node_modules/pmtiles/dist/esm/index.js +2 -0
- package/.output/server/node_modules/pmtiles/package.json +50 -0
- package/.output/server/node_modules/source-map-js/lib/array-set.js +121 -0
- package/.output/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
- package/.output/server/node_modules/source-map-js/lib/base64.js +67 -0
- package/.output/server/node_modules/source-map-js/lib/binary-search.js +111 -0
- package/.output/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
- package/.output/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
- package/.output/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
- package/.output/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
- package/.output/server/node_modules/source-map-js/lib/source-node.js +413 -0
- package/.output/server/node_modules/source-map-js/lib/util.js +594 -0
- package/.output/server/node_modules/source-map-js/package.json +71 -0
- package/.output/server/node_modules/source-map-js/source-map.js +8 -0
- package/.output/server/node_modules/tailwindcss/dist/chunk-DCG7AFIE.mjs +1 -0
- package/.output/server/node_modules/tailwindcss/dist/colors.mjs +1 -0
- package/.output/server/node_modules/tailwindcss/package.json +89 -0
- package/.output/server/node_modules/ufo/dist/index.mjs +645 -0
- package/.output/server/node_modules/ufo/package.json +48 -0
- package/.output/server/node_modules/unhead/dist/client.mjs +22 -0
- package/.output/server/node_modules/unhead/dist/index.mjs +52 -0
- package/.output/server/node_modules/unhead/dist/legacy.mjs +33 -0
- package/.output/server/node_modules/unhead/dist/minify.mjs +183 -0
- package/.output/server/node_modules/unhead/dist/parser.mjs +518 -0
- package/.output/server/node_modules/unhead/dist/plugins.mjs +631 -0
- package/.output/server/node_modules/unhead/dist/scripts.node.mjs +6 -0
- package/.output/server/node_modules/unhead/dist/server.mjs +99 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BEmVMkeA.mjs +673 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BGFxPGPQ.mjs +47 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BQWSw36o.mjs +192 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bb4d5b9h.mjs +67 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BdK3SLPN.mjs +585 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bf_fPVYA.mjs +6 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bm4Y6XQI.mjs +17 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.C3b2Ipoj.mjs +223 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CGPOfp5O.mjs +32 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CHEy9ana.mjs +7 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CTjuIdzk.mjs +27 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CfKy3Kuq.mjs +196 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.D7HkBzZn.mjs +59 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.DNKiVLV7.mjs +400 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.MC5RsXLj.mjs +19 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.jEy9BmRq.mjs +264 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.tQnRaXfX.mjs +240 -0
- package/.output/server/node_modules/unhead/dist/stream/client.mjs +28 -0
- package/.output/server/node_modules/unhead/dist/stream/iife.mjs +2 -0
- package/.output/server/node_modules/unhead/dist/stream/server.mjs +264 -0
- package/.output/server/node_modules/unhead/dist/utils.mjs +7 -0
- package/.output/server/node_modules/unhead/package.json +179 -0
- package/.output/server/node_modules/vue/dist/vue.cjs.js +80 -0
- package/.output/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
- package/.output/server/node_modules/vue/index.js +7 -0
- package/.output/server/node_modules/vue/index.mjs +1 -0
- package/.output/server/node_modules/vue/package.json +112 -0
- package/.output/server/node_modules/vue/server-renderer/index.mjs +1 -0
- package/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +278 -0
- package/.output/server/node_modules/vue-bundle-renderer/package.json +54 -0
- package/.output/server/node_modules/yocto-queue/index.js +90 -0
- package/.output/server/node_modules/yocto-queue/package.json +48 -0
- package/.output/server/node_modules/zod/index.js +4 -0
- package/.output/server/node_modules/zod/package.json +135 -0
- package/.output/server/node_modules/zod/v4/classic/checks.js +1 -0
- package/.output/server/node_modules/zod/v4/classic/coerce.js +17 -0
- package/.output/server/node_modules/zod/v4/classic/compat.js +31 -0
- package/.output/server/node_modules/zod/v4/classic/errors.js +48 -0
- package/.output/server/node_modules/zod/v4/classic/external.js +20 -0
- package/.output/server/node_modules/zod/v4/classic/from-json-schema.js +599 -0
- package/.output/server/node_modules/zod/v4/classic/iso.js +30 -0
- package/.output/server/node_modules/zod/v4/classic/package.json +7 -0
- package/.output/server/node_modules/zod/v4/classic/parse.js +15 -0
- package/.output/server/node_modules/zod/v4/classic/schemas.js +1395 -0
- package/.output/server/node_modules/zod/v4/core/api.js +1087 -0
- package/.output/server/node_modules/zod/v4/core/checks.js +575 -0
- package/.output/server/node_modules/zod/v4/core/core.js +78 -0
- package/.output/server/node_modules/zod/v4/core/doc.js +35 -0
- package/.output/server/node_modules/zod/v4/core/errors.js +185 -0
- package/.output/server/node_modules/zod/v4/core/index.js +16 -0
- package/.output/server/node_modules/zod/v4/core/json-schema-generator.js +95 -0
- package/.output/server/node_modules/zod/v4/core/json-schema-processors.js +601 -0
- package/.output/server/node_modules/zod/v4/core/json-schema.js +1 -0
- package/.output/server/node_modules/zod/v4/core/package.json +7 -0
- package/.output/server/node_modules/zod/v4/core/parse.js +93 -0
- package/.output/server/node_modules/zod/v4/core/regexes.js +139 -0
- package/.output/server/node_modules/zod/v4/core/registries.js +51 -0
- package/.output/server/node_modules/zod/v4/core/schemas.js +2239 -0
- package/.output/server/node_modules/zod/v4/core/to-json-schema.js +448 -0
- package/.output/server/node_modules/zod/v4/core/util.js +674 -0
- package/.output/server/node_modules/zod/v4/core/versions.js +5 -0
- package/.output/server/node_modules/zod/v4/locales/ar.js +106 -0
- package/.output/server/node_modules/zod/v4/locales/az.js +105 -0
- package/.output/server/node_modules/zod/v4/locales/be.js +156 -0
- package/.output/server/node_modules/zod/v4/locales/bg.js +120 -0
- package/.output/server/node_modules/zod/v4/locales/ca.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/cs.js +111 -0
- package/.output/server/node_modules/zod/v4/locales/da.js +115 -0
- package/.output/server/node_modules/zod/v4/locales/de.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/el.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/en.js +113 -0
- package/.output/server/node_modules/zod/v4/locales/eo.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/es.js +132 -0
- package/.output/server/node_modules/zod/v4/locales/fa.js +114 -0
- package/.output/server/node_modules/zod/v4/locales/fi.js +112 -0
- package/.output/server/node_modules/zod/v4/locales/fr-CA.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/fr.js +125 -0
- package/.output/server/node_modules/zod/v4/locales/he.js +214 -0
- package/.output/server/node_modules/zod/v4/locales/hr.js +122 -0
- package/.output/server/node_modules/zod/v4/locales/hu.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/hy.js +147 -0
- package/.output/server/node_modules/zod/v4/locales/id.js +106 -0
- package/.output/server/node_modules/zod/v4/locales/index.js +52 -0
- package/.output/server/node_modules/zod/v4/locales/is.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/it.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/ja.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/ka.js +112 -0
- package/.output/server/node_modules/zod/v4/locales/kh.js +5 -0
- package/.output/server/node_modules/zod/v4/locales/km.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/ko.js +111 -0
- package/.output/server/node_modules/zod/v4/locales/lt.js +203 -0
- package/.output/server/node_modules/zod/v4/locales/mk.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/ms.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/nl.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/no.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/ota.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/package.json +7 -0
- package/.output/server/node_modules/zod/v4/locales/pl.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/ps.js +114 -0
- package/.output/server/node_modules/zod/v4/locales/pt.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/ro.js +119 -0
- package/.output/server/node_modules/zod/v4/locales/ru.js +156 -0
- package/.output/server/node_modules/zod/v4/locales/sl.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/sv.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/ta.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/th.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/tr.js +105 -0
- package/.output/server/node_modules/zod/v4/locales/ua.js +5 -0
- package/.output/server/node_modules/zod/v4/locales/uk.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/ur.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/uz.js +110 -0
- package/.output/server/node_modules/zod/v4/locales/vi.js +108 -0
- package/.output/server/node_modules/zod/v4/locales/yo.js +107 -0
- package/.output/server/node_modules/zod/v4/locales/zh-CN.js +109 -0
- package/.output/server/node_modules/zod/v4/locales/zh-TW.js +107 -0
- package/.output/server/package.json +37 -0
- package/LICENSE +3 -0
- package/README.md +125 -0
- package/dist/src/bbox.js +55 -0
- package/dist/src/cli.js +255 -0
- package/dist/src/config.js +56 -0
- package/dist/src/core/fetch-process.js +19 -0
- package/dist/src/core/grid-renderer.js +149 -0
- package/dist/src/core/lease.js +103 -0
- package/dist/src/core/paths.js +13 -0
- package/dist/src/core/png.js +192 -0
- package/dist/src/core/raster-style.js +33 -0
- package/dist/src/core/uomtiles.js +307 -0
- package/dist/src/fetcher.js +208 -0
- package/dist/src/geographic-grid.js +162 -0
- package/dist/src/grid-crawl.js +478 -0
- package/dist/src/mask-image.js +16 -0
- package/dist/src/official-grid.js +51 -0
- package/dist/src/quality.js +30 -0
- package/dist/src/token.js +206 -0
- package/package.json +68 -0
- package/public/apple-touch-icon.png +0 -0
- package/public/favicon.ico +0 -0
- package/public/favicon.svg +8 -0
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/site.webmanifest +11 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { deflateSync, inflateSync } from 'node:zlib';
|
|
2
|
+
const SIGNATURE = Buffer.from('89504e470d0a1a0a', 'hex');
|
|
3
|
+
const CRC_TABLE = new Uint32Array(256);
|
|
4
|
+
for (let n = 0; n < 256; n++) {
|
|
5
|
+
let value = n;
|
|
6
|
+
for (let k = 0; k < 8; k++)
|
|
7
|
+
value = value & 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;
|
|
8
|
+
CRC_TABLE[n] = value >>> 0;
|
|
9
|
+
}
|
|
10
|
+
function crc32(data) {
|
|
11
|
+
let crc = 0xffffffff;
|
|
12
|
+
for (const byte of data)
|
|
13
|
+
crc = CRC_TABLE[(crc ^ byte) & 0xff] ^ (crc >>> 8);
|
|
14
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
15
|
+
}
|
|
16
|
+
function chunk(type, data) {
|
|
17
|
+
const typeBytes = Buffer.from(type, 'ascii');
|
|
18
|
+
const body = Buffer.from(data);
|
|
19
|
+
const output = Buffer.allocUnsafe(body.length + 12);
|
|
20
|
+
output.writeUInt32BE(body.length, 0);
|
|
21
|
+
typeBytes.copy(output, 4);
|
|
22
|
+
body.copy(output, 8);
|
|
23
|
+
output.writeUInt32BE(crc32(Buffer.concat([typeBytes, body])), body.length + 8);
|
|
24
|
+
return output;
|
|
25
|
+
}
|
|
26
|
+
function decodeIndexedPng(png, allowLegacyCanonicalPhys) {
|
|
27
|
+
const input = Buffer.from(png);
|
|
28
|
+
if (!input.subarray(0, 8).equals(SIGNATURE))
|
|
29
|
+
throw new Error('UOM WMS did not return a PNG signature');
|
|
30
|
+
let offset = 8;
|
|
31
|
+
let width = 0, height = 0, bitDepth = 0, colorType = -1, interlace = -1;
|
|
32
|
+
let alpha = new Uint8Array(0);
|
|
33
|
+
let paletteEntries = 0;
|
|
34
|
+
const idat = [];
|
|
35
|
+
const chunkTypes = [];
|
|
36
|
+
while (offset + 12 <= input.length) {
|
|
37
|
+
const length = input.readUInt32BE(offset);
|
|
38
|
+
if (offset + length + 12 > input.length)
|
|
39
|
+
throw new Error('truncated UOM PNG chunk');
|
|
40
|
+
const type = input.toString('ascii', offset + 4, offset + 8);
|
|
41
|
+
chunkTypes.push(type);
|
|
42
|
+
const data = input.subarray(offset + 8, offset + 8 + length);
|
|
43
|
+
const expected = input.readUInt32BE(offset + 8 + length);
|
|
44
|
+
if (crc32(input.subarray(offset + 4, offset + 8 + length)) !== expected)
|
|
45
|
+
throw new Error(`invalid PNG ${type} CRC`);
|
|
46
|
+
if (type === 'IHDR') {
|
|
47
|
+
width = data.readUInt32BE(0);
|
|
48
|
+
height = data.readUInt32BE(4);
|
|
49
|
+
bitDepth = data[8];
|
|
50
|
+
colorType = data[9];
|
|
51
|
+
interlace = data[12];
|
|
52
|
+
if (data[10] !== 0 || data[11] !== 0)
|
|
53
|
+
throw new Error('unsupported UOM PNG compression or filter method');
|
|
54
|
+
}
|
|
55
|
+
else if (type === 'PLTE') {
|
|
56
|
+
if (data.length === 0 || data.length % 3 !== 0 || data.length > 768)
|
|
57
|
+
throw new Error('invalid UOM PNG palette');
|
|
58
|
+
paletteEntries = data.length / 3;
|
|
59
|
+
}
|
|
60
|
+
else if (type === 'tRNS')
|
|
61
|
+
alpha = Uint8Array.from(data);
|
|
62
|
+
else if (type === 'IDAT')
|
|
63
|
+
idat.push(data);
|
|
64
|
+
else if (type === 'IEND') {
|
|
65
|
+
offset += length + 12;
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
offset += length + 12;
|
|
69
|
+
}
|
|
70
|
+
const hasIdatTail = (start) => chunkTypes.length > start + 1 &&
|
|
71
|
+
chunkTypes.at(-1) === 'IEND' && chunkTypes.slice(start, -1).every(type => type === 'IDAT');
|
|
72
|
+
const exactUom = chunkTypes[0] === 'IHDR' && chunkTypes[1] === 'PLTE' && chunkTypes[2] === 'tRNS' && hasIdatTail(3);
|
|
73
|
+
let canonicalDataStart = 2;
|
|
74
|
+
if (chunkTypes[canonicalDataStart] === 'tRNS')
|
|
75
|
+
canonicalDataStart++;
|
|
76
|
+
if (chunkTypes[canonicalDataStart] === 'pHYs')
|
|
77
|
+
canonicalDataStart++;
|
|
78
|
+
const legacyCanonical = allowLegacyCanonicalPhys && chunkTypes[0] === 'IHDR' && chunkTypes[1] === 'PLTE' && hasIdatTail(canonicalDataStart);
|
|
79
|
+
if ((!exactUom && !legacyCanonical) || offset !== input.length) {
|
|
80
|
+
throw new Error(`unexpected UOM PNG chunks: ${chunkTypes.join(',')}`);
|
|
81
|
+
}
|
|
82
|
+
if (width <= 0 || height <= 0 || colorType !== 3 || ![1, 2, 4, 8].includes(bitDepth) || interlace !== 0) {
|
|
83
|
+
throw new Error(`unexpected UOM PNG IHDR ${width}x${height} depth=${bitDepth} type=${colorType} interlace=${interlace}`);
|
|
84
|
+
}
|
|
85
|
+
if (paletteEntries === 0 || alpha.length > paletteEntries)
|
|
86
|
+
throw new Error('invalid UOM PNG palette transparency');
|
|
87
|
+
let hasVisiblePaletteEntry = false;
|
|
88
|
+
for (let index = 0; index < paletteEntries; index++) {
|
|
89
|
+
if ((alpha[index] ?? 255) >= 102) {
|
|
90
|
+
hasVisiblePaletteEntry = true;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (!hasVisiblePaletteEntry) {
|
|
95
|
+
return { width, height, bitDepth: bitDepth, paletteEntries, indexes: new Uint8Array(width * height), alpha };
|
|
96
|
+
}
|
|
97
|
+
const rowBytes = Math.ceil(width * bitDepth / 8);
|
|
98
|
+
const compressed = Buffer.concat(idat);
|
|
99
|
+
const expectedInflatedSize = (rowBytes + 1) * height;
|
|
100
|
+
const filtered = inflateSync(compressed, { maxOutputLength: expectedInflatedSize });
|
|
101
|
+
if (filtered.length !== expectedInflatedSize)
|
|
102
|
+
throw new Error('unexpected UOM PNG inflated size');
|
|
103
|
+
const rows = Buffer.allocUnsafe(rowBytes * height);
|
|
104
|
+
for (let y = 0; y < height; y++) {
|
|
105
|
+
const filter = filtered[y * (rowBytes + 1)];
|
|
106
|
+
const source = y * (rowBytes + 1) + 1;
|
|
107
|
+
const target = y * rowBytes;
|
|
108
|
+
for (let x = 0; x < rowBytes; x++) {
|
|
109
|
+
const raw = filtered[source + x];
|
|
110
|
+
const left = x > 0 ? rows[target + x - 1] : 0;
|
|
111
|
+
const up = y > 0 ? rows[target - rowBytes + x] : 0;
|
|
112
|
+
const upLeft = x > 0 && y > 0 ? rows[target - rowBytes + x - 1] : 0;
|
|
113
|
+
if (filter === 0)
|
|
114
|
+
rows[target + x] = raw;
|
|
115
|
+
else if (filter === 1)
|
|
116
|
+
rows[target + x] = (raw + left) & 0xff;
|
|
117
|
+
else if (filter === 2)
|
|
118
|
+
rows[target + x] = (raw + up) & 0xff;
|
|
119
|
+
else if (filter === 3)
|
|
120
|
+
rows[target + x] = (raw + Math.floor((left + up) / 2)) & 0xff;
|
|
121
|
+
else if (filter === 4) {
|
|
122
|
+
const p = left + up - upLeft;
|
|
123
|
+
const pa = Math.abs(p - left), pb = Math.abs(p - up), pc = Math.abs(p - upLeft);
|
|
124
|
+
rows[target + x] = (raw + (pa <= pb && pa <= pc ? left : pb <= pc ? up : upLeft)) & 0xff;
|
|
125
|
+
}
|
|
126
|
+
else
|
|
127
|
+
throw new Error(`unexpected UOM PNG row filter ${filter}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const indexes = new Uint8Array(width * height);
|
|
131
|
+
for (let y = 0; y < height; y++)
|
|
132
|
+
for (let x = 0; x < width; x++) {
|
|
133
|
+
const pixelsPerByte = 8 / bitDepth;
|
|
134
|
+
const packed = rows[y * rowBytes + Math.floor(x / pixelsPerByte)];
|
|
135
|
+
const shift = 8 - bitDepth * (x % pixelsPerByte + 1);
|
|
136
|
+
indexes[y * width + x] = (packed >> shift) & ((1 << bitDepth) - 1);
|
|
137
|
+
if (indexes[y * width + x] >= paletteEntries)
|
|
138
|
+
throw new Error('UOM PNG pixel index exceeds palette');
|
|
139
|
+
}
|
|
140
|
+
return { width, height, bitDepth: bitDepth, paletteEntries, indexes, alpha };
|
|
141
|
+
}
|
|
142
|
+
export function decodeUomIndexedPng(png) {
|
|
143
|
+
return decodeIndexedPng(png, false);
|
|
144
|
+
}
|
|
145
|
+
function alphaMask(image, expectedWidth, expectedHeight = expectedWidth) {
|
|
146
|
+
if (expectedWidth !== undefined && (image.width !== expectedWidth || image.height !== expectedHeight)) {
|
|
147
|
+
throw new Error(`UOM WMS returned ${image.width}x${image.height}, expected ${expectedWidth}x${expectedHeight}`);
|
|
148
|
+
}
|
|
149
|
+
const mask = new Uint8Array(image.indexes.length);
|
|
150
|
+
let hasVisiblePaletteEntry = false;
|
|
151
|
+
for (let index = 0; index < image.paletteEntries; index++) {
|
|
152
|
+
if ((image.alpha[index] ?? 255) >= 102) {
|
|
153
|
+
hasVisiblePaletteEntry = true;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (!hasVisiblePaletteEntry)
|
|
158
|
+
return mask;
|
|
159
|
+
for (let i = 0; i < mask.length; i++)
|
|
160
|
+
if ((image.alpha[image.indexes[i]] ?? 255) >= 102)
|
|
161
|
+
mask[i] = 1;
|
|
162
|
+
return mask;
|
|
163
|
+
}
|
|
164
|
+
export function decodeUomAlphaMask(png, expectedWidth, expectedHeight = expectedWidth) {
|
|
165
|
+
return alphaMask(decodeIndexedPng(png, false), expectedWidth, expectedHeight);
|
|
166
|
+
}
|
|
167
|
+
export function decodeCanonicalAlphaMask(png, expectedWidth, expectedHeight = expectedWidth) {
|
|
168
|
+
return alphaMask(decodeIndexedPng(png, true), expectedWidth, expectedHeight);
|
|
169
|
+
}
|
|
170
|
+
export function encodeIndexedPng(width, height, indexes, palette, alpha) {
|
|
171
|
+
if (indexes.length !== width * height)
|
|
172
|
+
throw new RangeError('indexed PNG dimensions do not match pixels');
|
|
173
|
+
if (palette.length === 0 || palette.length % 3 !== 0 || palette.length / 3 > 256)
|
|
174
|
+
throw new RangeError('invalid indexed PNG palette');
|
|
175
|
+
const raw = Buffer.allocUnsafe((width + 1) * height);
|
|
176
|
+
for (let y = 0; y < height; y++) {
|
|
177
|
+
raw[y * (width + 1)] = 0;
|
|
178
|
+
raw.set(indexes.subarray(y * width, (y + 1) * width), y * (width + 1) + 1);
|
|
179
|
+
}
|
|
180
|
+
const ihdr = Buffer.alloc(13);
|
|
181
|
+
ihdr.writeUInt32BE(width, 0);
|
|
182
|
+
ihdr.writeUInt32BE(height, 4);
|
|
183
|
+
ihdr[8] = 8;
|
|
184
|
+
ihdr[9] = 3;
|
|
185
|
+
ihdr[10] = 0;
|
|
186
|
+
ihdr[11] = 0;
|
|
187
|
+
ihdr[12] = 0;
|
|
188
|
+
return Buffer.concat([SIGNATURE, chunk('IHDR', ihdr), chunk('PLTE', palette), chunk('tRNS', alpha), chunk('IDAT', deflateSync(raw, { level: 9 })), chunk('IEND', Buffer.alloc(0))]);
|
|
189
|
+
}
|
|
190
|
+
export function encodeCanonicalMask(mask, width = 256, height = 256) {
|
|
191
|
+
return encodeIndexedPng(width, height, mask, Uint8Array.of(0, 0, 0, 0x29, 0x80, 0xb9), Uint8Array.of(0, 255));
|
|
192
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { encodeIndexedPng } from "./png.js";
|
|
2
|
+
export const WEB_MERCATOR_HALF_WORLD = 20037508.342789244;
|
|
3
|
+
export const WEB_MERCATOR_WORLD = WEB_MERCATOR_HALF_WORLD * 2;
|
|
4
|
+
export function parseHexColor(color) {
|
|
5
|
+
if (!/^#[0-9a-f]{6}$/i.test(color))
|
|
6
|
+
throw new RangeError('color must use #RRGGBB');
|
|
7
|
+
return [Number.parseInt(color.slice(1, 3), 16), Number.parseInt(color.slice(3, 5), 16), Number.parseInt(color.slice(5, 7), 16)];
|
|
8
|
+
}
|
|
9
|
+
export function encodeStyledMask(mask, width, height, color, opacity) {
|
|
10
|
+
if (mask.length !== width * height)
|
|
11
|
+
throw new RangeError('mask dimensions do not match output');
|
|
12
|
+
if (!Number.isInteger(opacity) || opacity < 0 || opacity > 100)
|
|
13
|
+
throw new RangeError('opacity must be an integer from 0 to 100');
|
|
14
|
+
const [red, green, blue] = parseHexColor(color);
|
|
15
|
+
return encodeIndexedPng(width, height, mask, Uint8Array.of(0, 0, 0, red, green, blue), Uint8Array.of(0, Math.round(opacity * 2.55)));
|
|
16
|
+
}
|
|
17
|
+
export function zoomForMercatorImage(bbox, width, height, maxZoom = 18) {
|
|
18
|
+
const resolution = Math.max((bbox.maxx - bbox.minx) / width, (bbox.maxy - bbox.miny) / height);
|
|
19
|
+
return Math.max(0, Math.min(maxZoom, Math.round(Math.log2(WEB_MERCATOR_WORLD / (256 * resolution)))));
|
|
20
|
+
}
|
|
21
|
+
export function mercatorPixel(bbox, width, height, column, row, zoom) {
|
|
22
|
+
const mercatorX = bbox.minx + (column + 0.5) / width * (bbox.maxx - bbox.minx);
|
|
23
|
+
const mercatorY = bbox.maxy - (row + 0.5) / height * (bbox.maxy - bbox.miny);
|
|
24
|
+
const worldPixels = 256 * 2 ** zoom;
|
|
25
|
+
const globalX = Math.floor((mercatorX + WEB_MERCATOR_HALF_WORLD) / WEB_MERCATOR_WORLD * worldPixels);
|
|
26
|
+
const globalY = Math.floor((WEB_MERCATOR_HALF_WORLD - mercatorY) / WEB_MERCATOR_WORLD * worldPixels);
|
|
27
|
+
return {
|
|
28
|
+
tileX: Math.floor(globalX / 256),
|
|
29
|
+
tileY: Math.floor(globalY / 256),
|
|
30
|
+
pixelX: ((globalX % 256) + 256) % 256,
|
|
31
|
+
pixelY: ((globalY % 256) + 256) % 256,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { copyFileSync, existsSync, mkdirSync, renameSync, statSync, unlinkSync } from 'node:fs';
|
|
3
|
+
import { dirname, extname, resolve } from 'node:path';
|
|
4
|
+
import { execFile } from 'node:child_process';
|
|
5
|
+
import { promisify } from 'node:util';
|
|
6
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
7
|
+
import { acquireSqliteLease } from "./lease.js";
|
|
8
|
+
import { decodeCanonicalAlphaMask } from "./png.js";
|
|
9
|
+
import { GeographicGridRenderer, PUBLISH_MAX_ZOOM } from "./grid-renderer.js";
|
|
10
|
+
import { xyzYToTmsY } from "../bbox.js";
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
const UOMTILES_SCHEMA_VERSION = 1;
|
|
13
|
+
function tables(db) {
|
|
14
|
+
return new Set(db.prepare("SELECT name FROM sqlite_master WHERE type='table'").all().map(row => row.name));
|
|
15
|
+
}
|
|
16
|
+
function metadata(db) {
|
|
17
|
+
if (!tables(db).has('metadata'))
|
|
18
|
+
return {};
|
|
19
|
+
return Object.fromEntries(db.prepare('SELECT name,value FROM metadata').all().map(row => [row.name, row.value]));
|
|
20
|
+
}
|
|
21
|
+
export function initializeUomtiles(path, publisher) {
|
|
22
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
23
|
+
const db = new DatabaseSync(path);
|
|
24
|
+
try {
|
|
25
|
+
db.exec(`
|
|
26
|
+
CREATE TABLE IF NOT EXISTS metadata(name TEXT PRIMARY KEY,value TEXT NOT NULL);
|
|
27
|
+
CREATE TABLE IF NOT EXISTS uomtiles_task(
|
|
28
|
+
id TEXT PRIMARY KEY,
|
|
29
|
+
schema_version INTEGER NOT NULL,
|
|
30
|
+
state TEXT NOT NULL,
|
|
31
|
+
publisher TEXT,
|
|
32
|
+
created_at TEXT NOT NULL,
|
|
33
|
+
started_at TEXT,
|
|
34
|
+
finished_at TEXT,
|
|
35
|
+
tool_version TEXT NOT NULL);
|
|
36
|
+
CREATE TABLE IF NOT EXISTS uomtiles_review(
|
|
37
|
+
kind TEXT NOT NULL,
|
|
38
|
+
object_key TEXT NOT NULL,
|
|
39
|
+
state TEXT NOT NULL,
|
|
40
|
+
note TEXT,
|
|
41
|
+
updated_at TEXT NOT NULL,
|
|
42
|
+
PRIMARY KEY(kind,object_key));
|
|
43
|
+
CREATE TABLE IF NOT EXISTS uomtiles_leases(
|
|
44
|
+
resource TEXT PRIMARY KEY,
|
|
45
|
+
owner TEXT NOT NULL,
|
|
46
|
+
pid INTEGER NOT NULL,
|
|
47
|
+
hostname TEXT NOT NULL,
|
|
48
|
+
acquired_at INTEGER NOT NULL,
|
|
49
|
+
heartbeat_at INTEGER NOT NULL,
|
|
50
|
+
expires_at INTEGER NOT NULL);
|
|
51
|
+
`);
|
|
52
|
+
const existing = db.prepare('SELECT id FROM uomtiles_task LIMIT 1').get();
|
|
53
|
+
if (!existing) {
|
|
54
|
+
const meta = metadata(db);
|
|
55
|
+
const createdAt = meta.crawl_started_at || new Date().toISOString();
|
|
56
|
+
const finishedAt = meta.crawl_finished_at || null;
|
|
57
|
+
db.prepare(`INSERT INTO uomtiles_task(id,schema_version,state,publisher,created_at,started_at,finished_at,tool_version)
|
|
58
|
+
VALUES(?,?,?,?,?,?,?,?)`).run(randomUUID(), UOMTILES_SCHEMA_VERSION, finishedAt ? 'completed' : 'incomplete', publisher || null, createdAt, meta.crawl_started_at || null, finishedAt, process.env.npm_package_version || '0.1.0');
|
|
59
|
+
}
|
|
60
|
+
const upsert = db.prepare('INSERT OR REPLACE INTO metadata(name,value) VALUES(?,?)');
|
|
61
|
+
upsert.run('uomtiles_schema_version', String(UOMTILES_SCHEMA_VERSION));
|
|
62
|
+
if (publisher)
|
|
63
|
+
upsert.run('publisher', publisher);
|
|
64
|
+
}
|
|
65
|
+
finally {
|
|
66
|
+
db.close();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function migrateToUomtiles(source, target, publisher) {
|
|
70
|
+
const input = resolve(source);
|
|
71
|
+
const output = resolve(target);
|
|
72
|
+
if (!existsSync(input))
|
|
73
|
+
throw new Error(`输入文件不存在:${input}`);
|
|
74
|
+
if (existsSync(output))
|
|
75
|
+
throw new Error(`目标文件已存在:${output}`);
|
|
76
|
+
mkdirSync(dirname(output), { recursive: true });
|
|
77
|
+
copyFileSync(input, output, 0);
|
|
78
|
+
try {
|
|
79
|
+
initializeUomtiles(output, publisher);
|
|
80
|
+
return inspectUomtiles(output);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
unlinkSync(output);
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export function setTaskState(path, state, values = {}) {
|
|
88
|
+
initializeUomtiles(path, values.publisher);
|
|
89
|
+
const db = new DatabaseSync(path);
|
|
90
|
+
try {
|
|
91
|
+
db.prepare(`UPDATE uomtiles_task SET state=?,publisher=COALESCE(?,publisher),
|
|
92
|
+
started_at=COALESCE(?,started_at),finished_at=COALESCE(?,finished_at)`).run(state, values.publisher ?? null, values.startedAt ?? null, values.finishedAt ?? null);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
db.close();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
export function inspectUomtiles(path) {
|
|
99
|
+
const absolute = resolve(path);
|
|
100
|
+
const db = new DatabaseSync(absolute, { readOnly: true });
|
|
101
|
+
try {
|
|
102
|
+
const knownTables = tables(db);
|
|
103
|
+
const meta = metadata(db);
|
|
104
|
+
const task = knownTables.has('uomtiles_task')
|
|
105
|
+
? db.prepare('SELECT * FROM uomtiles_task LIMIT 1').get()
|
|
106
|
+
: null;
|
|
107
|
+
const roots = knownTables.has('grid_roots')
|
|
108
|
+
? Object.fromEntries(db.prepare('SELECT state,COUNT(*) count FROM grid_roots GROUP BY state').all().map(row => [row.state, row.count]))
|
|
109
|
+
: {};
|
|
110
|
+
const tiles = knownTables.has('tiles')
|
|
111
|
+
? db.prepare('SELECT zoom_level z,COUNT(*) count,COALESCE(SUM(length(tile_data)),0) bytes FROM tiles GROUP BY zoom_level ORDER BY zoom_level').all()
|
|
112
|
+
: [];
|
|
113
|
+
return {
|
|
114
|
+
path: absolute,
|
|
115
|
+
bytes: statSync(absolute).size,
|
|
116
|
+
schemaVersion: task?.schema_version ?? (meta.uomtiles_schema_version ? Number(meta.uomtiles_schema_version) : null),
|
|
117
|
+
taskId: task?.id ?? null,
|
|
118
|
+
state: task?.state === 'completed' || meta.crawl_finished_at ? 'completed' : 'incomplete',
|
|
119
|
+
publisher: task?.publisher ?? meta.publisher ?? null,
|
|
120
|
+
createdAt: task?.created_at ?? meta.crawl_started_at ?? null,
|
|
121
|
+
startedAt: task?.started_at ?? meta.crawl_started_at ?? null,
|
|
122
|
+
finishedAt: task?.finished_at ?? meta.crawl_finished_at ?? null,
|
|
123
|
+
sourceZoom: meta.source_zoom ? Number(meta.source_zoom) : null,
|
|
124
|
+
gridLevel: meta.geographic_grid_level ? Number(meta.geographic_grid_level) : null,
|
|
125
|
+
roots,
|
|
126
|
+
tiles,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
finally {
|
|
130
|
+
db.close();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
export function exportMbtiles(source, target) {
|
|
134
|
+
const input = resolve(source);
|
|
135
|
+
const output = resolve(target);
|
|
136
|
+
if (extname(output).toLowerCase() !== '.mbtiles')
|
|
137
|
+
throw new Error('MBTiles 输出文件必须使用 .mbtiles 扩展名');
|
|
138
|
+
const lock = acquireSqliteLease(input, 'writer');
|
|
139
|
+
const temporary = `${output}.${process.pid}.tmp`;
|
|
140
|
+
if (existsSync(temporary))
|
|
141
|
+
unlinkSync(temporary);
|
|
142
|
+
mkdirSync(dirname(output), { recursive: true });
|
|
143
|
+
const sourceDb = new DatabaseSync(input, { readOnly: true });
|
|
144
|
+
const outputDb = new DatabaseSync(temporary);
|
|
145
|
+
try {
|
|
146
|
+
outputDb.exec(`PRAGMA journal_mode=OFF; PRAGMA synchronous=OFF;
|
|
147
|
+
CREATE TABLE metadata(name TEXT PRIMARY KEY,value TEXT NOT NULL);
|
|
148
|
+
CREATE TABLE tiles(zoom_level INTEGER NOT NULL,tile_column INTEGER NOT NULL,tile_row INTEGER NOT NULL,tile_data BLOB NOT NULL,
|
|
149
|
+
PRIMARY KEY(zoom_level,tile_column,tile_row));`);
|
|
150
|
+
const insertMeta = outputDb.prepare('INSERT INTO metadata(name,value) VALUES(?,?)');
|
|
151
|
+
const standard = new Set(['name', 'type', 'version', 'description', 'format', 'bounds', 'center', 'minzoom', 'attribution']);
|
|
152
|
+
const meta = metadata(sourceDb);
|
|
153
|
+
outputDb.exec('BEGIN');
|
|
154
|
+
for (const name of standard)
|
|
155
|
+
if (meta[name])
|
|
156
|
+
insertMeta.run(name, meta[name]);
|
|
157
|
+
const summary = inspectUomtiles(input);
|
|
158
|
+
insertMeta.run('uomtiles:publisher', summary.publisher || 'unknown');
|
|
159
|
+
insertMeta.run('uomtiles:fetched_at', summary.finishedAt || summary.startedAt || 'unknown');
|
|
160
|
+
insertMeta.run('uomtiles:source_zoom', String(summary.sourceZoom ?? 'unknown'));
|
|
161
|
+
insertMeta.run('uomtiles:grid_level', String(summary.gridLevel ?? 'unknown'));
|
|
162
|
+
const renderer = new GeographicGridRenderer(input);
|
|
163
|
+
insertMeta.run('maxzoom', String(renderer.available ? PUBLISH_MAX_ZOOM : Math.max(0, ...summary.tiles.map(tile => tile.z))));
|
|
164
|
+
const insertTile = outputDb.prepare('INSERT INTO tiles VALUES(?,?,?,?)');
|
|
165
|
+
let copied = 0;
|
|
166
|
+
if (renderer.available) {
|
|
167
|
+
for (let z = 0; z <= PUBLISH_MAX_ZOOM; z++)
|
|
168
|
+
for (const coordinate of renderer.contentCoordinates(z)) {
|
|
169
|
+
const tile = renderer.renderTile(z, coordinate.x, coordinate.y);
|
|
170
|
+
if (!tile)
|
|
171
|
+
continue;
|
|
172
|
+
insertTile.run(z, coordinate.x, xyzYToTmsY(z, coordinate.y), tile);
|
|
173
|
+
copied++;
|
|
174
|
+
if (copied % 1_000 === 0)
|
|
175
|
+
lock.heartbeat();
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else {
|
|
179
|
+
for (const row of sourceDb.prepare('SELECT zoom_level,tile_column,tile_row,tile_data FROM tiles ORDER BY zoom_level,tile_column,tile_row').iterate()) {
|
|
180
|
+
insertTile.run(row.zoom_level, row.tile_column, row.tile_row, row.tile_data);
|
|
181
|
+
copied++;
|
|
182
|
+
if (copied % 1_000 === 0)
|
|
183
|
+
lock.heartbeat();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
lock.heartbeat();
|
|
187
|
+
outputDb.exec('COMMIT');
|
|
188
|
+
outputDb.exec('CREATE UNIQUE INDEX tile_index ON tiles(zoom_level,tile_column,tile_row); PRAGMA optimize;');
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
try {
|
|
192
|
+
outputDb.exec('ROLLBACK');
|
|
193
|
+
}
|
|
194
|
+
catch { }
|
|
195
|
+
throw error;
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
outputDb.close();
|
|
199
|
+
sourceDb.close();
|
|
200
|
+
lock.release();
|
|
201
|
+
}
|
|
202
|
+
if (existsSync(output))
|
|
203
|
+
unlinkSync(output);
|
|
204
|
+
renameSync(temporary, output);
|
|
205
|
+
return inspectUomtiles(output);
|
|
206
|
+
}
|
|
207
|
+
export async function exportTiles(source, target, pmtilesCommand = process.env.UOMTILES_PMTILES_COMMAND || 'pmtiles') {
|
|
208
|
+
const extension = extname(target).toLowerCase();
|
|
209
|
+
if (extension === '.mbtiles') {
|
|
210
|
+
exportMbtiles(source, target);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if (extension !== '.pmtiles')
|
|
214
|
+
throw new Error('输出文件必须使用 .mbtiles 或 .pmtiles 扩展名');
|
|
215
|
+
const intermediate = `${resolve(target)}.${process.pid}.mbtiles`;
|
|
216
|
+
try {
|
|
217
|
+
exportMbtiles(source, intermediate);
|
|
218
|
+
await execFileAsync(pmtilesCommand, ['convert', intermediate, resolve(target), '--force', '--quiet'], { timeout: 30 * 60_000 });
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
if (error?.code === 'ENOENT')
|
|
222
|
+
throw new Error(`找不到 ${pmtilesCommand};请安装 Protomaps pmtiles CLI 或设置 UOMTILES_PMTILES_COMMAND`);
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
if (existsSync(intermediate))
|
|
227
|
+
unlinkSync(intermediate);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export function diffUomtiles(leftPath, rightPath) {
|
|
231
|
+
const left = new DatabaseSync(resolve(leftPath), { readOnly: true });
|
|
232
|
+
const right = new DatabaseSync(resolve(rightPath), { readOnly: true });
|
|
233
|
+
try {
|
|
234
|
+
const tileMap = (db) => new Map(db.prepare('SELECT zoom_level,tile_column,tile_row,tile_data FROM tiles ORDER BY zoom_level,tile_column,tile_row').all()
|
|
235
|
+
.map(row => [`${row.zoom_level}/${row.tile_column}/${row.tile_row}`, {
|
|
236
|
+
z: row.zoom_level,
|
|
237
|
+
x: row.tile_column,
|
|
238
|
+
y: (2 ** row.zoom_level - 1 - row.tile_row),
|
|
239
|
+
data: row.tile_data,
|
|
240
|
+
}]));
|
|
241
|
+
const ignored = new Set(['version', 'crawl_started_at', 'crawl_finished_at', 'publisher', 'validation_report', 'grid_root_completed']);
|
|
242
|
+
const isIgnoredMetadata = (name) => ignored.has(name) || /^derived_z\d+_completed_at$/.test(name);
|
|
243
|
+
const lm = metadata(left), rm = metadata(right);
|
|
244
|
+
const names = [...new Set([...Object.keys(lm), ...Object.keys(rm)])].filter(name => !isIgnoredMetadata(name)).sort();
|
|
245
|
+
const metadataDiff = names.filter(name => (lm[name] ?? null) !== (rm[name] ?? null)).map(name => ({ name, left: lm[name] ?? null, right: rm[name] ?? null }));
|
|
246
|
+
const leftTiles = tileMap(left), rightTiles = tileMap(right);
|
|
247
|
+
const keys = new Set([...leftTiles.keys(), ...rightTiles.keys()]);
|
|
248
|
+
const items = [];
|
|
249
|
+
let compared = 0, missingLeft = 0, missingRight = 0, diffPixels = 0, addedPixels = 0, removedPixels = 0;
|
|
250
|
+
for (const key of keys) {
|
|
251
|
+
const leftTile = leftTiles.get(key), rightTile = rightTiles.get(key);
|
|
252
|
+
if (leftTile && rightTile)
|
|
253
|
+
compared++;
|
|
254
|
+
if (!leftTile)
|
|
255
|
+
missingLeft++;
|
|
256
|
+
if (!rightTile)
|
|
257
|
+
missingRight++;
|
|
258
|
+
const leftMask = leftTile ? decodeCanonicalAlphaMask(leftTile.data, 256) : new Uint8Array(256 * 256);
|
|
259
|
+
const rightMask = rightTile ? decodeCanonicalAlphaMask(rightTile.data, 256) : new Uint8Array(256 * 256);
|
|
260
|
+
let tileAdded = 0, tileRemoved = 0, leftPixels = 0, rightPixels = 0;
|
|
261
|
+
for (let pixel = 0; pixel < leftMask.length; pixel++) {
|
|
262
|
+
const leftVisible = leftMask[pixel] !== 0, rightVisible = rightMask[pixel] !== 0;
|
|
263
|
+
if (leftVisible)
|
|
264
|
+
leftPixels++;
|
|
265
|
+
if (rightVisible)
|
|
266
|
+
rightPixels++;
|
|
267
|
+
if (leftVisible === rightVisible)
|
|
268
|
+
continue;
|
|
269
|
+
if (rightVisible)
|
|
270
|
+
tileAdded++;
|
|
271
|
+
else
|
|
272
|
+
tileRemoved++;
|
|
273
|
+
}
|
|
274
|
+
const tileDiff = tileAdded + tileRemoved;
|
|
275
|
+
diffPixels += tileDiff;
|
|
276
|
+
addedPixels += tileAdded;
|
|
277
|
+
removedPixels += tileRemoved;
|
|
278
|
+
if (tileDiff === 0)
|
|
279
|
+
continue;
|
|
280
|
+
const coordinate = leftTile || rightTile;
|
|
281
|
+
items.push({
|
|
282
|
+
z: coordinate.z, x: coordinate.x, y: coordinate.y,
|
|
283
|
+
diffPixels: tileDiff, diffPercent: tileDiff / (256 * 256) * 100,
|
|
284
|
+
addedPixels: tileAdded, removedPixels: tileRemoved, leftPixels, rightPixels,
|
|
285
|
+
missingLeft: !leftTile, missingRight: !rightTile,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
items.sort((a, b) => b.diffPercent - a.diffPercent || b.diffPixels - a.diffPixels || b.z - a.z || a.x - b.x || a.y - b.y);
|
|
289
|
+
const tiles = {
|
|
290
|
+
total: keys.size,
|
|
291
|
+
compared,
|
|
292
|
+
changed: items.length,
|
|
293
|
+
identical: keys.size - items.length,
|
|
294
|
+
missingLeft,
|
|
295
|
+
missingRight,
|
|
296
|
+
diffPixels,
|
|
297
|
+
addedPixels,
|
|
298
|
+
removedPixels,
|
|
299
|
+
items,
|
|
300
|
+
};
|
|
301
|
+
return { identical: items.length === 0 && metadataDiff.length === 0, tiles, metadata: metadataDiff };
|
|
302
|
+
}
|
|
303
|
+
finally {
|
|
304
|
+
left.close();
|
|
305
|
+
right.close();
|
|
306
|
+
}
|
|
307
|
+
}
|