semola 0.5.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/README.md +88 -13
  2. package/dist/index-BhGNDjPq.d.mts +13 -0
  3. package/dist/index-DxSbeGP-.d.cts +13 -0
  4. package/dist/lib/api/index.cjs +522 -4
  5. package/dist/lib/api/index.d.cts +270 -4
  6. package/dist/lib/api/index.d.mts +270 -4
  7. package/dist/lib/api/index.mjs +520 -2
  8. package/dist/lib/cache/index.d.cts +19 -7
  9. package/dist/lib/cache/index.d.mts +19 -7
  10. package/dist/lib/cache/index.mjs +0 -2
  11. package/dist/lib/cron/index.cjs +470 -11
  12. package/dist/lib/cron/index.d.cts +112 -5
  13. package/dist/lib/cron/index.d.mts +112 -5
  14. package/dist/lib/cron/index.mjs +461 -12
  15. package/dist/lib/errors/index.d.cts +2 -13
  16. package/dist/lib/errors/index.d.mts +2 -13
  17. package/dist/lib/errors/index.mjs +0 -2
  18. package/dist/lib/i18n/index.cjs +6 -1
  19. package/dist/lib/i18n/index.d.cts +12 -4
  20. package/dist/lib/i18n/index.d.mts +12 -4
  21. package/dist/lib/i18n/index.mjs +6 -3
  22. package/dist/lib/logging/index.cjs +387 -0
  23. package/dist/lib/logging/index.d.cts +108 -0
  24. package/dist/lib/logging/index.d.mts +108 -0
  25. package/dist/lib/logging/index.mjs +374 -0
  26. package/dist/lib/policy/index.cjs +206 -20
  27. package/dist/lib/policy/index.d.cts +61 -5
  28. package/dist/lib/policy/index.d.mts +61 -5
  29. package/dist/lib/policy/index.mjs +187 -3
  30. package/dist/lib/prompts/index.cjs +374 -14
  31. package/dist/lib/prompts/index.d.cts +77 -12
  32. package/dist/lib/prompts/index.d.mts +77 -12
  33. package/dist/lib/prompts/index.mjs +362 -4
  34. package/dist/lib/pubsub/index.cjs +82 -13
  35. package/dist/lib/pubsub/index.d.cts +23 -9
  36. package/dist/lib/pubsub/index.d.mts +23 -9
  37. package/dist/lib/pubsub/index.mjs +82 -15
  38. package/dist/lib/queue/index.d.cts +46 -4
  39. package/dist/lib/queue/index.d.mts +46 -4
  40. package/dist/lib/queue/index.mjs +0 -2
  41. package/dist/lib/workflow/index.cjs +534 -0
  42. package/dist/lib/workflow/index.d.cts +85 -0
  43. package/dist/lib/workflow/index.d.mts +85 -0
  44. package/dist/lib/workflow/index.mjs +533 -0
  45. package/package.json +29 -3
  46. package/dist/api/core/index.cjs +0 -206
  47. package/dist/api/core/index.d.cts +0 -21
  48. package/dist/api/core/index.d.cts.map +0 -1
  49. package/dist/api/core/index.d.mts +0 -21
  50. package/dist/api/core/index.d.mts.map +0 -1
  51. package/dist/api/core/index.mjs +0 -208
  52. package/dist/api/core/index.mjs.map +0 -1
  53. package/dist/api/core/types.d.cts +0 -107
  54. package/dist/api/core/types.d.cts.map +0 -1
  55. package/dist/api/core/types.d.mts +0 -107
  56. package/dist/api/core/types.d.mts.map +0 -1
  57. package/dist/api/middleware/index.cjs +0 -8
  58. package/dist/api/middleware/index.d.cts +0 -11
  59. package/dist/api/middleware/index.d.cts.map +0 -1
  60. package/dist/api/middleware/index.d.mts +0 -11
  61. package/dist/api/middleware/index.d.mts.map +0 -1
  62. package/dist/api/middleware/index.mjs +0 -10
  63. package/dist/api/middleware/index.mjs.map +0 -1
  64. package/dist/api/middleware/types.d.cts +0 -16
  65. package/dist/api/middleware/types.d.cts.map +0 -1
  66. package/dist/api/middleware/types.d.mts +0 -16
  67. package/dist/api/middleware/types.d.mts.map +0 -1
  68. package/dist/api/openapi/index.cjs +0 -254
  69. package/dist/api/openapi/index.mjs +0 -256
  70. package/dist/api/openapi/index.mjs.map +0 -1
  71. package/dist/api/openapi/types.d.cts +0 -60
  72. package/dist/api/openapi/types.d.cts.map +0 -1
  73. package/dist/api/openapi/types.d.mts +0 -60
  74. package/dist/api/openapi/types.d.mts.map +0 -1
  75. package/dist/api/validation/index.cjs +0 -64
  76. package/dist/api/validation/index.mjs +0 -61
  77. package/dist/api/validation/index.mjs.map +0 -1
  78. package/dist/cache/types.d.cts +0 -17
  79. package/dist/cache/types.d.cts.map +0 -1
  80. package/dist/cache/types.d.mts +0 -17
  81. package/dist/cache/types.d.mts.map +0 -1
  82. package/dist/cron/scanner.cjs +0 -237
  83. package/dist/cron/scanner.mjs +0 -238
  84. package/dist/cron/scanner.mjs.map +0 -1
  85. package/dist/cron/types.d.cts +0 -11
  86. package/dist/cron/types.d.cts.map +0 -1
  87. package/dist/cron/types.d.mts +0 -11
  88. package/dist/cron/types.d.mts.map +0 -1
  89. package/dist/errors/types.d.cts +0 -5
  90. package/dist/errors/types.d.cts.map +0 -1
  91. package/dist/errors/types.d.mts +0 -5
  92. package/dist/errors/types.d.mts.map +0 -1
  93. package/dist/i18n/types.d.cts +0 -13
  94. package/dist/i18n/types.d.cts.map +0 -1
  95. package/dist/i18n/types.d.mts +0 -13
  96. package/dist/i18n/types.d.mts.map +0 -1
  97. package/dist/lib/cache/index.d.cts.map +0 -1
  98. package/dist/lib/cache/index.d.mts.map +0 -1
  99. package/dist/lib/cache/index.mjs.map +0 -1
  100. package/dist/lib/cron/index.d.cts.map +0 -1
  101. package/dist/lib/cron/index.d.mts.map +0 -1
  102. package/dist/lib/cron/index.mjs.map +0 -1
  103. package/dist/lib/errors/index.d.cts.map +0 -1
  104. package/dist/lib/errors/index.d.mts.map +0 -1
  105. package/dist/lib/errors/index.mjs.map +0 -1
  106. package/dist/lib/i18n/index.d.cts.map +0 -1
  107. package/dist/lib/i18n/index.d.mts.map +0 -1
  108. package/dist/lib/i18n/index.mjs.map +0 -1
  109. package/dist/lib/policy/index.d.cts.map +0 -1
  110. package/dist/lib/policy/index.d.mts.map +0 -1
  111. package/dist/lib/policy/index.mjs.map +0 -1
  112. package/dist/lib/prompts/index.d.cts.map +0 -1
  113. package/dist/lib/prompts/index.d.mts.map +0 -1
  114. package/dist/lib/prompts/index.mjs.map +0 -1
  115. package/dist/lib/pubsub/index.d.cts.map +0 -1
  116. package/dist/lib/pubsub/index.d.mts.map +0 -1
  117. package/dist/lib/pubsub/index.mjs.map +0 -1
  118. package/dist/lib/queue/index.d.cts.map +0 -1
  119. package/dist/lib/queue/index.d.mts.map +0 -1
  120. package/dist/lib/queue/index.mjs.map +0 -1
  121. package/dist/node_modules/@standard-schema/spec/dist/index.d.cts +0 -80
  122. package/dist/node_modules/@standard-schema/spec/dist/index.d.cts.map +0 -1
  123. package/dist/node_modules/@standard-schema/spec/dist/index.d.mts +0 -80
  124. package/dist/node_modules/@standard-schema/spec/dist/index.d.mts.map +0 -1
  125. package/dist/policy/helpers.cjs +0 -206
  126. package/dist/policy/helpers.d.cts +0 -50
  127. package/dist/policy/helpers.d.cts.map +0 -1
  128. package/dist/policy/helpers.d.mts +0 -50
  129. package/dist/policy/helpers.d.mts.map +0 -1
  130. package/dist/policy/helpers.mjs +0 -190
  131. package/dist/policy/helpers.mjs.map +0 -1
  132. package/dist/policy/types.d.cts +0 -16
  133. package/dist/policy/types.d.cts.map +0 -1
  134. package/dist/policy/types.d.mts +0 -16
  135. package/dist/policy/types.d.mts.map +0 -1
  136. package/dist/prompts/core/keys.cjs +0 -165
  137. package/dist/prompts/core/keys.mjs +0 -167
  138. package/dist/prompts/core/keys.mjs.map +0 -1
  139. package/dist/prompts/core/runtime.cjs +0 -104
  140. package/dist/prompts/core/runtime.mjs +0 -106
  141. package/dist/prompts/core/runtime.mjs.map +0 -1
  142. package/dist/prompts/core/session.cjs +0 -98
  143. package/dist/prompts/core/session.mjs +0 -100
  144. package/dist/prompts/core/session.mjs.map +0 -1
  145. package/dist/prompts/core/types.d.cts +0 -21
  146. package/dist/prompts/core/types.d.cts.map +0 -1
  147. package/dist/prompts/core/types.d.mts +0 -21
  148. package/dist/prompts/core/types.d.mts.map +0 -1
  149. package/dist/prompts/types.d.cts +0 -52
  150. package/dist/prompts/types.d.cts.map +0 -1
  151. package/dist/prompts/types.d.mts +0 -52
  152. package/dist/prompts/types.d.mts.map +0 -1
  153. package/dist/pubsub/types.d.cts +0 -10
  154. package/dist/pubsub/types.d.cts.map +0 -1
  155. package/dist/pubsub/types.d.mts +0 -10
  156. package/dist/pubsub/types.d.mts.map +0 -1
  157. package/dist/queue/types.d.cts +0 -47
  158. package/dist/queue/types.d.cts.map +0 -1
  159. package/dist/queue/types.d.mts +0 -47
  160. package/dist/queue/types.d.mts.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/cron/index.ts"],"sourcesContent":["import { err, mightThrow, ok } from \"../errors/index.js\";\nimport { FieldAmount, Scanner, type Token } from \"./scanner.js\";\nimport type { CronOptions, CronParsingError, CronStatus } from \"./types.js\";\n\nconst RETRY_DELAY_MS = 60 * 60 * 1000; // 1 hour\n\nconst ALIASES: Record<string, string> = {\n \"@yearly\": \"0 0 1 1 *\",\n \"@monthly\": \"0 0 1 * *\",\n \"@weekly\": \"0 0 * * 0\",\n \"@daily\": \"0 0 * * *\",\n \"@hourly\": \"0 * * * *\",\n \"@minutely\": \"* * * * *\",\n};\n\nconst CronSecondRange = {\n min: 0,\n max: 59,\n} as const;\n\nconst CronMinuteRange = {\n min: 0,\n max: 59,\n} as const;\n\nconst CronHourRange = {\n min: 0,\n max: 23,\n} as const;\n\nconst CronDayRange = {\n min: 1,\n max: 31,\n} as const;\n\nconst CronMonthRange = {\n min: 1,\n max: 12,\n} as const;\n\nconst CronDayOfWeekRange = {\n min: 0,\n max: 6,\n} as const;\n\nexport class Cron {\n private options: CronOptions;\n private status: CronStatus = \"idle\";\n private timeoutId: NodeJS.Timeout | null = null;\n\n // Array-based storage using 1-indexed slots (0 = don't run, 1 = run)\n private second = Array<number>(CronSecondRange.max + 1).fill(0); // 0-59\n private minute = Array<number>(CronMinuteRange.max + 1).fill(0); // 0-59\n private hour = Array<number>(CronHourRange.max + 1).fill(0); // 0-23\n private day = Array<number>(CronDayRange.max + 1).fill(0); // indices 1-31 (0 unused)\n private month = Array<number>(CronMonthRange.max + 1).fill(0); // indices 1-12 (0 unused)\n private dayOfWeek = Array<number>(CronDayOfWeekRange.max + 1).fill(0); // 0-6\n private hasSeconds;\n private _dayWildcard = false;\n private _dowWildcard = false;\n\n // Fill all values from min to max with 1\n private fillRange(values: number[], min: number, max: number) {\n for (let i = min; i <= max; i++) {\n values[i] = 1;\n }\n }\n\n private handleStep(part: string, values: number[], min: number, max: number) {\n // Split step format into range and step components\n const [rangePart, stepStr] = part.split(\"/\");\n\n if (!rangePart) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${rangePart}' is empty`,\n );\n }\n\n if (!stepStr) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${stepStr}' is empty`,\n );\n }\n\n const step = Number(stepStr);\n\n // Validate step is a positive integer\n if (!Number.isInteger(step)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${step}' is not a valid number`,\n );\n }\n\n if (step <= 0) {\n return err<CronParsingError>(\"OutOfBoundError\", `Expected ${step} > 0`);\n }\n\n if (rangePart === \"*\") {\n // Wildcard with step: apply step across entire range\n for (let i = min; i <= max; i += step) {\n values[i] = 1;\n }\n\n return ok(true);\n }\n\n if (rangePart.includes(\"-\")) {\n // Range with step: delegate to specialized handler\n return this.handleStepRange(rangePart, step, values, min, max);\n }\n\n // Single value with step: delegate to specialized handler\n return this.handleStepSingle(rangePart, step, values, min, max);\n }\n\n private handleStepRange(\n range: string,\n step: number,\n values: number[],\n min: number,\n max: number,\n ) {\n // Split range into start and end values\n const [startStr, endStr] = range.split(\"-\");\n\n if (!endStr) {\n return err<CronParsingError>(\"InvalidValueError\", `'${endStr}' is empty`);\n }\n\n let start = min;\n if (startStr && startStr.length > 0) {\n start = Number(startStr);\n }\n\n const end = Number(endStr);\n\n // Validate range boundaries are integers within bounds\n if (!Number.isInteger(start)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${start}' is not a valid number`,\n );\n }\n\n if (!Number.isInteger(end)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${end}' is not a valid number`,\n );\n }\n\n if (start < min) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} >= ${min}`,\n );\n }\n\n if (end > max) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${end} <= ${max}`,\n );\n }\n\n if (start > end) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} <= ${end}`,\n );\n }\n\n // Apply step through range\n for (let i = start; i <= end; i += step) {\n values[i] = 1;\n }\n\n return ok(true);\n }\n\n private handleStepSingle(\n value: string,\n step: number,\n values: number[],\n min: number,\n max: number,\n ) {\n const start = Number(value);\n\n // Validate starting value is an integer within bounds\n if (!Number.isInteger(start)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${start}' is not a valid number`,\n );\n }\n\n if (start < min) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} >= ${min}`,\n );\n }\n\n if (start > max) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} <= ${max}`,\n );\n }\n\n // Apply step from start to end of range\n for (let i = start; i <= max; i += step) {\n values[i] = 1;\n }\n\n return ok(true);\n }\n\n private handleRange(\n part: string,\n values: number[],\n min: number,\n max: number,\n ) {\n // Split range into start and end values\n const [startStr, endStr] = part.split(\"-\");\n\n if (!startStr) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${startStr}' is empty`,\n );\n }\n\n if (!endStr) {\n return err<CronParsingError>(\"InvalidValueError\", `'${endStr}' is empty`);\n }\n\n const start = Number(startStr);\n const end = Number(endStr);\n\n // Validate range boundaries are integers within bounds\n if (!Number.isInteger(start)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${start}' is not a valid number`,\n );\n }\n\n if (!Number.isInteger(end)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${end}' is not a valid number`,\n );\n }\n\n if (start < min) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} >= ${min}`,\n );\n }\n\n if (end > max) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${end} <= ${max}`,\n );\n }\n\n if (start > end) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${start} <= ${end}`,\n );\n }\n\n // Mark all values in the range\n for (let i = start; i <= end; i++) {\n values[i] = 1;\n }\n\n return ok(true);\n }\n\n private handleNumber(\n value: string,\n values: number[],\n min: number,\n max: number,\n ) {\n const n = Number(value);\n\n // Validate value is an integer within bounds\n if (!Number.isInteger(n)) {\n return err<CronParsingError>(\n \"InvalidValueError\",\n `'${value}' is not a valid number`,\n );\n }\n\n if (n < min) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${n} >= ${min}`,\n );\n }\n if (n > max) {\n return err<CronParsingError>(\n \"OutOfBoundError\",\n `Expected ${n} <= ${max}`,\n );\n }\n\n values[n] = 1;\n\n return ok(true);\n }\n\n public constructor(options: CronOptions) {\n this.options = options;\n\n // Resolve alias or use raw expression\n const expr = this.resolveAlias(options.schedule);\n const [error, tokens] = new Scanner(expr).scan();\n if (error) throw new Error(`${error.type}: ${error.message}`);\n\n const fields = expr.trim().split(/\\s+/);\n this.hasSeconds = fields.length === FieldAmount.max;\n\n // Parse and validate the cron expression\n const [parsingError, _] = this.parse(tokens);\n\n if (parsingError) {\n throw new Error(`${parsingError.type}: ${parsingError.message}`);\n }\n }\n\n // Map alias to standard cron expression if present\n private resolveAlias(schedule: string) {\n return ALIASES[schedule] || schedule;\n }\n\n private parse(tokens: Token[]) {\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n\n if (!token) {\n return err<CronParsingError>(\"InvalidValueError\", \"Undefined token\");\n }\n\n const tokenType = token.getTokenType();\n\n switch (token.getField()) {\n case \"second\": {\n const [error, _] = this.handleField(\n token,\n this.second,\n CronSecondRange.min,\n CronSecondRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"minute\": {\n const [error, _] = this.handleField(\n token,\n this.minute,\n CronMinuteRange.min,\n CronMinuteRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"hour\": {\n const [error, _] = this.handleField(\n token,\n this.hour,\n CronHourRange.min,\n CronHourRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"day\": {\n if (tokenType === \"any\") {\n this._dayWildcard = true;\n }\n\n const [error, _] = this.handleField(\n token,\n this.day,\n CronDayRange.min,\n CronDayRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"month\": {\n const [error, _] = this.handleField(\n token,\n this.month,\n CronMonthRange.min,\n CronMonthRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n case \"weekday\": {\n if (tokenType === \"any\") {\n this._dowWildcard = true;\n }\n\n const [error, _] = this.handleField(\n token,\n this.dayOfWeek,\n CronDayOfWeekRange.min,\n CronDayOfWeekRange.max,\n );\n\n if (error) {\n return err<CronParsingError>(\n error.type,\n `${error.message} in field '${token.getField()}'`,\n );\n }\n\n break;\n }\n default:\n return err<CronParsingError>(\n \"InvalidValueError\",\n `Invalid field '${token.getField()}'`,\n );\n }\n }\n\n return ok(true);\n }\n\n private handleField(token: Token, field: number[], min: number, max: number) {\n switch (token.getTokenType()) {\n case \"any\": {\n this.fillRange(field, min, max);\n break;\n }\n case \"number\": {\n const [error, _] = this.handleNumber(\n token.getComponent(),\n field,\n min,\n max,\n );\n if (error) return err<CronParsingError>(error.type, error.message);\n\n break;\n }\n case \"range\": {\n const component = token.getComponent();\n const [error, _] = this.handleRange(component, field, min, max);\n if (error) return err<CronParsingError>(error.type, error.message);\n\n break;\n }\n case \"step\": {\n const component = token.getComponent();\n const [error, _] = this.handleStep(component, field, min, max);\n if (error) return err<CronParsingError>(error.type, error.message);\n\n break;\n }\n default:\n return err<CronParsingError>(\n \"InvalidValueError\",\n `Invalid token type '${token.getTokenType()}'`,\n );\n }\n\n return ok(true);\n }\n\n public matches(date: Date) {\n // Extract date/time components\n const s = date.getSeconds();\n const m = date.getMinutes();\n const h = date.getHours();\n const d = date.getDate();\n const mon = date.getMonth();\n const dow = date.getDay();\n\n // Check each component against configured values\n const isSecondMatch = this.hasSeconds ? this.second[s] === 1 : true;\n const isMinuteMatch = this.minute[m] === 1;\n const isHourMatch = this.hour[h] === 1;\n const isMonthMatch = this.month[mon + 1] === 1;\n\n // Standard cron: when both day-of-month and day-of-week are restricted (not *),\n // fire if EITHER matches. When at least one is *, use AND (the wildcard is always 1).\n let isDayOrDowMatch: boolean;\n\n if (!this._dayWildcard && !this._dowWildcard) {\n isDayOrDowMatch = this.day[d] === 1 || this.dayOfWeek[dow] === 1;\n } else {\n isDayOrDowMatch = this.day[d] === 1 && this.dayOfWeek[dow] === 1;\n }\n\n return (\n isSecondMatch &&\n isMinuteMatch &&\n isHourMatch &&\n isDayOrDowMatch &&\n isMonthMatch\n );\n }\n\n public getNextRun() {\n const now = new Date();\n const date = new Date(now);\n\n // Start from next minute/second\n if (this.hasSeconds) {\n date.setMilliseconds(0);\n date.setSeconds(date.getSeconds() + 1);\n } else {\n date.setSeconds(0, 0);\n date.setMinutes(date.getMinutes() + 1);\n }\n\n // Search up to 4 years to cover leap-day schedules (next Feb 29 can be ~4 years away)\n const maxIterations = this.hasSeconds\n ? 366 * 4 * 24 * 3600\n : 366 * 4 * 24 * 60;\n\n for (let i = 0; i < maxIterations; i++) {\n if (this.matches(date)) {\n const freshNow = new Date();\n\n // Ensure match is still in the future\n if (date > freshNow) {\n return new Date(date);\n }\n }\n\n // Increment time\n if (this.hasSeconds) {\n date.setSeconds(date.getSeconds() + 1);\n } else {\n date.setMinutes(date.getMinutes() + 1);\n }\n }\n\n return null;\n }\n\n public start() {\n if (this.status !== \"idle\") return;\n\n this.status = \"running\";\n this.next();\n }\n\n public stop() {\n this.status = \"idle\";\n\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n public pause() {\n if (this.status !== \"running\") return;\n\n this.status = \"paused\";\n\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n public resume() {\n if (this.status !== \"paused\") return;\n\n this.status = \"running\";\n this.next();\n }\n\n public getStatus() {\n return this.status;\n }\n\n private next() {\n if (this.status !== \"running\") return;\n\n const nextRun = this.getNextRun();\n\n if (!nextRun) {\n this.timeoutId = setTimeout(() => this.next(), RETRY_DELAY_MS);\n return;\n }\n\n const delay = nextRun.getTime() - Date.now();\n\n const actualDelay = Math.max(0, delay);\n\n this.timeoutId = setTimeout(() => {\n this.run();\n }, actualDelay);\n }\n\n private async run() {\n if (this.status !== \"running\") return;\n\n const handlerResult = this.options.handler();\n await mightThrow(Promise.resolve(handlerResult));\n\n if (this.status === \"running\") {\n this.next();\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/errors/index.ts"],"mappings":";;;cAEa,EAAA,MAAS,IAAA,EAAM,CAAA,qBAAC,CAAA;AAAA,cAIhB,GAAA,aAAiB,WAAA,EAAa,IAAA,EAAM,CAAA,EAAG,OAAA;EAAA;;;cAIvC,cAAA,MAAqB,EAAA,QAAU,CAAA,gDAAC,CAAA;AAAA,cAShC,UAAA,MAAuB,OAAA,EAAS,OAAA,CAAQ,CAAA,MAAE,OAAA,iBAAA,OAAA,CAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/errors/index.ts"],"mappings":";;;cAEa,EAAA,MAAS,IAAA,EAAM,CAAA,qBAAC,CAAA;AAAA,cAIhB,GAAA,aAAiB,WAAA,EAAa,IAAA,EAAM,CAAA,EAAG,OAAA;EAAA;;;cAIvC,cAAA,MAAqB,EAAA,QAAU,CAAA,gDAAC,CAAA;AAAA,cAShC,UAAA,MAAuB,OAAA,EAAS,OAAA,CAAQ,CAAA,MAAE,OAAA,iBAAA,OAAA,CAAA,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/errors/index.ts"],"sourcesContent":["import type { CommonError } from \"./types.js\";\n\nexport const ok = <T>(data: T) => {\n return [null, data] as const;\n};\n\nexport const err = <T extends CommonError>(type: T, message: string) => {\n return [{ type, message }, null] as const;\n};\n\nexport const mightThrowSync = <T>(fn: () => T) => {\n try {\n const result = fn();\n return [null, result] as const;\n } catch (error) {\n return [error, null] as const;\n }\n};\n\nexport const mightThrow = async <T>(promise: Promise<T>) => {\n try {\n const data = await promise;\n return [null, data] as const;\n } catch (error) {\n return [error, null] as const;\n }\n};\n"],"mappings":";AAEA,MAAa,MAAS,SAAY;AAChC,QAAO,CAAC,MAAM,KAAK;;AAGrB,MAAa,OAA8B,MAAS,YAAoB;AACtE,QAAO,CAAC;EAAE;EAAM;EAAS,EAAE,KAAK;;AAGlC,MAAa,kBAAqB,OAAgB;AAChD,KAAI;AAEF,SAAO,CAAC,MADO,IAAI,CACE;UACd,OAAO;AACd,SAAO,CAAC,OAAO,KAAK;;;AAIxB,MAAa,aAAa,OAAU,YAAwB;AAC1D,KAAI;AAEF,SAAO,CAAC,MADK,MAAM,QACA;UACZ,OAAO;AACd,SAAO,CAAC,OAAO,KAAK"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/i18n/index.ts"],"mappings":";;;cAEa,IAAA,wBACY,MAAA,SAAe,MAAA,iDACT,QAAA;EAAA,QAErB,OAAA;EAAA,QACA,aAAA;EAAA,QACA,aAAA;cAEW,MAAA;IACjB,aAAA,EAAe,cAAA;IACf,OAAA,EAAS,QAAA;EAAA;EAOJ,SAAA,CAAU,MAAA,QAAc,QAAA;EAIxB,SAAA,CAAA,SAAS,QAAA;EAIT,SAAA,cAAuB,WAAA,CAAY,QAAA,CAAS,cAAA,GAAA,CACjD,GAAA,EAAK,IAAA,KACF,MAAA,EAAQ,gBAAA,CACT,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBAErC,MAAA,wBAGJ,gBAAA,CACE,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA;EAAA,QAoB/C,cAAA;EAAA,QAOA,gBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/i18n/index.ts"],"mappings":";;;cAEa,IAAA,wBACY,MAAA,SAAe,MAAA,iDACT,QAAA;EAAA,QAErB,OAAA;EAAA,QACA,aAAA;EAAA,QACA,aAAA;cAEW,MAAA;IACjB,aAAA,EAAe,cAAA;IACf,OAAA,EAAS,QAAA;EAAA;EAOJ,SAAA,CAAU,MAAA,QAAc,QAAA;EAIxB,SAAA,CAAA,SAAS,QAAA;EAIT,SAAA,cAAuB,WAAA,CAAY,QAAA,CAAS,cAAA,GAAA,CACjD,GAAA,EAAK,IAAA,KACF,MAAA,EAAQ,gBAAA,CACT,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBAErC,MAAA,wBAGJ,gBAAA,CACE,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA;EAAA,QAoB/C,cAAA;EAAA,QAOA,gBAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/i18n/index.ts"],"sourcesContent":["import type { BuildParamObject, GetNestedValue, NestedKeyOf } from \"./types.js\";\n\nexport class I18n<\n const TLocales extends Record<string, Record<string, unknown>>,\n TDefaultLocale extends keyof TLocales,\n> {\n private locales: TLocales;\n private currentLocale: keyof TLocales;\n private defaultLocale: TDefaultLocale;\n\n public constructor(config: {\n defaultLocale: TDefaultLocale;\n locales: TLocales;\n }) {\n this.defaultLocale = config.defaultLocale;\n this.currentLocale = config.defaultLocale;\n this.locales = config.locales;\n }\n\n public setLocale(locale: keyof TLocales) {\n this.currentLocale = locale;\n }\n\n public getLocale() {\n return this.currentLocale;\n }\n\n public translate<TKey extends NestedKeyOf<TLocales[TDefaultLocale]>>(\n key: TKey,\n ...params: BuildParamObject<\n GetNestedValue<TLocales[TDefaultLocale], TKey> extends string\n ? GetNestedValue<TLocales[TDefaultLocale], TKey>\n : never\n > extends Record<string, never>\n ? []\n : [\n BuildParamObject<\n GetNestedValue<TLocales[TDefaultLocale], TKey> extends string\n ? GetNestedValue<TLocales[TDefaultLocale], TKey>\n : never\n >,\n ]\n ) {\n const currentTranslations = this.locales[this.currentLocale];\n const defaultTranslations = this.locales[this.defaultLocale];\n\n const translation =\n this.getNestedValue(currentTranslations, key) ??\n this.getNestedValue(defaultTranslations, key);\n\n if (!translation) {\n return key;\n }\n\n const paramObj = params[0] as Record<string, unknown> | undefined;\n return this.substituteParams(translation, paramObj);\n }\n\n private getNestedValue(\n obj: Record<string, unknown> | undefined,\n path: string,\n ) {\n return path.split(\".\").reduce((current: any, key) => current?.[key], obj);\n }\n\n private substituteParams(template: string, params?: Record<string, unknown>) {\n if (!params) return template;\n\n return template.replace(/\\{(\\w+):(\\w+)\\}/g, (_match, name) => {\n return String(params[name]);\n });\n }\n}\n"],"mappings":";AAEA,IAAa,OAAb,MAGE;CACA;CACA;CACA;CAEA,YAAmB,QAGhB;AACD,OAAK,gBAAgB,OAAO;AAC5B,OAAK,gBAAgB,OAAO;AAC5B,OAAK,UAAU,OAAO;;CAGxB,UAAiB,QAAwB;AACvC,OAAK,gBAAgB;;CAGvB,YAAmB;AACjB,SAAO,KAAK;;CAGd,UACE,KACA,GAAG,QAaH;EACA,MAAM,sBAAsB,KAAK,QAAQ,KAAK;EAC9C,MAAM,sBAAsB,KAAK,QAAQ,KAAK;EAE9C,MAAM,cACJ,KAAK,eAAe,qBAAqB,IAAI,IAC7C,KAAK,eAAe,qBAAqB,IAAI;AAE/C,MAAI,CAAC,YACH,QAAO;EAGT,MAAM,WAAW,OAAO;AACxB,SAAO,KAAK,iBAAiB,aAAa,SAAS;;CAGrD,eACE,KACA,MACA;AACA,SAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,SAAc,QAAQ,UAAU,MAAM,IAAI;;CAG3E,iBAAyB,UAAkB,QAAkC;AAC3E,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,SAAS,QAAQ,qBAAqB,QAAQ,SAAS;AAC5D,UAAO,OAAO,OAAO,MAAM;IAC3B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/policy/index.ts"],"mappings":";;;;cAEa,MAAA,iBACK,MAAA,oBAA0B,MAAA;EAAA,QAElC,KAAA;EAED,KAAA,CAAM,MAAA,EAAQ,WAAA,CAAY,OAAA;EAa1B,MAAA,CAAO,MAAA,EAAQ,YAAA,CAAa,OAAA;EAAA,QAa3B,SAAA;EAQD,GAAA,CAAI,MAAA,EAAQ,MAAA,EAAQ,MAAA,GAAS,OAAA;;;;UAkB5B,YAAA;EAAA,QAgBA,WAAA;EAAA,QAgBA,SAAA;EAAA,QAgBA,UAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/policy/index.ts"],"mappings":";;;;cAEa,MAAA,iBACK,MAAA,oBAA0B,MAAA;EAAA,QAElC,KAAA;EAED,KAAA,CAAM,MAAA,EAAQ,WAAA,CAAY,OAAA;EAa1B,MAAA,CAAO,MAAA,EAAQ,YAAA,CAAa,OAAA;EAAA,QAa3B,SAAA;EAQD,GAAA,CAAI,MAAA,EAAQ,MAAA,EAAQ,MAAA,GAAS,OAAA;;;;UAkB5B,YAAA;EAAA,QAgBA,WAAA;EAAA,QAgBA,SAAA;EAAA,QAgBA,UAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/policy/index.ts"],"sourcesContent":["import type { Action, AllowParams, ForbidParams, Rule } from \"./types.js\";\n\nexport class Policy<\n TEntity extends Record<string, unknown> = Record<string, unknown>,\n> {\n private rules: Rule<TEntity>[] = [];\n\n public allow(params: AllowParams<TEntity>) {\n const actions = this.toActions(params.action);\n\n for (const action of actions) {\n this.rules.push({\n action,\n conditions: params.conditions,\n inverted: false,\n reason: params.reason,\n });\n }\n }\n\n public forbid(params: ForbidParams<TEntity>) {\n const actions = this.toActions(params.action);\n\n for (const action of actions) {\n this.rules.push({\n action,\n conditions: params.conditions,\n inverted: true,\n reason: params.reason,\n });\n }\n }\n\n private toActions(action: Action | Action[]) {\n if (Array.isArray(action)) {\n return action;\n }\n\n return [action];\n }\n\n public can(action: Action, object?: TEntity) {\n const filteredRules = this.rules.filter((rule) => rule.action === action);\n\n const forbidResult = this.checkForbids(filteredRules, object);\n\n if (forbidResult) {\n return forbidResult;\n }\n\n const allowResult = this.checkAllows(filteredRules, object);\n\n if (allowResult) {\n return allowResult;\n }\n\n return { allowed: false, reason: undefined };\n }\n\n private checkForbids(rules: Rule<TEntity>[], object?: TEntity) {\n for (const rule of rules) {\n if (!rule.inverted) {\n continue;\n }\n\n if (!rule.conditions || Object.entries(rule.conditions).length === 0) {\n return { allowed: false, reason: rule.reason };\n }\n\n if (object && this.deepMatch(object, rule.conditions)) {\n return { allowed: false, reason: rule.reason };\n }\n }\n }\n\n private checkAllows(rules: Rule<TEntity>[], object?: TEntity) {\n for (const rule of rules) {\n if (rule.inverted) {\n continue;\n }\n\n if (!rule.conditions || Object.entries(rule.conditions).length === 0) {\n return { allowed: true, reason: rule.reason };\n }\n\n if (object && this.deepMatch(object, rule.conditions)) {\n return { allowed: true, reason: rule.reason };\n }\n }\n }\n\n private deepMatch(objectValue: unknown, conditionValue: object) {\n if (typeof objectValue !== \"object\" || objectValue === null) {\n return false;\n }\n\n for (const [key, nestedCondition] of Object.entries(conditionValue)) {\n const nestedValue = Reflect.get(objectValue, key);\n\n if (!this.matchValue(nestedValue, nestedCondition)) {\n return false;\n }\n }\n\n return true;\n }\n\n private matchValue(actual: unknown, condition: unknown) {\n if (typeof condition !== \"object\" || condition === null) {\n return false;\n }\n\n if (\"fn\" in condition && typeof condition.fn === \"function\") {\n return condition.fn(actual);\n }\n\n return this.deepMatch(actual, condition);\n }\n}\n\nexport type { ConditionHelper } from \"./helpers.js\";\nexport {\n and,\n endsWith,\n eq,\n gt,\n gte,\n has,\n hasAny,\n hasLength,\n includes,\n isDefined,\n isEmpty,\n isNullish,\n lt,\n lte,\n matches,\n neq,\n not,\n or,\n startsWith,\n} from \"./helpers.js\";\n"],"mappings":";;AAEA,IAAa,SAAb,MAEE;CACA,QAAiC,EAAE;CAEnC,MAAa,QAA8B;EACzC,MAAM,UAAU,KAAK,UAAU,OAAO,OAAO;AAE7C,OAAK,MAAM,UAAU,QACnB,MAAK,MAAM,KAAK;GACd;GACA,YAAY,OAAO;GACnB,UAAU;GACV,QAAQ,OAAO;GAChB,CAAC;;CAIN,OAAc,QAA+B;EAC3C,MAAM,UAAU,KAAK,UAAU,OAAO,OAAO;AAE7C,OAAK,MAAM,UAAU,QACnB,MAAK,MAAM,KAAK;GACd;GACA,YAAY,OAAO;GACnB,UAAU;GACV,QAAQ,OAAO;GAChB,CAAC;;CAIN,UAAkB,QAA2B;AAC3C,MAAI,MAAM,QAAQ,OAAO,CACvB,QAAO;AAGT,SAAO,CAAC,OAAO;;CAGjB,IAAW,QAAgB,QAAkB;EAC3C,MAAM,gBAAgB,KAAK,MAAM,QAAQ,SAAS,KAAK,WAAW,OAAO;EAEzE,MAAM,eAAe,KAAK,aAAa,eAAe,OAAO;AAE7D,MAAI,aACF,QAAO;EAGT,MAAM,cAAc,KAAK,YAAY,eAAe,OAAO;AAE3D,MAAI,YACF,QAAO;AAGT,SAAO;GAAE,SAAS;GAAO,QAAQ,KAAA;GAAW;;CAG9C,aAAqB,OAAwB,QAAkB;AAC7D,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,CAAC,KAAK,SACR;AAGF,OAAI,CAAC,KAAK,cAAc,OAAO,QAAQ,KAAK,WAAW,CAAC,WAAW,EACjE,QAAO;IAAE,SAAS;IAAO,QAAQ,KAAK;IAAQ;AAGhD,OAAI,UAAU,KAAK,UAAU,QAAQ,KAAK,WAAW,CACnD,QAAO;IAAE,SAAS;IAAO,QAAQ,KAAK;IAAQ;;;CAKpD,YAAoB,OAAwB,QAAkB;AAC5D,OAAK,MAAM,QAAQ,OAAO;AACxB,OAAI,KAAK,SACP;AAGF,OAAI,CAAC,KAAK,cAAc,OAAO,QAAQ,KAAK,WAAW,CAAC,WAAW,EACjE,QAAO;IAAE,SAAS;IAAM,QAAQ,KAAK;IAAQ;AAG/C,OAAI,UAAU,KAAK,UAAU,QAAQ,KAAK,WAAW,CACnD,QAAO;IAAE,SAAS;IAAM,QAAQ,KAAK;IAAQ;;;CAKnD,UAAkB,aAAsB,gBAAwB;AAC9D,MAAI,OAAO,gBAAgB,YAAY,gBAAgB,KACrD,QAAO;AAGT,OAAK,MAAM,CAAC,KAAK,oBAAoB,OAAO,QAAQ,eAAe,EAAE;GACnE,MAAM,cAAc,QAAQ,IAAI,aAAa,IAAI;AAEjD,OAAI,CAAC,KAAK,WAAW,aAAa,gBAAgB,CAChD,QAAO;;AAIX,SAAO;;CAGT,WAAmB,QAAiB,WAAoB;AACtD,MAAI,OAAO,cAAc,YAAY,cAAc,KACjD,QAAO;AAGT,MAAI,QAAQ,aAAa,OAAO,UAAU,OAAO,WAC/C,QAAO,UAAU,GAAG,OAAO;AAG7B,SAAO,KAAK,UAAU,QAAQ,UAAU"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/prompts/index.ts"],"mappings":";;;;cAoTa,KAAA,GAAe,OAAA,EAAS,YAAA,EAAc,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cA8B7D,QAAA,GACX,OAAA,EAAS,eAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAuCZ,OAAA,GACX,OAAA,EAAS,cAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAkEZ,MAAA,GACX,OAAA,EAAS,aAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAiJZ,MAAA,0BACX,OAAA,EAAS,aAAA,CAAc,MAAA,GACvB,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cA0EZ,WAAA,0BACX,OAAA,EAAS,kBAAA,CAAmB,MAAA,GAC5B,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/prompts/index.ts"],"mappings":";;;;cAoTa,KAAA,GAAe,OAAA,EAAS,YAAA,EAAc,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cA8B7D,QAAA,GACX,OAAA,EAAS,eAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAuCZ,OAAA,GACX,OAAA,EAAS,cAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAkEZ,MAAA,GACX,OAAA,EAAS,aAAA,EACT,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cAiJZ,MAAA,0BACX,OAAA,EAAS,aAAA,CAAc,MAAA,GACvB,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA;;;cA0EZ,WAAA,0BACX,OAAA,EAAS,kBAAA,CAAmB,MAAA,GAC5B,OAAA,GAAU,aAAA,KAAa,OAAA;EAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/prompts/index.ts"],"sourcesContent":["import { styleText } from \"node:util\";\nimport { createNodePromptRuntime } from \"./core/runtime.js\";\nimport { runPromptSession } from \"./core/session.js\";\nimport type { PromptRuntime } from \"./core/types.js\";\nimport type {\n ConfirmOptions,\n InputOptions,\n MultiselectOptions,\n NumberOptions,\n PasswordOptions,\n SelectOptions,\n} from \"./types.js\";\n\nconst pointer = (active: boolean) => {\n return active ? paint(\"cyan\", \"❯\") : \" \";\n};\n\nconst addErrorLine = (content: string, errorMessage: string | null) => {\n if (!errorMessage) {\n return content;\n }\n\n return `${content}\\n${errorMark()} ${paint(\"red\", errorMessage)}`;\n};\n\nconst insertAt = (value: string, at: number, character: string) => {\n return `${value.slice(0, at)}${character}${value.slice(at)}`;\n};\n\nconst INVERSE = \"\\u001B[7m\";\nconst RESET = \"\\u001B[0m\";\nconst WHITESPACE = /\\s/;\nconst NUMBER_CHAR = /[0-9.-]/;\nconst CURSOR_BLOCK = `${INVERSE} ${RESET}`;\nconst paint = (\n color: \"cyan\" | \"green\" | \"red\" | \"yellow\" | \"dim\",\n text: string,\n) => {\n return styleText(color, text, { validateStream: false });\n};\n\nconst questionMark = () => paint(\"cyan\", \"?\");\nconst successMark = () => paint(\"green\", \"✔\");\nconst errorMark = () => paint(\"red\", \"✖\");\n\nconst renderQuestionLine = (message: string, content: string) => {\n return `${questionMark()} ${paint(\"cyan\", message)} ${content}`;\n};\n\nconst renderSuccessLine = (message: string, content: string) => {\n return `${successMark()} ${message} ${content}`;\n};\n\ntype TextState = {\n value: string;\n cursor: number;\n selectionAnchor: number | null;\n};\n\nconst createTextState = (value: string): TextState => {\n return {\n value,\n cursor: value.length,\n selectionAnchor: null,\n };\n};\n\nconst submitTextValue = (\n state: TextState,\n options: {\n defaultValue?: string;\n required?: boolean;\n requiredMessage?: string;\n },\n) => {\n const value =\n state.value.length > 0 ? state.value : (options.defaultValue ?? \"\");\n\n if (options.required && value.trim().length === 0) {\n return { errorMessage: options.requiredMessage ?? \"A value is required\" };\n }\n\n return { value };\n};\n\nconst getSelectionRange = (state: TextState) => {\n if (\n state.selectionAnchor === null ||\n state.selectionAnchor === state.cursor\n ) {\n return null;\n }\n\n return {\n start: Math.min(state.selectionAnchor, state.cursor),\n end: Math.max(state.selectionAnchor, state.cursor),\n };\n};\n\nconst moveCursor = (\n state: TextState,\n cursor: number,\n keepSelection: boolean,\n) => {\n if (!keepSelection) {\n return {\n ...state,\n cursor,\n selectionAnchor: null,\n };\n }\n\n return {\n ...state,\n cursor,\n selectionAnchor: state.selectionAnchor ?? state.cursor,\n };\n};\n\nconst deleteRange = (\n state: TextState,\n start: number,\n end: number,\n): TextState => {\n return {\n value: `${state.value.slice(0, start)}${state.value.slice(end)}`,\n cursor: start,\n selectionAnchor: null,\n };\n};\n\nconst deleteSelectedRange = (state: TextState) => {\n const selection = getSelectionRange(state);\n\n if (!selection) {\n return state;\n }\n\n return deleteRange(state, selection.start, selection.end);\n};\n\nconst findWordStart = (value: string, cursor: number) => {\n let index = cursor;\n\n while (index > 0 && WHITESPACE.test(value[index - 1] ?? \"\")) {\n index -= 1;\n }\n\n while (index > 0 && !WHITESPACE.test(value[index - 1] ?? \"\")) {\n index -= 1;\n }\n\n return index;\n};\n\nconst findWordEnd = (value: string, cursor: number) => {\n let index = cursor;\n\n while (index < value.length && WHITESPACE.test(value[index] ?? \"\")) {\n index += 1;\n }\n\n while (index < value.length && !WHITESPACE.test(value[index] ?? \"\")) {\n index += 1;\n }\n\n return index;\n};\n\nconst renderTextSelection = (state: TextState, mask?: string) => {\n const selection = getSelectionRange(state);\n const content = mask ? mask.repeat(state.value.length) : state.value;\n const boundedCursor = Math.max(0, Math.min(state.cursor, content.length));\n\n if (!selection) {\n if (content.length === 0) {\n return CURSOR_BLOCK;\n }\n\n if (boundedCursor === content.length) {\n return `${content}${CURSOR_BLOCK}`;\n }\n\n const focusedChar = content[boundedCursor] ?? \" \";\n\n return `${content.slice(0, boundedCursor)}${INVERSE}${focusedChar}${RESET}${content.slice(boundedCursor + 1)}`;\n }\n\n const selected = content.slice(selection.start, selection.end);\n\n return `${content.slice(0, selection.start)}${INVERSE}${selected}${RESET}${content.slice(selection.end)}`;\n};\n\nconst textOnKey = (\n state: TextState,\n key: {\n name: string;\n value?: string;\n },\n) => {\n switch (key.name) {\n case \"ctrl_a\": {\n return {\n ...state,\n cursor: state.value.length,\n selectionAnchor: 0,\n };\n }\n case \"home\": {\n return moveCursor(state, 0, false);\n }\n case \"end\": {\n return moveCursor(state, state.value.length, false);\n }\n case \"shift_ctrl_left\": {\n return moveCursor(state, findWordStart(state.value, state.cursor), true);\n }\n case \"shift_ctrl_right\": {\n return moveCursor(state, findWordEnd(state.value, state.cursor), true);\n }\n case \"left\": {\n return moveCursor(state, Math.max(state.cursor - 1, 0), false);\n }\n case \"shift_left\": {\n return moveCursor(state, Math.max(state.cursor - 1, 0), true);\n }\n case \"right\": {\n return moveCursor(\n state,\n Math.min(state.cursor + 1, state.value.length),\n false,\n );\n }\n case \"ctrl_left\": {\n return moveCursor(state, findWordStart(state.value, state.cursor), false);\n }\n case \"ctrl_right\": {\n return moveCursor(state, findWordEnd(state.value, state.cursor), false);\n }\n case \"shift_right\": {\n return moveCursor(\n state,\n Math.min(state.cursor + 1, state.value.length),\n true,\n );\n }\n case \"backspace\": {\n const selectionDeleted = deleteSelectedRange(state);\n\n if (selectionDeleted !== state) {\n return selectionDeleted;\n }\n\n if (state.cursor === 0) {\n return state;\n }\n\n const nextCursor = state.cursor - 1;\n\n return {\n value: `${state.value.slice(0, nextCursor)}${state.value.slice(state.cursor)}`,\n cursor: nextCursor,\n selectionAnchor: null,\n };\n }\n case \"ctrl_backspace\": {\n const selectionDeleted = deleteSelectedRange(state);\n\n if (selectionDeleted !== state) {\n return selectionDeleted;\n }\n\n if (state.cursor === 0) {\n return state;\n }\n\n const nextCursor = findWordStart(state.value, state.cursor);\n return deleteRange(state, nextCursor, state.cursor);\n }\n case \"delete\": {\n const selectionDeleted = deleteSelectedRange(state);\n\n if (selectionDeleted !== state) {\n return selectionDeleted;\n }\n\n return {\n ...state,\n value: `${state.value.slice(0, state.cursor)}${state.value.slice(state.cursor + 1)}`,\n };\n }\n case \"character\":\n case \"space\": {\n const collapsed = deleteSelectedRange(state);\n const text = key.name === \"space\" ? \" \" : (key.value ?? \"\");\n\n return {\n value: insertAt(collapsed.value, collapsed.cursor, text),\n cursor: collapsed.cursor + 1,\n selectionAnchor: null,\n };\n }\n default: {\n return state;\n }\n }\n};\n\nexport const input = async (options: InputOptions, runtime?: PromptRuntime) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const initialValue = options.defaultValue ?? \"\";\n\n return runPromptSession<TextState, string, InputOptions>({\n runtime: promptRuntime,\n options,\n initialState: createTextState(initialValue),\n render: ({ options: currentOptions, state, errorMessage }) => {\n let text = renderTextSelection(state);\n\n if (state.value.length === 0 && currentOptions.placeholder) {\n text = `${CURSOR_BLOCK}${paint(\"dim\", currentOptions.placeholder)}`;\n }\n\n return addErrorLine(\n renderQuestionLine(currentOptions.message, text),\n errorMessage,\n );\n },\n complete: ({ options: currentOptions, value }) => {\n return renderSuccessLine(currentOptions.message, value);\n },\n onKey: (state, key) => {\n return textOnKey(state, key);\n },\n onSubmit: (state) => submitTextValue(state, options),\n });\n};\n\nexport const password = async (\n options: PasswordOptions,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const initialValue = options.defaultValue ?? \"\";\n const mask = options.mask;\n\n return runPromptSession<TextState, string, PasswordOptions>({\n runtime: promptRuntime,\n options,\n initialState: createTextState(initialValue),\n render: ({ options: currentOptions, state, errorMessage }) => {\n let visible: string;\n\n if (state.value.length === 0 && currentOptions.placeholder) {\n visible = `${CURSOR_BLOCK}${paint(\"dim\", currentOptions.placeholder)}`;\n } else if (mask !== undefined) {\n visible = renderTextSelection(state, mask);\n } else {\n visible = CURSOR_BLOCK;\n }\n\n return addErrorLine(\n renderQuestionLine(currentOptions.message, visible),\n errorMessage,\n );\n },\n complete: ({ options: currentOptions, value }) => {\n return renderSuccessLine(\n currentOptions.message,\n mask !== undefined ? mask.repeat(value.length) : \"\",\n );\n },\n onKey: (state, key) => {\n return textOnKey(state, key);\n },\n onSubmit: (state) => submitTextValue(state, options),\n });\n};\n\nexport const confirm = async (\n options: ConfirmOptions,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const defaultValue = options.defaultValue ?? false;\n\n return runPromptSession<{ value: boolean }, boolean, ConfirmOptions>({\n runtime: promptRuntime,\n options,\n initialState: {\n value: defaultValue,\n },\n render: ({ options: currentOptions, state, errorMessage }) => {\n const yesLabel = currentOptions.activeLabel ?? \"Yes\";\n const noLabel = currentOptions.inactiveLabel ?? \"No\";\n const rendered = state.value ? yesLabel : noLabel;\n\n return addErrorLine(\n [\n renderQuestionLine(currentOptions.message, `(${rendered})`),\n paint(\"dim\", \" (y/n to select, ← yes / → no, space to toggle)\"),\n ].join(\"\\n\"),\n errorMessage,\n );\n },\n complete: ({ options: currentOptions, value }) => {\n const label = value\n ? (currentOptions.activeLabel ?? \"Yes\")\n : (currentOptions.inactiveLabel ?? \"No\");\n\n return renderSuccessLine(currentOptions.message, label);\n },\n onKey: (state, key) => {\n switch (key.name) {\n case \"left\": {\n return { value: true };\n }\n case \"right\": {\n return { value: false };\n }\n case \"space\": {\n return { value: !state.value };\n }\n case \"character\": {\n const lowered = (key.value ?? \"\").toLowerCase();\n\n if (lowered === \"y\") {\n return { value: true };\n }\n\n if (lowered === \"n\") {\n return { value: false };\n }\n\n return state;\n }\n default: {\n return state;\n }\n }\n },\n onSubmit: (state) => {\n return { value: state.value };\n },\n });\n};\n\nexport const number = async (\n options: NumberOptions,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const defaultValue =\n options.defaultValue === undefined ? \"\" : String(options.defaultValue);\n\n return runPromptSession<TextState, number, NumberOptions>({\n runtime: promptRuntime,\n options,\n initialState: createTextState(defaultValue),\n render: ({ options: currentOptions, state, errorMessage }) => {\n return addErrorLine(\n renderQuestionLine(currentOptions.message, renderTextSelection(state)),\n errorMessage,\n );\n },\n complete: ({ options: currentOptions, value }) => {\n return renderSuccessLine(currentOptions.message, String(value));\n },\n onKey: (state, key) => {\n const next = textOnKey(state, key);\n const isTextEntry = key.name === \"character\" || key.name === \"space\";\n\n if (!isTextEntry) {\n return next;\n }\n\n const value = key.name === \"space\" ? \" \" : (key.value ?? \"\");\n\n if (!NUMBER_CHAR.test(value)) {\n return state;\n }\n\n if (value === \".\" || value === \"-\") {\n const collapsed = deleteSelectedRange(state);\n\n if (value === \".\" && collapsed.value.includes(\".\")) {\n return state;\n }\n\n if (value === \"-\") {\n if (collapsed.cursor !== 0) return state;\n if (collapsed.value.includes(\"-\")) return state;\n }\n }\n\n return next;\n },\n onSubmit: (state) => {\n const raw = state.value.trim();\n\n if (raw.length === 0) {\n return {\n errorMessage: options.requiredMessage ?? \"A number is required\",\n };\n }\n\n const parsed = Number(raw);\n\n if (!Number.isFinite(parsed)) {\n return {\n errorMessage: options.invalidMessage ?? \"Please enter a valid number\",\n };\n }\n\n if (options.min !== undefined && parsed < options.min) {\n return {\n errorMessage:\n options.minMessage ??\n `Number must be greater than or equal to ${options.min}`,\n };\n }\n\n if (options.max !== undefined && parsed > options.max) {\n return {\n errorMessage:\n options.maxMessage ??\n `Number must be lower than or equal to ${options.max}`,\n };\n }\n\n return { value: parsed };\n },\n });\n};\n\nconst findFirstEnabledIndex = <TValue extends string>(\n choices: readonly {\n value: TValue;\n disabled?: boolean;\n }[],\n) => {\n const firstEnabledIndex = choices.findIndex((choice) => !choice.disabled);\n\n if (firstEnabledIndex >= 0) {\n return firstEnabledIndex;\n }\n\n return 0;\n};\n\nconst findNextEnabledIndex = <TValue extends string>(\n choices: readonly {\n value: TValue;\n disabled?: boolean;\n }[],\n cursor: number,\n direction: 1 | -1,\n) => {\n const total = choices.length;\n let currentCursor = cursor;\n\n for (let offset = 0; offset < total; offset++) {\n const nextCursor = (currentCursor + direction + total) % total;\n const nextChoice = choices[nextCursor];\n\n if (nextChoice && !nextChoice.disabled) {\n return nextCursor;\n }\n\n currentCursor = nextCursor;\n }\n\n return currentCursor;\n};\n\nconst findDefaultIndex = <TValue extends string>(\n choices: SelectOptions<TValue>[\"choices\"],\n defaultValue: TValue | undefined,\n) => {\n if (defaultValue === undefined) {\n return findFirstEnabledIndex(choices);\n }\n\n const index = choices.findIndex(\n (choice) => choice.value === defaultValue && !choice.disabled,\n );\n\n if (index >= 0) {\n return index;\n }\n\n return findFirstEnabledIndex(choices);\n};\n\nexport const select = async <TValue extends string>(\n options: SelectOptions<TValue>,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n const initialCursor = findDefaultIndex(options.choices, options.defaultValue);\n\n return runPromptSession<{ cursor: number }, TValue, SelectOptions<TValue>>({\n runtime: promptRuntime,\n options,\n initialState: {\n cursor: initialCursor,\n },\n render: ({ options: currentOptions, state, errorMessage }) => {\n const lines = [renderQuestionLine(currentOptions.message, \"\")];\n\n for (let index = 0; index < currentOptions.choices.length; index++) {\n const choice = currentOptions.choices[index];\n\n if (!choice) {\n continue;\n }\n\n const active = state.cursor === index;\n const label = choice.label ?? choice.value;\n const hint = choice.hint ? paint(\"dim\", ` (${choice.hint})`) : \"\";\n const disabled = choice.disabled ? paint(\"yellow\", \" [disabled]\") : \"\";\n\n lines.push(`${pointer(active)} ${label}${hint}${disabled}`);\n }\n\n return addErrorLine(lines.join(\"\\n\"), errorMessage);\n },\n complete: ({ options: currentOptions, value }) => {\n const selected = currentOptions.choices.find(\n (choice) => choice.value === value,\n );\n\n return renderSuccessLine(\n currentOptions.message,\n selected?.label ?? value,\n );\n },\n onKey: (state, key) => {\n switch (key.name) {\n case \"up\": {\n return {\n cursor: findNextEnabledIndex(options.choices, state.cursor, -1),\n };\n }\n case \"down\": {\n return {\n cursor: findNextEnabledIndex(options.choices, state.cursor, 1),\n };\n }\n default: {\n return state;\n }\n }\n },\n onSubmit: (state) => {\n const selectedChoice = options.choices[state.cursor];\n\n if (!selectedChoice) {\n return { errorMessage: \"Please select an option\" };\n }\n\n if (selectedChoice.disabled) {\n return { errorMessage: \"Selected option is disabled\" };\n }\n\n return { value: selectedChoice.value };\n },\n });\n};\n\nexport const multiselect = async <TValue extends string>(\n options: MultiselectOptions<TValue>,\n runtime?: PromptRuntime,\n) => {\n const promptRuntime = runtime ?? createNodePromptRuntime();\n\n return runPromptSession<\n { cursor: number; selected: Set<TValue> },\n TValue[],\n MultiselectOptions<TValue>\n >({\n runtime: promptRuntime,\n options,\n initialState: {\n cursor: findFirstEnabledIndex(options.choices),\n selected: new Set<TValue>(options.defaultValue ?? []),\n },\n render: ({ options: currentOptions, state, errorMessage }) => {\n const lines = [renderQuestionLine(currentOptions.message, \"\")];\n\n for (let index = 0; index < currentOptions.choices.length; index++) {\n const choice = currentOptions.choices[index];\n\n if (!choice) {\n continue;\n }\n\n const active = state.cursor === index;\n const checked = state.selected.has(choice.value) ? \"◉\" : \"◯\";\n const disabled = choice.disabled ? paint(\"yellow\", \" [disabled]\") : \"\";\n const label = choice.label ?? choice.value;\n const hint = choice.hint ? paint(\"dim\", ` (${choice.hint})`) : \"\";\n\n lines.push(`${pointer(active)} ${checked} ${label}${hint}${disabled}`);\n }\n\n lines.push(\n paint(\"dim\", \" (space to toggle, a to toggle all, enter to submit)\"),\n );\n\n return addErrorLine(lines.join(\"\\n\"), errorMessage);\n },\n complete: ({ options: currentOptions, value }) => {\n const labelMap = new Map(\n currentOptions.choices.map((choice) => [choice.value, choice.label]),\n );\n\n const labels = value.map((v) => labelMap.get(v) ?? v);\n\n return renderSuccessLine(currentOptions.message, labels.join(\", \"));\n },\n onKey: (state, key) => {\n switch (key.name) {\n case \"up\": {\n return {\n ...state,\n cursor: findNextEnabledIndex(options.choices, state.cursor, -1),\n };\n }\n case \"down\": {\n return {\n ...state,\n cursor: findNextEnabledIndex(options.choices, state.cursor, 1),\n };\n }\n case \"character\": {\n const lowered = (key.value ?? \"\").toLowerCase();\n\n if (lowered === \"a\") {\n const enabledValues = options.choices\n .filter((choice) => !choice.disabled)\n .map((choice) => choice.value);\n\n const hasEnabledValues = enabledValues.length > 0;\n\n if (!hasEnabledValues) {\n return state;\n }\n\n const areAllEnabledSelected = enabledValues.every((value) =>\n state.selected.has(value),\n );\n\n const nextSelection = new Set(state.selected);\n\n if (areAllEnabledSelected) {\n for (const value of enabledValues) {\n nextSelection.delete(value);\n }\n } else {\n for (const value of enabledValues) {\n nextSelection.add(value);\n }\n }\n\n return {\n ...state,\n selected: nextSelection,\n };\n }\n\n return state;\n }\n case \"space\": {\n const currentChoice = options.choices[state.cursor];\n\n if (!currentChoice || currentChoice.disabled) {\n return state;\n }\n\n const nextSelection = new Set(state.selected);\n\n if (nextSelection.has(currentChoice.value)) {\n nextSelection.delete(currentChoice.value);\n } else {\n nextSelection.add(currentChoice.value);\n }\n\n return {\n ...state,\n selected: nextSelection,\n };\n }\n default: {\n return state;\n }\n }\n },\n onSubmit: (state) => {\n const values = options.choices\n .filter((choice) => state.selected.has(choice.value))\n .map((choice) => choice.value);\n\n if (options.min !== undefined && values.length < options.min) {\n return {\n errorMessage: `Please select at least ${options.min} options`,\n };\n }\n\n if (options.max !== undefined && values.length > options.max) {\n return {\n errorMessage: `Please select at most ${options.max} options`,\n };\n }\n\n return { value: values };\n },\n });\n};\n\nexport type { PromptRuntime } from \"./core/types.js\";\nexport type {\n ConfirmOptions,\n InputOptions,\n MultiselectOptions,\n NumberOptions,\n PasswordOptions,\n PromptErrorType,\n SelectChoice,\n SelectOptions,\n} from \"./types.js\";\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"mappings":";;;cAGa,MAAA,WAAiB,MAAA;EAAA,QACpB,OAAA;EAAA,QACA,YAAA;cAEW,OAAA,EAAS,aAAA;EAIf,OAAA,CAAQ,OAAA,EAAS,CAAA,GAAC,OAAA;IAAA;;;;;;EAuBlB,SAAA,CAAU,OAAA,EAAS,cAAA,CAAe,CAAA,IAAE,OAAA;IAAA;;;EAgCpC,WAAA,CAAA,GAAW,OAAA;IAAA;;;EAuBjB,QAAA,CAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"mappings":";;;cAGa,MAAA,WAAiB,MAAA;EAAA,QACpB,OAAA;EAAA,QACA,YAAA;cAEW,OAAA,EAAS,aAAA;EAIf,OAAA,CAAQ,OAAA,EAAS,CAAA,GAAC,OAAA;IAAA;;;;;;EAuBlB,SAAA,CAAU,OAAA,EAAS,cAAA,CAAe,CAAA,IAAE,OAAA;IAAA;;;EAgCpC,WAAA,CAAA,GAAW,OAAA;IAAA;;;EAuBjB,QAAA,CAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"sourcesContent":["import { err, mightThrow, mightThrowSync, ok } from \"../errors/index.js\";\nimport type { MessageHandler, PubSubOptions } from \"./types.js\";\n\nexport class PubSub<T extends Record<string, unknown>> {\n private options: PubSubOptions;\n private isSubscribed = false;\n\n public constructor(options: PubSubOptions) {\n this.options = options;\n }\n\n public async publish(message: T) {\n const [stringifyError, stringified] = mightThrowSync(() =>\n JSON.stringify(message),\n );\n\n if (stringifyError || !stringified) {\n return err(\"SerializationError\", \"Unable to serialize message\");\n }\n\n const [publishError, count] = await mightThrow(\n this.options.publisher.publish(this.options.channel, stringified),\n );\n\n if (publishError) {\n return err(\n \"PublishError\",\n `Unable to publish to ${this.options.channel}`,\n );\n }\n\n return ok(count);\n }\n\n public async subscribe(handler: MessageHandler<T>) {\n if (this.isActive()) {\n return err(\"SubscribeError\", \"Already subscribed\");\n }\n\n this.isSubscribed = true;\n\n const wrappedHandler = async (message: string, channel: string) => {\n const [parseError, parsed] = mightThrowSync<T>(() => JSON.parse(message));\n\n if (parseError) return;\n if (!parsed) return;\n\n await mightThrow(Promise.resolve(handler(parsed, channel)));\n };\n\n const [subscribeError, count] = await mightThrow(\n this.options.subscriber.subscribe(this.options.channel, wrappedHandler),\n );\n\n if (subscribeError) {\n this.isSubscribed = false;\n\n return err(\n \"SubscribeError\",\n `Unable to subscribe to ${this.options.channel}`,\n );\n }\n\n return ok(count);\n }\n\n public async unsubscribe() {\n if (!this.isActive()) {\n return err(\"UnsubscribeError\", \"Not subscribed\");\n }\n\n this.isSubscribed = false;\n\n const [unsubscribeError] = await mightThrow(\n this.options.subscriber.unsubscribe(this.options.channel),\n );\n\n if (unsubscribeError) {\n this.isSubscribed = true;\n\n return err(\n \"UnsubscribeError\",\n `Unable to unsubscribe from ${this.options.channel}`,\n );\n }\n\n return ok(true);\n }\n\n public isActive() {\n return this.isSubscribed;\n }\n}\n"],"mappings":";;AAGA,IAAa,SAAb,MAAuD;CACrD;CACA,eAAuB;CAEvB,YAAmB,SAAwB;AACzC,OAAK,UAAU;;CAGjB,MAAa,QAAQ,SAAY;EAC/B,MAAM,CAAC,gBAAgB,eAAe,qBACpC,KAAK,UAAU,QAAQ,CACxB;AAED,MAAI,kBAAkB,CAAC,YACrB,QAAO,IAAI,sBAAsB,8BAA8B;EAGjE,MAAM,CAAC,cAAc,SAAS,MAAM,WAClC,KAAK,QAAQ,UAAU,QAAQ,KAAK,QAAQ,SAAS,YAAY,CAClE;AAED,MAAI,aACF,QAAO,IACL,gBACA,wBAAwB,KAAK,QAAQ,UACtC;AAGH,SAAO,GAAG,MAAM;;CAGlB,MAAa,UAAU,SAA4B;AACjD,MAAI,KAAK,UAAU,CACjB,QAAO,IAAI,kBAAkB,qBAAqB;AAGpD,OAAK,eAAe;EAEpB,MAAM,iBAAiB,OAAO,SAAiB,YAAoB;GACjE,MAAM,CAAC,YAAY,UAAU,qBAAwB,KAAK,MAAM,QAAQ,CAAC;AAEzE,OAAI,WAAY;AAChB,OAAI,CAAC,OAAQ;AAEb,SAAM,WAAW,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,CAAC;;EAG7D,MAAM,CAAC,gBAAgB,SAAS,MAAM,WACpC,KAAK,QAAQ,WAAW,UAAU,KAAK,QAAQ,SAAS,eAAe,CACxE;AAED,MAAI,gBAAgB;AAClB,QAAK,eAAe;AAEpB,UAAO,IACL,kBACA,0BAA0B,KAAK,QAAQ,UACxC;;AAGH,SAAO,GAAG,MAAM;;CAGlB,MAAa,cAAc;AACzB,MAAI,CAAC,KAAK,UAAU,CAClB,QAAO,IAAI,oBAAoB,iBAAiB;AAGlD,OAAK,eAAe;EAEpB,MAAM,CAAC,oBAAoB,MAAM,WAC/B,KAAK,QAAQ,WAAW,YAAY,KAAK,QAAQ,QAAQ,CAC1D;AAED,MAAI,kBAAkB;AACpB,QAAK,eAAe;AAEpB,UAAO,IACL,oBACA,8BAA8B,KAAK,QAAQ,UAC5C;;AAGH,SAAO,GAAG,KAAK;;CAGjB,WAAkB;AAChB,SAAO,KAAK"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/queue/index.ts"],"mappings":";;;cAoBa,KAAA;EAAA,QACH,OAAA;EAAA,QACA,OAAA;EAAA,QACA,aAAA;EAAA,QACA,OAAA;EAAA,QACA,OAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;cAEW,OAAA,EAAS,YAAA,CAAa,CAAA;EAS5B,OAAA,CAAQ,IAAA,EAAM,CAAA,GAAC,OAAA;IAAA;;;EAsBf,IAAA,CAAA,GAAI,OAAA;EAAA,QAWT,mBAAA;EAAA,QAIA,YAAA;EAAA,QAIM,cAAA;EAAA,QAKA,qBAAA;EAAA,QAWN,kBAAA;EAAA,QAIA,YAAA;EAAA,QAMM,WAAA;EAAA,QAkDA,SAAA;EAAA,QA6EA,WAAA;EAAA,QAkBA,0BAAA;EAAA,QAmBA,QAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/queue/index.ts"],"mappings":";;;cAoBa,KAAA;EAAA,QACH,OAAA;EAAA,QACA,OAAA;EAAA,QACA,aAAA;EAAA,QACA,OAAA;EAAA,QACA,OAAA;EAAA,QACA,WAAA;EAAA,QACA,YAAA;cAEW,OAAA,EAAS,YAAA,CAAa,CAAA;EAS5B,OAAA,CAAQ,IAAA,EAAM,CAAA,GAAC,OAAA;IAAA;;;EAsBf,IAAA,CAAA,GAAI,OAAA;EAAA,QAWT,mBAAA;EAAA,QAIA,YAAA;EAAA,QAIM,cAAA;EAAA,QAKA,qBAAA;EAAA,QAWN,kBAAA;EAAA,QAIA,YAAA;EAAA,QAMM,WAAA;EAAA,QAkDA,SAAA;EAAA,QA6EA,WAAA;EAAA,QAkBA,0BAAA;EAAA,QAmBA,QAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/queue/index.ts"],"sourcesContent":["import { err, mightThrow, mightThrowSync, ok } from \"../errors/index.js\";\nimport type { Job, JobState, QueueOptions } from \"./types.js\";\n\nconst toMinimalJob = <T>(jobState: JobState<T>): Job<T> => ({\n id: jobState.id,\n data: jobState.data,\n attempts: jobState.attempts,\n maxRetries: jobState.maxRetries,\n createdAt: jobState.createdAt,\n});\n\nconst DEFAULT_RETRIES = 3;\nconst DEFAULT_TIMEOUT = 30000;\nconst DEFAULT_CONCURRENCY = 1;\nconst DEFAULT_POLL_INTERVAL = 100;\nconst MAX_BACKOFF_DELAY = 60000;\nconst BASE_BACKOFF_DELAY = 1000;\nconst BACKOFF_MULTIPLIER = 2;\nconst SHUTDOWN_POLL_INTERVAL = 10;\n\nexport class Queue<T> {\n private options: QueueOptions<T>;\n private running = true;\n private activeWorkers = 0;\n private retries: number;\n private timeout: number;\n private concurrency: number;\n private pollInterval: number;\n\n public constructor(options: QueueOptions<T>) {\n this.options = options;\n this.retries = options.retries ?? DEFAULT_RETRIES;\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.concurrency = options.concurrency ?? DEFAULT_CONCURRENCY;\n this.pollInterval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;\n this.startWorkers();\n }\n\n public async enqueue(data: T) {\n const job: JobState<T> = {\n id: crypto.randomUUID(),\n data,\n attempts: 0,\n maxRetries: this.retries,\n createdAt: Date.now(),\n };\n\n const [serializeError, serialized] = this.serializeJob(job);\n if (serializeError || !serialized) {\n return err(\"QueueError\", \"Unable to serialize job data\");\n }\n\n const [enqueueError] = await this.enqueueJobData(serialized);\n if (enqueueError) {\n return err(\"QueueError\", \"Unable to enqueue job\");\n }\n\n return ok(job.id);\n }\n\n public async stop() {\n this.running = false;\n\n // Wait for all active workers to finish processing\n while (this.activeWorkers > 0) {\n await new Promise((resolve) =>\n setTimeout(resolve, SHUTDOWN_POLL_INTERVAL),\n );\n }\n }\n\n private waitForPollInterval() {\n return new Promise((resolve) => setTimeout(resolve, this.pollInterval));\n }\n\n private serializeJob(job: JobState<T>) {\n return mightThrowSync(() => JSON.stringify(job));\n }\n\n private async enqueueJobData(serialized: string) {\n const queueKey = `queue:${this.options.name}:jobs`;\n return mightThrow(this.options.redis.lpush(queueKey, serialized));\n }\n\n private async moveToDeadLetterQueue(jobData: string, parseError: unknown) {\n const deadLetterKey = `queue:${this.options.name}:dead-letter`;\n const deadLetterEntry = JSON.stringify({\n jobData,\n parseError: this.formatErrorMessage(parseError),\n timestamp: Date.now(),\n });\n\n return mightThrow(this.options.redis.lpush(deadLetterKey, deadLetterEntry));\n }\n\n private formatErrorMessage(error: unknown) {\n return error instanceof Error ? error.message : String(error);\n }\n\n private startWorkers() {\n for (let i = 0; i < this.concurrency; i++) {\n this.processJobs();\n }\n }\n\n private async processJobs() {\n while (this.running) {\n const queueKey = `queue:${this.options.name}:jobs`;\n\n const [popError, jobData] = await mightThrow(\n this.options.redis.rpop(queueKey),\n );\n\n if (popError) {\n await this.waitForPollInterval();\n continue;\n }\n\n if (!jobData) {\n await this.waitForPollInterval();\n continue;\n }\n\n const [parseError, job] = mightThrowSync<JobState<T>>(() =>\n JSON.parse(jobData),\n );\n\n if (parseError || !job) {\n // Handle malformed payload: preserve to dead-letter queue and notify\n await this.callOnErrorForParseFailure(jobData, parseError);\n await this.moveToDeadLetterQueue(jobData, parseError);\n\n await this.waitForPollInterval();\n continue;\n }\n\n // Skip processing if we've been stopped\n if (!this.running) {\n // Re-enqueue the job so it's not lost\n const [stringifyError, serialized] = this.serializeJob(job);\n\n if (!stringifyError && serialized) {\n await mightThrow(this.options.redis.lpush(queueKey, serialized));\n }\n\n break;\n }\n\n this.activeWorkers++;\n\n await mightThrow(this.handleJob(job));\n this.activeWorkers--;\n }\n }\n\n private async handleJob(job: JobState<T>) {\n const controller = new AbortController();\n\n const handlerPromise = Promise.resolve().then(() =>\n this.options.handler(job.data, controller.signal),\n );\n\n let timerId: NodeJS.Timeout | undefined;\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n timerId = setTimeout(() => {\n reject(new Error(`Job timeout after ${this.timeout}ms`));\n }, this.timeout);\n });\n\n const [handlerError] = await mightThrow(\n Promise.race([handlerPromise.then(() => undefined), timeoutPromise]),\n );\n\n if (timerId) {\n clearTimeout(timerId);\n }\n\n // Abort handler if timeout occurred\n if (handlerError && !controller.signal.aborted) {\n controller.abort();\n }\n\n if (!handlerError) {\n if (this.options.onSuccess) {\n await mightThrow(\n Promise.resolve(this.options.onSuccess(toMinimalJob(job))),\n );\n }\n\n return;\n }\n\n job.attempts++;\n\n const errorMsg = this.formatErrorMessage(handlerError);\n job.error = errorMsg;\n\n if (!job.errorHistory) {\n job.errorHistory = [];\n }\n job.errorHistory.push({\n attempt: job.attempts,\n error: errorMsg,\n timestamp: Date.now(),\n });\n\n // Check if we should retry. Attempt starts at 1, so we retry while attempts <= maxRetries\n if (job.attempts <= job.maxRetries) {\n if (this.options.onRetry) {\n const delay = Math.min(\n BASE_BACKOFF_DELAY * BACKOFF_MULTIPLIER ** (job.attempts - 1),\n MAX_BACKOFF_DELAY,\n );\n await mightThrow(\n Promise.resolve(\n this.options.onRetry({\n job: toMinimalJob(job),\n error: errorMsg,\n nextRetryDelayMs: delay,\n retriesRemaining: job.maxRetries - job.attempts,\n backoffMultiplier: BACKOFF_MULTIPLIER,\n }),\n ),\n );\n }\n await this.retryJob(job);\n } else {\n await this.callOnError(job);\n }\n }\n\n private async callOnError(job: JobState<T>) {\n if (!this.options.onError) {\n return;\n }\n\n await mightThrow(\n Promise.resolve(\n this.options.onError({\n job: toMinimalJob(job),\n lastError: job.error ?? \"\",\n totalDurationMs: Date.now() - job.createdAt,\n totalAttempts: job.attempts,\n errorHistory: job.errorHistory ?? [],\n }),\n ),\n );\n }\n\n private async callOnErrorForParseFailure(\n jobData: string,\n parseError: unknown,\n ) {\n if (!this.options.onParseError) {\n return;\n }\n\n await mightThrow(\n Promise.resolve(\n this.options.onParseError({\n rawJobData: jobData,\n parseError: this.formatErrorMessage(parseError),\n timestamp: Date.now(),\n }),\n ),\n );\n }\n\n private async retryJob(job: JobState<T>) {\n // Exponential backoff: 1st retry (attempts=1) -> 1000ms, 2nd (attempts=2) -> 2000ms, etc.\n const delay = Math.min(\n BASE_BACKOFF_DELAY * BACKOFF_MULTIPLIER ** (job.attempts - 1),\n MAX_BACKOFF_DELAY,\n );\n\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n const [stringifyError, serialized] = this.serializeJob(job);\n\n if (stringifyError || !serialized) {\n job.error = `Failed to serialize job for retry: ${this.formatErrorMessage(stringifyError)}`;\n await this.callOnError(job);\n return;\n }\n\n const queueKey = `queue:${this.options.name}:jobs`;\n const [pushError] = await mightThrow(\n this.options.redis.lpush(queueKey, serialized),\n );\n\n if (pushError) {\n job.error = `Failed to re-enqueue job for retry: ${this.formatErrorMessage(pushError)}`;\n await this.callOnError(job);\n }\n }\n}\n"],"mappings":";;AAGA,MAAM,gBAAmB,cAAmC;CAC1D,IAAI,SAAS;CACb,MAAM,SAAS;CACf,UAAU,SAAS;CACnB,YAAY,SAAS;CACrB,WAAW,SAAS;CACrB;AAED,MAAM,kBAAkB;AACxB,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAC5B,MAAM,wBAAwB;AAC9B,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;AAC3B,MAAM,yBAAyB;AAE/B,IAAa,QAAb,MAAsB;CACpB;CACA,UAAkB;CAClB,gBAAwB;CACxB;CACA;CACA;CACA;CAEA,YAAmB,SAA0B;AAC3C,OAAK,UAAU;AACf,OAAK,UAAU,QAAQ,WAAW;AAClC,OAAK,UAAU,QAAQ,WAAW;AAClC,OAAK,cAAc,QAAQ,eAAe;AAC1C,OAAK,eAAe,QAAQ,gBAAgB;AAC5C,OAAK,cAAc;;CAGrB,MAAa,QAAQ,MAAS;EAC5B,MAAM,MAAmB;GACvB,IAAI,OAAO,YAAY;GACvB;GACA,UAAU;GACV,YAAY,KAAK;GACjB,WAAW,KAAK,KAAK;GACtB;EAED,MAAM,CAAC,gBAAgB,cAAc,KAAK,aAAa,IAAI;AAC3D,MAAI,kBAAkB,CAAC,WACrB,QAAO,IAAI,cAAc,+BAA+B;EAG1D,MAAM,CAAC,gBAAgB,MAAM,KAAK,eAAe,WAAW;AAC5D,MAAI,aACF,QAAO,IAAI,cAAc,wBAAwB;AAGnD,SAAO,GAAG,IAAI,GAAG;;CAGnB,MAAa,OAAO;AAClB,OAAK,UAAU;AAGf,SAAO,KAAK,gBAAgB,EAC1B,OAAM,IAAI,SAAS,YACjB,WAAW,SAAS,uBAAuB,CAC5C;;CAIL,sBAA8B;AAC5B,SAAO,IAAI,SAAS,YAAY,WAAW,SAAS,KAAK,aAAa,CAAC;;CAGzE,aAAqB,KAAkB;AACrC,SAAO,qBAAqB,KAAK,UAAU,IAAI,CAAC;;CAGlD,MAAc,eAAe,YAAoB;EAC/C,MAAM,WAAW,SAAS,KAAK,QAAQ,KAAK;AAC5C,SAAO,WAAW,KAAK,QAAQ,MAAM,MAAM,UAAU,WAAW,CAAC;;CAGnE,MAAc,sBAAsB,SAAiB,YAAqB;EACxE,MAAM,gBAAgB,SAAS,KAAK,QAAQ,KAAK;EACjD,MAAM,kBAAkB,KAAK,UAAU;GACrC;GACA,YAAY,KAAK,mBAAmB,WAAW;GAC/C,WAAW,KAAK,KAAK;GACtB,CAAC;AAEF,SAAO,WAAW,KAAK,QAAQ,MAAM,MAAM,eAAe,gBAAgB,CAAC;;CAG7E,mBAA2B,OAAgB;AACzC,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;CAG/D,eAAuB;AACrB,OAAK,IAAI,IAAI,GAAG,IAAI,KAAK,aAAa,IACpC,MAAK,aAAa;;CAItB,MAAc,cAAc;AAC1B,SAAO,KAAK,SAAS;GACnB,MAAM,WAAW,SAAS,KAAK,QAAQ,KAAK;GAE5C,MAAM,CAAC,UAAU,WAAW,MAAM,WAChC,KAAK,QAAQ,MAAM,KAAK,SAAS,CAClC;AAED,OAAI,UAAU;AACZ,UAAM,KAAK,qBAAqB;AAChC;;AAGF,OAAI,CAAC,SAAS;AACZ,UAAM,KAAK,qBAAqB;AAChC;;GAGF,MAAM,CAAC,YAAY,OAAO,qBACxB,KAAK,MAAM,QAAQ,CACpB;AAED,OAAI,cAAc,CAAC,KAAK;AAEtB,UAAM,KAAK,2BAA2B,SAAS,WAAW;AAC1D,UAAM,KAAK,sBAAsB,SAAS,WAAW;AAErD,UAAM,KAAK,qBAAqB;AAChC;;AAIF,OAAI,CAAC,KAAK,SAAS;IAEjB,MAAM,CAAC,gBAAgB,cAAc,KAAK,aAAa,IAAI;AAE3D,QAAI,CAAC,kBAAkB,WACrB,OAAM,WAAW,KAAK,QAAQ,MAAM,MAAM,UAAU,WAAW,CAAC;AAGlE;;AAGF,QAAK;AAEL,SAAM,WAAW,KAAK,UAAU,IAAI,CAAC;AACrC,QAAK;;;CAIT,MAAc,UAAU,KAAkB;EACxC,MAAM,aAAa,IAAI,iBAAiB;EAExC,MAAM,iBAAiB,QAAQ,SAAS,CAAC,WACvC,KAAK,QAAQ,QAAQ,IAAI,MAAM,WAAW,OAAO,CAClD;EAED,IAAI;EAEJ,MAAM,iBAAiB,IAAI,SAAgB,GAAG,WAAW;AACvD,aAAU,iBAAiB;AACzB,2BAAO,IAAI,MAAM,qBAAqB,KAAK,QAAQ,IAAI,CAAC;MACvD,KAAK,QAAQ;IAChB;EAEF,MAAM,CAAC,gBAAgB,MAAM,WAC3B,QAAQ,KAAK,CAAC,eAAe,WAAW,KAAA,EAAU,EAAE,eAAe,CAAC,CACrE;AAED,MAAI,QACF,cAAa,QAAQ;AAIvB,MAAI,gBAAgB,CAAC,WAAW,OAAO,QACrC,YAAW,OAAO;AAGpB,MAAI,CAAC,cAAc;AACjB,OAAI,KAAK,QAAQ,UACf,OAAM,WACJ,QAAQ,QAAQ,KAAK,QAAQ,UAAU,aAAa,IAAI,CAAC,CAAC,CAC3D;AAGH;;AAGF,MAAI;EAEJ,MAAM,WAAW,KAAK,mBAAmB,aAAa;AACtD,MAAI,QAAQ;AAEZ,MAAI,CAAC,IAAI,aACP,KAAI,eAAe,EAAE;AAEvB,MAAI,aAAa,KAAK;GACpB,SAAS,IAAI;GACb,OAAO;GACP,WAAW,KAAK,KAAK;GACtB,CAAC;AAGF,MAAI,IAAI,YAAY,IAAI,YAAY;AAClC,OAAI,KAAK,QAAQ,SAAS;IACxB,MAAM,QAAQ,KAAK,IACjB,qBAAqB,uBAAuB,IAAI,WAAW,IAC3D,kBACD;AACD,UAAM,WACJ,QAAQ,QACN,KAAK,QAAQ,QAAQ;KACnB,KAAK,aAAa,IAAI;KACtB,OAAO;KACP,kBAAkB;KAClB,kBAAkB,IAAI,aAAa,IAAI;KACvC,mBAAmB;KACpB,CAAC,CACH,CACF;;AAEH,SAAM,KAAK,SAAS,IAAI;QAExB,OAAM,KAAK,YAAY,IAAI;;CAI/B,MAAc,YAAY,KAAkB;AAC1C,MAAI,CAAC,KAAK,QAAQ,QAChB;AAGF,QAAM,WACJ,QAAQ,QACN,KAAK,QAAQ,QAAQ;GACnB,KAAK,aAAa,IAAI;GACtB,WAAW,IAAI,SAAS;GACxB,iBAAiB,KAAK,KAAK,GAAG,IAAI;GAClC,eAAe,IAAI;GACnB,cAAc,IAAI,gBAAgB,EAAE;GACrC,CAAC,CACH,CACF;;CAGH,MAAc,2BACZ,SACA,YACA;AACA,MAAI,CAAC,KAAK,QAAQ,aAChB;AAGF,QAAM,WACJ,QAAQ,QACN,KAAK,QAAQ,aAAa;GACxB,YAAY;GACZ,YAAY,KAAK,mBAAmB,WAAW;GAC/C,WAAW,KAAK,KAAK;GACtB,CAAC,CACH,CACF;;CAGH,MAAc,SAAS,KAAkB;EAEvC,MAAM,QAAQ,KAAK,IACjB,qBAAqB,uBAAuB,IAAI,WAAW,IAC3D,kBACD;AAED,QAAM,IAAI,SAAS,YAAY,WAAW,SAAS,MAAM,CAAC;EAE1D,MAAM,CAAC,gBAAgB,cAAc,KAAK,aAAa,IAAI;AAE3D,MAAI,kBAAkB,CAAC,YAAY;AACjC,OAAI,QAAQ,sCAAsC,KAAK,mBAAmB,eAAe;AACzF,SAAM,KAAK,YAAY,IAAI;AAC3B;;EAGF,MAAM,WAAW,SAAS,KAAK,QAAQ,KAAK;EAC5C,MAAM,CAAC,aAAa,MAAM,WACxB,KAAK,QAAQ,MAAM,MAAM,UAAU,WAAW,CAC/C;AAED,MAAI,WAAW;AACb,OAAI,QAAQ,uCAAuC,KAAK,mBAAmB,UAAU;AACrF,SAAM,KAAK,YAAY,IAAI"}
