@thestarweb/star-framework-app-web 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/dist/browser/index.js +8 -0
  2. package/dist/browser/index.js.map +1 -0
  3. package/dist/cli/dev-server.js +64 -0
  4. package/dist/cli/dev-server.js.map +1 -0
  5. package/dist/cli/index.js +117 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/cli/types.js +2 -0
  8. package/dist/cli/types.js.map +1 -0
  9. package/dist/cli-helper.js +2 -0
  10. package/dist/cli-helper.js.map +1 -0
  11. package/dist/index.js +14 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/interceptor/index.js +26 -0
  14. package/dist/interceptor/index.js.map +1 -0
  15. package/dist/interceptor/middleware-to-interceptor/index.js +32 -0
  16. package/dist/interceptor/middleware-to-interceptor/index.js.map +1 -0
  17. package/dist/interceptor/middleware-to-interceptor/mock-res.js +241 -0
  18. package/dist/interceptor/middleware-to-interceptor/mock-res.js.map +1 -0
  19. package/dist/interceptor/middleware-to-interceptor/mook-req.js +180 -0
  20. package/dist/interceptor/middleware-to-interceptor/mook-req.js.map +1 -0
  21. package/dist/interceptor/types.js +6 -0
  22. package/dist/interceptor/types.js.map +1 -0
  23. package/dist/params/index.js +10 -0
  24. package/dist/params/index.js.map +1 -0
  25. package/dist/request/index.js +46 -0
  26. package/dist/request/index.js.map +1 -0
  27. package/dist/return-types/index.js +2 -0
  28. package/dist/return-types/index.js.map +1 -0
  29. package/dist/return-types/response-with-meta.js +25 -0
  30. package/dist/return-types/response-with-meta.js.map +1 -0
  31. package/dist/route/index.js +20 -0
  32. package/dist/route/index.js.map +1 -0
  33. package/dist/route/types.js +17 -0
  34. package/dist/route/types.js.map +1 -0
  35. package/dist/runtime/index.js +84 -0
  36. package/dist/runtime/index.js.map +1 -0
  37. package/dist/runtime/type.js +11 -0
  38. package/dist/runtime/type.js.map +1 -0
  39. package/dist/server/body/helper.js +118 -0
  40. package/dist/server/body/helper.js.map +1 -0
  41. package/dist/server/body/json.js +211 -0
  42. package/dist/server/body/json.js.map +1 -0
  43. package/dist/server/body/types.js +6 -0
  44. package/dist/server/body/types.js.map +1 -0
  45. package/dist/server/dump-api-type.js +59 -0
  46. package/dist/server/dump-api-type.js.map +1 -0
  47. package/dist/server/index.js +103 -0
  48. package/dist/server/index.js.map +1 -0
  49. package/dist/server/types.js +8 -0
  50. package/dist/server/types.js.map +1 -0
  51. package/dist/server/utils/pass-through-readable.js +13 -0
  52. package/dist/server/utils/pass-through-readable.js.map +1 -0
  53. package/dist/view/const.js +2 -0
  54. package/dist/view/const.js.map +1 -0
  55. package/dist/view/data-context/conetext.js +70 -0
  56. package/dist/view/data-context/conetext.js.map +1 -0
  57. package/dist/view/data-context/index.js +13 -0
  58. package/dist/view/data-context/index.js.map +1 -0
  59. package/dist/view/html/create-element.js +20 -0
  60. package/dist/view/html/create-element.js.map +1 -0
  61. package/dist/view/html/index.js +4 -0
  62. package/dist/view/html/index.js.map +1 -0
  63. package/dist/view/html/parse-html-to-v-dom.js +317 -0
  64. package/dist/view/html/parse-html-to-v-dom.js.map +1 -0
  65. package/dist/view/html/render-v-dom-to-string.js +46 -0
  66. package/dist/view/html/render-v-dom-to-string.js.map +1 -0
  67. package/dist/view/html/types.js +21 -0
  68. package/dist/view/html/types.js.map +1 -0
  69. package/dist/view/index.js +7 -0
  70. package/dist/view/index.js.map +1 -0
  71. package/dist/view/layout.js +24 -0
  72. package/dist/view/layout.js.map +1 -0
  73. package/dist/view/render/html-render.js +21 -0
  74. package/dist/view/render/html-render.js.map +1 -0
  75. package/dist/view/render/index.js +3 -0
  76. package/dist/view/render/index.js.map +1 -0
  77. package/dist/view/render/render.js +183 -0
  78. package/dist/view/render/render.js.map +1 -0
  79. package/dist/view/render/sf-v-dom-render.js +40 -0
  80. package/dist/view/render/sf-v-dom-render.js.map +1 -0
  81. package/dist/view/types.js +10 -0
  82. package/dist/view/types.js.map +1 -0
  83. package/dist/view/utils/find-route-dom.js +22 -0
  84. package/dist/view/utils/find-route-dom.js.map +1 -0
  85. package/dist/view/utils/get-render/client.js +77 -0
  86. package/dist/view/utils/get-render/client.js.map +1 -0
  87. package/dist/view/utils/get-render/common.js +87 -0
  88. package/dist/view/utils/get-render/common.js.map +1 -0
  89. package/dist/view/utils/get-render/index.js +4 -0
  90. package/dist/view/utils/get-render/index.js.map +1 -0
  91. package/dist/view/utils/get-render/server.js +60 -0
  92. package/dist/view/utils/get-render/server.js.map +1 -0
  93. package/dist/view/utils/index.js +3 -0
  94. package/dist/view/utils/index.js.map +1 -0
  95. package/dist/view/view.js +10 -0
  96. package/dist/view/view.js.map +1 -0
  97. package/package.json +41 -0
  98. package/resource/default-index.html +11 -0
  99. package/src/browser/index.ts +7 -0
  100. package/src/cli/dev-server.ts +66 -0
  101. package/src/cli/index.ts +122 -0
  102. package/src/cli/types.ts +7 -0
  103. package/src/cli-helper.ts +5 -0
  104. package/src/index.ts +24 -0
  105. package/src/interceptor/index.ts +26 -0
  106. package/src/interceptor/middleware-to-interceptor/index.ts +29 -0
  107. package/src/interceptor/middleware-to-interceptor/mock-res.ts +255 -0
  108. package/src/interceptor/middleware-to-interceptor/mook-req.ts +218 -0
  109. package/src/interceptor/types.ts +7 -0
  110. package/src/params/index.ts +12 -0
  111. package/src/request/index.ts +65 -0
  112. package/src/return-types/index.ts +1 -0
  113. package/src/return-types/response-with-meta.ts +17 -0
  114. package/src/route/index.ts +43 -0
  115. package/src/route/types.ts +11 -0
  116. package/src/server/body/helper.ts +110 -0
  117. package/src/server/body/json.ts +217 -0
  118. package/src/server/body/types.ts +6 -0
  119. package/src/server/dump-api-type.ts +64 -0
  120. package/src/server/index.ts +113 -0
  121. package/src/server/types.ts +11 -0
  122. package/src/server/utils/pass-through-readable.ts +10 -0
  123. package/src/view/const.ts +1 -0
  124. package/src/view/data-context/conetext.ts +59 -0
  125. package/src/view/data-context/index.ts +18 -0
  126. package/src/view/html/create-element.ts +20 -0
  127. package/src/view/html/index.ts +3 -0
  128. package/src/view/html/parse-html-to-v-dom.ts +348 -0
  129. package/src/view/html/render-v-dom-to-string.ts +79 -0
  130. package/src/view/html/types.ts +32 -0
  131. package/src/view/index.ts +6 -0
  132. package/src/view/layout.ts +20 -0
  133. package/src/view/render/html-render.ts +21 -0
  134. package/src/view/render/index.ts +2 -0
  135. package/src/view/render/render.ts +225 -0
  136. package/src/view/render/sf-v-dom-render.ts +34 -0
  137. package/src/view/types.ts +18 -0
  138. package/src/view/utils/find-route-dom.ts +19 -0
  139. package/src/view/utils/get-render/client.ts +76 -0
  140. package/src/view/utils/get-render/common.ts +113 -0
  141. package/src/view/utils/get-render/index.ts +3 -0
  142. package/src/view/utils/get-render/server.ts +71 -0
  143. package/src/view/utils/index.ts +2 -0
  144. package/src/view/view.ts +7 -0
  145. package/test/body.test.ts +29 -0
  146. package/tsconfig.build.json +9 -0
  147. package/tsconfig.json +8 -0
