@intlayer/backend-contract 0.0.0-stage → 9.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +330 -2
  2. package/dist/cjs/ai.cjs +267 -0
  3. package/dist/cjs/ai.cjs.map +1 -0
  4. package/dist/cjs/analytics.cjs +175 -0
  5. package/dist/cjs/analytics.cjs.map +1 -0
  6. package/dist/cjs/asset.cjs +88 -0
  7. package/dist/cjs/asset.cjs.map +1 -0
  8. package/dist/cjs/blogComment.cjs +98 -0
  9. package/dist/cjs/blogComment.cjs.map +1 -0
  10. package/dist/cjs/cliSessionToken.cjs +40 -0
  11. package/dist/cjs/cliSessionToken.cjs.map +1 -0
  12. package/dist/cjs/common.cjs +42 -0
  13. package/dist/cjs/common.cjs.map +1 -0
  14. package/dist/cjs/defineRoute.cjs +26 -0
  15. package/dist/cjs/defineRoute.cjs.map +1 -0
  16. package/dist/cjs/demo.cjs +22 -0
  17. package/dist/cjs/demo.cjs.map +1 -0
  18. package/dist/cjs/dictionary.cjs +168 -0
  19. package/dist/cjs/dictionary.cjs.map +1 -0
  20. package/dist/cjs/environment.cjs +91 -0
  21. package/dist/cjs/environment.cjs.map +1 -0
  22. package/dist/cjs/eventListener.cjs +19 -0
  23. package/dist/cjs/eventListener.cjs.map +1 -0
  24. package/dist/cjs/gitProviders.cjs +361 -0
  25. package/dist/cjs/gitProviders.cjs.map +1 -0
  26. package/dist/cjs/newsletter.cjs +50 -0
  27. package/dist/cjs/newsletter.cjs.map +1 -0
  28. package/dist/cjs/oAuth2.cjs +62 -0
  29. package/dist/cjs/oAuth2.cjs.map +1 -0
  30. package/dist/cjs/organization.cjs +226 -0
  31. package/dist/cjs/organization.cjs.map +1 -0
  32. package/dist/cjs/project.cjs +401 -0
  33. package/dist/cjs/project.cjs.map +1 -0
  34. package/dist/cjs/public.cjs +60 -0
  35. package/dist/cjs/public.cjs.map +1 -0
  36. package/dist/cjs/responseData.cjs +33 -0
  37. package/dist/cjs/responseData.cjs.map +1 -0
  38. package/dist/cjs/reviewer.cjs +401 -0
  39. package/dist/cjs/reviewer.cjs.map +1 -0
  40. package/dist/cjs/scan.cjs +235 -0
  41. package/dist/cjs/scan.cjs.map +1 -0
  42. package/dist/cjs/search.cjs +40 -0
  43. package/dist/cjs/search.cjs.map +1 -0
  44. package/dist/cjs/session.cjs +56 -0
  45. package/dist/cjs/session.cjs.map +1 -0
  46. package/dist/cjs/showcaseProject.cjs +185 -0
  47. package/dist/cjs/showcaseProject.cjs.map +1 -0
  48. package/dist/cjs/stripe.cjs +388 -0
  49. package/dist/cjs/stripe.cjs.map +1 -0
  50. package/dist/cjs/tag.cjs +83 -0
  51. package/dist/cjs/tag.cjs.map +1 -0
  52. package/dist/cjs/translation.cjs +54 -0
  53. package/dist/cjs/translation.cjs.map +1 -0
  54. package/dist/cjs/user.cjs +153 -0
  55. package/dist/cjs/user.cjs.map +1 -0
  56. package/dist/esm/ai.mjs +261 -0
  57. package/dist/esm/ai.mjs.map +1 -0
  58. package/dist/esm/analytics.mjs +168 -0
  59. package/dist/esm/analytics.mjs.map +1 -0
  60. package/dist/esm/asset.mjs +86 -0
  61. package/dist/esm/asset.mjs.map +1 -0
  62. package/dist/esm/blogComment.mjs +94 -0
  63. package/dist/esm/blogComment.mjs.map +1 -0
  64. package/dist/esm/cliSessionToken.mjs +39 -0
  65. package/dist/esm/cliSessionToken.mjs.map +1 -0
  66. package/dist/esm/common.mjs +35 -0
  67. package/dist/esm/common.mjs.map +1 -0
  68. package/dist/esm/defineRoute.mjs +23 -0
  69. package/dist/esm/defineRoute.mjs.map +1 -0
  70. package/dist/esm/demo.mjs +21 -0
  71. package/dist/esm/demo.mjs.map +1 -0
  72. package/dist/esm/dictionary.mjs +163 -0
  73. package/dist/esm/dictionary.mjs.map +1 -0
  74. package/dist/esm/environment.mjs +90 -0
  75. package/dist/esm/environment.mjs.map +1 -0
  76. package/dist/esm/eventListener.mjs +18 -0
  77. package/dist/esm/eventListener.mjs.map +1 -0
  78. package/dist/esm/gitProviders.mjs +352 -0
  79. package/dist/esm/gitProviders.mjs.map +1 -0
  80. package/dist/esm/newsletter.mjs +49 -0
  81. package/dist/esm/newsletter.mjs.map +1 -0
  82. package/dist/esm/oAuth2.mjs +60 -0
  83. package/dist/esm/oAuth2.mjs.map +1 -0
  84. package/dist/esm/organization.mjs +219 -0
  85. package/dist/esm/organization.mjs.map +1 -0
  86. package/dist/esm/project.mjs +387 -0
  87. package/dist/esm/project.mjs.map +1 -0
  88. package/dist/esm/public.mjs +58 -0
  89. package/dist/esm/public.mjs.map +1 -0
  90. package/dist/esm/responseData.mjs +30 -0
  91. package/dist/esm/responseData.mjs.map +1 -0
  92. package/dist/esm/reviewer.mjs +390 -0
  93. package/dist/esm/reviewer.mjs.map +1 -0
  94. package/dist/esm/scan.mjs +225 -0
  95. package/dist/esm/scan.mjs.map +1 -0
  96. package/dist/esm/search.mjs +38 -0
  97. package/dist/esm/search.mjs.map +1 -0
  98. package/dist/esm/session.mjs +53 -0
  99. package/dist/esm/session.mjs.map +1 -0
  100. package/dist/esm/showcaseProject.mjs +182 -0
  101. package/dist/esm/showcaseProject.mjs.map +1 -0
  102. package/dist/esm/stripe.mjs +379 -0
  103. package/dist/esm/stripe.mjs.map +1 -0
  104. package/dist/esm/tag.mjs +81 -0
  105. package/dist/esm/tag.mjs.map +1 -0
  106. package/dist/esm/translation.mjs +53 -0
  107. package/dist/esm/translation.mjs.map +1 -0
  108. package/dist/esm/user.mjs +149 -0
  109. package/dist/esm/user.mjs.map +1 -0
  110. package/dist/types/ai.d.ts +549 -0
  111. package/dist/types/ai.d.ts.map +1 -0
  112. package/dist/types/analytics.d.ts +378 -0
  113. package/dist/types/analytics.d.ts.map +1 -0
  114. package/dist/types/asset.d.ts +207 -0
  115. package/dist/types/asset.d.ts.map +1 -0
  116. package/dist/types/blogComment.d.ts +241 -0
  117. package/dist/types/blogComment.d.ts.map +1 -0
  118. package/dist/types/cliSessionToken.d.ts +263 -0
  119. package/dist/types/cliSessionToken.d.ts.map +1 -0
  120. package/dist/types/common.d.ts +32 -0
  121. package/dist/types/common.d.ts.map +1 -0
  122. package/dist/types/defineRoute.d.ts +57 -0
  123. package/dist/types/defineRoute.d.ts.map +1 -0
  124. package/dist/types/demo.d.ts +21 -0
  125. package/dist/types/demo.d.ts.map +1 -0
  126. package/dist/types/dictionary.d.ts +360 -0
  127. package/dist/types/dictionary.d.ts.map +1 -0
  128. package/dist/types/environment.d.ts +284 -0
  129. package/dist/types/environment.d.ts.map +1 -0
  130. package/dist/types/eventListener.d.ts +17 -0
  131. package/dist/types/eventListener.d.ts.map +1 -0
  132. package/dist/types/gitProviders.d.ts +807 -0
  133. package/dist/types/gitProviders.d.ts.map +1 -0
  134. package/dist/types/newsletter.d.ts +165 -0
  135. package/dist/types/newsletter.d.ts.map +1 -0
  136. package/dist/types/oAuth2.d.ts +481 -0
  137. package/dist/types/oAuth2.d.ts.map +1 -0
  138. package/dist/types/organization.d.ts +1069 -0
  139. package/dist/types/organization.d.ts.map +1 -0
  140. package/dist/types/project.d.ts +1735 -0
  141. package/dist/types/project.d.ts.map +1 -0
  142. package/dist/types/public.d.ts +109 -0
  143. package/dist/types/public.d.ts.map +1 -0
  144. package/dist/types/responseData.d.ts +68 -0
  145. package/dist/types/responseData.d.ts.map +1 -0
  146. package/dist/types/reviewer.d.ts +1239 -0
  147. package/dist/types/reviewer.d.ts.map +1 -0
  148. package/dist/types/scan.d.ts +625 -0
  149. package/dist/types/scan.d.ts.map +1 -0
  150. package/dist/types/search.d.ts +55 -0
  151. package/dist/types/search.d.ts.map +1 -0
  152. package/dist/types/session.d.ts +286 -0
  153. package/dist/types/session.d.ts.map +1 -0
  154. package/dist/types/showcaseProject.d.ts +550 -0
  155. package/dist/types/showcaseProject.d.ts.map +1 -0
  156. package/dist/types/stripe.d.ts +1219 -0
  157. package/dist/types/stripe.d.ts.map +1 -0
  158. package/dist/types/tag.d.ts +193 -0
  159. package/dist/types/tag.d.ts.map +1 -0
  160. package/dist/types/translation.d.ts +162 -0
  161. package/dist/types/translation.d.ts.map +1 -0
  162. package/dist/types/user.d.ts +447 -0
  163. package/dist/types/user.d.ts.map +1 -0
  164. package/package.json +300 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.cjs","names":["typedValueSchema","isJSONObject","z","typedStringSchema","dateTimeSchema","defineRouteGroup","defineRoute","responseDataSchema","tagSchema","paginationQueryShape","repeatableQueryValueSchema","paginatedResponseSchema"],"sources":["../../src/ai.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types/allLocales';\nimport type { AiProviders } from '@intlayer/types/config';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport { z } from 'zod/mini';\nimport {\n dateTimeSchema,\n isJSONObject,\n paginationQueryShape,\n repeatableQueryValueSchema,\n typedStringSchema,\n typedValueSchema,\n} from './common';\nimport {\n defineRoute,\n defineRouteGroup,\n type RouteBodyInput,\n type RouteQuerystring,\n} from './defineRoute';\nimport {\n type PaginatedResponse,\n paginatedResponseSchema,\n type ResponseData,\n responseDataSchema,\n} from './responseData';\nimport { tagSchema } from './tag';\n\n/**\n * AI settings sent by a client. Provider-specific options (from the AI SDKs)\n * pass through untouched, so the value is only checked to be an object;\n * `@intlayer/ai`'s `AIOptions` is asserted assignable in the backend.\n */\nexport type AIOptions = {\n provider?: `${AiProviders}`;\n model?: string;\n temperature?: number;\n baseURL?: string;\n /** Own provider key; omitted to use the project or Intlayer key. */\n apiKey?: string;\n applicationContext?: string;\n dataSerialization?: 'json' | 'toon';\n};\n\nexport const aiOptionsSchema = typedValueSchema<AIOptions>(isJSONObject);\n\n/** Chat message exchanged with the assistants. */\nexport const chatCompletionRequestMessageSchema = z.object({\n role: z.enum(['system', 'user', 'assistant']),\n content: z.string(),\n /** ISO date-time, parsed to a `Date`. */\n timestamp: z.optional(\n z.pipe(\n z.string(),\n z.transform((value) => new Date(value))\n )\n ),\n});\n\nconst localeSchema = typedStringSchema<Locale>();\nconst tokenUsedShape = { tokenUsed: z.number() };\n\n/** Text result of an AI step (translation, audit, query). */\nconst fileContentResultSchema = z.object({\n fileContent: z.string(),\n ...tokenUsedShape,\n});\n\n/** Tag fields rewritten by the tag audit (parsed from the model's JSON). */\nconst tagAuditResultSchema = z.object({\n fileContent: z.looseObject({\n key: z.optional(z.string()),\n name: z.optional(z.string()),\n description: z.optional(z.string()),\n instructions: z.optional(z.string()),\n }),\n ...tokenUsedShape,\n});\n\nconst metadataResultSchema = z.object({\n fileContent: z.object({\n title: z.string(),\n description: z.string(),\n tags: z.array(z.string()),\n }),\n ...tokenUsedShape,\n});\n\n/** JSON document translated by the AI. */\nconst jsonContentSchema = typedValueSchema<Record<string, unknown>>();\n\nconst tokenUsageSchema = z.object({\n inputTokens: z.number(),\n outputTokens: z.number(),\n totalTokens: z.number(),\n});\n\n/** Message stored in a discussion. */\nexport const discussionMessageSchema = z.object({\n role: z.enum(['user', 'assistant', 'system']),\n content: z.string(),\n relatedFiles: z.optional(z.array(z.string())),\n timestamp: dateTimeSchema,\n});\n\n/** Saved AI discussion (doc assistant or dashboard chat). */\nexport const discussionSchema = z.looseObject({\n id: z.string(),\n /** Generated by the client before the discussion is saved. */\n discussionId: z.string(),\n messages: z.optional(z.array(discussionMessageSchema)),\n numberOfMessages: z.number(),\n userId: z.optional(z.string()),\n projectId: z.optional(z.string()),\n organizationId: z.optional(z.string()),\n title: z.optional(z.string()),\n type: z.optional(z.enum(['doc', 'dashboard'])),\n isArchived: z.boolean(),\n aiModel: z.optional(z.string()),\n tokenUsage: z.optional(tokenUsageSchema),\n createdAt: dateTimeSchema,\n updatedAt: dateTimeSchema,\n});\n\n/** Token usage of the project's dashboard discussions, per model. */\nexport const aiStatsSchema = z.object({\n projectId: z.string(),\n generatedAt: z.number(),\n totalDiscussions: z.number(),\n totalInputTokens: z.number(),\n totalOutputTokens: z.number(),\n totalTokens: z.number(),\n modelUsage: z.array(\n z.object({\n aiModel: z.string(),\n discussionCount: z.number(),\n totalInputTokens: z.number(),\n totalOutputTokens: z.number(),\n totalTokens: z.number(),\n })\n ),\n});\n\nconst aiOptionsShape = { aiOptions: z.optional(aiOptionsSchema) };\nconst tagsKeysShape = { tagsKeys: z.optional(z.array(z.string())) };\nconst conversationSchema = z.object({\n messages: z.array(chatCompletionRequestMessageSchema),\n discussionId: z.string(),\n});\n\n/** REST contract of the `/api/ai` routes. */\nexport const aiContract = defineRouteGroup({\n prefix: '/api/ai',\n tag: 'AI',\n routes: {\n customQuery: defineRoute({\n method: 'POST',\n path: '/',\n summary: 'Run a custom prompt',\n schemas: {\n body: z.looseObject({\n ...aiOptionsShape,\n ...tagsKeysShape,\n /** AI SDK model messages. */\n messages: typedValueSchema<unknown[]>(Array.isArray),\n system: z.optional(z.unknown()),\n applicationContext: z.optional(z.string()),\n }),\n response: { 200: responseDataSchema(fileContentResultSchema) },\n },\n }),\n translateJSON: defineRoute({\n method: 'POST',\n path: '/translate/json',\n summary: 'Translate a JSON document into a locale',\n schemas: {\n body: z.object({\n ...aiOptionsShape,\n ...tagsKeysShape,\n entryFileContent: jsonContentSchema,\n presetOutputContent: jsonContentSchema,\n dictionaryDescription: z.optional(z.string()),\n entryLocale: localeSchema,\n outputLocale: localeSchema,\n mode: z.enum(['complete', 'review']),\n applicationContext: z.optional(z.string()),\n }),\n response: {\n 200: responseDataSchema(\n z.object({ fileContent: jsonContentSchema, ...tokenUsedShape })\n ),\n },\n },\n }),\n auditContentDeclaration: defineRoute({\n method: 'POST',\n path: '/audit/dictionary',\n summary: 'Audit and complete a content declaration file',\n schemas: {\n body: z.object({\n ...aiOptionsShape,\n ...tagsKeysShape,\n locales: z.array(localeSchema),\n defaultLocale: localeSchema,\n fileContent: z.string(),\n filePath: z.optional(z.string()),\n }),\n response: { 200: responseDataSchema(metadataResultSchema) },\n },\n }),\n auditContentDeclarationField: defineRoute({\n method: 'POST',\n path: '/audit/dictionary/field',\n summary: 'Audit a single field of a content declaration',\n schemas: {\n body: z.object({\n ...aiOptionsShape,\n ...tagsKeysShape,\n locales: z.array(localeSchema),\n fileContent: z.string(),\n filePath: z.optional(z.string()),\n keyPath: z.array(typedValueSchema<KeyPath>()),\n }),\n response: { 200: responseDataSchema(fileContentResultSchema) },\n },\n }),\n auditContentDeclarationMetadata: defineRoute({\n method: 'POST',\n path: '/audit/dictionary/metadata',\n summary: 'Suggest title, description and tags of a dictionary',\n schemas: {\n body: z.object({ ...aiOptionsShape, fileContent: z.string() }),\n response: { 200: responseDataSchema(metadataResultSchema) },\n },\n }),\n auditTag: defineRoute({\n method: 'POST',\n path: '/audit/tag',\n summary: 'Improve the instructions of a tag',\n schemas: {\n body: z.object({ ...aiOptionsShape, tag: tagSchema }),\n response: { 200: responseDataSchema(tagAuditResultSchema) },\n },\n }),\n ask: defineRoute({\n method: 'POST',\n path: '/ask',\n summary: 'Ask the documentation assistant (server-sent events stream)',\n schemas: { body: conversationSchema },\n }),\n chat: defineRoute({\n method: 'POST',\n path: '/chat',\n summary: 'Chat with the dashboard assistant (server-sent events stream)',\n schemas: { body: conversationSchema },\n }),\n autocomplete: defineRoute({\n method: 'POST',\n path: '/autocomplete',\n summary: 'Autocomplete a text being written',\n schemas: {\n body: z.object({\n ...aiOptionsShape,\n text: z.string(),\n contextBefore: z.optional(z.string()),\n currentLine: z.optional(z.string()),\n contextAfter: z.optional(z.string()),\n }),\n response: {\n 200: responseDataSchema(z.object({ autocompletion: z.string() })),\n },\n },\n }),\n getDiscussions: defineRoute({\n method: 'GET',\n path: '/discussions',\n summary: 'List AI discussions (own ones, all for admins)',\n schemas: {\n querystring: z.looseObject({\n ...paginationQueryShape,\n includeMessages: z.optional(z.enum(['true', 'false'])),\n ids: z.optional(repeatableQueryValueSchema),\n userId: z.optional(z.string()),\n userIds: z.optional(repeatableQueryValueSchema),\n discussionId: z.optional(z.string()),\n search: z.optional(z.string()),\n isArchived: z.optional(z.enum(['true', 'false'])),\n sortBy: z.optional(z.string()),\n sortOrder: z.optional(z.string()),\n fetchAll: z.optional(z.enum(['true', 'false'])),\n }),\n response: { 200: paginatedResponseSchema(discussionSchema) },\n },\n }),\n getAIStats: defineRoute({\n method: 'GET',\n path: '/stats',\n summary: 'AI token usage of the selected project',\n schemas: {\n response: { 200: responseDataSchema(aiStatsSchema) },\n },\n }),\n },\n});\n\n/** Route definitions of the `/api/ai` group, by name. */\nexport type AIRoutes = (typeof aiContract)['routes'];\n\n/**\n * Chat message as built by clients: `timestamp` may be a `Date` (serialized\n * to an ISO string on the wire) or already a string.\n */\nexport type ChatCompletionRequestMessage = Omit<\n z.output<typeof chatCompletionRequestMessageSchema>,\n 'timestamp'\n> & { timestamp?: Date | string };\nexport type DiscussionAPI = z.output<typeof discussionSchema>;\nexport type AIStats = z.output<typeof aiStatsSchema>;\n\nexport type CustomQueryBody = RouteBodyInput<AIRoutes['customQuery']>;\nexport type CustomQueryResult = ResponseData<\n z.output<typeof fileContentResultSchema>\n>;\nexport type TranslateJSONBody = RouteBodyInput<AIRoutes['translateJSON']>;\nexport type TranslateJSONResult = ResponseData<{\n fileContent: Record<string, unknown>;\n tokenUsed: number;\n}>;\nexport type AuditContentDeclarationBody = RouteBodyInput<\n AIRoutes['auditContentDeclaration']\n>;\nexport type AuditContentDeclarationResult = ResponseData<\n z.output<typeof metadataResultSchema>\n>;\nexport type AuditContentDeclarationFieldBody = RouteBodyInput<\n AIRoutes['auditContentDeclarationField']\n>;\nexport type AuditContentDeclarationFieldResult = ResponseData<\n z.output<typeof fileContentResultSchema>\n>;\nexport type AuditContentDeclarationMetadataBody = RouteBodyInput<\n AIRoutes['auditContentDeclarationMetadata']\n>;\nexport type AuditContentDeclarationMetadataResult = ResponseData<\n z.output<typeof metadataResultSchema>\n>;\nexport type AuditTagBody = RouteBodyInput<AIRoutes['auditTag']>;\nexport type AuditTagResultData = z.output<typeof tagAuditResultSchema>;\nexport type AuditTagResult = ResponseData<AuditTagResultData>;\nexport type AskDocQuestionBody = RouteBodyInput<AIRoutes['ask']>;\n/** Final payload of the documentation assistant stream. */\nexport type AskDocQuestionResult = ResponseData<{\n response: string;\n relatedFiles: string[];\n}>;\nexport type ChatBody = RouteBodyInput<AIRoutes['chat']>;\n/** Final payload of the dashboard assistant stream. */\nexport type ChatResult = ResponseData<{\n response: string;\n tokenUsage?: z.output<typeof tokenUsageSchema>;\n aiModel?: string;\n}>;\nexport type AutocompleteBody = RouteBodyInput<AIRoutes['autocomplete']>;\nexport type AutocompleteResponse = ResponseData<{ autocompletion: string }>;\nexport type GetDiscussionsParams = RouteQuerystring<AIRoutes['getDiscussions']>;\nexport type GetDiscussionsResult = PaginatedResponse<DiscussionAPI>;\nexport type GetAIStatsResult = ResponseData<AIStats>;\n"],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_defineRoute = require('./defineRoute.cjs');