@@ -1,80 +0,0 @@
1
- //#region node_modules/@standard-schema/spec/dist/index.d.ts
2
- /** The Standard Typed interface. This is a base type extended by other specs. */
3
- interface StandardTypedV1<Input = unknown, Output = Input> {
4
- /** The Standard properties. */
5
- readonly "~standard": StandardTypedV1.Props<Input, Output>;
6
- }
7
- declare namespace StandardTypedV1 {
8
- /** The Standard Typed properties interface. */
9
- interface Props<Input = unknown, Output = Input> {
10
- /** The version number of the standard. */
11
- readonly version: 1;
12
- /** The vendor name of the schema library. */
13
- readonly vendor: string;
14
- /** Inferred types associated with the schema. */
15
- readonly types?: Types<Input, Output> | undefined;
16
- }
17
- /** The Standard Typed types interface. */
18
- interface Types<Input = unknown, Output = Input> {
19
- /** The input type of the schema. */
20
- readonly input: Input;
21
- /** The output type of the schema. */
22
- readonly output: Output;
23
- }
24
- /** Infers the input type of a Standard Typed. */
25
- type InferInput<Schema extends StandardTypedV1> = NonNullable<Schema["~standard"]["types"]>["input"];
26
- /** Infers the output type of a Standard Typed. */
27
- type InferOutput<Schema extends StandardTypedV1> = NonNullable<Schema["~standard"]["types"]>["output"];
28
- }
29
- /** The Standard Schema interface. */
30
- interface StandardSchemaV1<Input = unknown, Output = Input> {
31
- /** The Standard Schema properties. */
32
- readonly "~standard": StandardSchemaV1.Props<Input, Output>;
33
- }
34
- declare namespace StandardSchemaV1 {
35
- /** The Standard Schema properties interface. */
36
- interface Props<Input = unknown, Output = Input> extends StandardTypedV1.Props<Input, Output> {
37
- /** Validates unknown input values. */
38
- readonly validate: (value: unknown, options?: StandardSchemaV1.Options | undefined) => Result<Output> | Promise<Result<Output>>;
39
- }
40
- /** The result interface of the validate function. */
41
- type Result<Output> = SuccessResult<Output> | FailureResult;
42
- /** The result interface if validation succeeds. */
43
- interface SuccessResult<Output> {
44
- /** The typed output value. */
45
- readonly value: Output;
46
- /** A falsy value for `issues` indicates success. */
47
- readonly issues?: undefined;
48
- }
49
- interface Options {
50
- /** Explicit support for additional vendor-specific parameters, if needed. */
51
- readonly libraryOptions?: Record<string, unknown> | undefined;
52
- }
53
- /** The result interface if validation fails. */
54
- interface FailureResult {
55
- /** The issues of failed validation. */
56
- readonly issues: ReadonlyArray<Issue>;
57
- }
58
- /** The issue interface of the failure output. */
59
- interface Issue {
60
- /** The error message of the issue. */
61
- readonly message: string;
62
- /** The path of the issue, if any. */
63
- readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
64
- }
65
- /** The path segment interface of the issue. */
66
- interface PathSegment {
67
- /** The key representing a path segment. */
68
- readonly key: PropertyKey;
69
- }
70
- /** The Standard types interface. */
71
- interface Types<Input = unknown, Output = Input> extends StandardTypedV1.Types<Input, Output> {}
72
- /** Infers the input type of a Standard. */
73
- type InferInput<Schema extends StandardTypedV1> = StandardTypedV1.InferInput<Schema>;
74
- /** Infers the output type of a Standard. */
75
- type InferOutput<Schema extends StandardTypedV1> = StandardTypedV1.InferOutput<Schema>;
76
- }
77
- /** The Standard JSON Schema interface. */
78
- //#endregion
79
- export { StandardSchemaV1 };
80
- //# sourceMappingURL=index.d.cts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":["StandardTypedV1","Input","Output","Props","Schema","Types","NonNullable","version","vendor","types","input","output","InferInput","InferOutput","StandardSchemaV1","Options","Result","Promise","SuccessResult","FailureResult","Record","Issue","ReadonlyArray","PropertyKey","PathSegment","validate","value","options","issues","libraryOptions","message","path","key","StandardJSONSchemaV1","Converter","Target","jsonSchema","target"],"sources":["../../../../../node_modules/@standard-schema/spec/dist/index.d.ts"],"x_google_ignoreList":[0],"mappings":";;UACUA,eAAAA,2BAA0CC,KAAAA;EAA3B;EAAA,SAEZ,WAAA,EAAaD,eAAAA,CAAgBG,KAAAA,CAAMF,KAAAA,EAAOC,MAAAA;AAAAA;AAAAA,kBAErCF,eAAAA;EAFqCE;EAAAA,UAIzCC,KAAAA,2BAAgCF,KAAAA;IAJC;IAAA,SAM9BM,OAAAA;IARSN;IAAAA,SAUTO,MAAAA;IAVmCP;IAAAA,SAYnCQ,KAAAA,GAAQJ,KAAAA,CAAMJ,KAAAA,EAAOC,MAAAA;EAAAA;EAVIC;EAAAA,UAa5BE,KAAAA,2BAAgCJ,KAAAA;IAbSC;IAAAA,SAetCQ,KAAAA,EAAOT,KAAAA;IAfqC;IAAA,SAiB5CU,MAAAA,EAAQT,MAAAA;EAAAA;EAfQD;EAAAA,KAkBxBW,UAAAA,gBAA0BZ,eAAAA,IAAmBM,WAAAA,CAAYF,MAAAA;EAVnCH;EAAAA,KAYtBY,WAAAA,gBAA2Bb,eAAAA,IAAmBM,WAAAA,CAAYF,MAAAA;AAAAA;;UAGzDU,gBAAAA,2BAA2Cb,KAAAA;EAR5BC;EAAAA,SAUZ,WAAA,EAAaY,gBAAAA,CAAiBX,KAAAA,CAAMF,KAAAA,EAAOC,MAAAA;AAAAA;AAAAA,kBAEtCY,gBAAAA;EAPkBd;EAAAA,UAStBG,KAAAA,2BAAgCF,KAAAA,UAAeD,eAAAA,CAAgBG,KAAAA,CAAMF,KAAAA,EAAOC,MAAAA;IATnCI;IAAAA,SAWtCmB,QAAAA,GAAWC,KAAAA,WAAgBC,OAAAA,GAAUb,gBAAAA,CAAiBC,OAAAA,iBAAwBC,MAAAA,CAAOd,MAAAA,IAAUe,OAAAA,CAAQD,MAAAA,CAAOd,MAAAA;EAAAA;EA7BjHC;EAAAA,KAgCLa,MAAAA,WAAiBE,aAAAA,CAAchB,MAAAA,IAAUiB,aAAAA;EAhCbjB;EAAAA,UAkCvBgB,aAAAA;IAhCGX;IAAAA,SAkCAmB,KAAAA,EAAOxB,MAAAA;IA9BPO;IAAAA,SAgCAmB,MAAAA;EAAAA;EAAAA,UAEHb,OAAAA;IA/BAV;IAAAA,SAiCGwB,cAAAA,GAAiBT,MAAAA;EAAAA;EAjCYnB;EAAAA,UAoChCkB,aAAAA;IAlCUlB;IAAAA,SAoCP2B,MAAAA,EAAQN,aAAAA,CAAcD,KAAAA;EAAAA;EA/B9BT;EAAAA,UAkCKS,KAAAA;IAlCqBrB;IAAAA,SAoClB8B,OAAAA;IApCiD1B;IAAAA,SAsCjD2B,IAAAA,GAAOT,aAAAA,CAAcC,WAAAA,GAAcC,WAAAA;EAAAA;EApChBxB;EAAAA,UAuCtBwB,WAAAA;IAvCqDpB;IAAAA,SAyClD4B,GAAAA,EAAKT,WAAAA;EAAAA;EAtCZT;EAAAA,UAyCIT,KAAAA,2BAAgCJ,KAAAA,UAAeD,eAAAA,CAAgBK,KAAAA,CAAMJ,KAAAA,EAAOC,MAAAA;EAzCrCD;EAAAA,KA4C5CW,UAAAA,gBAA0BZ,eAAAA,IAAmBA,eAAAA,CAAgBY,UAAAA,CAAWR,MAAAA;EA1CzBF;EAAAA,KA4C/CW,WAAAA,gBAA2Bb,eAAAA,IAAmBA,eAAAA,CAAgBa,WAAAA,CAAYT,MAAAA;AAAAA"}
@@ -1,80 +0,0 @@
1
- //#region node_modules/@standard-schema/spec/dist/index.d.ts
2
- /** The Standard Typed interface. This is a base type extended by other specs. */
3
- interface StandardTypedV1<Input = unknown, Output = Input> {
4
- /** The Standard properties. */
5
- readonly "~standard": StandardTypedV1.Props<Input, Output>;
6
- }
7
- declare namespace StandardTypedV1 {
8
- /** The Standard Typed properties interface. */
9
- interface Props<Input = unknown, Output = Input> {
10
- /** The version number of the standard. */
11
- readonly version: 1;
12
- /** The vendor name of the schema library. */
13
- readonly vendor: string;
14
- /** Inferred types associated with the schema. */
15
- readonly types?: Types<Input, Output> | undefined;
16
- }
17
- /** The Standard Typed types interface. */
18
- interface Types<Input = unknown, Output = Input> {
19
- /** The input type of the schema. */
20
- readonly input: Input;
21
- /** The output type of the schema. */
22
- readonly output: Output;
23
- }
24
- /** Infers the input type of a Standard Typed. */
25
- type InferInput<Schema extends StandardTypedV1> = NonNullable<Schema["~standard"]["types"]>["input"];
26
- /** Infers the output type of a Standard Typed. */
27
- type InferOutput<Schema extends StandardTypedV1> = NonNullable<Schema["~standard"]["types"]>["output"];
28
- }
29
- /** The Standard Schema interface. */
30
- interface StandardSchemaV1<Input = unknown, Output = Input> {
31
- /** The Standard Schema properties. */
32
- readonly "~standard": StandardSchemaV1.Props<Input, Output>;
33
- }
34
- declare namespace StandardSchemaV1 {
35
- /** The Standard Schema properties interface. */
36
- interface Props<Input = unknown, Output = Input> extends StandardTypedV1.Props<Input, Output> {
37
- /** Validates unknown input values. */
38
- readonly validate: (value: unknown, options?: StandardSchemaV1.Options | undefined) => Result<Output> | Promise<Result<Output>>;
39
- }
40
- /** The result interface of the validate function. */
41
- type Result<Output> = SuccessResult<Output> | FailureResult;
42
- /** The result interface if validation succeeds. */
43
- interface SuccessResult<Output> {
44
- /** The typed output value. */
45
- readonly value: Output;
46
- /** A falsy value for `issues` indicates success. */
47
- readonly issues?: undefined;
48
- }
49
- interface Options {
50
- /** Explicit support for additional vendor-specific parameters, if needed. */
51
- readonly libraryOptions?: Record<string, unknown> | undefined;
52
- }
53
- /** The result interface if validation fails. */
54
- interface FailureResult {
55
- /** The issues of failed validation. */
56
- readonly issues: ReadonlyArray<Issue>;
57
- }
58
- /** The issue interface of the failure output. */
59
- interface Issue {
60
- /** The error message of the issue. */
61
- readonly message: string;
62
- /** The path of the issue, if any. */
63
- readonly path?: ReadonlyArray<PropertyKey | PathSegment> | undefined;
64
- }
65
- /** The path segment interface of the issue. */
66
- interface PathSegment {
67
- /** The key representing a path segment. */
68
- readonly key: PropertyKey;
69
- }
70
- /** The Standard types interface. */
71
- interface Types<Input = unknown, Output = Input> extends StandardTypedV1.Types<Input, Output> {}
72
- /** Infers the input type of a Standard. */
73
- type InferInput<Schema extends StandardTypedV1> = StandardTypedV1.InferInput<Schema>;
74
- /** Infers the output type of a Standard. */
75
- type InferOutput<Schema extends StandardTypedV1> = StandardTypedV1.InferOutput<Schema>;
76
- }
77
- /** The Standard JSON Schema interface. */
78
- //#endregion
79
- export { StandardSchemaV1 };
80
- //# sourceMappingURL=index.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":["StandardTypedV1","Input","Output","Props","Schema","Types","NonNullable","version","vendor","types","input","output","InferInput","InferOutput","StandardSchemaV1","Options","Result","Promise","SuccessResult","FailureResult","Record","Issue","ReadonlyArray","PropertyKey","PathSegment","validate","value","options","issues","libraryOptions","message","path","key","StandardJSONSchemaV1","Converter","Target","jsonSchema","target"],"sources":["../../../../../node_modules/@standard-schema/spec/dist/index.d.ts"],"x_google_ignoreList":[0],"mappings":";;UACUA,eAAAA,2BAA0CC,KAAAA;EAA3B;EAAA,SAEZ,WAAA,EAAaD,eAAAA,CAAgBG,KAAAA,CAAMF,KAAAA,EAAOC,MAAAA;AAAAA;AAAAA,kBAErCF,eAAAA;EAFqCE;EAAAA,UAIzCC,KAAAA,2BAAgCF,KAAAA;IAJC;IAAA,SAM9BM,OAAAA;IARSN;IAAAA,SAUTO,MAAAA;IAVmCP;IAAAA,SAYnCQ,KAAAA,GAAQJ,KAAAA,CAAMJ,KAAAA,EAAOC,MAAAA;EAAAA;EAVIC;EAAAA,UAa5BE,KAAAA,2BAAgCJ,KAAAA;IAbSC;IAAAA,SAetCQ,KAAAA,EAAOT,KAAAA;IAfqC;IAAA,SAiB5CU,MAAAA,EAAQT,MAAAA;EAAAA;EAfQD;EAAAA,KAkBxBW,UAAAA,gBAA0BZ,eAAAA,IAAmBM,WAAAA,CAAYF,MAAAA;EAVnCH;EAAAA,KAYtBY,WAAAA,gBAA2Bb,eAAAA,IAAmBM,WAAAA,CAAYF,MAAAA;AAAAA;;UAGzDU,gBAAAA,2BAA2Cb,KAAAA;EAR5BC;EAAAA,SAUZ,WAAA,EAAaY,gBAAAA,CAAiBX,KAAAA,CAAMF,KAAAA,EAAOC,MAAAA;AAAAA;AAAAA,kBAEtCY,gBAAAA;EAPkBd;EAAAA,UAStBG,KAAAA,2BAAgCF,KAAAA,UAAeD,eAAAA,CAAgBG,KAAAA,CAAMF,KAAAA,EAAOC,MAAAA;IATnCI;IAAAA,SAWtCmB,QAAAA,GAAWC,KAAAA,WAAgBC,OAAAA,GAAUb,gBAAAA,CAAiBC,OAAAA,iBAAwBC,MAAAA,CAAOd,MAAAA,IAAUe,OAAAA,CAAQD,MAAAA,CAAOd,MAAAA;EAAAA;EA7BjHC;EAAAA,KAgCLa,MAAAA,WAAiBE,aAAAA,CAAchB,MAAAA,IAAUiB,aAAAA;EAhCbjB;EAAAA,UAkCvBgB,aAAAA;IAhCGX;IAAAA,SAkCAmB,KAAAA,EAAOxB,MAAAA;IA9BPO;IAAAA,SAgCAmB,MAAAA;EAAAA;EAAAA,UAEHb,OAAAA;IA/BAV;IAAAA,SAiCGwB,cAAAA,GAAiBT,MAAAA;EAAAA;EAjCYnB;EAAAA,UAoChCkB,aAAAA;IAlCUlB;IAAAA,SAoCP2B,MAAAA,EAAQN,aAAAA,CAAcD,KAAAA;EAAAA;EA/B9BT;EAAAA,UAkCKS,KAAAA;IAlCqBrB;IAAAA,SAoClB8B,OAAAA;IApCiD1B;IAAAA,SAsCjD2B,IAAAA,GAAOT,aAAAA,CAAcC,WAAAA,GAAcC,WAAAA;EAAAA;EApChBxB;EAAAA,UAuCtBwB,WAAAA;IAvCqDpB;IAAAA,SAyClD4B,GAAAA,EAAKT,WAAAA;EAAAA;EAtCZT;EAAAA,UAyCIT,KAAAA,2BAAgCJ,KAAAA,UAAeD,eAAAA,CAAgBK,KAAAA,CAAMJ,KAAAA,EAAOC,MAAAA;EAzCrCD;EAAAA,KA4C5CW,UAAAA,gBAA0BZ,eAAAA,IAAmBA,eAAAA,CAAgBY,UAAAA,CAAWR,MAAAA;EA1CzBF;EAAAA,KA4C/CW,WAAAA,gBAA2Bb,eAAAA,IAAmBA,eAAAA,CAAgBa,WAAAA,CAAYT,MAAAA;AAAAA"}