refactor(core): Use use up-to-date timezone data (#10073)

Co-authored-by: Danny Martini <danny@n8n.io>
This commit is contained in:
कारतोफ्फेलस्क्रिप्ट™ 2024-07-16 18:46:12 +02:00 committed by GitHub
parent 3bbeae47f3
commit 5e57b0d71e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 42 additions and 35 deletions

View file

@ -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",

View file

@ -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 }));
}

View file

@ -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

View file

@ -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