Saltearse al contenido

effects/WordPressAPI/converters

Esta página aún no está disponible en tu idioma.

Defined in: studiocms/packages/@studiocms/devapps/src/effects/WordPressAPI/converters.ts:42^

  • { convertToPageContent: Effect<{ contentId: string; }, boolean | Error | ParseError, | RawPageData | FullPageData>; convertToPageData: Effect<{ description: string; slug: string; title: string; }, boolean | Error | ParseError, | ImportEndpointConfig | RawPageData>; convertToPostContent: Effect<{ contentId: string; }, boolean | Error | ParseError, | RawPageData | FullPageData>; convertToPostData: Effect<{ description: string; slug: string; title: string; }, | boolean | AstroUserError | UnknownException | ParseError | LibSQLDatabaseError, | ImportEndpointConfig | RawPageData | UseBlogPkgConfig>; } & { _tag: "WordPressAPIConverters"; }

new WordPressAPIConverters(_: {
convertToPageContent: Effect<{
contentId: string;
}, boolean | Error | ParseError,
| RawPageData
| FullPageData>;
convertToPageData: Effect<{
description: string;
slug: string;
title: string;
}, boolean | Error | ParseError,
| ImportEndpointConfig
| RawPageData>;
convertToPostContent: Effect<{
contentId: string;
}, boolean | Error | ParseError,
| RawPageData
| FullPageData>;
convertToPostData: Effect<{
description: string;
slug: string;
title: string;
},
| boolean
| AstroUserError
| UnknownException
| ParseError
| LibSQLDatabaseError,
| ImportEndpointConfig
| RawPageData
| UseBlogPkgConfig>;
}): WordPressAPIConverters

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Effect.d.ts:26559

Effect<{ contentId: string; }, boolean | Error | ParseError, | RawPageData | FullPageData>

Effect<{ description: string; slug: string; title: string; }, boolean | Error | ParseError, | ImportEndpointConfig | RawPageData>

Effect<{ contentId: string; }, boolean | Error | ParseError, | RawPageData | FullPageData>

Effect<{ description: string; slug: string; title: string; }, | boolean | AstroUserError | UnknownException | ParseError | LibSQLDatabaseError, | ImportEndpointConfig | RawPageData | UseBlogPkgConfig>

WordPressAPIConverters

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).constructor

readonly _tag: "WordPressAPIConverters";

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Effect.d.ts:26560

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
)._tag

convertToPageContent: Effect<{
contentId: string;
}, boolean | Error | ParseError,
| RawPageData
| FullPageData>;

Defined in: studiocms/packages/@studiocms/devapps/src/effects/WordPressAPI/converters.ts:398^

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).convertToPageContent

convertToPageData: Effect<{
description: string;
slug: string;
title: string;
}, boolean | Error | ParseError,
| ImportEndpointConfig
| RawPageData>;

Defined in: studiocms/packages/@studiocms/devapps/src/effects/WordPressAPI/converters.ts:397^

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).convertToPageData

convertToPostContent: Effect<{
contentId: string;
}, boolean | Error | ParseError,
| RawPageData
| FullPageData>;

Defined in: studiocms/packages/@studiocms/devapps/src/effects/WordPressAPI/converters.ts:400^

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).convertToPostContent

convertToPostData: Effect<{
description: string;
slug: string;
title: string;
},
| boolean
| AstroUserError
| UnknownException
| ParseError
| LibSQLDatabaseError,
| ImportEndpointConfig
| RawPageData
| UseBlogPkgConfig>;

Defined in: studiocms/packages/@studiocms/devapps/src/effects/WordPressAPI/converters.ts:399^

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).convertToPostData

readonly static _op: "Tag";

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:28

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
)._op

readonly static [ChannelTypeId]: VarianceStruct<never, unknown, never, unknown, WordPressAPIConverters, unknown, WordPressAPIConverters>;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Channel.d.ts:108

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[ChannelTypeId]

readonly static [EffectTypeId]: VarianceStruct<WordPressAPIConverters, never, WordPressAPIConverters>;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Effect.d.ts:195

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[EffectTypeId]

static optional [ignoreSymbol]: TagUnifyIgnore;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:41

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[ignoreSymbol]

readonly static [SinkTypeId]: VarianceStruct<WordPressAPIConverters, unknown, never, never, WordPressAPIConverters>;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Sink.d.ts:82

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[SinkTypeId]

