@danceroutine/tango-resources 1.11.2 → 1.11.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/CursorPaginator-B_8MhYZY.js +195 -0
- package/dist/CursorPaginator-B_8MhYZY.js.map +1 -0
- package/dist/CursorPaginator-CfeMQCdJ.d.ts +177 -0
- package/dist/OffsetPaginator-CaycvxJU.js +188 -0
- package/dist/OffsetPaginator-CaycvxJU.js.map +1 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.js +2 -0
- package/dist/context-euBQvNRT.js +65 -0
- package/dist/context-euBQvNRT.js.map +1 -0
- package/dist/filters/index.d.ts +2 -0
- package/dist/filters/index.js +2 -0
- package/dist/filters-46d2Nr5C.js +287 -0
- package/dist/filters-46d2Nr5C.js.map +1 -0
- package/dist/index-Ac94YL5S.d.ts +24 -0
- package/dist/index-BJJalUDB.d.ts +54 -0
- package/dist/index-Bg6TtnmQ.d.ts +175 -0
- package/dist/index-C55GDIOn.d.ts +222 -0
- package/dist/index-CiIB-1Ac.d.ts +123 -0
- package/dist/index-DkJtxvKu.d.ts +164 -0
- package/dist/index.d.ts +10 -12
- package/dist/index.js +10 -1013
- package/dist/inferModelFieldParsers-2irv7j1T.js +70 -0
- package/dist/inferModelFieldParsers-2irv7j1T.js.map +1 -0
- package/dist/pagination/index.d.ts +3 -0
- package/dist/pagination/index.js +15 -0
- package/dist/pagination/index.js.map +1 -0
- package/dist/paginators/index.d.ts +9 -0
- package/dist/paginators/index.js +12 -0
- package/dist/paginators/index.js.map +1 -0
- package/dist/resource/index.d.ts +3 -0
- package/dist/resource/index.js +7 -0
- package/dist/resource/index.js.map +1 -0
- package/dist/serializer/index.d.ts +2 -0
- package/dist/serializer/index.js +2 -0
- package/dist/serializer-RSwlXWls.js +305 -0
- package/dist/serializer-RSwlXWls.js.map +1 -0
- package/dist/view/index.d.ts +2 -1
- package/dist/view/index.js +1 -1
- package/dist/{view-C9B5Lln3.js → view-CYdJAO4t.js} +7 -314
- package/dist/view-CYdJAO4t.js.map +1 -0
- package/dist/viewset/index.d.ts +9 -0
- package/dist/viewset/index.js +2 -0
- package/dist/viewset-C9j-2U29.js +227 -0
- package/dist/viewset-C9j-2U29.js.map +1 -0
- package/package.json +21 -17
- package/dist/index-D6sfTSEj.d.ts +0 -902
- package/dist/index.js.map +0 -1
- package/dist/view-C9B5Lln3.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"viewset-C9j-2U29.js","names":[],"sources":["../src/viewset/ModelViewSet.ts","../src/viewset/index.ts"],"sourcesContent":["import type { FilterInput, ManagerLike, QuerySet } from '@danceroutine/tango-orm';\nimport { HttpErrorFactory, TangoResponse, type JsonValue, NotFoundError } from '@danceroutine/tango-core';\nimport type { RequestContext } from '../context/index';\nimport type { FilterSet } from '../filters/index';\nimport { inferModelFieldParsers } from '../filters/inferModelFieldParsers';\nimport { OffsetPaginator } from '../paginators/OffsetPaginator';\nimport { Q } from '@danceroutine/tango-orm';\nimport type { Paginator } from '../pagination/index';\nimport type { ModelViewSetOpenAPIDescription } from '../resource/index';\nimport type { ResourceModelLike } from '../resource/index';\nimport type { AnyModelSerializer, AnyModelSerializerClass, SerializerOutput } from '../serializer/index';\n\nexport type ViewSetActionScope = 'detail' | 'collection';\nexport type ViewSetActionMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';\n\nexport interface ViewSetActionDescriptor {\n name: string;\n scope: ViewSetActionScope;\n methods: readonly ViewSetActionMethod[];\n path?: string;\n}\n\nexport interface ResolvedViewSetActionDescriptor extends ViewSetActionDescriptor {\n path: string;\n}\n\ntype AnyModelViewSet = ModelViewSet<Record<string, unknown>, AnyModelSerializerClass>;\ntype SearchFieldRef<TModel extends Record<string, unknown>> = Extract<keyof TModel, string> | string;\n\n/**\n * Configuration for a ModelViewSet, defining how a serializer-backed model is exposed as an API resource.\n */\nexport interface ModelViewSetConfig<\n TModel extends Record<string, unknown>,\n TSerializer extends AnyModelSerializer<TModel>,\n> {\n /** Serializer class that owns validation, representation, and persistence hooks */\n serializer: TSerializer;\n\n /** Optional filter set defining which query parameters can filter the list endpoint */\n filters?: FilterSet<TModel>;\n\n /** Fields that clients are allowed to sort by via query parameters */\n orderingFields?: (keyof TModel)[];\n\n /** Fields that are searched when a free-text search query parameter is provided */\n searchFields?: SearchFieldRef<TModel>[];\n\n /** Optional paginator factory used by list endpoints. */\n paginatorFactory?: (queryset: QuerySet<TModel>) => Paginator<TModel, SerializerOutput<TSerializer>>;\n}\n\n/**\n * Base class for creating RESTful API viewsets with built-in CRUD operations.\n * Provides list, retrieve, create, update, and delete methods with filtering,\n * search, pagination, and ordering support.\n */\nexport abstract class ModelViewSet<\n TModel extends Record<string, unknown>,\n TSerializer extends AnyModelSerializer<TModel>,\n> {\n static readonly BRAND = 'tango.resources.model_view_set' as const;\n static readonly actions: readonly ViewSetActionDescriptor[] = [];\n readonly __tangoBrand: typeof ModelViewSet.BRAND = ModelViewSet.BRAND;\n protected readonly serializerClass: TSerializer;\n protected readonly filters?: FilterSet<TModel>;\n protected readonly orderingFields: (keyof TModel)[];\n protected readonly searchFields: SearchFieldRef<TModel>[];\n protected readonly paginatorFactory?: (\n queryset: QuerySet<TModel>\n ) => Paginator<TModel, SerializerOutput<TSerializer>>;\n private serializer?: InstanceType<TSerializer>;\n\n constructor(config: ModelViewSetConfig<TModel, TSerializer>) {\n this.serializerClass = config.serializer;\n this.filters = config.filters;\n this.orderingFields = config.orderingFields ?? [];\n this.searchFields = config.searchFields ?? [];\n this.paginatorFactory = config.paginatorFactory;\n }\n\n /**\n * Return the custom action descriptors declared by a viewset or constructor.\n */\n static getActions(\n viewsetOrConstructor: AnyModelViewSet | (new (...args: never[]) => AnyModelViewSet)\n ): readonly ResolvedViewSetActionDescriptor[] {\n const viewset = ModelViewSet.isModelViewSet(viewsetOrConstructor) ? viewsetOrConstructor : null;\n\n const constructorValue = viewset\n ? (viewset.constructor as { actions?: readonly ViewSetActionDescriptor[] })\n : (viewsetOrConstructor as { actions?: readonly ViewSetActionDescriptor[] });\n const actions = Array.isArray(constructorValue.actions) ? constructorValue.actions : [];\n\n return actions.map((action) => ({\n ...action,\n path: viewset\n ? viewset.resolveActionPath(action)\n : ModelViewSet.resolvePathFromDescriptor(action.name, action.path),\n }));\n }\n\n /**\n * Narrow an unknown value to `ModelViewSet`.\n */\n static isModelViewSet(value: unknown): value is ModelViewSet<Record<string, unknown>, AnyModelSerializerClass> {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === ModelViewSet.BRAND\n );\n }\n\n /**\n * Preserve literal action inference while validating the descriptor shape.\n */\n static defineViewSetActions<const T extends readonly ViewSetActionDescriptor[]>(actions: T): T {\n return actions;\n }\n\n private static resolvePathFromDescriptor(name: string, explicitPath?: string): string {\n const normalized = (explicitPath?.trim() || ModelViewSet.toKebabCase(name)).replace(/^\\/+|\\/+$/g, '');\n if (!normalized) {\n throw new Error(`Invalid custom action path for '${name}'.`);\n }\n return normalized;\n }\n\n private static toKebabCase(input: string): string {\n return input\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/[_\\s]+/g, '-')\n .toLowerCase();\n }\n\n /**\n * Return the serializer class that owns this resource contract.\n */\n getSerializerClass(): TSerializer {\n return this.serializerClass;\n }\n\n /**\n * Return the serializer instance for the current resource.\n */\n getSerializer(): InstanceType<TSerializer> {\n if (!this.serializer) {\n this.serializer = new this.serializerClass() as InstanceType<TSerializer>;\n }\n\n return this.serializer;\n }\n\n /**\n * Describe the public HTTP contract that this resource contributes to OpenAPI generation.\n */\n describeOpenAPI(): ModelViewSetOpenAPIDescription<TModel, TSerializer> {\n const model = this.requireModelMetadata();\n return {\n model,\n outputSchema: this.getSerializer().getOutputSchema() as TSerializer['outputSchema'],\n createSchema: this.getSerializer().getCreateSchema() as TSerializer['createSchema'],\n updateSchema: this.getSerializer().getUpdateSchema() as TSerializer['updateSchema'],\n searchFields: this.searchFields,\n orderingFields: this.orderingFields,\n lookupField: this.getLookupFieldFromMetadata(model),\n lookupParam: 'id',\n allowedMethods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],\n usesDefaultOffsetPagination: !this.paginatorFactory,\n actions: ModelViewSet.getActions(this as unknown as AnyModelViewSet),\n };\n }\n\n /**\n * List endpoint with filtering, search, ordering, and offset pagination.\n */\n async list(ctx: RequestContext): Promise<TangoResponse> {\n try {\n const params = ctx.request.queryParams;\n const baseQueryset = this.getManager().query();\n const paginator = this.getPaginator(baseQueryset);\n paginator.parse(params);\n\n let qs = baseQueryset;\n\n if (this.filters) {\n const filterInputs = this.filters\n .withFieldParsers(inferModelFieldParsers(this.getSerializer().getModel()))\n .apply(params);\n if (filterInputs.length > 0) {\n qs = qs.filter(Q.and(...filterInputs));\n }\n }\n\n const search = params.getSearch();\n if (search && this.searchFields.length > 0) {\n const searchFilters: FilterInput<TModel>[] = this.searchFields.map((field) => {\n const lookup = `${String(field)}__icontains`;\n return { [lookup]: search } as FilterInput<TModel>;\n });\n qs = qs.filter(Q.or(...searchFilters));\n }\n\n const ordering = params.getOrdering();\n if (ordering.length > 0) {\n const orderTokens = ordering.filter((field) => {\n const cleanField = field.startsWith('-') ? field.slice(1) : field;\n return this.orderingFields.includes(cleanField as keyof TModel);\n });\n if (orderTokens.length > 0) {\n qs = qs.orderBy(...orderTokens.map((token) => token as keyof TModel | `-${string & keyof TModel}`));\n }\n }\n\n const paginatedQueryset = paginator.apply(qs);\n const resultPromise = paginatedQueryset.fetch();\n const totalCountPromise = paginator.needsTotalCount()\n ? qs.count()\n : Promise.resolve<number | undefined>(undefined);\n const [result, totalCount] = await Promise.all([resultPromise, totalCountPromise]);\n const serializer = this.getSerializer();\n const rows = await serializer.serializeMany(result.items);\n const response = paginator.toResponse(rows as SerializerOutput<TSerializer>[], { totalCount });\n\n return TangoResponse.json(response as unknown as JsonValue, { status: 200 });\n } catch (error) {\n return this.handleError(error);\n }\n }\n\n /**\n * Retrieve endpoint for a single resource by id.\n */\n async retrieve(_ctx: RequestContext, id: string): Promise<TangoResponse> {\n try {\n const manager = this.getManager();\n const pk = manager.meta.pk;\n const filterById = { [pk]: id } as FilterInput<TModel>;\n const result = await manager.query().filter(filterById).fetchOne();\n\n if (!result) {\n throw new NotFoundError(`No ${manager.meta.table} record found for ${String(pk)}=${id}.`);\n }\n\n return TangoResponse.json((await this.getSerializer().serialize(result)) as JsonValue, { status: 200 });\n } catch (error) {\n return this.handleError(error);\n }\n }\n\n /**\n * Create endpoint: validate input, persist, and return serialized output.\n */\n async create(ctx: RequestContext): Promise<TangoResponse> {\n try {\n const body = await ctx.request.json();\n const result = await this.getSerializer().create(body);\n\n return TangoResponse.created(undefined, result as JsonValue);\n } catch (error) {\n return this.handleError(error);\n }\n }\n\n /**\n * Update endpoint: validate partial payload and persist by id.\n */\n async update(ctx: RequestContext, id: string): Promise<TangoResponse> {\n try {\n const body = await ctx.request.json();\n const pkValue = id as TModel[keyof TModel];\n const result = await this.getSerializer().update(pkValue, body);\n\n return TangoResponse.json(result as JsonValue, { status: 200 });\n } catch (error) {\n return this.handleError(error);\n }\n }\n\n /**\n * Destroy endpoint: delete a resource by id.\n */\n async destroy(_ctx: RequestContext, id: string): Promise<TangoResponse> {\n try {\n const pkValue = id as TModel[keyof TModel];\n\n await this.getManager().delete(pkValue);\n\n return TangoResponse.noContent();\n } catch (error) {\n return this.handleError(error);\n }\n }\n\n protected getPaginator(queryset: QuerySet<TModel>): Paginator<TModel, SerializerOutput<TSerializer>> {\n if (this.paginatorFactory) {\n return this.paginatorFactory(queryset);\n }\n return new OffsetPaginator<TModel>(queryset) as Paginator<TModel, SerializerOutput<TSerializer>>;\n }\n\n protected getManager(): ManagerLike<TModel> {\n return this.getSerializer().getManager();\n }\n\n /**\n * Convert thrown errors into normalized HTTP responses.\n */\n protected handleError(error: unknown): TangoResponse {\n const httpError = HttpErrorFactory.toHttpError(error);\n return TangoResponse.json(httpError.body as JsonValue, { status: httpError.status });\n }\n\n /**\n * Resolve route path segment(s) for a custom action.\n * Override this in subclasses to customize path derivation globally.\n */\n protected resolveActionPath(action: ViewSetActionDescriptor): string {\n return ModelViewSet.resolvePathFromDescriptor(action.name, action.path);\n }\n\n private requireModelMetadata(): ResourceModelLike<TModel> & {\n metadata: NonNullable<ResourceModelLike<TModel>['metadata']>;\n } {\n const model = this.getSerializer().getModel();\n\n if (!model.metadata) {\n throw new Error('OpenAPI generation requires Tango model metadata on ModelViewSet models.');\n }\n\n return model as ResourceModelLike<TModel> & {\n metadata: NonNullable<ResourceModelLike<TModel>['metadata']>;\n };\n }\n\n private getLookupFieldFromMetadata(\n model: ResourceModelLike<TModel> & {\n metadata: NonNullable<ResourceModelLike<TModel>['metadata']>;\n }\n ): keyof TModel {\n const primaryKeyField = model.metadata.fields.find((field) => field.primaryKey);\n\n if (!primaryKeyField) {\n throw new Error('OpenAPI generation requires a primary key field in Tango model metadata.');\n }\n\n return primaryKeyField.name as keyof TModel;\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport {\n ModelViewSet,\n type ModelViewSetConfig,\n type ViewSetActionDescriptor,\n type ViewSetActionMethod,\n type ViewSetActionScope,\n type ResolvedViewSetActionDescriptor,\n} from './ModelViewSet';\nexport type { ModelViewSetOpenAPIDescription } from '../resource/index';\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@danceroutine/tango-resources",
|
|
3
|
-
"version": "1.11.
|
|
3
|
+
"version": "1.11.4",
|
|
4
4
|
"description": "ModelViewSet, serializers, filters, and pagination for Tango",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -11,28 +11,32 @@
|
|
|
11
11
|
"import": "./dist/index.js"
|
|
12
12
|
},
|
|
13
13
|
"./context": {
|
|
14
|
-
"types": "./dist/index.d.ts",
|
|
15
|
-
"import": "./dist/index.js"
|
|
14
|
+
"types": "./dist/context/index.d.ts",
|
|
15
|
+
"import": "./dist/context/index.js"
|
|
16
16
|
},
|
|
17
17
|
"./filters": {
|
|
18
|
-
"types": "./dist/index.d.ts",
|
|
19
|
-
"import": "./dist/index.js"
|
|
18
|
+
"types": "./dist/filters/index.d.ts",
|
|
19
|
+
"import": "./dist/filters/index.js"
|
|
20
20
|
},
|
|
21
21
|
"./pagination": {
|
|
22
|
-
"types": "./dist/index.d.ts",
|
|
23
|
-
"import": "./dist/index.js"
|
|
22
|
+
"types": "./dist/pagination/index.d.ts",
|
|
23
|
+
"import": "./dist/pagination/index.js"
|
|
24
24
|
},
|
|
25
25
|
"./paginators": {
|
|
26
|
-
"types": "./dist/index.d.ts",
|
|
27
|
-
"import": "./dist/index.js"
|
|
26
|
+
"types": "./dist/paginators/index.d.ts",
|
|
27
|
+
"import": "./dist/paginators/index.js"
|
|
28
|
+
},
|
|
29
|
+
"./resource": {
|
|
30
|
+
"types": "./dist/resource/index.d.ts",
|
|
31
|
+
"import": "./dist/resource/index.js"
|
|
28
32
|
},
|
|
29
33
|
"./serializer": {
|
|
30
|
-
"types": "./dist/index.d.ts",
|
|
31
|
-
"import": "./dist/index.js"
|
|
34
|
+
"types": "./dist/serializer/index.d.ts",
|
|
35
|
+
"import": "./dist/serializer/index.js"
|
|
32
36
|
},
|
|
33
37
|
"./viewset": {
|
|
34
|
-
"types": "./dist/index.d.ts",
|
|
35
|
-
"import": "./dist/index.js"
|
|
38
|
+
"types": "./dist/viewset/index.d.ts",
|
|
39
|
+
"import": "./dist/viewset/index.js"
|
|
36
40
|
},
|
|
37
41
|
"./view": {
|
|
38
42
|
"types": "./dist/view/index.d.ts",
|
|
@@ -58,8 +62,8 @@
|
|
|
58
62
|
},
|
|
59
63
|
"dependencies": {
|
|
60
64
|
"zod": "^4.0.0",
|
|
61
|
-
"@danceroutine/tango-core": "1.11.
|
|
62
|
-
"@danceroutine/tango-orm": "1.11.
|
|
65
|
+
"@danceroutine/tango-core": "1.11.4",
|
|
66
|
+
"@danceroutine/tango-orm": "1.11.4"
|
|
63
67
|
},
|
|
64
68
|
"devDependencies": {
|
|
65
69
|
"@types/node": "^22.9.0",
|
|
@@ -67,8 +71,8 @@
|
|
|
67
71
|
"typescript": "^5.6.3",
|
|
68
72
|
"vitest": "^4.1.7",
|
|
69
73
|
"zod": "^4.0.0",
|
|
70
|
-
"@danceroutine/tango-schema": "1.11.
|
|
71
|
-
"@danceroutine/tango-testing": "1.11.
|
|
74
|
+
"@danceroutine/tango-schema": "1.11.4",
|
|
75
|
+
"@danceroutine/tango-testing": "1.11.4"
|
|
72
76
|
},
|
|
73
77
|
"scripts": {
|
|
74
78
|
"build": "tsdown",
|