xypriss-swagger 1.0.37 → 1.0.39

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/README.md CHANGED
@@ -26,7 +26,7 @@ In your main XyPriss application, import and register the `SwaggerPlugin`:
26
26
 
27
27
  ```typescript
28
28
  import { SwaggerPlugin } from "xypriss-swagger";
29
- import { XyPrissServer } from "xypriss";
29
+ import { createServer } from "xypriss";
30
30
 
31
31
  const server = createServer({
32
32
  plugins: {
@@ -52,7 +52,6 @@ Ensure the plugin is authorized in your `xypriss.config.jsonc`:
52
52
  {
53
53
  "$internal": {
54
54
  "xypriss-swagger": {
55
- "type": "plugin",
56
55
  "__meta__": {
57
56
  "path": "ROOT://",
58
57
  },
@@ -61,12 +60,12 @@ Ensure the plugin is authorized in your `xypriss.config.jsonc`:
61
60
  },
62
61
  "permissions": {
63
62
  "allowedHooks": [
64
- "PLG.HTTP.ON_REQUEST",
65
- "PLG.SECURITY.ACCESS_SENSITIVE_DATA",
66
- "PLG.LIFECYCLE.REGISTER",
67
- "PLG.LIFECYCLE.SERVER_START",
68
- "PLG.OPS.AUXILIARY_SERVER",
69
- "PLG.SECURITY.ACCESS_CONFIGS",
63
+ "XHS.HOOK.HTTP.REQUEST",
64
+ "XHS.PERM.SECURITY.SENSITIVE_DATA",
65
+ "XHS.HOOK.LIFECYCLE.REGISTER",
66
+ "XHS.HOOK.LIFECYCLE.SERVER_START",
67
+ "XHS.PERM.OPS.AUXILIARY_SERVER",
68
+ "XHS.PERM.SECURITY.CONFIGS",
70
69
  ],
71
70
  "policy": "allow",
72
71
  },
@@ -145,14 +144,14 @@ In order to properly function and integrate safely into your Zero-Trust XyPriss
145
144
 
146
145
  The Swagger plugin operates as an independent subsystem connected to the main server loop:
147
146
 
148
- - `PLG.LIFECYCLE.REGISTER`: Required to negotiate initialization with the core engine.
149
- - `PLG.LIFECYCLE.SERVER_START`: Allows the plugin to participate safely in the startup sequence.
150
- - `PLG.OPS.AUXILIARY_SERVER`: **Crucial.** Permits the deployment of the isolated documentation HTTP server without exposing your main server loop.
147
+ - `XHS.HOOK.LIFECYCLE.REGISTER`: Required to negotiate initialization with the core engine.
148
+ - `XHS.HOOK.LIFECYCLE.SERVER_START`: Allows the plugin to participate safely in the startup sequence.
149
+ - `XHS.PERM.OPS.AUXILIARY_SERVER`: **Crucial.** Permits the deployment of the isolated documentation HTTP server without exposing your main server loop.
151
150
 
152
151
  ### Security Access Hooks
153
152
 
154
- - `PLG.HTTP.ON_REQUEST`: Used strictly on the isolated auxiliary server to mount the documentation UI and manage static assets.
155
- - `PLG.SECURITY.ACCESS_SENSITIVE_DATA` & `PLG.SECURITY.ACCESS_CONFIGS`: Required for the plugin to introspect the router architecture and extract the internal metadata needed for documentation auto-generation.
153
+ - `XHS.PERM.SECURITY.SENSITIVE_DATA` & `XHS.PERM.SECURITY.CONFIGS`: Required for the plugin to introspect the router architecture and extract the internal metadata needed for documentation auto-generation.
154
+ - `XHS.PERM.ROUTING.BYPASS_NAMESPACE`: **Mandatory for UI registration.** As the Swagger UI is hosted on a high-level path (e.g., `/docs`), this permission is required to authorize routing outside the default `/xypriss-swagger/` namespace.
156
155
 
157
156
  By explicitly providing these permissions, you maintain complete Zero-Trust authority over what the plugin is allowed to do, preventing silent system overrides or unwanted network binding.
158
157
 
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.js","sources":["../../../../../src/configs/Logger.ts"],"sourcesContent":["import { meta } from \"./meta\";\n\n/**\n * ANSI color codes for terminal output\n */\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n\n // Foreground colors\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n gray: \"\\x1b[90m\",\n\n // Bright foreground\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n\n // Background colors\n bgRed: \"\\x1b[41m\",\n bgGreen: \"\\x1b[42m\",\n bgYellow: \"\\x1b[43m\",\n bgBlue: \"\\x1b[44m\",\n bgMagenta: \"\\x1b[45m\",\n bgCyan: \"\\x1b[46m\",\n} as const;\n\ntype LogLevel =\n | \"info\"\n | \"success\"\n | \"warn\"\n | \"error\"\n | \"debug\"\n | \"http\"\n | \"swagger\"\n | \"db\"\n | \"auth\";\n\ninterface LogConfig {\n icon: string;\n color: string;\n label: string;\n labelColor: string;\n}\n\nconst LOG_CONFIGS: Record<LogLevel, LogConfig> = {\n info: {\n icon: \"ℹ️ \",\n color: ANSI.brightCyan,\n label: \"INFO\",\n labelColor: `${ANSI.bgCyan}${ANSI.black}`,\n },\n success: {\n icon: \"✅\",\n color: ANSI.brightGreen,\n label: \"OK\",\n labelColor: `${ANSI.bgGreen}${ANSI.black}`,\n },\n warn: {\n icon: \"⚠️ \",\n color: ANSI.brightYellow,\n label: \"WARN\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n error: {\n icon: \"❌\",\n color: ANSI.brightRed,\n label: \"ERROR\",\n labelColor: `${ANSI.bgRed}${ANSI.white}`,\n },\n debug: {\n icon: \"🐛\",\n color: ANSI.gray,\n label: \"DEBUG\",\n labelColor: `${ANSI.bgMagenta}${ANSI.white}`,\n },\n http: {\n icon: \"🌐\",\n color: ANSI.brightBlue,\n label: \"HTTP\",\n labelColor: `${ANSI.bgBlue}${ANSI.white}`,\n },\n swagger: {\n icon: \"🛡️ \",\n color: ANSI.brightMagenta,\n label: \"SWAGGER\",\n labelColor: `${ANSI.bgMagenta}${ANSI.white}`,\n },\n db: {\n icon: \"🗄️ \",\n color: ANSI.yellow,\n label: \"DB\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n auth: {\n icon: \"🔐\",\n color: ANSI.brightYellow,\n label: \"AUTH\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n};\n\nexport class Logger {\n private context: string;\n private static showTimestamp = true;\n\n constructor(context: string) {\n this.context = context;\n }\n\n // ─── Static factory ───────────────────────────────────────────────────────\n\n static for(context: string): Logger {\n return new Logger(context);\n }\n\n static disableTimestamp(): void {\n Logger.showTimestamp = false;\n }\n\n // ─── Core log method ──────────────────────────────────────────────────────\n\n private log(level: LogLevel, ...args: unknown[]): void {\n const cfg = LOG_CONFIGS[level];\n const timestamp = Logger.showTimestamp\n ? `${ANSI.dim}${ANSI.gray}${new Date().toISOString()}${ANSI.reset} `\n : \"\";\n const label = `${cfg.labelColor}${ANSI.bold} ${cfg.label} ${ANSI.reset}`;\n const ctx = `${ANSI.dim}${ANSI.cyan}[${this.context}]${ANSI.reset}`;\n\n // First arg gets the level color + icon, rest are passed raw so Node.js\n // pretty-prints objects/arrays/Errors natively (no JSON.stringify needed).\n const [first, ...rest] = args;\n const prefix = `${timestamp}${label} ${ctx} ${cfg.color}${cfg.icon} ${String(first)}${ANSI.reset}`;\n\n const consoleFn =\n level === \"error\"\n ? console.error\n : level === \"warn\"\n ? console.warn\n : console.log;\n\n rest.length > 0 ? consoleFn(prefix, ...rest) : consoleFn(prefix);\n }\n\n // ─── Public methods ───────────────────────────────────────────────────────\n\n info(...args: unknown[]): void {\n this.log(\"info\", ...args);\n }\n\n success(...args: unknown[]): void {\n this.log(\"success\", ...args);\n }\n\n warn(...args: unknown[]): void {\n this.log(\"warn\", ...args);\n }\n\n error(...args: unknown[]): void {\n this.log(\"error\", ...args);\n }\n\n debug(...args: unknown[]): void {\n this.log(\"debug\", ...args);\n }\n\n http(...args: unknown[]): void {\n this.log(\"http\", ...args);\n }\n\n swagger(...args: unknown[]): void {\n this.log(\"swagger\", ...args);\n }\n\n db(...args: unknown[]): void {\n this.log(\"db\", ...args);\n }\n\n auth(...args: unknown[]): void {\n this.log(\"auth\", ...args);\n }\n\n // ─── Convenience: banner / separator ─────────────────────────────────────\n\n banner(title: string): void {\n const line = `${ANSI.cyan}${\"─\".repeat(60)}${ANSI.reset}`;\n const centered = title\n .padStart(30 + Math.floor(title.length / 2))\n .padEnd(60);\n console.log(`\\n${line}`);\n console.log(`${ANSI.bold}${ANSI.brightCyan}${centered}${ANSI.reset}`);\n console.log(`${line}\\n`);\n }\n}\n\n// ─── Default singleton logger ──────────────────────────────────────────────\n\nexport const logger = Logger.for(meta.name);"],"names":["ANSI","LOG_CONFIGS","info","icon","color","label","labelColor","success","warn","error","debug","http","swagger","db","auth","Logger","context","static","constructor","this","disableTimestamp","showTimestamp","log","level","args","cfg","timestamp","Date","toISOString","ctx","first","rest","prefix","String","consoleFn","console","length","banner","title","line","repeat","centered","padStart","Math","floor","padEnd","logger","for","meta","name"],"mappings":"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"}
1
+ {"version":3,"file":"Logger.js","sources":["../../../../src/configs/Logger.ts"],"sourcesContent":["import { meta } from \"./meta\";\n\n/**\n * ANSI color codes for terminal output\n */\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n\n // Foreground colors\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n gray: \"\\x1b[90m\",\n\n // Bright foreground\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n\n // Background colors\n bgRed: \"\\x1b[41m\",\n bgGreen: \"\\x1b[42m\",\n bgYellow: \"\\x1b[43m\",\n bgBlue: \"\\x1b[44m\",\n bgMagenta: \"\\x1b[45m\",\n bgCyan: \"\\x1b[46m\",\n} as const;\n\ntype LogLevel =\n | \"info\"\n | \"success\"\n | \"warn\"\n | \"error\"\n | \"debug\"\n | \"http\"\n | \"swagger\"\n | \"db\"\n | \"auth\";\n\ninterface LogConfig {\n icon: string;\n color: string;\n label: string;\n labelColor: string;\n}\n\nconst LOG_CONFIGS: Record<LogLevel, LogConfig> = {\n info: {\n icon: \"ℹ️ \",\n color: ANSI.brightCyan,\n label: \"INFO\",\n labelColor: `${ANSI.bgCyan}${ANSI.black}`,\n },\n success: {\n icon: \"✅\",\n color: ANSI.brightGreen,\n label: \"OK\",\n labelColor: `${ANSI.bgGreen}${ANSI.black}`,\n },\n warn: {\n icon: \"⚠️ \",\n color: ANSI.brightYellow,\n label: \"WARN\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n error: {\n icon: \"❌\",\n color: ANSI.brightRed,\n label: \"ERROR\",\n labelColor: `${ANSI.bgRed}${ANSI.white}`,\n },\n debug: {\n icon: \"🐛\",\n color: ANSI.gray,\n label: \"DEBUG\",\n labelColor: `${ANSI.bgMagenta}${ANSI.white}`,\n },\n http: {\n icon: \"🌐\",\n color: ANSI.brightBlue,\n label: \"HTTP\",\n labelColor: `${ANSI.bgBlue}${ANSI.white}`,\n },\n swagger: {\n icon: \"🛡️ \",\n color: ANSI.brightMagenta,\n label: \"SWAGGER\",\n labelColor: `${ANSI.bgMagenta}${ANSI.white}`,\n },\n db: {\n icon: \"🗄️ \",\n color: ANSI.yellow,\n label: \"DB\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n auth: {\n icon: \"🔐\",\n color: ANSI.brightYellow,\n label: \"AUTH\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n};\n\nexport class Logger {\n private context: string;\n private static showTimestamp = true;\n\n constructor(context: string) {\n this.context = context;\n }\n\n // ─── Static factory ───────────────────────────────────────────────────────\n\n static for(context: string): Logger {\n return new Logger(context);\n }\n\n static disableTimestamp(): void {\n Logger.showTimestamp = false;\n }\n\n // ─── Core log method ──────────────────────────────────────────────────────\n\n private log(level: LogLevel, ...args: unknown[]): void {\n const cfg = LOG_CONFIGS[level];\n const timestamp = Logger.showTimestamp\n ? `${ANSI.dim}${ANSI.gray}${new Date().toISOString()}${ANSI.reset} `\n : \"\";\n const label = `${cfg.labelColor}${ANSI.bold} ${cfg.label} ${ANSI.reset}`;\n const ctx = `${ANSI.dim}${ANSI.cyan}[${this.context}]${ANSI.reset}`;\n\n // First arg gets the level color + icon, rest are passed raw so Node.js\n // pretty-prints objects/arrays/Errors natively (no JSON.stringify needed).\n const [first, ...rest] = args;\n const prefix = `${timestamp}${label} ${ctx} ${cfg.color}${cfg.icon} ${String(first)}${ANSI.reset}`;\n\n const consoleFn =\n level === \"error\"\n ? console.error\n : level === \"warn\"\n ? console.warn\n : console.log;\n\n rest.length > 0 ? consoleFn(prefix, ...rest) : consoleFn(prefix);\n }\n\n // ─── Public methods ───────────────────────────────────────────────────────\n\n info(...args: unknown[]): void {\n this.log(\"info\", ...args);\n }\n\n success(...args: unknown[]): void {\n this.log(\"success\", ...args);\n }\n\n warn(...args: unknown[]): void {\n this.log(\"warn\", ...args);\n }\n\n error(...args: unknown[]): void {\n this.log(\"error\", ...args);\n }\n\n debug(...args: unknown[]): void {\n this.log(\"debug\", ...args);\n }\n\n http(...args: unknown[]): void {\n this.log(\"http\", ...args);\n }\n\n swagger(...args: unknown[]): void {\n this.log(\"swagger\", ...args);\n }\n\n db(...args: unknown[]): void {\n this.log(\"db\", ...args);\n }\n\n auth(...args: unknown[]): void {\n this.log(\"auth\", ...args);\n }\n\n // ─── Convenience: banner / separator ─────────────────────────────────────\n\n banner(title: string): void {\n const line = `${ANSI.cyan}${\"─\".repeat(60)}${ANSI.reset}`;\n const centered = title\n .padStart(30 + Math.floor(title.length / 2))\n .padEnd(60);\n console.log(`\\n${line}`);\n console.log(`${ANSI.bold}${ANSI.brightCyan}${centered}${ANSI.reset}`);\n console.log(`${line}\\n`);\n }\n}\n\n// ─── Default singleton logger ──────────────────────────────────────────────\n\nexport const logger = Logger.for(meta.name);"],"names":["ANSI","LOG_CONFIGS","info","icon","color","label","labelColor","success","warn","error","debug","http","swagger","db","auth","Logger","context","static","constructor","this","disableTimestamp","showTimestamp","log","level","args","cfg","timestamp","Date","toISOString","ctx","first","rest","prefix","String","consoleFn","console","length","banner","title","line","repeat","centered","padStart","Math","floor","padEnd","logger","for","meta","name"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sources":["../../../../../src/configs/meta.ts"],"sourcesContent":["import { ISwaggerJSONStructure } from \"../types\";\n\n// console.log(\"[PLUGIN:META] 🥸 la 'root' du plugin: \", __sys__?.__root__);\n\nconst root = __sys__.__root__;\n\nexport const meta = __sys__.fs.readJsonSync(\n __sys__.fs.join(root, \"package.json\"),\n) as ISwaggerJSONStructure;\n\nexport const toPascalCase = (str: string, spliter = \"-\") =>\n str\n .split(spliter)\n .map((n) => n[0].toUpperCase() + n.slice(1))\n .join(\" \");\n\n"],"names":["root","__sys__","__root__","meta","fs","readJsonSync","join","str","spliter","split","map","n","toUpperCase","slice"],"mappings":"aAIA,MAAMA,EAAOC,QAAQC,SAERC,EAAOF,QAAQG,GAAGC,aAC3BJ,QAAQG,GAAGE,KAAKN,EAAM,qDAGE,CAACO,EAAaC,EAAU,MAChDD,EACKE,MAAMD,GACNE,IAAKC,GAAMA,EAAE,GAAGC,cAAgBD,EAAEE,MAAM,IACxCP,KAAK"}
1
+ {"version":3,"file":"meta.js","sources":["../../../../src/configs/meta.ts"],"sourcesContent":["import { ISwaggerJSONStructure } from \"../types\";\n\n// console.log(\"[PLUGIN:META] 🥸 la 'root' du plugin: \", __sys__?.__root__);\n\nconst root = __sys__.__root__;\n\nexport const meta = __sys__.fs.readJsonSync(\n __sys__.fs.join(root, \"package.json\"),\n) as ISwaggerJSONStructure;\n\nexport const toPascalCase = (str: string, spliter = \"-\") =>\n str\n .split(spliter)\n .map((n) => n[0].toUpperCase() + n.slice(1))\n .join(\" \");\n"],"names":["root","__sys__","__root__","meta","fs","readJsonSync","join","str","spliter","split","map","n","toUpperCase","slice"],"mappings":"aAIA,MAAMA,EAAOC,QAAQC,SAERC,EAAOF,QAAQG,GAAGC,aAC3BJ,QAAQG,GAAGE,KAAKN,EAAM,qDAGE,CAACO,EAAaC,EAAU,MAChDD,EACKE,MAAMD,GACNE,IAAKC,GAAMA,EAAE,GAAGC,cAAgBD,EAAEE,MAAM,IACxCP,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/index.ts"],"sourcesContent":["import { logger, Logger } from \"./configs/Logger\";\nimport { meta, toPascalCase } from \"./configs/meta\";\nimport { SwaggerServer } from \"./server\";\nimport { SwaggerConfig } from \"./types\";\nimport { Plugin } from \"xypriss\";\n\nconst pluginName = toPascalCase(meta.name);\nexport function SwaggerPlugin(config: SwaggerConfig) {\n return Plugin.create(\n {\n name: meta.name,\n version: meta.version,\n description: meta.description,\n onRegister(_error) {\n const log = Logger.for(\"Bootstrap\");\n log.info(\"Starting swagger plugin...\");\n if (_error) {\n log.error(pluginName + \" plugin failed to start:\", _error);\n }\n },\n onServerStart(server) {\n logger.success(pluginName + \" plugin has started\");\n\n server.app.get(\"/swagger\", (_req: any, res: any) => {\n res.redirect(`http://localhost:${config.port}`);\n });\n },\n onAuxiliaryServerDeploy(ops, server) {\n SwaggerServer(config, ops, server);\n },\n }, \n __sys__.__root__,\n );\n}"],"names":["pluginName","toPascalCase","meta","name","config","Plugin","create","version","description","onRegister","_error","log","Logger","for","info","error","onServerStart","server","logger","success","app","get","_req","res","redirect","port","onAuxiliaryServerDeploy","ops","SwaggerServer","__sys__","__root__"],"mappings":"+HAMA,MAAMA,EAAaC,EAAAA,aAAaC,EAAAA,KAAKC,4BAC/B,SAAwBC,GAC1B,OAAOC,EAAAA,OAAOC,OACV,CACIH,KAAMD,EAAAA,KAAKC,KACXI,QAASL,EAAAA,KAAKK,QACdC,YAAaN,EAAAA,KAAKM,YAClB,UAAAC,CAAWC,GACP,MAAMC,EAAMC,EAAAA,OAAOC,IAAI,aACvBF,EAAIG,KAAK,8BACLJ,GACAC,EAAII,MAAMf,EAAa,2BAA4BU,EAE3D,EACA,aAAAM,CAAcC,GACVC,SAAOC,QAAQnB,EAAa,uBAE5BiB,EAAOG,IAAIC,IAAI,WAAY,CAACC,EAAWC,KACnCA,EAAIC,SAAS,oBAAoBpB,EAAOqB,SAEhD,EACA,uBAAAC,CAAwBC,EAAKV,GACzBW,EAAAA,cAAcxB,EAAQuB,EAC1B,GAEJE,QAAQC,SAEhB"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/index.ts"],"sourcesContent":["import { logger, Logger } from \"./configs/Logger\";\nimport { meta, toPascalCase } from \"./configs/meta\";\nimport { SwaggerServer } from \"./server\";\nimport { SwaggerConfig } from \"./types\";\nimport { Plugin } from \"xypriss\";\n\nconst pluginName = toPascalCase(meta.name);\nexport function SwaggerPlugin(config: SwaggerConfig) {\n return Plugin.create(\n {\n name: meta.name,\n version: meta.version,\n description: meta.description,\n onRegister(_error) {\n const log = Logger.for(\"Bootstrap\");\n log.info(\"Starting swagger plugin...\");\n if (_error) {\n log.error(pluginName + \" plugin failed to start:\", _error);\n }\n },\n onServerStart(server) {\n logger.success(pluginName + \" plugin has started\");\n\n server.app.get(\"/swagger\", (_req: any, res: any) => {\n res.redirect(`http://localhost:${config.port}`);\n });\n },\n onAuxiliaryServerDeploy(ops, server) {\n SwaggerServer(config, ops, server);\n },\n }, \n __sys__.__root__,\n );\n}"],"names":["pluginName","toPascalCase","meta","name","config","Plugin","create","version","description","onRegister","_error","log","Logger","for","info","error","onServerStart","server","logger","success","app","get","_req","res","redirect","port","onAuxiliaryServerDeploy","ops","SwaggerServer","__sys__","__root__"],"mappings":"+HAMA,MAAMA,EAAaC,EAAAA,aAAaC,EAAAA,KAAKC,4BAC/B,SAAwBC,GAC1B,OAAOC,EAAAA,OAAOC,OACV,CACIH,KAAMD,EAAAA,KAAKC,KACXI,QAASL,EAAAA,KAAKK,QACdC,YAAaN,EAAAA,KAAKM,YAClB,UAAAC,CAAWC,GACP,MAAMC,EAAMC,EAAAA,OAAOC,IAAI,aACvBF,EAAIG,KAAK,8BACLJ,GACAC,EAAII,MAAMf,EAAa,2BAA4BU,EAE3D,EACA,aAAAM,CAAcC,GACVC,SAAOC,QAAQnB,EAAa,uBAE5BiB,EAAOG,IAAIC,IAAI,WAAY,CAACC,EAAWC,KACnCA,EAAIC,SAAS,oBAAoBpB,EAAOqB,SAEhD,EACA,uBAAAC,CAAwBC,EAAKV,GACzBW,EAAAA,cAAcxB,EAAQuB,EAC1B,GAEJE,QAAQC,SAEhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.js","sources":["../../../../src/openapi.ts"],"sourcesContent":["import { meta } from \"./configs/meta\";\n\nexport interface OpenAPIConfig {\n openapi: string;\n info: {\n title: string;\n version: string;\n description?: string;\n };\n paths: Record<string, any>;\n components: {\n securitySchemes?: Record<string, any>;\n };\n}\n\nexport function generateOpenAPI(registry: any[], config: any): OpenAPIConfig {\n const doc: OpenAPIConfig = {\n openapi: meta.version,\n info: {\n title:\n __sys__.vars.__name__ ||\n config.title ||\n \"XyPriss API Documentation\",\n version: config.version || \"1.0.0\",\n description: config.description || meta.description,\n },\n paths: {},\n components: {\n securitySchemes: {\n BearerAuth: {\n type: \"http\",\n scheme: \"bearer\",\n },\n },\n },\n };\n\n for (const route of registry) {\n if (!route.path || !route.method) continue;\n\n // Convert Express-like path /users/:id to Swagger-like path /users/{id}\n // Handles: :id, :id<number>, :id(\\d+)\n const openApiPath = route.path.replace(\n /:([a-zA-Z0-9_]+)(?:<[^>]+>)?(?:\\([^)]+\\))?/g,\n \"{$1}\",\n );\n\n if (!doc.paths[openApiPath]) {\n doc.paths[openApiPath] = {};\n }\n\n const methodStr = (\n Array.isArray(route.method) ? route.method[0] : route.method\n ).toLowerCase();\n\n // Base operation object\n const operation: any = {\n summary: route.meta?.summary || `${route.method} ${route.path}`,\n description: route.meta?.description || \"\",\n tags: route.meta?.tags || [\"Default\"],\n parameters: [],\n responses: route.responses || {\n \"200\": {\n description: \"Successful response\",\n },\n },\n };\n\n // If guards are detected, optionally assume it requires Auth\n if (route.hasGuards) {\n operation.security = [{ BearerAuth: [] }];\n }\n\n // Add Path Parameters\n if (route.paramNames && route.paramNames.length > 0) {\n for (const param of route.paramNames) {\n const constraint = route.paramConstraints?.[param];\n let type = \"string\";\n let pattern: string | undefined = undefined;\n\n if (constraint) {\n if (\n constraint.type === \"number\" ||\n constraint.type === \"integer\"\n ) {\n type = \"number\";\n } else if (constraint.type === \"boolean\") {\n type = \"boolean\";\n } else if (\n constraint.type === \"regex\" &&\n typeof constraint.options === \"string\"\n ) {\n pattern = constraint.options;\n } else if (constraint.type === \"uuid\") {\n pattern =\n \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\";\n }\n }\n\n operation.parameters.push({\n name: param,\n in: \"path\",\n required: true,\n schema: {\n type,\n pattern,\n },\n });\n }\n }\n\n // Add additional meta (like requestBody, query params) if defined by user within meta.openapi\n if (route.meta?.openapi) {\n Object.assign(operation, route.meta.openapi);\n }\n\n doc.paths[openApiPath][methodStr] = operation;\n }\n\n return doc;\n}\n\n"],"names":["registry","config","doc","openapi","meta","version","info","title","__sys__","vars","__name__","description","paths","components","securitySchemes","BearerAuth","type","scheme","route","path","method","openApiPath","replace","methodStr","Array","isArray","toLowerCase","operation","summary","tags","parameters","responses","hasGuards","security","paramNames","length","param","constraint","paramConstraints","pattern","options","push","name","in","required","schema","Object","assign"],"mappings":"wEAeM,SAA0BA,EAAiBC,GAC7C,MAAMC,EAAqB,CACvBC,QAASC,EAAAA,KAAKC,QACdC,KAAM,CACFC,MACIC,QAAQC,KAAKC,UACbT,EAAOM,OACP,4BACJF,QAASJ,EAAOI,SAAW,QAC3BM,YAAaV,EAAOU,aAAeP,EAAAA,KAAKO,aAE5CC,MAAO,CAAA,EACPC,WAAY,CACRC,gBAAiB,CACbC,WAAY,CACRC,KAAM,OACNC,OAAQ,aAMxB,IAAK,MAAMC,KAASlB,EAAU,CAC1B,IAAKkB,EAAMC,OAASD,EAAME,OAAQ,SAIlC,MAAMC,EAAcH,EAAMC,KAAKG,QAC3B,8CACA,QAGCpB,EAAIU,MAAMS,KACXnB,EAAIU,MAAMS,GAAe,CAAA,GAG7B,MAAME,GACFC,MAAMC,QAAQP,EAAME,QAAUF,EAAME,OAAO,GAAKF,EAAME,QACxDM,cAGIC,EAAiB,CACnBC,QAASV,EAAMd,MAAMwB,SAAW,GAAGV,EAAME,UAAUF,EAAMC,OACzDR,YAAaO,EAAMd,MAAMO,aAAe,GACxCkB,KAAMX,EAAMd,MAAMyB,MAAQ,CAAC,WAC3BC,WAAY,GACZC,UAAWb,EAAMa,WAAa,CAC1B,IAAO,CACHpB,YAAa,yBAWzB,GALIO,EAAMc,YACNL,EAAUM,SAAW,CAAC,CAAElB,WAAY,MAIpCG,EAAMgB,YAAchB,EAAMgB,WAAWC,OAAS,EAC9C,IAAK,MAAMC,KAASlB,EAAMgB,WAAY,CAClC,MAAMG,EAAanB,EAAMoB,mBAAmBF,GAC5C,IACIG,EADAvB,EAAO,SAGPqB,IAEwB,WAApBA,EAAWrB,MACS,YAApBqB,EAAWrB,KAEXA,EAAO,SACoB,YAApBqB,EAAWrB,KAClBA,EAAO,UAEa,UAApBqB,EAAWrB,MACmB,iBAAvBqB,EAAWG,QAElBD,EAAUF,EAAWG,QACM,SAApBH,EAAWrB,OAClBuB,EACI,mEAIZZ,EAAUG,WAAWW,KAAK,CACtBC,KAAMN,EACNO,GAAI,OACJC,UAAU,EACVC,OAAQ,CACJ7B,OACAuB,YAGZ,CAIArB,EAAMd,MAAMD,SACZ2C,OAAOC,OAAOpB,EAAWT,EAAMd,KAAKD,SAGxCD,EAAIU,MAAMS,GAAaE,GAAaI,CACxC,CAEA,OAAOzB,CACX"}
1
+ {"version":3,"file":"openapi.js","sources":["../../../src/openapi.ts"],"sourcesContent":["import { meta } from \"./configs/meta\";\n\nexport interface OpenAPIConfig {\n openapi: string;\n info: {\n title: string;\n version: string;\n description?: string;\n };\n paths: Record<string, any>;\n components: {\n securitySchemes?: Record<string, any>;\n };\n}\n\nexport function generateOpenAPI(registry: any[], config: any): OpenAPIConfig {\n const doc: OpenAPIConfig = {\n openapi: meta.version,\n info: {\n title:\n __sys__.vars.__name__ ||\n config.title ||\n \"XyPriss API Documentation\",\n version: config.version || \"1.0.0\",\n description: config.description || meta.description,\n },\n paths: {},\n components: {\n securitySchemes: {\n BearerAuth: {\n type: \"http\",\n scheme: \"bearer\",\n },\n },\n },\n };\n\n for (const route of registry) {\n if (!route.path || !route.method) continue;\n\n // Convert Express-like path /users/:id to Swagger-like path /users/{id}\n // Handles: :id, :id<number>, :id(\\d+)\n const openApiPath = route.path.replace(\n /:([a-zA-Z0-9_]+)(?:<[^>]+>)?(?:\\([^)]+\\))?/g,\n \"{$1}\",\n );\n\n if (!doc.paths[openApiPath]) {\n doc.paths[openApiPath] = {};\n }\n\n const methodStr = (\n Array.isArray(route.method) ? route.method[0] : route.method\n ).toLowerCase();\n\n // Base operation object\n const operation: any = {\n summary: route.meta?.summary || `${route.method} ${route.path}`,\n description: route.meta?.description || \"\",\n tags: route.meta?.tags || [\"Default\"],\n parameters: [],\n responses: route.responses || {\n \"200\": {\n description: \"Successful response\",\n },\n },\n };\n\n // If guards are detected, optionally assume it requires Auth\n if (route.hasGuards) {\n operation.security = [{ BearerAuth: [] }];\n }\n\n // Add Path Parameters\n if (route.paramNames && route.paramNames.length > 0) {\n for (const param of route.paramNames) {\n const constraint = route.paramConstraints?.[param];\n let type = \"string\";\n let pattern: string | undefined = undefined;\n\n if (constraint) {\n if (\n constraint.type === \"number\" ||\n constraint.type === \"integer\"\n ) {\n type = \"number\";\n } else if (constraint.type === \"boolean\") {\n type = \"boolean\";\n } else if (\n constraint.type === \"regex\" &&\n typeof constraint.options === \"string\"\n ) {\n pattern = constraint.options;\n } else if (constraint.type === \"uuid\") {\n pattern =\n \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\";\n }\n }\n\n operation.parameters.push({\n name: param,\n in: \"path\",\n required: true,\n schema: {\n type,\n pattern,\n },\n });\n }\n }\n\n // Add additional meta (like requestBody, query params) if defined by user within meta.openapi\n if (route.meta?.openapi) {\n Object.assign(operation, route.meta.openapi);\n }\n\n doc.paths[openApiPath][methodStr] = operation;\n }\n\n return doc;\n}\n\n"],"names":["registry","config","doc","openapi","meta","version","info","title","__sys__","vars","__name__","description","paths","components","securitySchemes","BearerAuth","type","scheme","route","path","method","openApiPath","replace","methodStr","Array","isArray","toLowerCase","operation","summary","tags","parameters","responses","hasGuards","security","paramNames","length","param","constraint","paramConstraints","pattern","options","push","name","in","required","schema","Object","assign"],"mappings":"wEAeM,SAA0BA,EAAiBC,GAC7C,MAAMC,EAAqB,CACvBC,QAASC,EAAAA,KAAKC,QACdC,KAAM,CACFC,MACIC,QAAQC,KAAKC,UACbT,EAAOM,OACP,4BACJF,QAASJ,EAAOI,SAAW,QAC3BM,YAAaV,EAAOU,aAAeP,EAAAA,KAAKO,aAE5CC,MAAO,CAAA,EACPC,WAAY,CACRC,gBAAiB,CACbC,WAAY,CACRC,KAAM,OACNC,OAAQ,aAMxB,IAAK,MAAMC,KAASlB,EAAU,CAC1B,IAAKkB,EAAMC,OAASD,EAAME,OAAQ,SAIlC,MAAMC,EAAcH,EAAMC,KAAKG,QAC3B,8CACA,QAGCpB,EAAIU,MAAMS,KACXnB,EAAIU,MAAMS,GAAe,CAAA,GAG7B,MAAME,GACFC,MAAMC,QAAQP,EAAME,QAAUF,EAAME,OAAO,GAAKF,EAAME,QACxDM,cAGIC,EAAiB,CACnBC,QAASV,EAAMd,MAAMwB,SAAW,GAAGV,EAAME,UAAUF,EAAMC,OACzDR,YAAaO,EAAMd,MAAMO,aAAe,GACxCkB,KAAMX,EAAMd,MAAMyB,MAAQ,CAAC,WAC3BC,WAAY,GACZC,UAAWb,EAAMa,WAAa,CAC1B,IAAO,CACHpB,YAAa,yBAWzB,GALIO,EAAMc,YACNL,EAAUM,SAAW,CAAC,CAAElB,WAAY,MAIpCG,EAAMgB,YAAchB,EAAMgB,WAAWC,OAAS,EAC9C,IAAK,MAAMC,KAASlB,EAAMgB,WAAY,CAClC,MAAMG,EAAanB,EAAMoB,mBAAmBF,GAC5C,IACIG,EADAvB,EAAO,SAGPqB,IAEwB,WAApBA,EAAWrB,MACS,YAApBqB,EAAWrB,KAEXA,EAAO,SACoB,YAApBqB,EAAWrB,KAClBA,EAAO,UAEa,UAApBqB,EAAWrB,MACmB,iBAAvBqB,EAAWG,QAElBD,EAAUF,EAAWG,QACM,SAApBH,EAAWrB,OAClBuB,EACI,mEAIZZ,EAAUG,WAAWW,KAAK,CACtBC,KAAMN,EACNO,GAAI,OACJC,UAAU,EACVC,OAAQ,CACJ7B,OACAuB,YAGZ,CAIArB,EAAMd,MAAMD,SACZ2C,OAAOC,OAAOpB,EAAWT,EAAMd,KAAKD,SAGxCD,EAAIU,MAAMS,GAAaE,GAAaI,CACxC,CAEA,OAAOzB,CACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../../../src/server.ts"],"sourcesContent":["import { logger } from \"./configs/Logger\";\nimport { meta, toPascalCase } from \"./configs/meta\";\nimport { generateOpenAPI } from \"./openapi\";\nimport { SwaggerConfig } from \"./types\";\nimport { getSwaggerUIStream } from \"./ui\";\nimport { Plugin } from \"xypriss\";\n\ntype auxis = NonNullable<\n ReturnType<typeof Plugin.create>[\"onAuxiliaryServerDeploy\"]\n>;\nexport type OpsServerManager = Parameters<auxis>[\"0\"] & {\n getRouteRegistry?: () => any[];\n};\n\nexport type XyPrissServer = Parameters<auxis>[\"1\"];\n\nexport function SwaggerServer(\n config: SwaggerConfig,\n ops: OpsServerManager,\n _XServer: XyPrissServer,\n) {\n const docPath = config.path || \"/docs\";\n const specPath = `${docPath}/swagger.json`;\n\n const workspaceSYS = __sys__.plugins.get(meta.name);\n\n if (!workspaceSYS) {\n throw new Error(\n toPascalCase(meta.name, \"-\") +\n \" is not authorized in your xypriss.config.jsonc or xypriss.config.json. Please add \",\n );\n }\n\n const port = config.port || 7070;\n const server = ops.createAuxiliaryServer({\n server: { port },\n security: {\n enabled: false,\n },\n });\n\n // Serve the raw OpenAPI JSON specification\n server.get(specPath, (_req, res) => {\n try {\n let registry: any[] = [];\n\n if (ops.getRouteRegistry) {\n registry = ops.getRouteRegistry();\n }\n\n const spec = generateOpenAPI(registry, config);\n res.json(spec);\n } catch (error) {\n logger.error(\"Error generating OpenAPI spec:\", error);\n res.status(500).json({\n error: \"Failed to generate documentation\",\n });\n }\n });\n\n // Serve the Swagger HTML Viewer\n server.get(docPath, (_req, res) => {\n const title =\n config.title || workspaceSYS?.vars?.__name__ || \"API Documentation\";\n const stream = getSwaggerUIStream(specPath, title);\n\n res.setHeader(\"Content-Type\", \"text/html\");\n stream.pipe(res);\n });\n\n // Redirect root path of the sub-server to docPath\n server.redirect(\"/\", docPath, 301);\n\n // Boot the auxiliary server immediately\n const url = `http://localhost:${port}${docPath}`;\n server.start(() => {\n logger.swagger(\n `${toPascalCase(meta.name)} Server isolated on port ${port}`,\n );\n logger.http(`GET ${url}`);\n });\n}\n\n"],"names":["config","ops","_XServer","docPath","path","specPath","workspaceSYS","__sys__","plugins","get","meta","name","Error","toPascalCase","port","server","createAuxiliaryServer","security","enabled","_req","res","registry","getRouteRegistry","spec","generateOpenAPI","json","error","logger","status","title","vars","__name__","stream","getSwaggerUIStream","setHeader","pipe","redirect","url","start","swagger","http"],"mappings":"+JAiBIA,EACAC,EACAC,GAEA,MAAMC,EAAUH,EAAOI,MAAQ,QACzBC,EAAW,GAAGF,iBAEdG,EAAeC,QAAQC,QAAQC,IAAIC,EAAAA,KAAKC,MAE9C,IAAKL,EACD,MAAM,IAAIM,MACNC,EAAAA,aAAaH,EAAAA,KAAKC,KAAM,KACpB,uFAIZ,MAAMG,EAAOd,EAAOc,MAAQ,KACtBC,EAASd,EAAIe,sBAAsB,CACrCD,OAAQ,CAAED,QACVG,SAAU,CACNC,SAAS,KAKjBH,EAAON,IAAIJ,EAAU,CAACc,EAAMC,KACxB,IACI,IAAIC,EAAkB,GAElBpB,EAAIqB,mBACJD,EAAWpB,EAAIqB,oBAGnB,MAAMC,EAAOC,EAAAA,gBAAgBH,EAAUrB,GACvCoB,EAAIK,KAAKF,EACb,CAAE,MAAOG,GACLC,SAAOD,MAAM,iCAAkCA,GAC/CN,EAAIQ,OAAO,KAAKH,KAAK,CACjBC,MAAO,oCAEf,IAIJX,EAAON,IAAIN,EAAS,CAACgB,EAAMC,KACvB,MAAMS,EACF7B,EAAO6B,OAASvB,GAAcwB,MAAMC,UAAY,oBAC9CC,EAASC,EAAAA,mBAAmB5B,EAAUwB,GAE5CT,EAAIc,UAAU,eAAgB,aAC9BF,EAAOG,KAAKf,KAIhBL,EAAOqB,SAAS,IAAKjC,EAAS,KAG9B,MAAMkC,EAAM,oBAAoBvB,IAAOX,IACvCY,EAAOuB,MAAM,KACTX,SAAOY,QACH,GAAG1B,eAAaH,EAAAA,KAAKC,iCAAiCG,KAE1Da,EAAAA,OAAOa,KAAK,OAAOH,MAE3B"}
1
+ {"version":3,"file":"server.js","sources":["../../../src/server.ts"],"sourcesContent":["import { logger } from \"./configs/Logger\";\nimport { meta, toPascalCase } from \"./configs/meta\";\nimport { generateOpenAPI } from \"./openapi\";\nimport { SwaggerConfig } from \"./types\";\nimport { getSwaggerUIStream } from \"./ui\";\nimport { Plugin } from \"xypriss\";\n\ntype auxis = NonNullable<\n ReturnType<typeof Plugin.create>[\"onAuxiliaryServerDeploy\"]\n>;\nexport type OpsServerManager = Parameters<auxis>[\"0\"] & {\n getRouteRegistry?: () => any[];\n};\n\nexport type XyPrissServer = Parameters<auxis>[\"1\"];\n\nexport function SwaggerServer(\n config: SwaggerConfig,\n ops: OpsServerManager,\n _XServer: XyPrissServer,\n) {\n const docPath = config.path || \"/docs\";\n const specPath = `${docPath}/swagger.json`;\n\n const workspaceSYS = __sys__.plugins.get(meta.name);\n\n if (!workspaceSYS) {\n throw new Error(\n toPascalCase(meta.name, \"-\") +\n \" is not authorized in your xypriss.config.jsonc or xypriss.config.json. Please add \",\n );\n }\n\n const port = config.port || 7070;\n const server = ops.createAuxiliaryServer({\n server: { port },\n security: {\n enabled: false,\n },\n });\n\n // Serve the raw OpenAPI JSON specification\n server.get(specPath, (_req, res) => {\n try {\n let registry: any[] = [];\n\n if (ops.getRouteRegistry) {\n registry = ops.getRouteRegistry();\n }\n\n const spec = generateOpenAPI(registry, config);\n res.json(spec);\n } catch (error) {\n logger.error(\"Error generating OpenAPI spec:\", error);\n res.status(500).json({\n error: \"Failed to generate documentation\",\n });\n }\n });\n\n // Serve the Swagger HTML Viewer\n server.get(docPath, (_req, res) => {\n const title =\n config.title || workspaceSYS?.vars?.__name__ || \"API Documentation\";\n const stream = getSwaggerUIStream(specPath, title);\n\n res.setHeader(\"Content-Type\", \"text/html\");\n stream.pipe(res);\n });\n\n // Redirect root path of the sub-server to docPath\n server.redirect(\"/\", docPath, 301);\n\n // Boot the auxiliary server immediately\n const url = `http://localhost:${port}${docPath}`;\n server.start(() => {\n logger.swagger(\n `${toPascalCase(meta.name)} Server isolated on port ${port}`,\n );\n logger.http(`GET ${url}`);\n });\n}\n\n"],"names":["config","ops","_XServer","docPath","path","specPath","workspaceSYS","__sys__","plugins","get","meta","name","Error","toPascalCase","port","server","createAuxiliaryServer","security","enabled","_req","res","registry","getRouteRegistry","spec","generateOpenAPI","json","error","logger","status","title","vars","__name__","stream","getSwaggerUIStream","setHeader","pipe","redirect","url","start","swagger","http"],"mappings":"+JAiBIA,EACAC,EACAC,GAEA,MAAMC,EAAUH,EAAOI,MAAQ,QACzBC,EAAW,GAAGF,iBAEdG,EAAeC,QAAQC,QAAQC,IAAIC,EAAAA,KAAKC,MAE9C,IAAKL,EACD,MAAM,IAAIM,MACNC,EAAAA,aAAaH,EAAAA,KAAKC,KAAM,KACpB,uFAIZ,MAAMG,EAAOd,EAAOc,MAAQ,KACtBC,EAASd,EAAIe,sBAAsB,CACrCD,OAAQ,CAAED,QACVG,SAAU,CACNC,SAAS,KAKjBH,EAAON,IAAIJ,EAAU,CAACc,EAAMC,KACxB,IACI,IAAIC,EAAkB,GAElBpB,EAAIqB,mBACJD,EAAWpB,EAAIqB,oBAGnB,MAAMC,EAAOC,EAAAA,gBAAgBH,EAAUrB,GACvCoB,EAAIK,KAAKF,EACb,CAAE,MAAOG,GACLC,SAAOD,MAAM,iCAAkCA,GAC/CN,EAAIQ,OAAO,KAAKH,KAAK,CACjBC,MAAO,oCAEf,IAIJX,EAAON,IAAIN,EAAS,CAACgB,EAAMC,KACvB,MAAMS,EACF7B,EAAO6B,OAASvB,GAAcwB,MAAMC,UAAY,oBAC9CC,EAASC,EAAAA,mBAAmB5B,EAAUwB,GAE5CT,EAAIc,UAAU,eAAgB,aAC9BF,EAAOG,KAAKf,KAIhBL,EAAOqB,SAAS,IAAKjC,EAAS,KAG9B,MAAMkC,EAAM,oBAAoBvB,IAAOX,IACvCY,EAAOuB,MAAM,KACTX,SAAOY,QACH,GAAG1B,eAAaH,EAAAA,KAAKC,iCAAiCG,KAE1Da,EAAAA,OAAOa,KAAK,OAAOH,MAE3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sources":["../../../../src/ui.ts"],"sourcesContent":["import { Transform, TransformCallback, Readable } from \"node:stream\";\nimport \"xypriss\";\nimport { meta } from \"./configs/meta\";\n\n/**\n * **Template Transform Stream**\n *\n * Safely replaces {{key}} placeholders in a stream of text.\n * Handles split placeholders across chunks by buffering the end of chunks.\n */\nclass TemplateTransform extends Transform {\n private remaining: string = \"\";\n private placeholders: Record<string, string>;\n\n constructor(placeholders: Record<string, string>) {\n super({ decodeStrings: false, encoding: \"utf-8\" });\n this.placeholders = placeholders;\n }\n\n _transform(\n chunk: any,\n _encoding: string,\n callback: TransformCallback,\n ): void {\n let content = this.remaining + chunk.toString();\n\n // Perform replacements\n for (const [key, value] of Object.entries(this.placeholders)) {\n const regex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\");\n content = content.replace(regex, value);\n }\n\n /**\n * To handle split placeholders (e.g., \"{{ti\" at end of chunk),\n * we look for the last \"{{\" in the last few characters.\n * If we find one that doesn't have a matching \"}}\", we buffer it.\n */\n const lastOpening = content.lastIndexOf(\"{{\");\n const lastClosing = content.lastIndexOf(\"}}\");\n\n if (lastOpening > lastClosing && lastOpening > content.length - 20) {\n this.remaining = content.slice(lastOpening);\n this.push(content.slice(0, lastOpening));\n } else {\n this.remaining = \"\";\n this.push(content);\n }\n\n callback();\n }\n\n _flush(callback: TransformCallback): void {\n this.push(this.remaining);\n callback();\n }\n}\n\n/**\n * **Get Swagger UI Stream**\n *\n * Returns a readable stream for the Swagger UI HTML with template variables\n * injected via a Transform stream.\n */\nexport function getSwaggerUIStream(specUrl: string, title: string): Readable {\n const templatePath = __sys__.fs.join(\n __sys__.__root__,\n \"dist\",\n \"template\",\n \"ui.html\",\n );\n\n // native high-performance stream\n const source = __sys__.fs.createReadStream(templatePath);\n const transform = new TemplateTransform({\n specUrl,\n title,\n version: meta.version,\n year: new Date().getFullYear().toString(),\n nehonix_url: \"https://nehonix.com\",\n });\n\n return source.pipe(transform);\n}\n\n/**\n * @deprecated Use getSwaggerUIStream for better performance\n */\nexport function getSwaggerUIHtml(specUrl: string, title: string): string {\n const templatePath = __sys__.fs.join(\n __sys__.__root__,\n \"dist\",\n \"template\",\n \"ui.html\",\n );\n\n try {\n let html = __sys__.fs.readFileSync(templatePath, \"utf-8\");\n html = html.replace(/\\{\\{title\\}\\}/g, title);\n html = html.replace(/\\{\\{specUrl\\}\\}/g, specUrl);\n html = html.replace(/\\{\\{version\\}\\}/g, meta.version);\n html = html.replace(\n /\\{\\{year\\}\\}/g,\n new Date().getFullYear().toString(),\n );\n html = html.replace(/\\{\\{nehonix_url\\}\\}/g, \"https://nehonix.com\");\n return html;\n } catch (error) {\n return `<h1>Error loading Swagger UI</h1><p>${String(error)}</p>`;\n }\n}\n\n"],"names":["TemplateTransform","Transform","remaining","placeholders","constructor","super","decodeStrings","encoding","this","_transform","chunk","_encoding","callback","content","toString","key","value","Object","entries","regex","RegExp","replace","lastOpening","lastIndexOf","length","slice","push","_flush","specUrl","title","templatePath","__sys__","fs","join","__root__","source","createReadStream","transform","version","meta","year","Date","getFullYear","nehonix_url","pipe"],"mappings":"gGAUA,MAAMA,UAA0BC,EAAAA,UACpBC,UAAoB,GACpBC,aAER,WAAAC,CAAYD,GACRE,MAAM,CAAEC,eAAe,EAAOC,SAAU,UACxCC,KAAKL,aAAeA,CACxB,CAEA,UAAAM,CACIC,EACAC,EACAC,GAEA,IAAIC,EAAUL,KAAKN,UAAYQ,EAAMI,WAGrC,IAAK,MAAOC,EAAKC,KAAUC,OAAOC,QAAQV,KAAKL,cAAe,CAC1D,MAAMgB,EAAQ,IAAIC,OAAO,SAASL,UAAa,KAC/CF,EAAUA,EAAQQ,QAAQF,EAAOH,EACrC,CAOA,MAAMM,EAAcT,EAAQU,YAAY,MAGpCD,EAFgBT,EAAQU,YAAY,OAEPD,EAAcT,EAAQW,OAAS,IAC5DhB,KAAKN,UAAYW,EAAQY,MAAMH,GAC/Bd,KAAKkB,KAAKb,EAAQY,MAAM,EAAGH,MAE3Bd,KAAKN,UAAY,GACjBM,KAAKkB,KAAKb,IAGdD,GACJ,CAEA,MAAAe,CAAOf,GACHJ,KAAKkB,KAAKlB,KAAKN,WACfU,GACJ,6BASE,SAA6BgB,EAAiBC,GAChD,MAAMC,EAAeC,QAAQC,GAAGC,KAC5BF,QAAQG,SACR,OACA,WACA,WAIEC,EAASJ,QAAQC,GAAGI,iBAAiBN,GACrCO,EAAY,IAAIrC,EAAkB,CACpC4B,UACAC,QACAS,QAASC,EAAAA,KAAKD,QACdE,MAAM,IAAIC,MAAOC,cAAc5B,WAC/B6B,YAAa,wBAGjB,OAAOR,EAAOS,KAAKP,EACvB"}
1
+ {"version":3,"file":"ui.js","sources":["../../../src/ui.ts"],"sourcesContent":["import { Transform, TransformCallback, Readable } from \"node:stream\";\nimport \"xypriss\";\nimport { meta } from \"./configs/meta\";\n\n/**\n * **Template Transform Stream**\n *\n * Safely replaces {{key}} placeholders in a stream of text.\n * Handles split placeholders across chunks by buffering the end of chunks.\n */\nclass TemplateTransform extends Transform {\n private remaining: string = \"\";\n private placeholders: Record<string, string>;\n\n constructor(placeholders: Record<string, string>) {\n super({ decodeStrings: false, encoding: \"utf-8\" });\n this.placeholders = placeholders;\n }\n\n _transform(\n chunk: any,\n _encoding: string,\n callback: TransformCallback,\n ): void {\n let content = this.remaining + chunk.toString();\n\n // Perform replacements\n for (const [key, value] of Object.entries(this.placeholders)) {\n const regex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\");\n content = content.replace(regex, value);\n }\n\n /**\n * To handle split placeholders (e.g., \"{{ti\" at end of chunk),\n * we look for the last \"{{\" in the last few characters.\n * If we find one that doesn't have a matching \"}}\", we buffer it.\n */\n const lastOpening = content.lastIndexOf(\"{{\");\n const lastClosing = content.lastIndexOf(\"}}\");\n\n if (lastOpening > lastClosing && lastOpening > content.length - 20) {\n this.remaining = content.slice(lastOpening);\n this.push(content.slice(0, lastOpening));\n } else {\n this.remaining = \"\";\n this.push(content);\n }\n\n callback();\n }\n\n _flush(callback: TransformCallback): void {\n this.push(this.remaining);\n callback();\n }\n}\n\n/**\n * **Get Swagger UI Stream**\n *\n * Returns a readable stream for the Swagger UI HTML with template variables\n * injected via a Transform stream.\n */\nexport function getSwaggerUIStream(specUrl: string, title: string): Readable {\n const templatePath = __sys__.fs.join(\n __sys__.__root__,\n \"dist\",\n \"template\",\n \"ui.html\",\n );\n\n // native high-performance stream\n const source = __sys__.fs.createReadStream(templatePath);\n const transform = new TemplateTransform({\n specUrl,\n title,\n version: meta.version,\n year: new Date().getFullYear().toString(),\n nehonix_url: \"https://nehonix.com\",\n });\n\n return source.pipe(transform);\n}\n\n/**\n * @deprecated Use getSwaggerUIStream for better performance\n */\nexport function getSwaggerUIHtml(specUrl: string, title: string): string {\n const templatePath = __sys__.fs.join(\n __sys__.__root__,\n \"dist\",\n \"template\",\n \"ui.html\",\n );\n\n try {\n let html = __sys__.fs.readFileSync(templatePath, \"utf-8\");\n html = html.replace(/\\{\\{title\\}\\}/g, title);\n html = html.replace(/\\{\\{specUrl\\}\\}/g, specUrl);\n html = html.replace(/\\{\\{version\\}\\}/g, meta.version);\n html = html.replace(\n /\\{\\{year\\}\\}/g,\n new Date().getFullYear().toString(),\n );\n html = html.replace(/\\{\\{nehonix_url\\}\\}/g, \"https://nehonix.com\");\n return html;\n } catch (error) {\n return `<h1>Error loading Swagger UI</h1><p>${String(error)}</p>`;\n }\n}\n\n"],"names":["TemplateTransform","Transform","remaining","placeholders","constructor","super","decodeStrings","encoding","this","_transform","chunk","_encoding","callback","content","toString","key","value","Object","entries","regex","RegExp","replace","lastOpening","lastIndexOf","length","slice","push","_flush","specUrl","title","templatePath","__sys__","fs","join","__root__","source","createReadStream","transform","version","meta","year","Date","getFullYear","nehonix_url","pipe"],"mappings":"gGAUA,MAAMA,UAA0BC,EAAAA,UACpBC,UAAoB,GACpBC,aAER,WAAAC,CAAYD,GACRE,MAAM,CAAEC,eAAe,EAAOC,SAAU,UACxCC,KAAKL,aAAeA,CACxB,CAEA,UAAAM,CACIC,EACAC,EACAC,GAEA,IAAIC,EAAUL,KAAKN,UAAYQ,EAAMI,WAGrC,IAAK,MAAOC,EAAKC,KAAUC,OAAOC,QAAQV,KAAKL,cAAe,CAC1D,MAAMgB,EAAQ,IAAIC,OAAO,SAASL,UAAa,KAC/CF,EAAUA,EAAQQ,QAAQF,EAAOH,EACrC,CAOA,MAAMM,EAAcT,EAAQU,YAAY,MAGpCD,EAFgBT,EAAQU,YAAY,OAEPD,EAAcT,EAAQW,OAAS,IAC5DhB,KAAKN,UAAYW,EAAQY,MAAMH,GAC/Bd,KAAKkB,KAAKb,EAAQY,MAAM,EAAGH,MAE3Bd,KAAKN,UAAY,GACjBM,KAAKkB,KAAKb,IAGdD,GACJ,CAEA,MAAAe,CAAOf,GACHJ,KAAKkB,KAAKlB,KAAKN,WACfU,GACJ,6BASE,SAA6BgB,EAAiBC,GAChD,MAAMC,EAAeC,QAAQC,GAAGC,KAC5BF,QAAQG,SACR,OACA,WACA,WAIEC,EAASJ,QAAQC,GAAGI,iBAAiBN,GACrCO,EAAY,IAAIrC,EAAkB,CACpC4B,UACAC,QACAS,QAASC,EAAAA,KAAKD,QACdE,MAAM,IAAIC,MAAOC,cAAc5B,WAC/B6B,YAAa,wBAGjB,OAAOR,EAAOS,KAAKP,EACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.js","sources":["../../../../../src/configs/Logger.ts"],"sourcesContent":["import { meta } from \"./meta\";\n\n/**\n * ANSI color codes for terminal output\n */\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n\n // Foreground colors\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n gray: \"\\x1b[90m\",\n\n // Bright foreground\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n\n // Background colors\n bgRed: \"\\x1b[41m\",\n bgGreen: \"\\x1b[42m\",\n bgYellow: \"\\x1b[43m\",\n bgBlue: \"\\x1b[44m\",\n bgMagenta: \"\\x1b[45m\",\n bgCyan: \"\\x1b[46m\",\n} as const;\n\ntype LogLevel =\n | \"info\"\n | \"success\"\n | \"warn\"\n | \"error\"\n | \"debug\"\n | \"http\"\n | \"swagger\"\n | \"db\"\n | \"auth\";\n\ninterface LogConfig {\n icon: string;\n color: string;\n label: string;\n labelColor: string;\n}\n\nconst LOG_CONFIGS: Record<LogLevel, LogConfig> = {\n info: {\n icon: \"ℹ️ \",\n color: ANSI.brightCyan,\n label: \"INFO\",\n labelColor: `${ANSI.bgCyan}${ANSI.black}`,\n },\n success: {\n icon: \"✅\",\n color: ANSI.brightGreen,\n label: \"OK\",\n labelColor: `${ANSI.bgGreen}${ANSI.black}`,\n },\n warn: {\n icon: \"⚠️ \",\n color: ANSI.brightYellow,\n label: \"WARN\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n error: {\n icon: \"❌\",\n color: ANSI.brightRed,\n label: \"ERROR\",\n labelColor: `${ANSI.bgRed}${ANSI.white}`,\n },\n debug: {\n icon: \"🐛\",\n color: ANSI.gray,\n label: \"DEBUG\",\n labelColor: `${ANSI.bgMagenta}${ANSI.white}`,\n },\n http: {\n icon: \"🌐\",\n color: ANSI.brightBlue,\n label: \"HTTP\",\n labelColor: `${ANSI.bgBlue}${ANSI.white}`,\n },\n swagger: {\n icon: \"🛡️ \",\n color: ANSI.brightMagenta,\n label: \"SWAGGER\",\n labelColor: `${ANSI.bgMagenta}${ANSI.white}`,\n },\n db: {\n icon: \"🗄️ \",\n color: ANSI.yellow,\n label: \"DB\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n auth: {\n icon: \"🔐\",\n color: ANSI.brightYellow,\n label: \"AUTH\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n};\n\nexport class Logger {\n private context: string;\n private static showTimestamp = true;\n\n constructor(context: string) {\n this.context = context;\n }\n\n // ─── Static factory ───────────────────────────────────────────────────────\n\n static for(context: string): Logger {\n return new Logger(context);\n }\n\n static disableTimestamp(): void {\n Logger.showTimestamp = false;\n }\n\n // ─── Core log method ──────────────────────────────────────────────────────\n\n private log(level: LogLevel, ...args: unknown[]): void {\n const cfg = LOG_CONFIGS[level];\n const timestamp = Logger.showTimestamp\n ? `${ANSI.dim}${ANSI.gray}${new Date().toISOString()}${ANSI.reset} `\n : \"\";\n const label = `${cfg.labelColor}${ANSI.bold} ${cfg.label} ${ANSI.reset}`;\n const ctx = `${ANSI.dim}${ANSI.cyan}[${this.context}]${ANSI.reset}`;\n\n // First arg gets the level color + icon, rest are passed raw so Node.js\n // pretty-prints objects/arrays/Errors natively (no JSON.stringify needed).\n const [first, ...rest] = args;\n const prefix = `${timestamp}${label} ${ctx} ${cfg.color}${cfg.icon} ${String(first)}${ANSI.reset}`;\n\n const consoleFn =\n level === \"error\"\n ? console.error\n : level === \"warn\"\n ? console.warn\n : console.log;\n\n rest.length > 0 ? consoleFn(prefix, ...rest) : consoleFn(prefix);\n }\n\n // ─── Public methods ───────────────────────────────────────────────────────\n\n info(...args: unknown[]): void {\n this.log(\"info\", ...args);\n }\n\n success(...args: unknown[]): void {\n this.log(\"success\", ...args);\n }\n\n warn(...args: unknown[]): void {\n this.log(\"warn\", ...args);\n }\n\n error(...args: unknown[]): void {\n this.log(\"error\", ...args);\n }\n\n debug(...args: unknown[]): void {\n this.log(\"debug\", ...args);\n }\n\n http(...args: unknown[]): void {\n this.log(\"http\", ...args);\n }\n\n swagger(...args: unknown[]): void {\n this.log(\"swagger\", ...args);\n }\n\n db(...args: unknown[]): void {\n this.log(\"db\", ...args);\n }\n\n auth(...args: unknown[]): void {\n this.log(\"auth\", ...args);\n }\n\n // ─── Convenience: banner / separator ─────────────────────────────────────\n\n banner(title: string): void {\n const line = `${ANSI.cyan}${\"─\".repeat(60)}${ANSI.reset}`;\n const centered = title\n .padStart(30 + Math.floor(title.length / 2))\n .padEnd(60);\n console.log(`\\n${line}`);\n console.log(`${ANSI.bold}${ANSI.brightCyan}${centered}${ANSI.reset}`);\n console.log(`${line}\\n`);\n }\n}\n\n// ─── Default singleton logger ──────────────────────────────────────────────\n\nexport const logger = Logger.for(meta.name);"],"names":["ANSI","LOG_CONFIGS","info","icon","color","label","labelColor","success","warn","error","debug","http","swagger","db","auth","Logger","context","static","constructor","this","disableTimestamp","showTimestamp","log","level","args","cfg","timestamp","Date","toISOString","ctx","first","rest","prefix","String","consoleFn","console","length","banner","title","line","repeat","centered","padStart","Math","floor","padEnd","logger","for","meta","name"],"mappings":"iCAKA,MAAMA,EACK,OADLA,EAEI,OAFJA,EAGG,OAHHA,EAMK,QANLA,EAYI,QAZJA,EAaK,QAbLA,EAcI,QAdJA,EAmBY,QAnBZA,EAsBU,QAtBVA,EA4BQ,QA5BRA,EA8BS,QAsBTC,EAA2C,CAC7CC,KAAM,CACFC,KAAM,MACNC,MAAOJ,EACPK,MAAO,OACPC,WAAY,GA1BR,UA0ByBN,KAEjCO,QAAS,CACLJ,KAAM,IACNC,MA3CS,QA4CTC,MAAO,KACPC,WAAY,GApCP,UAoCyBN,KAElCQ,KAAM,CACFL,KAAM,MACNC,MAAOJ,EACPK,MAAO,OACPC,WAAY,GAAGN,IAAgBA,KAEnCS,MAAO,CACHN,KAAM,IACNC,MAxDO,QAyDPC,MAAO,QACPC,WAAY,GAjDT,UAiDyBN,KAEhCU,MAAO,CACHP,KAAM,KACNC,MAAOJ,EACPK,MAAO,QACPC,WAAY,GAAGN,IAAiBA,KAEpCW,KAAM,CACFR,KAAM,KACNC,MAjEQ,QAkERC,MAAO,OACPC,WAAY,GA1DR,UA0DyBN,KAEjCY,QAAS,CACLT,KAAM,OACNC,MAtEW,QAuEXC,MAAO,UACPC,WAAY,GAAGN,IAAiBA,KAEpCa,GAAI,CACAV,KAAM,OACNC,MAxFI,QAyFJC,MAAO,KACPC,WAAY,GAAGN,IAAgBA,KAEnCc,KAAM,CACFX,KAAM,KACNC,MAAOJ,EACPK,MAAO,OACPC,WAAY,GAAGN,IAAgBA,YAI1Be,EACDC,QACAC,sBAAuB,EAE/B,WAAAC,CAAYF,GACRG,KAAKH,QAAUA,CACnB,CAIA,UAAO,CAAIA,GACP,OAAO,IAAID,EAAOC,EACtB,CAEA,uBAAOI,GACHL,EAAOM,eAAgB,CAC3B,CAIQ,GAAAC,CAAIC,KAAoBC,GAC5B,MAAMC,EAAMxB,EAAYsB,GAClBG,EAAYX,EAAOM,cACnB,GAAGrB,IAAWA,KAAY,IAAI2B,MAAOC,gBAAgB5B,KACrD,GACAK,EAAQ,GAAGoB,EAAInB,aAAaN,KAAayB,EAAIpB,SAASL,IACtD6B,EAAM,GAAG7B,IAAWA,KAAamB,KAAKH,WAAWhB,KAIhD8B,KAAUC,GAAQP,EACnBQ,EAAS,GAAGN,IAAYrB,KAASwB,KAAOJ,EAAIrB,QAAQqB,EAAItB,SAAS8B,OAAOH,KAAS9B,IAEjFkC,EACQ,UAAVX,EACMY,QAAQ1B,MACE,SAAVc,EACEY,QAAQ3B,KACR2B,QAAQb,IAEpBS,EAAKK,OAAS,EAAIF,EAAUF,KAAWD,GAAQG,EAAUF,EAC7D,CAIA,IAAA9B,IAAQsB,GACJL,KAAKG,IAAI,UAAWE,EACxB,CAEA,OAAAjB,IAAWiB,GACPL,KAAKG,IAAI,aAAcE,EAC3B,CAEA,IAAAhB,IAAQgB,GACJL,KAAKG,IAAI,UAAWE,EACxB,CAEA,KAAAf,IAASe,GACLL,KAAKG,IAAI,WAAYE,EACzB,CAEA,KAAAd,IAASc,GACLL,KAAKG,IAAI,WAAYE,EACzB,CAEA,IAAAb,IAAQa,GACJL,KAAKG,IAAI,UAAWE,EACxB,CAEA,OAAAZ,IAAWY,GACPL,KAAKG,IAAI,aAAcE,EAC3B,CAEA,EAAAX,IAAMW,GACFL,KAAKG,IAAI,QAASE,EACtB,CAEA,IAAAV,IAAQU,GACJL,KAAKG,IAAI,UAAWE,EACxB,CAIA,MAAAa,CAAOC,GACH,MAAMC,EAAO,GAAGvC,IAAY,IAAIwC,OAAO,MAAMxC,IACvCyC,EAAWH,EACZI,SAAS,GAAKC,KAAKC,MAAMN,EAAMF,OAAS,IACxCS,OAAO,IACZV,QAAQb,IAAI,KAAKiB,KACjBJ,QAAQb,IAAI,GAAGtB,IAAYA,IAAkByC,IAAWzC,KACxDmC,QAAQb,IAAI,GAAGiB,MACnB,EAKG,MAAMO,EAAS/B,EAAOgC,IAAIC,EAAKC"}
1
+ {"version":3,"file":"Logger.js","sources":["../../../../src/configs/Logger.ts"],"sourcesContent":["import { meta } from \"./meta\";\n\n/**\n * ANSI color codes for terminal output\n */\nconst ANSI = {\n reset: \"\\x1b[0m\",\n bold: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n\n // Foreground colors\n black: \"\\x1b[30m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n gray: \"\\x1b[90m\",\n\n // Bright foreground\n brightRed: \"\\x1b[91m\",\n brightGreen: \"\\x1b[92m\",\n brightYellow: \"\\x1b[93m\",\n brightBlue: \"\\x1b[94m\",\n brightMagenta: \"\\x1b[95m\",\n brightCyan: \"\\x1b[96m\",\n brightWhite: \"\\x1b[97m\",\n\n // Background colors\n bgRed: \"\\x1b[41m\",\n bgGreen: \"\\x1b[42m\",\n bgYellow: \"\\x1b[43m\",\n bgBlue: \"\\x1b[44m\",\n bgMagenta: \"\\x1b[45m\",\n bgCyan: \"\\x1b[46m\",\n} as const;\n\ntype LogLevel =\n | \"info\"\n | \"success\"\n | \"warn\"\n | \"error\"\n | \"debug\"\n | \"http\"\n | \"swagger\"\n | \"db\"\n | \"auth\";\n\ninterface LogConfig {\n icon: string;\n color: string;\n label: string;\n labelColor: string;\n}\n\nconst LOG_CONFIGS: Record<LogLevel, LogConfig> = {\n info: {\n icon: \"ℹ️ \",\n color: ANSI.brightCyan,\n label: \"INFO\",\n labelColor: `${ANSI.bgCyan}${ANSI.black}`,\n },\n success: {\n icon: \"✅\",\n color: ANSI.brightGreen,\n label: \"OK\",\n labelColor: `${ANSI.bgGreen}${ANSI.black}`,\n },\n warn: {\n icon: \"⚠️ \",\n color: ANSI.brightYellow,\n label: \"WARN\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n error: {\n icon: \"❌\",\n color: ANSI.brightRed,\n label: \"ERROR\",\n labelColor: `${ANSI.bgRed}${ANSI.white}`,\n },\n debug: {\n icon: \"🐛\",\n color: ANSI.gray,\n label: \"DEBUG\",\n labelColor: `${ANSI.bgMagenta}${ANSI.white}`,\n },\n http: {\n icon: \"🌐\",\n color: ANSI.brightBlue,\n label: \"HTTP\",\n labelColor: `${ANSI.bgBlue}${ANSI.white}`,\n },\n swagger: {\n icon: \"🛡️ \",\n color: ANSI.brightMagenta,\n label: \"SWAGGER\",\n labelColor: `${ANSI.bgMagenta}${ANSI.white}`,\n },\n db: {\n icon: \"🗄️ \",\n color: ANSI.yellow,\n label: \"DB\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n auth: {\n icon: \"🔐\",\n color: ANSI.brightYellow,\n label: \"AUTH\",\n labelColor: `${ANSI.bgYellow}${ANSI.black}`,\n },\n};\n\nexport class Logger {\n private context: string;\n private static showTimestamp = true;\n\n constructor(context: string) {\n this.context = context;\n }\n\n // ─── Static factory ───────────────────────────────────────────────────────\n\n static for(context: string): Logger {\n return new Logger(context);\n }\n\n static disableTimestamp(): void {\n Logger.showTimestamp = false;\n }\n\n // ─── Core log method ──────────────────────────────────────────────────────\n\n private log(level: LogLevel, ...args: unknown[]): void {\n const cfg = LOG_CONFIGS[level];\n const timestamp = Logger.showTimestamp\n ? `${ANSI.dim}${ANSI.gray}${new Date().toISOString()}${ANSI.reset} `\n : \"\";\n const label = `${cfg.labelColor}${ANSI.bold} ${cfg.label} ${ANSI.reset}`;\n const ctx = `${ANSI.dim}${ANSI.cyan}[${this.context}]${ANSI.reset}`;\n\n // First arg gets the level color + icon, rest are passed raw so Node.js\n // pretty-prints objects/arrays/Errors natively (no JSON.stringify needed).\n const [first, ...rest] = args;\n const prefix = `${timestamp}${label} ${ctx} ${cfg.color}${cfg.icon} ${String(first)}${ANSI.reset}`;\n\n const consoleFn =\n level === \"error\"\n ? console.error\n : level === \"warn\"\n ? console.warn\n : console.log;\n\n rest.length > 0 ? consoleFn(prefix, ...rest) : consoleFn(prefix);\n }\n\n // ─── Public methods ───────────────────────────────────────────────────────\n\n info(...args: unknown[]): void {\n this.log(\"info\", ...args);\n }\n\n success(...args: unknown[]): void {\n this.log(\"success\", ...args);\n }\n\n warn(...args: unknown[]): void {\n this.log(\"warn\", ...args);\n }\n\n error(...args: unknown[]): void {\n this.log(\"error\", ...args);\n }\n\n debug(...args: unknown[]): void {\n this.log(\"debug\", ...args);\n }\n\n http(...args: unknown[]): void {\n this.log(\"http\", ...args);\n }\n\n swagger(...args: unknown[]): void {\n this.log(\"swagger\", ...args);\n }\n\n db(...args: unknown[]): void {\n this.log(\"db\", ...args);\n }\n\n auth(...args: unknown[]): void {\n this.log(\"auth\", ...args);\n }\n\n // ─── Convenience: banner / separator ─────────────────────────────────────\n\n banner(title: string): void {\n const line = `${ANSI.cyan}${\"─\".repeat(60)}${ANSI.reset}`;\n const centered = title\n .padStart(30 + Math.floor(title.length / 2))\n .padEnd(60);\n console.log(`\\n${line}`);\n console.log(`${ANSI.bold}${ANSI.brightCyan}${centered}${ANSI.reset}`);\n console.log(`${line}\\n`);\n }\n}\n\n// ─── Default singleton logger ──────────────────────────────────────────────\n\nexport const logger = Logger.for(meta.name);"],"names":["ANSI","LOG_CONFIGS","info","icon","color","label","labelColor","success","warn","error","debug","http","swagger","db","auth","Logger","context","static","constructor","this","disableTimestamp","showTimestamp","log","level","args","cfg","timestamp","Date","toISOString","ctx","first","rest","prefix","String","consoleFn","console","length","banner","title","line","repeat","centered","padStart","Math","floor","padEnd","logger","for","meta","name"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"meta.js","sources":["../../../../../src/configs/meta.ts"],"sourcesContent":["import { ISwaggerJSONStructure } from \"../types\";\n\n// console.log(\"[PLUGIN:META] 🥸 la 'root' du plugin: \", __sys__?.__root__);\n\nconst root = __sys__.__root__;\n\nexport const meta = __sys__.fs.readJsonSync(\n __sys__.fs.join(root, \"package.json\"),\n) as ISwaggerJSONStructure;\n\nexport const toPascalCase = (str: string, spliter = \"-\") =>\n str\n .split(spliter)\n .map((n) => n[0].toUpperCase() + n.slice(1))\n .join(\" \");\n\n"],"names":["root","__sys__","__root__","meta","fs","readJsonSync","join","toPascalCase","str","spliter","split","map","n","toUpperCase","slice"],"mappings":"AAIA,MAAMA,EAAOC,QAAQC,SAERC,EAAOF,QAAQG,GAAGC,aAC3BJ,QAAQG,GAAGE,KAAKN,EAAM,iBAGbO,EAAe,CAACC,EAAaC,EAAU,MAChDD,EACKE,MAAMD,GACNE,IAAKC,GAAMA,EAAE,GAAGC,cAAgBD,EAAEE,MAAM,IACxCR,KAAK"}
1
+ {"version":3,"file":"meta.js","sources":["../../../../src/configs/meta.ts"],"sourcesContent":["import { ISwaggerJSONStructure } from \"../types\";\n\n// console.log(\"[PLUGIN:META] 🥸 la 'root' du plugin: \", __sys__?.__root__);\n\nconst root = __sys__.__root__;\n\nexport const meta = __sys__.fs.readJsonSync(\n __sys__.fs.join(root, \"package.json\"),\n) as ISwaggerJSONStructure;\n\nexport const toPascalCase = (str: string, spliter = \"-\") =>\n str\n .split(spliter)\n .map((n) => n[0].toUpperCase() + n.slice(1))\n .join(\" \");\n"],"names":["root","__sys__","__root__","meta","fs","readJsonSync","join","toPascalCase","str","spliter","split","map","n","toUpperCase","slice"],"mappings":"AAIA,MAAMA,EAAOC,QAAQC,SAERC,EAAOF,QAAQG,GAAGC,aAC3BJ,QAAQG,GAAGE,KAAKN,EAAM,iBAGbO,EAAe,CAACC,EAAaC,EAAU,MAChDD,EACKE,MAAMD,GACNE,IAAKC,GAAMA,EAAE,GAAGC,cAAgBD,EAAEE,MAAM,IACxCR,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../src/index.ts"],"sourcesContent":["import { logger, Logger } from \"./configs/Logger\";\nimport { meta, toPascalCase } from \"./configs/meta\";\nimport { SwaggerServer } from \"./server\";\nimport { SwaggerConfig } from \"./types\";\nimport { Plugin } from \"xypriss\";\n\nconst pluginName = toPascalCase(meta.name);\nexport function SwaggerPlugin(config: SwaggerConfig) {\n return Plugin.create(\n {\n name: meta.name,\n version: meta.version,\n description: meta.description,\n onRegister(_error) {\n const log = Logger.for(\"Bootstrap\");\n log.info(\"Starting swagger plugin...\");\n if (_error) {\n log.error(pluginName + \" plugin failed to start:\", _error);\n }\n },\n onServerStart(server) {\n logger.success(pluginName + \" plugin has started\");\n\n server.app.get(\"/swagger\", (_req: any, res: any) => {\n res.redirect(`http://localhost:${config.port}`);\n });\n },\n onAuxiliaryServerDeploy(ops, server) {\n SwaggerServer(config, ops, server);\n },\n }, \n __sys__.__root__,\n );\n}"],"names":["pluginName","toPascalCase","meta","name","SwaggerPlugin","config","Plugin","create","version","description","onRegister","_error","log","Logger","for","info","error","onServerStart","server","logger","success","app","get","_req","res","redirect","port","onAuxiliaryServerDeploy","ops","SwaggerServer","__sys__","__root__"],"mappings":"iMAMA,MAAMA,EAAaC,EAAaC,EAAKC,MAC/B,SAAUC,EAAcC,GAC1B,OAAOC,EAAOC,OACV,CACIJ,KAAMD,EAAKC,KACXK,QAASN,EAAKM,QACdC,YAAaP,EAAKO,YAClB,UAAAC,CAAWC,GACP,MAAMC,EAAMC,EAAOC,IAAI,aACvBF,EAAIG,KAAK,8BACLJ,GACAC,EAAII,MAAMhB,EAAa,2BAA4BW,EAE3D,EACA,aAAAM,CAAcC,GACVC,EAAOC,QAAQpB,EAAa,uBAE5BkB,EAAOG,IAAIC,IAAI,WAAY,CAACC,EAAWC,KACnCA,EAAIC,SAAS,oBAAoBpB,EAAOqB,SAEhD,EACA,uBAAAC,CAAwBC,EAAKV,GACzBW,EAAcxB,EAAQuB,EAC1B,GAEJE,QAAQC,SAEhB"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/index.ts"],"sourcesContent":["import { logger, Logger } from \"./configs/Logger\";\nimport { meta, toPascalCase } from \"./configs/meta\";\nimport { SwaggerServer } from \"./server\";\nimport { SwaggerConfig } from \"./types\";\nimport { Plugin } from \"xypriss\";\n\nconst pluginName = toPascalCase(meta.name);\nexport function SwaggerPlugin(config: SwaggerConfig) {\n return Plugin.create(\n {\n name: meta.name,\n version: meta.version,\n description: meta.description,\n onRegister(_error) {\n const log = Logger.for(\"Bootstrap\");\n log.info(\"Starting swagger plugin...\");\n if (_error) {\n log.error(pluginName + \" plugin failed to start:\", _error);\n }\n },\n onServerStart(server) {\n logger.success(pluginName + \" plugin has started\");\n\n server.app.get(\"/swagger\", (_req: any, res: any) => {\n res.redirect(`http://localhost:${config.port}`);\n });\n },\n onAuxiliaryServerDeploy(ops, server) {\n SwaggerServer(config, ops, server);\n },\n }, \n __sys__.__root__,\n );\n}"],"names":["pluginName","toPascalCase","meta","name","SwaggerPlugin","config","Plugin","create","version","description","onRegister","_error","log","Logger","for","info","error","onServerStart","server","logger","success","app","get","_req","res","redirect","port","onAuxiliaryServerDeploy","ops","SwaggerServer","__sys__","__root__"],"mappings":"iMAMA,MAAMA,EAAaC,EAAaC,EAAKC,MAC/B,SAAUC,EAAcC,GAC1B,OAAOC,EAAOC,OACV,CACIJ,KAAMD,EAAKC,KACXK,QAASN,EAAKM,QACdC,YAAaP,EAAKO,YAClB,UAAAC,CAAWC,GACP,MAAMC,EAAMC,EAAOC,IAAI,aACvBF,EAAIG,KAAK,8BACLJ,GACAC,EAAII,MAAMhB,EAAa,2BAA4BW,EAE3D,EACA,aAAAM,CAAcC,GACVC,EAAOC,QAAQpB,EAAa,uBAE5BkB,EAAOG,IAAIC,IAAI,WAAY,CAACC,EAAWC,KACnCA,EAAIC,SAAS,oBAAoBpB,EAAOqB,SAEhD,EACA,uBAAAC,CAAwBC,EAAKV,GACzBW,EAAcxB,EAAQuB,EAC1B,GAEJE,QAAQC,SAEhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"openapi.js","sources":["../../../../src/openapi.ts"],"sourcesContent":["import { meta } from \"./configs/meta\";\n\nexport interface OpenAPIConfig {\n openapi: string;\n info: {\n title: string;\n version: string;\n description?: string;\n };\n paths: Record<string, any>;\n components: {\n securitySchemes?: Record<string, any>;\n };\n}\n\nexport function generateOpenAPI(registry: any[], config: any): OpenAPIConfig {\n const doc: OpenAPIConfig = {\n openapi: meta.version,\n info: {\n title:\n __sys__.vars.__name__ ||\n config.title ||\n \"XyPriss API Documentation\",\n version: config.version || \"1.0.0\",\n description: config.description || meta.description,\n },\n paths: {},\n components: {\n securitySchemes: {\n BearerAuth: {\n type: \"http\",\n scheme: \"bearer\",\n },\n },\n },\n };\n\n for (const route of registry) {\n if (!route.path || !route.method) continue;\n\n // Convert Express-like path /users/:id to Swagger-like path /users/{id}\n // Handles: :id, :id<number>, :id(\\d+)\n const openApiPath = route.path.replace(\n /:([a-zA-Z0-9_]+)(?:<[^>]+>)?(?:\\([^)]+\\))?/g,\n \"{$1}\",\n );\n\n if (!doc.paths[openApiPath]) {\n doc.paths[openApiPath] = {};\n }\n\n const methodStr = (\n Array.isArray(route.method) ? route.method[0] : route.method\n ).toLowerCase();\n\n // Base operation object\n const operation: any = {\n summary: route.meta?.summary || `${route.method} ${route.path}`,\n description: route.meta?.description || \"\",\n tags: route.meta?.tags || [\"Default\"],\n parameters: [],\n responses: route.responses || {\n \"200\": {\n description: \"Successful response\",\n },\n },\n };\n\n // If guards are detected, optionally assume it requires Auth\n if (route.hasGuards) {\n operation.security = [{ BearerAuth: [] }];\n }\n\n // Add Path Parameters\n if (route.paramNames && route.paramNames.length > 0) {\n for (const param of route.paramNames) {\n const constraint = route.paramConstraints?.[param];\n let type = \"string\";\n let pattern: string | undefined = undefined;\n\n if (constraint) {\n if (\n constraint.type === \"number\" ||\n constraint.type === \"integer\"\n ) {\n type = \"number\";\n } else if (constraint.type === \"boolean\") {\n type = \"boolean\";\n } else if (\n constraint.type === \"regex\" &&\n typeof constraint.options === \"string\"\n ) {\n pattern = constraint.options;\n } else if (constraint.type === \"uuid\") {\n pattern =\n \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\";\n }\n }\n\n operation.parameters.push({\n name: param,\n in: \"path\",\n required: true,\n schema: {\n type,\n pattern,\n },\n });\n }\n }\n\n // Add additional meta (like requestBody, query params) if defined by user within meta.openapi\n if (route.meta?.openapi) {\n Object.assign(operation, route.meta.openapi);\n }\n\n doc.paths[openApiPath][methodStr] = operation;\n }\n\n return doc;\n}\n\n"],"names":["generateOpenAPI","registry","config","doc","openapi","meta","version","info","title","__sys__","vars","__name__","description","paths","components","securitySchemes","BearerAuth","type","scheme","route","path","method","openApiPath","replace","methodStr","Array","isArray","toLowerCase","operation","summary","tags","parameters","responses","hasGuards","security","paramNames","length","param","constraint","paramConstraints","pattern","options","push","name","in","required","schema","Object","assign"],"mappings":"yCAeM,SAAUA,EAAgBC,EAAiBC,GAC7C,MAAMC,EAAqB,CACvBC,QAASC,EAAKC,QACdC,KAAM,CACFC,MACIC,QAAQC,KAAKC,UACbT,EAAOM,OACP,4BACJF,QAASJ,EAAOI,SAAW,QAC3BM,YAAaV,EAAOU,aAAeP,EAAKO,aAE5CC,MAAO,CAAA,EACPC,WAAY,CACRC,gBAAiB,CACbC,WAAY,CACRC,KAAM,OACNC,OAAQ,aAMxB,IAAK,MAAMC,KAASlB,EAAU,CAC1B,IAAKkB,EAAMC,OAASD,EAAME,OAAQ,SAIlC,MAAMC,EAAcH,EAAMC,KAAKG,QAC3B,8CACA,QAGCpB,EAAIU,MAAMS,KACXnB,EAAIU,MAAMS,GAAe,CAAA,GAG7B,MAAME,GACFC,MAAMC,QAAQP,EAAME,QAAUF,EAAME,OAAO,GAAKF,EAAME,QACxDM,cAGIC,EAAiB,CACnBC,QAASV,EAAMd,MAAMwB,SAAW,GAAGV,EAAME,UAAUF,EAAMC,OACzDR,YAAaO,EAAMd,MAAMO,aAAe,GACxCkB,KAAMX,EAAMd,MAAMyB,MAAQ,CAAC,WAC3BC,WAAY,GACZC,UAAWb,EAAMa,WAAa,CAC1B,IAAO,CACHpB,YAAa,yBAWzB,GALIO,EAAMc,YACNL,EAAUM,SAAW,CAAC,CAAElB,WAAY,MAIpCG,EAAMgB,YAAchB,EAAMgB,WAAWC,OAAS,EAC9C,IAAK,MAAMC,KAASlB,EAAMgB,WAAY,CAClC,MAAMG,EAAanB,EAAMoB,mBAAmBF,GAC5C,IACIG,EADAvB,EAAO,SAGPqB,IAEwB,WAApBA,EAAWrB,MACS,YAApBqB,EAAWrB,KAEXA,EAAO,SACoB,YAApBqB,EAAWrB,KAClBA,EAAO,UAEa,UAApBqB,EAAWrB,MACmB,iBAAvBqB,EAAWG,QAElBD,EAAUF,EAAWG,QACM,SAApBH,EAAWrB,OAClBuB,EACI,mEAIZZ,EAAUG,WAAWW,KAAK,CACtBC,KAAMN,EACNO,GAAI,OACJC,UAAU,EACVC,OAAQ,CACJ7B,OACAuB,YAGZ,CAIArB,EAAMd,MAAMD,SACZ2C,OAAOC,OAAOpB,EAAWT,EAAMd,KAAKD,SAGxCD,EAAIU,MAAMS,GAAaE,GAAaI,CACxC,CAEA,OAAOzB,CACX"}
1
+ {"version":3,"file":"openapi.js","sources":["../../../src/openapi.ts"],"sourcesContent":["import { meta } from \"./configs/meta\";\n\nexport interface OpenAPIConfig {\n openapi: string;\n info: {\n title: string;\n version: string;\n description?: string;\n };\n paths: Record<string, any>;\n components: {\n securitySchemes?: Record<string, any>;\n };\n}\n\nexport function generateOpenAPI(registry: any[], config: any): OpenAPIConfig {\n const doc: OpenAPIConfig = {\n openapi: meta.version,\n info: {\n title:\n __sys__.vars.__name__ ||\n config.title ||\n \"XyPriss API Documentation\",\n version: config.version || \"1.0.0\",\n description: config.description || meta.description,\n },\n paths: {},\n components: {\n securitySchemes: {\n BearerAuth: {\n type: \"http\",\n scheme: \"bearer\",\n },\n },\n },\n };\n\n for (const route of registry) {\n if (!route.path || !route.method) continue;\n\n // Convert Express-like path /users/:id to Swagger-like path /users/{id}\n // Handles: :id, :id<number>, :id(\\d+)\n const openApiPath = route.path.replace(\n /:([a-zA-Z0-9_]+)(?:<[^>]+>)?(?:\\([^)]+\\))?/g,\n \"{$1}\",\n );\n\n if (!doc.paths[openApiPath]) {\n doc.paths[openApiPath] = {};\n }\n\n const methodStr = (\n Array.isArray(route.method) ? route.method[0] : route.method\n ).toLowerCase();\n\n // Base operation object\n const operation: any = {\n summary: route.meta?.summary || `${route.method} ${route.path}`,\n description: route.meta?.description || \"\",\n tags: route.meta?.tags || [\"Default\"],\n parameters: [],\n responses: route.responses || {\n \"200\": {\n description: \"Successful response\",\n },\n },\n };\n\n // If guards are detected, optionally assume it requires Auth\n if (route.hasGuards) {\n operation.security = [{ BearerAuth: [] }];\n }\n\n // Add Path Parameters\n if (route.paramNames && route.paramNames.length > 0) {\n for (const param of route.paramNames) {\n const constraint = route.paramConstraints?.[param];\n let type = \"string\";\n let pattern: string | undefined = undefined;\n\n if (constraint) {\n if (\n constraint.type === \"number\" ||\n constraint.type === \"integer\"\n ) {\n type = \"number\";\n } else if (constraint.type === \"boolean\") {\n type = \"boolean\";\n } else if (\n constraint.type === \"regex\" &&\n typeof constraint.options === \"string\"\n ) {\n pattern = constraint.options;\n } else if (constraint.type === \"uuid\") {\n pattern =\n \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\";\n }\n }\n\n operation.parameters.push({\n name: param,\n in: \"path\",\n required: true,\n schema: {\n type,\n pattern,\n },\n });\n }\n }\n\n // Add additional meta (like requestBody, query params) if defined by user within meta.openapi\n if (route.meta?.openapi) {\n Object.assign(operation, route.meta.openapi);\n }\n\n doc.paths[openApiPath][methodStr] = operation;\n }\n\n return doc;\n}\n\n"],"names":["generateOpenAPI","registry","config","doc","openapi","meta","version","info","title","__sys__","vars","__name__","description","paths","components","securitySchemes","BearerAuth","type","scheme","route","path","method","openApiPath","replace","methodStr","Array","isArray","toLowerCase","operation","summary","tags","parameters","responses","hasGuards","security","paramNames","length","param","constraint","paramConstraints","pattern","options","push","name","in","required","schema","Object","assign"],"mappings":"yCAeM,SAAUA,EAAgBC,EAAiBC,GAC7C,MAAMC,EAAqB,CACvBC,QAASC,EAAKC,QACdC,KAAM,CACFC,MACIC,QAAQC,KAAKC,UACbT,EAAOM,OACP,4BACJF,QAASJ,EAAOI,SAAW,QAC3BM,YAAaV,EAAOU,aAAeP,EAAKO,aAE5CC,MAAO,CAAA,EACPC,WAAY,CACRC,gBAAiB,CACbC,WAAY,CACRC,KAAM,OACNC,OAAQ,aAMxB,IAAK,MAAMC,KAASlB,EAAU,CAC1B,IAAKkB,EAAMC,OAASD,EAAME,OAAQ,SAIlC,MAAMC,EAAcH,EAAMC,KAAKG,QAC3B,8CACA,QAGCpB,EAAIU,MAAMS,KACXnB,EAAIU,MAAMS,GAAe,CAAA,GAG7B,MAAME,GACFC,MAAMC,QAAQP,EAAME,QAAUF,EAAME,OAAO,GAAKF,EAAME,QACxDM,cAGIC,EAAiB,CACnBC,QAASV,EAAMd,MAAMwB,SAAW,GAAGV,EAAME,UAAUF,EAAMC,OACzDR,YAAaO,EAAMd,MAAMO,aAAe,GACxCkB,KAAMX,EAAMd,MAAMyB,MAAQ,CAAC,WAC3BC,WAAY,GACZC,UAAWb,EAAMa,WAAa,CAC1B,IAAO,CACHpB,YAAa,yBAWzB,GALIO,EAAMc,YACNL,EAAUM,SAAW,CAAC,CAAElB,WAAY,MAIpCG,EAAMgB,YAAchB,EAAMgB,WAAWC,OAAS,EAC9C,IAAK,MAAMC,KAASlB,EAAMgB,WAAY,CAClC,MAAMG,EAAanB,EAAMoB,mBAAmBF,GAC5C,IACIG,EADAvB,EAAO,SAGPqB,IAEwB,WAApBA,EAAWrB,MACS,YAApBqB,EAAWrB,KAEXA,EAAO,SACoB,YAApBqB,EAAWrB,KAClBA,EAAO,UAEa,UAApBqB,EAAWrB,MACmB,iBAAvBqB,EAAWG,QAElBD,EAAUF,EAAWG,QACM,SAApBH,EAAWrB,OAClBuB,EACI,mEAIZZ,EAAUG,WAAWW,KAAK,CACtBC,KAAMN,EACNO,GAAI,OACJC,UAAU,EACVC,OAAQ,CACJ7B,OACAuB,YAGZ,CAIArB,EAAMd,MAAMD,SACZ2C,OAAOC,OAAOpB,EAAWT,EAAMd,KAAKD,SAGxCD,EAAIU,MAAMS,GAAaE,GAAaI,CACxC,CAEA,OAAOzB,CACX"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sources":["../../../../src/server.ts"],"sourcesContent":["import { logger } from \"./configs/Logger\";\nimport { meta, toPascalCase } from \"./configs/meta\";\nimport { generateOpenAPI } from \"./openapi\";\nimport { SwaggerConfig } from \"./types\";\nimport { getSwaggerUIStream } from \"./ui\";\nimport { Plugin } from \"xypriss\";\n\ntype auxis = NonNullable<\n ReturnType<typeof Plugin.create>[\"onAuxiliaryServerDeploy\"]\n>;\nexport type OpsServerManager = Parameters<auxis>[\"0\"] & {\n getRouteRegistry?: () => any[];\n};\n\nexport type XyPrissServer = Parameters<auxis>[\"1\"];\n\nexport function SwaggerServer(\n config: SwaggerConfig,\n ops: OpsServerManager,\n _XServer: XyPrissServer,\n) {\n const docPath = config.path || \"/docs\";\n const specPath = `${docPath}/swagger.json`;\n\n const workspaceSYS = __sys__.plugins.get(meta.name);\n\n if (!workspaceSYS) {\n throw new Error(\n toPascalCase(meta.name, \"-\") +\n \" is not authorized in your xypriss.config.jsonc or xypriss.config.json. Please add \",\n );\n }\n\n const port = config.port || 7070;\n const server = ops.createAuxiliaryServer({\n server: { port },\n security: {\n enabled: false,\n },\n });\n\n // Serve the raw OpenAPI JSON specification\n server.get(specPath, (_req, res) => {\n try {\n let registry: any[] = [];\n\n if (ops.getRouteRegistry) {\n registry = ops.getRouteRegistry();\n }\n\n const spec = generateOpenAPI(registry, config);\n res.json(spec);\n } catch (error) {\n logger.error(\"Error generating OpenAPI spec:\", error);\n res.status(500).json({\n error: \"Failed to generate documentation\",\n });\n }\n });\n\n // Serve the Swagger HTML Viewer\n server.get(docPath, (_req, res) => {\n const title =\n config.title || workspaceSYS?.vars?.__name__ || \"API Documentation\";\n const stream = getSwaggerUIStream(specPath, title);\n\n res.setHeader(\"Content-Type\", \"text/html\");\n stream.pipe(res);\n });\n\n // Redirect root path of the sub-server to docPath\n server.redirect(\"/\", docPath, 301);\n\n // Boot the auxiliary server immediately\n const url = `http://localhost:${port}${docPath}`;\n server.start(() => {\n logger.swagger(\n `${toPascalCase(meta.name)} Server isolated on port ${port}`,\n );\n logger.http(`GET ${url}`);\n });\n}\n\n"],"names":["SwaggerServer","config","ops","_XServer","docPath","path","specPath","workspaceSYS","__sys__","plugins","get","meta","name","Error","toPascalCase","port","server","createAuxiliaryServer","security","enabled","_req","res","registry","getRouteRegistry","spec","generateOpenAPI","json","error","logger","status","title","vars","__name__","stream","getSwaggerUIStream","setHeader","pipe","redirect","url","start","swagger","http"],"mappings":"6MAgBgBA,EACZC,EACAC,EACAC,GAEA,MAAMC,EAAUH,EAAOI,MAAQ,QACzBC,EAAW,GAAGF,iBAEdG,EAAeC,QAAQC,QAAQC,IAAIC,EAAKC,MAE9C,IAAKL,EACD,MAAM,IAAIM,MACNC,EAAaH,EAAKC,KAAM,KACpB,uFAIZ,MAAMG,EAAOd,EAAOc,MAAQ,KACtBC,EAASd,EAAIe,sBAAsB,CACrCD,OAAQ,CAAED,QACVG,SAAU,CACNC,SAAS,KAKjBH,EAAON,IAAIJ,EAAU,CAACc,EAAMC,KACxB,IACI,IAAIC,EAAkB,GAElBpB,EAAIqB,mBACJD,EAAWpB,EAAIqB,oBAGnB,MAAMC,EAAOC,EAAgBH,EAAUrB,GACvCoB,EAAIK,KAAKF,EACb,CAAE,MAAOG,GACLC,EAAOD,MAAM,iCAAkCA,GAC/CN,EAAIQ,OAAO,KAAKH,KAAK,CACjBC,MAAO,oCAEf,IAIJX,EAAON,IAAIN,EAAS,CAACgB,EAAMC,KACvB,MAAMS,EACF7B,EAAO6B,OAASvB,GAAcwB,MAAMC,UAAY,oBAC9CC,EAASC,EAAmB5B,EAAUwB,GAE5CT,EAAIc,UAAU,eAAgB,aAC9BF,EAAOG,KAAKf,KAIhBL,EAAOqB,SAAS,IAAKjC,EAAS,KAG9B,MAAMkC,EAAM,oBAAoBvB,IAAOX,IACvCY,EAAOuB,MAAM,KACTX,EAAOY,QACH,GAAG1B,EAAaH,EAAKC,iCAAiCG,KAE1Da,EAAOa,KAAK,OAAOH,MAE3B"}
1
+ {"version":3,"file":"server.js","sources":["../../../src/server.ts"],"sourcesContent":["import { logger } from \"./configs/Logger\";\nimport { meta, toPascalCase } from \"./configs/meta\";\nimport { generateOpenAPI } from \"./openapi\";\nimport { SwaggerConfig } from \"./types\";\nimport { getSwaggerUIStream } from \"./ui\";\nimport { Plugin } from \"xypriss\";\n\ntype auxis = NonNullable<\n ReturnType<typeof Plugin.create>[\"onAuxiliaryServerDeploy\"]\n>;\nexport type OpsServerManager = Parameters<auxis>[\"0\"] & {\n getRouteRegistry?: () => any[];\n};\n\nexport type XyPrissServer = Parameters<auxis>[\"1\"];\n\nexport function SwaggerServer(\n config: SwaggerConfig,\n ops: OpsServerManager,\n _XServer: XyPrissServer,\n) {\n const docPath = config.path || \"/docs\";\n const specPath = `${docPath}/swagger.json`;\n\n const workspaceSYS = __sys__.plugins.get(meta.name);\n\n if (!workspaceSYS) {\n throw new Error(\n toPascalCase(meta.name, \"-\") +\n \" is not authorized in your xypriss.config.jsonc or xypriss.config.json. Please add \",\n );\n }\n\n const port = config.port || 7070;\n const server = ops.createAuxiliaryServer({\n server: { port },\n security: {\n enabled: false,\n },\n });\n\n // Serve the raw OpenAPI JSON specification\n server.get(specPath, (_req, res) => {\n try {\n let registry: any[] = [];\n\n if (ops.getRouteRegistry) {\n registry = ops.getRouteRegistry();\n }\n\n const spec = generateOpenAPI(registry, config);\n res.json(spec);\n } catch (error) {\n logger.error(\"Error generating OpenAPI spec:\", error);\n res.status(500).json({\n error: \"Failed to generate documentation\",\n });\n }\n });\n\n // Serve the Swagger HTML Viewer\n server.get(docPath, (_req, res) => {\n const title =\n config.title || workspaceSYS?.vars?.__name__ || \"API Documentation\";\n const stream = getSwaggerUIStream(specPath, title);\n\n res.setHeader(\"Content-Type\", \"text/html\");\n stream.pipe(res);\n });\n\n // Redirect root path of the sub-server to docPath\n server.redirect(\"/\", docPath, 301);\n\n // Boot the auxiliary server immediately\n const url = `http://localhost:${port}${docPath}`;\n server.start(() => {\n logger.swagger(\n `${toPascalCase(meta.name)} Server isolated on port ${port}`,\n );\n logger.http(`GET ${url}`);\n });\n}\n\n"],"names":["SwaggerServer","config","ops","_XServer","docPath","path","specPath","workspaceSYS","__sys__","plugins","get","meta","name","Error","toPascalCase","port","server","createAuxiliaryServer","security","enabled","_req","res","registry","getRouteRegistry","spec","generateOpenAPI","json","error","logger","status","title","vars","__name__","stream","getSwaggerUIStream","setHeader","pipe","redirect","url","start","swagger","http"],"mappings":"6MAgBgBA,EACZC,EACAC,EACAC,GAEA,MAAMC,EAAUH,EAAOI,MAAQ,QACzBC,EAAW,GAAGF,iBAEdG,EAAeC,QAAQC,QAAQC,IAAIC,EAAKC,MAE9C,IAAKL,EACD,MAAM,IAAIM,MACNC,EAAaH,EAAKC,KAAM,KACpB,uFAIZ,MAAMG,EAAOd,EAAOc,MAAQ,KACtBC,EAASd,EAAIe,sBAAsB,CACrCD,OAAQ,CAAED,QACVG,SAAU,CACNC,SAAS,KAKjBH,EAAON,IAAIJ,EAAU,CAACc,EAAMC,KACxB,IACI,IAAIC,EAAkB,GAElBpB,EAAIqB,mBACJD,EAAWpB,EAAIqB,oBAGnB,MAAMC,EAAOC,EAAgBH,EAAUrB,GACvCoB,EAAIK,KAAKF,EACb,CAAE,MAAOG,GACLC,EAAOD,MAAM,iCAAkCA,GAC/CN,EAAIQ,OAAO,KAAKH,KAAK,CACjBC,MAAO,oCAEf,IAIJX,EAAON,IAAIN,EAAS,CAACgB,EAAMC,KACvB,MAAMS,EACF7B,EAAO6B,OAASvB,GAAcwB,MAAMC,UAAY,oBAC9CC,EAASC,EAAmB5B,EAAUwB,GAE5CT,EAAIc,UAAU,eAAgB,aAC9BF,EAAOG,KAAKf,KAIhBL,EAAOqB,SAAS,IAAKjC,EAAS,KAG9B,MAAMkC,EAAM,oBAAoBvB,IAAOX,IACvCY,EAAOuB,MAAM,KACTX,EAAOY,QACH,GAAG1B,EAAaH,EAAKC,iCAAiCG,KAE1Da,EAAOa,KAAK,OAAOH,MAE3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"ui.js","sources":["../../../../src/ui.ts"],"sourcesContent":["import { Transform, TransformCallback, Readable } from \"node:stream\";\nimport \"xypriss\";\nimport { meta } from \"./configs/meta\";\n\n/**\n * **Template Transform Stream**\n *\n * Safely replaces {{key}} placeholders in a stream of text.\n * Handles split placeholders across chunks by buffering the end of chunks.\n */\nclass TemplateTransform extends Transform {\n private remaining: string = \"\";\n private placeholders: Record<string, string>;\n\n constructor(placeholders: Record<string, string>) {\n super({ decodeStrings: false, encoding: \"utf-8\" });\n this.placeholders = placeholders;\n }\n\n _transform(\n chunk: any,\n _encoding: string,\n callback: TransformCallback,\n ): void {\n let content = this.remaining + chunk.toString();\n\n // Perform replacements\n for (const [key, value] of Object.entries(this.placeholders)) {\n const regex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\");\n content = content.replace(regex, value);\n }\n\n /**\n * To handle split placeholders (e.g., \"{{ti\" at end of chunk),\n * we look for the last \"{{\" in the last few characters.\n * If we find one that doesn't have a matching \"}}\", we buffer it.\n */\n const lastOpening = content.lastIndexOf(\"{{\");\n const lastClosing = content.lastIndexOf(\"}}\");\n\n if (lastOpening > lastClosing && lastOpening > content.length - 20) {\n this.remaining = content.slice(lastOpening);\n this.push(content.slice(0, lastOpening));\n } else {\n this.remaining = \"\";\n this.push(content);\n }\n\n callback();\n }\n\n _flush(callback: TransformCallback): void {\n this.push(this.remaining);\n callback();\n }\n}\n\n/**\n * **Get Swagger UI Stream**\n *\n * Returns a readable stream for the Swagger UI HTML with template variables\n * injected via a Transform stream.\n */\nexport function getSwaggerUIStream(specUrl: string, title: string): Readable {\n const templatePath = __sys__.fs.join(\n __sys__.__root__,\n \"dist\",\n \"template\",\n \"ui.html\",\n );\n\n // native high-performance stream\n const source = __sys__.fs.createReadStream(templatePath);\n const transform = new TemplateTransform({\n specUrl,\n title,\n version: meta.version,\n year: new Date().getFullYear().toString(),\n nehonix_url: \"https://nehonix.com\",\n });\n\n return source.pipe(transform);\n}\n\n/**\n * @deprecated Use getSwaggerUIStream for better performance\n */\nexport function getSwaggerUIHtml(specUrl: string, title: string): string {\n const templatePath = __sys__.fs.join(\n __sys__.__root__,\n \"dist\",\n \"template\",\n \"ui.html\",\n );\n\n try {\n let html = __sys__.fs.readFileSync(templatePath, \"utf-8\");\n html = html.replace(/\\{\\{title\\}\\}/g, title);\n html = html.replace(/\\{\\{specUrl\\}\\}/g, specUrl);\n html = html.replace(/\\{\\{version\\}\\}/g, meta.version);\n html = html.replace(\n /\\{\\{year\\}\\}/g,\n new Date().getFullYear().toString(),\n );\n html = html.replace(/\\{\\{nehonix_url\\}\\}/g, \"https://nehonix.com\");\n return html;\n } catch (error) {\n return `<h1>Error loading Swagger UI</h1><p>${String(error)}</p>`;\n }\n}\n\n"],"names":["TemplateTransform","Transform","remaining","placeholders","constructor","super","decodeStrings","encoding","this","_transform","chunk","_encoding","callback","content","toString","key","value","Object","entries","regex","RegExp","replace","lastOpening","lastIndexOf","length","slice","push","_flush","getSwaggerUIStream","specUrl","title","templatePath","__sys__","fs","join","__root__","source","createReadStream","transform","version","meta","year","Date","getFullYear","nehonix_url","pipe"],"mappings":"iGAUA,MAAMA,UAA0BC,EACpBC,UAAoB,GACpBC,aAER,WAAAC,CAAYD,GACRE,MAAM,CAAEC,eAAe,EAAOC,SAAU,UACxCC,KAAKL,aAAeA,CACxB,CAEA,UAAAM,CACIC,EACAC,EACAC,GAEA,IAAIC,EAAUL,KAAKN,UAAYQ,EAAMI,WAGrC,IAAK,MAAOC,EAAKC,KAAUC,OAAOC,QAAQV,KAAKL,cAAe,CAC1D,MAAMgB,EAAQ,IAAIC,OAAO,SAASL,UAAa,KAC/CF,EAAUA,EAAQQ,QAAQF,EAAOH,EACrC,CAOA,MAAMM,EAAcT,EAAQU,YAAY,MAGpCD,EAFgBT,EAAQU,YAAY,OAEPD,EAAcT,EAAQW,OAAS,IAC5DhB,KAAKN,UAAYW,EAAQY,MAAMH,GAC/Bd,KAAKkB,KAAKb,EAAQY,MAAM,EAAGH,MAE3Bd,KAAKN,UAAY,GACjBM,KAAKkB,KAAKb,IAGdD,GACJ,CAEA,MAAAe,CAAOf,GACHJ,KAAKkB,KAAKlB,KAAKN,WACfU,GACJ,EASE,SAAUgB,EAAmBC,EAAiBC,GAChD,MAAMC,EAAeC,QAAQC,GAAGC,KAC5BF,QAAQG,SACR,OACA,WACA,WAIEC,EAASJ,QAAQC,GAAGI,iBAAiBN,GACrCO,EAAY,IAAItC,EAAkB,CACpC6B,UACAC,QACAS,QAASC,EAAKD,QACdE,MAAM,IAAIC,MAAOC,cAAc7B,WAC/B8B,YAAa,wBAGjB,OAAOR,EAAOS,KAAKP,EACvB"}
1
+ {"version":3,"file":"ui.js","sources":["../../../src/ui.ts"],"sourcesContent":["import { Transform, TransformCallback, Readable } from \"node:stream\";\nimport \"xypriss\";\nimport { meta } from \"./configs/meta\";\n\n/**\n * **Template Transform Stream**\n *\n * Safely replaces {{key}} placeholders in a stream of text.\n * Handles split placeholders across chunks by buffering the end of chunks.\n */\nclass TemplateTransform extends Transform {\n private remaining: string = \"\";\n private placeholders: Record<string, string>;\n\n constructor(placeholders: Record<string, string>) {\n super({ decodeStrings: false, encoding: \"utf-8\" });\n this.placeholders = placeholders;\n }\n\n _transform(\n chunk: any,\n _encoding: string,\n callback: TransformCallback,\n ): void {\n let content = this.remaining + chunk.toString();\n\n // Perform replacements\n for (const [key, value] of Object.entries(this.placeholders)) {\n const regex = new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\");\n content = content.replace(regex, value);\n }\n\n /**\n * To handle split placeholders (e.g., \"{{ti\" at end of chunk),\n * we look for the last \"{{\" in the last few characters.\n * If we find one that doesn't have a matching \"}}\", we buffer it.\n */\n const lastOpening = content.lastIndexOf(\"{{\");\n const lastClosing = content.lastIndexOf(\"}}\");\n\n if (lastOpening > lastClosing && lastOpening > content.length - 20) {\n this.remaining = content.slice(lastOpening);\n this.push(content.slice(0, lastOpening));\n } else {\n this.remaining = \"\";\n this.push(content);\n }\n\n callback();\n }\n\n _flush(callback: TransformCallback): void {\n this.push(this.remaining);\n callback();\n }\n}\n\n/**\n * **Get Swagger UI Stream**\n *\n * Returns a readable stream for the Swagger UI HTML with template variables\n * injected via a Transform stream.\n */\nexport function getSwaggerUIStream(specUrl: string, title: string): Readable {\n const templatePath = __sys__.fs.join(\n __sys__.__root__,\n \"dist\",\n \"template\",\n \"ui.html\",\n );\n\n // native high-performance stream\n const source = __sys__.fs.createReadStream(templatePath);\n const transform = new TemplateTransform({\n specUrl,\n title,\n version: meta.version,\n year: new Date().getFullYear().toString(),\n nehonix_url: \"https://nehonix.com\",\n });\n\n return source.pipe(transform);\n}\n\n/**\n * @deprecated Use getSwaggerUIStream for better performance\n */\nexport function getSwaggerUIHtml(specUrl: string, title: string): string {\n const templatePath = __sys__.fs.join(\n __sys__.__root__,\n \"dist\",\n \"template\",\n \"ui.html\",\n );\n\n try {\n let html = __sys__.fs.readFileSync(templatePath, \"utf-8\");\n html = html.replace(/\\{\\{title\\}\\}/g, title);\n html = html.replace(/\\{\\{specUrl\\}\\}/g, specUrl);\n html = html.replace(/\\{\\{version\\}\\}/g, meta.version);\n html = html.replace(\n /\\{\\{year\\}\\}/g,\n new Date().getFullYear().toString(),\n );\n html = html.replace(/\\{\\{nehonix_url\\}\\}/g, \"https://nehonix.com\");\n return html;\n } catch (error) {\n return `<h1>Error loading Swagger UI</h1><p>${String(error)}</p>`;\n }\n}\n\n"],"names":["TemplateTransform","Transform","remaining","placeholders","constructor","super","decodeStrings","encoding","this","_transform","chunk","_encoding","callback","content","toString","key","value","Object","entries","regex","RegExp","replace","lastOpening","lastIndexOf","length","slice","push","_flush","getSwaggerUIStream","specUrl","title","templatePath","__sys__","fs","join","__root__","source","createReadStream","transform","version","meta","year","Date","getFullYear","nehonix_url","pipe"],"mappings":"iGAUA,MAAMA,UAA0BC,EACpBC,UAAoB,GACpBC,aAER,WAAAC,CAAYD,GACRE,MAAM,CAAEC,eAAe,EAAOC,SAAU,UACxCC,KAAKL,aAAeA,CACxB,CAEA,UAAAM,CACIC,EACAC,EACAC,GAEA,IAAIC,EAAUL,KAAKN,UAAYQ,EAAMI,WAGrC,IAAK,MAAOC,EAAKC,KAAUC,OAAOC,QAAQV,KAAKL,cAAe,CAC1D,MAAMgB,EAAQ,IAAIC,OAAO,SAASL,UAAa,KAC/CF,EAAUA,EAAQQ,QAAQF,EAAOH,EACrC,CAOA,MAAMM,EAAcT,EAAQU,YAAY,MAGpCD,EAFgBT,EAAQU,YAAY,OAEPD,EAAcT,EAAQW,OAAS,IAC5DhB,KAAKN,UAAYW,EAAQY,MAAMH,GAC/Bd,KAAKkB,KAAKb,EAAQY,MAAM,EAAGH,MAE3Bd,KAAKN,UAAY,GACjBM,KAAKkB,KAAKb,IAGdD,GACJ,CAEA,MAAAe,CAAOf,GACHJ,KAAKkB,KAAKlB,KAAKN,WACfU,GACJ,EASE,SAAUgB,EAAmBC,EAAiBC,GAChD,MAAMC,EAAeC,QAAQC,GAAGC,KAC5BF,QAAQG,SACR,OACA,WACA,WAIEC,EAASJ,QAAQC,GAAGI,iBAAiBN,GACrCO,EAAY,IAAItC,EAAkB,CACpC6B,UACAC,QACAS,QAASC,EAAKD,QACdE,MAAM,IAAIC,MAAOC,cAAc7B,WAC/B8B,YAAa,wBAGjB,OAAOR,EAAOS,KAAKP,EACvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "xypriss-swagger",
3
- "version": "1.0.37",
3
+ "version": "1.0.39",
4
4
  "description": "Auto-documentation plugin for XyPriss Router V2",
5
5
  "type": "module",
6
6
  "main": "dist/cjs/index.js",
@@ -16,12 +16,12 @@
16
16
  "scripts": {
17
17
  "build": "rm -rf dist && NODE_OPTIONS='--max-old-space-size=4096' npx rollup -c rollup.config.js",
18
18
  "dev": "rollup -c -w",
19
- "prepublishOnly": "npm run build"
19
+ "prepublishOnly": "xfpm run build && xfpm sign ./ --min-version 1.0.0 --fix"
20
20
  },
21
21
  "dependencies": {
22
- "nehoid": "^2.1.4",
23
- "xypriss-security": "^2.1.13",
24
- "xypriss": "^9.7.1"
22
+ "nehoid": "^2.2.1",
23
+ "xypriss-security": "^2.1.16",
24
+ "xypriss": "^9.9.3"
25
25
  },
26
26
  "files": [
27
27
  "dist/",
@@ -44,5 +44,16 @@
44
44
  "tslib": "^2.8.1",
45
45
  "typescript": "^5.0.0"
46
46
  },
47
- "peerDependencies": {}
47
+ "peerDependencies": {},
48
+ "xfpm": {
49
+ "permissions": [
50
+ "XHS.HOOK.HTTP.REQUEST",
51
+ "XHS.PERM.SECURITY.SENSITIVE_DATA",
52
+ "XHS.HOOK.LIFECYCLE.REGISTER",
53
+ "XHS.HOOK.LIFECYCLE.SERVER_START",
54
+ "XHS.PERM.OPS.AUXILIARY_SERVER",
55
+ "XHS.PERM.SECURITY.CONFIGS"
56
+ ]
57
+ }
48
58
  }