@@ -0,0 +1,66 @@
1
+ import {
2
+ getEnvironmentName,
3
+ type SFDevHook,
4
+ } from "@thestarweb/star-framework-cli";
5
+ import { addInterceptor, Interceptor } from "../interceptor/index.js";
6
+ import { middlewareToInterceptor } from "../interceptor/index.js";
7
+
8
+ import type { ViteDevServer } from "vite";
9
+ import {
10
+ createHttpServer,
11
+ ParsedPackage,
12
+ } from "@thestarweb/star-framework-web-runtime-node";
13
+ import { dumpRouteType } from "../server/dump-api-type.js";
14
+ import { join } from "path";
15
+
16
+ export function devServer(html: string): SFDevHook {
17
+ let server: Awaited<ReturnType<typeof createHttpServer>>;
18
+ let viteInterceptor: Interceptor;
19
+ let _vite: ViteDevServer;
20
+ const context = {
21
+ root: process.cwd(),
22
+ static: "",
23
+ indexHtml: html,
24
+ };
25
+ const ins: ParsedPackage = {
26
+ ...context,
27
+ instances: undefined as any,
28
+ };
29
+ const devInterceptor: Interceptor = (req, next) => {
30
+ return viteInterceptor(req, next);
31
+ };
32
+ function handleIns(obj: any) {
33
+ addInterceptor(devInterceptor, obj._rawObject);
34
+ const file = join(process.cwd(), "./route-type.ts");
35
+ _vite?.watcher.unwatch(file);
36
+ dumpRouteType(file, obj._rawObject);
37
+ return obj;
38
+ }
39
+ return {
40
+ async onViteServerInited(vite) {
41
+ viteInterceptor = middlewareToInterceptor(vite.middlewares);
42
+ // TODO 暂时像用这种“硬核”方式让middlewares使用特定环境
43
+ vite.environments.client =
44
+ vite.environments[getEnvironmentName("sf-web", "browser")];
45
+ _vite = vite;
46
+ context.indexHtml = await vite.transformIndexHtml("index.html", html);
47
+ },
48
+ async start(main) {
49
+ ins.instances = handleIns(main(context));
50
+ server = await createHttpServer({
51
+ instances: [
52
+ {
53
+ package: ins,
54
+ },
55
+ ],
56
+ port: 3000,
57
+ });
58
+ },
59
+ async hotReload(main) {
60
+ if (server) {
61
+ ins.instances = handleIns(main(context));
62
+ console.log("hot updated");
63
+ }
64
+ },
65
+ };
66
+ }
@@ -0,0 +1,122 @@
1
+ import { type SFPluging } from "@thestarweb/star-framework-cli";
2
+ import { devServer } from "./dev-server.js";
3
+ import { dirname, join, relative } from "path";
4
+ import { writeFile } from "fs/promises";
5
+ import { readFileSync } from "fs";
6
+ import { PackageInfo } from "@thestarweb/star-framework-web-runtime-node";
7
+ import { fileURLToPath } from "url";
8
+
9
+ export * from "./types.js";
10
+ const __file = fileURLToPath(import.meta.url);
11
+ const __dir = dirname(__file);
12
+
13
+ export function SFWebPluging({
14
+ distPath = "./dist/web/",
15
+ htmlPath = join(__dir, "../../resource/default-index.html"),
16
+ } = {}): SFPluging {
17
+ const fullDistPath = join(process.cwd(), distPath);
18
+ const fullUnpackDistPath = join(fullDistPath, ".unpack");
19
+
20
+ let html = "";
21
+ try {
22
+ html = readFileSync(htmlPath, "utf-8");
23
+ } catch {
24
+ throw new Error("未能找到html文件");
25
+ }
26
+
27
+ return {
28
+ name: "sf-web",
29
+ mode: {
30
+ server: {
31
+ side: ["server"],
32
+ dev: devServer(html),
33
+ environments: {
34
+ build: { outDir: join(fullUnpackDistPath, "server") },
35
+ },
36
+ createApp: {
37
+ import: "@thestarweb/star-framework-app-web",
38
+ fnName: "createServerFactory",
39
+ },
40
+ },
41
+ browser: {
42
+ side: ["browser", "client"],
43
+ environments: {
44
+ input: "index.html",
45
+ consumer: "client",
46
+ build: { outDir: join(fullUnpackDistPath, "browser") },
47
+ plugins: [{ name: "test" }],
48
+ },
49
+ createApp: {
50
+ import: "@thestarweb/star-framework-app-web",
51
+ fnName: "createBrowsweInstance",
52
+ },
53
+ },
54
+ },
55
+ sideOnlyConfig: [
56
+ {
57
+ import: "@thestarweb/star-framework-app-web",
58
+ name: ["Get", "Post", "Put", "Delete"],
59
+ side: "server",
60
+ type: "include",
61
+ whenMethodDeclaration: {
62
+ enable: true,
63
+ },
64
+ },
65
+ {
66
+ import: "@thestarweb/star-framework-app-web",
67
+ name: ["View"],
68
+ side: "server",
69
+ type: "include",
70
+ whenMethodDeclaration: {
71
+ enable: true,
72
+ removeMode: { prop: true, body: "throw" },
73
+ },
74
+ },
75
+ ],
76
+ vitePlugin: {
77
+ name: "sf-web-html",
78
+ resolveId: {
79
+ filter: { id: /^index\.html$/ },
80
+ async handler(id) {
81
+ return "index.html";
82
+ },
83
+ },
84
+ load: {
85
+ filter: { id: /^index\.html$/ },
86
+ handler(id) {
87
+ return html;
88
+ },
89
+ },
90
+ },
91
+ async onAllModeBuildEnd(modes, res) {
92
+ const configFile = join(fullUnpackDistPath, "package-info.json");
93
+ console.log("正在写入包信息");
94
+ let packageName = "sf-web",
95
+ packageVersion = "1.0.0";
96
+ try {
97
+ const pJson = JSON.parse(readFileSync("package.json", "utf-8"));
98
+ pJson.name ?? (packageName = pJson.name);
99
+ pJson.version ?? (packageVersion = pJson.version);
100
+ } catch {}
101
+ await writeFile(
102
+ configFile,
103
+ JSON.stringify({
104
+ "sf-fomate": "1",
105
+ name: packageName,
106
+ version: packageVersion,
107
+ server: {
108
+ dir: relative(fullUnpackDistPath, res.server.distPath),
109
+ main: res.server.main[0],
110
+ },
111
+ browser: {
112
+ dir: relative(fullUnpackDistPath, res.browser.distPath),
113
+ main: res.browser.main[0],
114
+ style: res.browser.assets.filter((i) => i.endsWith(".css")),
115
+ },
116
+ } as PackageInfo),
117
+ );
118
+ console.log("正在打包文件");
119
+ // TODO 打包
120
+ },
121
+ };
122
+ }
@@ -0,0 +1,7 @@
1
+ declare global {
2
+ interface StarFrameworkSideConfig {
3
+ server: {};
4
+ browser: {};
5
+ client: {};
6
+ }
7
+ }
@@ -0,0 +1,5 @@
1
+ declare global {
2
+ interface StarFrameworkSideConfig {
3
+ server: {};
4
+ }
5
+ }
package/src/index.ts ADDED
@@ -0,0 +1,24 @@
1
+ export { Get, Post, Put, Delete, SubRoute } from "./route/index.js";
2
+ export { Body, Query, Header } from "./params/index.js";
3
+ // @side-only server
4
+ export { SFWebPluging } from "./cli/index.js";
5
+ export { ResponseWithMeta } from "./return-types/index.js";
6
+ export { AddInterceptor, type Interceptor } from "./interceptor/index.js";
7
+ export {
8
+ View,
9
+ Layout,
10
+ HTMLRender,
11
+ type IRender,
12
+ RenderContext,
13
+ type RenderInstance,
14
+ type WarpRenderInstance,
15
+ type RenderDataContext,
16
+ SFDataContext,
17
+ SFRawDataContext,
18
+ } from "./view/index.js";
19
+ // @side-only server
20
+ export { createServerFactory } from "./server/index.js";
21
+ export { createBrowsweInstance } from "./browser/index.js";
22
+ // @side-only server
23
+ export * from "./cli-helper.js";
24
+ export { SFWebRequest } from "./request/index.js";
@@ -0,0 +1,26 @@
1
+ import { getMetadataAll, initMetadata } from "@thestarweb/star-framework-utils";
2
+ import { Interceptor } from "./types.js";
3
+ export * from "./types.js";
4
+ export { middlewareToInterceptor } from "./middleware-to-interceptor/index.js";
5
+ const metaKey = "$sf:app:interceptor";
6
+ export function AddInterceptor(
7
+ interceptor: Interceptor | Interceptor[],
8
+ ): MethodDecorator & ClassDecorator {
9
+ return function (target?: any, propertyKey?: PropertyKey) {
10
+ initMetadata(target, metaKey, propertyKey, [] as Interceptor[]).push(
11
+ ...[interceptor].flat(2),
12
+ );
13
+ };
14
+ }
15
+ export function addInterceptor(
16
+ interceptor: Interceptor | Interceptor[],
17
+ target: any,
18
+ propertyKey?: PropertyKey,
19
+ ) {
20
+ initMetadata(target, metaKey, propertyKey, [] as Interceptor[]).push(
21
+ ...[interceptor].flat(2),
22
+ );
23
+ }
24
+ export function getInterceptors(target: object, propertyKey?: PropertyKey) {
25
+ return getMetadataAll<Interceptor[]>(target, metaKey, propertyKey).flat();
26
+ }
@@ -0,0 +1,29 @@
1
+ import { ViteDevServer } from "vite";
2
+ import { Interceptor } from "../types.js";
3
+ // @side-only server
4
+ import { IncomingMessage } from "node:http";
5
+ // @side-only server
6
+ import { MookReq } from "./mook-req.js";
7
+ // @side-only server
8
+ import { MookRes } from "./mock-res.js";
9
+
10
+ export function middlewareToInterceptor(
11
+ middleware: ViteDevServer["middlewares"],
12
+ ): Interceptor {
13
+ return (req, next) => {
14
+ return new Promise((resolve, reject) => {
15
+ try {
16
+ const _req = new MookReq(req);
17
+ middleware(_req as any, new MookRes(_req, resolve) as any, async () => {
18
+ try {
19
+ resolve(await next(req));
20
+ } catch (e) {
21
+ reject(e);
22
+ }
23
+ });
24
+ } catch (e) {
25
+ reject(e);
26
+ }
27
+ });
28
+ };
29
+ }
@@ -0,0 +1,255 @@
1
+ import { type OutgoingHttpHeaders } from "node:http";
2
+ import { ResponseWithMeta } from "../../return-types/response-with-meta.js";
3
+ import { type PipeOptions } from "node:stream";
4
+
5
+ export class MookRes {
6
+ _transformStream = new TransformStream();
7
+ _readable: ReadableStream;
8
+ _writeable: WritableStreamDefaultWriter;
9
+
10
+ statusCode = 404;
11
+ statusMessage = "";
12
+ strictContentLength = false;
13
+ headers: Record<string, any> = {};
14
+ assignSocket(socket: any): void {
15
+ throw new Error("Method not implemented.");
16
+ }
17
+ detachSocket(socket: any): void {
18
+ throw new Error("Method not implemented.");
19
+ }
20
+ writeContinue(callback?: () => void): void {
21
+ throw new Error("Method not implemented.");
22
+ }
23
+ writeEarlyHints(
24
+ hints: Record<string, string | string[]>,
25
+ callback?: () => void,
26
+ ): void {
27
+ throw new Error("Method not implemented.");
28
+ }
29
+ writeHead(statusCode: any, statusMessage?: unknown, headers?: any): this {
30
+ this.statusCode = statusCode;
31
+ if (headers) this.setHeaders(headers);
32
+ return this;
33
+ }
34
+ writeProcessing(callback?: () => void): void {
35
+ throw new Error("Method not implemented.");
36
+ }
37
+
38
+ private readonly __sf_send: () => void;
39
+ constructor(
40
+ public req: any,
41
+ callback: (res: ResponseWithMeta) => any,
42
+ ) {
43
+ this._readable = this._transformStream.readable;
44
+ this._writeable = this._transformStream.writable.getWriter();
45
+ this.__sf_send = () => {
46
+ if (!this.sendDate) {
47
+ this.sendDate = true;
48
+ callback(
49
+ new ResponseWithMeta(this._transformStream.readable, {
50
+ code: this.statusCode,
51
+ header: this.getHeaders() as any,
52
+ }),
53
+ );
54
+ }
55
+ };
56
+ }
57
+ chunkedEncoding = false;
58
+ shouldKeepAlive = true;
59
+ useChunkedEncodingByDefault = false;
60
+ sendDate = false;
61
+ finishe = false;
62
+ headersSent = false;
63
+ connection = null;
64
+ socket = null;
65
+ setTimeout(msecs: number, callback?: () => void): this {
66
+ throw new Error("Method not implemented.");
67
+ }
68
+ setHeader(name: string, value: number | string | readonly string[]) {
69
+ this.headers[name] = value;
70
+ return this;
71
+ }
72
+ setHeaders(
73
+ headers: Headers | Map<string, number | string | readonly string[]>,
74
+ ): this {
75
+ if (headers instanceof Map) {
76
+ headers.forEach((value, key) => {
77
+ this.setHeader(key, value);
78
+ });
79
+ } else {
80
+ this.headers = {
81
+ ...this.headers,
82
+ ...headers,
83
+ };
84
+ }
85
+ return this;
86
+ }
87
+ appendHeader(name: string, value: string | readonly string[]): this {
88
+ if (!this.headers[name]) {
89
+ this.headers[name] = value;
90
+ } else {
91
+ if (!Array.isArray(this.headers[name])) {
92
+ this.headers[name] = [this.headers[name]];
93
+ }
94
+ this.headers[name].push(...(Array.isArray(value) ? value : [value]));
95
+ }
96
+ return this;
97
+ }
98
+ getHeader(name: string) {
99
+ return this.headers[name];
100
+ }
101
+ getHeaders() {
102
+ return this.headers;
103
+ }
104
+ getHeaderNames() {
105
+ return Object.keys(this.headers);
106
+ }
107
+ hasHeader(name: string) {
108
+ return name in this.headers;
109
+ }
110
+ removeHeader(name: string): void {
111
+ delete this.headers[name];
112
+ }
113
+ addTrailers(headers: OutgoingHttpHeaders | ReadonlyArray<[string, string]>) {
114
+ throw new Error("Method not implemented.");
115
+ }
116
+ flushHeaders(): void {
117
+ throw new Error("Method not implemented.");
118
+ }
119
+ addListener(eventName: unknown, listener: unknown): this {
120
+ throw new Error("Method not implemented.");
121
+ }
122
+ emit(eventName: unknown, ...args: unknown[]): boolean {
123
+ throw new Error("Method not implemented.");
124
+ }
125
+ listenerCount(eventName: unknown, listener?: unknown): number {
126
+ throw new Error("Method not implemented.");
127
+ }
128
+ listeners(eventName: unknown): any {
129
+ throw new Error("Method not implemented.");
130
+ }
131
+ off(eventName: unknown, listener: unknown): this {
132
+ throw new Error("Method not implemented.");
133
+ }
134
+ on(eventName: unknown, listener: unknown): this {
135
+ throw new Error("Method not implemented.");
136
+ }
137
+ once(eventName: unknown, listener: unknown): this {
138
+ throw new Error("Method not implemented.");
139
+ }
140
+ prependListener(eventName: unknown, listener: unknown): this {
141
+ throw new Error("Method not implemented.");
142
+ }
143
+ prependOnceListener(eventName: unknown, listener: unknown): this {
144
+ throw new Error("Method not implemented.");
145
+ }
146
+ rawListeners(eventName: unknown): any {
147
+ throw new Error("Method not implemented.");
148
+ }
149
+ removeAllListeners(eventName?: unknown): this {
150
+ throw new Error("Method not implemented.");
151
+ }
152
+ removeListener(eventName: unknown, listener: unknown): this {
153
+ throw new Error("Method not implemented.");
154
+ }
155
+ writable = true;
156
+ writableAborted = false;
157
+ writableEnded = false;
158
+ writableFinished = false;
159
+ writableHighWaterMark = 16 * 1024;
160
+ writableLength = 0;
161
+ writableObjectMode = false;
162
+ writableCorked = 0;
163
+ destroyed = false;
164
+ closed = false;
165
+ errored = null;
166
+ writableNeedDrain = false;
167
+ _write(
168
+ chunk: any,
169
+ encoding: BufferEncoding,
170
+ callback?: (error?: Error | null) => void,
171
+ ) {
172
+ this.__sf_send();
173
+ const p = this._writeable.write(
174
+ typeof chunk === "string" ? Buffer.from(chunk, encoding) : chunk,
175
+ );
176
+ if (callback) {
177
+ p.then(() => callback());
178
+ p.catch((e) => callback(e));
179
+ }
180
+ }
181
+ _writev?(
182
+ chunks: { chunk: any; encoding: BufferEncoding }[],
183
+ callback: (error?: Error | null) => void,
184
+ ): void {
185
+ const p = chunks.reduce((p, { chunk, encoding }) => {
186
+ return p.then(() => this._write(chunk, encoding));
187
+ }, Promise.resolve());
188
+ if (callback) {
189
+ p.then(() => callback());
190
+ p.catch((e) => callback(e));
191
+ }
192
+ }
193
+ _construct?(callback: (error?: Error | null) => void): void {
194
+ throw new Error("Method not implemented.");
195
+ }
196
+ _destroy(
197
+ error: Error | null,
198
+ callback: (error?: Error | null) => void,
199
+ ): void {
200
+ throw new Error("Method not implemented.");
201
+ }
202
+ _final(callback: (error?: Error | null) => void): void {
203
+ throw new Error("Method not implemented.");
204
+ }
205
+ _defaultEncoding: BufferEncoding = "utf-8";
206
+ write(chunk: unknown, encoding?: any, callback?: any): boolean {
207
+ if (typeof encoding === "function") {
208
+ callback = encoding;
209
+ encoding = undefined;
210
+ }
211
+ this._write(chunk, encoding || this._defaultEncoding, callback);
212
+ return true;
213
+ }
214
+ setDefaultEncoding(encoding: BufferEncoding) {
215
+ this._defaultEncoding = encoding;
216
+ return this;
217
+ }
218
+ end(chunk?: unknown, encoding?: unknown, cb?: unknown) {
219
+ this.writableEnded = true;
220
+ this.writableFinished = true;
221
+ if (typeof chunk !== "function") {
222
+ this.write(chunk, encoding, cb);
223
+ } else {
224
+ this.__sf_send();
225
+ chunk?.();
226
+ }
227
+ this._writeable.close();
228
+ return this;
229
+ }
230
+ cork(): void {
231
+ this.writableCorked++;
232
+ }
233
+ uncork(): void {
234
+ this.writableCorked--;
235
+ }
236
+ destroy(error?: Error): this {
237
+ return this;
238
+ }
239
+ async [Symbol.asyncDispose](): Promise<void> {}
240
+ pipe<T extends NodeJS.WritableStream>(
241
+ destination: T,
242
+ options?: PipeOptions,
243
+ ): T {
244
+ throw new Error("Method not implemented.");
245
+ }
246
+ eventNames(): (string | symbol)[] {
247
+ throw new Error("Method not implemented.");
248
+ }
249
+ getMaxListeners(): number {
250
+ throw new Error("Method not implemented.");
251
+ }
252
+ setMaxListeners(n: number): this {
253
+ throw new Error("Method not implemented.");
254
+ }
255
+ }