feat: remove node-fetch
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
"clean": "rimraf dist && rimraf packages/payload/dist",
|
"clean": "rimraf dist && rimraf packages/payload/dist",
|
||||||
"clean:cache": "rimraf node_modules/.cache && rimraf packages/payload/node_modules/.cache",
|
"clean:cache": "rimraf node_modules/.cache && rimraf packages/payload/node_modules/.cache",
|
||||||
"clean:unix": "find . \\( -type d \\( -name node_modules -o -name dist -o -name .cache \\) -o -type f -name tsconfig.tsbuildinfo \\) -exec rm -rf {} +",
|
"clean:unix": "find . \\( -type d \\( -name node_modules -o -name dist -o -name .cache \\) -o -type f -name tsconfig.tsbuildinfo \\) -exec rm -rf {} +",
|
||||||
"dev": "cross-env node ./test/dev.js",
|
"dev": "cross-env node --trace-deprecation ./test/dev.js",
|
||||||
"dev:generate-graphql-schema": "ts-node -T ./test/generateGraphQLSchema.ts",
|
"dev:generate-graphql-schema": "ts-node -T ./test/generateGraphQLSchema.ts",
|
||||||
"dev:generate-types": "ts-node -T ./test/generateTypes.ts",
|
"dev:generate-types": "ts-node -T ./test/generateTypes.ts",
|
||||||
"dev:postgres": "pnpm --filter payload run dev:postgres",
|
"dev:postgres": "pnpm --filter payload run dev:postgres",
|
||||||
@@ -88,7 +88,6 @@
|
|||||||
"minimist": "1.2.8",
|
"minimist": "1.2.8",
|
||||||
"mongodb-memory-server": "^9",
|
"mongodb-memory-server": "^9",
|
||||||
"next": "14.1.1-canary.26",
|
"next": "14.1.1-canary.26",
|
||||||
"node-fetch": "2.6.12",
|
|
||||||
"node-mocks-http": "^1.14.1",
|
"node-mocks-http": "^1.14.1",
|
||||||
"nodemon": "3.0.3",
|
"nodemon": "3.0.3",
|
||||||
"pino": "8.15.0",
|
"pino": "8.15.0",
|
||||||
|
|||||||
@@ -107,7 +107,6 @@
|
|||||||
"graphql": "16.8.1",
|
"graphql": "16.8.1",
|
||||||
"graphql-http": "^1.22.0",
|
"graphql-http": "^1.22.0",
|
||||||
"mini-css-extract-plugin": "1.6.2",
|
"mini-css-extract-plugin": "1.6.2",
|
||||||
"node-fetch": "2.6.12",
|
|
||||||
"nodemon": "3.0.3",
|
"nodemon": "3.0.3",
|
||||||
"object.assign": "4.1.4",
|
"object.assign": "4.1.4",
|
||||||
"object.entries": "1.1.6",
|
"object.entries": "1.1.6",
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ export const getExternalFile = async ({ data, req }: Args): Promise<File> => {
|
|||||||
|
|
||||||
if (typeof url === 'string') {
|
if (typeof url === 'string') {
|
||||||
const fileURL = `${baseUrl}${url}`
|
const fileURL = `${baseUrl}${url}`
|
||||||
const { default: fetch } = (await import('node-fetch')) as any
|
|
||||||
|
|
||||||
const res = await fetch(fileURL, {
|
const res = await fetch(fileURL, {
|
||||||
credentials: 'include',
|
credentials: 'include',
|
||||||
@@ -25,11 +24,11 @@ export const getExternalFile = async ({ data, req }: Args): Promise<File> => {
|
|||||||
|
|
||||||
if (!res.ok) throw new APIError(`Failed to fetch file from ${fileURL}`, res.status)
|
if (!res.ok) throw new APIError(`Failed to fetch file from ${fileURL}`, res.status)
|
||||||
|
|
||||||
const data = await res.buffer()
|
const data = await res.arrayBuffer()
|
||||||
|
|
||||||
return {
|
return {
|
||||||
name: filename,
|
name: filename,
|
||||||
data,
|
data: Buffer.from(data),
|
||||||
mimetype: res.headers.get('content-type') || undefined,
|
mimetype: res.headers.get('content-type') || undefined,
|
||||||
size: Number(res.headers.get('content-length')) || 0,
|
size: Number(res.headers.get('content-length')) || 0,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
/* eslint-disable import/no-extraneous-dependencies */
|
|
||||||
import type express from 'express'
|
import type express from 'express'
|
||||||
import type serveStatic from 'serve-static'
|
import type serveStatic from 'serve-static'
|
||||||
import type { ResizeOptions, Sharp } from 'sharp'
|
import type { ResizeOptions, Sharp } from 'sharp'
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
export { initI18n, t, matchLanguage } from '../utilities/init';
|
|
||||||
export { getTranslation } from '../utilities/getTranslation';
|
|
||||||
export type * from '../types';
|
|
||||||
9
packages/translations/dist/exports/index.js
vendored
9
packages/translations/dist/exports/index.js
vendored
@@ -1,9 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.getTranslation = exports.matchLanguage = exports.t = exports.initI18n = void 0;
|
|
||||||
var init_1 = require("../utilities/init");
|
|
||||||
Object.defineProperty(exports, "initI18n", { enumerable: true, get: function () { return init_1.initI18n; } });
|
|
||||||
Object.defineProperty(exports, "t", { enumerable: true, get: function () { return init_1.t; } });
|
|
||||||
Object.defineProperty(exports, "matchLanguage", { enumerable: true, get: function () { return init_1.matchLanguage; } });
|
|
||||||
var getTranslation_1 = require("../utilities/getTranslation");
|
|
||||||
Object.defineProperty(exports, "getTranslation", { enumerable: true, get: function () { return getTranslation_1.getTranslation; } });
|
|
||||||
42
packages/translations/dist/types.d.ts
vendored
42
packages/translations/dist/types.d.ts
vendored
@@ -1,42 +0,0 @@
|
|||||||
export type Translations = {
|
|
||||||
[language: string]: {
|
|
||||||
$schema: string;
|
|
||||||
} | {
|
|
||||||
[namespace: string]: {
|
|
||||||
[key: string]: string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
export type TFunction = (key: string, options?: Record<string, any>) => string;
|
|
||||||
export type I18n = {
|
|
||||||
/** The fallback language */
|
|
||||||
fallbackLanguage: string;
|
|
||||||
/** The language of the request */
|
|
||||||
language: string;
|
|
||||||
/** Translate function */
|
|
||||||
t: (key: string, options?: Record<string, unknown>) => string;
|
|
||||||
};
|
|
||||||
export type I18nOptions = {
|
|
||||||
fallbackLanguage?: string;
|
|
||||||
supportedLanguages?: string[];
|
|
||||||
translations?: {
|
|
||||||
[language: string]: {
|
|
||||||
$schema: string;
|
|
||||||
} | {
|
|
||||||
[namespace: string]: {
|
|
||||||
[key: string]: string;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
export type InitTFunction = (args: {
|
|
||||||
config: I18nOptions;
|
|
||||||
language?: string;
|
|
||||||
translations?: Translations;
|
|
||||||
}) => TFunction;
|
|
||||||
export type InitI18n = (args: {
|
|
||||||
config: I18nOptions;
|
|
||||||
language?: string;
|
|
||||||
translations: Translations;
|
|
||||||
context: 'api' | 'client';
|
|
||||||
}) => I18n;
|
|
||||||
2
packages/translations/dist/types.js
vendored
2
packages/translations/dist/types.js
vendored
@@ -1,2 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export declare function deepMerge(obj1: any, obj2: any): any;
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.deepMerge = void 0;
|
|
||||||
function deepMerge(obj1, obj2) {
|
|
||||||
const output = { ...obj1 };
|
|
||||||
for (const key in obj2) {
|
|
||||||
if (Object.prototype.hasOwnProperty.call(obj2, key)) {
|
|
||||||
if (typeof obj2[key] === 'object' && !Array.isArray(obj2[key]) && obj1[key]) {
|
|
||||||
output[key] = deepMerge(obj1[key], obj2[key]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
output[key] = obj2[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return output;
|
|
||||||
}
|
|
||||||
exports.deepMerge = deepMerge;
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
export declare function ensureDirectoryExists(directory: any): void;
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.ensureDirectoryExists = void 0;
|
|
||||||
const fs_1 = __importDefault(require("fs"));
|
|
||||||
function ensureDirectoryExists(directory) {
|
|
||||||
try {
|
|
||||||
if (!fs_1.default.existsSync(directory)) {
|
|
||||||
fs_1.default.mkdirSync(directory, { recursive: true });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (error) {
|
|
||||||
console.error(`Error creating directory '${directory}': ${error.message}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.ensureDirectoryExists = ensureDirectoryExists;
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
import type { JSX } from 'react';
|
|
||||||
import { I18n } from '../types';
|
|
||||||
export declare const getTranslation: (label: JSX.Element | Record<string, string> | string, i18n: Pick<I18n, 'fallbackLanguage' | 'language'>) => string;
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.getTranslation = void 0;
|
|
||||||
const getTranslation = (label, i18n) => {
|
|
||||||
if (typeof label === 'object') {
|
|
||||||
if (label[i18n.language]) {
|
|
||||||
return label[i18n.language];
|
|
||||||
}
|
|
||||||
let fallbacks = [];
|
|
||||||
if (typeof i18n.fallbackLanguage === 'string') {
|
|
||||||
fallbacks = [i18n.fallbackLanguage];
|
|
||||||
}
|
|
||||||
else if (Array.isArray(i18n.fallbackLanguage)) {
|
|
||||||
fallbacks = i18n.fallbackLanguage;
|
|
||||||
}
|
|
||||||
const fallbackLang = fallbacks.find((language) => label[language]);
|
|
||||||
return fallbackLang && label[fallbackLang] ? fallbackLang : label[Object.keys(label)[0]];
|
|
||||||
}
|
|
||||||
return label;
|
|
||||||
};
|
|
||||||
exports.getTranslation = getTranslation;
|
|
||||||
30
packages/translations/dist/utilities/init.d.ts
vendored
30
packages/translations/dist/utilities/init.d.ts
vendored
@@ -1,30 +0,0 @@
|
|||||||
import { Translations, InitI18n } from '../types';
|
|
||||||
/**
|
|
||||||
* @function getTranslationString
|
|
||||||
*
|
|
||||||
* Gets a translation string from a translations object
|
|
||||||
*
|
|
||||||
* @returns string
|
|
||||||
*/
|
|
||||||
export declare const getTranslationString: ({ count, key, translations, }: {
|
|
||||||
count?: number;
|
|
||||||
key: string;
|
|
||||||
translations: Translations[0];
|
|
||||||
}) => string;
|
|
||||||
/**
|
|
||||||
* @function t
|
|
||||||
*
|
|
||||||
* Merges config defined translations with translations passed in as an argument
|
|
||||||
* returns a function that can be used to translate a string
|
|
||||||
*
|
|
||||||
* @returns string
|
|
||||||
*/
|
|
||||||
type TFunctionConstructor = ({ key, translations, vars, }: {
|
|
||||||
key: string;
|
|
||||||
translations?: Translations[0];
|
|
||||||
vars?: Record<string, any>;
|
|
||||||
}) => string;
|
|
||||||
export declare const t: TFunctionConstructor;
|
|
||||||
export declare function matchLanguage(header: string): string | undefined;
|
|
||||||
export declare const initI18n: InitI18n;
|
|
||||||
export {};
|
|
||||||
180
packages/translations/dist/utilities/init.js
vendored
180
packages/translations/dist/utilities/init.js
vendored
@@ -1,180 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
exports.initI18n = exports.matchLanguage = exports.t = exports.getTranslationString = void 0;
|
|
||||||
const deepMerge_1 = require("./deepMerge");
|
|
||||||
/**
|
|
||||||
* @function getTranslationString
|
|
||||||
*
|
|
||||||
* Gets a translation string from a translations object
|
|
||||||
*
|
|
||||||
* @returns string
|
|
||||||
*/
|
|
||||||
const getTranslationString = ({ count, key, translations, }) => {
|
|
||||||
const keys = key.split(':');
|
|
||||||
let keySuffix = '';
|
|
||||||
const translation = keys.reduce((acc, key, index) => {
|
|
||||||
if (typeof acc === 'string')
|
|
||||||
return acc;
|
|
||||||
if (typeof count === 'number') {
|
|
||||||
if (count === 0 && `${key}_zero` in acc) {
|
|
||||||
keySuffix = '_zero';
|
|
||||||
}
|
|
||||||
else if (count === 1 && `${key}_one` in acc) {
|
|
||||||
keySuffix = '_one';
|
|
||||||
}
|
|
||||||
else if (count === 2 && `${key}_two` in acc) {
|
|
||||||
keySuffix = '_two';
|
|
||||||
}
|
|
||||||
else if (count > 5 && `${key}_many` in acc) {
|
|
||||||
keySuffix = '_many';
|
|
||||||
}
|
|
||||||
else if (count > 2 && count <= 5 && `${key}_few` in acc) {
|
|
||||||
keySuffix = '_few';
|
|
||||||
}
|
|
||||||
else if (`${key}_other` in acc) {
|
|
||||||
keySuffix = '_other';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let keyToUse = key;
|
|
||||||
if (index === keys.length - 1 && keySuffix) {
|
|
||||||
keyToUse = `${key}${keySuffix}`;
|
|
||||||
}
|
|
||||||
if (acc && keyToUse in acc) {
|
|
||||||
return acc[keyToUse];
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}, translations);
|
|
||||||
if (!translation) {
|
|
||||||
console.log('key not found: ', key);
|
|
||||||
}
|
|
||||||
return translation || key;
|
|
||||||
};
|
|
||||||
exports.getTranslationString = getTranslationString;
|
|
||||||
/**
|
|
||||||
* @function replaceVars
|
|
||||||
*
|
|
||||||
* Replaces variables in a translation string with values from an object
|
|
||||||
*
|
|
||||||
* @returns string
|
|
||||||
*/
|
|
||||||
const replaceVars = ({ translationString, vars, }) => {
|
|
||||||
const parts = translationString.split(/({{.*?}})/);
|
|
||||||
return parts
|
|
||||||
.map((part) => {
|
|
||||||
if (part.startsWith('{{') && part.endsWith('}}')) {
|
|
||||||
const placeholder = part.substring(2, part.length - 2).trim();
|
|
||||||
return vars[placeholder] || part;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return part;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.join('');
|
|
||||||
};
|
|
||||||
const t = ({ key, translations, vars }) => {
|
|
||||||
let translationString = (0, exports.getTranslationString)({
|
|
||||||
count: typeof vars?.count === 'number' ? vars.count : undefined,
|
|
||||||
key,
|
|
||||||
translations,
|
|
||||||
});
|
|
||||||
if (vars) {
|
|
||||||
translationString = replaceVars({
|
|
||||||
translationString,
|
|
||||||
vars,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (!translationString) {
|
|
||||||
translationString = key;
|
|
||||||
}
|
|
||||||
return translationString;
|
|
||||||
};
|
|
||||||
exports.t = t;
|
|
||||||
function parseAcceptLanguage(header) {
|
|
||||||
return header
|
|
||||||
.split(',')
|
|
||||||
.map((lang) => {
|
|
||||||
const [language, quality] = lang.trim().split(';q=');
|
|
||||||
return {
|
|
||||||
language,
|
|
||||||
quality: quality ? parseFloat(quality) : 1,
|
|
||||||
};
|
|
||||||
})
|
|
||||||
.sort((a, b) => b.quality - a.quality); // Sort by quality, highest to lowest
|
|
||||||
}
|
|
||||||
const acceptedLanguages = [
|
|
||||||
'ar',
|
|
||||||
'az',
|
|
||||||
'bg',
|
|
||||||
'cs',
|
|
||||||
'de',
|
|
||||||
'en',
|
|
||||||
'es',
|
|
||||||
'fa',
|
|
||||||
'fr',
|
|
||||||
'hr',
|
|
||||||
'hu',
|
|
||||||
'it',
|
|
||||||
'ja',
|
|
||||||
'ko',
|
|
||||||
'my',
|
|
||||||
'nb',
|
|
||||||
'nl',
|
|
||||||
'pl',
|
|
||||||
'pt',
|
|
||||||
'ro',
|
|
||||||
'rs',
|
|
||||||
'rsLatin',
|
|
||||||
'ru',
|
|
||||||
'sv',
|
|
||||||
'th',
|
|
||||||
'tr',
|
|
||||||
'ua',
|
|
||||||
'vi',
|
|
||||||
'zh',
|
|
||||||
'zhTw',
|
|
||||||
];
|
|
||||||
function matchLanguage(header) {
|
|
||||||
const parsedHeader = parseAcceptLanguage(header);
|
|
||||||
for (const { language } of parsedHeader) {
|
|
||||||
for (const acceptedLanguage of acceptedLanguages) {
|
|
||||||
if (language.startsWith(acceptedLanguage)) {
|
|
||||||
return acceptedLanguage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
exports.matchLanguage = matchLanguage;
|
|
||||||
const initTFunction = (args) => (key, vars) => {
|
|
||||||
const { config, language, translations } = args;
|
|
||||||
const mergedLanguages = (0, deepMerge_1.deepMerge)(config?.translations ?? {}, translations);
|
|
||||||
const languagePreference = matchLanguage(language);
|
|
||||||
return (0, exports.t)({
|
|
||||||
key,
|
|
||||||
translations: mergedLanguages[languagePreference],
|
|
||||||
vars,
|
|
||||||
});
|
|
||||||
};
|
|
||||||
function memoize(fn, keys) {
|
|
||||||
const cacheMap = new Map();
|
|
||||||
return function (args) {
|
|
||||||
const cacheKey = keys.reduce((acc, key) => acc + args[key], '');
|
|
||||||
if (!cacheMap.has(cacheKey)) {
|
|
||||||
const result = fn(args);
|
|
||||||
cacheMap.set(cacheKey, result);
|
|
||||||
}
|
|
||||||
return cacheMap.get(cacheKey);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
exports.initI18n = memoize((({ config, language = 'en', translations, context }) => {
|
|
||||||
const i18n = {
|
|
||||||
fallbackLanguage: config.fallbackLanguage,
|
|
||||||
language: language || config.fallbackLanguage,
|
|
||||||
t: initTFunction({
|
|
||||||
config,
|
|
||||||
language: language || config.fallbackLanguage,
|
|
||||||
translations,
|
|
||||||
}),
|
|
||||||
};
|
|
||||||
return i18n;
|
|
||||||
}), ['language', 'context']);
|
|
||||||
1833
pnpm-lock.yaml
generated
1833
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,4 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
import fetch from 'node-fetch'
|
|
||||||
import qs from 'qs'
|
import qs from 'qs'
|
||||||
|
|
||||||
import type { Config } from '../../packages/payload/src/config/types'
|
import type { Config } from '../../packages/payload/src/config/types'
|
||||||
|
|||||||
Reference in New Issue
Block a user