@sdk-it/vite 0.42.0 → 0.43.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.
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -32
- package/dist/index.js.map +2 -2
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -4,12 +4,5 @@ import { generate } from '@sdk-it/typescript';
|
|
|
4
4
|
type Settings = Parameters<typeof generate>[1];
|
|
5
5
|
type OpenapiFunction = () => string | OpenAPIObject | Promise<string | OpenAPIObject>;
|
|
6
6
|
export default function sdkIt(openapi: OpenAPIObject | string | OpenapiFunction, settings: Settings): Plugin;
|
|
7
|
-
/**
|
|
8
|
-
* Ensures that an async function has only one execution at a time (prevents concurrent calls).
|
|
9
|
-
* If called while already executing, subsequent calls will wait for the current execution to complete
|
|
10
|
-
* and receive the same result.
|
|
11
|
-
* @param fn The async function to serialize.
|
|
12
|
-
*/
|
|
13
|
-
export declare function onceAtATime<TArgs extends readonly unknown[], TReturn>(fn: (...args: TArgs) => Promise<TReturn>): (...args: TArgs) => Promise<TReturn>;
|
|
14
7
|
export {};
|
|
15
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,KAAK,eAAe,GAAG,MACnB,MAAM,GACN,aAAa,GACb,OAAO,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;AAEpC,MAAM,CAAC,OAAO,UAAU,KAAK,CAC3B,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,eAAe,EACjD,QAAQ,EAAE,QAAQ,GACjB,MAAM,CASR"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
// packages/vite/src/index.ts
|
|
2
2
|
import chalk from "chalk";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
3
5
|
import { join } from "node:path";
|
|
4
6
|
import { fileURLToPath } from "node:url";
|
|
5
7
|
import "vite";
|
|
@@ -30,12 +32,16 @@ function functionPlugin(openapi, settings) {
|
|
|
30
32
|
function filePlugin(openapi, settings) {
|
|
31
33
|
let watchPath = null;
|
|
32
34
|
let sourceRef = null;
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
const generateIfNeeded = async (ref) => {
|
|
36
|
+
const hash = await hashFile(watchPath || ref);
|
|
37
|
+
const key = `${hash}|${settings.output}`;
|
|
38
|
+
return cachedGeneration(key, async () => {
|
|
39
|
+
console.log(`${chalk.blue("SDKIT")}: Generating SDK.`);
|
|
40
|
+
const spec = await loadSpec(ref);
|
|
41
|
+
await generate(spec, settings);
|
|
42
|
+
console.log(`${chalk.blue("SDKIT")}: SDK generated successfully.`);
|
|
43
|
+
});
|
|
44
|
+
};
|
|
39
45
|
return {
|
|
40
46
|
configureServer(server) {
|
|
41
47
|
if (!sourceRef) return;
|
|
@@ -48,13 +54,13 @@ function filePlugin(openapi, settings) {
|
|
|
48
54
|
server.watcher.on("change", async (file) => {
|
|
49
55
|
if (file === watchPath) {
|
|
50
56
|
console.log(`${chalk.blue("SDKIT")}: OpenAPI spec changed`, file);
|
|
51
|
-
await
|
|
57
|
+
await generateIfNeeded(sourceRef);
|
|
52
58
|
}
|
|
53
59
|
});
|
|
54
60
|
},
|
|
55
61
|
async buildStart() {
|
|
56
62
|
if (!sourceRef) return;
|
|
57
|
-
await
|
|
63
|
+
await generateIfNeeded(sourceRef);
|
|
58
64
|
},
|
|
59
65
|
async configResolved(config) {
|
|
60
66
|
if (startsWithProtocol(openapi)) {
|
|
@@ -70,43 +76,49 @@ function filePlugin(openapi, settings) {
|
|
|
70
76
|
};
|
|
71
77
|
}
|
|
72
78
|
function specPlugin(openapi, settings) {
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
79
|
+
const generateIfNeeded = async (spec) => {
|
|
80
|
+
const hash = hashSpec(spec);
|
|
81
|
+
const key = `${hash}|${settings.output}`;
|
|
82
|
+
return cachedGeneration(key, async () => {
|
|
83
|
+
console.log(`${chalk.blue("SDKIT")}: Generating SDK.`);
|
|
84
|
+
await generate(spec, settings);
|
|
85
|
+
console.log(`${chalk.blue("SDKIT")}: SDK generated successfully.`);
|
|
86
|
+
});
|
|
87
|
+
};
|
|
78
88
|
return {
|
|
79
89
|
async configResolved() {
|
|
80
90
|
},
|
|
81
91
|
async configureServer() {
|
|
82
|
-
await
|
|
92
|
+
await generateIfNeeded(openapi);
|
|
83
93
|
},
|
|
84
94
|
async buildStart() {
|
|
85
|
-
await
|
|
95
|
+
await generateIfNeeded(openapi);
|
|
86
96
|
}
|
|
87
97
|
};
|
|
88
98
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
99
|
+
var generationCache = /* @__PURE__ */ new Map();
|
|
100
|
+
function cachedGeneration(key, fn) {
|
|
101
|
+
const existing = generationCache.get(key);
|
|
102
|
+
if (existing) return existing;
|
|
103
|
+
const promise = fn().catch((err) => {
|
|
104
|
+
generationCache.delete(key);
|
|
105
|
+
throw err;
|
|
106
|
+
});
|
|
107
|
+
generationCache.set(key, promise);
|
|
108
|
+
return promise;
|
|
109
|
+
}
|
|
110
|
+
function hashFile(filePath) {
|
|
111
|
+
return readFile(filePath).then(
|
|
112
|
+
(content) => createHash("sha256").update(content).digest("hex")
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
function hashSpec(spec) {
|
|
116
|
+
return createHash("sha256").update(JSON.stringify(spec)).digest("hex");
|
|
104
117
|
}
|
|
105
118
|
function startsWithProtocol(url) {
|
|
106
119
|
return /^[a-zA-Z][a-zA-Z0-9+\-.]*:\/\//.test(url);
|
|
107
120
|
}
|
|
108
121
|
export {
|
|
109
|
-
sdkIt as default
|
|
110
|
-
onceAtATime
|
|
122
|
+
sdkIt as default
|
|
111
123
|
};
|
|
112
124
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["import chalk from 'chalk';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { OpenAPIObject } from 'openapi3-ts/oas31';\nimport { type Plugin } from 'vite';\n\nimport { loadSpec } from '@sdk-it/spec';\nimport { generate } from '@sdk-it/typescript';\n\ntype Settings = Parameters<typeof generate>[1];\ntype OpenapiFunction = () =>\n | string\n | OpenAPIObject\n | Promise<string | OpenAPIObject>;\n\nexport default function sdkIt(\n openapi: OpenAPIObject | string | OpenapiFunction,\n settings: Settings,\n): Plugin {\n return {\n name: 'sdk-it',\n ...(typeof openapi === 'function'\n ? functionPlugin(openapi, settings)\n : typeof openapi === 'string'\n ? filePlugin(openapi, settings)\n : specPlugin(openapi, settings)),\n };\n}\n\nfunction functionPlugin(\n openapi: OpenapiFunction,\n settings: Settings,\n): Omit<Plugin, 'name'> {\n let delegatePlugin!:\n | ReturnType<typeof specPlugin>\n | ReturnType<typeof filePlugin>;\n\n return {\n async configResolved(config) {\n // Resolve the function once\n const resolved = await openapi();\n\n // Create the appropriate delegate plugin based on the resolved type\n delegatePlugin =\n typeof resolved === 'string'\n ? filePlugin(resolved, settings)\n : specPlugin(resolved, settings);\n\n return (delegatePlugin.configResolved as any)?.(config);\n },\n configureServer(server) {\n return (delegatePlugin.configureServer as any)?.(server);\n },\n async buildStart(options) {\n return (delegatePlugin.buildStart as any)?.(options);\n },\n };\n}\n\nfunction filePlugin(openapi: string, settings: Settings): Omit<Plugin, 'name'> {\n let watchPath: string | null = null;\n let sourceRef: string | null = null;\n\n const
|
|
5
|
-
"mappings": ";AAAA,OAAO,WAAW;AAClB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAE9B,OAA4B;AAE5B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAQV,SAAR,MACL,SACA,UACQ;AACR,SAAO;AAAA,IACL,MAAM;AAAA,IACN,GAAI,OAAO,YAAY,aACnB,eAAe,SAAS,QAAQ,IAChC,OAAO,YAAY,WACjB,WAAW,SAAS,QAAQ,IAC5B,WAAW,SAAS,QAAQ;AAAA,EACpC;AACF;AAEA,SAAS,eACP,SACA,UACsB;AACtB,MAAI;AAIJ,SAAO;AAAA,IACL,MAAM,eAAe,QAAQ;AAE3B,YAAM,WAAW,MAAM,QAAQ;AAG/B,uBACE,OAAO,aAAa,WAChB,WAAW,UAAU,QAAQ,IAC7B,WAAW,UAAU,QAAQ;AAEnC,aAAQ,eAAe,iBAAyB,MAAM;AAAA,IACxD;AAAA,IACA,gBAAgB,QAAQ;AACtB,aAAQ,eAAe,kBAA0B,MAAM;AAAA,IACzD;AAAA,IACA,MAAM,WAAW,SAAS;AACxB,aAAQ,eAAe,aAAqB,OAAO;AAAA,IACrD;AAAA,EACF;AACF;AAEA,SAAS,WAAW,SAAiB,UAA0C;AAC7E,MAAI,YAA2B;AAC/B,MAAI,YAA2B;AAE/B,QAAM,
|
|
4
|
+
"sourcesContent": ["import chalk from 'chalk';\nimport { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { OpenAPIObject } from 'openapi3-ts/oas31';\nimport { type Plugin } from 'vite';\n\nimport { loadSpec } from '@sdk-it/spec';\nimport { generate } from '@sdk-it/typescript';\n\ntype Settings = Parameters<typeof generate>[1];\ntype OpenapiFunction = () =>\n | string\n | OpenAPIObject\n | Promise<string | OpenAPIObject>;\n\nexport default function sdkIt(\n openapi: OpenAPIObject | string | OpenapiFunction,\n settings: Settings,\n): Plugin {\n return {\n name: 'sdk-it',\n ...(typeof openapi === 'function'\n ? functionPlugin(openapi, settings)\n : typeof openapi === 'string'\n ? filePlugin(openapi, settings)\n : specPlugin(openapi, settings)),\n };\n}\n\nfunction functionPlugin(\n openapi: OpenapiFunction,\n settings: Settings,\n): Omit<Plugin, 'name'> {\n let delegatePlugin!:\n | ReturnType<typeof specPlugin>\n | ReturnType<typeof filePlugin>;\n\n return {\n async configResolved(config) {\n // Resolve the function once\n const resolved = await openapi();\n\n // Create the appropriate delegate plugin based on the resolved type\n delegatePlugin =\n typeof resolved === 'string'\n ? filePlugin(resolved, settings)\n : specPlugin(resolved, settings);\n\n return (delegatePlugin.configResolved as any)?.(config);\n },\n configureServer(server) {\n return (delegatePlugin.configureServer as any)?.(server);\n },\n async buildStart(options) {\n return (delegatePlugin.buildStart as any)?.(options);\n },\n };\n}\n\nfunction filePlugin(openapi: string, settings: Settings): Omit<Plugin, 'name'> {\n let watchPath: string | null = null;\n let sourceRef: string | null = null;\n\n const generateIfNeeded = async (ref: string) => {\n const hash = await hashFile(watchPath || ref);\n const key = `${hash}|${settings.output}`;\n return cachedGeneration(key, async () => {\n console.log(`${chalk.blue('SDKIT')}: Generating SDK.`);\n const spec = await loadSpec(ref);\n await generate(spec, settings);\n console.log(`${chalk.blue('SDKIT')}: SDK generated successfully.`);\n });\n };\n\n return {\n configureServer(server) {\n if (!sourceRef) return;\n\n if (!watchPath) return;\n console.log(\n `${chalk.blue('SDKIT')}: Watching for spec changes in`,\n watchPath,\n );\n server.watcher.add(watchPath);\n server.watcher.on('change', async (file) => {\n if (file === watchPath) {\n console.log(`${chalk.blue('SDKIT')}: OpenAPI spec changed`, file);\n await generateIfNeeded(sourceRef!);\n }\n });\n },\n async buildStart() {\n if (!sourceRef) return;\n await generateIfNeeded(sourceRef);\n },\n async configResolved(config) {\n if (startsWithProtocol(openapi)) {\n if (openapi.startsWith('file:')) {\n watchPath = fileURLToPath(openapi);\n sourceRef = openapi;\n }\n } else {\n watchPath = join(config.root, openapi);\n sourceRef = join(config.root, openapi);\n }\n },\n };\n}\n\nfunction specPlugin(\n openapi: OpenAPIObject,\n settings: Settings,\n): Omit<Plugin, 'name'> {\n const generateIfNeeded = async (spec: OpenAPIObject) => {\n const hash = hashSpec(spec);\n const key = `${hash}|${settings.output}`;\n return cachedGeneration(key, async () => {\n console.log(`${chalk.blue('SDKIT')}: Generating SDK.`);\n await generate(spec, settings);\n console.log(`${chalk.blue('SDKIT')}: SDK generated successfully.`);\n });\n };\n return {\n async configResolved() {\n // No-op for specPlugin\n },\n async configureServer() {\n await generateIfNeeded(openapi);\n },\n async buildStart() {\n await generateIfNeeded(openapi);\n },\n };\n}\n\nconst generationCache = new Map<string, Promise<void>>();\n\nfunction cachedGeneration(\n key: string,\n fn: () => Promise<void>,\n): Promise<void> {\n const existing = generationCache.get(key);\n if (existing) return existing;\n\n const promise = fn().catch((err) => {\n generationCache.delete(key);\n throw err;\n });\n generationCache.set(key, promise);\n return promise;\n}\n\nfunction hashFile(filePath: string): Promise<string> {\n return readFile(filePath).then((content) =>\n createHash('sha256').update(content).digest('hex'),\n );\n}\n\nfunction hashSpec(spec: OpenAPIObject): string {\n return createHash('sha256').update(JSON.stringify(spec)).digest('hex');\n}\n\nfunction startsWithProtocol(url: string): boolean {\n return /^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//.test(url);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sdk-it/vite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.43.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"openapi3-ts": "4.5.0",
|
|
34
34
|
"vite": "^6.0.0 || ^7.0.0",
|
|
35
|
-
"@sdk-it/spec": "0.
|
|
36
|
-
"@sdk-it/typescript": "0.
|
|
35
|
+
"@sdk-it/spec": "0.43.0",
|
|
36
|
+
"@sdk-it/typescript": "0.43.0",
|
|
37
37
|
"chalk": "^5.6.0"
|
|
38
38
|
}
|
|
39
39
|
}
|