readonly static [STMTypeId]: {
_A: Covariant<WordPressAPIConverters>;
_E: Covariant<never>;
_R: Covariant<WordPressAPIConverters>;
};

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/STM.d.ts:136

readonly _A: Covariant<WordPressAPIConverters>;
readonly _E: Covariant<never>;
readonly _R: Covariant<WordPressAPIConverters>;
Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[STMTypeId]

readonly static [StreamTypeId]: VarianceStruct<WordPressAPIConverters, never, WordPressAPIConverters>;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Stream.d.ts:111

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[StreamTypeId]

readonly static [TagTypeId]: {
_Identifier: Invariant<WordPressAPIConverters>;
_Service: Invariant<WordPressAPIConverters>;
};

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:31

readonly _Identifier: Invariant<WordPressAPIConverters>;
readonly _Service: Invariant<WordPressAPIConverters>;
Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[TagTypeId]

static optional [typeSymbol]: unknown;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:39

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[typeSymbol]

static optional [unifySymbol]: TagUnify<Class<WordPressAPIConverters, "WordPressAPIConverters", {
dependencies: readonly [Layer<WordPressAPIUtils, never, never>];
effect: Effect<{
convertToPageContent: Effect<{
contentId: string;
}, boolean | Error | ParseError,
| RawPageData
| FullPageData>;
convertToPageData: Effect<{
description: string;
slug: string;
title: string;
}, boolean | Error | ParseError,
| ImportEndpointConfig
| RawPageData>;
convertToPostContent: Effect<{
contentId: string;
}, boolean | Error | ParseError,
| RawPageData
| FullPageData>;
convertToPostData: Effect<{
description: string;
slug: string;
title: string;
},
| boolean
| AstroUserError
| UnknownException
| ParseError
| LibSQLDatabaseError,
| ImportEndpointConfig
| RawPageData
| UseBlogPkgConfig>;
}, never, WordPressAPIUtils>;
}>>;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:40

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[unifySymbol]

readonly static Default: Layer<WordPressAPIConverters, never, never>;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Effect.d.ts:26570

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).Default

readonly static DefaultWithoutDependencies: Layer<WordPressAPIConverters, never, WordPressAPIUtils>;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Effect.d.ts:26569

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).DefaultWithoutDependencies

readonly static Identifier: WordPressAPIConverters;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:30

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).Identifier

readonly static key: "WordPressAPIConverters";

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:38

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).key

readonly static make: (_: {
convertToPageContent: Effect<{
contentId: string;
}, boolean | Error | ParseError,
| RawPageData
| FullPageData>;
convertToPageData: Effect<{
description: string;
slug: string;
title: string;
}, boolean | Error | ParseError,
| ImportEndpointConfig
| RawPageData>;
convertToPostContent: Effect<{
contentId: string;
}, boolean | Error | ParseError,
| RawPageData
| FullPageData>;
convertToPostData: Effect<{
description: string;
slug: string;
title: string;
},
| boolean
| AstroUserError
| UnknownException
| ParseError
| LibSQLDatabaseError,
| ImportEndpointConfig
| RawPageData
| UseBlogPkgConfig>;
}) => WordPressAPIConverters;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Effect.d.ts:26563

Effect<{ contentId: string; }, boolean | Error | ParseError, | RawPageData | FullPageData>

Effect<{ description: string; slug: string; title: string; }, boolean | Error | ParseError, | ImportEndpointConfig | RawPageData>

Effect<{ contentId: string; }, boolean | Error | ParseError, | RawPageData | FullPageData>

Effect<{ description: string; slug: string; title: string; }, | boolean | AstroUserError | UnknownException | ParseError | LibSQLDatabaseError, | ImportEndpointConfig | RawPageData | UseBlogPkgConfig>

WordPressAPIConverters

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).make

readonly static Service: WordPressAPIConverters;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:29

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).Service

readonly static optional stack: string;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:37

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).stack

readonly static use: <X>(body: (_: WordPressAPIConverters) => X) => [X] extends [Effect<A, E, R>] ? Effect<A, E,
| WordPressAPIConverters
| R> : [X] extends [PromiseLike<A>] ? Effect<A, UnknownException, WordPressAPIConverters> : Effect<X, never, WordPressAPIConverters>;

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Effect.d.ts:26562

