@sdk-it/vite 0.37.1 → 0.39.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 CHANGED
@@ -1,6 +1,9 @@
1
+ import type { OpenAPIObject } from 'openapi3-ts/oas31';
1
2
  import { type Plugin } from 'vite';
2
3
  import { generate } from '@sdk-it/typescript';
3
- export default function sdkIt(openapi: string, settings: Parameters<typeof generate>[1]): Plugin;
4
+ type Settings = Parameters<typeof generate>[1];
5
+ type OpenapiFunction = () => string | OpenAPIObject | Promise<string | OpenAPIObject>;
6
+ export default function sdkIt(openapi: OpenAPIObject | string | OpenapiFunction, settings: Settings): Plugin;
4
7
  /**
5
8
  * Ensures that an async function has only one execution at a time (prevents concurrent calls).
6
9
  * If called while already executing, subsequent calls will wait for the current execution to complete
@@ -8,4 +11,5 @@ export default function sdkIt(openapi: string, settings: Parameters<typeof gener
8
11
  * @param fn The async function to serialize.
9
12
  */
10
13
  export declare function onceAtATime<TArgs extends readonly unknown[], TReturn>(fn: (...args: TArgs) => Promise<TReturn>): (...args: TArgs) => Promise<TReturn>;
14
+ export {};
11
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AAGnC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,CAAC,OAAO,UAAU,KAAK,CAC3B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,GACvC,MAAM,CA8CR;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,OAAO,EACnE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GACvC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAqBtC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,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;AAqGD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,SAAS,SAAS,OAAO,EAAE,EAAE,OAAO,EACnE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,GACvC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAqBtC"}
package/dist/index.js CHANGED
@@ -6,6 +6,28 @@ import "vite";
6
6
  import { loadSpec } from "@sdk-it/spec";
7
7
  import { generate } from "@sdk-it/typescript";
