Skip to content

Commit

Permalink
fix: fix query generics
Browse files Browse the repository at this point in the history
  • Loading branch information
pviti committed Apr 9, 2024
1 parent 4c22c64 commit b6d656d
Show file tree
Hide file tree
Showing 16 changed files with 39 additions and 32 deletions.
2 changes: 1 addition & 1 deletion gen/templates/create.tpl
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
async create(resource: ##__RESOURCE_REQUEST_CLASS__##, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
async create(resource: ##__RESOURCE_REQUEST_CLASS__##, params?: QueryParamsRetrieve<##__RESOURCE_RESPONSE_CLASS__##>, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
return this.resources.create<##__RESOURCE_REQUEST_CLASS__##, ##__RESOURCE_RESPONSE_CLASS__##>({ ...resource, type: ##__RESOURCE_CLASS__##.TYPE }, params, options)
}
2 changes: 1 addition & 1 deletion gen/templates/list.tpl
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
async list(params?: QueryParamsList, options?: ResourcesConfig): Promise<ListResponse<##__RESOURCE_RESPONSE_CLASS__##>> {
async list(params?: QueryParamsList<##__RESOURCE_RESPONSE_CLASS__##>, options?: ResourcesConfig): Promise<ListResponse<##__RESOURCE_RESPONSE_CLASS__##>> {
return this.resources.list<##__RESOURCE_RESPONSE_CLASS__##>({ type: ##__RESOURCE_CLASS__##.TYPE }, params, options)
}
2 changes: 1 addition & 1 deletion gen/templates/retrieve.tpl
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
async retrieve(id: string, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
async retrieve(id: string, params?: QueryParamsRetrieve<##__RESOURCE_RESPONSE_CLASS__##>, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
return this.resources.retrieve<##__RESOURCE_RESPONSE_CLASS__##>({ type: ##__RESOURCE_CLASS__##.TYPE, id }, params, options)
}
2 changes: 1 addition & 1 deletion gen/templates/singleton.tpl
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
async retrieve(params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
async retrieve(params?: QueryParamsRetrieve<##__RESOURCE_RESPONSE_CLASS__##>, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
return this.resources.retrieve<##__RESOURCE_RESPONSE_CLASS__##>({ type: ##__RESOURCE_CLASS__##.TYPE }, params, options)
}
2 changes: 1 addition & 1 deletion gen/templates/singleton_update.tpl
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
async update(resource: ##__RESOURCE_REQUEST_CLASS__##, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
async update(resource: ##__RESOURCE_REQUEST_CLASS__##, params?: QueryParamsRetrieve<##__RESOURCE_RESPONSE_CLASS__##>, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
const res = await this.retrieve(params, options) // JsonAPI requires id in the request body
return this.resources.update<##__RESOURCE_REQUEST_CLASS__##, ##__RESOURCE_RESPONSE_CLASS__##>({ ...resource, id: res.id, type: ##__RESOURCE_CLASS__##.TYPE }, params, options)
}
2 changes: 1 addition & 1 deletion gen/templates/update.tpl
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
async update(resource: ##__RESOURCE_REQUEST_CLASS__##, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
async update(resource: ##__RESOURCE_REQUEST_CLASS__##, params?: QueryParamsRetrieve<##__RESOURCE_RESPONSE_CLASS__##>, options?: ResourcesConfig): Promise<##__RESOURCE_RESPONSE_CLASS__##> {
return this.resources.update<##__RESOURCE_REQUEST_CLASS__##, ##__RESOURCE_RESPONSE_CLASS__##>({ ...resource, type: ##__RESOURCE_CLASS__##.TYPE }, params, options)
}
6 changes: 3 additions & 3 deletions src/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ type QueryResourceFields<R extends ResourceTypeLock> = keyof ResourceFields[R]
type QueryArrayFields<R extends Resource> = Array<QueryResourceFields<QueryResType<R>>>
type QueryRecordFields = { [key in keyof ResourceFields]?: Array<(QueryResourceFields<key>)> }

interface QueryParamsRetrieve<R extends Resource = Resource> {
interface QueryParamsRetrieve<R extends Resource> {
include?: QueryInclude
fields?: QueryArrayFields<R> | QueryRecordFields
}
Expand All @@ -33,14 +33,14 @@ type QueryFilter = Record<string, string | number | boolean | object | Array<str
type QueryPageNumber = number
type QueryPageSize = PositiveNumberRange<25>

interface QueryParamsList<R extends Resource = Resource> extends QueryParamsRetrieve<R> {
interface QueryParamsList<R extends Resource> extends QueryParamsRetrieve<R> {
sort?: QueryArraySortable<R> | QueryRecordSortable<R>
filters?: QueryFilter
pageNumber?: QueryPageNumber
pageSize?: QueryPageSize
}

type QueryParams<R extends Resource = Resource> = QueryParamsRetrieve<R> | QueryParamsList<R>
type QueryParams<R extends Resource> = QueryParamsRetrieve<R> | QueryParamsList<R>

export type { QueryParamsRetrieve, QueryParamsList, QueryParams, QueryFilter, QueryPageSize }

Expand Down
18 changes: 9 additions & 9 deletions src/resource.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ class ResourceAdapter {



async retrieve<R extends Resource>(resource: ResourceId | ResourceType, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<R> {
async retrieve<R extends Resource>(resource: ResourceId | ResourceType, params?: QueryParamsRetrieve<R>, options?: ResourcesConfig): Promise<R> {

const singleton = !('id' in resource) || CommerceLayerProvisioningStatic.isSingleton(resource.type)

Expand All @@ -167,7 +167,7 @@ class ResourceAdapter {
}


async list<R extends Resource>(resource: ResourceType, params?: QueryParamsList, options?: ResourcesConfig): Promise<ListResponse<R>> {
async list<R extends Resource>(resource: ResourceType, params?: QueryParamsList<R>, options?: ResourcesConfig): Promise<ListResponse<R>> {

debug('list: %o, %O, %O', resource, params || {}, options || {})

Expand Down Expand Up @@ -205,7 +205,7 @@ class ResourceAdapter {
}


async update<U extends ResourceUpdate, R extends Resource>(resource: U & ResourceId, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<R> {
async update<U extends ResourceUpdate, R extends Resource>(resource: U & ResourceId, params?: QueryParamsRetrieve<R>, options?: ResourcesConfig): Promise<R> {

const singleton = !('id' in resource) || CommerceLayerProvisioningStatic.isSingleton(resource.type)

Expand Down Expand Up @@ -308,7 +308,7 @@ abstract class ApiResourceBase<R extends Resource> {


// reference, reference_origin and metadata attributes are always updatable
async update(resource: ResourceUpdate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<R> {
async update(resource: ResourceUpdate, params?: QueryParamsRetrieve<R>, options?: ResourcesConfig): Promise<R> {
return this.resources.update<ResourceUpdate, R>({ ...resource, type: this.type() }, params, options)
}

Expand All @@ -317,16 +317,16 @@ abstract class ApiResourceBase<R extends Resource> {

abstract class ApiResource<R extends Resource> extends ApiResourceBase<R> {

async retrieve(id: string | ResourceId, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<R> {
async retrieve(id: string | ResourceId, params?: QueryParamsRetrieve<R>, options?: ResourcesConfig): Promise<R> {
return this.resources.retrieve<R>((typeof id === 'string') ? { type: this.type(), id } : id, params, options)
}

async list(params?: QueryParamsList, options?: ResourcesConfig): Promise<ListResponse<R>> {
async list(params?: QueryParamsList<R>, options?: ResourcesConfig): Promise<ListResponse<R>> {
return this.resources.list<R>({ type: this.type() }, params, options)
}

async count(filter?: QueryFilter | QueryParamsList, options?: ResourcesConfig): Promise<number> {
const params: QueryParamsList = { filters: isParamsList(filter) ? filter.filters : filter, pageNumber: 1, pageSize: 1 }
async count(filter?: QueryFilter | QueryParamsList<R>, options?: ResourcesConfig): Promise<number> {
const params: QueryParamsList<R> = { filters: isParamsList<R>(filter) ? filter.filters : filter, pageNumber: 1, pageSize: 1 }
const response = await this.list(params, options)
return Promise.resolve(response.meta.recordCount)
}
Expand All @@ -336,7 +336,7 @@ abstract class ApiResource<R extends Resource> extends ApiResourceBase<R> {

abstract class ApiSingleton<R extends Resource> extends ApiResourceBase<R> {

async retrieve(params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<R> {
async retrieve(params?: QueryParamsRetrieve<R>, options?: ResourcesConfig): Promise<R> {
return this.resources.retrieve<R>({ type: this.type() }, params, options)
}

Expand Down
5 changes: 3 additions & 2 deletions src/resources/api_credentials.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import type { Nullable } from '../types'
import { ApiResource } from '../resource'
import type { Resource, ResourceCreate, ResourceUpdate, ResourceId, ResourcesConfig, ResourceRel, ResourceSort, /* ResourceFilter */ } from '../resource'
Expand Down Expand Up @@ -142,11 +143,11 @@ class ApiCredentials extends ApiResource<ApiCredential> {

static readonly TYPE: ApiCredentialType = 'api_credentials' as const

async create(resource: ApiCredentialCreate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<ApiCredential> {
async create(resource: ApiCredentialCreate, params?: QueryParamsRetrieve<ApiCredential>, options?: ResourcesConfig): Promise<ApiCredential> {
return this.resources.create<ApiCredentialCreate, ApiCredential>({ ...resource, type: ApiCredentials.TYPE }, params, options)
}

async update(resource: ApiCredentialUpdate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<ApiCredential> {
async update(resource: ApiCredentialUpdate, params?: QueryParamsRetrieve<ApiCredential>, options?: ResourcesConfig): Promise<ApiCredential> {
return this.resources.update<ApiCredentialUpdate, ApiCredential>({ ...resource, type: ApiCredentials.TYPE }, params, options)
}

Expand Down
5 changes: 3 additions & 2 deletions src/resources/application_memberships.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import type { Nullable } from '../types'
import { ApiResource } from '../resource'
import type { Resource, ResourceCreate, ResourceUpdate, ResourceId, ResourcesConfig, ResourceRel, ResourceSort, /* ResourceFilter */ } from '../resource'
Expand Down Expand Up @@ -72,11 +73,11 @@ class ApplicationMemberships extends ApiResource<ApplicationMembership> {

static readonly TYPE: ApplicationMembershipType = 'application_memberships' as const

async create(resource: ApplicationMembershipCreate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<ApplicationMembership> {
async create(resource: ApplicationMembershipCreate, params?: QueryParamsRetrieve<ApplicationMembership>, options?: ResourcesConfig): Promise<ApplicationMembership> {
return this.resources.create<ApplicationMembershipCreate, ApplicationMembership>({ ...resource, type: ApplicationMemberships.TYPE }, params, options)
}

async update(resource: ApplicationMembershipUpdate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<ApplicationMembership> {
async update(resource: ApplicationMembershipUpdate, params?: QueryParamsRetrieve<ApplicationMembership>, options?: ResourcesConfig): Promise<ApplicationMembership> {
return this.resources.update<ApplicationMembershipUpdate, ApplicationMembership>({ ...resource, type: ApplicationMemberships.TYPE }, params, options)
}

Expand Down
5 changes: 3 additions & 2 deletions src/resources/memberships.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import type { Nullable } from '../types'
import { ApiResource } from '../resource'
import type { Resource, ResourceCreate, ResourceUpdate, ResourceId, ResourcesConfig, ResourceRel, ListResponse, ResourceSort, /* ResourceFilter */ } from '../resource'
Expand Down Expand Up @@ -85,11 +86,11 @@ class Memberships extends ApiResource<Membership> {

static readonly TYPE: MembershipType = 'memberships' as const

async create(resource: MembershipCreate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<Membership> {
async create(resource: MembershipCreate, params?: QueryParamsRetrieve<Membership>, options?: ResourcesConfig): Promise<Membership> {
return this.resources.create<MembershipCreate, Membership>({ ...resource, type: Memberships.TYPE }, params, options)
}

async update(resource: MembershipUpdate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<Membership> {
async update(resource: MembershipUpdate, params?: QueryParamsRetrieve<Membership>, options?: ResourcesConfig): Promise<Membership> {
return this.resources.update<MembershipUpdate, Membership>({ ...resource, type: Memberships.TYPE }, params, options)
}

Expand Down
5 changes: 3 additions & 2 deletions src/resources/organizations.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import type { Nullable } from '../types'
import { ApiResource } from '../resource'
import type { Resource, ResourceCreate, ResourceUpdate, ResourceId, ResourcesConfig, ResourceRel, ListResponse, ResourceSort, /* ResourceFilter */ } from '../resource'
Expand Down Expand Up @@ -271,11 +272,11 @@ class Organizations extends ApiResource<Organization> {

static readonly TYPE: OrganizationType = 'organizations' as const

async create(resource: OrganizationCreate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<Organization> {
async create(resource: OrganizationCreate, params?: QueryParamsRetrieve<Organization>, options?: ResourcesConfig): Promise<Organization> {
return this.resources.create<OrganizationCreate, Organization>({ ...resource, type: Organizations.TYPE }, params, options)
}

async update(resource: OrganizationUpdate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<Organization> {
async update(resource: OrganizationUpdate, params?: QueryParamsRetrieve<Organization>, options?: ResourcesConfig): Promise<Organization> {
return this.resources.update<OrganizationUpdate, Organization>({ ...resource, type: Organizations.TYPE }, params, options)
}

Expand Down
5 changes: 3 additions & 2 deletions src/resources/permissions.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import type { Nullable } from '../types'
import { ApiResource } from '../resource'
import type { Resource, ResourceCreate, ResourceUpdate, ResourceId, ResourcesConfig, ResourceRel, ListResponse, ResourceSort, /* ResourceFilter */ } from '../resource'
Expand Down Expand Up @@ -108,11 +109,11 @@ class Permissions extends ApiResource<Permission> {

static readonly TYPE: PermissionType = 'permissions' as const

async create(resource: PermissionCreate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<Permission> {
async create(resource: PermissionCreate, params?: QueryParamsRetrieve<Permission>, options?: ResourcesConfig): Promise<Permission> {
return this.resources.create<PermissionCreate, Permission>({ ...resource, type: Permissions.TYPE }, params, options)
}

async update(resource: PermissionUpdate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<Permission> {
async update(resource: PermissionUpdate, params?: QueryParamsRetrieve<Permission>, options?: ResourcesConfig): Promise<Permission> {
return this.resources.update<PermissionUpdate, Permission>({ ...resource, type: Permissions.TYPE }, params, options)
}

Expand Down
5 changes: 3 additions & 2 deletions src/resources/roles.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import type { Nullable } from '../types'
import { ApiResource } from '../resource'
import type { Resource, ResourceCreate, ResourceUpdate, ResourceId, ResourcesConfig, ResourceRel, ListResponse, ResourceSort, /* ResourceFilter */ } from '../resource'
Expand Down Expand Up @@ -71,11 +72,11 @@ class Roles extends ApiResource<Role> {

static readonly TYPE: RoleType = 'roles' as const

async create(resource: RoleCreate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<Role> {
async create(resource: RoleCreate, params?: QueryParamsRetrieve<Role>, options?: ResourcesConfig): Promise<Role> {
return this.resources.create<RoleCreate, Role>({ ...resource, type: Roles.TYPE }, params, options)
}

async update(resource: RoleUpdate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<Role> {
async update(resource: RoleUpdate, params?: QueryParamsRetrieve<Role>, options?: ResourcesConfig): Promise<Role> {
return this.resources.update<RoleUpdate, Role>({ ...resource, type: Roles.TYPE }, params, options)
}

Expand Down
3 changes: 2 additions & 1 deletion src/resources/user.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import type { Nullable } from '../types'
import { ApiSingleton } from '../resource'
import type { Resource, ResourceUpdate, ResourceId, ResourcesConfig, ResourceRel, ResourceSort, /* ResourceFilter */ } from '../resource'
Expand Down Expand Up @@ -75,7 +76,7 @@ class Users extends ApiSingleton<User> {

static readonly TYPE: UserType = 'user' as const

async update(resource: UserUpdate, params?: QueryParamsRetrieve, options?: ResourcesConfig): Promise<User> {
async update(resource: UserUpdate, params?: QueryParamsRetrieve<User>, options?: ResourcesConfig): Promise<User> {
const res = await this.retrieve(params, options) // JsonAPI requires id in the request body
return this.resources.update<UserUpdate, User>({ ...resource, id: res.id, type: Users.TYPE }, params, options)
}
Expand Down
2 changes: 1 addition & 1 deletion src/util.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { ObjectType } from "../src/common"
import type { ObjectType } from "../src/types"
// import path from 'path'


Expand Down

0 comments on commit b6d656d

Please sign in to comment.