X

(_: WordPressAPIConverters) => X

[X] extends [Effect<A, E, R>] ? Effect<A, E, | WordPressAPIConverters | R> : [X] extends [PromiseLike<A>] ? Effect<A, UnknownException, WordPressAPIConverters> : Effect<X, never, WordPressAPIConverters>

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).use

static iterator: EffectGenerator<Tag<WordPressAPIConverters, WordPressAPIConverters>>

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Effect.d.ts:137

EffectGenerator<Tag<WordPressAPIConverters, WordPressAPIConverters>>

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[iterator]

static NodeInspectSymbol: unknown

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Inspectable.d.ts:22

unknown

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).[NodeInspectSymbol]

static context(self: WordPressAPIConverters): Context<WordPressAPIConverters>

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:36

WordPressAPIConverters

Context<WordPressAPIConverters>

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).context

static of(self: WordPressAPIConverters): WordPressAPIConverters

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Context.d.ts:35

WordPressAPIConverters

WordPressAPIConverters

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).of

static pipe<A>(this: A): A

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:10

A

A

A

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B>(this: A, ab: (_: A) => B): B

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:11

A

B = never

A

(_: A) => B

B

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C): C

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:12

A

B = never

C = never

A

(_: A) => B

(_: B) => C

C

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D): D

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:13

A

B = never

C = never

D = never

A

(_: A) => B

(_: B) => C

(_: C) => D

D

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E): E

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:14

A

B = never

C = never

D = never

E = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

E

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F): F

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:15

A

B = never

C = never

D = never

E = never

F = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

F

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G): G

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:16

A

B = never

C = never

D = never

E = never

F = never

G = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

G

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H): H

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:17

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

H

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I): I

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:18

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

I

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J): J

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:19

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

J

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K): K

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:20

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

K

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L): L

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:21

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

L

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M): M

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:22

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

M

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N): N

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:23

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

N

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N,
no: (_: N) => O): O

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:24

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

O = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

(_: N) => O

O

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N,
no: (_: N) => O,
op: (_: O) => P): P

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:25

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

O = never

P = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

(_: N) => O

(_: O) => P

P

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N,
no: (_: N) => O,
op: (_: O) => P,
pq: (_: P) => Q): Q

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:26

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

O = never

P = never

Q = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

(_: N) => O

(_: O) => P

(_: P) => Q

Q

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N,
no: (_: N) => O,
op: (_: O) => P,
pq: (_: P) => Q,
qr: (_: Q) => R): R

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:27

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

O = never

P = never

Q = never

R = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

(_: N) => O

(_: O) => P

(_: P) => Q

(_: Q) => R

R

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N,
no: (_: N) => O,
op: (_: O) => P,
pq: (_: P) => Q,
qr: (_: Q) => R,
rs: (_: R) => S): S

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:28

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

O = never

P = never

Q = never

R = never

S = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

(_: N) => O

(_: O) => P

(_: P) => Q

(_: Q) => R

(_: R) => S

S

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N,
no: (_: N) => O,
op: (_: O) => P,
pq: (_: P) => Q,
qr: (_: Q) => R,
rs: (_: R) => S,
st: (_: S) => T): T

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:29

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

O = never

P = never

Q = never

R = never

S = never

T = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

(_: N) => O

(_: O) => P

(_: P) => Q

(_: Q) => R

(_: R) => S

(_: S) => T

T

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N,
no: (_: N) => O,
op: (_: O) => P,
pq: (_: P) => Q,
qr: (_: Q) => R,
rs: (_: R) => S,
st: (_: S) => T,
tu: (_: T) => U): U

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:30

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

O = never

P = never

Q = never

R = never

S = never

T = never

U = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

(_: N) => O

(_: O) => P

(_: P) => Q

(_: Q) => R

(_: R) => S

(_: S) => T

(_: T) => U

U

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe
static pipe<A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U>(
this: A,
ab: (_: A) => B,
bc: (_: B) => C,
cd: (_: C) => D,
de: (_: D) => E,
ef: (_: E) => F,
fg: (_: F) => G,
gh: (_: G) => H,
hi: (_: H) => I,
ij: (_: I) => J,
jk: (_: J) => K,
kl: (_: K) => L,
lm: (_: L) => M,
mn: (_: M) => N,
no: (_: N) => O,
op: (_: O) => P,
pq: (_: P) => Q,
qr: (_: Q) => R,
rs: (_: R) => S,
st: (_: S) => T,
tu: (_: T) => U): U

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Pipeable.d.ts:31