8
8
  function sdkIt(openapi, settings) {
9
+ return {
10
+ name: "sdk-it",
11
+ ...typeof openapi === "function" ? functionPlugin(openapi, settings) : typeof openapi === "string" ? filePlugin(openapi, settings) : specPlugin(openapi, settings)
12
+ };
13
+ }
14
+ function functionPlugin(openapi, settings) {
15
+ let delegatePlugin;
16
+ return {
17
+ async configResolved(config) {
18
+ const resolved = await openapi();
19
+ delegatePlugin = typeof resolved === "string" ? filePlugin(resolved, settings) : specPlugin(resolved, settings);
20
+ return delegatePlugin.configResolved?.(config);
21
+ },
22
+ configureServer(server) {
23
+ return delegatePlugin.configureServer?.(server);
24
+ },
25
+ async buildStart(options) {
26
+ return delegatePlugin.buildStart?.(options);
27
+ }
28
+ };
29
+ }
30
+ function filePlugin(openapi, settings) {
9
31
  let watchPath = null;
10
32
  let sourceRef = null;
11
33
  const generateOnce = onceAtATime(async (ref) => {
@@ -15,7 +37,6 @@ function sdkIt(openapi, settings) {
15
37
  console.log(`${chalk.blue("SDKIT")}: SDK generated successfully.`);
16
38
  });
17
39
  return {
18
- name: "sdk-it",
19
40
  configureServer(server) {
20
41
  if (!sourceRef) return;
21
42
  if (!watchPath) return;
@@ -48,6 +69,23 @@ function sdkIt(openapi, settings) {
48
69
  }
49
70
  };
50
71
  }
72
+ function specPlugin(openapi, settings) {
73
+ const generateOnce = onceAtATime(async (spec) => {
74
+ console.log(`${chalk.blue("SDKIT")}: Generating SDK.`);
75
+ await generate(spec, settings);
76
+ console.log(`${chalk.blue("SDKIT")}: SDK generated successfully.`);
77
+ });
78
+ return {
79
+ async configResolved() {
80
+ },
81
+ async configureServer() {
82
+ await generateOnce(openapi);
83
+ },
84
+ async buildStart() {
85
+ await generateOnce(openapi);
86
+ }
87
+ };
88
+ }
51
89
  function onceAtATime(fn) {
52
90
  let current = null;
53
91
  return function(...args) {
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 Plugin } from 'vite';\n\nimport { loadSpec } from '@sdk-it/spec';\nimport { generate } from '@sdk-it/typescript';\n\nexport default function sdkIt(\n openapi: string,\n settings: Parameters<typeof generate>[1],\n): Plugin {\n let watchPath: string | null = null;\n let sourceRef: string | null = null;\n\n const generateOnce = onceAtATime(async (ref: string) => {\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 return {\n name: 'sdk-it',\n configureServer(server) {\n if (!sourceRef) return;\n\n if (!watchPath) return;\n // Watch only when we have a real filesystem path\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 generateOnce(sourceRef!);\n }\n });\n },\n async buildStart() {\n if (!sourceRef) return;\n await generateOnce(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\n/**\n * Ensures that an async function has only one execution at a time (prevents concurrent calls).\n * If called while already executing, subsequent calls will wait for the current execution to complete\n * and receive the same result.\n * @param fn The async function to serialize.\n */\nexport function onceAtATime<TArgs extends readonly unknown[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn> {\n let current: Promise<TReturn> | null = null;\n\n return function (...args: TArgs): Promise<TReturn> {\n if (current) {\n // Return the existing promise if already executing\n return current;\n }\n\n // Start new execution\n current = (async () => {\n try {\n return await fn(...args);\n } finally {\n // Clear the current execution when done\n current = null;\n }\n })();\n\n return current;\n };\n}\n\nfunction startsWithProtocol(url: string): boolean {\n return /^[a-zA-Z][a-zA-Z0-9+\\-.]*:\\/\\//.test(url);\n}\n"],
5
- "mappings": ";AAAA,OAAO,WAAW;AAClB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,OAA4B;AAE5B,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AAEV,SAAR,MACL,SACA,UACQ;AACR,MAAI,YAA2B;AAC/B,MAAI,YAA2B;AAE/B,QAAM,eAAe,YAAY,OAAO,QAAgB;AACtD,YAAQ,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,mBAAmB;AACrD,UAAM,OAAO,MAAM,SAAS,GAAG;AAC/B,UAAM,SAAS,MAAM,QAAQ;AAC7B,YAAQ,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,+BAA+B;AAAA,EACnE,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,QAAQ;AACtB,UAAI,CAAC,UAAW;AAEhB,UAAI,CAAC,UAAW;AAEhB,cAAQ;AAAA,QACN,GAAG,MAAM,KAAK,OAAO,CAAC;AAAA,QACtB;AAAA,MACF;AACA,aAAO,QAAQ,IAAI,SAAS;AAC5B,aAAO,QAAQ,GAAG,UAAU,OAAO,SAAS;AAC1C,YAAI,SAAS,WAAW;AACtB,kBAAQ,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,0BAA0B,IAAI;AAChE,gBAAM,aAAa,SAAU;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,MAAM,aAAa;AACjB,UAAI,CAAC,UAAW;AAChB,YAAM,aAAa,SAAS;AAAA,IAC9B;AAAA,IACA,MAAM,eAAe,QAAQ;AAC3B,UAAI,mBAAmB,OAAO,GAAG;AAC/B,YAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,sBAAY,cAAc,OAAO;AACjC,sBAAY;AAAA,QACd;AAAA,MACF,OAAO;AACL,oBAAY,KAAK,OAAO,MAAM,OAAO;AACrC,oBAAY,KAAK,OAAO,MAAM,OAAO;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AACF;AAQO,SAAS,YACd,IACsC;AACtC,MAAI,UAAmC;AAEvC,SAAO,YAAa,MAA+B;AACjD,QAAI,SAAS;AAEX,aAAO;AAAA,IACT;AAGA,eAAW,YAAY;AACrB,UAAI;AACF,eAAO,MAAM,GAAG,GAAG,IAAI;AAAA,MACzB,UAAE;AAEA,kBAAU;AAAA,MACZ;AAAA,IACF,GAAG;AAEH,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,KAAsB;AAChD,SAAO,iCAAiC,KAAK,GAAG;AAClD;",
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 generateOnce = onceAtATime(async (ref: string) => {\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 return {\n configureServer(server) {\n if (!sourceRef) return;\n\n if (!watchPath) return;\n // Watch only when we have a real filesystem path\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 generateOnce(sourceRef!);\n }\n });\n },\n async buildStart() {\n if (!sourceRef) return;\n await generateOnce(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 generateOnce = onceAtATime(async (spec: OpenAPIObject) => {\n console.log(`${chalk.blue('SDKIT')}: Generating SDK.`);\n await generate(spec, settings);\n console.log(`${chalk.blue('SDKIT')}: SDK generated successfully.`);\n });\n return {\n async configResolved() {\n // No-op for specPlugin\n },\n async configureServer() {\n await generateOnce(openapi);\n },\n async buildStart() {\n await generateOnce(openapi);\n },\n };\n}\n\n/**\n * Ensures that an async function has only one execution at a time (prevents concurrent calls).\n * If called while already executing, subsequent calls will wait for the current execution to complete\n * and receive the same result.\n * @param fn The async function to serialize.\n */\nexport function onceAtATime<TArgs extends readonly unknown[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n): (...args: TArgs) => Promise<TReturn> {\n let current: Promise<TReturn> | null = null;\n\n return function (...args: TArgs): Promise<TReturn> {\n if (current) {\n // Return the existing promise if already executing\n return current;\n }\n\n // Start new execution\n current = (async () => {\n try {\n return await fn(...args);\n } finally {\n // Clear the current execution when done\n current = null;\n }\n })();\n\n return current;\n };\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.37.1",
3
+ "version": "0.39.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -29,7 +29,7 @@
29
29
  "peerDependencies": {
30
30
  "chalk": "^5.6.0",
31
31
  "vite": "^6.0.0 || ^7.0.0",
32
- "@sdk-it/spec": "0.37.1",
33
- "@sdk-it/typescript": "0.37.1"
32
+ "@sdk-it/spec": "0.39.0",
33
+ "@sdk-it/typescript": "0.39.0"
34
34
  }
35
35
  }