Skip to content

Commit

Permalink
feat(dandi/mvc-view): support content-negotiated views
Browse files Browse the repository at this point in the history
- use multiple `@View` decorators to configure multiple view options differentiated by MIME type or other request header

closes #66
  • Loading branch information
DanielSchaffer committed Feb 16, 2020
1 parent 2bc56ac commit 5f9a676
Show file tree
Hide file tree
Showing 11 changed files with 472 additions and 136 deletions.
3 changes: 2 additions & 1 deletion packages/dandi/mvc-view/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ export * from './src/view-metadata'
export * from './src/view-result'
export * from './src/view-result-factory'
export * from './src/view-result-factory.error'
export * from './src/view.route-transformer'
export * from './src/view-route'
export * from './src/view-route-transformer'
2 changes: 1 addition & 1 deletion packages/dandi/mvc-view/src/mvc-view.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {
} from './view-engine-config'
import { ViewEngineResolver } from './view-engine-resolver'
import { VIEW_RESULT_FACTORY } from './view-result-factory'
import { ViewRouteTransformer } from './view.route-transformer'
import { ViewRouteTransformer } from './view-route-transformer'

export interface MvcViewModule extends Array<any> {
engine(extension: string, engine: Constructor<ViewEngine>): this
Expand Down
20 changes: 19 additions & 1 deletion packages/dandi/mvc-view/src/view-metadata.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,32 @@
import { HttpRequestHeaders, MimeType } from '@dandi/http'
import { ControllerMethodMetadata } from '@dandi/mvc'

import { RenderOptions } from './render-options'

export type HttpRequestHeaderFunctionComparer<THeaderName extends keyof HttpRequestHeaders> =
(value: HttpRequestHeaders[THeaderName]) => boolean

export type HttpRequestHeaderComparer<THeaderName extends keyof HttpRequestHeaders> =
HttpRequestHeaderFunctionComparer<THeaderName> | HttpRequestHeaders[THeaderName]

export type HttpRequestHeaderComparers = {
[THeaderName in keyof HttpRequestHeaders]?:
HttpRequestHeaders[THeaderName] extends string ?
// allow regexps for headers with plain string values
RegExp | HttpRequestHeaderComparer<THeaderName> :
HttpRequestHeaderComparer<THeaderName>
}

export type ViewFilter = MimeType | HttpRequestHeaderComparers

export interface ViewMetadata {
name: string
path?: string
context: string
options?: RenderOptions
filter?: ViewFilter[]
}

export interface ControllerViewMethodMetadata extends ControllerMethodMetadata {
view?: ViewMetadata
views?: ViewMetadata[]
}
Loading

0 comments on commit 5f9a676

Please sign in to comment.