From 821ad9263050a587ac90b57a31c548af755076cc Mon Sep 17 00:00:00 2001 From: Stefan Date: Wed, 2 Feb 2022 01:44:40 +0100 Subject: [PATCH 1/2] feat: add image api --- packages/web-utils/api/burdy-api.ts | 74 +++++++++++------------------ packages/web-utils/package.json | 3 +- yarn.lock | 13 +++++ 3 files changed, 44 insertions(+), 46 deletions(-) diff --git a/packages/web-utils/api/burdy-api.ts b/packages/web-utils/api/burdy-api.ts index 76b31bf..b0b1c72 100644 --- a/packages/web-utils/api/burdy-api.ts +++ b/packages/web-utils/api/burdy-api.ts @@ -1,5 +1,6 @@ import { IBurdyPage, IBurdySearch, IBurdyTag, RewritesObject } from '../types'; import axios from 'axios'; +import queryString from 'query-string'; export type GetPageOptions = { draft?: boolean; @@ -54,20 +55,24 @@ export type SearchTagsOptions = { xContentToken?: string; }; +export type OptimizeImageOptions = { + // General + animated?: boolean; + progressive?: boolean; + format?: 'auto' | 'avif' | 'webp' | 'jpeg' | 'jpg' | 'png'; + quality?: number; + // Resizing + width?: number; + height?: number; + fit?: 'fill' | 'cover' | 'contain' | 'inside' | 'outside'; + gravity?: 'north' | 'northeast' | 'southeast' | 'south' | 'southwest' | 'west' | 'northwest' | 'east' | 'center' | 'centre'; +} + export const BurdyApi = { - getPage: async (host?: string, slugPath?: string, options?: GetPageOptions): Promise> => { + getPage: async (host?: string, slugPath?: string, params: GetPageOptions = {}): Promise> => { const headers: Record = {}; - const params: Record = {}; - - if (options?.includeChildren) params.includeChildren = options.includeChildren; - if (options?.perPage) params.perPage = options.perPage; - if (options?.page) params.page = options.page; - - if (options?.xContentToken) headers['x-content-token'] = options?.xContentToken; - if (options?.versionId) params.versionId = options?.versionId; - if (options?.relationsDepth) params.relationsDepth = options?.relationsDepth; - if (options?.draft) params.draft = options?.draft; + if (params?.xContentToken) headers['x-content-token'] = params?.xContentToken; const { data: page } = await axios.get>(`${host}/api/content/${slugPath}`, { params, @@ -76,27 +81,11 @@ export const BurdyApi = { return page; }, - searchPages: async (host: string, options: SearchPagesOptions): Promise>> => { + searchPages: async (host: string, params: SearchPagesOptions): Promise>> => { const headers: Record = {}; - const params: Record = {}; - - if (options?.xContentToken) headers['x-content-token'] = options?.xContentToken; - - if (options?.draft) params.draft = true; - if (options?.type) params.type = options.type; - if (options?.contentTypeName) params.contentTypeName = options.contentTypeName; - if (options?.search) params.search = options.search; - if (options?.parent) params.parent = options.parent; - if (options?.onlyOrphans) params.onlyOrphans = options.onlyOrphans; - if (options?.slugPath) params.slugPath = options.slugPath; - if (options?.tags) params.tags = options.tags; - if (options?.expand) params.expand = options.expand; - if (options?.compile) params.compile = options.compile; - if (options?.relationsDepth) params.relationsDepth = options.relationsDepth; - if (options?.orderBy) params.orderBy = options.orderBy; - if (options?.order) params.order = options.order; - if (options?.limit) params.limit = options.limit; - if (options?.page) params.page = options.page; + + if (params?.xContentToken) headers['x-content-token'] = params?.xContentToken; + if (params?.draft) params.draft = true; const { data } = await axios.get>>(`${host}/api/search/posts`, { params, @@ -104,27 +93,20 @@ export const BurdyApi = { }); return data; }, - searchTags: async (host: string, options: SearchTagsOptions): Promise> => { + searchTags: async (host: string, params: SearchTagsOptions): Promise> => { const headers: Record = {}; - const params: Record = {}; - - if (options?.xContentToken) headers['x-content-token'] = options?.xContentToken; - if (options?.search) params.search = options.search; - if (options?.parent) params.parent = options.parent; - if (options?.onlyOrphans) params.onlyOrphans = options.onlyOrphans; - if (options?.slugPath) params.slugPath = options.slugPath; - if (options?.expand) params.expand = options.expand; - if (options?.orderBy) params.orderBy = options.orderBy; - if (options?.order) params.order = options.order; - if (options?.limit) params.limit = options.limit; - if (options?.page) params.page = options.page; + if (params?.xContentToken) headers['x-content-token'] = params?.xContentToken; const { data } = await axios.get>(`${host}/api/search/tags`, { params, headers }); return data; + }, + optimizeImage: async (host: string, imageOptions: OptimizeImageOptions): string => { + const query = queryString.stringify(imageOptions, {skipEmptyString: true, skipNull: true}); + return `${host}/api/image?${query}`; } }; @@ -137,6 +119,7 @@ export type CreateApiType = { getPage: (slugPath: string, options?: GetPageOptions) => Promise>; searchPages: (options: SearchPagesOptions) => Promise>>; searchTags: (options: SearchTagsOptions) => Promise>; + optimizeImage: (options: OptimizeImageOptions) => string; } export const createApi = (apiConfig: ApiConfig): CreateApiType => ({ getPage: async (slugPath: string, options?: GetPageOptions): Promise> => BurdyApi.getPage(apiConfig?.host, slugPath, { @@ -150,5 +133,6 @@ export const createApi = (apiConfig: ApiConfig): CreateApiType => ({ searchTags: async (options: SearchTagsOptions): Promise> => BurdyApi.searchTags(apiConfig?.host, { xContentToken: apiConfig?.xContentToken, ...(options || {}) - }) + }), + optimizeImage: (options: OptimizeImageOptions): string => BurdyApi.optimizeImage(apiConfig?.host, options) }); diff --git a/packages/web-utils/package.json b/packages/web-utils/package.json index d740013..cd1c1a4 100644 --- a/packages/web-utils/package.json +++ b/packages/web-utils/package.json @@ -23,7 +23,8 @@ "dependencies": { "deepcopy": "^2.1.0", "path-to-regexp": "^6.2.0", - "prismjs": "^1.25.0" + "prismjs": "^1.25.0", + "query-string": "^7.1.0" }, "devDependencies": { "@types/prismjs": "^1.16.6" diff --git a/yarn.lock b/yarn.lock index 03a327c..ab3fedb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -411,6 +411,7 @@ __metadata: deepcopy: ^2.1.0 path-to-regexp: ^6.2.0 prismjs: ^1.25.0 + query-string: ^7.1.0 peerDependencies: axios: ">= 0.21" languageName: unknown @@ -6906,6 +6907,18 @@ __metadata: languageName: node linkType: hard +"query-string@npm:^7.1.0": + version: 7.1.0 + resolution: "query-string@npm:7.1.0" + dependencies: + decode-uri-component: ^0.2.0 + filter-obj: ^1.1.0 + split-on-first: ^1.0.0 + strict-uri-encode: ^2.0.0 + checksum: 4594a0a092772eb6854310feea85e34f8dcf70df494776a45b9e5be53621ffbcf930ae669974e4e171ce5e0f29a837e9821d48db843106dd94ee390f6f5ac857 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" From 24cda8fe4dcbee508b821b37a02449024b062073 Mon Sep 17 00:00:00 2001 From: Stefan Date: Wed, 2 Feb 2022 01:46:29 +0100 Subject: [PATCH 2/2] feat: minor fixes --- packages/web-utils/api/burdy-api.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/web-utils/api/burdy-api.ts b/packages/web-utils/api/burdy-api.ts index b0b1c72..ef3b89a 100644 --- a/packages/web-utils/api/burdy-api.ts +++ b/packages/web-utils/api/burdy-api.ts @@ -104,9 +104,9 @@ export const BurdyApi = { }); return data; }, - optimizeImage: async (host: string, imageOptions: OptimizeImageOptions): string => { + optimizeImage: async (host: string, npath: string, imageOptions: OptimizeImageOptions): string => { const query = queryString.stringify(imageOptions, {skipEmptyString: true, skipNull: true}); - return `${host}/api/image?${query}`; + return `${host}/api/image/${npath}?${query}`; } }; @@ -119,7 +119,7 @@ export type CreateApiType = { getPage: (slugPath: string, options?: GetPageOptions) => Promise>; searchPages: (options: SearchPagesOptions) => Promise>>; searchTags: (options: SearchTagsOptions) => Promise>; - optimizeImage: (options: OptimizeImageOptions) => string; + optimizeImage: (npath: string, options: OptimizeImageOptions) => string; } export const createApi = (apiConfig: ApiConfig): CreateApiType => ({ getPage: async (slugPath: string, options?: GetPageOptions): Promise> => BurdyApi.getPage(apiConfig?.host, slugPath, { @@ -134,5 +134,5 @@ export const createApi = (apiConfig: ApiConfig): CreateApiType => ({ xContentToken: apiConfig?.xContentToken, ...(options || {}) }), - optimizeImage: (options: OptimizeImageOptions): string => BurdyApi.optimizeImage(apiConfig?.host, options) + optimizeImage: (npath, options): string => BurdyApi.optimizeImage(apiConfig?.host, npath, options) });