From e10b21a8accf47674dce16a8aeb96cb8b89b834f Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 10:38:38 -0400 Subject: [PATCH 1/9] =?UTF-8?q?Creaci=C3=B3n=20del=20archivo=20ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/navigation/admin.js | 172 ++++++++++++++++++++-------------------- src/navigation/admin.ts | 104 ++++++++++++++++++++++++ 2 files changed, 191 insertions(+), 85 deletions(-) create mode 100644 src/navigation/admin.ts diff --git a/src/navigation/admin.js b/src/navigation/admin.js index df8241c8ba..76e5187170 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -1,104 +1,106 @@ -'use strict'; - +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; const validator = require('validator'); const winston = require('winston'); - const plugins = require('../plugins'); const db = require('../database'); const pubsub = require('../pubsub'); - const admin = module.exports; let cache = null; - pubsub.on('admin:navigation:save', () => { - cache = null; + cache = null; }); - -admin.save = async function (data) { - const order = Object.keys(data); - const bulkSet = []; - data.forEach((item, index) => { - item.order = order[index]; - if (item.hasOwnProperty('groups')) { - item.groups = JSON.stringify(item.groups); - } - bulkSet.push([`navigation:enabled:${item.order}`, item]); - }); - - cache = null; - pubsub.publish('admin:navigation:save'); - const ids = await db.getSortedSetRange('navigation:enabled', 0, -1); - await db.deleteAll(ids.map(id => `navigation:enabled:${id}`)); - await db.setObjectBulk(bulkSet); - await db.delete('navigation:enabled'); - await db.sortedSetAdd('navigation:enabled', order, order); +admin.save = function (data) { + return __awaiter(this, void 0, void 0, function* () { + const order = Object.keys(data); + const bulkSet = []; + data.forEach((item, index) => { + item.order = order[index]; + if (item.hasOwnProperty('groups')) { + item.groups = JSON.stringify(item.groups); + } + bulkSet.push([`navigation:enabled:${item.order}`, item]); + }); + cache = null; + pubsub.publish('admin:navigation:save'); + const ids = yield db.getSortedSetRange('navigation:enabled', 0, -1); + yield db.deleteAll(ids.map(id => `navigation:enabled:${id}`)); + yield db.setObjectBulk(bulkSet); + yield db.delete('navigation:enabled'); + yield db.sortedSetAdd('navigation:enabled', order, order); + }); }; - -admin.getAdmin = async function () { - const [enabled, available] = await Promise.all([ - admin.get(), - getAvailable(), - ]); - return { enabled: enabled, available: available }; +admin.getAdmin = function () { + return __awaiter(this, void 0, void 0, function* () { + const [enabled, available] = yield Promise.all([ + admin.get(), + getAvailable(), + ]); + return { enabled: enabled, available: available }; + }); }; - const fieldsToEscape = ['iconClass', 'class', 'route', 'id', 'text', 'textClass', 'title']; - admin.escapeFields = navItems => toggleEscape(navItems, true); admin.unescapeFields = navItems => toggleEscape(navItems, false); - function toggleEscape(navItems, flag) { - navItems.forEach((item) => { - if (item) { - fieldsToEscape.forEach((field) => { - if (item.hasOwnProperty(field)) { - item[field] = validator[flag ? 'escape' : 'unescape'](String(item[field])); - } - }); - } - }); + navItems.forEach((item) => { + if (item) { + fieldsToEscape.forEach((field) => { + if (item.hasOwnProperty(field)) { + item[field] = validator[flag ? 'escape' : 'unescape'](String(item[field])); + } + }); + } + }); } - -admin.get = async function () { - if (cache) { - return cache.map(item => ({ ...item })); - } - const ids = await db.getSortedSetRange('navigation:enabled', 0, -1); - const data = await db.getObjects(ids.map(id => `navigation:enabled:${id}`)); - cache = data.filter(Boolean).map((item) => { - if (item.hasOwnProperty('groups')) { - try { - item.groups = JSON.parse(item.groups); - } catch (err) { - winston.error(err.stack); - item.groups = []; - } - } - item.groups = item.groups || []; - if (item.groups && !Array.isArray(item.groups)) { - item.groups = [item.groups]; - } - return item; - }); - admin.escapeFields(cache); - - return cache.map(item => ({ ...item })); +admin.get = function () { + return __awaiter(this, void 0, void 0, function* () { + if (cache) { + return cache.map(item => (Object.assign({}, item))); + } + const ids = yield db.getSortedSetRange('navigation:enabled', 0, -1); + const data = yield db.getObjects(ids.map(id => `navigation:enabled:${id}`)); + cache = data.filter(Boolean).map((item) => { + if (item.hasOwnProperty('groups')) { + try { + item.groups = JSON.parse(item.groups); + } + catch (err) { + winston.error(err.stack); + item.groups = []; + } + } + item.groups = item.groups || []; + if (item.groups && !Array.isArray(item.groups)) { + item.groups = [item.groups]; + } + return item; + }); + admin.escapeFields(cache); + return cache.map(item => (Object.assign({}, item))); + }); }; - -async function getAvailable() { - const core = require('../../install/data/navigation.json').map((item) => { - item.core = true; - item.id = item.id || ''; - return item; - }); - - const navItems = await plugins.hooks.fire('filter:navigation.available', core); - navItems.forEach((item) => { - if (item && !item.hasOwnProperty('enabled')) { - item.enabled = true; - } - }); - return navItems; +function getAvailable() { + return __awaiter(this, void 0, void 0, function* () { + const core = require('../../install/data/navigation.json').map((item) => { + item.core = true; + item.id = item.id || ''; + return item; + }); + const navItems = yield plugins.hooks.fire('filter:navigation.available', core); + navItems.forEach((item) => { + if (item && !item.hasOwnProperty('enabled')) { + item.enabled = true; + } + }); + return navItems; + }); } - require('../promisify')(admin); diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts new file mode 100644 index 0000000000..c643ee7ace --- /dev/null +++ b/src/navigation/admin.ts @@ -0,0 +1,104 @@ + + +const validator = require('validator'); +const winston = require('winston'); + +const plugins = require('../plugins'); +const db = require('../database'); +const pubsub = require('../pubsub'); + +const admin = module.exports; +let cache = null; + +pubsub.on('admin:navigation:save', () => { + cache = null; +}); + +admin.save = async function (data) { + const order = Object.keys(data); + const bulkSet = []; + data.forEach((item, index) => { + item.order = order[index]; + if (item.hasOwnProperty('groups')) { + item.groups = JSON.stringify(item.groups); + } + bulkSet.push([`navigation:enabled:${item.order}`, item]); + }); + + cache = null; + pubsub.publish('admin:navigation:save'); + const ids = await db.getSortedSetRange('navigation:enabled', 0, -1); + await db.deleteAll(ids.map(id => `navigation:enabled:${id}`)); + await db.setObjectBulk(bulkSet); + await db.delete('navigation:enabled'); + await db.sortedSetAdd('navigation:enabled', order, order); +}; + +admin.getAdmin = async function () { + const [enabled, available] = await Promise.all([ + admin.get(), + getAvailable(), + ]); + return { enabled: enabled, available: available }; +}; + +const fieldsToEscape = ['iconClass', 'class', 'route', 'id', 'text', 'textClass', 'title']; + +admin.escapeFields = navItems => toggleEscape(navItems, true); +admin.unescapeFields = navItems => toggleEscape(navItems, false); + +function toggleEscape(navItems, flag) { + navItems.forEach((item) => { + if (item) { + fieldsToEscape.forEach((field) => { + if (item.hasOwnProperty(field)) { + item[field] = validator[flag ? 'escape' : 'unescape'](String(item[field])); + } + }); + } + }); +} + +admin.get = async function () { + if (cache) { + return cache.map(item => ({ ...item })); + } + const ids = await db.getSortedSetRange('navigation:enabled', 0, -1); + const data = await db.getObjects(ids.map(id => `navigation:enabled:${id}`)); + cache = data.filter(Boolean).map((item) => { + if (item.hasOwnProperty('groups')) { + try { + item.groups = JSON.parse(item.groups); + } catch (err) { + winston.error(err.stack); + item.groups = []; + } + } + item.groups = item.groups || []; + if (item.groups && !Array.isArray(item.groups)) { + item.groups = [item.groups]; + } + return item; + }); + admin.escapeFields(cache); + + return cache.map(item => ({ ...item })); +}; + +async function getAvailable() { + const core = require('../../install/data/navigation.json').map((item) => { + item.core = true; + item.id = item.id || ''; + return item; + }); + + const navItems = await plugins.hooks.fire('filter:navigation.available', core); + navItems.forEach((item) => { + if (item && !item.hasOwnProperty('enabled')) { + item.enabled = true; + } + }); + return navItems; +} + +require('../promisify')(admin); From f3c2dfc8533382e9f501f6a030428b02a0664ae5 Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 10:42:30 -0400 Subject: [PATCH 2/9] =?UTF-8?q?Definir=20interfaces=20para=20la=20estructu?= =?UTF-8?q?ra=20de=20los=20items=20de=20navegaci=C3=B3n=20y=20para=20el=20?= =?UTF-8?q?m=C3=B3dulo=20a=20exportar=20"admin"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/navigation/admin.js | 3 ++- src/navigation/admin.ts | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 76e5187170..efabf90654 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -12,7 +12,7 @@ const winston = require('winston'); const plugins = require('../plugins'); const db = require('../database'); const pubsub = require('../pubsub'); -const admin = module.exports; +const admin = {}; let cache = null; pubsub.on('admin:navigation:save', () => { cache = null; @@ -104,3 +104,4 @@ function getAvailable() { }); } require('../promisify')(admin); +module.exports = admin; diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts index c643ee7ace..36fbaf4488 100644 --- a/src/navigation/admin.ts +++ b/src/navigation/admin.ts @@ -7,8 +7,34 @@ const plugins = require('../plugins'); const db = require('../database'); const pubsub = require('../pubsub'); -const admin = module.exports; -let cache = null; + +// Interface for the structure of navigation items +interface NavigationItem { + order?: string; + groups?: string | string[]; + iconClass?: string; + class?: string; + route?: string; + id?: string; + text?: string; + textClass?: string; + title?: string; + core?: boolean; + enabled?: boolean; + [key: string]: string | string[] | boolean | undefined; +} + +// Interface for the Admin +interface Admin { + save: (data: NavigationItem[]) => Promise; + getAdmin: () => Promise<{ enabled: NavigationItem[], available: NavigationItem[] }>; + escapeFields: (navItems: NavigationItem[]) => void; + unescapeFields: (navItems: NavigationItem[]) => void; + get: () => Promise; +} + +const admin: Admin = {} as Admin; +let cache: NavigationItem[] | null = null; pubsub.on('admin:navigation:save', () => { cache = null; @@ -102,3 +128,5 @@ async function getAvailable() { } require('../promisify')(admin); + +module.exports = admin; From e0eade2233d33309c89dea7d6e4f7e549e91d3fb Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 10:47:47 -0400 Subject: [PATCH 3/9] =?UTF-8?q?Usar=20ES6=20en=20las=20importaciones=20de?= =?UTF-8?q?=20m=C3=B3dulos=20y=20funciones?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/navigation/admin.js | 44 ++++++++++++++++++++++++----------------- src/navigation/admin.ts | 19 +++++++++--------- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/navigation/admin.js b/src/navigation/admin.js index efabf90654..2561e8fb37 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -1,3 +1,4 @@ +"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { @@ -7,14 +8,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -const validator = require('validator'); -const winston = require('winston'); -const plugins = require('../plugins'); -const db = require('../database'); -const pubsub = require('../pubsub'); +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +/* eslint-disable import/no-import-module-exports */ +const validator_1 = __importDefault(require("validator")); +const winston_1 = __importDefault(require("winston")); +const plugins_1 = __importDefault(require("../plugins")); +const database_1 = __importDefault(require("../database")); +const pubsub_1 = __importDefault(require("../pubsub")); +const promisify_1 = __importDefault(require("../promisify")); const admin = {}; let cache = null; -pubsub.on('admin:navigation:save', () => { +pubsub_1.default.on('admin:navigation:save', () => { cache = null; }); admin.save = function (data) { @@ -29,12 +36,12 @@ admin.save = function (data) { bulkSet.push([`navigation:enabled:${item.order}`, item]); }); cache = null; - pubsub.publish('admin:navigation:save'); - const ids = yield db.getSortedSetRange('navigation:enabled', 0, -1); - yield db.deleteAll(ids.map(id => `navigation:enabled:${id}`)); - yield db.setObjectBulk(bulkSet); - yield db.delete('navigation:enabled'); - yield db.sortedSetAdd('navigation:enabled', order, order); + pubsub_1.default.publish('admin:navigation:save'); + const ids = yield database_1.default.getSortedSetRange('navigation:enabled', 0, -1); + yield database_1.default.deleteAll(ids.map(id => `navigation:enabled:${id}`)); + yield database_1.default.setObjectBulk(bulkSet); + yield database_1.default.delete('navigation:enabled'); + yield database_1.default.sortedSetAdd('navigation:enabled', order, order); }); }; admin.getAdmin = function () { @@ -54,7 +61,7 @@ function toggleEscape(navItems, flag) { if (item) { fieldsToEscape.forEach((field) => { if (item.hasOwnProperty(field)) { - item[field] = validator[flag ? 'escape' : 'unescape'](String(item[field])); + item[field] = validator_1.default[flag ? 'escape' : 'unescape'](String(item[field])); } }); } @@ -65,15 +72,15 @@ admin.get = function () { if (cache) { return cache.map(item => (Object.assign({}, item))); } - const ids = yield db.getSortedSetRange('navigation:enabled', 0, -1); - const data = yield db.getObjects(ids.map(id => `navigation:enabled:${id}`)); + const ids = yield database_1.default.getSortedSetRange('navigation:enabled', 0, -1); + const data = yield database_1.default.getObjects(ids.map(id => `navigation:enabled:${id}`)); cache = data.filter(Boolean).map((item) => { if (item.hasOwnProperty('groups')) { try { item.groups = JSON.parse(item.groups); } catch (err) { - winston.error(err.stack); + winston_1.default.error(err.stack); item.groups = []; } } @@ -94,7 +101,7 @@ function getAvailable() { item.id = item.id || ''; return item; }); - const navItems = yield plugins.hooks.fire('filter:navigation.available', core); + const navItems = yield plugins_1.default.hooks.fire('filter:navigation.available', core); navItems.forEach((item) => { if (item && !item.hasOwnProperty('enabled')) { item.enabled = true; @@ -103,5 +110,6 @@ function getAvailable() { return navItems; }); } -require('../promisify')(admin); +// eslint-disable-next-line @typescript-eslint/no-unsafe-call +(0, promisify_1.default)(admin); module.exports = admin; diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts index 36fbaf4488..ee10c0deb0 100644 --- a/src/navigation/admin.ts +++ b/src/navigation/admin.ts @@ -1,12 +1,10 @@ - - -const validator = require('validator'); -const winston = require('winston'); - -const plugins = require('../plugins'); -const db = require('../database'); -const pubsub = require('../pubsub'); - +/* eslint-disable import/no-import-module-exports */ +import validator from 'validator'; +import winston from 'winston'; +import plugins from '../plugins'; +import db from '../database'; +import pubsub from '../pubsub'; +import promisify from '../promisify'; // Interface for the structure of navigation items interface NavigationItem { @@ -127,6 +125,7 @@ async function getAvailable() { return navItems; } -require('../promisify')(admin); +// eslint-disable-next-line @typescript-eslint/no-unsafe-call +promisify(admin); module.exports = admin; From e63ab5043efb2c6b41a3c1db20762e63299c9d1c Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 10:50:05 -0400 Subject: [PATCH 4/9] Solucionar los errores de linter que aparece en la funcion admin.save --- src/navigation/admin.js | 5 +++++ src/navigation/admin.ts | 13 +++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 2561e8fb37..194d2a72d5 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -37,10 +37,15 @@ admin.save = function (data) { }); cache = null; pubsub_1.default.publish('admin:navigation:save'); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call const ids = yield database_1.default.getSortedSetRange('navigation:enabled', 0, -1); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call yield database_1.default.deleteAll(ids.map(id => `navigation:enabled:${id}`)); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call yield database_1.default.setObjectBulk(bulkSet); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call yield database_1.default.delete('navigation:enabled'); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call yield database_1.default.sortedSetAdd('navigation:enabled', order, order); }); }; diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts index ee10c0deb0..1b493b9441 100644 --- a/src/navigation/admin.ts +++ b/src/navigation/admin.ts @@ -38,9 +38,9 @@ pubsub.on('admin:navigation:save', () => { cache = null; }); -admin.save = async function (data) { - const order = Object.keys(data); - const bulkSet = []; +admin.save = async function (data: NavigationItem[]): Promise { + const order: string[] = Object.keys(data); + const bulkSet: [string, NavigationItem][] = []; data.forEach((item, index) => { item.order = order[index]; if (item.hasOwnProperty('groups')) { @@ -51,10 +51,15 @@ admin.save = async function (data) { cache = null; pubsub.publish('admin:navigation:save'); - const ids = await db.getSortedSetRange('navigation:enabled', 0, -1); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + const ids = await db.getSortedSetRange('navigation:enabled', 0, -1) as string[]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call await db.deleteAll(ids.map(id => `navigation:enabled:${id}`)); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call await db.setObjectBulk(bulkSet); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call await db.delete('navigation:enabled'); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call await db.sortedSetAdd('navigation:enabled', order, order); }; From 171dc502f967751952e22594787c81a24eebbf46 Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 10:52:50 -0400 Subject: [PATCH 5/9] Reorganizar el orden de las funciones --- src/dummy.js | 0 src/navigation/admin.js | 22 +++++++++++----------- src/navigation/admin.ts | 23 ++++++++++++----------- 3 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 src/dummy.js diff --git a/src/dummy.js b/src/dummy.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 194d2a72d5..79ee3b5a11 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -49,18 +49,7 @@ admin.save = function (data) { yield database_1.default.sortedSetAdd('navigation:enabled', order, order); }); }; -admin.getAdmin = function () { - return __awaiter(this, void 0, void 0, function* () { - const [enabled, available] = yield Promise.all([ - admin.get(), - getAvailable(), - ]); - return { enabled: enabled, available: available }; - }); -}; const fieldsToEscape = ['iconClass', 'class', 'route', 'id', 'text', 'textClass', 'title']; -admin.escapeFields = navItems => toggleEscape(navItems, true); -admin.unescapeFields = navItems => toggleEscape(navItems, false); function toggleEscape(navItems, flag) { navItems.forEach((item) => { if (item) { @@ -72,6 +61,8 @@ function toggleEscape(navItems, flag) { } }); } +admin.escapeFields = navItems => toggleEscape(navItems, true); +admin.unescapeFields = navItems => toggleEscape(navItems, false); admin.get = function () { return __awaiter(this, void 0, void 0, function* () { if (cache) { @@ -115,6 +106,15 @@ function getAvailable() { return navItems; }); } +admin.getAdmin = function () { + return __awaiter(this, void 0, void 0, function* () { + const [enabled, available] = yield Promise.all([ + admin.get(), + getAvailable(), + ]); + return { enabled: enabled, available: available }; + }); +}; // eslint-disable-next-line @typescript-eslint/no-unsafe-call (0, promisify_1.default)(admin); module.exports = admin; diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts index 1b493b9441..be2f539676 100644 --- a/src/navigation/admin.ts +++ b/src/navigation/admin.ts @@ -63,19 +63,8 @@ admin.save = async function (data: NavigationItem[]): Promise { await db.sortedSetAdd('navigation:enabled', order, order); }; -admin.getAdmin = async function () { - const [enabled, available] = await Promise.all([ - admin.get(), - getAvailable(), - ]); - return { enabled: enabled, available: available }; -}; - const fieldsToEscape = ['iconClass', 'class', 'route', 'id', 'text', 'textClass', 'title']; -admin.escapeFields = navItems => toggleEscape(navItems, true); -admin.unescapeFields = navItems => toggleEscape(navItems, false); - function toggleEscape(navItems, flag) { navItems.forEach((item) => { if (item) { @@ -88,6 +77,9 @@ function toggleEscape(navItems, flag) { }); } +admin.escapeFields = navItems => toggleEscape(navItems, true); +admin.unescapeFields = navItems => toggleEscape(navItems, false); + admin.get = async function () { if (cache) { return cache.map(item => ({ ...item })); @@ -130,6 +122,15 @@ async function getAvailable() { return navItems; } +admin.getAdmin = async function () { + const [enabled, available] = await Promise.all([ + admin.get(), + getAvailable(), + ]); + return { enabled: enabled, available: available }; +}; + + // eslint-disable-next-line @typescript-eslint/no-unsafe-call promisify(admin); From 56df927df3c954afbbfefd3c90284c656b7379aa Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 10:54:46 -0400 Subject: [PATCH 6/9] Solucionar los errores de linter que aparecen en la funcion toggleEscape --- src/navigation/admin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts index be2f539676..f2be8cdfdf 100644 --- a/src/navigation/admin.ts +++ b/src/navigation/admin.ts @@ -65,7 +65,7 @@ admin.save = async function (data: NavigationItem[]): Promise { const fieldsToEscape = ['iconClass', 'class', 'route', 'id', 'text', 'textClass', 'title']; -function toggleEscape(navItems, flag) { +function toggleEscape(navItems: NavigationItem[], flag: boolean): void { navItems.forEach((item) => { if (item) { fieldsToEscape.forEach((field) => { From b645aa1c2905cb7f151c4e4eedb4f61ec35675c3 Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 11:00:41 -0400 Subject: [PATCH 7/9] =?UTF-8?q?Mejorar=20el=20manejo=20de=20tipos=20en=20l?= =?UTF-8?q?a=20funci=C3=B3n=20admin.get?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/navigation/admin.js | 9 ++++++++- src/navigation/admin.ts | 16 +++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 79ee3b5a11..146a032632 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -68,7 +68,9 @@ admin.get = function () { if (cache) { return cache.map(item => (Object.assign({}, item))); } + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call const ids = yield database_1.default.getSortedSetRange('navigation:enabled', 0, -1); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call const data = yield database_1.default.getObjects(ids.map(id => `navigation:enabled:${id}`)); cache = data.filter(Boolean).map((item) => { if (item.hasOwnProperty('groups')) { @@ -76,7 +78,12 @@ admin.get = function () { item.groups = JSON.parse(item.groups); } catch (err) { - winston_1.default.error(err.stack); + if (err instanceof Error) { + winston_1.default.error(err.stack); + } + else { + winston_1.default.error('Unknown error', err); + } item.groups = []; } } diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts index f2be8cdfdf..0551de0037 100644 --- a/src/navigation/admin.ts +++ b/src/navigation/admin.ts @@ -80,18 +80,24 @@ function toggleEscape(navItems: NavigationItem[], flag: boolean): void { admin.escapeFields = navItems => toggleEscape(navItems, true); admin.unescapeFields = navItems => toggleEscape(navItems, false); -admin.get = async function () { +admin.get = async function (): Promise { if (cache) { return cache.map(item => ({ ...item })); } - const ids = await db.getSortedSetRange('navigation:enabled', 0, -1); - const data = await db.getObjects(ids.map(id => `navigation:enabled:${id}`)); + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + const ids = await db.getSortedSetRange('navigation:enabled', 0, -1) as string[]; + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call + const data = await db.getObjects(ids.map(id => `navigation:enabled:${id}`)) as NavigationItem[]; cache = data.filter(Boolean).map((item) => { if (item.hasOwnProperty('groups')) { try { - item.groups = JSON.parse(item.groups); + item.groups = JSON.parse(item.groups as string) as string[]; } catch (err) { - winston.error(err.stack); + if (err instanceof Error) { + winston.error(err.stack); + } else { + winston.error('Unknown error', err); + } item.groups = []; } } From 06548975c362e23c8e11649658290868968942ad Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 11:00:39 -0400 Subject: [PATCH 8/9] =?UTF-8?q?Agregar=20soporte=20para=20m=C3=B3dulos=20J?= =?UTF-8?q?SON=20en=20tsconfig?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tsconfig.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index 10aeeef7e6..5fce0e7548 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,13 +5,14 @@ "module": "commonjs", "moduleResolution": "node", "esModuleInterop": true, + "resolveJsonModule": true, }, "include": [ "public/src/**/*", - "src/**/*", + "src/**/*", "test/**/*", ], - "exclude":[ + "exclude": [ "node_modules", ] } \ No newline at end of file From 7627b6fe1a79d4695043f9dd7fda64617d48f633 Mon Sep 17 00:00:00 2001 From: anna-ayn <19-10096@usb.ve> Date: Thu, 10 Oct 2024 11:02:38 -0400 Subject: [PATCH 9/9] Mejorar el manejo de tipos en getAvailable() y usar import para importar el install/data/navigation.JSON --- src/navigation/admin.js | 3 ++- src/navigation/admin.ts | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/navigation/admin.js b/src/navigation/admin.js index 146a032632..851b81f058 100644 --- a/src/navigation/admin.js +++ b/src/navigation/admin.js @@ -19,6 +19,7 @@ const plugins_1 = __importDefault(require("../plugins")); const database_1 = __importDefault(require("../database")); const pubsub_1 = __importDefault(require("../pubsub")); const promisify_1 = __importDefault(require("../promisify")); +const navigation_json_1 = __importDefault(require("../../install/data/navigation.json")); const admin = {}; let cache = null; pubsub_1.default.on('admin:navigation:save', () => { @@ -99,7 +100,7 @@ admin.get = function () { }; function getAvailable() { return __awaiter(this, void 0, void 0, function* () { - const core = require('../../install/data/navigation.json').map((item) => { + const core = navigation_json_1.default.map((item) => { item.core = true; item.id = item.id || ''; return item; diff --git a/src/navigation/admin.ts b/src/navigation/admin.ts index 0551de0037..2ee1aceadf 100644 --- a/src/navigation/admin.ts +++ b/src/navigation/admin.ts @@ -5,6 +5,7 @@ import plugins from '../plugins'; import db from '../database'; import pubsub from '../pubsub'; import promisify from '../promisify'; +import navigationData from '../../install/data/navigation.json'; // Interface for the structure of navigation items interface NavigationItem { @@ -112,14 +113,14 @@ admin.get = async function (): Promise { return cache.map(item => ({ ...item })); }; -async function getAvailable() { - const core = require('../../install/data/navigation.json').map((item) => { +async function getAvailable(): Promise { + const core: NavigationItem[] = navigationData.map((item: NavigationItem) => { item.core = true; item.id = item.id || ''; return item; }); - const navItems = await plugins.hooks.fire('filter:navigation.available', core); + const navItems = await plugins.hooks.fire('filter:navigation.available', core) as NavigationItem[]; navItems.forEach((item) => { if (item && !item.hasOwnProperty('enabled')) { item.enabled = true;