@lovrozagar/honey 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1596 -6
- package/dist/accepts.d.ts +6 -0
- package/dist/accepts.d.ts.map +1 -0
- package/dist/body-limit.d.ts +22 -0
- package/dist/body-limit.d.ts.map +1 -0
- package/dist/build/index.d.ts +42 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/client/error.d.ts +14 -0
- package/dist/client/error.d.ts.map +1 -0
- package/dist/client/http.d.ts +88 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/index.d.ts +22 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/sdk.d.ts +34 -0
- package/dist/client/sdk.d.ts.map +1 -0
- package/dist/client/sse.d.ts +10 -0
- package/dist/client/sse.d.ts.map +1 -0
- package/dist/client/types.d.ts +124 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/ws.d.ts +15 -0
- package/dist/client/ws.d.ts.map +1 -0
- package/dist/client-mcp/server.d.ts +10 -0
- package/dist/client-mcp/server.d.ts.map +1 -0
- package/dist/client-mcp/types.d.ts +16 -0
- package/dist/client-mcp/types.d.ts.map +1 -0
- package/dist/cloudflare/realtime.d.ts +30 -0
- package/dist/cloudflare/realtime.d.ts.map +1 -0
- package/dist/codegen-go-cli.d.ts +22 -0
- package/dist/codegen-go-cli.d.ts.map +1 -0
- package/dist/codegen-go.d.ts +29 -0
- package/dist/codegen-go.d.ts.map +1 -0
- package/dist/codegen-hash.d.ts +3 -0
- package/dist/codegen-hash.d.ts.map +1 -0
- package/dist/codegen-ir.d.ts +123 -0
- package/dist/codegen-ir.d.ts.map +1 -0
- package/dist/codegen-loaders.d.ts +12 -0
- package/dist/codegen-loaders.d.ts.map +1 -0
- package/dist/codegen-mcp.d.ts +13 -0
- package/dist/codegen-mcp.d.ts.map +1 -0
- package/dist/codegen-python.d.ts +21 -0
- package/dist/codegen-python.d.ts.map +1 -0
- package/dist/codegen-rust.d.ts +18 -0
- package/dist/codegen-rust.d.ts.map +1 -0
- package/dist/codegen-sanitize.d.ts +3 -0
- package/dist/codegen-sanitize.d.ts.map +1 -0
- package/dist/codegen-schema-naming.d.ts +22 -0
- package/dist/codegen-schema-naming.d.ts.map +1 -0
- package/dist/codegen.d.ts +178 -0
- package/dist/codegen.d.ts.map +1 -0
- package/dist/context.d.ts +56 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/cookie-sign.d.ts +3 -0
- package/dist/cookie-sign.d.ts.map +1 -0
- package/dist/cookie.d.ts +12 -0
- package/dist/cookie.d.ts.map +1 -0
- package/dist/cors.d.ts +13 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/crypto.d.ts +2 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/csrf.d.ts +9 -0
- package/dist/csrf.d.ts.map +1 -0
- package/dist/curl-logger.d.ts +33 -0
- package/dist/curl-logger.d.ts.map +1 -0
- package/dist/detect-runtime.d.ts +16 -0
- package/dist/detect-runtime.d.ts.map +1 -0
- package/dist/error.d.ts +21 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/etag.d.ts +9 -0
- package/dist/etag.d.ts.map +1 -0
- package/dist/feature-load.d.ts +3 -0
- package/dist/feature-load.d.ts.map +1 -0
- package/dist/go-type-emitter.d.ts +33 -0
- package/dist/go-type-emitter.d.ts.map +1 -0
- package/dist/honey-response.d.ts +82 -0
- package/dist/honey-response.d.ts.map +1 -0
- package/dist/i18n-slot.d.ts +7 -0
- package/dist/i18n-slot.d.ts.map +1 -0
- package/dist/i18n.d.ts +26 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/index.d.ts +470 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/init.d.ts +7 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/input.d.ts +6 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/ip-restrict.d.ts +12 -0
- package/dist/ip-restrict.d.ts.map +1 -0
- package/dist/logger.d.ts +45 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/meta-spec.d.ts +81 -0
- package/dist/meta-spec.d.ts.map +1 -0
- package/dist/middleware.d.ts +60 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/node-request.d.ts +59 -0
- package/dist/node-request.d.ts.map +1 -0
- package/dist/node.d.ts +13 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/openapi/register.d.ts +3 -0
- package/dist/openapi/register.d.ts.map +1 -0
- package/dist/openapi/scalar.d.ts +12 -0
- package/dist/openapi/scalar.d.ts.map +1 -0
- package/dist/openapi/spec-factory.d.ts +31 -0
- package/dist/openapi/spec-factory.d.ts.map +1 -0
- package/dist/openapi/spec.d.ts +19 -0
- package/dist/openapi/spec.d.ts.map +1 -0
- package/dist/openapi/swagger.d.ts +12 -0
- package/dist/openapi/swagger.d.ts.map +1 -0
- package/dist/plugin.d.ts +167 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/powered-by.d.ts +7 -0
- package/dist/powered-by.d.ts.map +1 -0
- package/dist/pretty-json.d.ts +10 -0
- package/dist/pretty-json.d.ts.map +1 -0
- package/dist/proxy.d.ts +51 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/python-type-emitter.d.ts +11 -0
- package/dist/python-type-emitter.d.ts.map +1 -0
- package/dist/realtime/buffer.d.ts +18 -0
- package/dist/realtime/buffer.d.ts.map +1 -0
- package/dist/realtime/bus.d.ts +11 -0
- package/dist/realtime/bus.d.ts.map +1 -0
- package/dist/realtime/longpoll.d.ts +23 -0
- package/dist/realtime/longpoll.d.ts.map +1 -0
- package/dist/realtime/protocol.d.ts +50 -0
- package/dist/realtime/protocol.d.ts.map +1 -0
- package/dist/realtime/route.d.ts +42 -0
- package/dist/realtime/route.d.ts.map +1 -0
- package/dist/realtime/runtime.d.ts +74 -0
- package/dist/realtime/runtime.d.ts.map +1 -0
- package/dist/request-id.d.ts +12 -0
- package/dist/request-id.d.ts.map +1 -0
- package/dist/request-to-curl.d.ts +9 -0
- package/dist/request-to-curl.d.ts.map +1 -0
- package/dist/response.d.ts +57 -0
- package/dist/response.d.ts.map +1 -0
- package/dist/rust-type-emitter.d.ts +32 -0
- package/dist/rust-type-emitter.d.ts.map +1 -0
- package/dist/secure-headers.d.ts +16 -0
- package/dist/secure-headers.d.ts.map +1 -0
- package/dist/serve-register.d.ts +2 -0
- package/dist/serve-register.d.ts.map +1 -0
- package/dist/serve-slot.d.ts +6 -0
- package/dist/serve-slot.d.ts.map +1 -0
- package/dist/serve.d.ts +21 -0
- package/dist/serve.d.ts.map +1 -0
- package/dist/server-timing.d.ts +9 -0
- package/dist/server-timing.d.ts.map +1 -0
- package/dist/static.d.ts +12 -0
- package/dist/static.d.ts.map +1 -0
- package/dist/telemetry/otel.d.ts +59 -0
- package/dist/telemetry/otel.d.ts.map +1 -0
- package/dist/testing.d.ts +24 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/timeout.d.ts +7 -0
- package/dist/timeout.d.ts.map +1 -0
- package/dist/tree.d.ts +90 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/ts-type-emitter.d.ts +4 -0
- package/dist/ts-type-emitter.d.ts.map +1 -0
- package/dist/type-emitter.d.ts +8 -0
- package/dist/type-emitter.d.ts.map +1 -0
- package/dist/type-extractor.d.ts +39 -0
- package/dist/type-extractor.d.ts.map +1 -0
- package/dist/types.d.ts +451 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/validation.d.ts +18 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/ws/bun.d.ts +28 -0
- package/dist/ws/bun.d.ts.map +1 -0
- package/dist/ws/cloudflare.d.ts +55 -0
- package/dist/ws/cloudflare.d.ts.map +1 -0
- package/dist/ws/deno.d.ts +13 -0
- package/dist/ws/deno.d.ts.map +1 -0
- package/dist/ws/node.d.ts +10 -0
- package/dist/ws/node.d.ts.map +1 -0
- package/dist/yaml.d.ts +4 -0
- package/dist/yaml.d.ts.map +1 -0
- package/docs/api-ref/go.md +82 -82
- package/docs/api-ref/python.md +82 -82
- package/docs/api-ref/rust.md +82 -82
- package/docs/api-ref/typescript.md +82 -82
- package/docs/invalidate-spec.md +13 -13
- package/docs/meta-spec.md +513 -0
- package/docs/packaging.md +85 -0
- package/docs/sdk.md +87 -73
- package/package.json +195 -51
- package/src/body-limit.ts +2 -1
- package/src/build/index.ts +2 -9
- package/src/cli.ts +2 -3
- package/src/client/http.ts +204 -223
- package/src/client/index.ts +6 -14
- package/src/client/sdk.ts +24 -17
- package/src/client/types.ts +4 -9
- package/src/client/ws.ts +3 -5
- package/src/client-mcp/server.ts +1 -4
- package/src/cloudflare/realtime.ts +8 -10
- package/src/codegen-go-cli.ts +74 -67
- package/src/codegen-go.ts +71 -51
- package/src/codegen-ir.ts +16 -27
- package/src/codegen-loaders.ts +5 -8
- package/src/codegen-mcp.ts +9 -27
- package/src/codegen-python.ts +47 -27
- package/src/codegen-rust.ts +110 -66
- package/src/codegen-sanitize.ts +1 -7
- package/src/codegen-schema-naming.ts +8 -2
- package/src/codegen.ts +299 -196
- package/src/context.ts +91 -95
- package/src/cookie-sign.ts +5 -13
- package/src/cookie.ts +1 -2
- package/src/cors.ts +4 -6
- package/src/crypto.ts +1 -4
- package/src/csrf.ts +3 -3
- package/src/curl-logger.ts +14 -32
- package/src/detect-runtime.ts +1 -3
- package/src/errors.ts +1 -3
- package/src/etag.ts +3 -4
- package/src/go-type-emitter.ts +45 -40
- package/src/honey-response.ts +1 -3
- package/src/i18n.ts +3 -12
- package/src/index.ts +1168 -1412
- package/src/ip-restrict.ts +2 -1
- package/src/logger.ts +13 -13
- package/src/meta-spec.ts +0 -0
- package/src/middleware.ts +111 -79
- package/src/node-request.ts +2 -1
- package/src/node.ts +9 -10
- package/src/openapi/register.ts +1 -2
- package/src/openapi/scalar.ts +9 -9
- package/src/openapi/spec-factory.ts +2 -2
- package/src/openapi/spec.ts +26 -19
- package/src/openapi/swagger.ts +9 -9
- package/src/plugin.ts +226 -256
- package/src/powered-by.ts +2 -1
- package/src/pretty-json.ts +2 -1
- package/src/proxy.ts +1 -3
- package/src/python-type-emitter.ts +37 -12
- package/src/realtime/route.ts +1 -1
- package/src/realtime/runtime.ts +9 -12
- package/src/request-id.ts +3 -4
- package/src/request-to-curl.ts +1 -4
- package/src/response.ts +150 -199
- package/src/rust-type-emitter.ts +66 -25
- package/src/secure-headers.ts +2 -1
- package/src/serve.ts +3 -12
- package/src/server-timing.ts +2 -1
- package/src/static.ts +3 -4
- package/src/telemetry/otel.ts +1 -6
- package/src/testing.ts +2 -11
- package/src/timeout.ts +2 -1
- package/src/tree.ts +12 -27
- package/src/ts-type-emitter.ts +71 -15
- package/src/type-emitter.ts +226 -237
- package/src/type-extractor.ts +260 -334
- package/src/types.ts +168 -68
- package/src/validation.ts +7 -30
- package/src/ws/bun.ts +2 -9
- package/src/ws/cloudflare.ts +13 -16
- package/src/ws/deno.ts +31 -40
- package/src/ws/node.ts +4 -19
package/src/go-type-emitter.ts
CHANGED
|
@@ -2,17 +2,36 @@ import { schemaToIR } from "./codegen-ir.ts"
|
|
|
2
2
|
import type { IRSchema } from "./codegen-ir.ts"
|
|
3
3
|
|
|
4
4
|
export const GO_KEYWORDS = new Set([
|
|
5
|
-
"break",
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"
|
|
5
|
+
"break",
|
|
6
|
+
"case",
|
|
7
|
+
"chan",
|
|
8
|
+
"const",
|
|
9
|
+
"continue",
|
|
10
|
+
"default",
|
|
11
|
+
"defer",
|
|
12
|
+
"else",
|
|
13
|
+
"fallthrough",
|
|
14
|
+
"for",
|
|
15
|
+
"func",
|
|
16
|
+
"go",
|
|
17
|
+
"goto",
|
|
18
|
+
"if",
|
|
19
|
+
"import",
|
|
20
|
+
"interface",
|
|
21
|
+
"map",
|
|
22
|
+
"package",
|
|
23
|
+
"range",
|
|
24
|
+
"return",
|
|
25
|
+
"select",
|
|
26
|
+
"struct",
|
|
27
|
+
"switch",
|
|
28
|
+
"type",
|
|
29
|
+
"var",
|
|
9
30
|
])
|
|
10
31
|
|
|
11
32
|
/** Converts a string to PascalCase from kebab-case, snake_case, dotted, or camelCase. */
|
|
12
33
|
export function goPascal(name: string): string {
|
|
13
|
-
return name
|
|
14
|
-
.replace(/[-_.](.)/g, (_, c: string) => c.toUpperCase())
|
|
15
|
-
.replace(/^(.)/, (_, c: string) => c.toUpperCase())
|
|
34
|
+
return name.replace(/[-_.](.)/g, (_, c: string) => c.toUpperCase()).replace(/^(.)/, (_, c: string) => c.toUpperCase())
|
|
16
35
|
}
|
|
17
36
|
|
|
18
37
|
/**
|
|
@@ -101,11 +120,16 @@ function renderHoistedIntEnum(typeName: string, enumVals: unknown[]): string {
|
|
|
101
120
|
|
|
102
121
|
function primitiveFor(t: string | undefined): string | null {
|
|
103
122
|
switch (t) {
|
|
104
|
-
case "string":
|
|
105
|
-
|
|
106
|
-
case "
|
|
107
|
-
|
|
108
|
-
|
|
123
|
+
case "string":
|
|
124
|
+
return "string"
|
|
125
|
+
case "integer":
|
|
126
|
+
return "int64"
|
|
127
|
+
case "number":
|
|
128
|
+
return "float64"
|
|
129
|
+
case "boolean":
|
|
130
|
+
return "bool"
|
|
131
|
+
default:
|
|
132
|
+
return null
|
|
109
133
|
}
|
|
110
134
|
}
|
|
111
135
|
|
|
@@ -140,7 +164,8 @@ export function irRenderUse(ir: IRSchema, ctx: RenderUseCtx, depth = 0): string
|
|
|
140
164
|
innerStr.startsWith("*") ||
|
|
141
165
|
innerStr.startsWith("[]") ||
|
|
142
166
|
innerStr.startsWith("map[")
|
|
143
|
-
)
|
|
167
|
+
)
|
|
168
|
+
return innerStr
|
|
144
169
|
return `*${innerStr}`
|
|
145
170
|
}
|
|
146
171
|
|
|
@@ -209,11 +234,7 @@ export function irRenderUse(ir: IRSchema, ctx: RenderUseCtx, depth = 0): string
|
|
|
209
234
|
}
|
|
210
235
|
}
|
|
211
236
|
|
|
212
|
-
function irRenderAnonStruct(
|
|
213
|
-
ir: Extract<IRSchema, { kind: "object" }>,
|
|
214
|
-
ctx: RenderUseCtx,
|
|
215
|
-
depth: number,
|
|
216
|
-
): string {
|
|
237
|
+
function irRenderAnonStruct(ir: Extract<IRSchema, { kind: "object" }>, ctx: RenderUseCtx, depth: number): string {
|
|
217
238
|
const sorted = ir.fields.slice().sort((a, b) => a.name.localeCompare(b.name))
|
|
218
239
|
const lines: string[] = []
|
|
219
240
|
lines.push(`struct {`)
|
|
@@ -228,10 +249,7 @@ function irRenderAnonStruct(
|
|
|
228
249
|
parentName: childParent,
|
|
229
250
|
}
|
|
230
251
|
const fieldType = irRenderUse(field.schema, childCtx, depth + 1)
|
|
231
|
-
const alreadyNilable =
|
|
232
|
-
fieldType.startsWith("*") ||
|
|
233
|
-
fieldType.startsWith("[]") ||
|
|
234
|
-
fieldType.startsWith("map[")
|
|
252
|
+
const alreadyNilable = fieldType.startsWith("*") || fieldType.startsWith("[]") || fieldType.startsWith("map[")
|
|
235
253
|
const finalType = !field.required && !alreadyNilable ? `*${fieldType}` : fieldType
|
|
236
254
|
const tag = goTag(field.name, !field.required)
|
|
237
255
|
lines.push(`\t${fieldGoName} ${finalType} ${tag}`)
|
|
@@ -264,10 +282,7 @@ export function irRenderTopLevel(
|
|
|
264
282
|
const rawType = raw?.type as string | undefined
|
|
265
283
|
const base = rawType ? (primitiveFor(rawType) ?? "string") : constBaseType(ir.value)
|
|
266
284
|
const val = typeof ir.value === "string" ? JSON.stringify(ir.value) : String(ir.value)
|
|
267
|
-
return [
|
|
268
|
-
`type ${typeName} ${base}`,
|
|
269
|
-
`const ${typeName}Value ${typeName} = ${val}`,
|
|
270
|
-
].join("\n")
|
|
285
|
+
return [`type ${typeName} ${base}`, `const ${typeName}Value ${typeName} = ${val}`].join("\n")
|
|
271
286
|
}
|
|
272
287
|
|
|
273
288
|
if (ir.kind === "allOf") {
|
|
@@ -288,8 +303,7 @@ export function irRenderTopLevel(
|
|
|
288
303
|
fieldName: field.name,
|
|
289
304
|
parentName: typeName,
|
|
290
305
|
})
|
|
291
|
-
const alreadyNilable =
|
|
292
|
-
ft.startsWith("*") || ft.startsWith("[]") || ft.startsWith("map[")
|
|
306
|
+
const alreadyNilable = ft.startsWith("*") || ft.startsWith("[]") || ft.startsWith("map[")
|
|
293
307
|
const finalType = !field.required && !alreadyNilable ? `*${ft}` : ft
|
|
294
308
|
l.push(`\t${fieldGoName} ${finalType} ${goTag(field.name, !field.required)}`)
|
|
295
309
|
}
|
|
@@ -337,8 +351,7 @@ export function irRenderTopLevel(
|
|
|
337
351
|
fieldName: field.name,
|
|
338
352
|
parentName: typeName,
|
|
339
353
|
})
|
|
340
|
-
const alreadyNilable =
|
|
341
|
-
ft.startsWith("*") || ft.startsWith("[]") || ft.startsWith("map[")
|
|
354
|
+
const alreadyNilable = ft.startsWith("*") || ft.startsWith("[]") || ft.startsWith("map[")
|
|
342
355
|
let finalType = !field.required && !alreadyNilable ? `*${ft}` : ft
|
|
343
356
|
/* self-ref → pointer (circular) */
|
|
344
357
|
if (circularRefs.has(ft.replace(/^\*/, "")) && !finalType.startsWith("*")) {
|
|
@@ -387,18 +400,10 @@ export function irRenderTopLevel(
|
|
|
387
400
|
return `type ${typeName} = ${aliased}`
|
|
388
401
|
}
|
|
389
402
|
|
|
390
|
-
export function renderUse(
|
|
391
|
-
schema: Record<string, unknown> | undefined,
|
|
392
|
-
ctx: RenderUseCtx,
|
|
393
|
-
): string {
|
|
403
|
+
export function renderUse(schema: Record<string, unknown> | undefined, ctx: RenderUseCtx): string {
|
|
394
404
|
return irRenderUse(schemaToIR(schema), ctx, ctx.depth ?? 0)
|
|
395
405
|
}
|
|
396
406
|
|
|
397
|
-
export function renderTopLevel(
|
|
398
|
-
name: string,
|
|
399
|
-
schema: Record<string, unknown>,
|
|
400
|
-
decls: Map<string, string>,
|
|
401
|
-
): string {
|
|
407
|
+
export function renderTopLevel(name: string, schema: Record<string, unknown>, decls: Map<string, string>): string {
|
|
402
408
|
return irRenderTopLevel(name, schemaToIR(schema), decls, schema)
|
|
403
409
|
}
|
|
404
|
-
|
package/src/honey-response.ts
CHANGED
|
@@ -306,9 +306,7 @@ export function replaceResponse(
|
|
|
306
306
|
})
|
|
307
307
|
}
|
|
308
308
|
|
|
309
|
-
function headersToInit(
|
|
310
|
-
headers: Headers | HoneyOutHeaders | Record<string, string | string[]>,
|
|
311
|
-
): HeadersInit {
|
|
309
|
+
function headersToInit(headers: Headers | HoneyOutHeaders | Record<string, string | string[]>): HeadersInit {
|
|
312
310
|
if (headers instanceof HoneyOutHeaders) return headers.toRecord() as HeadersInit
|
|
313
311
|
if (headers instanceof Headers) return headers
|
|
314
312
|
return headers as HeadersInit
|
package/src/i18n.ts
CHANGED
|
@@ -148,11 +148,7 @@ function tokenize(message: string): ParsedToken[] {
|
|
|
148
148
|
return tokens
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
function resolveToken(
|
|
152
|
-
token: ParsedToken,
|
|
153
|
-
values: Record<string, unknown>,
|
|
154
|
-
locale?: string,
|
|
155
|
-
): string {
|
|
151
|
+
function resolveToken(token: ParsedToken, values: Record<string, unknown>, locale?: string): string {
|
|
156
152
|
if (typeof token === "string") return token
|
|
157
153
|
|
|
158
154
|
if (token.type === "simple") {
|
|
@@ -177,8 +173,7 @@ function resolveToken(
|
|
|
177
173
|
const num = Number(val ?? 0)
|
|
178
174
|
const exactKey = `=${num}`
|
|
179
175
|
const category = getPluralCategory(num)
|
|
180
|
-
const template =
|
|
181
|
-
token.branches[exactKey] ?? token.branches[category] ?? token.branches["other"] ?? ""
|
|
176
|
+
const template = token.branches[exactKey] ?? token.branches[category] ?? token.branches["other"] ?? ""
|
|
182
177
|
const resolved = template.replace(/#/g, String(num))
|
|
183
178
|
return interpolate(resolved, values, locale)
|
|
184
179
|
}
|
|
@@ -193,11 +188,7 @@ function resolveToken(
|
|
|
193
188
|
* ICU MessageFormat interpolation.
|
|
194
189
|
* Supports: {var}, {var, plural, one{...} other{...}}, {var, select, ...}, {var, number}
|
|
195
190
|
*/
|
|
196
|
-
export function interpolate(
|
|
197
|
-
template: string,
|
|
198
|
-
vars: Record<string, unknown>,
|
|
199
|
-
locale?: string,
|
|
200
|
-
): string {
|
|
191
|
+
export function interpolate(template: string, vars: Record<string, unknown>, locale?: string): string {
|
|
201
192
|
if (!template) return template
|
|
202
193
|
const tokens = tokenize(template)
|
|
203
194
|
return tokens.map((t) => resolveToken(t, vars, locale)).join("")
|