3
+ const require_responseData = require('./responseData.cjs');
4
+ let zod_mini = require("zod/mini");
5
+
6
+ //#region src/analytics.ts
7
+ /** Kind of analytics event sent by the SDK. */
8
+ const analyticsEventTypeSchema = zod_mini.z.enum([
9
+ "page_view",
10
+ "content_exposure",
11
+ "conversion"
12
+ ]);
13
+ /** One event as sent by the SDK (batched). */
14
+ const incomingAnalyticsEventSchema = zod_mini.z.looseObject({
15
+ type: analyticsEventTypeSchema,
16
+ /** Client timestamp (epoch ms). */
17
+ t: zod_mini.z.number(),
18
+ locale: zod_mini.z.string(),
19
+ url: zod_mini.z.string(),
20
+ ref: zod_mini.z.optional(zod_mini.z.string()),
21
+ dictionaryKey: zod_mini.z.optional(zod_mini.z.string()),
22
+ keyPath: zod_mini.z.optional(zod_mini.z.string()),
23
+ nodeType: zod_mini.z.optional(zod_mini.z.string()),
24
+ variant: zod_mini.z.optional(zod_mini.z.string()),
25
+ count: zod_mini.z.optional(zod_mini.z.number()),
26
+ experimentKey: zod_mini.z.optional(zod_mini.z.string()),
27
+ goal: zod_mini.z.optional(zod_mini.z.string()),
28
+ value: zod_mini.z.optional(zod_mini.z.number())
29
+ });
30
+ /** Time windows of the audience report. */
31
+ const audienceRangeSchema = zod_mini.z.enum([
32
+ "1h",
33
+ "24h",
34
+ "7d",
35
+ "30d",
36
+ "90d",
37
+ "6mo",
38
+ "1y",
39
+ "3y"
40
+ ]);
41
+ const audienceGranularitySchema = zod_mini.z.enum([
42
+ "minute",
43
+ "hour",
44
+ "day",
45
+ "week",
46
+ "month"
47
+ ]);
48
+ const audienceSeriesPointSchema = zod_mini.z.object({
49
+ /** ISO bucket start. */
50
+ bucket: zod_mini.z.string(),
51
+ users: zod_mini.z.number(),
52
+ views: zod_mini.z.number()
53
+ });
54
+ const audienceBreakdownRowSchema = zod_mini.z.object({
55
+ key: zod_mini.z.string(),
56
+ users: zod_mini.z.number(),
57
+ views: zod_mini.z.number()
58
+ });
59
+ const audienceStatsSchema = zod_mini.z.object({
60
+ usersToday: zod_mini.z.number(),
61
+ usersLast7Days: zod_mini.z.number(),
62
+ usersInRange: zod_mini.z.number(),
63
+ viewsInRange: zod_mini.z.number(),
64
+ range: audienceRangeSchema,
65
+ rangeHours: zod_mini.z.number(),
66
+ granularity: audienceGranularitySchema,
67
+ series: zod_mini.z.array(audienceSeriesPointSchema),
68
+ byLocale: zod_mini.z.array(audienceBreakdownRowSchema),
69
+ byCountry: zod_mini.z.array(audienceBreakdownRowSchema),
70
+ byPage: zod_mini.z.array(audienceBreakdownRowSchema)
71
+ });
72
+ const analyticsOverviewRowSchema = zod_mini.z.object({
73
+ url: zod_mini.z.string(),
74
+ locale: zod_mini.z.string(),
75
+ views: zod_mini.z.number()
76
+ });
77
+ const contentStatRowSchema = zod_mini.z.object({
78
+ dictionaryKey: zod_mini.z.string(),
79
+ keyPath: zod_mini.z.string(),
80
+ locale: zod_mini.z.string(),
81
+ exposures: zod_mini.z.number()
82
+ });
83
+ const experimentResultSchema = zod_mini.z.object({
84
+ experimentKey: zod_mini.z.string(),
85
+ variants: zod_mini.z.array(zod_mini.z.object({
86
+ variant: zod_mini.z.string(),
87
+ exposures: zod_mini.z.number(),
88
+ conversions: zod_mini.z.number(),
89
+ conversionRate: zod_mini.z.number()
90
+ })),
91
+ pValue: zod_mini.z.nullable(zod_mini.z.number()),
92
+ winner: zod_mini.z.nullable(zod_mini.z.string())
93
+ });
94
+ const pageMetadataSchema = zod_mini.z.object({
95
+ title: zod_mini.z.optional(zod_mini.z.string()),
96
+ description: zod_mini.z.optional(zod_mini.z.string())
97
+ });
98
+ /** REST contract of the `/api/analytics` routes. */
99
+ const analyticsContract = require_defineRoute.defineRouteGroup({
100
+ prefix: "/api/analytics",
101
+ tag: "Analytics",
102
+ routes: {
103
+ ingestAnalyticsEvents: require_defineRoute.defineRoute({
104
+ method: "POST",
105
+ path: "/events",
106
+ summary: "Ingest SDK events (public browser token, rate limited)",
107
+ schemas: {
108
+ /** Sent as `text/plain` JSON by `navigator.sendBeacon`. */
109
+ body: zod_mini.z.looseObject({
110
+ /** Token from `POST /api/public/token` (`analytics:ingest`). */
111
+ token: zod_mini.z.optional(zod_mini.z.string()),
112
+ /** @deprecated Superseded by `token`; still accepted. */
113
+ clientId: zod_mini.z.optional(zod_mini.z.string()),
114
+ sessionId: zod_mini.z.string(),
115
+ sdkVersion: zod_mini.z.string(),
116
+ events: zod_mini.z.array(incomingAnalyticsEventSchema)
117
+ }),
118
+ response: { 200: require_responseData.responseDataSchema(zod_mini.z.object({ accepted: zod_mini.z.number() })) }
119
+ }
120
+ }),
121
+ getAnalyticsOverview: require_defineRoute.defineRoute({
122
+ method: "GET",
123
+ path: "/overview",
124
+ summary: "Page views per page and locale",
125
+ schemas: { response: { 200: require_responseData.responseDataSchema(zod_mini.z.array(analyticsOverviewRowSchema)) } }
126
+ }),
127
+ getAnalyticsAudience: require_defineRoute.defineRoute({
128
+ method: "GET",
129
+ path: "/audience",
130
+ summary: "Audience report over a time window",
131
+ schemas: {
132
+ querystring: zod_mini.z.object({
133
+ range: zod_mini.z.optional(zod_mini.z.string()),
134
+ /** Legacy: converted to the closest range. */
135
+ days: zod_mini.z.optional(zod_mini.z.string())
136
+ }),
137
+ response: { 200: require_responseData.responseDataSchema(audienceStatsSchema) }
138
+ }
139
+ }),
140
+ getContentStats: require_defineRoute.defineRoute({
141
+ method: "GET",
142
+ path: "/content-stats",
143
+ summary: "Content exposures per dictionary key path and locale",
144
+ schemas: { response: { 200: require_responseData.responseDataSchema(zod_mini.z.array(contentStatRowSchema)) } }
145
+ }),
146
+ getExperimentResults: require_defineRoute.defineRoute({
147
+ method: "GET",
148
+ path: "/experiments/:experimentKey",
149
+ summary: "A/B test results of an experiment",
150
+ schemas: {
151
+ params: zod_mini.z.object({ experimentKey: zod_mini.z.string().check(zod_mini.z.minLength(1)) }),
152
+ response: { 200: require_responseData.responseDataSchema(experimentResultSchema) }
153
+ }
154
+ }),
155
+ getPageMetadata: require_defineRoute.defineRoute({
156
+ method: "GET",
157
+ path: "/page-metadata",
158
+ summary: "Title and description of a page of the project",
159
+ schemas: {
160
+ querystring: zod_mini.z.object({ url: zod_mini.z.optional(zod_mini.z.string()) }),
161
+ response: { 200: require_responseData.responseDataSchema(pageMetadataSchema) }
162
+ }
163
+ })
164
+ }
165
+ });
166
+
167
+ //#endregion
168
+ exports.analyticsContract = analyticsContract;
169
+ exports.analyticsEventTypeSchema = analyticsEventTypeSchema;
170
+ exports.audienceGranularitySchema = audienceGranularitySchema;
171
+ exports.audienceRangeSchema = audienceRangeSchema;
172
+ exports.audienceSeriesPointSchema = audienceSeriesPointSchema;
173
+ exports.audienceStatsSchema = audienceStatsSchema;
174
+ exports.incomingAnalyticsEventSchema = incomingAnalyticsEventSchema;
175
+ //# sourceMappingURL=analytics.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.cjs","names":["z","defineRouteGroup","defineRoute","responseDataSchema"],"sources":["../../src/analytics.ts"],"sourcesContent":["import { z } from 'zod/mini';\nimport {\n defineRoute,\n defineRouteGroup,\n type RouteBodyInput,\n} from './defineRoute';\nimport { type ResponseData, responseDataSchema } from './responseData';\n\n/** Kind of analytics event sent by the SDK. */\nexport const analyticsEventTypeSchema = z.enum([\n 'page_view',\n 'content_exposure',\n 'conversion',\n]);\n\n/** One event as sent by the SDK (batched). */\nexport const incomingAnalyticsEventSchema = z.looseObject({\n type: analyticsEventTypeSchema,\n /** Client timestamp (epoch ms). */\n t: z.number(),\n locale: z.string(),\n url: z.string(),\n ref: z.optional(z.string()),\n dictionaryKey: z.optional(z.string()),\n keyPath: z.optional(z.string()),\n nodeType: z.optional(z.string()),\n variant: z.optional(z.string()),\n count: z.optional(z.number()),\n experimentKey: z.optional(z.string()),\n goal: z.optional(z.string()),\n value: z.optional(z.number()),\n});\n\n/** Time windows of the audience report. */\nexport const audienceRangeSchema = z.enum([\n '1h',\n '24h',\n '7d',\n '30d',\n '90d',\n '6mo',\n '1y',\n '3y',\n]);\n\nexport const audienceGranularitySchema = z.enum([\n 'minute',\n 'hour',\n 'day',\n 'week',\n 'month',\n]);\n\nexport const audienceSeriesPointSchema = z.object({\n /** ISO bucket start. */\n bucket: z.string(),\n users: z.number(),\n views: z.number(),\n});\n\nconst audienceBreakdownRowSchema = z.object({\n key: z.string(),\n users: z.number(),\n views: z.number(),\n});\n\nexport const audienceStatsSchema = z.object({\n usersToday: z.number(),\n usersLast7Days: z.number(),\n usersInRange: z.number(),\n viewsInRange: z.number(),\n range: audienceRangeSchema,\n rangeHours: z.number(),\n granularity: audienceGranularitySchema,\n series: z.array(audienceSeriesPointSchema),\n byLocale: z.array(audienceBreakdownRowSchema),\n byCountry: z.array(audienceBreakdownRowSchema),\n byPage: z.array(audienceBreakdownRowSchema),\n});\n\nconst analyticsOverviewRowSchema = z.object({\n url: z.string(),\n locale: z.string(),\n views: z.number(),\n});\n\nconst contentStatRowSchema = z.object({\n dictionaryKey: z.string(),\n keyPath: z.string(),\n locale: z.string(),\n exposures: z.number(),\n});\n\nconst experimentResultSchema = z.object({\n experimentKey: z.string(),\n variants: z.array(\n z.object({\n variant: z.string(),\n exposures: z.number(),\n conversions: z.number(),\n conversionRate: z.number(),\n })\n ),\n pValue: z.nullable(z.number()),\n winner: z.nullable(z.string()),\n});\n\nconst pageMetadataSchema = z.object({\n title: z.optional(z.string()),\n description: z.optional(z.string()),\n});\n\n/** REST contract of the `/api/analytics` routes. */\nexport const analyticsContract = defineRouteGroup({\n prefix: '/api/analytics',\n tag: 'Analytics',\n routes: {\n ingestAnalyticsEvents: defineRoute({\n method: 'POST',\n path: '/events',\n summary: 'Ingest SDK events (public browser token, rate limited)',\n schemas: {\n /** Sent as `text/plain` JSON by `navigator.sendBeacon`. */\n body: z.looseObject({\n /** Token from `POST /api/public/token` (`analytics:ingest`). */\n token: z.optional(z.string()),\n /** @deprecated Superseded by `token`; still accepted. */\n clientId: z.optional(z.string()),\n sessionId: z.string(),\n sdkVersion: z.string(),\n events: z.array(incomingAnalyticsEventSchema),\n }),\n response: {\n 200: responseDataSchema(z.object({ accepted: z.number() })),\n },\n },\n }),\n getAnalyticsOverview: defineRoute({\n method: 'GET',\n path: '/overview',\n summary: 'Page views per page and locale',\n schemas: {\n response: {\n 200: responseDataSchema(z.array(analyticsOverviewRowSchema)),\n },\n },\n }),\n getAnalyticsAudience: defineRoute({\n method: 'GET',\n path: '/audience',\n summary: 'Audience report over a time window',\n schemas: {\n querystring: z.object({\n range: z.optional(z.string()),\n /** Legacy: converted to the closest range. */\n days: z.optional(z.string()),\n }),\n response: { 200: responseDataSchema(audienceStatsSchema) },\n },\n }),\n getContentStats: defineRoute({\n method: 'GET',\n path: '/content-stats',\n summary: 'Content exposures per dictionary key path and locale',\n schemas: {\n response: { 200: responseDataSchema(z.array(contentStatRowSchema)) },\n },\n }),\n getExperimentResults: defineRoute({\n method: 'GET',\n path: '/experiments/:experimentKey',\n summary: 'A/B test results of an experiment',\n schemas: {\n params: z.object({ experimentKey: z.string().check(z.minLength(1)) }),\n response: { 200: responseDataSchema(experimentResultSchema) },\n },\n }),\n getPageMetadata: defineRoute({\n method: 'GET',\n path: '/page-metadata',\n summary: 'Title and description of a page of the project',\n schemas: {\n querystring: z.object({ url: z.optional(z.string()) }),\n response: { 200: responseDataSchema(pageMetadataSchema) },\n },\n }),\n },\n});\n\n/** Route definitions of the `/api/analytics` group, by name. */\nexport type AnalyticsRoutes = (typeof analyticsContract)['routes'];\n\nexport type AnalyticsEventType = z.output<typeof analyticsEventTypeSchema>;\nexport type IncomingAnalyticsEvent = z.output<\n typeof incomingAnalyticsEventSchema\n>;\nexport type AudienceRange = z.output<typeof audienceRangeSchema>;\nexport type AudienceGranularity = z.output<typeof audienceGranularitySchema>;\nexport type AudienceSeriesPoint = z.output<typeof audienceSeriesPointSchema>;\nexport type AudienceBreakdownRow = z.output<typeof audienceBreakdownRowSchema>;\nexport type AudienceStats = z.output<typeof audienceStatsSchema>;\nexport type AnalyticsOverviewRow = z.output<typeof analyticsOverviewRowSchema>;\nexport type ContentStatRow = z.output<typeof contentStatRowSchema>;\nexport type ExperimentResult = z.output<typeof experimentResultSchema>;\nexport type PageMetadata = z.output<typeof pageMetadataSchema>;\n\nexport type IngestAnalyticsBody = RouteBodyInput<\n AnalyticsRoutes['ingestAnalyticsEvents']\n>;\nexport type IngestAnalyticsResult = ResponseData<{ accepted: number }>;\nexport type GetAnalyticsOverviewResult = ResponseData<AnalyticsOverviewRow[]>;\nexport type GetContentStatsResult = ResponseData<ContentStatRow[]>;\nexport type GetExperimentResultsResult = ResponseData<ExperimentResult>;\nexport type GetAudienceResult = ResponseData<AudienceStats>;\nexport type GetPageMetadataResult = ResponseData<PageMetadata>;\n"],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_defineRoute = require('./defineRoute.cjs');
3
+ const require_responseData = require('./responseData.cjs');
4
+ const require_common = require('./common.cjs');
5
+ let zod_mini = require("zod/mini");
6
+
7
+ //#region src/asset.ts
8
+ /** Image uploaded to a project (served from the CDN). */
9
+ const assetSchema = zod_mini.z.looseObject({
10
+ id: zod_mini.z.string(),
11
+ projectId: zod_mini.z.string(),
12
+ /** Original file name as provided by the uploader. */
13
+ originalName: zod_mini.z.string(),
14
+ /** MIME type (ex: `image/jpeg`). */
15
+ mimeType: zod_mini.z.string(),
16
+ /** File size in bytes. */
17
+ size: zod_mini.z.number(),
18
+ /** S3 object key. */
19
+ s3Key: zod_mini.z.string(),
20
+ /** Publicly accessible CDN URL. */
21
+ publicUrl: zod_mini.z.string(),
22
+ alt: zod_mini.z.optional(zod_mini.z.string()),
23
+ caption: zod_mini.z.optional(zod_mini.z.string()),
24
+ uploadedBy: zod_mini.z.string(),
25
+ createdAt: require_common.dateTimeSchema,
26
+ updatedAt: require_common.dateTimeSchema
27
+ });
28
+ const assetIdParamsSchema = zod_mini.z.object({ assetId: require_common.objectIdSchema });
29
+ const assetResponseSchema = require_responseData.responseDataSchema(assetSchema);
30
+ /** REST contract of the `/api/assets` routes (scoped to the selected project). */
31
+ const assetContract = require_defineRoute.defineRouteGroup({
32
+ prefix: "/api/assets",
33
+ tag: "Asset",
34
+ routes: {
35
+ getAssets: require_defineRoute.defineRoute({
36
+ method: "GET",
37
+ path: "/",
38
+ summary: "List the assets of the selected project",
39
+ schemas: {
40
+ querystring: zod_mini.z.object(require_common.paginationQueryShape),
41
+ response: { 200: require_responseData.paginatedResponseSchema(assetSchema) }
42
+ }
43
+ }),
44
+ getAssetById: require_defineRoute.defineRoute({
45
+ method: "GET",
46
+ path: "/:assetId",
47
+ summary: "Get an asset",
48
+ schemas: {
49
+ params: assetIdParamsSchema,
50
+ response: { 200: assetResponseSchema }
51
+ }
52
+ }),
53
+ uploadAsset: require_defineRoute.defineRoute({
54
+ method: "POST",
55
+ path: "/",
56
+ summary: "Upload an image (raw `image/*` body)",
57
+ schemas: { response: { 200: assetResponseSchema } }
58
+ }),
59
+ updateAsset: require_defineRoute.defineRoute({
60
+ method: "PATCH",
61
+ path: "/:assetId",
62
+ summary: "Update the metadata of an asset",
63
+ schemas: {
64
+ params: assetIdParamsSchema,
65
+ body: zod_mini.z.object({
66
+ originalName: zod_mini.z.optional(zod_mini.z.string()),
67
+ alt: zod_mini.z.optional(zod_mini.z.string()),
68
+ caption: zod_mini.z.optional(zod_mini.z.string())
69
+ }),
70
+ response: { 200: assetResponseSchema }
71
+ }
72
+ }),
73
+ deleteAsset: require_defineRoute.defineRoute({
74
+ method: "DELETE",
75
+ path: "/:assetId",
76
+ summary: "Delete an asset (database and CDN)",
77
+ schemas: {
78
+ params: assetIdParamsSchema,
79
+ response: { 200: require_responseData.responseDataSchema(zod_mini.z.null()) }
80
+ }
81
+ })
82
+ }
83
+ });
84
+
85
+ //#endregion
86
+ exports.assetContract = assetContract;
87
+ exports.assetSchema = assetSchema;
88
+ //# sourceMappingURL=asset.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset.cjs","names":["z","dateTimeSchema","objectIdSchema","responseDataSchema","defineRouteGroup","defineRoute","paginationQueryShape","paginatedResponseSchema"],"sources":["../../src/asset.ts"],"sourcesContent":["import { z } from 'zod/mini';\nimport { dateTimeSchema, objectIdSchema, paginationQueryShape } from './common';\nimport {\n defineRoute,\n defineRouteGroup,\n type RouteBodyInput,\n} from './defineRoute';\nimport {\n type PaginatedResponse,\n paginatedResponseSchema,\n type ResponseData,\n responseDataSchema,\n} from './responseData';\n\n/** Image uploaded to a project (served from the CDN). */\nexport const assetSchema = z.looseObject({\n id: z.string(),\n projectId: z.string(),\n /** Original file name as provided by the uploader. */\n originalName: z.string(),\n /** MIME type (ex: `image/jpeg`). */\n mimeType: z.string(),\n /** File size in bytes. */\n size: z.number(),\n /** S3 object key. */\n s3Key: z.string(),\n /** Publicly accessible CDN URL. */\n publicUrl: z.string(),\n alt: z.optional(z.string()),\n caption: z.optional(z.string()),\n uploadedBy: z.string(),\n createdAt: dateTimeSchema,\n updatedAt: dateTimeSchema,\n});\n\nconst assetIdParamsSchema = z.object({ assetId: objectIdSchema });\nconst assetResponseSchema = responseDataSchema(assetSchema);\n\n/** REST contract of the `/api/assets` routes (scoped to the selected project). */\nexport const assetContract = defineRouteGroup({\n prefix: '/api/assets',\n tag: 'Asset',\n routes: {\n getAssets: defineRoute({\n method: 'GET',\n path: '/',\n summary: 'List the assets of the selected project',\n schemas: {\n querystring: z.object(paginationQueryShape),\n response: { 200: paginatedResponseSchema(assetSchema) },\n },\n }),\n getAssetById: defineRoute({\n method: 'GET',\n path: '/:assetId',\n summary: 'Get an asset',\n schemas: {\n params: assetIdParamsSchema,\n response: { 200: assetResponseSchema },\n },\n }),\n uploadAsset: defineRoute({\n method: 'POST',\n path: '/',\n summary: 'Upload an image (raw `image/*` body)',\n schemas: {\n response: { 200: assetResponseSchema },\n },\n }),\n updateAsset: defineRoute({\n method: 'PATCH',\n path: '/:assetId',\n summary: 'Update the metadata of an asset',\n schemas: {\n params: assetIdParamsSchema,\n body: z.object({\n originalName: z.optional(z.string()),\n alt: z.optional(z.string()),\n caption: z.optional(z.string()),\n }),\n response: { 200: assetResponseSchema },\n },\n }),\n deleteAsset: defineRoute({\n method: 'DELETE',\n path: '/:assetId',\n summary: 'Delete an asset (database and CDN)',\n schemas: {\n params: assetIdParamsSchema,\n response: { 200: responseDataSchema(z.null()) },\n },\n }),\n },\n});\n\n/** Route definitions of the `/api/assets` group, by name. */\nexport type AssetRoutes = (typeof assetContract)['routes'];\n\nexport type AssetAPI = z.output<typeof assetSchema>;\nexport type GetAssetsResult = PaginatedResponse<AssetAPI>;\nexport type GetAssetByIdResult = ResponseData<AssetAPI>;\nexport type UploadAssetResult = ResponseData<AssetAPI>;\nexport type UpdateAssetBody = RouteBodyInput<AssetRoutes['updateAsset']>;\nexport type UpdateAssetResult = ResponseData<AssetAPI>;\nexport type DeleteAssetResult = ResponseData<null>;\n"],"mappings":";;;;;;;;AAeA,MAAa,cAAcA,WAAE,YAAY;CACvC,IAAIA,WAAE,OAAO;CACb,WAAWA,WAAE,OAAO;;CAEpB,cAAcA,WAAE,OAAO;;CAEvB,UAAUA,WAAE,OAAO;;CAEnB,MAAMA,WAAE,OAAO;;CAEf,OAAOA,WAAE,OAAO;;CAEhB,WAAWA,WAAE,OAAO;CACpB,KAAKA,WAAE,SAASA,WAAE,OAAO,CAAC;CAC1B,SAASA,WAAE,SAASA,WAAE,OAAO,CAAC;CAC9B,YAAYA,WAAE,OAAO;CACrB,WAAWC;CACX,WAAWA;AACb,CAAC;AAED,MAAM,sBAAsBD,WAAE,OAAO,EAAE,SAASE,8BAAe,CAAC;AAChE,MAAM,sBAAsBC,wCAAmB,WAAW;;AAG1D,MAAa,gBAAgBC,qCAAiB;CAC5C,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,WAAWC,gCAAY;GACrB,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,aAAaL,WAAE,OAAOM,mCAAoB;IAC1C,UAAU,EAAE,KAAKC,6CAAwB,WAAW,EAAE;GACxD;EACF,CAAC;EACD,cAAcF,gCAAY;GACxB,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,QAAQ;IACR,UAAU,EAAE,KAAK,oBAAoB;GACvC;EACF,CAAC;EACD,aAAaA,gCAAY;GACvB,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS,EACP,UAAU,EAAE,KAAK,oBAAoB,EACvC;EACF,CAAC;EACD,aAAaA,gCAAY;GACvB,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,QAAQ;IACR,MAAML,WAAE,OAAO;KACb,cAAcA,WAAE,SAASA,WAAE,OAAO,CAAC;KACnC,KAAKA,WAAE,SAASA,WAAE,OAAO,CAAC;KAC1B,SAASA,WAAE,SAASA,WAAE,OAAO,CAAC;IAChC,CAAC;IACD,UAAU,EAAE,KAAK,oBAAoB;GACvC;EACF,CAAC;EACD,aAAaK,gCAAY;GACvB,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,QAAQ;IACR,UAAU,EAAE,KAAKF,wCAAmBH,WAAE,KAAK,CAAC,EAAE;GAChD;EACF,CAAC;CACH;AACF,CAAC"}
@@ -0,0 +1,98 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_defineRoute = require('./defineRoute.cjs');
3
+ const require_responseData = require('./responseData.cjs');
4
+ const require_common = require('./common.cjs');
5
+ let zod_mini = require("zod/mini");
6
+
7
+ //#region src/blogComment.ts
8
+ /** Moderation status of a blog comment. */
9
+ const blogCommentStatusSchema = zod_mini.z.enum([
10
+ "pending",
11
+ "approved",
12
+ "rejected"
13
+ ]);
14
+ /** Comment as shown publicly (author email stripped). */
15
+ const blogCommentPublicSchema = zod_mini.z.looseObject({
16
+ id: zod_mini.z.string(),
17
+ blogSlug: zod_mini.z.string(),
18
+ authorName: zod_mini.z.string(),
19
+ content: zod_mini.z.string(),
20
+ status: blogCommentStatusSchema,
21
+ createdAt: zod_mini.z.string(),
22
+ updatedAt: zod_mini.z.string()
23
+ });
24
+ /** Comment as shown to admins. */
25
+ const blogCommentSchema = zod_mini.z.looseObject({
26
+ ...blogCommentPublicSchema.shape,
27
+ authorEmail: zod_mini.z.string()
28
+ });
29
+ const commentIdParamsSchema = zod_mini.z.object({ commentId: require_common.objectIdSchema });
30
+ /** REST contract of the `/api/blog-comments` routes. */
31
+ const blogCommentContract = require_defineRoute.defineRouteGroup({
32
+ prefix: "/api/blog-comments",
33
+ tag: "Blog comment",
34
+ routes: {
35
+ submitBlogComment: require_defineRoute.defineRoute({
36
+ method: "POST",
37
+ path: "/",
38
+ summary: "Submit a comment on a blog post (moderated)",
39
+ schemas: {
40
+ body: zod_mini.z.object({
41
+ blogSlug: zod_mini.z.string().check(zod_mini.z.minLength(1)),
42
+ authorName: zod_mini.z.string().check(zod_mini.z.minLength(1)),
43
+ authorEmail: zod_mini.z.string().check(zod_mini.z.minLength(1)),
44
+ content: zod_mini.z.string().check(zod_mini.z.minLength(1))
45
+ }),
46
+ response: { 201: require_responseData.responseDataSchema(blogCommentPublicSchema) }
47
+ }
48
+ }),
49
+ getAdminBlogComments: require_defineRoute.defineRoute({
50
+ method: "GET",
51
+ path: "/admin",
52
+ summary: "Admin only: list comments by status or post",
53
+ schemas: {
54
+ querystring: zod_mini.z.object({
55
+ ...require_common.paginationQueryShape,
56
+ blogSlug: zod_mini.z.optional(zod_mini.z.string()),
57
+ status: zod_mini.z.optional(blogCommentStatusSchema)
58
+ }),
59
+ response: { 200: require_responseData.paginatedResponseSchema(blogCommentSchema) }
60
+ }
61
+ }),
62
+ getApprovedBlogComments: require_defineRoute.defineRoute({
63
+ method: "GET",
64
+ path: "/:blogSlug",
65
+ summary: "Approved comments of a blog post",
66
+ schemas: {
67
+ params: zod_mini.z.object({ blogSlug: zod_mini.z.string() }),
68
+ response: { 200: require_responseData.responseDataSchema(zod_mini.z.array(blogCommentPublicSchema)) }
69
+ }
70
+ }),
71
+ updateBlogCommentStatus: require_defineRoute.defineRoute({
72
+ method: "PATCH",
73
+ path: "/:commentId/status",
74
+ summary: "Admin only: approve or reject a comment",
75
+ schemas: {
76
+ params: commentIdParamsSchema,
77
+ body: zod_mini.z.object({ status: blogCommentStatusSchema }),
78
+ response: { 200: require_responseData.responseDataSchema(blogCommentSchema) }
79
+ }
80
+ }),
81
+ deleteBlogComment: require_defineRoute.defineRoute({
82
+ method: "DELETE",
83
+ path: "/:commentId",
84
+ summary: "Admin only: delete a comment",
85
+ schemas: {
86
+ params: commentIdParamsSchema,
87
+ response: { 200: require_responseData.responseDataSchema(zod_mini.z.null()) }
88
+ }
89
+ })
90
+ }
91
+ });
92
+
93
+ //#endregion
94
+ exports.blogCommentContract = blogCommentContract;
95
+ exports.blogCommentPublicSchema = blogCommentPublicSchema;
96
+ exports.blogCommentSchema = blogCommentSchema;
97
+ exports.blogCommentStatusSchema = blogCommentStatusSchema;
98
+ //# sourceMappingURL=blogComment.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blogComment.cjs","names":["z","objectIdSchema","defineRouteGroup","defineRoute","responseDataSchema","paginationQueryShape","paginatedResponseSchema"],"sources":["../../src/blogComment.ts"],"sourcesContent":["import { z } from 'zod/mini';\nimport { objectIdSchema, paginationQueryShape } from './common';\nimport {\n defineRoute,\n defineRouteGroup,\n type RouteBodyInput,\n} from './defineRoute';\nimport {\n type PaginatedResponse,\n paginatedResponseSchema,\n type ResponseData,\n responseDataSchema,\n} from './responseData';\n\n/** Moderation status of a blog comment. */\nexport const blogCommentStatusSchema = z.enum([\n 'pending',\n 'approved',\n 'rejected',\n]);\n\n/** Comment as shown publicly (author email stripped). */\nexport const blogCommentPublicSchema = z.looseObject({\n id: z.string(),\n blogSlug: z.string(),\n authorName: z.string(),\n content: z.string(),\n status: blogCommentStatusSchema,\n createdAt: z.string(),\n updatedAt: z.string(),\n});\n\n/** Comment as shown to admins. */\nexport const blogCommentSchema = z.looseObject({\n ...blogCommentPublicSchema.shape,\n authorEmail: z.string(),\n});\n\nconst commentIdParamsSchema = z.object({ commentId: objectIdSchema });\n\n/** REST contract of the `/api/blog-comments` routes. */\nexport const blogCommentContract = defineRouteGroup({\n prefix: '/api/blog-comments',\n tag: 'Blog comment',\n routes: {\n submitBlogComment: defineRoute({\n method: 'POST',\n path: '/',\n summary: 'Submit a comment on a blog post (moderated)',\n schemas: {\n body: z.object({\n blogSlug: z.string().check(z.minLength(1)),\n authorName: z.string().check(z.minLength(1)),\n authorEmail: z.string().check(z.minLength(1)),\n content: z.string().check(z.minLength(1)),\n }),\n response: { 201: responseDataSchema(blogCommentPublicSchema) },\n },\n }),\n getAdminBlogComments: defineRoute({\n method: 'GET',\n path: '/admin',\n summary: 'Admin only: list comments by status or post',\n schemas: {\n querystring: z.object({\n ...paginationQueryShape,\n blogSlug: z.optional(z.string()),\n status: z.optional(blogCommentStatusSchema),\n }),\n response: { 200: paginatedResponseSchema(blogCommentSchema) },\n },\n }),\n getApprovedBlogComments: defineRoute({\n method: 'GET',\n path: '/:blogSlug',\n summary: 'Approved comments of a blog post',\n schemas: {\n params: z.object({ blogSlug: z.string() }),\n response: {\n 200: responseDataSchema(z.array(blogCommentPublicSchema)),\n },\n },\n }),\n updateBlogCommentStatus: defineRoute({\n method: 'PATCH',\n path: '/:commentId/status',\n summary: 'Admin only: approve or reject a comment',\n schemas: {\n params: commentIdParamsSchema,\n body: z.object({ status: blogCommentStatusSchema }),\n response: { 200: responseDataSchema(blogCommentSchema) },\n },\n }),\n deleteBlogComment: defineRoute({\n method: 'DELETE',\n path: '/:commentId',\n summary: 'Admin only: delete a comment',\n schemas: {\n params: commentIdParamsSchema,\n response: { 200: responseDataSchema(z.null()) },\n },\n }),\n },\n});\n\n/** Route definitions of the `/api/blog-comments` group, by name. */\nexport type BlogCommentRoutes = (typeof blogCommentContract)['routes'];\n\nexport type BlogCommentStatus = z.output<typeof blogCommentStatusSchema>;\nexport type BlogCommentPublicAPI = z.output<typeof blogCommentPublicSchema>;\nexport type BlogCommentAPI = z.output<typeof blogCommentSchema>;\nexport type SubmitBlogCommentBody = RouteBodyInput<\n BlogCommentRoutes['submitBlogComment']\n>;\nexport type SubmitBlogCommentResult = ResponseData<BlogCommentPublicAPI>;\nexport type GetBlogCommentsResult = ResponseData<BlogCommentPublicAPI[]>;\nexport type GetAdminBlogCommentsResult = PaginatedResponse<BlogCommentAPI>;\nexport type UpdateBlogCommentStatusBody = RouteBodyInput<\n BlogCommentRoutes['updateBlogCommentStatus']\n>;\nexport type UpdateBlogCommentStatusResult = ResponseData<BlogCommentAPI>;\n"],"mappings":";;;;;;;;AAeA,MAAa,0BAA0BA,WAAE,KAAK;CAC5C;CACA;CACA;AACF,CAAC;;AAGD,MAAa,0BAA0BA,WAAE,YAAY;CACnD,IAAIA,WAAE,OAAO;CACb,UAAUA,WAAE,OAAO;CACnB,YAAYA,WAAE,OAAO;CACrB,SAASA,WAAE,OAAO;CAClB,QAAQ;CACR,WAAWA,WAAE,OAAO;CACpB,WAAWA,WAAE,OAAO;AACtB,CAAC;;AAGD,MAAa,oBAAoBA,WAAE,YAAY;CAC7C,GAAG,wBAAwB;CAC3B,aAAaA,WAAE,OAAO;AACxB,CAAC;AAED,MAAM,wBAAwBA,WAAE,OAAO,EAAE,WAAWC,8BAAe,CAAC;;AAGpE,MAAa,sBAAsBC,qCAAiB;CAClD,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,mBAAmBC,gCAAY;GAC7B,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,MAAMH,WAAE,OAAO;KACb,UAAUA,WAAE,OAAO,CAAC,CAAC,MAAMA,WAAE,UAAU,CAAC,CAAC;KACzC,YAAYA,WAAE,OAAO,CAAC,CAAC,MAAMA,WAAE,UAAU,CAAC,CAAC;KAC3C,aAAaA,WAAE,OAAO,CAAC,CAAC,MAAMA,WAAE,UAAU,CAAC,CAAC;KAC5C,SAASA,WAAE,OAAO,CAAC,CAAC,MAAMA,WAAE,UAAU,CAAC,CAAC;IAC1C,CAAC;IACD,UAAU,EAAE,KAAKI,wCAAmB,uBAAuB,EAAE;GAC/D;EACF,CAAC;EACD,sBAAsBD,gCAAY;GAChC,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,aAAaH,WAAE,OAAO;KACpB,GAAGK;KACH,UAAUL,WAAE,SAASA,WAAE,OAAO,CAAC;KAC/B,QAAQA,WAAE,SAAS,uBAAuB;IAC5C,CAAC;IACD,UAAU,EAAE,KAAKM,6CAAwB,iBAAiB,EAAE;GAC9D;EACF,CAAC;EACD,yBAAyBH,gCAAY;GACnC,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,QAAQH,WAAE,OAAO,EAAE,UAAUA,WAAE,OAAO,EAAE,CAAC;IACzC,UAAU,EACR,KAAKI,wCAAmBJ,WAAE,MAAM,uBAAuB,CAAC,EAC1D;GACF;EACF,CAAC;EACD,yBAAyBG,gCAAY;GACnC,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,QAAQ;IACR,MAAMH,WAAE,OAAO,EAAE,QAAQ,wBAAwB,CAAC;IAClD,UAAU,EAAE,KAAKI,wCAAmB,iBAAiB,EAAE;GACzD;EACF,CAAC;EACD,mBAAmBD,gCAAY;GAC7B,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS;IACP,QAAQ;IACR,UAAU,EAAE,KAAKC,wCAAmBJ,WAAE,KAAK,CAAC,EAAE;GAChD;EACF,CAAC;CACH;AACF,CAAC"}
@@ -0,0 +1,40 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_defineRoute = require('./defineRoute.cjs');
3
+ const require_responseData = require('./responseData.cjs');
4
+ const require_common = require('./common.cjs');
5
+ const require_user = require('./user.cjs');
6
+ const require_project = require('./project.cjs');
7
+ const require_organization = require('./organization.cjs');
8
+ let zod_mini = require("zod/mini");
9
+
10
+ //#region src/cliSessionToken.ts
11
+ /** REST contract of the CLI session routes (`intlayer login`). */
12
+ const cliSessionTokenContract = require_defineRoute.defineRouteGroup({
13
+ prefix: "/api/cli-session",
14
+ tag: "CLI session",
15
+ routes: {
16
+ createCliSessionToken: require_defineRoute.defineRoute({
17
+ method: "POST",
18
+ path: "/",
19
+ summary: "Issue a short-lived token for the CLI login handoff",
20
+ schemas: { response: { 200: require_responseData.responseDataSchema(zod_mini.z.object({
21
+ token: zod_mini.z.string(),
22
+ expiresAt: require_common.dateTimeSchema
23
+ })) } }
24
+ }),
25
+ getCliSessionMe: require_defineRoute.defineRoute({
26
+ method: "GET",
27
+ path: "/me",
28
+ summary: "User, organization and project bound to the CLI session token",
29
+ schemas: { response: { 200: require_responseData.responseDataSchema(zod_mini.z.object({
30
+ project: require_project.projectSchema,
31
+ user: zod_mini.z.optional(zod_mini.z.nullable(require_user.userSchema)),
32
+ organization: zod_mini.z.optional(zod_mini.z.nullable(require_organization.organizationSchema))
33
+ })) } }
34
+ })
35
+ }
36
+ });
37
+
38
+ //#endregion
39
+ exports.cliSessionTokenContract = cliSessionTokenContract;
40
+ //# sourceMappingURL=cliSessionToken.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliSessionToken.cjs","names":["defineRouteGroup","defineRoute","responseDataSchema","z","dateTimeSchema","projectSchema","userSchema","organizationSchema"],"sources":["../../src/cliSessionToken.ts"],"sourcesContent":["import { z } from 'zod/mini';\nimport { dateTimeSchema } from './common';\nimport { defineRoute, defineRouteGroup } from './defineRoute';\nimport { type OrganizationAPI, organizationSchema } from './organization';\nimport { type ProjectAPI, projectSchema } from './project';\nimport { type ResponseData, responseDataSchema } from './responseData';\nimport { type UserAPI, userSchema } from './user';\n\n/** REST contract of the CLI session routes (`intlayer login`). */\nexport const cliSessionTokenContract = defineRouteGroup({\n prefix: '/api/cli-session',\n tag: 'CLI session',\n routes: {\n createCliSessionToken: defineRoute({\n method: 'POST',\n path: '/',\n summary: 'Issue a short-lived token for the CLI login handoff',\n schemas: {\n response: {\n 200: responseDataSchema(\n z.object({ token: z.string(), expiresAt: dateTimeSchema })\n ),\n },\n },\n }),\n getCliSessionMe: defineRoute({\n method: 'GET',\n path: '/me',\n summary: 'User, organization and project bound to the CLI session token',\n schemas: {\n response: {\n 200: responseDataSchema(\n z.object({\n project: projectSchema,\n // Optional: backends before 9.6 only return the project\n user: z.optional(z.nullable(userSchema)),\n organization: z.optional(z.nullable(organizationSchema)),\n })\n ),\n },\n },\n }),\n },\n});\n\n/** Route definitions of the CLI session group, by name. */\nexport type CliSessionTokenRoutes = (typeof cliSessionTokenContract)['routes'];\n\nexport type CreateCliSessionTokenResult = ResponseData<{\n token: string;\n expiresAt: string;\n}>;\nexport type GetCliSessionMeResult = ResponseData<{\n project: ProjectAPI;\n user?: UserAPI | null;\n organization?: OrganizationAPI | null;\n}>;\n"],"mappings":";;;;;;;;;;;AASA,MAAa,0BAA0BA,qCAAiB;CACtD,QAAQ;CACR,KAAK;CACL,QAAQ;EACN,uBAAuBC,gCAAY;GACjC,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS,EACP,UAAU,EACR,KAAKC,wCACHC,WAAE,OAAO;IAAE,OAAOA,WAAE,OAAO;IAAG,WAAWC;GAAe,CAAC,CAC3D,EACF,EACF;EACF,CAAC;EACD,iBAAiBH,gCAAY;GAC3B,QAAQ;GACR,MAAM;GACN,SAAS;GACT,SAAS,EACP,UAAU,EACR,KAAKC,wCACHC,WAAE,OAAO;IACP,SAASE;IAET,MAAMF,WAAE,SAASA,WAAE,SAASG,uBAAU,CAAC;IACvC,cAAcH,WAAE,SAASA,WAAE,SAASI,uCAAkB,CAAC;GACzD,CAAC,CACH,EACF,EACF;EACF,CAAC;CACH;AACF,CAAC"}
@@ -0,0 +1,42 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ let zod_mini = require("zod/mini");
3
+
4
+ //#region src/common.ts
5
+ /** 24-character hexadecimal MongoDB ObjectId, serialized as a string. */
6
+ const objectIdSchema = zod_mini.z.string().check(zod_mini.z.regex(/^[a-fA-F0-9]{24}$/));
7
+ /**
8
+ * Query string value that may be repeated (`?id=a&id=b`): Fastify parses it
9
+ * as a single string or as an array of strings.
10
+ */
11
+ const repeatableQueryValueSchema = zod_mini.z.union([zod_mini.z.string(), zod_mini.z.array(zod_mini.z.string())]);
12
+ /** Pagination fields shared by every paginated list endpoint. */
13
+ const paginationQueryShape = {
14
+ page: zod_mini.z.optional(zod_mini.z.union([zod_mini.z.string(), zod_mini.z.number()])),
15
+ pageSize: zod_mini.z.optional(zod_mini.z.union([zod_mini.z.string(), zod_mini.z.number()]))
16
+ };
17
+ /** Date serialized by `JSON.stringify` (ISO 8601). */
18
+ const dateTimeSchema = zod_mini.z.string();
19
+ /**
20
+ * String narrowed to a type owned by another package (ex: `Locale` from
21
+ * `@intlayer/types`), without duplicating its values. Validated and
22
+ * documented as a plain string.
23
+ */
24
+ const typedStringSchema = () => zod_mini.z.custom((value) => typeof value === "string");
25
+ /**
26
+ * Value whose type is owned by another package (ex: AI configuration or
27
+ * dictionaries from `@intlayer/types`), documented as any JSON value.
28
+ * @param isValid - Optional shallow runtime check (defaults to accept all).
29
+ */
30
+ const typedValueSchema = (isValid = () => true) => zod_mini.z.custom(isValid);
31
+ /** Whether a value is a plain JSON object (not null, not an array). */
32
+ const isJSONObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
33
+
34
+ //#endregion
35
+ exports.dateTimeSchema = dateTimeSchema;
36
+ exports.isJSONObject = isJSONObject;
37
+ exports.objectIdSchema = objectIdSchema;
38
+ exports.paginationQueryShape = paginationQueryShape;
39
+ exports.repeatableQueryValueSchema = repeatableQueryValueSchema;
40
+ exports.typedStringSchema = typedStringSchema;
41
+ exports.typedValueSchema = typedValueSchema;
42
+ //# sourceMappingURL=common.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.cjs","names":["z"],"sources":["../../src/common.ts"],"sourcesContent":["import { z } from 'zod/mini';\n\n/** 24-character hexadecimal MongoDB ObjectId, serialized as a string. */\nexport const objectIdSchema = z.string().check(z.regex(/^[a-fA-F0-9]{24}$/));\n\n/**\n * Query string value that may be repeated (`?id=a&id=b`): Fastify parses it\n * as a single string or as an array of strings.\n */\nexport const repeatableQueryValueSchema = z.union([\n z.string(),\n z.array(z.string()),\n]);\n\n/** Pagination fields shared by every paginated list endpoint. */\nexport const paginationQueryShape = {\n page: z.optional(z.union([z.string(), z.number()])),\n pageSize: z.optional(z.union([z.string(), z.number()])),\n};\n\n/** Date serialized by `JSON.stringify` (ISO 8601). */\nexport const dateTimeSchema = z.string();\n\n/**\n * String narrowed to a type owned by another package (ex: `Locale` from\n * `@intlayer/types`), without duplicating its values. Validated and\n * documented as a plain string.\n */\nexport const typedStringSchema = <Value extends string>() =>\n z.custom<Value>((value) => typeof value === 'string');\n\n/**\n * Value whose type is owned by another package (ex: AI configuration or\n * dictionaries from `@intlayer/types`), documented as any JSON value.\n * @param isValid - Optional shallow runtime check (defaults to accept all).\n */\nexport const typedValueSchema = <Value>(\n isValid: (value: unknown) => boolean = () => true\n) => z.custom<Value>(isValid);\n\n/** Whether a value is a plain JSON object (not null, not an array). */\nexport const isJSONObject = (\n value: unknown\n): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n"],"mappings":";;;;;AAGA,MAAa,iBAAiBA,WAAE,OAAO,CAAC,CAAC,MAAMA,WAAE,MAAM,mBAAmB,CAAC;;;;;AAM3E,MAAa,6BAA6BA,WAAE,MAAM,CAChDA,WAAE,OAAO,GACTA,WAAE,MAAMA,WAAE,OAAO,CAAC,CACpB,CAAC;;AAGD,MAAa,uBAAuB;CAClC,MAAMA,WAAE,SAASA,WAAE,MAAM,CAACA,WAAE,OAAO,GAAGA,WAAE,OAAO,CAAC,CAAC,CAAC;CAClD,UAAUA,WAAE,SAASA,WAAE,MAAM,CAACA,WAAE,OAAO,GAAGA,WAAE,OAAO,CAAC,CAAC,CAAC;AACxD;;AAGA,MAAa,iBAAiBA,WAAE,OAAO;;;;;;AAOvC,MAAa,0BACXA,WAAE,QAAe,UAAU,OAAO,UAAU,QAAQ;;;;;;AAOtD,MAAa,oBACX,gBAA6C,SAC1CA,WAAE,OAAc,OAAO;;AAG5B,MAAa,gBACX,UAEA,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK"}
@@ -0,0 +1,26 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ //#region src/defineRoute.ts
3
+ /** Identity helper preserving literal types of a route definition. */
4
+ const defineRoute = (route) => route;
5
+ /** Identity helper preserving literal types of a route group. */
6
+ const defineRouteGroup = (group) => group;
7
+ /** Untyped implementation of {@link buildRouteURL}. */
8
+ const joinRouteURL = (backendURL, prefix, path, params) => {
9
+ const resolvedPath = path.replace(/:([A-Za-z0-9_]+)/g, (_match, name) => {
10
+ const value = params?.[name];
11
+ if (value === void 0) throw new Error(`Missing route param "${name}" for ${path}`);
12
+ return encodeURIComponent(value);
13
+ });
14
+ return `${backendURL}${prefix}${resolvedPath === "/" ? "" : resolvedPath}`;
15
+ };
16
+ /**
17
+ * Builds the absolute URL of a route by joining the backend URL, the group
18
+ * prefix and the path, with `:param` segments replaced and URI-encoded.
19
+ */
20
+ const buildRouteURL = (backendURL, group, route, ...[params]) => joinRouteURL(backendURL, group.prefix, route.path, params);
21
+
22
+ //#endregion
23
+ exports.buildRouteURL = buildRouteURL;
24
+ exports.defineRoute = defineRoute;
25
+ exports.defineRouteGroup = defineRouteGroup;
26
+ //# sourceMappingURL=defineRoute.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineRoute.cjs","names":[],"sources":["../../src/defineRoute.ts"],"sourcesContent":["import type { $ZodType, input, output } from 'zod/v4/core';\n\n/** HTTP methods exposed by the Intlayer backend. */\nexport type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\n/** Zod schemas describing one route's input and output. */\nexport type RouteSchemas = {\n params?: $ZodType;\n querystring?: $ZodType;\n body?: $ZodType;\n /** Response schemas keyed by HTTP status code. */\n response?: Partial<Record<number, $ZodType>>;\n};\n\n/** One REST route: method, path relative to its group prefix, and schemas. */\nexport type RouteDefinition<\n Method extends HttpMethod = HttpMethod,\n Path extends string = string,\n Schemas extends RouteSchemas = RouteSchemas,\n> = {\n method: Method;\n /** Fastify-style path, relative to the group prefix (ex: `/:projectId`). */\n path: Path;\n /** One-line summary shown in the OpenAPI documentation. */\n summary: string;\n description?: string;\n schemas: Schemas;\n};\n\n/** A set of routes sharing a URL prefix and an OpenAPI tag. */\nexport type RouteGroup<\n Prefix extends string = string,\n Routes extends Record<string, RouteDefinition> = Record<\n string,\n RouteDefinition\n >,\n> = {\n /** Absolute prefix mounted on the backend (ex: `/api/project`). */\n prefix: Prefix;\n /** OpenAPI tag grouping the routes in the documentation. */\n tag: string;\n routes: Routes;\n};\n\n/** Identity helper preserving literal types of a route definition. */\nexport const defineRoute = <\n const Method extends HttpMethod,\n const Path extends string,\n const Schemas extends RouteSchemas,\n>(\n route: RouteDefinition<Method, Path, Schemas>\n): RouteDefinition<Method, Path, Schemas> => route;\n\n/** Identity helper preserving literal types of a route group. */\nexport const defineRouteGroup = <\n const Prefix extends string,\n const Routes extends Record<string, RouteDefinition>,\n>(\n group: RouteGroup<Prefix, Routes>\n): RouteGroup<Prefix, Routes> => group;\n\ntype SchemaOutput<Schema> = Schema extends $ZodType ? output<Schema> : never;\ntype SchemaInput<Schema> = Schema extends $ZodType ? input<Schema> : never;\n\n/** Request body as parsed by the backend (after validation). */\nexport type RouteBody<Route extends RouteDefinition> = SchemaOutput<\n Route['schemas']['body']\n>;\n/** Request body as sent by a client (before validation). */\nexport type RouteBodyInput<Route extends RouteDefinition> = SchemaInput<\n Route['schemas']['body']\n>;\n/** URL params as parsed by the backend. */\nexport type RouteParams<Route extends RouteDefinition> = SchemaOutput<\n Route['schemas']['params']\n>;\n/** Query string as parsed by the backend. */\nexport type RouteQuerystring<Route extends RouteDefinition> = SchemaOutput<\n Route['schemas']['querystring']\n>;\n/** Successful (200) response payload. */\nexport type RouteResponse<Route extends RouteDefinition> =\n Route['schemas']['response'] extends Record<200, infer Schema>\n ? SchemaOutput<Schema>\n : unknown;\n\n/** Method and path of every route, for clients that must not load the schemas. */\nexport type RouteEndpoints<Routes extends Record<string, RouteDefinition>> = {\n [Name in keyof Routes]: Pick<Routes[Name], 'method' | 'path'>;\n};\n\n/** Extracts `{ name: string }` from a `/:name` path pattern. */\nexport type PathParams<Path extends string> =\n Path extends `${string}:${infer Name}/${infer Rest}`\n ? { [Key in Name]: string } & PathParams<`/${Rest}`>\n : Path extends `${string}:${infer Name}`\n ? { [Key in Name]: string }\n : Record<never, never>;\n\n/** Untyped implementation of {@link buildRouteURL}. */\nconst joinRouteURL = (\n backendURL: string,\n prefix: string,\n path: string,\n params?: Record<string, string>\n): string => {\n const resolvedPath = path.replace(\n /:([A-Za-z0-9_]+)/g,\n (_match, name: string) => {\n const value = params?.[name];\n\n if (value === undefined) {\n throw new Error(`Missing route param \"${name}\" for ${path}`);\n }\n\n return encodeURIComponent(value);\n }\n );\n const normalizedPath = resolvedPath === '/' ? '' : resolvedPath;\n\n return `${backendURL}${prefix}${normalizedPath}`;\n};\n\n/**\n * Builds the absolute URL of a route by joining the backend URL, the group\n * prefix and the path, with `:param` segments replaced and URI-encoded.\n */\nexport const buildRouteURL = <Prefix extends string, Path extends string>(\n backendURL: string,\n group: Pick<RouteGroup<Prefix>, 'prefix'>,\n route: Pick<RouteDefinition<HttpMethod, Path>, 'path'>,\n ...[params]: keyof PathParams<Path> extends never\n ? []\n : [params: PathParams<Path>]\n): string =>\n joinRouteURL(\n backendURL,\n group.prefix,\n route.path,\n params as Record<string, string> | undefined\n );\n"],"mappings":";;;AA6CA,MAAa,eAKX,UAC2C;;AAG7C,MAAa,oBAIX,UAC+B;;AAyCjC,MAAM,gBACJ,YACA,QACA,MACA,WACW;CACX,MAAM,eAAe,KAAK,QACxB,sBACC,QAAQ,SAAiB;EACxB,MAAM,QAAQ,SAAS;EAEvB,IAAI,UAAU,QACZ,MAAM,IAAI,MAAM,wBAAwB,KAAK,QAAQ,MAAM;EAG7D,OAAO,mBAAmB,KAAK;CACjC,CACF;CAGA,OAAO,GAAG,aAAa,SAFA,iBAAiB,MAAM,KAAK;AAGrD;;;;;AAMA,MAAa,iBACX,YACA,OACA,OACA,GAAG,CAAC,YAIJ,aACE,YACA,MAAM,QACN,MAAM,MACN,MACF"}
@@ -0,0 +1,22 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_defineRoute = require('./defineRoute.cjs');
3
+ let zod_mini = require("zod/mini");
4
+
5
+ //#region src/demo.ts
6
+ /** REST contract of the `/api/demo` routes (cloud only). */
7
+ const demoContract = require_defineRoute.defineRouteGroup({
8
+ prefix: "/api/demo",
9
+ tag: "Demo",
10
+ routes: { getDemoSession: require_defineRoute.defineRoute({
11
+ method: "GET",
12
+ path: "/session",
13
+ summary: "Sign the browser into the shared read-only demo account",
14
+ schemas: {
15
+ /** Sets the demo session cookie. */
16
+ response: { 200: zod_mini.z.object({ ok: zod_mini.z.boolean() }) } }
17
+ }) }
18
+ });
19
+
20
+ //#endregion
21
+ exports.demoContract = demoContract;
22
+ //# sourceMappingURL=demo.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.cjs","names":["defineRouteGroup","defineRoute","z"],"sources":["../../src/demo.ts"],"sourcesContent":["import { z } from 'zod/mini';\nimport { defineRoute, defineRouteGroup } from './defineRoute';\n\n/** REST contract of the `/api/demo` routes (cloud only). */\nexport const demoContract = defineRouteGroup({\n prefix: '/api/demo',\n tag: 'Demo',\n routes: {\n getDemoSession: defineRoute({\n method: 'GET',\n path: '/session',\n summary: 'Sign the browser into the shared read-only demo account',\n schemas: {\n /** Sets the demo session cookie. */\n response: { 200: z.object({ ok: z.boolean() }) },\n },\n }),\n },\n});\n\n/** Route definitions of the `/api/demo` group, by name. */\nexport type DemoRoutes = (typeof demoContract)['routes'];\n\nexport type GetDemoSessionResult = { ok: boolean };\n"],"mappings":";;;;;;AAIA,MAAa,eAAeA,qCAAiB;CAC3C,QAAQ;CACR,KAAK;CACL,QAAQ,EACN,gBAAgBC,gCAAY;EAC1B,QAAQ;EACR,MAAM;EACN,SAAS;EACT,SAAS;;AAEP,UAAU,EAAE,KAAKC,WAAE,OAAO,EAAE,IAAIA,WAAE,QAAQ,EAAE,CAAC,EAAE,EACjD;CACF,CAAC,EACH;AACF,CAAC"}