diff --git a/package.json b/package.json index 1c96bb97..91dfe3c8 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,13 @@ ], "type": "module", "exports": { - ".": "./lib/server.js", + ".": { + "default": "./lib/server.js", + "types": "./types/ui5_serve.d.ts" + }, + "./middleware/*": { + "types": "./types/index.d.ts" + }, "./internal/sslUtil": "./lib/sslUtil.js", "./internal/middlewareRepository": "./lib/middleware/middlewareRepository.js", "./internal/MiddlewareManager": "./lib/middleware/MiddlewareManager.js", @@ -141,18 +147,18 @@ "ava": "^5.3.1", "chokidar-cli": "^3.0.0", "cross-env": "^7.0.3", - "depcheck": "^1.4.6", + "depcheck": "^1.4.7", "docdash": "^2.0.2", "eslint": "^8.51.0", "eslint-config-google": "^0.14.0", "eslint-plugin-ava": "^14.0.0", "eslint-plugin-jsdoc": "^46.8.2", - "esmock": "^2.5.5", + "esmock": "^2.5.6", "jsdoc": "^4.0.2", "nyc": "^15.1.0", "open-cli": "^7.2.0", "rimraf": "^5.0.5", - "sinon": "^16.1.0", + "sinon": "^16.1.3", "supertest": "^6.3.3", "tap-xunit": "^2.4.1" } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..bfce1eb8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "esnext", + "noEmit": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "allowSyntheticDefaultImports": true, + "module": "NodeNext", + "moduleResolution": "NodeNext", + }, +} diff --git a/types/MiddlewareParameters.d.ts b/types/MiddlewareParameters.d.ts new file mode 100644 index 00000000..b632f93a --- /dev/null +++ b/types/MiddlewareParameters.d.ts @@ -0,0 +1,35 @@ +import type { MiddlewareUtil } from "./MiddlewareUtil.d.ts"; +import type { TaskUtil } from "@ui5/project/build/helpers/TaskUtil"; + +// Mock some of the types, so it would be easier to follow +declare type ui5_logger_Logger = object +declare type ui5_fs_AbstractReader = object + +// This one should be (eventually) provided globally or as a part of @ui5/project/Specification +declare type availableSpecVersions = "2.0" | "2.2" | "3.0" | "3.2"; + +declare interface MiddlewareParametersBase { + log: ui5_logger_Logger + options: { + configuration?: Record + } + resources: { + all: ui5_fs_AbstractReader + rootProject: ui5_fs_AbstractReader + dependencies: ui5_fs_AbstractReader + }, +} + +declare interface MiddlewareParameters_2_0 extends MiddlewareParametersBase { + middlewareUtil: MiddlewareUtil; +} + +declare interface MiddlewareParameters_2_2 extends MiddlewareParameters_2_0 { + taskUtil: TaskUtil +} + +export declare type MiddlewareParameters = specVersion extends "2.0" + ? MiddlewareParameters_2_0 + : specVersion extends availableSpecVersions + ? MiddlewareParameters_2_2 + : MiddlewareParametersBase diff --git a/types/MiddlewareUtil.d.ts b/types/MiddlewareUtil.d.ts new file mode 100644 index 00000000..3b84b54c --- /dev/null +++ b/types/MiddlewareUtil.d.ts @@ -0,0 +1,35 @@ +// This one should be (eventually) provided globally or as a part of @ui5/project/Specification +declare type availableSpecVersions = "2.0" | "2.2" | "3.0" | "3.2"; + +// Mock some of the types, so it would be easier to follow +declare type ui5_fs_resourceFactory = object +declare type ui5_fs_Resource = object + +declare type MimeInfo = { + type: string + charset: string + contentType: string +}; + +declare class MiddlewareUtil_v2_0 { + resourceFactory: ui5_fs_resourceFactory + getPathname(req: object): string + getMimeInfo(resourcePath: object): MimeInfo +} + +declare class MiddlewareUtil_v3_0 extends MiddlewareUtil_v2_0 { + getDependencies(projectName?: string): string[] + getProject(projectNameOrResource?: string | ui5_fs_Resource) +} + +declare class MiddlewareUtil_v3_2 extends MiddlewareUtil_v3_0 { + someFutureMethod(); +} + +export declare type MiddlewareUtil = specVersion extends "2.0" + ? MiddlewareUtil_v2_0 + : specVersion extends "3.0" | "2.2" + ? MiddlewareUtil_v3_0 + : specVersion extends "3.2" + ? MiddlewareUtil_v3_2 + : never; diff --git a/types/index.d.ts b/types/index.d.ts new file mode 100644 index 00000000..1b12da76 --- /dev/null +++ b/types/index.d.ts @@ -0,0 +1,3 @@ +// Re exporting types from other modules +export type { MiddlewareParameters } from "./MiddlewareParameters.d.ts"; +export type { MiddlewareUtil } from "./MiddlewareUtil.d.ts"; \ No newline at end of file diff --git a/types/ui5_serve.d.ts b/types/ui5_serve.d.ts new file mode 100644 index 00000000..94075ad9 --- /dev/null +++ b/types/ui5_serve.d.ts @@ -0,0 +1,3 @@ +import type { ProjectGraph } from "@ui5/project/graph"; + +export declare function serve(graph: ProjectGraph, configuration: Record): Function;