59
+
@@ -1,10 +1,11 @@
1
1
  --- XYPRISS SIGNATURE (G3) ---
2
- Manifest: xypriss-swagger@1.0.37
3
- Min-Engine: 1.0.35
4
- Fingerprint: sha256:53f24df6e325461b5f45bdf2c1ad7dab95e6c904979af8ffc396507a543ded56
2
+ Manifest: xypriss-swagger@1.0.39
3
+ Min-Engine: 1.0.0
4
+ Fingerprint: sha256:bcaf9b0b9ff687a05a2d2933d949b25db4a72e788aee5c2197d7733ed9059031
5
5
  Identity: ed25519:a58b17a3e46302dd3ae5538bc9b8b991c57f4c5fe2e7d8ac41803de818d947f4
6
- Expires: 2027-04-22T20:54:37Z
6
+ Privileges: XHS.HOOK.HTTP.REQUEST,XHS.PERM.SECURITY.SENSITIVE_DATA,XHS.HOOK.LIFECYCLE.REGISTER,XHS.HOOK.LIFECYCLE.SERVER_START,XHS.PERM.OPS.AUXILIARY_SERVER,XHS.PERM.SECURITY.CONFIGS
7
+ Expires: 2027-04-26T13:58:19Z
7
8
  Revision: sha256:none
8
9
  --- BEGIN CRYPTOGRAPHIC PROOF ---
9
- base64:d2rumcZZmiZpCpc1TQbA1RmMnDgppcYNSv+LHuZ+SZXF0NHXotKdQeroTQaCEnqxjvRJEXyPjZsJNgt4RW8AAw==
10
+ base64:6dh7MWA8THXDY9jNh/gGFR7BvU4E44/wX154Mb3WoewqbWz7hcBm+f+NewEADH6dYoGqVvo2J8jtxBbVRgrcCQ==
10
11
  --- END XYPRISS SIGNATURE ---