From 90bca6ae3970c54e8f2d1b654ad7736720eb8820 Mon Sep 17 00:00:00 2001 From: Zack Pollard Date: Mon, 16 Sep 2024 14:44:07 +0100 Subject: [PATCH 1/5] ci: create basemaps submodule for protomaps generation --- .gitmodules | 3 + styles-gen/.gitignore | 2 + styles-gen/.nvmrc | 1 + styles-gen/package-lock.json | 759 +++++++++++++++++++++++++++++++++++ styles-gen/package.json | 15 + styles-gen/src/base.json | 13 + styles-gen/src/index.ts | 35 ++ styles-gen/src/themes.ts | 23 ++ styles-gen/tsconfig.json | 13 + submodules/basemaps | 1 + 10 files changed, 865 insertions(+) create mode 100644 .gitmodules create mode 100644 styles-gen/.gitignore create mode 100644 styles-gen/.nvmrc create mode 100644 styles-gen/package-lock.json create mode 100644 styles-gen/package.json create mode 100644 styles-gen/src/base.json create mode 100644 styles-gen/src/index.ts create mode 100644 styles-gen/src/themes.ts create mode 100644 styles-gen/tsconfig.json create mode 160000 submodules/basemaps diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..40b620f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "submodules/basemaps"] + path = submodules/basemaps + url = https://github.com/protomaps/basemaps.git diff --git a/styles-gen/.gitignore b/styles-gen/.gitignore new file mode 100644 index 0000000..db4c6d9 --- /dev/null +++ b/styles-gen/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules \ No newline at end of file diff --git a/styles-gen/.nvmrc b/styles-gen/.nvmrc new file mode 100644 index 0000000..89e0c3d --- /dev/null +++ b/styles-gen/.nvmrc @@ -0,0 +1 @@ +20.10 \ No newline at end of file diff --git a/styles-gen/package-lock.json b/styles-gen/package-lock.json new file mode 100644 index 0000000..2d85861 --- /dev/null +++ b/styles-gen/package-lock.json @@ -0,0 +1,759 @@ +{ + "name": "protomaps-themes-base", + "version": "3.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "protomaps-themes-base", + "version": "3.1.0", + "license": "BSD-3-Clause", + "devDependencies": { + "@types/node": "^20.16.5", + "tsx": "^4.7.2" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/node": { + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "dev": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + } + }, + "dependencies": { + "@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "dev": true, + "optional": true + }, + "@types/node": { + "version": "20.16.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.16.5.tgz", + "integrity": "sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==", + "dev": true, + "requires": { + "undici-types": "~6.19.2" + } + }, + "esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true + }, + "tsx": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", + "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", + "dev": true, + "requires": { + "esbuild": "~0.23.0", + "fsevents": "~2.3.3", + "get-tsconfig": "^4.7.5" + } + }, + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true + } + } +} diff --git a/styles-gen/package.json b/styles-gen/package.json new file mode 100644 index 0000000..0d88e29 --- /dev/null +++ b/styles-gen/package.json @@ -0,0 +1,15 @@ +{ + "name": "styles-gen", + "description": "Generate immich style variations from the protomaps styles", + "main": "index.ts", + "scripts": { + "generate": "tsx src/index.ts" + }, + "author": "The Protomaps Authors", + "license": "BSD-3-Clause", + "homepage": "https://github.com/protomaps/basemaps", + "devDependencies": { + "tsx": "^4.7.2", + "@types/node": "^20.16.5" + } +} diff --git a/styles-gen/src/base.json b/styles-gen/src/base.json new file mode 100644 index 0000000..5e0fd73 --- /dev/null +++ b/styles-gen/src/base.json @@ -0,0 +1,13 @@ +{ + "version": 9, + "name": "Immich Map", + "id": "immich-map", + "sources": { + "tiles": { + "type": "vector", + "url": "https://tiles.immich.cloud/v1.json" + } + }, + "sprite": "https://static.immich.cloud/tiles/sprites/v1/light", + "glyphs": "https://static.immich.cloud/tiles/fonts/{fontstack}/{range}.pbf" +} diff --git a/styles-gen/src/index.ts b/styles-gen/src/index.ts new file mode 100644 index 0000000..8203e4b --- /dev/null +++ b/styles-gen/src/index.ts @@ -0,0 +1,35 @@ +import themes, { ImmichTheme } from './themes'; +import fs from 'fs'; +import path from 'path'; +import { layersWithCustomTheme } from '../../submodules/basemaps/styles/src'; + +const generateLayers = (themeName: string) => { + const sourceName = 'protomaps' + const theme = themes[themeName]; + const layers = layersWithCustomTheme(sourceName, theme); + const style = { + version: 8, + "name": "Immich Map", + "id": `immich-map-${themeName}`, + sources: { + [sourceName]: { + type: "vector", + url: 'https://tiles.immich.cloud/v1.json', + }, + }, + layers: layers, + sprite: `https://static.immich.cloud/tiles/sprites/v1/${theme.iconStyle}`, + glyphs: "https://static.immich.cloud/tiles/fonts/{fontstack}/{range}.pbf", + }; + + return style; +} + +const dist = path.resolve(__dirname, '../dist'); +if (!fs.existsSync(dist)) { + fs.mkdirSync(dist); +} + +for (const theme of Object.keys(themes)) { + fs.writeFileSync(path.resolve(dist, `${theme}.json`), JSON.stringify(generateLayers(theme), null, 2)); +} diff --git a/styles-gen/src/themes.ts b/styles-gen/src/themes.ts new file mode 100644 index 0000000..2245252 --- /dev/null +++ b/styles-gen/src/themes.ts @@ -0,0 +1,23 @@ +import { BLACK, LIGHT, Theme } from '../../submodules/basemaps/styles/src/themes'; + +export interface ImmichTheme extends Theme { + iconStyle: 'dark' | 'light'; +} + +export const IMMICH_LIGHT: ImmichTheme = { + iconStyle: 'light', + ...LIGHT, + water: 'rgba(148, 209, 236, 0.66)' +}; + +export const IMMICH_DARK: ImmichTheme = { + iconStyle: 'dark', + ...BLACK, +}; + +const themes: Record = { + light: IMMICH_LIGHT, + dark: IMMICH_DARK, +}; + +export default themes; diff --git a/styles-gen/tsconfig.json b/styles-gen/tsconfig.json new file mode 100644 index 0000000..7ca90e2 --- /dev/null +++ b/styles-gen/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "target": "es6", + "lib": ["es2020", "dom"], + "strict": true, + "moduleResolution": "node", + "paths": { + }, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + }, + "include": ["src/*.ts"] +} diff --git a/submodules/basemaps b/submodules/basemaps new file mode 160000 index 0000000..217103c --- /dev/null +++ b/submodules/basemaps @@ -0,0 +1 @@ +Subproject commit 217103cf64de3a4ca3405dbd6caee3c3222ee403 From a3279050706ba74fb9359711fef42e97e409c4d1 Mon Sep 17 00:00:00 2001 From: Zack Pollard Date: Mon, 16 Sep 2024 15:40:00 +0100 Subject: [PATCH 2/5] ci: push tiles and styles into date folder in R2 --- .github/workflows/tiles-file.yml | 30 +++++++++++++++++-- .../cloudflare/tiles-worker/tiles.tfvars.json | 2 +- .../cloudflare/tiles-worker/variables.tf | 2 +- .../cloudflare/tiles-worker/workers.tf | 2 +- tiles/src/env.d.ts | 4 +-- tiles/src/index.ts | 8 ++--- tiles/src/repository.ts | 6 ++-- tiles/test/index.spec.ts | 2 +- tiles/worker-configuration.d.ts | 2 +- tiles/wrangler.toml | 2 +- 10 files changed, 42 insertions(+), 18 deletions(-) diff --git a/.github/workflows/tiles-file.yml b/.github/workflows/tiles-file.yml index 449290a..2e039c8 100644 --- a/.github/workflows/tiles-file.yml +++ b/.github/workflows/tiles-file.yml @@ -9,6 +9,7 @@ on: branches: [ "main" ] paths: - ".github/workflows/tiles-file.yml" + - "styles-gen/**" concurrency: group: ${{ github.workflow }} @@ -16,14 +17,33 @@ concurrency: jobs: deploy_tiles: - name: Deploy Tiles + name: Deploy Tiles & Styles strategy: matrix: bucket_region: [ "wnam", "enam", "weur", "eeur", "apac" ] + defaults: + run: + working-directory: 'styles-gen' runs-on: ubuntu-latest outputs: KEY: ${{ steps.latest_build.outputs.KEY }} steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: 'recursive' + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version-file: 'styles-gen/.nvmrc' + + - name: Install dependencies + run: npm ci + + - name: Generate styles + run: npm run generate + - name: Find latest pmtiles build id: latest_build env: @@ -34,6 +54,7 @@ jobs: else build=$FILE_NAME fi + export build=${build%.pmtiles} echo "KEY=$build" echo "KEY=$build" >> $GITHUB_OUTPUT @@ -53,8 +74,11 @@ jobs: type = http url = https://build.protomaps.com/ + - name: Copy latest styles to R2 + run: rclone --progress copy ./dist/ r2:/tiles-${{ matrix.bucket_region }}/${{ steps.latest_build.outputs.KEY }}/styles/ --s3-no-check-bucket --s3-chunk-size=64M --multi-thread-streams=50 --checkers=512 + - name: Copy latest tiles to R2 - run: rclone --progress copyto pmtiles:/${{ steps.latest_build.outputs.KEY }} r2:/tiles-${{ matrix.bucket_region }}/${{ steps.latest_build.outputs.KEY }} --s3-no-check-bucket --s3-chunk-size=64M --multi-thread-streams=50 --checkers=512 + run: rclone --progress copyto pmtiles:/${{ steps.latest_build.outputs.KEY }}.pmtiles r2:/tiles-${{ matrix.bucket_region }}/${{ steps.latest_build.outputs.KEY }}/tiles.pmtiles --s3-no-check-bucket --s3-chunk-size=64M --multi-thread-streams=50 --checkers=512 update_tile_ref: name: Update tile server file reference needs: [deploy_tiles] @@ -74,7 +98,7 @@ jobs: - name: Update deployment file name run: | - sed -i -E 's/"pmtiles_file_name": "(.*)"/"pmtiles_file_name": "${{ needs.deploy_tiles.outputs.KEY }}"/' deployment/modules/cloudflare/tiles-worker/tiles.tfvars.json + sed -i -E 's/"pmtiles_deployment_key": "(.*)"/"pmtiles_deployment_key": "${{ needs.deploy_tiles.outputs.KEY }}"/' deployment/modules/cloudflare/tiles-worker/tiles.tfvars.json - name: Push updated tiles.tfvars to repo uses: EndBug/add-and-commit@v9 diff --git a/deployment/modules/cloudflare/tiles-worker/tiles.tfvars.json b/deployment/modules/cloudflare/tiles-worker/tiles.tfvars.json index 40c8166..48fdf83 100644 --- a/deployment/modules/cloudflare/tiles-worker/tiles.tfvars.json +++ b/deployment/modules/cloudflare/tiles-worker/tiles.tfvars.json @@ -1,3 +1,3 @@ { - "pmtiles_file_name": "20240812.pmtiles" + "pmtiles_deployment_key": "20240812" } diff --git a/deployment/modules/cloudflare/tiles-worker/variables.tf b/deployment/modules/cloudflare/tiles-worker/variables.tf index 78e2cb4..c170e32 100644 --- a/deployment/modules/cloudflare/tiles-worker/variables.tf +++ b/deployment/modules/cloudflare/tiles-worker/variables.tf @@ -1,6 +1,6 @@ variable "cloudflare_account_id" {} variable "tf_state_postgres_conn_str" {} -variable "pmtiles_file_name" {} +variable "pmtiles_deployment_key" {} variable "tiles_build_dir" {} variable "vmetrics_api_token" {} variable "env" {} diff --git a/deployment/modules/cloudflare/tiles-worker/workers.tf b/deployment/modules/cloudflare/tiles-worker/workers.tf index d4f0a27..6a8468b 100644 --- a/deployment/modules/cloudflare/tiles-worker/workers.tf +++ b/deployment/modules/cloudflare/tiles-worker/workers.tf @@ -10,7 +10,7 @@ resource "cloudflare_workers_script" "tiles" { plain_text_binding { name = "PMTILES_FILE_NAME" - text = var.pmtiles_file_name + text = var.pmtiles_deployment_key } plain_text_binding { diff --git a/tiles/src/env.d.ts b/tiles/src/env.d.ts index 20b2763..b7f8e24 100644 --- a/tiles/src/env.d.ts +++ b/tiles/src/env.d.ts @@ -1,5 +1,5 @@ -interface WorkerEnv extends Omit { +interface WorkerEnv extends Omit { ENVIRONMENT: string; - PMTILES_FILE_NAME: string; + DEPLOYMENT_KEY: string; VMETRICS_API_TOKEN: string; } diff --git a/tiles/src/index.ts b/tiles/src/index.ts index aac9dc3..15ea98b 100644 --- a/tiles/src/index.ts +++ b/tiles/src/index.ts @@ -38,7 +38,7 @@ type PMTilesJsonParams = PMTilesParams & { }; enum Header { - PMTILES_FILE_IDENTIFIER = 'PMTiles-File-Identifier', + PMTILES_DEPLOYMENT_KEY = 'PMTiles-Deployment-Key', CACHE_CONTROL = 'Cache-Control', ACCESS_CONTROL_ALLOW_ORIGIN = 'Access-Control-Allow-Origin', VARY = 'Vary', @@ -102,7 +102,7 @@ async function handleRequest( const cached = await metrics.monitorAsyncFunction({ name: 'match_request_from_cdn' }, (url) => cache.match(url))( request.url, ); - if (cached && cached.headers.get(Header.PMTILES_FILE_IDENTIFIER) === env.PMTILES_FILE_NAME) { + if (cached && cached.headers.get(Header.PMTILES_DEPLOYMENT_KEY) === env.DEPLOYMENT_KEY) { const cacheHeaders = new Headers(cached.headers); const encodeBody = cacheHeaders.has('content-encoding') ? 'manual' : 'automatic'; return new Response(cached.body, { @@ -132,7 +132,7 @@ async function handleRequest( Object.entries(bucketMap).filter(([key]) => buckets.includes(key as R2BucketRegion)), ); - const storageRepository = new R2StorageRepository(filteredBucketMap, env.PMTILES_FILE_NAME, metrics); + const storageRepository = new R2StorageRepository(filteredBucketMap, env.DEPLOYMENT_KEY, metrics); const pmTilesService = await metrics.monitorAsyncFunction({ name: 'pmtiles_init' }, PMTilesService.init)( storageRepository, memCacheRepository, @@ -144,7 +144,7 @@ async function handleRequest( respHeaders.set(Header.CACHE_CONTROL, `public, max-age=${60 * 60 * 24 * 31}`); respHeaders.set(Header.ACCESS_CONTROL_ALLOW_ORIGIN, '*'); respHeaders.set(Header.VARY, 'Origin'); - respHeaders.set(Header.PMTILES_FILE_IDENTIFIER, env.PMTILES_FILE_NAME); + respHeaders.set(Header.PMTILES_DEPLOYMENT_KEY, env.DEPLOYMENT_KEY); const pmTilesParams = parseUrl(request); diff --git a/tiles/src/repository.ts b/tiles/src/repository.ts index 5896436..2751882 100644 --- a/tiles/src/repository.ts +++ b/tiles/src/repository.ts @@ -42,12 +42,12 @@ export class MemCacheRepository implements IMemCacheRepository { export class R2StorageRepository implements IStorageRepository { constructor( private buckets: { [key: string]: R2Bucket }, - private fileName: string, + private deploymentKey: string, private metrics: IMetricsRepository, ) {} getFileName(): string { - return this.fileName; + return this.deploymentKey; } private async getR2Object(range: { offset: number; length: number }) { @@ -55,7 +55,7 @@ export class R2StorageRepository implements IStorageRepository { const { offset, length } = range; const { key: bucketKey, resp } = await Promise.race( Object.entries(this.buckets).map(async ([key, bucket]) => { - const resp = await bucket.get(this.fileName, { + const resp = await bucket.get(`${this.deploymentKey}/tiles.pmtiles`, { range: { offset, length }, }); return { key, resp }; diff --git a/tiles/test/index.spec.ts b/tiles/test/index.spec.ts index c1736dd..20e9333 100644 --- a/tiles/test/index.spec.ts +++ b/tiles/test/index.spec.ts @@ -16,7 +16,7 @@ describe('integration tests', () => { throw new Error('File body is undefined'); } const body = file.body as ReadableStream; - await bucket.put(env.PMTILES_FILE_NAME, body); + await bucket.put(`${env.DEPLOYMENT_KEY}/tiles.pmtiles`, body); console.log('File uploaded'); } }, 30000); diff --git a/tiles/worker-configuration.d.ts b/tiles/worker-configuration.d.ts index d29e823..9069787 100644 --- a/tiles/worker-configuration.d.ts +++ b/tiles/worker-configuration.d.ts @@ -3,7 +3,7 @@ interface Env { KV: KVNamespace; - PMTILES_FILE_NAME: "v1.pmtiles"; + DEPLOYMENT_KEY: "20240812"; ENVIRONMENT: "prod"; BUCKET_WNAM: R2Bucket; BUCKET_ENAM: R2Bucket; diff --git a/tiles/wrangler.toml b/tiles/wrangler.toml index 27443f1..4fe3001 100644 --- a/tiles/wrangler.toml +++ b/tiles/wrangler.toml @@ -40,5 +40,5 @@ preview_bucket_name = "tiles-apac" # Define environment variables for your Workers script [vars] -PMTILES_FILE_NAME = "v1.pmtiles" +DEPLOYMENT_KEY = "20240812" ENVIRONMENT = "production" From e68b52fc8a68d1a600f20dbd0e2d02d617c24cea Mon Sep 17 00:00:00 2001 From: Zack Pollard Date: Mon, 16 Sep 2024 21:33:40 +0100 Subject: [PATCH 3/5] feat: style endpoints for retrieving map styles from tileserver --- .github/workflows/tiles-worker.yml | 2 +- .../cloudflare/tiles-worker/workers.tf | 2 +- tiles/src/index.ts | 33 +- tiles/src/interface.ts | 8 +- tiles/src/kv-warmer.ts | 17 +- tiles/src/pmtiles/pmtiles.service.ts | 16 +- tiles/src/pmtiles/utils.ts | 2 +- tiles/src/repository.ts | 62 +- tiles/test/assets/styles/dark.json | 3180 +++++++++++++++++ tiles/test/assets/styles/light.json | 3180 +++++++++++++++++ .../assets/{zoom1.pmtiles => tiles.pmtiles} | Bin tiles/test/index.spec.ts | 34 +- 12 files changed, 6487 insertions(+), 49 deletions(-) create mode 100644 tiles/test/assets/styles/dark.json create mode 100644 tiles/test/assets/styles/light.json rename tiles/test/assets/{zoom1.pmtiles => tiles.pmtiles} (100%) diff --git a/.github/workflows/tiles-worker.yml b/.github/workflows/tiles-worker.yml index d248be4..1b91396 100644 --- a/.github/workflows/tiles-worker.yml +++ b/.github/workflows/tiles-worker.yml @@ -191,7 +191,7 @@ jobs: # Figure out how to extract this from terraform at some point or get it into github vars KV_NAMESPACE_ID: 5a4b82694e8b490db8b8904cdaea4f00 BUCKET_KEY: tiles-weur - FILE_NAME: ${{ fromJson(env.TILES_JSON).pmtiles_file_name }} + DEPLOYMENT_KEY: ${{ fromJson(env.TILES_JSON).pmtiles_deployment_key }} run: npm run kv:warm deploy-terragrunt: diff --git a/deployment/modules/cloudflare/tiles-worker/workers.tf b/deployment/modules/cloudflare/tiles-worker/workers.tf index 6a8468b..40f609c 100644 --- a/deployment/modules/cloudflare/tiles-worker/workers.tf +++ b/deployment/modules/cloudflare/tiles-worker/workers.tf @@ -9,7 +9,7 @@ resource "cloudflare_workers_script" "tiles" { module = true plain_text_binding { - name = "PMTILES_FILE_NAME" + name = "DEPLOYMENT_KEY" text = var.pmtiles_deployment_key } diff --git a/tiles/src/index.ts b/tiles/src/index.ts index 15ea98b..769da0c 100644 --- a/tiles/src/index.ts +++ b/tiles/src/index.ts @@ -17,13 +17,20 @@ declare global { } /* eslint-enable no-var */ -const URL_MATCHER = /^\/v(?[0-9]+)((?=)|(?\.json)|\/(?\d+)\/(?\d+)\/(?\d+).mvt)$/; +const URL_MATCHER = + /^\/v(?[0-9]+)((?=)|\/style\/(?