From 5e57b0d71e3e68c8ec11d8fb81489cb65390c9e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E0=A4=95=E0=A4=BE=E0=A4=B0=E0=A4=A4=E0=A5=8B=E0=A4=AB?= =?UTF-8?q?=E0=A5=8D=E0=A4=AB=E0=A5=87=E0=A4=B2=E0=A4=B8=E0=A5=8D=E0=A4=95?= =?UTF-8?q?=E0=A5=8D=E0=A4=B0=E0=A4=BF=E0=A4=AA=E0=A5=8D=E0=A4=9F=E2=84=A2?= Date: Tue, 16 Jul 2024 18:46:12 +0200 Subject: [PATCH] refactor(core): Use use up-to-date timezone data (#10073) Co-authored-by: Danny Martini --- packages/cli/package.json | 2 +- packages/cli/scripts/build.mjs | 31 +++++++++++++++++++++---------- packages/cli/src/Server.ts | 12 ++++-------- pnpm-lock.yaml | 32 ++++++++++++++++---------------- 4 files changed, 42 insertions(+), 35 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index a891724a62..c76ee52bc5 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -74,6 +74,7 @@ "@types/ws": "^8.5.4", "@types/xml2js": "^0.4.14", "@types/yamljs": "^0.2.31", + "@vvo/tzdb": "^6.141.0", "chokidar": "^3.5.2", "concurrently": "^8.2.0", "ioredis-mock": "^8.8.1", @@ -116,7 +117,6 @@ "flat": "5.0.2", "flatted": "3.2.7", "formidable": "3.5.1", - "google-timezones-json": "1.1.0", "handlebars": "4.7.8", "helmet": "7.1.0", "infisical-node": "1.3.0", diff --git a/packages/cli/scripts/build.mjs b/packages/cli/scripts/build.mjs index 621e36bdff..b1f5f5bd8f 100644 --- a/packages/cli/scripts/build.mjs +++ b/packages/cli/scripts/build.mjs @@ -1,6 +1,8 @@ import path from 'path'; +import { writeFileSync } from 'fs'; import { fileURLToPath } from 'url'; import shell from 'shelljs'; +import { rawTimeZones } from '@vvo/tzdb'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -12,41 +14,50 @@ const SPEC_THEME_FILENAME = 'swaggerTheme.css'; const publicApiEnabled = process.env.N8N_PUBLIC_API_DISABLED !== 'true'; copyUserManagementEmailTemplates(); +generateTimezoneData(); if (publicApiEnabled) { copySwaggerTheme(); bundleOpenApiSpecs(); } -function copyUserManagementEmailTemplates(rootDir = ROOT_DIR) { +function copyUserManagementEmailTemplates() { const templates = { - source: path.resolve(rootDir, 'src', 'UserManagement', 'email', 'templates'), - destination: path.resolve(rootDir, 'dist', 'UserManagement', 'email'), + source: path.resolve(ROOT_DIR, 'src', 'UserManagement', 'email', 'templates'), + destination: path.resolve(ROOT_DIR, 'dist', 'UserManagement', 'email'), }; shell.cp('-r', templates.source, templates.destination); } -function copySwaggerTheme(rootDir = ROOT_DIR, themeFilename = SPEC_THEME_FILENAME) { +function copySwaggerTheme() { const swaggerTheme = { - source: path.resolve(rootDir, 'src', 'PublicApi', themeFilename), - destination: path.resolve(rootDir, 'dist', 'PublicApi'), + source: path.resolve(ROOT_DIR, 'src', 'PublicApi', SPEC_THEME_FILENAME), + destination: path.resolve(ROOT_DIR, 'dist', 'PublicApi'), }; shell.cp('-r', swaggerTheme.source, swaggerTheme.destination); } -function bundleOpenApiSpecs(rootDir = ROOT_DIR, specFileName = SPEC_FILENAME) { - const publicApiDir = path.resolve(rootDir, 'src', 'PublicApi'); +function bundleOpenApiSpecs() { + const publicApiDir = path.resolve(ROOT_DIR, 'src', 'PublicApi'); shell .find(publicApiDir) .reduce((acc, cur) => { - return cur.endsWith(specFileName) ? [...acc, path.relative('./src', cur)] : acc; + return cur.endsWith(SPEC_FILENAME) ? [...acc, path.relative('./src', cur)] : acc; }, []) .forEach((specPath) => { - const distSpecPath = path.resolve(rootDir, 'dist', specPath); + const distSpecPath = path.resolve(ROOT_DIR, 'dist', specPath); const command = `pnpm openapi bundle src/${specPath} --output ${distSpecPath}`; shell.exec(command, { silent: true }); }); } + +function generateTimezoneData() { + const timezones = rawTimeZones.reduce((acc, tz) => { + acc[tz.name] = tz.name.replaceAll('_', ' '); + return acc; + }, {}); + writeFileSync(path.resolve(ROOT_DIR, 'dist/timezones.json'), JSON.stringify({ data: timezones })); +} diff --git a/packages/cli/src/Server.ts b/packages/cli/src/Server.ts index c367ea5e0e..e6c636bc23 100644 --- a/packages/cli/src/Server.ts +++ b/packages/cli/src/Server.ts @@ -1,5 +1,6 @@ import { Container, Service } from 'typedi'; import { exec as callbackExec } from 'child_process'; +import { resolve } from 'path'; import { access as fsAccess } from 'fs/promises'; import { promisify } from 'util'; import cookieParser from 'cookie-parser'; @@ -9,12 +10,10 @@ import { GlobalConfig } from '@n8n/config'; import { InstanceSettings } from 'n8n-core'; import type { IN8nUISettings } from 'n8n-workflow'; -// @ts-expect-error missing types -import timezones from 'google-timezones-json'; - import config from '@/config'; import { + CLI_DIR, EDITOR_UI_DIST_DIR, inDevelopment, inE2ETests, @@ -229,11 +228,8 @@ export class Server extends AbstractServer { // ---------------------------------------- // Returns all the available timezones - this.app.get( - `/${this.restEndpoint}/options/timezones`, - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - ResponseHelper.send(async () => timezones), - ); + const tzDataFile = resolve(CLI_DIR, 'dist/timezones.json'); + this.app.get(`/${this.restEndpoint}/options/timezones`, (_, res) => res.sendFile(tzDataFile)); // ---------------------------------------- // Settings diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f590908f12..3ea0b8989a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -643,9 +643,6 @@ importers: formidable: specifier: 3.5.1 version: 3.5.1 - google-timezones-json: - specifier: 1.1.0 - version: 1.1.0 handlebars: specifier: 4.7.8 version: 4.7.8 @@ -875,6 +872,9 @@ importers: '@types/yamljs': specifier: ^0.2.31 version: 0.2.31 + '@vvo/tzdb': + specifier: ^6.141.0 + version: 6.141.0 chokidar: specifier: 3.5.2 version: 3.5.2 @@ -5803,6 +5803,9 @@ packages: '@vueuse/shared@9.13.0': resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + '@vvo/tzdb@6.141.0': + resolution: {integrity: sha512-vpuv8Eo75WwW6oHygfSSJ8J2AIADlqoHu9HmKxD8Ey/hmRhxt0+/nEGbzBy/Y/Q1qsdgDj3kP3NRLr2082VzgA==} + '@xata.io/client@0.28.4': resolution: {integrity: sha512-B02WHIA/ViHya84XvH6JCo13rd5h4S5vVyY2aYi6fIcjDIbCpsSLJ4oGWpdodovRYeAZy9Go4OhdyZwMIRC4BQ==} peerDependencies: @@ -8202,9 +8205,6 @@ packages: engines: {node: '>=12.0.0'} hasBin: true - google-timezones-json@1.1.0: - resolution: {integrity: sha512-6BmBx9gJVALV2jsfMks8PwmkWT5ip3+bmMyTgXu4PY+G8nKjHi61yrL7rSXpMYRsIzUXhVKpj+MnjhnwG9nung==} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -19244,6 +19244,8 @@ snapshots: - '@vue/composition-api' - vue + '@vvo/tzdb@6.141.0': {} + '@xata.io/client@0.28.4(typescript@5.5.2)': dependencies: typescript: 5.5.2 @@ -21217,7 +21219,7 @@ snapshots: eslint-import-resolver-node@0.3.9: dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7(supports-color@5.5.0) is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: @@ -21242,7 +21244,7 @@ snapshots: eslint-module-utils@2.8.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.5.2))(eslint-plugin-import@2.29.1)(eslint@8.57.0))(eslint@8.57.0): dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7(supports-color@5.5.0) optionalDependencies: '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.5.2) eslint: 8.57.0 @@ -21262,7 +21264,7 @@ snapshots: array.prototype.findlastindex: 1.2.3 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7(supports-color@5.5.0) doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -21792,7 +21794,7 @@ snapshots: follow-redirects@1.15.6(debug@3.2.7): optionalDependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7(supports-color@5.5.0) follow-redirects@1.15.6(debug@4.3.4): optionalDependencies: @@ -22133,7 +22135,7 @@ snapshots: array-parallel: 0.1.3 array-series: 0.1.5 cross-spawn: 4.0.2 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -22186,8 +22188,6 @@ snapshots: dependencies: node-forge: 1.3.1 - google-timezones-json@1.1.0: {} - gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -24898,7 +24898,7 @@ snapshots: pdf-parse@1.1.1: dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7(supports-color@5.5.0) node-ensure: 0.0.0 transitivePeerDependencies: - supports-color @@ -25780,7 +25780,7 @@ snapshots: rhea@1.0.24: dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -26154,7 +26154,7 @@ snapshots: binascii: 0.0.2 bn.js: 5.2.1 browser-request: 0.3.3 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7(supports-color@5.5.0) expand-tilde: 2.0.2 extend: 3.0.2 fast-xml-parser: 4.2.7