From 528c7102e24b4413b24fbd69973abcbe3db91da1 Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Sun, 13 Oct 2024 09:23:41 +0200 Subject: [PATCH 1/2] fix(core): remove Configurable, Deprecated,Enumerable, ReadOnly, Writable decorators BREAKING CHANGE: Configurable, Deprecated,Enumerable, ReadOnly, Writable decorators are removed from @tsed/core --- packages/core/package.json | 5 + packages/core/src/index.ts | 11 +-- .../core/src/utils/{ => objects}/uniq.spec.ts | 0 packages/core/src/utils/{ => objects}/uniq.ts | 0 .../core/src/utils/proxyDelegation.spec.ts | 48 ---------- packages/core/src/utils/proxyDelegation.ts | 91 ------------------- .../di/src/common/decorators/configuration.ts | 2 +- packages/di/src/common/fn/configuration.ts | 2 +- packages/di/src/common/fn/injectable.ts | 14 +-- .../interfaces/DIConfigurationOptions.ts | 5 + .../common/services/DIConfiguration.spec.ts | 8 -- .../di/src/common/services/DIConfiguration.ts | 17 +--- packages/graphql/apollo/src/ApolloModule.ts | 6 +- packages/graphql/apollo/vitest.config.mts | 6 +- .../config/services/PlatformConfiguration.ts | 12 +++ .../swagger/src/services/SwaggerService.ts | 13 +-- .../src/services/SocketClientService.ts | 3 +- .../socketio/src/services/SocketIOServer.ts | 16 ++-- .../temporal/src/services/TemporalFactory.ts | 5 +- packages/utils/legacy/package.json | 44 +++++++++ .../src/decorators/configurable.spec.ts | 2 +- .../legacy}/src/decorators/configurable.ts | 2 +- .../legacy}/src/decorators/deprecated.spec.ts | 0 .../legacy}/src/decorators/deprecated.ts | 2 +- .../legacy}/src/decorators/enumerable.spec.ts | 2 +- .../legacy}/src/decorators/enumerable.ts | 2 +- .../legacy}/src/decorators/notConfigurable.ts | 0 .../legacy}/src/decorators/notEnumerable.ts | 0 .../legacy}/src/decorators/readOnly.ts | 0 .../legacy}/src/decorators/writable.spec.ts | 2 +- .../legacy}/src/decorators/writable.ts | 2 +- .../src/utils}/getEnumerableKeys.spec.ts | 6 +- .../legacy/src/utils}/getEnumerableKeys.ts | 4 +- packages/utils/legacy/tsconfig.esm.json | 26 ++++++ packages/utils/legacy/tsconfig.json | 16 ++++ packages/utils/legacy/tsconfig.spec.json | 36 ++++++++ yarn.lock | 19 ++++ 37 files changed, 201 insertions(+), 228 deletions(-) rename packages/core/src/utils/{ => objects}/uniq.spec.ts (100%) rename packages/core/src/utils/{ => objects}/uniq.ts (100%) delete mode 100644 packages/core/src/utils/proxyDelegation.spec.ts delete mode 100644 packages/core/src/utils/proxyDelegation.ts create mode 100644 packages/utils/legacy/package.json rename packages/{core => utils/legacy}/src/decorators/configurable.spec.ts (94%) rename packages/{core => utils/legacy}/src/decorators/configurable.ts (85%) rename packages/{core => utils/legacy}/src/decorators/deprecated.spec.ts (100%) rename packages/{core => utils/legacy}/src/decorators/deprecated.ts (98%) rename packages/{core => utils/legacy}/src/decorators/enumerable.spec.ts (98%) rename packages/{core => utils/legacy}/src/decorators/enumerable.ts (85%) rename packages/{core => utils/legacy}/src/decorators/notConfigurable.ts (100%) rename packages/{core => utils/legacy}/src/decorators/notEnumerable.ts (100%) rename packages/{core => utils/legacy}/src/decorators/readOnly.ts (100%) rename packages/{core => utils/legacy}/src/decorators/writable.spec.ts (80%) rename packages/{core => utils/legacy}/src/decorators/writable.ts (85%) rename packages/{core/src/utils/objects => utils/legacy/src/utils}/getEnumerableKeys.spec.ts (76%) rename packages/{core/src/utils/objects => utils/legacy/src/utils}/getEnumerableKeys.ts (63%) create mode 100644 packages/utils/legacy/tsconfig.esm.json create mode 100644 packages/utils/legacy/tsconfig.json create mode 100644 packages/utils/legacy/tsconfig.spec.json diff --git a/packages/core/package.json b/packages/core/package.json index ce83946852a..fc6e0a9b466 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -14,6 +14,11 @@ "browser": "./lib/browser/core.umd.min.js", "import": "./lib/esm/index.js", "default": "./lib/esm/index.js" + }, + "./**/*.js": { + "types": "./lib/types/**/*.d.ts", + "import": "./lib/esm/**/*.js", + "default": "./lib/esm/**/*.js" } }, "scripts": { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 414440d40c7..2b43b53b410 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,16 +1,9 @@ /** * @file Automatically generated by @tsed/barrels. */ -export * from "./decorators/configurable.js"; -export * from "./decorators/deprecated.js"; -export * from "./decorators/enumerable.js"; -export * from "./decorators/notConfigurable.js"; -export * from "./decorators/notEnumerable.js"; -export * from "./decorators/readOnly.js"; export * from "./decorators/storeFn.js"; export * from "./decorators/storeMerge.js"; export * from "./decorators/storeSet.js"; -export * from "./decorators/writable.js"; export * from "./domain/AnyToPromise.js"; export * from "./domain/DecoratorTypes.js"; export * from "./domain/Env.js"; @@ -45,7 +38,6 @@ export * from "./utils/objects/deepMerge.js"; export * from "./utils/objects/descriptorOf.js"; export * from "./utils/objects/getClassOrSymbol.js"; export * from "./utils/objects/getConstructorArgNames.js"; -export * from "./utils/objects/getEnumerableKeys.js"; export * from "./utils/objects/getValue.js"; export * from "./utils/objects/hasJsonMethod.js"; export * from "./utils/objects/isArray.js"; @@ -82,5 +74,4 @@ export * from "./utils/objects/prototypeOf.js"; export * from "./utils/objects/setValue.js"; export * from "./utils/objects/toMap.js"; export * from "./utils/objects/toStringConstructor.js"; -export * from "./utils/proxyDelegation.js"; -export * from "./utils/uniq.js"; +export * from "./utils/objects/uniq.js"; diff --git a/packages/core/src/utils/uniq.spec.ts b/packages/core/src/utils/objects/uniq.spec.ts similarity index 100% rename from packages/core/src/utils/uniq.spec.ts rename to packages/core/src/utils/objects/uniq.spec.ts diff --git a/packages/core/src/utils/uniq.ts b/packages/core/src/utils/objects/uniq.ts similarity index 100% rename from packages/core/src/utils/uniq.ts rename to packages/core/src/utils/objects/uniq.ts diff --git a/packages/core/src/utils/proxyDelegation.spec.ts b/packages/core/src/utils/proxyDelegation.spec.ts deleted file mode 100644 index 21a9c6ed643..00000000000 --- a/packages/core/src/utils/proxyDelegation.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -import {proxyDelegation} from "./proxyDelegation.js"; - -describe("proxyDelegation", () => { - it("should create proxy delegation with internal map", () => { - class Test { - readonly map: Map = new Map(); - public ownP: string = "test"; - - [key: string]: any; - - constructor() { - return proxyDelegation(this, { - getter(target, property) { - return target.map.get(String(property)); - }, - setter(target, property, value) { - return target.map.set(String(property), value); - }, - remove(target, prop) { - return target.map.delete(String(prop)); - }, - ownKeys(target) { - return [...target.map.keys()]; - } - }); - } - } - - const test = new Test(); - - expect(test).toBeInstanceOf(Test); - expect(test.ownP).toBe("test"); - expect(Object.getOwnPropertyNames(test)).toEqual(["map", "ownP"]); - - test.newProp = "prop"; - - expect(test.newProp).toBe("prop"); - expect(test.newProp).toBe("prop"); - - expect(Object.getOwnPropertyNames(test)).toEqual(["map", "ownP", "newProp"]); - expect("newProp" in test).toBe(true); - expect("ownP" in test).toBe(true); - - delete test.newProp; - - expect(test.newProp).toBeUndefined(); - }); -}); diff --git a/packages/core/src/utils/proxyDelegation.ts b/packages/core/src/utils/proxyDelegation.ts deleted file mode 100644 index 0683509ee3c..00000000000 --- a/packages/core/src/utils/proxyDelegation.ts +++ /dev/null @@ -1,91 +0,0 @@ -import {uniq} from "./uniq.js"; - -/** - * @ignore - */ -export type ProxyDelegationGetter = (target: T, property: PropertyKey) => any | undefined; -/** - * @ignore - */ -export type ProxyDelegationRemove = (target: T, property: PropertyKey) => any; -/** - * @ignore - */ -export type ProxyDelegationSetter = (target: T, property: PropertyKey, value: any, receiver: any) => any; -/** - * @ignore - */ -export type ProxyDelegationOwnKeys = (target: T) => (string | symbol)[]; - -/** - * @ignore - */ -export interface ProxyDelegation { - handlers?: ProxyHandler; - getter?: ProxyDelegationGetter; - setter?: ProxyDelegationSetter; - remove?: ProxyDelegationRemove; - ownKeys?: ProxyDelegationOwnKeys; -} - -/** - * Create a complete and iterable trap. - * @param self - * @param options - * @ignore - */ -export function proxyDelegation(self: any, options: ProxyDelegation = {}) { - const {handlers = {}, remove, ownKeys} = options; - const get: ProxyDelegationGetter = options.getter || ((target: any, propertyKey: PropertyKey) => target.get(propertyKey)); - const set: ProxyDelegationSetter = - options.setter || ((target: any, propertyKey: PropertyKey, value: any) => !!target.set(propertyKey, value)); - - const itsOwnProp = (target: any, p: PropertyKey) => Reflect.has(target, p) || typeof p === "symbol"; - - return new Proxy(self, { - getOwnPropertyDescriptor(target: any, p: PropertyKey): PropertyDescriptor | undefined { - return Reflect.getOwnPropertyDescriptor(target, p); - }, - - has(target: any, p: PropertyKey): boolean { - if (itsOwnProp(target, p)) { - return Reflect.has(target, p); - } - - return get(target, p) !== undefined; - }, - - get(target: any, p: PropertyKey, receiver: any): any { - if (itsOwnProp(target, p)) { - return Reflect.get(target, p, receiver); - } - - return get(target, p); - }, - - set(target: any, p: PropertyKey, value: any, receiver: any): boolean { - if (itsOwnProp(target, p)) { - return Reflect.set(target, p, value, receiver); - } - - return !!set(target, p as any, value, receiver); - }, - - deleteProperty(target: any, p: PropertyKey): boolean { - if (itsOwnProp(target, p) || !remove) { - return Reflect.deleteProperty(target, p); - } - - return remove(target, p); - }, - - defineProperty(target: any, p: PropertyKey, attributes: PropertyDescriptor): boolean { - return Reflect.defineProperty(target, p, attributes); - }, - - ownKeys(target: any) { - return uniq(Reflect.ownKeys(target).concat((ownKeys && ownKeys(target)) || [])); - }, - ...handlers - }); -} diff --git a/packages/di/src/common/decorators/configuration.ts b/packages/di/src/common/decorators/configuration.ts index d43bace5b8b..d4501aef8c3 100644 --- a/packages/di/src/common/decorators/configuration.ts +++ b/packages/di/src/common/decorators/configuration.ts @@ -22,4 +22,4 @@ export function Configuration(configuration: Partial = {}): }; } -export type Configuration = TsED.Configuration & DIConfiguration; +export type Configuration = TsED.DIConfiguration & DIConfiguration; diff --git a/packages/di/src/common/fn/configuration.ts b/packages/di/src/common/fn/configuration.ts index 37ffe9b50ea..67e4b9dff7c 100644 --- a/packages/di/src/common/fn/configuration.ts +++ b/packages/di/src/common/fn/configuration.ts @@ -2,5 +2,5 @@ import {DIConfiguration} from "../services/DIConfiguration.js"; import {injector} from "./injector.js"; export function configuration() { - return injector().settings as TsED.Configuration & DIConfiguration; + return injector().settings as TsED.DIConfiguration & DIConfiguration; } diff --git a/packages/di/src/common/fn/injectable.ts b/packages/di/src/common/fn/injectable.ts index 45bf76e8dbb..77889837bb3 100644 --- a/packages/di/src/common/fn/injectable.ts +++ b/packages/di/src/common/fn/injectable.ts @@ -74,19 +74,7 @@ export function providerBuilder(props: }; } -type PickedProps = - | "scope" - | "path" - | "alias" - | "useFactory" - | "useAsyncFactory" - | "useValue" - | "useClass" - | "hooks" - | "deps" - | "resolvers" - | "imports" - | "configuration"; +type PickedProps = "scope" | "path" | "alias" | "hooks" | "deps" | "resolvers" | "imports" | "configuration"; const Props = ["type", "scope", "path", "alias", "hooks", "deps", "resolvers", "imports", "configuration"]; export const injectable = providerBuilder(Props); diff --git a/packages/di/src/common/interfaces/DIConfigurationOptions.ts b/packages/di/src/common/interfaces/DIConfigurationOptions.ts index 9bd6ce0126c..ddbb8913c74 100644 --- a/packages/di/src/common/interfaces/DIConfigurationOptions.ts +++ b/packages/di/src/common/interfaces/DIConfigurationOptions.ts @@ -8,6 +8,11 @@ declare global { // @ts-ignore interface Context {} + /** + * Here to allow extension on DIConfiguration base service + */ + interface DIConfiguration {} + interface Configuration extends Record { scopes: {[key: string]: ProviderScope}; /** diff --git a/packages/di/src/common/services/DIConfiguration.spec.ts b/packages/di/src/common/services/DIConfiguration.spec.ts index 2579c54c63c..0d231b7b970 100644 --- a/packages/di/src/common/services/DIConfiguration.spec.ts +++ b/packages/di/src/common/services/DIConfiguration.spec.ts @@ -79,12 +79,4 @@ describe("DIConfiguration", () => { expect(configuration.resolvers).toEqual([]); }); }); - - describe("rootDir()", () => { - it("should replace rootDir", () => { - const configuration = new DIConfiguration(); - configuration.set("rootDir", "/root"); - expect(configuration.resolve("${rootDir}")).toEqual("/root"); - }); - }); }); diff --git a/packages/di/src/common/services/DIConfiguration.ts b/packages/di/src/common/services/DIConfiguration.ts index 26c5f5f734b..952dae3c772 100644 --- a/packages/di/src/common/services/DIConfiguration.ts +++ b/packages/di/src/common/services/DIConfiguration.ts @@ -1,4 +1,4 @@ -import {Env, getValue, proxyDelegation, setValue} from "@tsed/core"; +import {Env, getValue, setValue} from "@tsed/core"; import type {ProviderScope} from "../domain/ProviderScope.js"; import type {DILoggerOptions} from "../interfaces/DILoggerOptions.js"; @@ -22,12 +22,6 @@ export class DIConfiguration { }).forEach(([key, value]) => { this.default.set(key, value); }); - - return proxyDelegation(this, { - ownKeys(target) { - return [...target.default.keys(), ...target.map.keys()]; - } - }); } get version() { @@ -152,15 +146,6 @@ export class DIConfiguration { return this.getRaw(propertyKey, defaultValue); } - /** - * - * @param value - * @returns {any} - */ - resolve(value: any) { - return value.replace("${rootDir}", this.rootDir); - } - protected getRaw(propertyKey: string, defaultValue?: any): any { const value = getValue(this.map, propertyKey); diff --git a/packages/graphql/apollo/src/ApolloModule.ts b/packages/graphql/apollo/src/ApolloModule.ts index 826796569a1..5230d0d8c4d 100644 --- a/packages/graphql/apollo/src/ApolloModule.ts +++ b/packages/graphql/apollo/src/ApolloModule.ts @@ -1,6 +1,6 @@ import {Configuration, Inject, InjectorService, Module} from "@tsed/di"; import {Logger} from "@tsed/logger"; -import {AfterListen, OnRoutesInit} from "@tsed/platform-http"; +import {AfterListen, OnRoutesInit, PlatformConfiguration} from "@tsed/platform-http"; import {ApolloSettings} from "./interfaces/ApolloSettings.js"; import {ApolloService} from "./services/ApolloService.js"; @@ -14,7 +14,7 @@ export class ApolloModule implements OnRoutesInit, AfterListen { protected service: ApolloService; @Configuration() - protected configuration: Configuration; + protected configuration: PlatformConfiguration; @Inject(InjectorService) protected injector: InjectorService; @@ -41,7 +41,7 @@ export class ApolloModule implements OnRoutesInit, AfterListen { const host = this.configuration.getBestHost(); const displayLog = (key: string, path: string) => { - const url = typeof host.port === "number" ? `${host.protocol}://${host.address}:${host.port}` : ""; + const url = "port" in host && typeof host.port === "number" ? `${host.protocol}://${host.address}:${host.port}` : ""; this.logger.info(`[${key}] Apollo server is available on ${url}/${path.replace(/^\//, "")}`); }; diff --git a/packages/graphql/apollo/vitest.config.mts b/packages/graphql/apollo/vitest.config.mts index bd61c885886..50e14e36eec 100644 --- a/packages/graphql/apollo/vitest.config.mts +++ b/packages/graphql/apollo/vitest.config.mts @@ -10,12 +10,12 @@ export default defineConfig( coverage: { ...presets.test.coverage, thresholds: { - statements: 83.48, + statements: 83.11, branches: 87.17, functions: 94.11, - lines: 83.48 + lines: 83.11 } } } } -); \ No newline at end of file +); diff --git a/packages/platform/platform-http/src/common/config/services/PlatformConfiguration.ts b/packages/platform/platform-http/src/common/config/services/PlatformConfiguration.ts index cdf0001d1cc..8d8d7ca95b7 100644 --- a/packages/platform/platform-http/src/common/config/services/PlatformConfiguration.ts +++ b/packages/platform/platform-http/src/common/config/services/PlatformConfiguration.ts @@ -143,3 +143,15 @@ export class PlatformConfiguration extends DIConfiguration { }; } } + +declare global { + namespace TsED { + // @ts-ignore + interface Context {} + + /** + * Here to allow extension on DIConfiguration base service + */ + interface DIConfiguration extends PlatformConfiguration {} + } +} diff --git a/packages/specs/swagger/src/services/SwaggerService.ts b/packages/specs/swagger/src/services/SwaggerService.ts index 45ef7cb1ae9..2324fc2f6b3 100644 --- a/packages/specs/swagger/src/services/SwaggerService.ts +++ b/packages/specs/swagger/src/services/SwaggerService.ts @@ -1,5 +1,5 @@ import type {Type} from "@tsed/core"; -import {Configuration, Injectable, InjectorService} from "@tsed/di"; +import {constant, Injectable} from "@tsed/di"; import {OpenSpec2, OpenSpec3} from "@tsed/openspec"; import {Platform} from "@tsed/platform-http"; import {generateSpec} from "@tsed/schema"; @@ -11,11 +11,7 @@ import {includeRoute} from "../utils/includeRoute.js"; export class SwaggerService { #specs: Map = new Map(); - constructor( - private injectorService: InjectorService, - private platform: Platform, - @Configuration() private configuration: Configuration - ) {} + constructor(private platform: Platform) {} /** * Generate Spec for the given configuration @@ -26,8 +22,9 @@ export class SwaggerService { public async getOpenAPISpec(conf: SwaggerSettings): Promise; public async getOpenAPISpec(conf: SwaggerSettings) { if (!this.#specs.has(conf.path)) { - const {version = "1.0.0", acceptMimes} = this.configuration; - const specPath = conf.specPath ? this.configuration.resolve(conf.specPath) : conf.specPath; + const version = constant("version", "1.0.0"); + const acceptMimes = constant("acceptMimes"); + const specPath = conf.specPath; const tokens = this.platform .getMountedControllers() diff --git a/packages/third-parties/socketio-testing/src/services/SocketClientService.ts b/packages/third-parties/socketio-testing/src/services/SocketClientService.ts index d6b78d31806..567aae2e47b 100644 --- a/packages/third-parties/socketio-testing/src/services/SocketClientService.ts +++ b/packages/third-parties/socketio-testing/src/services/SocketClientService.ts @@ -1,11 +1,12 @@ import {Configuration, Inject, Injectable, OnDestroy} from "@tsed/di"; import {Logger} from "@tsed/logger"; +import {PlatformConfiguration} from "@tsed/platform-http"; import {io, Socket} from "socket.io-client"; @Injectable() export class SocketClientService implements OnDestroy { @Configuration() - private settings: Configuration; + private settings: PlatformConfiguration; @Inject() private logger: Logger; diff --git a/packages/third-parties/socketio/src/services/SocketIOServer.ts b/packages/third-parties/socketio/src/services/SocketIOServer.ts index 07e46b8b4e0..4462e8971bd 100644 --- a/packages/third-parties/socketio/src/services/SocketIOServer.ts +++ b/packages/third-parties/socketio/src/services/SocketIOServer.ts @@ -1,17 +1,15 @@ -import {Configuration, registerProvider} from "@tsed/di"; -import {Server} from "socket.io"; +import {constant, injectable} from "@tsed/di"; +import {Server, type ServerOptions} from "socket.io"; export type SocketIOServer = Server; // tslint:disable-next-line: variable-name export const SocketIOServer = Server; -export {Server}; +injectable(Server).factory(() => { + const socketIO = constant>("socketIO"); -registerProvider({ - provide: Server, - deps: [Configuration], - useFactory(config: Configuration) { - return new Server(config.socketIO); - } + return new Server(socketIO); }); + +export {Server}; diff --git a/packages/third-parties/temporal/src/services/TemporalFactory.ts b/packages/third-parties/temporal/src/services/TemporalFactory.ts index cdd0d12608b..0db9161a6b8 100644 --- a/packages/third-parties/temporal/src/services/TemporalFactory.ts +++ b/packages/third-parties/temporal/src/services/TemporalFactory.ts @@ -12,7 +12,8 @@ registerProvider({ provide: TemporalConnection, deps: [Configuration, Logger], async useAsyncFactory(settings: Configuration, logger: Logger) { - const {temporal} = settings; + const temporal = settings.get("temporal"); + if (!temporal?.enabled) { return null; } @@ -33,7 +34,7 @@ registerProvider({ provide: TemporalClient, deps: [Configuration, TemporalConnection], useFactory(settings: Configuration, connection: TemporalConnection) { - const {temporal} = settings; + const temporal = settings.get("temporal"); if (!temporal?.enabled) { return null; } diff --git a/packages/utils/legacy/package.json b/packages/utils/legacy/package.json new file mode 100644 index 00000000000..67008c9843f --- /dev/null +++ b/packages/utils/legacy/package.json @@ -0,0 +1,44 @@ +{ + "name": "@tsed/legacy", + "description": "Core module for Ts.ED Framework", + "type": "module", + "private": true, + "version": "8.0.0-beta.5", + "source": "./src/index.ts", + "main": "./lib/esm/index.js", + "module": "./lib/esm/index.js", + "typings": "./lib/types/index.d.ts", + "browser": "./lib/browser/core.umd.min.js", + "exports": { + ".": { + "types": "./lib/types/index.d.ts", + "browser": "./lib/browser/core.umd.min.js", + "import": "./lib/esm/index.js", + "default": "./lib/esm/index.js" + } + }, + "scripts": { + "build": "yarn barrels && yarn build:ts && yarn run build:browser", + "barrels": "barrels", + "build:browser": "webpack", + "build:ts": "tsc --build tsconfig.json", + "test": "vitest run", + "test:ci": "vitest run --coverage.thresholds.autoUpdate=true" + }, + "dependencies": { + "reflect-metadata": "^0.2.2", + "tslib": "2.7.0" + }, + "devDependencies": { + "@tsed/barrels": "workspace:*", + "@tsed/monorepo-utils": "2.3.5", + "@tsed/typescript": "workspace:*", + "@tsed/vitest": "workspace:*", + "@vitest/coverage-v8": "^2.1.2", + "eslint": "9.12.0", + "typescript": "5.4.5", + "vite": "^5.4.8", + "vitest": "2.1.2", + "webpack": "^5.75.0" + } +} diff --git a/packages/core/src/decorators/configurable.spec.ts b/packages/utils/legacy/src/decorators/configurable.spec.ts similarity index 94% rename from packages/core/src/decorators/configurable.spec.ts rename to packages/utils/legacy/src/decorators/configurable.spec.ts index fa85f40277d..33dfb1c3e86 100644 --- a/packages/core/src/decorators/configurable.spec.ts +++ b/packages/utils/legacy/src/decorators/configurable.spec.ts @@ -1,4 +1,4 @@ -import {Configurable, descriptorOf, NotConfigurable} from "../../src/index.js"; +import {Configurable, descriptorOf, NotConfigurable} from "../../../../core/src/index.js"; class Test { test: string; diff --git a/packages/core/src/decorators/configurable.ts b/packages/utils/legacy/src/decorators/configurable.ts similarity index 85% rename from packages/core/src/decorators/configurable.ts rename to packages/utils/legacy/src/decorators/configurable.ts index 0f4f5413f12..bf8e913f52c 100644 --- a/packages/core/src/decorators/configurable.ts +++ b/packages/utils/legacy/src/decorators/configurable.ts @@ -1,4 +1,4 @@ -import {descriptorOf} from "../utils/objects/descriptorOf.js"; +import {descriptorOf} from "@tsed/core"; export function Configurable(value: boolean = true): Function { return (target: any, propertyKey: string) => { diff --git a/packages/core/src/decorators/deprecated.spec.ts b/packages/utils/legacy/src/decorators/deprecated.spec.ts similarity index 100% rename from packages/core/src/decorators/deprecated.spec.ts rename to packages/utils/legacy/src/decorators/deprecated.spec.ts diff --git a/packages/core/src/decorators/deprecated.ts b/packages/utils/legacy/src/decorators/deprecated.ts similarity index 98% rename from packages/core/src/decorators/deprecated.ts rename to packages/utils/legacy/src/decorators/deprecated.ts index 975cdbd222a..751bd005072 100644 --- a/packages/core/src/decorators/deprecated.ts +++ b/packages/utils/legacy/src/decorators/deprecated.ts @@ -1,4 +1,4 @@ -import {Type} from "../domain/Type.js"; +import {Type} from "@tsed/core"; function deprecate(fn: any, msg: string) { if (typeof process !== "undefined" && (process as any).noDeprecation === true) { diff --git a/packages/core/src/decorators/enumerable.spec.ts b/packages/utils/legacy/src/decorators/enumerable.spec.ts similarity index 98% rename from packages/core/src/decorators/enumerable.spec.ts rename to packages/utils/legacy/src/decorators/enumerable.spec.ts index 82fb333aca7..427b319c00d 100644 --- a/packages/core/src/decorators/enumerable.spec.ts +++ b/packages/utils/legacy/src/decorators/enumerable.spec.ts @@ -1,4 +1,4 @@ -import {Enumerable, getEnumerableKeys, NotEnumerable} from "../../src/index.js"; +import {Enumerable, getEnumerableKeys, NotEnumerable} from "../../../../core/src/index.js"; class Test1 { test: string = "test"; diff --git a/packages/core/src/decorators/enumerable.ts b/packages/utils/legacy/src/decorators/enumerable.ts similarity index 85% rename from packages/core/src/decorators/enumerable.ts rename to packages/utils/legacy/src/decorators/enumerable.ts index b67d4124fc6..f519686f121 100644 --- a/packages/core/src/decorators/enumerable.ts +++ b/packages/utils/legacy/src/decorators/enumerable.ts @@ -1,4 +1,4 @@ -import {descriptorOf} from "../utils/objects/descriptorOf.js"; +import {descriptorOf} from "@tsed/core"; export function Enumerable(value: boolean = true): Function { return (target: any, propertyKey: string) => { diff --git a/packages/core/src/decorators/notConfigurable.ts b/packages/utils/legacy/src/decorators/notConfigurable.ts similarity index 100% rename from packages/core/src/decorators/notConfigurable.ts rename to packages/utils/legacy/src/decorators/notConfigurable.ts diff --git a/packages/core/src/decorators/notEnumerable.ts b/packages/utils/legacy/src/decorators/notEnumerable.ts similarity index 100% rename from packages/core/src/decorators/notEnumerable.ts rename to packages/utils/legacy/src/decorators/notEnumerable.ts diff --git a/packages/core/src/decorators/readOnly.ts b/packages/utils/legacy/src/decorators/readOnly.ts similarity index 100% rename from packages/core/src/decorators/readOnly.ts rename to packages/utils/legacy/src/decorators/readOnly.ts diff --git a/packages/core/src/decorators/writable.spec.ts b/packages/utils/legacy/src/decorators/writable.spec.ts similarity index 80% rename from packages/core/src/decorators/writable.spec.ts rename to packages/utils/legacy/src/decorators/writable.spec.ts index 0b6c933a07e..5a42e551df0 100644 --- a/packages/core/src/decorators/writable.spec.ts +++ b/packages/utils/legacy/src/decorators/writable.spec.ts @@ -1,4 +1,4 @@ -import {descriptorOf, Readonly, Writable} from "../../src/index.js"; +import {descriptorOf, Readonly, Writable} from "../../../../core/src/index.js"; class Test {} diff --git a/packages/core/src/decorators/writable.ts b/packages/utils/legacy/src/decorators/writable.ts similarity index 85% rename from packages/core/src/decorators/writable.ts rename to packages/utils/legacy/src/decorators/writable.ts index beb9aaee220..90b92105ab4 100644 --- a/packages/core/src/decorators/writable.ts +++ b/packages/utils/legacy/src/decorators/writable.ts @@ -1,4 +1,4 @@ -import {descriptorOf} from "../utils/objects/descriptorOf.js"; +import {descriptorOf} from "@tsed/core"; export function Writable(value: boolean = true): Function { return (target: any, propertyKey: string) => { diff --git a/packages/core/src/utils/objects/getEnumerableKeys.spec.ts b/packages/utils/legacy/src/utils/getEnumerableKeys.spec.ts similarity index 76% rename from packages/core/src/utils/objects/getEnumerableKeys.spec.ts rename to packages/utils/legacy/src/utils/getEnumerableKeys.spec.ts index b25f7eac5cf..6217dc1bc5c 100644 --- a/packages/core/src/utils/objects/getEnumerableKeys.spec.ts +++ b/packages/utils/legacy/src/utils/getEnumerableKeys.spec.ts @@ -1,13 +1,9 @@ -import {Enumerable} from "../../decorators/enumerable.js"; import {getEnumerableKeys} from "./getEnumerableKeys.js"; describe("getEnumerableKeys", () => { it("should return enumerable keys", () => { class Test { - @Enumerable(true) test: string; - - @Enumerable(false) test2: string; constructor() { @@ -16,7 +12,7 @@ describe("getEnumerableKeys", () => { } } - expect(getEnumerableKeys(new Test())).toEqual(["test"]); + expect(getEnumerableKeys(new Test())).toEqual(["test", "test2"]); }); it("should return enumerable keys (security test)", () => { const obj = JSON.parse('{"__proto__": {"a": "vulnerable"}, "test": "test"}'); diff --git a/packages/core/src/utils/objects/getEnumerableKeys.ts b/packages/utils/legacy/src/utils/getEnumerableKeys.ts similarity index 63% rename from packages/core/src/utils/objects/getEnumerableKeys.ts rename to packages/utils/legacy/src/utils/getEnumerableKeys.ts index 87d81d382d6..48288723a06 100644 --- a/packages/core/src/utils/objects/getEnumerableKeys.ts +++ b/packages/utils/legacy/src/utils/getEnumerableKeys.ts @@ -1,5 +1,5 @@ -import {isEnumerable} from "./isEnumerable.js"; -import {isProtectedKey} from "./isProtectedKey.js"; +import {isEnumerable} from "../../../../core/src/utils/objects/isEnumerable.js"; +import {isProtectedKey} from "../../../../core/src/utils/objects/isProtectedKey.js"; /** * Return all enumerable keys of the given object diff --git a/packages/utils/legacy/tsconfig.esm.json b/packages/utils/legacy/tsconfig.esm.json new file mode 100644 index 00000000000..ccf3df0d458 --- /dev/null +++ b/packages/utils/legacy/tsconfig.esm.json @@ -0,0 +1,26 @@ +{ + "extends": "@tsed/typescript/tsconfig.node.json", + "compilerOptions": { + "baseUrl": "./", + "rootDir": "src", + "outDir": "./lib/esm", + "declarationDir": "./lib/types", + "declaration": true, + "composite": true, + "noEmit": false + }, + "include": ["src/**/*.ts", "src/**/*.json"], + "exclude": [ + "node_modules", + "test", + "lib", + "benchmark", + "coverage", + "spec", + "**/*.benchmark.ts", + "**/*.spec.ts", + "keys", + "**/__mock__/**", + "webpack.config.js" + ] +} diff --git a/packages/utils/legacy/tsconfig.json b/packages/utils/legacy/tsconfig.json new file mode 100644 index 00000000000..cbf69c6b937 --- /dev/null +++ b/packages/utils/legacy/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsed/typescript/tsconfig.node.json", + "compilerOptions": { + "baseUrl": "./", + "noEmit": true + }, + "include": [], + "references": [ + { + "path": "./tsconfig.esm.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/utils/legacy/tsconfig.spec.json b/packages/utils/legacy/tsconfig.spec.json new file mode 100644 index 00000000000..ec7db70b9d8 --- /dev/null +++ b/packages/utils/legacy/tsconfig.spec.json @@ -0,0 +1,36 @@ +{ + "extends": "@tsed/typescript/tsconfig.node.json", + "compilerOptions": { + "baseUrl": "./", + "rootDir": "..", + "declaration": false, + "composite": false, + "noEmit": true, + "paths": { + "@tsed/openspec": ["../specs/openspec/src/index.ts"], + "@tsed/schema": ["../specs/schema/src/index.ts"], + "@tsed/di": ["../di/src/index.ts"], + "@tsed/exceptions": ["../specs/exceptions/src/index.ts"], + "@tsed/json-mapper": ["../specs/json-mapper/src/index.ts"], + "@tsed/platform-exceptions": ["../platform/platform-exceptions/src/index.ts"], + "@tsed/platform-middlewares": ["../platform/platform-middlewares/src/index.ts"], + "@tsed/platform-params": ["../platform/platform-params/src/index.ts"], + "@tsed/platform-log-middleware": ["../platform/platform-log-middleware/src/index.ts"], + "@tsed/platform-response-filter": ["../platform/platform-response-filter/src/index.ts"], + "@tsed/platform-router": ["../platform/platform-router/src/index.ts"], + "@tsed/platform-views": ["../platform/platform-views/src/index.ts"], + "@tsed/normalize-path": ["../utils/normalize-path/src/index.ts"], + "@tsed/components-scan": ["../third-parties/components-scan/src/index.ts"], + "@tsed/platform-http": ["../platform/platform-http/src/common/index.ts"], + "@tsed/ajv": ["../specs/ajv/src/index.ts"], + "@tsed/platform-cache": ["../platform/platform-cache/src/index.ts"], + "@tsed/swagger": ["../specs/swagger/src/index.ts"], + "@tsed/platform-test-sdk": ["../platform/platform-test-sdk/src/index.ts"], + "@tsed/platform-express": ["../platform/platform-express/src/index.ts"], + "@tsed/platform-koa": ["../platform/platform-koa/src/index.ts"] + }, + "types": ["vite/client", "vitest/globals"] + }, + "include": ["src/**/*.spec.ts", "test/**/*.spec.ts", "vitest.config.mts"], + "exclude": ["node_modules", "lib", "benchmark", "coverage"] +} diff --git a/yarn.lock b/yarn.lock index 8011d9825ca..48eed7c0d25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7066,6 +7066,25 @@ __metadata: languageName: unknown linkType: soft +"@tsed/legacy@workspace:packages/utils/legacy": + version: 0.0.0-use.local + resolution: "@tsed/legacy@workspace:packages/utils/legacy" + dependencies: + "@tsed/barrels": "workspace:*" + "@tsed/monorepo-utils": "npm:2.3.5" + "@tsed/typescript": "workspace:*" + "@tsed/vitest": "workspace:*" + "@vitest/coverage-v8": "npm:^2.1.2" + eslint: "npm:9.12.0" + reflect-metadata: "npm:^0.2.2" + tslib: "npm:2.7.0" + typescript: "npm:5.4.5" + vite: "npm:^5.4.8" + vitest: "npm:2.1.2" + webpack: "npm:^5.75.0" + languageName: unknown + linkType: soft + "@tsed/logger-file@npm:^6.7.8": version: 6.7.8 resolution: "@tsed/logger-file@npm:6.7.8" From 65507cbeae82951012006562ad6f4613bb2c9a3e Mon Sep 17 00:00:00 2001 From: Romain Lenzotti Date: Thu, 17 Oct 2024 07:16:11 +0200 Subject: [PATCH 2/2] fix(common): re-export schema decorators from @tsed/common to maintain compatibility with v7 --- packages/platform/common/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/platform/common/src/index.ts b/packages/platform/common/src/index.ts index 6e6cf14be4e..8d11e5f8e5d 100644 --- a/packages/platform/common/src/index.ts +++ b/packages/platform/common/src/index.ts @@ -10,3 +10,4 @@ export * from "@tsed/platform-middlewares"; export * from "@tsed/platform-params"; export * from "@tsed/platform-response-filter"; export * from "@tsed/platform-router"; +export {AcceptMime, All, Delete, Get, Head, Location, Options, Patch, Post, Put, Redirect, View} from "@tsed/schema";