A

B = never

C = never

D = never

E = never

F = never

G = never

H = never

I = never

J = never

K = never

L = never

M = never

N = never

O = never

P = never

Q = never

R = never

S = never

T = never

U = never

A

(_: A) => B

(_: B) => C

(_: C) => D

(_: D) => E

(_: E) => F

(_: F) => G

(_: G) => H

(_: H) => I

(_: I) => J

(_: J) => K

(_: K) => L

(_: L) => M

(_: M) => N

(_: N) => O

(_: O) => P

(_: P) => Q

(_: Q) => R

(_: R) => S

(_: S) => T

(_: T) => U

U

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).pipe

static toJSON(): unknown

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Inspectable.d.ts:21

unknown

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).toJSON

static toString(): string

Defined in: node_modules/.pnpm/effect@3.17.3/node_modules/effect/dist/dts/Inspectable.d.ts:20

string

Effect.Service<WordPressAPIConverters>()(
'WordPressAPIConverters',
{
dependencies: [WordPressAPIUtils.Default],
effect: genLogger('@studiocms/devapps/effects/WordPressAPI/converters.effect')(function () {
const sdk = yield SDKCore;
const {
apiEndpoint,
cleanUpHtml,
downloadAndUpdateImages,
downloadPostImage,
stripHtml,
turndown,
} = yield WordPressAPIUtils;
/
Converts a given page object to a PageData object.
@param page - The page object to convert. This is expected to be of an unknown type.
@param endpoint - The API endpoint to fetch additional data, such as media.
@returns A promise that resolves to a PageData object containing the converted page data.
/
const convertToPageData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageData'
)(function () {
const [{ endpoint }, { page }] = yield Effect.all([ImportEndpointConfig, RawPageData]);
if (!endpoint) {
yield Effect.fail(new Error('Missing endpoint configuration'));
}
if (!page) {
yield Effect.fail(new Error('Missing page data'));
}
const data = yield Schema.decodeUnknown(Page)(page);
const cleanHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, pagesImagesFolder)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: 'studiocms',
heroImage: titleImage,
};
return pageData;
});
/
Converts the provided page data and page content into a PageContent object.
@param pageData - The data of the page to be converted.
@param page - The raw page content to be converted.
@returns A promise that resolves to a PageContent object.
/
const convertToPageContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPageContent'
)(function () {
const [{ page }, { pageData }] = yield Effect.all([RawPageData, FullPageData]);
const data = yield Schema.decodeUnknown(Page)(page);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanUpContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanUpContent, pagesImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
const generateCategoriesOrTags = <T extends 'categories' | 'tags'>(type: T) =>
genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.generateCategoriesOrTags'
)(function () {
const [{ endpoint }, { value }] = yield Effect.all([
ImportEndpointConfig,
CategoryOrTagConfig,
]);
const TableMap = {
categories: tsPageDataCategories,
tags: tsPageDataTags,
};
const table = TableMap[type];
const newItems = [];
const idChecks = yield Effect.all(
value.map((val) =>
sdk.dbService
.execute((client) => client.select().from(table).where(eq(table.id, val)).get())
.pipe(Effect.map((exists) => ({ val, exists: !!exists })))
),
{ concurrency: 10 }
);
const missingIds = idChecks.filter(({ exists }) => !exists).map(({ val }) => val);
const fetchedIds = yield Effect.all(
missingIds.map((id) =>
apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, type, String(id)),
Effect.flatMap((url) => Effect.tryPromise(() => fetch(url))),
Effect.flatMap((response) => Effect.tryPromise(() => response.json()))
)
),
{ concurrency: 5 } // Limit concurrent API calls
);
newItems.push(...fetchedIds);
if (newItems.length > 0) {
switch (type) {
case 'categories': {
const data = newItems.map((category) => {
const data: typeof tsPageDataCategories.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: category.id,
name: category.name,
slug: category.slug,
description: category.description,
meta: JSON.stringify(category.meta),
};
if (category.parent) {
// @ts-expect-error - Drizzle broke this
data.parent = category.parent;
}
return data;
});
yield Console.log(
'Inserting new Categories into the database:',
data
// @ts-expect-error - Drizzle broke this
.map((d) => ${d.id}: ${d.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataCategories).values(data)
);
yield Console.log('Categories inserted!');
break;
}
case 'tags': {
const tagData = newItems.map((tag) => {
const data: typeof tsPageDataTags.$inferInsert = {
// @ts-expect-error - Drizzle broke this
id: tag.id,
name: tag.name,
slug: tag.slug,
description: tag.description,
meta: JSON.stringify(tag.meta),
};
return data;
});
yield Console.log(
'Inserting new Tags into the database:',
tagData
// @ts-expect-error - Drizzle broke this
.map((data) => ${data.id}: ${data.name})
.join(', ')
);
yield sdk.dbService.execute((client) =>
client.insert(tsPageDataTags).values(tagData)
);
yield Console.log('Tags inserted!');
break;
}
}
}
});
/
Converts a given post object to PageData format.
@param post - The post object to be converted.
@param useBlogPkg - A boolean indicating whether to use the blog package.
@param endpoint - The API endpoint to fetch additional data.
/
const convertToPostData = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostData'
)(function () {
const [{ endpoint }, { page: post }, { useBlogPkg }] = yield Effect.all([
ImportEndpointConfig,
RawPageData,
UseBlogPkgConfig,
]);
const data = yield Schema.decodeUnknown(Post)(post);
const pkg = useBlogPkg ? '@studiocms/blog' : 'studiocms/markdown';
const cleanedHTML = yield stripHtml.pipe(StringConfig.makeProvide(data.excerpt.rendered));
const titleImageId = data.featured_media;
if (!titleImageId || titleImageId === 0) {
yield Console.log('No featured media for:', data.title.rendered);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
};
return pageData;
}
const titleImageURL = yield apiEndpoint.pipe(
APIEndpointConfig.makeProvide(endpoint, 'media', String(titleImageId))
);
const titleImageResponse = yield Effect.tryPromise(() => fetch(titleImageURL));
const titleImageJson = yield Effect.tryPromise(() => titleImageResponse.json());
const titleImage = yield downloadPostImage.pipe(
DownloadPostImageConfig.makeProvide(titleImageJson.source_url, postsImagesFolder)
);
yield generateCategoriesOrTags('categories').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.categories)
);
yield generateCategoriesOrTags('tags').pipe(
ImportEndpointConfig.makeProvide(endpoint),
CategoryOrTagConfig.makeProvide(data.tags)
);
const pageData: PageData = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
title: data.title.rendered,
description: decode(cleanedHTML),
slug: data.slug,
publishedAt: new Date(data.date_gmt),
updatedAt: new Date(data.modified_gmt),
showOnNav: false,
contentLang: 'default',
package: pkg,
categories: JSON.stringify(data.categories),
tags: JSON.stringify(data.tags),
heroImage: titleImage,
};
return pageData;
});
/
Converts the given post data to a PageContent object.
@param pageData - The data of the page to which the post content belongs.
@param post - The post data to be converted.
/
const convertToPostContent = genLogger(
'@studiocms/devapps/effects/WordPressAPI/converters.effect.convertToPostContent'
)(function () {
const [{ pageData }, { page: post }] = yield Effect.all([FullPageData, RawPageData]);
const data = yield Schema.decodeUnknown(Post)(post);
// @ts-expect-error - Drizzle broke this
if (pageData.id === undefined) {
yield Effect.fail(new Error('pageData is missing id'));
}
const cleanupContent = yield cleanUpHtml.pipe(
StringConfig.makeProvide(data.content.rendered)
);
const htmlWithImages = yield downloadAndUpdateImages.pipe(
DownloadPostImageConfig.makeProvide(cleanupContent, postsImagesFolder)
);
const content = yield turndown.pipe(StringConfig.makeProvide(htmlWithImages));
const pageContent: PageContent = {
// @ts-expect-error - Drizzle broke this
id: crypto.randomUUID(),
// @ts-expect-error - Drizzle broke this
contentId: pageData.id,
contentLang: 'default',
content: content,
};
return pageContent;
});
return {
convertToPageData,
convertToPageContent,
convertToPostData,
convertToPostContent,
};
}),
}
).toString