@sdk-it/hono 0.40.0 → 0.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js
CHANGED
|
@@ -277,7 +277,7 @@ function getHeaderKeys(headersNode, deriver) {
|
|
|
277
277
|
(name) => name.includes("-") ? [`'${name}'`, name] : [name]
|
|
278
278
|
);
|
|
279
279
|
}
|
|
280
|
-
var newResponse = (
|
|
280
|
+
var newResponse = (_handler, deriver, node) => {
|
|
281
281
|
if (!ts2.isNewExpression(node)) {
|
|
282
282
|
return [];
|
|
283
283
|
}
|
|
@@ -350,7 +350,7 @@ function defaultResponseAnalyzer(handler, deriver) {
|
|
|
350
350
|
visit(handler.body);
|
|
351
351
|
return responsesList;
|
|
352
352
|
}
|
|
353
|
-
function streamText(
|
|
353
|
+
function streamText(_handler, _deriver) {
|
|
354
354
|
return [
|
|
355
355
|
{
|
|
356
356
|
contentType: "text/plain",
|
|
@@ -364,7 +364,7 @@ function streamText(handler, deriver) {
|
|
|
364
364
|
}
|
|
365
365
|
];
|
|
366
366
|
}
|
|
367
|
-
function stream(
|
|
367
|
+
function stream(_handler, _deriver) {
|
|
368
368
|
return [
|
|
369
369
|
{
|
|
370
370
|
contentType: "application/octet-stream",
|
|
@@ -378,7 +378,7 @@ function stream(handler, deriver) {
|
|
|
378
378
|
}
|
|
379
379
|
];
|
|
380
380
|
}
|
|
381
|
-
function streamSSE(
|
|
381
|
+
function streamSSE(_handler, _deriver) {
|
|
382
382
|
return [
|
|
383
383
|
{
|
|
384
384
|
contentType: "text/event-stream",
|
|
@@ -392,7 +392,7 @@ function streamSSE(handler, deriver) {
|
|
|
392
392
|
}
|
|
393
393
|
];
|
|
394
394
|
}
|
|
395
|
-
var httpException = (
|
|
395
|
+
var httpException = (_handler, deriver, node) => {
|
|
396
396
|
if (ts2.isNewExpression(node)) {
|
|
397
397
|
const [status, options] = node.arguments ?? [];
|
|
398
398
|
return [
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/lib/response-analyzer.ts", "../src/lib/constant-value.ts"],
|
|
4
|
-
"sourcesContent": ["import ts from 'typescript';\n\nimport {\n $types,\n type NaunceResponseAnalyzerFn,\n type ResponseItem,\n type TypeDeriver,\n} from '@sdk-it/core';\nimport { getConstantValue } from './constant-value.js';\n\nconst handlerVisitor: (\n on: (\n node: ts.Node | undefined,\n statusCode: ts.Node | undefined,\n headers: ts.Node | undefined,\n contentType: string,\n ) => void,\n contextVarName: string,\n) => ts.Visitor = (callback, contextVarName) => {\n return (node: ts.Node) => {\n if (ts.isReturnStatement(node) && node.expression) {\n if (ts.isCallExpression(node.expression)) {\n if (ts.isPropertyAccessExpression(node.expression.expression)) {\n const propAccess = node.expression.expression;\n if (\n ts.isIdentifier(propAccess.expression) &&\n propAccess.expression.text === contextVarName\n ) {\n const [body, statusCode, headers] = node.expression.arguments;\n let contentType = 'application/json';\n const callerMethod = propAccess.name.text;\n if (callerMethod === 'body') {\n contentType = 'application/octet-stream';\n }\n if (!body) {\n contentType = 'empty';\n }\n callback(body, statusCode, headers, contentType);\n }\n }\n // if (ts.isIdentifier(node.expression.expression)) {\n // console.log('streamText');\n // if (node.expression.expression.text === 'streamText') {\n // callback(undefined, undefined, undefined, 'text/plain');\n // }\n // }\n }\n }\n return ts.forEachChild(node, handlerVisitor(callback, contextVarName));\n };\n};\n\nfunction resolveStatusCode(node: ts.Node) {\n if (ts.isNumericLiteral(node)) {\n return node.text;\n }\n throw new Error(`Could not resolve status code`);\n}\n\nfunction normalizeContentType(value: string | undefined) {\n if (!value) {\n return undefined;\n }\n return value.split(';')[0]?.trim();\n}\n\nfunction getPropertyNameText(\n name: ts.PropertyName,\n checker: ts.TypeChecker,\n): string | undefined {\n if (ts.isIdentifier(name)) {\n return name.text;\n }\n if (ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n if (ts.isComputedPropertyName(name)) {\n const expression = name.expression;\n if (ts.isStringLiteral(expression) || ts.isNumericLiteral(expression)) {\n return expression.text;\n }\n const value = getConstantValue(checker, expression);\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n }\n return undefined;\n}\n\nfunction resolveHeadersObject(\n headersNode: ts.Node | undefined,\n checker: ts.TypeChecker,\n): ts.ObjectLiteralExpression | undefined {\n if (!headersNode) {\n return undefined;\n }\n const unwrapObjectLiteral = (\n expression: ts.Expression,\n ): ts.ObjectLiteralExpression | undefined => {\n if (ts.isObjectLiteralExpression(expression)) {\n return expression;\n }\n if (\n ts.isParenthesizedExpression(expression) &&\n ts.isObjectLiteralExpression(expression.expression)\n ) {\n return expression.expression;\n }\n return undefined;\n };\n if (ts.isObjectLiteralExpression(headersNode)) {\n return headersNode;\n }\n if (ts.isAsExpression(headersNode)) {\n return resolveHeadersObject(headersNode.expression, checker);\n }\n if (ts.isTypeAssertionExpression(headersNode)) {\n return resolveHeadersObject(headersNode.expression, checker);\n }\n if (ts.isParenthesizedExpression(headersNode)) {\n return resolveHeadersObject(headersNode.expression, checker);\n }\n if (ts.isNewExpression(headersNode)) {\n const exprName = headersNode.expression.getText();\n if (exprName === 'Headers') {\n const [init] = headersNode.arguments ?? [];\n return init ? resolveHeadersObject(init, checker) : undefined;\n }\n }\n if (ts.isCallExpression(headersNode)) {\n let callee: ts.Expression = headersNode.expression;\n if (ts.isParenthesizedExpression(callee)) {\n callee = callee.expression;\n }\n if (ts.isArrowFunction(callee) || ts.isFunctionExpression(callee)) {\n if (ts.isExpression(callee.body)) {\n const bodyLiteral = unwrapObjectLiteral(callee.body);\n if (bodyLiteral) {\n return bodyLiteral;\n }\n }\n if (ts.isBlock(callee.body)) {\n for (const statement of callee.body.statements) {\n if (\n ts.isReturnStatement(statement) &&\n statement.expression &&\n unwrapObjectLiteral(statement.expression)\n ) {\n return unwrapObjectLiteral(statement.expression);\n }\n }\n }\n }\n }\n if (ts.isShorthandPropertyAssignment(headersNode)) {\n const symbol = checker.getShorthandAssignmentValueSymbol(headersNode);\n const decl = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n if (decl && ts.isVariableDeclaration(decl) && decl.initializer) {\n return resolveHeadersObject(decl.initializer, checker);\n }\n }\n if (ts.isIdentifier(headersNode)) {\n const symbol = checker.getSymbolAtLocation(headersNode);\n const decl = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n if (decl && ts.isVariableDeclaration(decl) && decl.initializer) {\n return resolveHeadersObject(decl.initializer, checker);\n }\n }\n return undefined;\n}\n\nfunction getHeaderValue(\n headersNode: ts.Node | undefined,\n headerName: string,\n checker: ts.TypeChecker,\n) {\n const headersObject = resolveHeadersObject(headersNode, checker);\n if (!headersObject) {\n return undefined;\n }\n for (const prop of headersObject.properties) {\n if (!ts.isPropertyAssignment(prop)) {\n continue;\n }\n const key = getPropertyNameText(prop.name, checker);\n if (!key || key.toLowerCase() !== headerName.toLowerCase()) {\n continue;\n }\n const value = getConstantValue(checker, prop.initializer);\n return typeof value === 'string' ? value : undefined;\n }\n return undefined;\n}\n\nfunction hasHeaderKey(\n headersNode: ts.Node | undefined,\n headerName: string,\n checker: ts.TypeChecker,\n) {\n const headersObject = resolveHeadersObject(headersNode, checker);\n if (!headersObject) {\n return false;\n }\n for (const prop of headersObject.properties) {\n if (!ts.isPropertyAssignment(prop)) {\n continue;\n }\n const key = getPropertyNameText(prop.name, checker);\n if (key && key.toLowerCase() === headerName.toLowerCase()) {\n return true;\n }\n }\n return false;\n}\n\nfunction isJsonContentType(contentType: string) {\n return contentType.endsWith('/json') || contentType.endsWith('+json');\n}\n\nfunction isTextContentTypeValue(contentType: string) {\n return contentType.startsWith('text/');\n}\n\nfunction inferContentType(\n body: ts.Node | undefined,\n headers: ts.Node | undefined,\n defaultContentType: string,\n checker: ts.TypeChecker,\n) {\n if (!body) {\n return 'empty';\n }\n const headerContentType = normalizeContentType(\n getHeaderValue(headers, 'Content-Type', checker),\n );\n if (headerContentType) {\n return headerContentType;\n }\n if (hasHeaderKey(headers, 'Content-Disposition', checker)) {\n return 'application/octet-stream';\n }\n return defaultContentType;\n}\n\nfunction getHeaderKeys(headersNode: ts.Node | undefined, deriver: TypeDeriver) {\n if (!headersNode) {\n return [];\n }\n const resolved = resolveHeadersObject(headersNode, deriver.checker);\n if (resolved) {\n return Object.keys(deriver.serializeNode(resolved));\n }\n const type = deriver.checker.getTypeAtLocation(headersNode);\n const names = deriver.checker\n .getPropertiesOfType(type)\n .map((prop) => prop.name);\n if (!names.length) {\n return [];\n }\n const sorted = [...names].sort((a, b) => a.localeCompare(b));\n return sorted.flatMap((name) =>\n name.includes('-') ? [`'${name}'`, name] : [name],\n );\n}\n\nexport const newResponse: NaunceResponseAnalyzerFn = (\n handler,\n deriver,\n node,\n) => {\n if (!ts.isNewExpression(node)) {\n return [];\n }\n const exprName = node.expression.getText();\n if (exprName !== 'Response') {\n return [];\n }\n const [body, init] = node.arguments ?? [];\n let statusNode: ts.Node | undefined;\n let headersNode: ts.Node | undefined;\n if (init && ts.isObjectLiteralExpression(init)) {\n for (const prop of init.properties) {\n if (!ts.isPropertyAssignment(prop)) {\n if (ts.isShorthandPropertyAssignment(prop)) {\n const key = prop.name.text;\n if (key === 'headers') {\n headersNode = prop;\n }\n }\n continue;\n }\n const key = getPropertyNameText(prop.name, deriver.checker);\n if (!key) {\n continue;\n }\n if (key === 'status') {\n statusNode = prop.initializer;\n } else if (key === 'headers') {\n headersNode = prop.initializer;\n }\n }\n }\n\n const contentType = inferContentType(\n body,\n headersNode,\n 'application/octet-stream',\n deriver.checker,\n );\n\n const normalized = contentType.toLowerCase();\n const shouldSerialize =\n !!body &&\n (isJsonContentType(normalized) || isTextContentTypeValue(normalized));\n\n return [\n {\n headers: getHeaderKeys(headersNode, deriver),\n contentType,\n statusCode: statusNode ? resolveStatusCode(statusNode) : '200',\n response: shouldSerialize ? deriver.serializeNode(body) : undefined,\n },\n ];\n};\n\nexport function defaultResponseAnalyzer(\n handler: ts.ArrowFunction | ts.FunctionExpression,\n deriver: TypeDeriver,\n) {\n const responsesList: ResponseItem[] = [];\n if (!handler.parameters.length) {\n return responsesList;\n }\n const contextVarName = handler.parameters[0].name.getText();\n const visit = handlerVisitor((node, statusCode, headers, contentType) => {\n const resolvedContentType = inferContentType(\n node,\n headers,\n contentType,\n deriver.checker,\n );\n responsesList.push({\n headers: getHeaderKeys(headers, deriver),\n contentType: resolvedContentType,\n statusCode: statusCode ? resolveStatusCode(statusCode) : '200',\n response: node ? deriver.serializeNode(node) : undefined,\n });\n }, contextVarName);\n visit(handler.body);\n return responsesList;\n}\n\nexport function streamText(\n handler: ts.ArrowFunction | ts.FunctionExpression,\n deriver: TypeDeriver,\n): ResponseItem[] {\n return [\n {\n contentType: 'text/plain',\n headers: [{ 'Transfer-Encoding': ['chunked'] }],\n statusCode: '200',\n response: {\n optional: false,\n kind: 'primitive',\n [$types]: ['string'],\n },\n },\n ];\n}\n\nexport function stream(\n handler: ts.ArrowFunction | ts.FunctionExpression,\n deriver: TypeDeriver,\n): ResponseItem[] {\n return [\n {\n contentType: 'application/octet-stream',\n headers: [],\n statusCode: '200',\n response: {\n optional: false,\n kind: 'primitive',\n [$types]: ['string'],\n },\n },\n ];\n}\n\nexport function streamSSE(\n handler: ts.ArrowFunction | ts.FunctionExpression,\n deriver: TypeDeriver,\n): ResponseItem[] {\n return [\n {\n contentType: 'text/event-stream',\n headers: [],\n statusCode: '200',\n response: {\n optional: false,\n kind: 'primitive',\n [$types]: ['string'],\n },\n },\n ];\n}\n\nexport const httpException: NaunceResponseAnalyzerFn = (\n handler,\n deriver,\n node,\n) => {\n if (ts.isNewExpression(node)) {\n const [status, options] = node.arguments ?? [];\n // if (!ts.isObjectLiteralExpression(options)) {\n // return [];\n // }\n // const properties = options.properties.reduce<Record<string, string>>(\n // (acc, prop) => {\n // if (ts.isPropertyAssignment(prop)) {\n // const key = prop.name.getText();\n // if (ts.isLiteralExpression(prop.initializer)) {\n // acc[key] = prop.initializer.text;\n // } else {\n // acc[key] = prop.initializer.getText();\n // }\n // }\n // return acc;\n // },\n // {},\n // );\n return [\n {\n contentType: 'application/json',\n headers: [],\n statusCode: resolveStatusCode(status),\n response: options ? deriver.serializeNode(options) : undefined,\n },\n ];\n }\n return [];\n};\n\nexport const responseAnalyzer = {\n default: defaultResponseAnalyzer,\n streamText,\n stream,\n streamSSE,\n 'new.Response': newResponse,\n 'throw.new.HTTPException': httpException,\n};\n\nexport default responseAnalyzer;\n", "import ts from 'typescript';\n\nfunction unwrapExpression(node: ts.Expression): ts.Expression {\n let current = node;\n while (true) {\n if (ts.isAsExpression(current)) {\n current = current.expression;\n continue;\n }\n if (ts.isTypeAssertionExpression(current)) {\n current = current.expression;\n continue;\n }\n if (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n continue;\n }\n return current;\n }\n}\n\nfunction literalValueFromType(\n type: ts.Type,\n checker: ts.TypeChecker,\n): string | number | boolean | undefined {\n if (type.isStringLiteral()) {\n return type.value;\n }\n if (type.isNumberLiteral()) {\n return type.value;\n }\n if (type.flags & ts.TypeFlags.BooleanLiteral) {\n return checker.typeToString(type) === 'true';\n }\n return undefined;\n}\n\nexport function getConstantValue(\n checker: ts.TypeChecker,\n expression: ts.Expression,\n): string | number | boolean | undefined {\n const unwrapped = unwrapExpression(expression);\n\n const constant = checker.getConstantValue(\n unwrapped as\n | ts.EnumMember\n | ts.PropertyAccessExpression\n | ts.ElementAccessExpression,\n );\n if (constant !== undefined) {\n return constant;\n }\n\n if (\n ts.isStringLiteral(unwrapped) ||\n ts.isNoSubstitutionTemplateLiteral(unwrapped)\n ) {\n return unwrapped.text;\n }\n if (ts.isNumericLiteral(unwrapped)) {\n return Number(unwrapped.text);\n }\n if (unwrapped.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n if (unwrapped.kind === ts.SyntaxKind.FalseKeyword) {\n return false;\n }\n\n const type = checker.getTypeAtLocation(unwrapped);\n const literal = literalValueFromType(type, checker);\n if (literal !== undefined) {\n return literal;\n }\n if (type.isUnion()) {\n let resolved: string | number | boolean | undefined = undefined;\n for (const entry of type.types) {\n const value = literalValueFromType(entry, checker);\n if (value === undefined) {\n return undefined;\n }\n if (resolved === undefined) {\n resolved = value;\n } else if (resolved !== value) {\n return undefined;\n }\n }\n return resolved;\n }\n return undefined;\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import ts from 'typescript';\n\nimport {\n $types,\n type NaunceResponseAnalyzerFn,\n type ResponseItem,\n type TypeDeriver,\n} from '@sdk-it/core';\nimport { getConstantValue } from './constant-value.js';\n\nconst handlerVisitor: (\n on: (\n node: ts.Node | undefined,\n statusCode: ts.Node | undefined,\n headers: ts.Node | undefined,\n contentType: string,\n ) => void,\n contextVarName: string,\n) => ts.Visitor = (callback, contextVarName) => {\n return (node: ts.Node) => {\n if (ts.isReturnStatement(node) && node.expression) {\n if (ts.isCallExpression(node.expression)) {\n if (ts.isPropertyAccessExpression(node.expression.expression)) {\n const propAccess = node.expression.expression;\n if (\n ts.isIdentifier(propAccess.expression) &&\n propAccess.expression.text === contextVarName\n ) {\n const [body, statusCode, headers] = node.expression.arguments;\n let contentType = 'application/json';\n const callerMethod = propAccess.name.text;\n if (callerMethod === 'body') {\n contentType = 'application/octet-stream';\n }\n if (!body) {\n contentType = 'empty';\n }\n callback(body, statusCode, headers, contentType);\n }\n }\n // if (ts.isIdentifier(node.expression.expression)) {\n // console.log('streamText');\n // if (node.expression.expression.text === 'streamText') {\n // callback(undefined, undefined, undefined, 'text/plain');\n // }\n // }\n }\n }\n return ts.forEachChild(node, handlerVisitor(callback, contextVarName));\n };\n};\n\nfunction resolveStatusCode(node: ts.Node) {\n if (ts.isNumericLiteral(node)) {\n return node.text;\n }\n throw new Error(`Could not resolve status code`);\n}\n\nfunction normalizeContentType(value: string | undefined) {\n if (!value) {\n return undefined;\n }\n return value.split(';')[0]?.trim();\n}\n\nfunction getPropertyNameText(\n name: ts.PropertyName,\n checker: ts.TypeChecker,\n): string | undefined {\n if (ts.isIdentifier(name)) {\n return name.text;\n }\n if (ts.isStringLiteral(name) || ts.isNumericLiteral(name)) {\n return name.text;\n }\n if (ts.isComputedPropertyName(name)) {\n const expression = name.expression;\n if (ts.isStringLiteral(expression) || ts.isNumericLiteral(expression)) {\n return expression.text;\n }\n const value = getConstantValue(checker, expression);\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n }\n return undefined;\n}\n\nfunction resolveHeadersObject(\n headersNode: ts.Node | undefined,\n checker: ts.TypeChecker,\n): ts.ObjectLiteralExpression | undefined {\n if (!headersNode) {\n return undefined;\n }\n const unwrapObjectLiteral = (\n expression: ts.Expression,\n ): ts.ObjectLiteralExpression | undefined => {\n if (ts.isObjectLiteralExpression(expression)) {\n return expression;\n }\n if (\n ts.isParenthesizedExpression(expression) &&\n ts.isObjectLiteralExpression(expression.expression)\n ) {\n return expression.expression;\n }\n return undefined;\n };\n if (ts.isObjectLiteralExpression(headersNode)) {\n return headersNode;\n }\n if (ts.isAsExpression(headersNode)) {\n return resolveHeadersObject(headersNode.expression, checker);\n }\n if (ts.isTypeAssertionExpression(headersNode)) {\n return resolveHeadersObject(headersNode.expression, checker);\n }\n if (ts.isParenthesizedExpression(headersNode)) {\n return resolveHeadersObject(headersNode.expression, checker);\n }\n if (ts.isNewExpression(headersNode)) {\n const exprName = headersNode.expression.getText();\n if (exprName === 'Headers') {\n const [init] = headersNode.arguments ?? [];\n return init ? resolveHeadersObject(init, checker) : undefined;\n }\n }\n if (ts.isCallExpression(headersNode)) {\n let callee: ts.Expression = headersNode.expression;\n if (ts.isParenthesizedExpression(callee)) {\n callee = callee.expression;\n }\n if (ts.isArrowFunction(callee) || ts.isFunctionExpression(callee)) {\n if (ts.isExpression(callee.body)) {\n const bodyLiteral = unwrapObjectLiteral(callee.body);\n if (bodyLiteral) {\n return bodyLiteral;\n }\n }\n if (ts.isBlock(callee.body)) {\n for (const statement of callee.body.statements) {\n if (\n ts.isReturnStatement(statement) &&\n statement.expression &&\n unwrapObjectLiteral(statement.expression)\n ) {\n return unwrapObjectLiteral(statement.expression);\n }\n }\n }\n }\n }\n if (ts.isShorthandPropertyAssignment(headersNode)) {\n const symbol = checker.getShorthandAssignmentValueSymbol(headersNode);\n const decl = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n if (decl && ts.isVariableDeclaration(decl) && decl.initializer) {\n return resolveHeadersObject(decl.initializer, checker);\n }\n }\n if (ts.isIdentifier(headersNode)) {\n const symbol = checker.getSymbolAtLocation(headersNode);\n const decl = symbol?.valueDeclaration ?? symbol?.declarations?.[0];\n if (decl && ts.isVariableDeclaration(decl) && decl.initializer) {\n return resolveHeadersObject(decl.initializer, checker);\n }\n }\n return undefined;\n}\n\nfunction getHeaderValue(\n headersNode: ts.Node | undefined,\n headerName: string,\n checker: ts.TypeChecker,\n) {\n const headersObject = resolveHeadersObject(headersNode, checker);\n if (!headersObject) {\n return undefined;\n }\n for (const prop of headersObject.properties) {\n if (!ts.isPropertyAssignment(prop)) {\n continue;\n }\n const key = getPropertyNameText(prop.name, checker);\n if (!key || key.toLowerCase() !== headerName.toLowerCase()) {\n continue;\n }\n const value = getConstantValue(checker, prop.initializer);\n return typeof value === 'string' ? value : undefined;\n }\n return undefined;\n}\n\nfunction hasHeaderKey(\n headersNode: ts.Node | undefined,\n headerName: string,\n checker: ts.TypeChecker,\n) {\n const headersObject = resolveHeadersObject(headersNode, checker);\n if (!headersObject) {\n return false;\n }\n for (const prop of headersObject.properties) {\n if (!ts.isPropertyAssignment(prop)) {\n continue;\n }\n const key = getPropertyNameText(prop.name, checker);\n if (key && key.toLowerCase() === headerName.toLowerCase()) {\n return true;\n }\n }\n return false;\n}\n\nfunction isJsonContentType(contentType: string) {\n return contentType.endsWith('/json') || contentType.endsWith('+json');\n}\n\nfunction isTextContentTypeValue(contentType: string) {\n return contentType.startsWith('text/');\n}\n\nfunction inferContentType(\n body: ts.Node | undefined,\n headers: ts.Node | undefined,\n defaultContentType: string,\n checker: ts.TypeChecker,\n) {\n if (!body) {\n return 'empty';\n }\n const headerContentType = normalizeContentType(\n getHeaderValue(headers, 'Content-Type', checker),\n );\n if (headerContentType) {\n return headerContentType;\n }\n if (hasHeaderKey(headers, 'Content-Disposition', checker)) {\n return 'application/octet-stream';\n }\n return defaultContentType;\n}\n\nfunction getHeaderKeys(headersNode: ts.Node | undefined, deriver: TypeDeriver) {\n if (!headersNode) {\n return [];\n }\n const resolved = resolveHeadersObject(headersNode, deriver.checker);\n if (resolved) {\n return Object.keys(deriver.serializeNode(resolved));\n }\n const type = deriver.checker.getTypeAtLocation(headersNode);\n const names = deriver.checker\n .getPropertiesOfType(type)\n .map((prop) => prop.name);\n if (!names.length) {\n return [];\n }\n const sorted = [...names].sort((a, b) => a.localeCompare(b));\n return sorted.flatMap((name) =>\n name.includes('-') ? [`'${name}'`, name] : [name],\n );\n}\n\nexport const newResponse: NaunceResponseAnalyzerFn = (\n _handler,\n deriver,\n node,\n) => {\n if (!ts.isNewExpression(node)) {\n return [];\n }\n const exprName = node.expression.getText();\n if (exprName !== 'Response') {\n return [];\n }\n const [body, init] = node.arguments ?? [];\n let statusNode: ts.Node | undefined;\n let headersNode: ts.Node | undefined;\n if (init && ts.isObjectLiteralExpression(init)) {\n for (const prop of init.properties) {\n if (!ts.isPropertyAssignment(prop)) {\n if (ts.isShorthandPropertyAssignment(prop)) {\n const key = prop.name.text;\n if (key === 'headers') {\n headersNode = prop;\n }\n }\n continue;\n }\n const key = getPropertyNameText(prop.name, deriver.checker);\n if (!key) {\n continue;\n }\n if (key === 'status') {\n statusNode = prop.initializer;\n } else if (key === 'headers') {\n headersNode = prop.initializer;\n }\n }\n }\n\n const contentType = inferContentType(\n body,\n headersNode,\n 'application/octet-stream',\n deriver.checker,\n );\n\n const normalized = contentType.toLowerCase();\n const shouldSerialize =\n !!body &&\n (isJsonContentType(normalized) || isTextContentTypeValue(normalized));\n\n return [\n {\n headers: getHeaderKeys(headersNode, deriver),\n contentType,\n statusCode: statusNode ? resolveStatusCode(statusNode) : '200',\n response: shouldSerialize ? deriver.serializeNode(body) : undefined,\n },\n ];\n};\n\nexport function defaultResponseAnalyzer(\n handler: ts.ArrowFunction | ts.FunctionExpression,\n deriver: TypeDeriver,\n) {\n const responsesList: ResponseItem[] = [];\n if (!handler.parameters.length) {\n return responsesList;\n }\n const contextVarName = handler.parameters[0].name.getText();\n const visit = handlerVisitor((node, statusCode, headers, contentType) => {\n const resolvedContentType = inferContentType(\n node,\n headers,\n contentType,\n deriver.checker,\n );\n responsesList.push({\n headers: getHeaderKeys(headers, deriver),\n contentType: resolvedContentType,\n statusCode: statusCode ? resolveStatusCode(statusCode) : '200',\n response: node ? deriver.serializeNode(node) : undefined,\n });\n }, contextVarName);\n visit(handler.body);\n return responsesList;\n}\n\nexport function streamText(\n _handler: ts.ArrowFunction | ts.FunctionExpression,\n _deriver: TypeDeriver,\n): ResponseItem[] {\n return [\n {\n contentType: 'text/plain',\n headers: [{ 'Transfer-Encoding': ['chunked'] }],\n statusCode: '200',\n response: {\n optional: false,\n kind: 'primitive',\n [$types]: ['string'],\n },\n },\n ];\n}\n\nexport function stream(\n _handler: ts.ArrowFunction | ts.FunctionExpression,\n _deriver: TypeDeriver,\n): ResponseItem[] {\n return [\n {\n contentType: 'application/octet-stream',\n headers: [],\n statusCode: '200',\n response: {\n optional: false,\n kind: 'primitive',\n [$types]: ['string'],\n },\n },\n ];\n}\n\nexport function streamSSE(\n _handler: ts.ArrowFunction | ts.FunctionExpression,\n _deriver: TypeDeriver,\n): ResponseItem[] {\n return [\n {\n contentType: 'text/event-stream',\n headers: [],\n statusCode: '200',\n response: {\n optional: false,\n kind: 'primitive',\n [$types]: ['string'],\n },\n },\n ];\n}\n\nexport const httpException: NaunceResponseAnalyzerFn = (\n _handler,\n deriver,\n node,\n) => {\n if (ts.isNewExpression(node)) {\n const [status, options] = node.arguments ?? [];\n // if (!ts.isObjectLiteralExpression(options)) {\n // return [];\n // }\n // const properties = options.properties.reduce<Record<string, string>>(\n // (acc, prop) => {\n // if (ts.isPropertyAssignment(prop)) {\n // const key = prop.name.getText();\n // if (ts.isLiteralExpression(prop.initializer)) {\n // acc[key] = prop.initializer.text;\n // } else {\n // acc[key] = prop.initializer.getText();\n // }\n // }\n // return acc;\n // },\n // {},\n // );\n return [\n {\n contentType: 'application/json',\n headers: [],\n statusCode: resolveStatusCode(status),\n response: options ? deriver.serializeNode(options) : undefined,\n },\n ];\n }\n return [];\n};\n\nexport const responseAnalyzer = {\n default: defaultResponseAnalyzer,\n streamText,\n stream,\n streamSSE,\n 'new.Response': newResponse,\n 'throw.new.HTTPException': httpException,\n};\n\nexport default responseAnalyzer;\n", "import ts from 'typescript';\n\nfunction unwrapExpression(node: ts.Expression): ts.Expression {\n let current = node;\n while (true) {\n if (ts.isAsExpression(current)) {\n current = current.expression;\n continue;\n }\n if (ts.isTypeAssertionExpression(current)) {\n current = current.expression;\n continue;\n }\n if (ts.isParenthesizedExpression(current)) {\n current = current.expression;\n continue;\n }\n return current;\n }\n}\n\nfunction literalValueFromType(\n type: ts.Type,\n checker: ts.TypeChecker,\n): string | number | boolean | undefined {\n if (type.isStringLiteral()) {\n return type.value;\n }\n if (type.isNumberLiteral()) {\n return type.value;\n }\n if (type.flags & ts.TypeFlags.BooleanLiteral) {\n return checker.typeToString(type) === 'true';\n }\n return undefined;\n}\n\nexport function getConstantValue(\n checker: ts.TypeChecker,\n expression: ts.Expression,\n): string | number | boolean | undefined {\n const unwrapped = unwrapExpression(expression);\n\n const constant = checker.getConstantValue(\n unwrapped as\n | ts.EnumMember\n | ts.PropertyAccessExpression\n | ts.ElementAccessExpression,\n );\n if (constant !== undefined) {\n return constant;\n }\n\n if (\n ts.isStringLiteral(unwrapped) ||\n ts.isNoSubstitutionTemplateLiteral(unwrapped)\n ) {\n return unwrapped.text;\n }\n if (ts.isNumericLiteral(unwrapped)) {\n return Number(unwrapped.text);\n }\n if (unwrapped.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n if (unwrapped.kind === ts.SyntaxKind.FalseKeyword) {\n return false;\n }\n\n const type = checker.getTypeAtLocation(unwrapped);\n const literal = literalValueFromType(type, checker);\n if (literal !== undefined) {\n return literal;\n }\n if (type.isUnion()) {\n let resolved: string | number | boolean | undefined = undefined;\n for (const entry of type.types) {\n const value = literalValueFromType(entry, checker);\n if (value === undefined) {\n return undefined;\n }\n if (resolved === undefined) {\n resolved = value;\n } else if (resolved !== value) {\n return undefined;\n }\n }\n return resolved;\n }\n return undefined;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ts", "ts", "key"]
|
|
7
7
|
}
|
|
@@ -2,9 +2,9 @@ import ts from 'typescript';
|
|
|
2
2
|
import { type NaunceResponseAnalyzerFn, type ResponseItem, type TypeDeriver } from '@sdk-it/core';
|
|
3
3
|
export declare const newResponse: NaunceResponseAnalyzerFn;
|
|
4
4
|
export declare function defaultResponseAnalyzer(handler: ts.ArrowFunction | ts.FunctionExpression, deriver: TypeDeriver): ResponseItem[];
|
|
5
|
-
export declare function streamText(
|
|
6
|
-
export declare function stream(
|
|
7
|
-
export declare function streamSSE(
|
|
5
|
+
export declare function streamText(_handler: ts.ArrowFunction | ts.FunctionExpression, _deriver: TypeDeriver): ResponseItem[];
|
|
6
|
+
export declare function stream(_handler: ts.ArrowFunction | ts.FunctionExpression, _deriver: TypeDeriver): ResponseItem[];
|
|
7
|
+
export declare function streamSSE(_handler: ts.ArrowFunction | ts.FunctionExpression, _deriver: TypeDeriver): ResponseItem[];
|
|
8
8
|
export declare const httpException: NaunceResponseAnalyzerFn;
|
|
9
9
|
export declare const responseAnalyzer: {
|
|
10
10
|
default: typeof defaultResponseAnalyzer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-analyzer.d.ts","sourceRoot":"","sources":["../../src/lib/response-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAkQtB,eAAO,MAAM,WAAW,EAAE,wBA0DzB,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EACjD,OAAO,EAAE,WAAW,kBAuBrB;AAED,wBAAgB,UAAU,CACxB,
|
|
1
|
+
{"version":3,"file":"response-analyzer.d.ts","sourceRoot":"","sources":["../../src/lib/response-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EAEL,KAAK,wBAAwB,EAC7B,KAAK,YAAY,EACjB,KAAK,WAAW,EACjB,MAAM,cAAc,CAAC;AAkQtB,eAAO,MAAM,WAAW,EAAE,wBA0DzB,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EACjD,OAAO,EAAE,WAAW,kBAuBrB;AAED,wBAAgB,UAAU,CACxB,QAAQ,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EAClD,QAAQ,EAAE,WAAW,GACpB,YAAY,EAAE,CAahB;AAED,wBAAgB,MAAM,CACpB,QAAQ,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EAClD,QAAQ,EAAE,WAAW,GACpB,YAAY,EAAE,CAahB;AAED,wBAAgB,SAAS,CACvB,QAAQ,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,kBAAkB,EAClD,QAAQ,EAAE,WAAW,GACpB,YAAY,EAAE,CAahB;AAED,eAAO,MAAM,aAAa,EAAE,wBAkC3B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;CAO5B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sdk-it/hono",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.41.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"!**/*.test.*"
|
|
28
28
|
],
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@sdk-it/core": "0.
|
|
30
|
+
"@sdk-it/core": "0.41.0",
|
|
31
31
|
"hono": "^4.7.4",
|
|
32
32
|
"zod": "^3.25.76 || ^4.0.0",
|
|
33
33
|
"fast-content-type-parse": "^3.0.0"
|